From 3fb25179b69c5f82ab4864fd25ddd9a64e34fc3b Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Wed, 12 Jan 2022 13:00:32 +0530 Subject: [PATCH 001/190] merge geth v1.10.15 --- .travis.yml | 30 - Makefile | 6 +- README.md | 10 +- SECURITY.md | 229 ++-- accounts/abi/bind/backends/simulated.go | 6 + accounts/abi/bind/backends/simulated_test.go | 6 +- accounts/abi/bind/base.go | 2 +- accounts/abi/bind/bind.go | 7 + accounts/abi/bind/bind_test.go | 84 +- accounts/abi/unpack.go | 2 +- accounts/accounts.go | 4 +- build/checksums.txt | 28 +- build/ci.go | 47 +- cmd/clef/main.go | 4 +- cmd/devp2p/dns_cloudflare.go | 3 +- cmd/devp2p/dnscmd.go | 5 +- cmd/devp2p/internal/ethtest/helpers.go | 2 +- cmd/devp2p/internal/ethtest/suite.go | 88 +- cmd/devp2p/internal/v4test/discv4tests.go | 21 +- cmd/devp2p/nodesetcmd.go | 2 + cmd/evm/internal/t8ntool/block.go | 380 ++++++ cmd/evm/internal/t8ntool/execution.go | 6 +- cmd/evm/internal/t8ntool/flags.go | 53 +- cmd/evm/internal/t8ntool/gen_header.go | 135 ++ cmd/evm/internal/t8ntool/transaction.go | 52 +- cmd/evm/internal/t8ntool/transition.go | 112 +- cmd/evm/internal/t8ntool/utils.go | 54 + cmd/evm/main.go | 22 + cmd/evm/runner.go | 17 +- cmd/evm/staterunner.go | 15 +- cmd/evm/t8n_test.go | 181 ++- cmd/evm/testdata/1/exp.json | 7 +- cmd/evm/testdata/13/exp2.json | 5 +- cmd/evm/testdata/14/exp.json | 7 +- cmd/evm/testdata/14/exp2.json | 7 +- cmd/evm/testdata/14/exp_berlin.json | 12 + cmd/evm/testdata/15/exp2.json | 6 +- cmd/evm/testdata/16/exp.json | 6 +- cmd/evm/testdata/17/exp.json | 22 + cmd/evm/testdata/17/rlpdata.txt | 46 + cmd/evm/testdata/17/signed_txs.rlp | 1 + cmd/evm/testdata/18/README.md | 9 + cmd/evm/testdata/18/invalid.rlp | 1 + cmd/evm/testdata/19/alloc.json | 12 + cmd/evm/testdata/19/env.json | 9 + cmd/evm/testdata/19/exp_arrowglacier.json | 12 + cmd/evm/testdata/19/exp_london.json | 12 + cmd/evm/testdata/19/readme.md | 9 + cmd/evm/testdata/19/txs.json | 1 + cmd/evm/testdata/20/exp.json | 4 + cmd/evm/testdata/20/header.json | 14 + cmd/evm/testdata/20/ommers.json | 1 + cmd/evm/testdata/20/readme.md | 11 + cmd/evm/testdata/20/txs.rlp | 1 + cmd/evm/testdata/21/clique.json | 6 + cmd/evm/testdata/21/exp-clique.json | 4 + cmd/evm/testdata/21/exp.json | 4 + cmd/evm/testdata/21/header.json | 11 + cmd/evm/testdata/21/ommers.json | 1 + cmd/evm/testdata/21/readme.md | 23 + cmd/evm/testdata/21/txs.rlp | 1 + cmd/evm/testdata/22/exp-clique.json | 4 + cmd/evm/testdata/22/exp.json | 4 + cmd/evm/testdata/22/header.json | 11 + cmd/evm/testdata/22/ommers.json | 1 + cmd/evm/testdata/22/readme.md | 11 + cmd/evm/testdata/22/txs.rlp | 1 + cmd/evm/testdata/23/alloc.json | 16 + cmd/evm/testdata/23/env.json | 7 + cmd/evm/testdata/23/exp.json | 25 + cmd/evm/testdata/23/readme.md | 1 + cmd/evm/testdata/23/txs.json | 15 + cmd/evm/testdata/3/exp.json | 5 +- cmd/evm/testdata/5/exp.json | 5 +- cmd/geth/chaincmd.go | 10 +- cmd/geth/config.go | 18 +- cmd/geth/consolecmd.go | 49 +- cmd/geth/dbcmd.go | 196 ++- cmd/geth/main.go | 26 +- cmd/geth/snapshot.go | 5 + cmd/geth/usage.go | 2 + cmd/puppeth/wizard.go | 121 +- cmd/puppeth/wizard_intro.go | 29 +- cmd/rlpdump/main.go | 93 +- cmd/rlpdump/rlpdump_test.go | 65 + cmd/utils/cmd.go | 248 +++- cmd/utils/export_test.go | 198 +++ cmd/utils/flags.go | 57 +- common/hexutil/hexutil.go | 9 +- common/hexutil/hexutil_test.go | 12 + consensus/beacon/consensus.go | 376 ++++++ consensus/clique/api.go | 9 +- consensus/clique/clique.go | 11 +- consensus/consensus.go | 3 + consensus/ethash/consensus.go | 12 +- consensus/ethash/ethash.go | 7 +- consensus/ethash/mmap_help_linux.go | 35 + consensus/ethash/mmap_help_other.go | 36 + consensus/merger.go | 110 ++ console/console.go | 121 +- console/console_test.go | 2 +- core/asm/lexer.go | 4 +- core/bench_test.go | 53 +- core/block_validator_test.go | 173 +++ core/blockchain.go | 939 +++++-------- core/blockchain_insert.go | 8 + core/blockchain_reader.go | 407 ++++++ core/blockchain_repair_test.go | 347 +++-- core/blockchain_sethead_test.go | 240 ++-- core/blockchain_test.go | 438 +++++- core/chain_makers.go | 35 + core/error.go | 4 + core/forkchoice.go | 108 ++ core/forkid/forkid_test.go | 45 +- core/genesis.go | 32 +- core/genesis_alloc.go | 1 + core/genesis_test.go | 90 +- core/headerchain.go | 300 +++-- core/headerchain_test.go | 25 +- core/rawdb/accessors_chain.go | 290 ++-- core/rawdb/accessors_chain_test.go | 66 +- core/rawdb/accessors_metadata.go | 35 + core/rawdb/accessors_snapshot.go | 14 +- core/rawdb/chain_iterator.go | 37 +- core/rawdb/database.go | 26 +- core/rawdb/freezer.go | 21 +- core/rawdb/freezer_batch.go | 4 +- core/rawdb/freezer_test.go | 2 +- core/rawdb/schema.go | 13 +- core/rawdb/table.go | 10 +- core/rlp_test.go | 2 +- core/state/snapshot/difflayer_test.go | 2 +- core/state/snapshot/generate.go | 18 +- core/state/snapshot/wipe.go | 56 - core/state/snapshot/wipe_test.go | 103 +- core/state/sync.go | 4 +- core/state/sync_test.go | 13 +- core/state_processor_test.go | 39 +- core/state_transition.go | 3 + core/tx_list.go | 4 +- core/tx_list_test.go | 14 +- core/tx_noncer.go | 8 + core/tx_pool.go | 12 +- core/tx_pool_test.go | 21 + core/types/block.go | 24 + core/types/block_test.go | 61 + core/types/dynamic_fee_tx.go | 4 +- core/vm/analysis.go | 32 +- core/vm/analysis_test.go | 40 +- core/vm/contract.go | 9 +- core/vm/errors.go | 5 + core/vm/evm.go | 32 +- core/vm/gas_table.go | 6 +- core/vm/instructions.go | 57 +- core/vm/instructions_test.go | 16 +- core/vm/interpreter.go | 151 +-- core/vm/interpreter_test.go | 77 ++ core/vm/jump_table.go | 87 +- core/vm/logger.go | 328 +---- core/vm/memory_table.go | 2 +- core/vm/opcodes.go | 148 +-- core/vm/runtime/runtime_test.go | 18 +- core/vm/stack.go | 4 - .../libsecp256k1/src/asm/field_10x26_arm.s | 2 +- eth/api.go | 2 +- eth/api_backend.go | 6 +- eth/backend.go | 66 +- eth/catalyst/api.go | 392 ++++-- eth/catalyst/api_test.go | 411 ++++-- eth/catalyst/api_types.go | 104 +- eth/catalyst/gen_blockparams.go | 45 +- eth/catalyst/gen_ed.go | 130 +- eth/catalyst/gen_payload.go | 36 + eth/downloader/downloader.go | 1182 ++++++----------- eth/downloader/downloader_test.go | 1104 ++++++--------- eth/downloader/fetchers.go | 115 ++ eth/downloader/fetchers_concurrent.go | 381 ++++++ eth/downloader/fetchers_concurrent_bodies.go | 105 ++ eth/downloader/fetchers_concurrent_headers.go | 97 ++ .../fetchers_concurrent_receipts.go | 104 ++ eth/downloader/metrics.go | 3 - eth/downloader/modes.go | 9 +- eth/downloader/peer.go | 269 +--- eth/downloader/queue.go | 223 ++-- eth/downloader/queue_test.go | 72 +- eth/downloader/statesync.go | 518 +------- eth/downloader/testchain_test.go | 221 ++- eth/downloader/types.go | 79 -- eth/ethconfig/config.go | 40 +- eth/ethconfig/gen_config.go | 180 +-- eth/fetcher/block_fetcher.go | 55 +- eth/fetcher/block_fetcher_test.go | 85 +- eth/fetcher/tx_fetcher.go | 37 +- eth/filters/api.go | 3 - eth/filters/bench_test.go | 2 + eth/filters/filter_test.go | 4 + eth/gasprice/gasprice.go | 17 +- eth/gasprice/gasprice_test.go | 9 +- eth/handler.go | 206 ++- eth/handler_eth.go | 116 +- eth/handler_eth_test.go | 42 +- eth/handler_test.go | 4 +- eth/peer.go | 7 +- eth/protocols/eth/dispatcher.go | 253 ++++ eth/protocols/eth/handler.go | 9 +- eth/protocols/eth/handler_test.go | 21 +- eth/protocols/eth/handlers.go | 195 ++- eth/protocols/eth/peer.go | 166 ++- eth/protocols/eth/protocol.go | 10 + eth/protocols/snap/handler.go | 558 ++++---- eth/protocols/snap/peer.go | 14 +- eth/protocols/snap/protocol.go | 6 +- eth/protocols/snap/sync.go | 46 +- eth/state_accessor.go | 25 +- eth/sync.go | 36 +- eth/sync_test.go | 65 +- eth/tracers/api.go | 96 +- eth/tracers/api_test.go | 337 ++--- eth/tracers/internal/tracers/4byte_tracer.js | 65 - .../internal/tracetest/calltrace_test.go | 394 ++++++ .../testdata/call_tracer/create.json | 0 .../testdata/call_tracer/deep_calls.json | 0 .../testdata/call_tracer/delegatecall.json | 0 .../inner_create_oog_outer_throw.json | 0 .../testdata/call_tracer/inner_instafail.json | 0 .../call_tracer/inner_throw_outer_revert.json | 2 +- .../tracetest}/testdata/call_tracer/oog.json | 0 .../testdata/call_tracer/revert.json | 0 .../testdata/call_tracer/revert_reason.json | 0 .../testdata/call_tracer/selfdestruct.json | 0 .../testdata/call_tracer/simple.json | 0 .../testdata/call_tracer/throw.json | 0 .../testdata/call_tracer_legacy/create.json | 0 .../call_tracer_legacy/deep_calls.json | 0 .../call_tracer_legacy/delegatecall.json | 0 .../inner_create_oog_outer_throw.json | 0 .../call_tracer_legacy/inner_instafail.json | 0 .../inner_throw_outer_revert.json | 2 +- .../testdata/call_tracer_legacy/oog.json | 0 .../testdata/call_tracer_legacy/revert.json | 0 .../call_tracer_legacy/revert_reason.json | 0 .../call_tracer_legacy/selfdestruct.json | 0 .../testdata/call_tracer_legacy/simple.json | 0 .../testdata/call_tracer_legacy/throw.json | 0 eth/tracers/{tracer.go => js/bigint.go} | 853 +----------- .../internal/tracers/4byte_tracer_legacy.js | 0 .../{ => js}/internal/tracers/assets.go | 49 +- .../internal/tracers/bigram_tracer.js | 0 .../internal/tracers/call_tracer_js.js} | 0 .../internal/tracers/call_tracer_legacy.js | 0 .../internal/tracers/evmdis_tracer.js | 4 +- .../{ => js}/internal/tracers/noop_tracer.js | 0 .../internal/tracers/opcount_tracer.js | 0 .../internal/tracers/prestate_tracer.js | 0 .../{ => js}/internal/tracers/tracers.go | 0 .../internal/tracers/trigram_tracer.js | 0 .../internal/tracers/unigram_tracer.js | 0 eth/tracers/js/tracer.go | 880 ++++++++++++ eth/tracers/{ => js}/tracer_test.go | 59 +- .../tracers/logger}/access_list_tracer.go | 25 +- .../tracers/logger}/gen_structlog.go | 7 +- eth/tracers/logger/logger.go | 349 +++++ .../vm => eth/tracers/logger}/logger_json.go | 28 +- .../vm => eth/tracers/logger}/logger_test.go | 26 +- eth/tracers/native/4byte.go | 148 +++ eth/tracers/native/call.go | 182 +++ eth/tracers/native/noop.go | 74 ++ eth/tracers/native/tracer.go | 79 ++ eth/tracers/tracers.go | 65 +- eth/tracers/tracers_test.go | 338 +---- ethclient/ethclient.go | 72 +- ethclient/ethclient_test.go | 157 ++- ethclient/signer.go | 2 +- ethdb/database.go | 17 +- ethdb/leveldb/leveldb.go | 2 +- ethdb/memorydb/memorydb.go | 2 +- graphql/graphql.go | 105 +- graphql/schema.go | 6 - interfaces.go | 23 +- internal/ethapi/api.go | 33 +- internal/jsre/deps/bindata.go | 6 +- internal/jsre/deps/web3.js | 16 +- internal/jsre/jsre.go | 42 +- internal/shutdowncheck/shutdown_tracker.go | 85 ++ les/api_backend.go | 2 +- les/client.go | 53 +- les/client_handler.go | 16 +- les/downloader/downloader.go | 35 +- les/downloader/downloader_test.go | 6 +- les/downloader/statesync.go | 5 +- les/fetcher.go | 24 +- les/fetcher/block_fetcher_test.go | 4 +- les/fetcher_test.go | 3 +- les/server_handler.go | 5 +- les/test_helper.go | 2 + les/vflux/client/serverpool.go | 2 +- les/vflux/client/serverpool_test.go | 47 +- les/vflux/client/valuetracker.go | 12 +- les/vflux/server/balance_tracker.go | 5 +- light/lightchain.go | 48 +- miner/miner.go | 4 +- miner/miner_test.go | 6 +- miner/stress/beacon/main.go | 521 ++++++++ miner/worker.go | 32 +- miner/worker_test.go | 2 +- mobile/ethereum.go | 20 +- mobile/geth.go | 7 + mobile/params.go | 9 + oss-fuzz.sh | 5 + p2p/discover/v4wire/v4wire.go | 2 +- p2p/discover/v5wire/encoding_test.go | 4 +- p2p/discover/v5wire/msg.go | 2 +- p2p/enode/localnode.go | 17 +- p2p/enr/enr.go | 2 +- p2p/nodestate/nodestate.go | 9 +- p2p/peer.go | 10 +- p2p/server_test.go | 12 +- p2p/simulations/README.md | 20 +- p2p/simulations/adapters/types.go | 2 +- p2p/simulations/network.go | 7 - params/bootnodes.go | 9 + params/config.go | 90 +- params/protocol_params.go | 11 +- params/version.go | 8 +- rlp/raw_test.go | 4 +- rpc/client.go | 19 +- rpc/errors.go | 10 + rpc/handler.go | 6 +- rpc/types.go | 10 + rpc/websocket_test.go | 4 +- signer/core/api.go | 4 +- .../signed_data_internal_test.go | 2 +- signer/core/apitypes/types.go | 718 ++++++++++ signer/core/auditlog.go | 2 +- signer/core/gnosis_safe.go | 14 +- signer/core/signed_data.go | 756 +---------- signer/core/signed_data_test.go | 49 +- signer/rules/rules_test.go | 2 +- tests/difficulty_test.go | 3 + tests/fuzzers/snap/debug/main.go | 39 + tests/fuzzers/snap/fuzz_handler.go | 164 +++ tests/init.go | 7 +- tests/solidity/contracts/OpCodes.sol | 6 +- tests/state_test.go | 3 +- trie/database.go | 4 +- trie/iterator.go | 2 +- trie/proof.go | 7 +- trie/proof_test.go | 79 ++ trie/stacktrie.go | 72 +- trie/stacktrie_test.go | 160 +++ trie/sync.go | 59 +- trie/sync_bloom.go | 191 --- trie/sync_test.go | 16 +- 353 files changed, 15728 insertions(+), 9292 deletions(-) create mode 100644 cmd/evm/internal/t8ntool/block.go create mode 100644 cmd/evm/internal/t8ntool/gen_header.go create mode 100644 cmd/evm/internal/t8ntool/utils.go create mode 100644 cmd/evm/testdata/14/exp_berlin.json create mode 100644 cmd/evm/testdata/17/exp.json create mode 100644 cmd/evm/testdata/17/rlpdata.txt create mode 100644 cmd/evm/testdata/17/signed_txs.rlp create mode 100644 cmd/evm/testdata/18/README.md create mode 100644 cmd/evm/testdata/18/invalid.rlp create mode 100644 cmd/evm/testdata/19/alloc.json create mode 100644 cmd/evm/testdata/19/env.json create mode 100644 cmd/evm/testdata/19/exp_arrowglacier.json create mode 100644 cmd/evm/testdata/19/exp_london.json create mode 100644 cmd/evm/testdata/19/readme.md create mode 100644 cmd/evm/testdata/19/txs.json create mode 100644 cmd/evm/testdata/20/exp.json create mode 100644 cmd/evm/testdata/20/header.json create mode 100644 cmd/evm/testdata/20/ommers.json create mode 100644 cmd/evm/testdata/20/readme.md create mode 100644 cmd/evm/testdata/20/txs.rlp create mode 100644 cmd/evm/testdata/21/clique.json create mode 100644 cmd/evm/testdata/21/exp-clique.json create mode 100644 cmd/evm/testdata/21/exp.json create mode 100644 cmd/evm/testdata/21/header.json create mode 100644 cmd/evm/testdata/21/ommers.json create mode 100644 cmd/evm/testdata/21/readme.md create mode 100644 cmd/evm/testdata/21/txs.rlp create mode 100644 cmd/evm/testdata/22/exp-clique.json create mode 100644 cmd/evm/testdata/22/exp.json create mode 100644 cmd/evm/testdata/22/header.json create mode 100644 cmd/evm/testdata/22/ommers.json create mode 100644 cmd/evm/testdata/22/readme.md create mode 100644 cmd/evm/testdata/22/txs.rlp create mode 100644 cmd/evm/testdata/23/alloc.json create mode 100644 cmd/evm/testdata/23/env.json create mode 100644 cmd/evm/testdata/23/exp.json create mode 100644 cmd/evm/testdata/23/readme.md create mode 100644 cmd/evm/testdata/23/txs.json create mode 100644 cmd/rlpdump/rlpdump_test.go create mode 100644 cmd/utils/export_test.go create mode 100644 consensus/beacon/consensus.go create mode 100644 consensus/ethash/mmap_help_linux.go create mode 100644 consensus/ethash/mmap_help_other.go create mode 100644 consensus/merger.go create mode 100644 core/blockchain_reader.go create mode 100644 core/forkchoice.go create mode 100644 core/vm/interpreter_test.go create mode 100644 eth/catalyst/gen_payload.go create mode 100644 eth/downloader/fetchers.go create mode 100644 eth/downloader/fetchers_concurrent.go create mode 100644 eth/downloader/fetchers_concurrent_bodies.go create mode 100644 eth/downloader/fetchers_concurrent_headers.go create mode 100644 eth/downloader/fetchers_concurrent_receipts.go delete mode 100644 eth/downloader/types.go create mode 100644 eth/protocols/eth/dispatcher.go delete mode 100644 eth/tracers/internal/tracers/4byte_tracer.js create mode 100644 eth/tracers/internal/tracetest/calltrace_test.go rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/create.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/deep_calls.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/delegatecall.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/inner_create_oog_outer_throw.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/inner_instafail.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/inner_throw_outer_revert.json (99%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/oog.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/revert.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/revert_reason.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/selfdestruct.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/simple.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer/throw.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/create.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/deep_calls.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/delegatecall.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/inner_create_oog_outer_throw.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/inner_instafail.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/inner_throw_outer_revert.json (99%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/oog.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/revert.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/revert_reason.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/selfdestruct.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/simple.json (100%) rename eth/tracers/{ => internal/tracetest}/testdata/call_tracer_legacy/throw.json (100%) rename eth/tracers/{tracer.go => js/bigint.go} (50%) rename eth/tracers/{ => js}/internal/tracers/4byte_tracer_legacy.js (100%) rename eth/tracers/{ => js}/internal/tracers/assets.go (74%) rename eth/tracers/{ => js}/internal/tracers/bigram_tracer.js (100%) rename eth/tracers/{internal/tracers/call_tracer.js => js/internal/tracers/call_tracer_js.js} (100%) rename eth/tracers/{ => js}/internal/tracers/call_tracer_legacy.js (100%) rename eth/tracers/{ => js}/internal/tracers/evmdis_tracer.js (98%) rename eth/tracers/{ => js}/internal/tracers/noop_tracer.js (100%) rename eth/tracers/{ => js}/internal/tracers/opcount_tracer.js (100%) rename eth/tracers/{ => js}/internal/tracers/prestate_tracer.js (100%) rename eth/tracers/{ => js}/internal/tracers/tracers.go (100%) rename eth/tracers/{ => js}/internal/tracers/trigram_tracer.js (100%) rename eth/tracers/{ => js}/internal/tracers/unigram_tracer.js (100%) create mode 100644 eth/tracers/js/tracer.go rename eth/tracers/{ => js}/tracer_test.go (75%) rename {core/vm => eth/tracers/logger}/access_list_tracer.go (81%) rename {core/vm => eth/tracers/logger}/gen_structlog.go (94%) create mode 100644 eth/tracers/logger/logger.go rename {core/vm => eth/tracers/logger}/logger_json.go (69%) rename {core/vm => eth/tracers/logger}/logger_test.go (72%) create mode 100644 eth/tracers/native/4byte.go create mode 100644 eth/tracers/native/call.go create mode 100644 eth/tracers/native/noop.go create mode 100644 eth/tracers/native/tracer.go create mode 100644 internal/shutdowncheck/shutdown_tracker.go create mode 100644 miner/stress/beacon/main.go rename signer/core/{ => apitypes}/signed_data_internal_test.go (99%) create mode 100644 tests/fuzzers/snap/debug/main.go create mode 100644 tests/fuzzers/snap/fuzz_handler.go delete mode 100644 trie/sync_bloom.go diff --git a/.travis.yml b/.travis.yml index 79f35149b0..3f92221758 100644 --- a/.travis.yml +++ b/.travis.yml @@ -120,36 +120,6 @@ jobs: - go run build/ci.go install -dlgo -arch arm64 -cc aarch64-linux-gnu-gcc - go run build/ci.go archive -arch arm64 -type tar -signer LINUX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds - # This builder does the Linux Azure MIPS xgo uploads - - stage: build - if: type = push - os: linux - dist: bionic - services: - - docker - go: 1.17.x - env: - - azure-linux-mips - - GO111MODULE=on - git: - submodules: false # avoid cloning ethereum/tests - script: - - go run build/ci.go xgo --alltools -- --targets=linux/mips --ldflags '-extldflags "-static"' -v - - for bin in build/bin/*-linux-mips; do mv -f "${bin}" "${bin/-linux-mips/}"; done - - go run build/ci.go archive -arch mips -type tar -signer LINUX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds - - - go run build/ci.go xgo --alltools -- --targets=linux/mipsle --ldflags '-extldflags "-static"' -v - - for bin in build/bin/*-linux-mipsle; do mv -f "${bin}" "${bin/-linux-mipsle/}"; done - - go run build/ci.go archive -arch mipsle -type tar -signer LINUX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds - - - go run build/ci.go xgo --alltools -- --targets=linux/mips64 --ldflags '-extldflags "-static"' -v - - for bin in build/bin/*-linux-mips64; do mv -f "${bin}" "${bin/-linux-mips64/}"; done - - go run build/ci.go archive -arch mips64 -type tar -signer LINUX_SIGNING_KEY signify SIGNIFY_KEY -upload gethstore/builds - - - go run build/ci.go xgo --alltools -- --targets=linux/mips64le --ldflags '-extldflags "-static"' -v - - for bin in build/bin/*-linux-mips64le; do mv -f "${bin}" "${bin/-linux-mips64le/}"; done - - go run build/ci.go archive -arch mips64le -type tar -signer LINUX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds - # This builder does the Android Maven and Azure uploads - stage: build if: type = push diff --git a/Makefile b/Makefile index 9f7d0ae41b..341dce0404 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,7 @@ # with Go source code. If you know what GOPATH is then you probably # don't need to bother with make. -.PHONY: geth android ios geth-cross evm all test clean -.PHONY: geth-linux geth-linux-386 geth-linux-amd64 geth-linux-mips64 geth-linux-mips64le -.PHONY: geth-linux-arm geth-linux-arm-5 geth-linux-arm-6 geth-linux-arm-7 geth-linux-arm64 -.PHONY: geth-darwin geth-darwin-386 geth-darwin-amd64 -.PHONY: geth-windows geth-windows-386 geth-windows-amd64 +.PHONY: geth android ios evm all test clean GOBIN = ./build/bin GO ?= latest diff --git a/README.md b/README.md index b07c07a40f..1dacae0219 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,12 @@ Bor is the Official Golang implementation of the Matic protocol. It is a fork of ![Forks](https://img.shields.io/github/forks/maticnetwork/bor?style=social) ![Stars](https://img.shields.io/github/stars/maticnetwork/bor?style=social) -![Languages](https://img.shields.io/github/languages/count/maticnetwork/bor) -![Issues](https://img.shields.io/github/issues/maticnetwork/bor) -![PRs](https://img.shields.io/github/issues-pr-raw/maticnetwork/bor) +![Languages](https://img.shields.io/github/languages/count/maticnetwork/bor) +![Issues](https://img.shields.io/github/issues/maticnetwork/bor) +![PRs](https://img.shields.io/github/issues-pr-raw/maticnetwork/bor) ![MIT License](https://img.shields.io/github/license/maticnetwork/bor) -![contributors](https://img.shields.io/github/contributors-anon/maticnetwork/bor) -![size](https://img.shields.io/github/languages/code-size/maticnetwork/bor) +![contributors](https://img.shields.io/github/contributors-anon/maticnetwork/bor) +![size](https://img.shields.io/github/languages/code-size/maticnetwork/bor) ![lines](https://img.shields.io/tokei/lines/github/maticnetwork/bor) [![Discord](https://img.shields.io/discord/714888181740339261?color=1C1CE1&label=Polygon%20%7C%20Discord%20%F0%9F%91%8B%20&style=flat-square)](https://discord.gg/zdwkdvMNY2) [![Twitter Follow](https://img.shields.io/twitter/follow/0xPolygon.svg?style=social)](https://twitter.com/0xPolygon) diff --git a/SECURITY.md b/SECURITY.md index 635c0869fc..88b3f8fe17 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -29,92 +29,147 @@ Fingerprint: `AE96 ED96 9E47 9B00 84F3 E17F E88D 3334 FA5F 6A0A` ``` -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 +Version: SKS 1.1.6 +Comment: Hostname: pgp.mit.edu -mQINBFgl3tgBEAC8A1tUBkD9YV+eLrOmtgy+/JS/H9RoZvkg3K1WZ8IYfj6iIRaY -neAk3Bp182GUPVz/zhKr2g0tMXIScDR3EnaDsY+Qg+JqQl8NOG+Cikr1nnkG2on9 -L8c8yiqry1ZTCmYMqCa2acTFqnyuXJ482aZNtB4QG2BpzfhW4k8YThpegk/EoRUi -m+y7buJDtoNf7YILlhDQXN8qlHB02DWOVUihph9tUIFsPK6BvTr9SIr/eG6j6k0b -fUo9pexOn7LS4SojoJmsm/5dp6AoKlac48cZU5zwR9AYcq/nvkrfmf2WkObg/xRd -EvKZzn05jRopmAIwmoC3CiLmqCHPmT5a29vEob/yPFE335k+ujjZCPOu7OwjzDk7 -M0zMSfnNfDq8bXh16nn+ueBxJ0NzgD1oC6c2PhM+XRQCXChoyI8vbfp4dGvCvYqv -QAE1bWjqnumZ/7vUPgZN6gDfiAzG2mUxC2SeFBhacgzDvtQls+uuvm+FnQOUgg2H -h8x2zgoZ7kqV29wjaUPFREuew7e+Th5BxielnzOfVycVXeSuvvIn6cd3g/s8mX1c -2kLSXJR7+KdWDrIrR5Az0kwAqFZt6B6QTlDrPswu3mxsm5TzMbny0PsbL/HBM+GZ -EZCjMXxB8bqV2eSaktjnSlUNX1VXxyOxXA+ZG2jwpr51egi57riVRXokrQARAQAB -tDlFdGhlcmV1bSBGb3VuZGF0aW9uIFNlY3VyaXR5IFRlYW0gPHNlY3VyaXR5QGV0 -aGVyZXVtLm9yZz6JAj4EEwECACgCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA -BQJaCWH6BQkFo2BYAAoJEOiNMzT6X2oK+DEP/3H6dxkm0hvHZKoHLVuuxcu3EHYo -k5sd3MMWPrZSN8qzZnY7ayEDMxnarWOizc+2jfOxfJlzX/g8lR1/fsHdWPFPhPoV -Qk8ygrHn1H8U8+rpw/U03BqmqHpYCDzJ+CIis9UWROniqXw1nuqu/FtWOsdWxNKh -jUo6k/0EsaXsxRPzgJv7fEUcVcQ7as/C3x9sy3muc2gvgA4/BKoGPb1/U0GuA8lV -fDIDshAggmnSUAg+TuYSAAdoFQ1sKwFMPigcLJF2eyKuK3iUyixJrec/c4LSf3wA -cGghbeuqI8INP0Y2zvXDQN2cByxsFAuoZG+m0cyKGaDH2MVUvOKKYqn/03qvrf15 -AWAsW0l0yQwOTCo3FbsNzemClm5Bj/xH0E4XuwXwChcMCMOWJrFoxyvCEI+keoQc -c08/a8/MtS7vBAABXwOziSmm6CNqmzpWrh/fDrjlJlba9U3MxzvqU3IFlTdMratv -6V+SgX+L25lCzW4NxxUavoB8fAlvo8lxpHKo24FP+RcLQ8XqkU3RiUsgRjQRFOqQ -TaJcsp8mimmiYyf24mNu6b48pi+a5c/eQR9w59emeEUZqsJU+nqv8BWIIp7o4Agh -NYnKjkhPlY5e1fLVfAHIADZFynWwRPkPMJSrBiP5EtcOFxQGHGjRxU/KjXkvE0hV -xYb1PB8pWMTu/beeiQI+BBMBAgAoBQJYJd7YAhsDBQkB4TOABgsJCAcDAgYVCAIJ -CgsEFgIDAQIeAQIXgAAKCRDojTM0+l9qCplDD/9IZ2i+m1cnqQKtiyHbyFGx32oL -fzqPylX2bOG5DPsSTorSUdJMGVfT04oVxXc4S/2DVnNvi7RAbSiLapCWSplgtBOj -j1xlblOoXxT3m7s1XHGCX5tENxI9fVSSPVKJn+fQaWpPB2MhBA+1lUI6GJ+11T7K -J8LrP/fiw1/nOb7rW61HW44Gtyox23sA/d1+DsFVaF8hxJlNj5coPKr8xWzQ8pQl -juzdjHDukjevuw4rRmRq9vozvj9keEU9XJ5dldyEVXFmdDk7KT0p0Rla9nxYhzf/ -r/Bv8Bzy0HCWRb2D31BjXXGG05oVnYmNGxGFxYja4MwgrMmne3ilEVjfUJsapsqi -w41BAyQgIdfREulYN7ahsF5PrjVAqBd9IGtE8ULelF2SQxEBQBngEkP0ahP6tRAL -i7/CBjPKOyKijtqVny7qrGOnU2ygcA88/WDibexDhrjz0Gx8WmErU7rIWZiZ5u4Y -vJYVRo0+6rBCXRPeSJfiP5h1p17Anr2l42boAYslfcrzquB8MHtrNcyn650OLtHG -nbxgIdniKrpuzGN6Opw+O2id2JhD1/1p4SOemwAmthplr1MIyOHNP3q93rEj2J7h -5zPS/AJuKkMDFUpslPNLQjCOwPXtdzL7/kUZGBSyez1T3TaW1uY6l9XaJJRaSn+v -1zPgfp4GJ3lPs4AlAbQ0RXRoZXJldW0gRm91bmRhdGlvbiBCdWcgQm91bnR5IDxi -b3VudHlAZXRoZXJldW0ub3JnPokCPgQTAQIAKAIbAwYLCQgHAwIGFQgCCQoLBBYC -AwECHgECF4AFAloJYfoFCQWjYFgACgkQ6I0zNPpfagoENg/+LnSaVeMxiGVtcjWl -b7Xd73yrEy4uxiESS1AalW9mMf7oZzfI05f7QIQlaLAkNac74vZDJbPKjtb7tpMO -RFhRZMCveq6CPKU6pd1SI8IUVUKwpEe6AJP3lHdVP57dquieFE2HlYKm6uHbCGWU -0cjyTA+uu2KbgCHGmofsPY/xOcZLGEHTHqa5w60JJAQm+BSDKnw8wTyrxGvA3EK/ -ePSvOZMYa+iw6vYuZeBIMbdiXR/A2keBi3GuvqB8tDMj7P22TrH5mVDm3zNqGYD6 -amDPeiWp4cztY3aZyLcgYotqXPpDceZzDn+HopBPzAb/llCdE7bVswKRhphVMw4b -bhL0R/TQY7Sf6TK2LKSBrjv0DWOSijikE71SJcBnJvHU7EpKrQQ0lMGclm3ynyji -Nf0YTPXQt4I+fwTmOew2GFeK3UytNWbWI7oXX7Nm4bj9bhf3IJ0kmZb/Gs73+xII -e7Rz52Mby436tWyQIQiF9ITYNGvNf53TwBBZMn0pKPiTyr3Ur7FHEotkEOFNh1// -4zQY10XxuBdLrYGyZ4V8xHJM+oKre8Eg2R9qHXVbjvErHE+7CvgnV7YUip0criPr -BlKRvuoJaSliH2JFhSjWVrkPmFGrWN0BAx10yIqMnEplfKeHf4P9Elek3oInS8WP -G1zJG6s/t5+hQK0X37+TB+6rd3GJAj4EEwECACgFAlgl4TsCGwMFCQHhM4AGCwkI -BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEOiNMzT6X2oKzf8P/iIKd77WHTbp4pMN -8h52HyZJtDJmjA1DPZrbGl1TesW/Z9uTd12txlgqZnbG2GfN9+LSP6EOPzR6v2xC -OVhR+RdWhZDJJuQCVS7lJIqQrZgmeTZG0TyQPZdLjVFBOrrhVwYX+HXbu429IzHr -URf5InyR1QgqOXyElDYS6e28HFqvaoA0DWTWDDqOLPVl+U5fuceIE2XXdv3AGLeP -Yf8J5MPobjPiZtBqI6S6iENY2Yn35qLX+axeC/iYSCHVtFuCCIdb/QYR1ZZV8Ps/ -aI9DwC7LU+YfPw7iqCIoqxSeA3o1PORkdSigEg3jtfRv5UqVo9a0oBb9jdoADsat -F/gW0E7mto3XGOiaR0eB9SSdsM3x7Bz4A0HIGNaxpZo1RWqlO91leP4c13Px7ISv -5OGXfLg+M8qb+qxbGd1HpitGi9s1y1aVfEj1kOtZ0tN8eu+Upg5WKwPNBDX3ar7J -9NCULgVSL+E79FG+zXw62gxiQrLfKzm4wU/9L5wVkwQnm29hLJ0tokrSBZFnc/1l -7OC+GM63tYicKkY4rqmoWUeYx7IwFH9mtDtvR1RxO85RbQhZizwpZpdpRkH0DqZu -ZJRmRa5r7rPqmfa7d+VIFhz2Xs8pJMLVqxTsLKcLglmjw7aOrYG0SWeH7YraXWGD -N3SlvSBiVwcK7QUKzLLvpadLwxfsuQINBFgl3tgBEACbgq6HTN5gEBi0lkD/MafI -nmNi+59U5gRGYqk46WlfRjhHudXjDpgD0lolGb4hYontkMaKRlCg2Rvgjvk3Zve0 -PKWjKw7gr8YBa9fMFY8BhAXI32OdyI9rFhxEZFfWAfwKVmT19BdeAQRFvcfd+8w8 -f1XVc+zddULMJFBTr+xKDlIRWwTkdLPQeWbjo0eHl/g4tuLiLrTxVbnj26bf+2+1 -DbM/w5VavzPrkviHqvKe/QP/gay4QDViWvFgLb90idfAHIdsPgflp0VDS5rVHFL6 -D73rSRdIRo3I8c8mYoNjSR4XDuvgOkAKW9LR3pvouFHHjp6Fr0GesRbrbb2EG66i -PsR99MQ7FqIL9VMHPm2mtR+XvbnKkH2rYyEqaMbSdk29jGapkAWle4sIhSKk749A -4tGkHl08KZ2N9o6GrfUehP/V2eJLaph2DioFL1HxRryrKy80QQKLMJRekxigq8gr -eW8xB4zuf9Mkuou+RHNmo8PebHjFstLigiD6/zP2e+4tUmrT0/JTGOShoGMl8Rt0 -VRxdPImKun+4LOXbfOxArOSkY6i35+gsgkkSy1gTJE0BY3S9auT6+YrglY/TWPQ9 -IJxWVOKlT+3WIp5wJu2bBKQ420VLqDYzkoWytel/bM1ACUtipMiIVeUs2uFiRjpz -A1Wy0QHKPTdSuGlJPRrfcQARAQABiQIlBBgBAgAPAhsMBQJaCWIIBQkFo2BYAAoJ -EOiNMzT6X2oKgSwQAKKs7BGF8TyZeIEO2EUK7R2bdQDCdSGZY06tqLFg3IHMGxDM -b/7FVoa2AEsFgv6xpoebxBB5zkhUk7lslgxvKiSLYjxfNjTBltfiFJ+eQnf+OTs8 -KeR51lLa66rvIH2qUzkNDCCTF45H4wIDpV05AXhBjKYkrDCrtey1rQyFp5fxI+0I -Q1UKKXvzZK4GdxhxDbOUSd38MYy93nqcmclGSGK/gF8XiyuVjeifDCM6+T1NQTX0 -K9lneidcqtBDvlggJTLJtQPO33o5EHzXSiud+dKth1uUhZOFEaYRZoye1YE3yB0T -NOOE8fXlvu8iuIAMBSDL9ep6sEIaXYwoD60I2gHdWD0lkP0DOjGQpi4ouXM3Edsd -5MTi0MDRNTij431kn8T/D0LCgmoUmYYMBgbwFhXr67axPZlKjrqR0z3F/Elv0ZPP -cVg1tNznsALYQ9Ovl6b5M3cJ5GapbbvNWC7yEE1qScl9HiMxjt/H6aPastH63/7w -cN0TslW+zRBy05VNJvpWGStQXcngsSUeJtI1Gd992YNjUJq4/Lih6Z1TlwcFVap+ -cTcDptoUvXYGg/9mRNNPZwErSfIJ0Ibnx9wPVuRN6NiCLOt2mtKp2F1pM6AOQPpZ -85vEh6I8i6OaO0w/Z0UHBwvpY6jDUliaROsWUQsqz78Z34CVj4cy6vPW2EF4 -=r6KK ------END PGP PUBLIC KEY BLOCK----- +mQINBFgl3tgBEAC8A1tUBkD9YV+eLrOmtgy+/JS/H9RoZvkg3K1WZ8IYfj6iIRaYneAk3Bp1 +82GUPVz/zhKr2g0tMXIScDR3EnaDsY+Qg+JqQl8NOG+Cikr1nnkG2on9L8c8yiqry1ZTCmYM +qCa2acTFqnyuXJ482aZNtB4QG2BpzfhW4k8YThpegk/EoRUim+y7buJDtoNf7YILlhDQXN8q +lHB02DWOVUihph9tUIFsPK6BvTr9SIr/eG6j6k0bfUo9pexOn7LS4SojoJmsm/5dp6AoKlac +48cZU5zwR9AYcq/nvkrfmf2WkObg/xRdEvKZzn05jRopmAIwmoC3CiLmqCHPmT5a29vEob/y +PFE335k+ujjZCPOu7OwjzDk7M0zMSfnNfDq8bXh16nn+ueBxJ0NzgD1oC6c2PhM+XRQCXCho +yI8vbfp4dGvCvYqvQAE1bWjqnumZ/7vUPgZN6gDfiAzG2mUxC2SeFBhacgzDvtQls+uuvm+F +nQOUgg2Hh8x2zgoZ7kqV29wjaUPFREuew7e+Th5BxielnzOfVycVXeSuvvIn6cd3g/s8mX1c +2kLSXJR7+KdWDrIrR5Az0kwAqFZt6B6QTlDrPswu3mxsm5TzMbny0PsbL/HBM+GZEZCjMXxB +8bqV2eSaktjnSlUNX1VXxyOxXA+ZG2jwpr51egi57riVRXokrQARAQABtDRFdGhlcmV1bSBG +b3VuZGF0aW9uIEJ1ZyBCb3VudHkgPGJvdW50eUBldGhlcmV1bS5vcmc+iQIcBBEBCAAGBQJa +FCY6AAoJEHoMA3Q0/nfveH8P+gJBPo9BXZL8isUfbUWjwLi81Yi70hZqIJUnz64SWTqBzg5b +mCZ69Ji5637THsxQetS2ARabz0DybQ779FhD/IWnqV9T3KuBM/9RzJtuhLzKCyMrAINPMo28 +rKWdunHHarpuR4m3tL2zWJkle5QVYb+vkZXJJE98PJw+N4IYeKKeCs2ubeqZu636GA0sMzzB +Jn3m/dRRA2va+/zzbr6F6b51ynzbMxWKTsJnstjC8gs8EeI+Zcd6otSyelLtCUkk3h5sTvpV +Wv67BNSU0BYsMkxyFi9PUyy07Wixgeas89K5jG1oOtDva/FkpRHrTE/WA5OXDRcLrHJM+SwD +CwqcLQqJd09NxwUW1iKeBmPptTiOGu1Gv2o7aEyoaWrHRBO7JuYrQrj6q2B3H1Je0zjAd2qt +09ni2bLwLn4LA+VDpprNTO+eZDprv09s2oFSU6NwziHybovu0y7X4pADGkK2evOM7c86PohX +QRQ1M1T16xLj6wP8/Ykwl6v/LUk7iDPXP3GPILnh4YOkwBR3DsCOPn8098xy7FxEELmupRzt +Cj9oC7YAoweeShgUjBPzb+nGY1m6OcFfbUPBgFyMMfwF6joHbiVIO+39+Ut2g2ysZa7KF+yp +XqVDqyEkYXsOLb25OC7brt8IJEPgBPwcHK5GNag6RfLxnQV+iVZ9KNH1yQgSiQI+BBMBAgAo +AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUCWglh+gUJBaNgWAAKCRDojTM0+l9qCgQ2 +D/4udJpV4zGIZW1yNaVvtd3vfKsTLi7GIRJLUBqVb2Yx/uhnN8jTl/tAhCVosCQ1pzvi9kMl +s8qO1vu2kw5EWFFkwK96roI8pTql3VIjwhRVQrCkR7oAk/eUd1U/nt2q6J4UTYeVgqbq4dsI +ZZTRyPJMD667YpuAIcaah+w9j/E5xksYQdMeprnDrQkkBCb4FIMqfDzBPKvEa8DcQr949K85 +kxhr6LDq9i5l4Egxt2JdH8DaR4GLca6+oHy0MyPs/bZOsfmZUObfM2oZgPpqYM96JanhzO1j +dpnItyBii2pc+kNx5nMOf4eikE/MBv+WUJ0TttWzApGGmFUzDhtuEvRH9NBjtJ/pMrYspIGu +O/QNY5KKOKQTvVIlwGcm8dTsSkqtBDSUwZyWbfKfKOI1/RhM9dC3gj5/BOY57DYYV4rdTK01 +ZtYjuhdfs2bhuP1uF/cgnSSZlv8azvf7Egh7tHPnYxvLjfq1bJAhCIX0hNg0a81/ndPAEFky +fSko+JPKvdSvsUcSi2QQ4U2HX//jNBjXRfG4F0utgbJnhXzEckz6gqt7wSDZH2oddVuO8Ssc +T7sK+CdXthSKnRyuI+sGUpG+6glpKWIfYkWFKNZWuQ+YUatY3QEDHXTIioycSmV8p4d/g/0S +V6TegidLxY8bXMkbqz+3n6FArRffv5MH7qt3cYkCPgQTAQIAKAUCWCXhOwIbAwUJAeEzgAYL +CQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ6I0zNPpfagrN/w/+Igp3vtYdNunikw3yHnYf +Jkm0MmaMDUM9mtsaXVN6xb9n25N3Xa3GWCpmdsbYZ8334tI/oQ4/NHq/bEI5WFH5F1aFkMkm +5AJVLuUkipCtmCZ5NkbRPJA9l0uNUUE6uuFXBhf4ddu7jb0jMetRF/kifJHVCCo5fISUNhLp +7bwcWq9qgDQNZNYMOo4s9WX5Tl+5x4gTZdd2/cAYt49h/wnkw+huM+Jm0GojpLqIQ1jZiffm +otf5rF4L+JhIIdW0W4IIh1v9BhHVllXw+z9oj0PALstT5h8/DuKoIiirFJ4DejU85GR1KKAS +DeO19G/lSpWj1rSgFv2N2gAOxq0X+BbQTua2jdcY6JpHR4H1JJ2wzfHsHPgDQcgY1rGlmjVF +aqU73WV4/hzXc/HshK/k4Zd8uD4zypv6rFsZ3UemK0aL2zXLVpV8SPWQ61nS03x675SmDlYr +A80ENfdqvsn00JQuBVIv4Tv0Ub7NfDraDGJCst8rObjBT/0vnBWTBCebb2EsnS2iStIFkWdz +/WXs4L4Yzre1iJwqRjiuqahZR5jHsjAUf2a0O29HVHE7zlFtCFmLPClml2lGQfQOpm5klGZF +rmvus+qZ9rt35UgWHPZezykkwtWrFOwspwuCWaPDto6tgbRJZ4ftitpdYYM3dKW9IGJXBwrt +BQrMsu+lp0vDF+yJAlUEEwEIAD8CGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAFiEErpbt +lp5HmwCE8+F/6I0zNPpfagoFAmEAEJwFCQycmLgACgkQ6I0zNPpfagpWoBAAhOcbMAUw6Zt0 +GYzT3sR5/c0iatezPzXEXJf9ebzR8M5uPElXcxcnMx1dvXZmGPXPJKCPa99WCu1NZYy8F+Wj +GTOY9tfIkvSxhys1p/giPAmvid6uQmD+bz7ivktnyzCkDWfMA+l8lsCSEqVlaq6y5T+a6SWB +6TzC2S0MPb/RrC/7DpwyrNYWumvyVJh09adm1Mw/UGgst/sZ8eMaRYEd3X0yyT1CBpX4zp2E +qQj9IEOTizvzv1x2jkHe5ZUeU3+nTBNlhSA+WFHUi0pfBdo2qog3Mv2EC1P2qMKoSdD5tPbA +zql1yKoHHnXOMsqdftGwbiv2sYXWvrYvmaCd3Ys/viOyt3HOy9uV2ZEtBd9Yqo9x/NZj8QMA +nY5k8jjrIXbUC89MqrJsQ6xxWQIg5ikMT7DvY0Ln89ev4oJyVvwIQAwCm4jUzFNm9bZLYDOP +5lGJCV7tF5NYVU7NxNM8vescKc40mVNK/pygS5mxhK9QYOUjZsIv8gddrl1TkqrFMuxFnTyN +WvzE29wFu/n4N1DkF+ZBqS70SlRvB+Hjz5LrDgEzF1Wf1eA/wq1dZbvMjjDVIc2VGlYp8Cp2 +8ob23c1seTtYXTNYgSR5go4EpH+xi+bIWv01bQQ9xGwBbT5sm4WUeWOcmX4QewzLZ3T/wK9+ +N4Ye/hmU9O34FwWJOY58EIe0OUV0aGVyZXVtIEZvdW5kYXRpb24gU2VjdXJpdHkgVGVhbSA8 +c2VjdXJpdHlAZXRoZXJldW0ub3JnPokCHAQRAQgABgUCWhQmOgAKCRB6DAN0NP5372LSEACT +wZk1TASWZj5QF7rmkIM1GEyBxLE+PundNcMgM9Ktj1315ED8SmiukNI4knVS1MY99OIgXhQl +D1foF2GKdTomrwwC4012zTNyUYCY60LnPZ6Z511HG+rZgZtZrbkz0IiUpwAlhGQND77lBqem +J3K+CFX2XpDA/ojui/kqrY4cwMT5P8xPJkwgpRgw/jgdcZyJTsXdHblV9IGU4H1Vd1SgcfAf +Db3YxDUlBtzlp0NkZqxen8irLIXUQvsfuIfRUbUSkWoK/n3U/gOCajAe8ZNF07iX4OWjH4Sw +NDA841WhFWcGE+d8+pfMVfPASU3UPKH72uw86b2VgR46Av6voyMFd1pj+yCA+YAhJuOpV4yL +QaGg2Z0kVOjuNWK/kBzp1F58DWGh4YBatbhE/UyQOqAAtR7lNf0M3QF9AdrHTxX8oZeqVW3V +Fmi2mk0NwCIUv8SSrZr1dTchp04OtyXe5gZBXSfzncCSRQIUDC8OgNWaOzAaUmK299v4bvye +uSCxOysxC7Q1hZtjzFPKdljS81mRlYeUL4fHlJU9R57bg8mriSXLmn7eKrSEDm/EG5T8nRx7 +TgX2MqJs8sWFxD2+bboVEu75yuFmZ//nmCBApAit9Hr2/sCshGIEpa9MQ6xJCYUxyqeJH+Cc +Aja0UfXhnK2uvPClpJLIl4RE3gm4OXeE1IkCPgQTAQIAKAIbAwYLCQgHAwIGFQgCCQoLBBYC +AwECHgECF4AFAloJYfoFCQWjYFgACgkQ6I0zNPpfagr4MQ//cfp3GSbSG8dkqgctW67Fy7cQ +diiTmx3cwxY+tlI3yrNmdjtrIQMzGdqtY6LNz7aN87F8mXNf+DyVHX9+wd1Y8U+E+hVCTzKC +sefUfxTz6unD9TTcGqaoelgIPMn4IiKz1RZE6eKpfDWe6q78W1Y6x1bE0qGNSjqT/QSxpezF +E/OAm/t8RRxVxDtqz8LfH2zLea5zaC+ADj8EqgY9vX9TQa4DyVV8MgOyECCCadJQCD5O5hIA +B2gVDWwrAUw+KBwskXZ7Iq4reJTKLEmt5z9zgtJ/fABwaCFt66ojwg0/RjbO9cNA3ZwHLGwU +C6hkb6bRzIoZoMfYxVS84opiqf/Teq+t/XkBYCxbSXTJDA5MKjcVuw3N6YKWbkGP/EfQThe7 +BfAKFwwIw5YmsWjHK8IQj6R6hBxzTz9rz8y1Lu8EAAFfA7OJKaboI2qbOlauH98OuOUmVtr1 +TczHO+pTcgWVN0ytq2/pX5KBf4vbmULNbg3HFRq+gHx8CW+jyXGkcqjbgU/5FwtDxeqRTdGJ +SyBGNBEU6pBNolyynyaKaaJjJ/biY27pvjymL5rlz95BH3Dn16Z4RRmqwlT6eq/wFYginujg +CCE1icqOSE+Vjl7V8tV8AcgANkXKdbBE+Q8wlKsGI/kS1w4XFAYcaNHFT8qNeS8TSFXFhvU8 +HylYxO79t56JAj4EEwECACgFAlgl3tgCGwMFCQHhM4AGCwkIBwMCBhUIAgkKCwQWAgMBAh4B +AheAAAoJEOiNMzT6X2oKmUMP/0hnaL6bVyepAq2LIdvIUbHfagt/Oo/KVfZs4bkM+xJOitJR +0kwZV9PTihXFdzhL/YNWc2+LtEBtKItqkJZKmWC0E6OPXGVuU6hfFPebuzVccYJfm0Q3Ej19 +VJI9Uomf59Bpak8HYyEED7WVQjoYn7XVPsonwus/9+LDX+c5vutbrUdbjga3KjHbewD93X4O +wVVoXyHEmU2Plyg8qvzFbNDylCWO7N2McO6SN6+7DitGZGr2+jO+P2R4RT1cnl2V3IRVcWZ0 +OTspPSnRGVr2fFiHN/+v8G/wHPLQcJZFvYPfUGNdcYbTmhWdiY0bEYXFiNrgzCCsyad7eKUR +WN9QmxqmyqLDjUEDJCAh19ES6Vg3tqGwXk+uNUCoF30ga0TxQt6UXZJDEQFAGeASQ/RqE/q1 +EAuLv8IGM8o7IqKO2pWfLuqsY6dTbKBwDzz9YOJt7EOGuPPQbHxaYStTushZmJnm7hi8lhVG +jT7qsEJdE95Il+I/mHWnXsCevaXjZugBiyV9yvOq4Hwwe2s1zKfrnQ4u0cadvGAh2eIqum7M +Y3o6nD47aJ3YmEPX/WnhI56bACa2GmWvUwjI4c0/er3esSPYnuHnM9L8Am4qQwMVSmyU80tC +MI7A9e13Mvv+RRkYFLJ7PVPdNpbW5jqX1doklFpKf6/XM+B+ngYneU+zgCUBiQJVBBMBCAA/ +AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgBYhBK6W7ZaeR5sAhPPhf+iNMzT6X2oKBQJh +ABCQBQkMnJi4AAoJEOiNMzT6X2oKAv0P+gJ3twBp5efNWyVLcIg4h4cOo9uD0NPvz8/fm2gX +FoOJL3MeigtPuSVfE9kuTaTuRbArzuFtdvH6G/kcRQvOlO4zyiIRHCk1gDHoIvvtn6RbRhVm +/Xo4uGIsFHst7n4A7BjicwEK5Op6Ih5Hoq19xz83YSBgBVk2fYEJIRyJiKFbyPjH0eSYe8v+ +Ra5/F85ugLx1P6mMVkW+WPzULns89riW7BGTnZmXFHZp8nO2pkUlcI7F3KRG7l4kmlC50ox6 +DiG/6AJCVulbAClky9C68TmJ/R1RazQxU/9IqVywsydq66tbJQbm5Z7GEti0C5jjbSRJL2oT +1xC7Rilr85PMREkPL3vegJdgj5PKlffZ/MocD/0EohiQ7wFpejFD4iTljeh0exRUwCRb6655 +9ib34JSQgU8Hl4JJu+mEgd9v0ZHD0/1mMD6fnAR84zca+O3cdASbnQmzTOKcGzLIrkE8TEnU ++2UZ8Ol7SAAqmBgzY1gKOilUho6dkyCAwNL+QDpvrITDPLEFPsjyB/M2KudZSVEn+Rletju1 +qkMW31qFMNlsbwzMZw+0USeGcs31Cs0B2/WQsro99CExlhS9auUFkmoVjJmYVTIYOM0zuPa4 +OyGspqPhRu5hEsmMDPDWD7Aad5k4GTqogQNnuKyRliZjXXrDZqFD5nfsJSL8Ky/sJGEMuQIN +BFgl3tgBEACbgq6HTN5gEBi0lkD/MafInmNi+59U5gRGYqk46WlfRjhHudXjDpgD0lolGb4h +YontkMaKRlCg2Rvgjvk3Zve0PKWjKw7gr8YBa9fMFY8BhAXI32OdyI9rFhxEZFfWAfwKVmT1 +9BdeAQRFvcfd+8w8f1XVc+zddULMJFBTr+xKDlIRWwTkdLPQeWbjo0eHl/g4tuLiLrTxVbnj +26bf+2+1DbM/w5VavzPrkviHqvKe/QP/gay4QDViWvFgLb90idfAHIdsPgflp0VDS5rVHFL6 +D73rSRdIRo3I8c8mYoNjSR4XDuvgOkAKW9LR3pvouFHHjp6Fr0GesRbrbb2EG66iPsR99MQ7 +FqIL9VMHPm2mtR+XvbnKkH2rYyEqaMbSdk29jGapkAWle4sIhSKk749A4tGkHl08KZ2N9o6G +rfUehP/V2eJLaph2DioFL1HxRryrKy80QQKLMJRekxigq8greW8xB4zuf9Mkuou+RHNmo8Pe +bHjFstLigiD6/zP2e+4tUmrT0/JTGOShoGMl8Rt0VRxdPImKun+4LOXbfOxArOSkY6i35+gs +gkkSy1gTJE0BY3S9auT6+YrglY/TWPQ9IJxWVOKlT+3WIp5wJu2bBKQ420VLqDYzkoWytel/ +bM1ACUtipMiIVeUs2uFiRjpzA1Wy0QHKPTdSuGlJPRrfcQARAQABiQIlBBgBAgAPAhsMBQJa +CWIIBQkFo2BYAAoJEOiNMzT6X2oKgSwQAKKs7BGF8TyZeIEO2EUK7R2bdQDCdSGZY06tqLFg +3IHMGxDMb/7FVoa2AEsFgv6xpoebxBB5zkhUk7lslgxvKiSLYjxfNjTBltfiFJ+eQnf+OTs8 +KeR51lLa66rvIH2qUzkNDCCTF45H4wIDpV05AXhBjKYkrDCrtey1rQyFp5fxI+0IQ1UKKXvz +ZK4GdxhxDbOUSd38MYy93nqcmclGSGK/gF8XiyuVjeifDCM6+T1NQTX0K9lneidcqtBDvlgg +JTLJtQPO33o5EHzXSiud+dKth1uUhZOFEaYRZoye1YE3yB0TNOOE8fXlvu8iuIAMBSDL9ep6 +sEIaXYwoD60I2gHdWD0lkP0DOjGQpi4ouXM3Edsd5MTi0MDRNTij431kn8T/D0LCgmoUmYYM +BgbwFhXr67axPZlKjrqR0z3F/Elv0ZPPcVg1tNznsALYQ9Ovl6b5M3cJ5GapbbvNWC7yEE1q +Scl9HiMxjt/H6aPastH63/7wcN0TslW+zRBy05VNJvpWGStQXcngsSUeJtI1Gd992YNjUJq4 +/Lih6Z1TlwcFVap+cTcDptoUvXYGg/9mRNNPZwErSfIJ0Ibnx9wPVuRN6NiCLOt2mtKp2F1p +M6AOQPpZ85vEh6I8i6OaO0w/Z0UHBwvpY6jDUliaROsWUQsqz78Z34CVj4cy6vPW2EF4iQIl +BBgBAgAPBQJYJd7YAhsMBQkB4TOAAAoJEOiNMzT6X2oKTjgP/1ojCVyGyvHMLUgnX0zwrR5Q +1M5RKFz6kHwKjODVLR3Isp8I935oTQt3DY7yFDI4t0GqbYRQMtxcNEb7maianhK2trCXfhPs +6/L04igjDf5iTcmzamXN6xnh5xkz06hZJJCMuu4MvKxC9MQHCVKAwjswl/9H9JqIBXAY3E2l +LpX5P+5jDZuPxS86p3+k4Rrdp9KTGXjiuEleM3zGlz5BLWydqovOck7C2aKh27ETFpDYY0z3 +yQ5AsPJyk1rAr0wrH6+ywmwWlzuQewavnrLnJ2M8iMFXpIhyHeEIU/f7o8f+dQk72rZ9CGzd +cqig2za/BS3zawZWgbv2vB2elNsIllYLdir45jxBOxx2yvJvEuu4glz78y4oJTCTAYAbMlle +5gVdPkVcGyvvVS9tinnSaiIzuvWrYHKWll1uYPm2Q1CDs06P5I7bUGAXpgQLUh/XQguy/0sX +GWqW3FS5JzP+XgcR/7UASvwBdHylubKbeqEpB7G1s+m+8C67qOrc7EQv3Jmy1YDOkhEyNig1 +rmjplLuir3tC1X+D7dHpn7NJe7nMwFx2b2MpMkLA9jPPAGPp/ekcu5sxCe+E0J/4UF++K+CR +XIxgtzU2UJfp8p9x+ygbx5qHinR0tVRdIzv3ZnGsXrfxnWfSOaB582cU3VRN9INzHHax8ETa +QVDnGO5uQa+FiQI8BBgBCAAmAhsMFiEErpbtlp5HmwCE8+F/6I0zNPpfagoFAmEAELYFCQyc +mN4ACgkQ6I0zNPpfagoqAQ/+MnDjBx8JWMd/XjeFoYKx/Oo0ntkInV+ME61JTBls4PdVk+TB +8PWZdPQHw9SnTvRmykFeznXIRzuxkowjrZYXdPXBxY2b1WyD5V3Ati1TM9vqpaR4osyPs2xy +I4dzDssh9YvUsIRL99O04/65lGiYeBNuACq+yK/7nD/ErzBkDYJHhMCdadbVWUACxvVIDvro +yQeVLKMsHqMCd8BTGD7VDs79NXskPnN77pAFnkzS4Z2b8SNzrlgTc5pUiuZHIXPIpEYmsYzh +ucTU6uI3dN1PbSFHK5tG2pHb4ZrPxY3L20Dgc2Tfu5/SDApZzwvvKTqjdO891MEJ++H+ssOz +i4O1UeWKs9owWttan9+PI47ozBSKOTxmMqLSQ0f56Np9FJsV0ilGxRKfjhzJ4KniOMUBA7mP ++m+TmXfVtthJred4sHlJMTJNpt+sCcT6wLMmyc3keIEAu33gsJj3LTpkEA2q+V+ZiP6Q8HRB +402ITklABSArrPSE/fQU9L8hZ5qmy0Z96z0iyILgVMLuRCCfQOMWhwl8yQWIIaf1yPI07xur +epy6lH7HmxjjOR7eo0DaSxQGQpThAtFGwkWkFh8yki8j3E42kkrxvEyyYZDXn2YcI3bpqhJx +PtwCMZUJ3kc/skOrs6bOI19iBNaEoNX5Dllm7UHjOgWNDQkcCuOCxucKano= +=arte +-----END PGP PUBLIC KEY BLOCK------ ``` diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index e410522ac8..27d40f1d66 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -462,6 +462,12 @@ func (b *SimulatedBackend) PendingNonceAt(ctx context.Context, account common.Ad // SuggestGasPrice implements ContractTransactor.SuggestGasPrice. Since the simulated // chain doesn't have miners, we just return a gas price of 1 for any call. func (b *SimulatedBackend) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + b.mu.Lock() + defer b.mu.Unlock() + + if b.pendingBlock.Header().BaseFee != nil { + return b.pendingBlock.Header().BaseFee, nil + } return big.NewInt(1), nil } diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go index 6132678107..8a0cbe3357 100644 --- a/accounts/abi/bind/backends/simulated_test.go +++ b/accounts/abi/bind/backends/simulated_test.go @@ -496,7 +496,7 @@ func TestEstimateGas(t *testing.T) { GasPrice: big.NewInt(0), Value: nil, Data: common.Hex2Bytes("b9b046f9"), - }, 0, errors.New("invalid opcode: opcode 0xfe not defined"), nil}, + }, 0, errors.New("invalid opcode: INVALID"), nil}, {"Valid", ethereum.CallMsg{ From: addr, @@ -916,8 +916,8 @@ func TestSuggestGasPrice(t *testing.T) { if err != nil { t.Errorf("could not get gas price: %v", err) } - if gasPrice.Uint64() != uint64(1) { - t.Errorf("gas price was not expected value of 1. actual: %v", gasPrice.Uint64()) + if gasPrice.Uint64() != sim.pendingBlock.Header().BaseFee.Uint64() { + t.Errorf("gas price was not expected value of %v. actual: %v", sim.pendingBlock.Header().BaseFee.Uint64(), gasPrice.Uint64()) } } diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index 63280bcbeb..f4e5a2a900 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -370,7 +370,7 @@ func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, i rawTx, err = c.createLegacyTx(opts, contract, input) } else { // Only query for basefee if gasPrice not specified - if head, errHead := c.transactor.HeaderByNumber(ensureContext(opts.Context), nil); err != nil { + if head, errHead := c.transactor.HeaderByNumber(ensureContext(opts.Context), nil); errHead != nil { return nil, errHead } else if head.BaseFee != nil { rawTx, err = c.createDynamicTx(opts, contract, input, head) diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go index 0e98709b14..ff69a78c64 100644 --- a/accounts/abi/bind/bind.go +++ b/accounts/abi/bind/bind.go @@ -88,6 +88,13 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string] transactIdentifiers = make(map[string]bool) eventIdentifiers = make(map[string]bool) ) + + for _, input := range evmABI.Constructor.Inputs { + if hasStruct(input.Type) { + bindStructType[lang](input.Type, structs) + } + } + for _, original := range evmABI.Methods { // Normalize the method for capital cases and non-anonymous inputs/outputs normalized := original diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index 5a436607ce..992497993a 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -1911,6 +1911,50 @@ var bindTests = []struct { nil, nil, }, + { + name: `ConstructorWithStructParam`, + contract: ` + pragma solidity >=0.8.0 <0.9.0; + + contract ConstructorWithStructParam { + struct StructType { + uint256 field; + } + + constructor(StructType memory st) {} + } + `, + bytecode: []string{`0x608060405234801561001057600080fd5b506040516101c43803806101c48339818101604052810190610032919061014a565b50610177565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100958261004c565b810181811067ffffffffffffffff821117156100b4576100b361005d565b5b80604052505050565b60006100c7610038565b90506100d3828261008c565b919050565b6000819050919050565b6100eb816100d8565b81146100f657600080fd5b50565b600081519050610108816100e2565b92915050565b60006020828403121561012457610123610047565b5b61012e60206100bd565b9050600061013e848285016100f9565b60008301525092915050565b6000602082840312156101605761015f610042565b5b600061016e8482850161010e565b91505092915050565b603f806101856000396000f3fe6080604052600080fdfea2646970667358221220cdffa667affecefac5561f65f4a4ba914204a8d4eb859d8cd426fb306e5c12a364736f6c634300080a0033`}, + abi: []string{`[{"inputs":[{"components":[{"internalType":"uint256","name":"field","type":"uint256"}],"internalType":"struct ConstructorWithStructParam.StructType","name":"st","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"}]`}, + imports: ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/ethconfig" + `, + tester: ` + var ( + key, _ = crypto.GenerateKey() + user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) + sim = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, ethconfig.Defaults.Miner.GasCeil) + ) + defer sim.Close() + + _, tx, _, err := DeployConstructorWithStructParam(user, sim, ConstructorWithStructParamStructType{Field: big.NewInt(42)}) + if err != nil { + t.Fatalf("DeployConstructorWithStructParam() got err %v; want nil err", err) + } + sim.Commit() + + if _, err = bind.WaitDeployed(nil, sim, tx); err != nil { + t.Logf("Deployment tx: %+v", tx) + t.Errorf("bind.WaitDeployed(nil, %T, ) got err %v; want nil err", sim, err) + } + `, + }, } // Tests that packages generated by the binder can be successfully compiled and @@ -1934,22 +1978,23 @@ func TestGolangBindings(t *testing.T) { } // Generate the test suite for all the contracts for i, tt := range bindTests { - var types []string - if tt.types != nil { - types = tt.types - } else { - types = []string{tt.name} - } - // Generate the binding and create a Go source file in the workspace - bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs, tt.aliases) - if err != nil { - t.Fatalf("test %d: failed to generate binding: %v", i, err) - } - if err = ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil { - t.Fatalf("test %d: failed to write binding: %v", i, err) - } - // Generate the test file with the injected test code - code := fmt.Sprintf(` + t.Run(tt.name, func(t *testing.T) { + var types []string + if tt.types != nil { + types = tt.types + } else { + types = []string{tt.name} + } + // Generate the binding and create a Go source file in the workspace + bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs, tt.aliases) + if err != nil { + t.Fatalf("test %d: failed to generate binding: %v", i, err) + } + if err = ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil { + t.Fatalf("test %d: failed to write binding: %v", i, err) + } + // Generate the test file with the injected test code + code := fmt.Sprintf(` package bindtest import ( @@ -1961,9 +2006,10 @@ func TestGolangBindings(t *testing.T) { %s } `, tt.imports, tt.name, tt.tester) - if err := ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil { - t.Fatalf("test %d: failed to write tests: %v", i, err) - } + if err := ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil { + t.Fatalf("test %d: failed to write tests: %v", i, err) + } + }) } // Convert the package to go modules and use the current source for go-ethereum moder := exec.Command(gocmd, "mod", "init", "bindtest") diff --git a/accounts/abi/unpack.go b/accounts/abi/unpack.go index ec06984936..43cd6c6457 100644 --- a/accounts/abi/unpack.go +++ b/accounts/abi/unpack.go @@ -290,7 +290,7 @@ func tuplePointsTo(index int, output []byte) (start int, err error) { offset := big.NewInt(0).SetBytes(output[index : index+32]) outputLen := big.NewInt(int64(len(output))) - if offset.Cmp(big.NewInt(int64(len(output)))) > 0 { + if offset.Cmp(outputLen) > 0 { return 0, fmt.Errorf("abi: cannot marshal in to go slice: offset %v would go over slice boundary (len=%v)", offset, outputLen) } if offset.BitLen() > 63 { diff --git a/accounts/accounts.go b/accounts/accounts.go index faf162777e..c1b5f31235 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -177,7 +177,7 @@ type Backend interface { // TextHash is a helper function that calculates a hash for the given message that can be // safely used to calculate a signature from. // -// The hash is calulcated as +// The hash is calculated as // keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). // // This gives context to the signed message and prevents signing of transactions. @@ -189,7 +189,7 @@ func TextHash(data []byte) []byte { // TextAndHash is a helper function that calculates a hash for the given message that can be // safely used to calculate a signature from. // -// The hash is calulcated as +// The hash is calculated as // keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). // // This gives context to the signed message and prevents signing of transactions. diff --git a/build/checksums.txt b/build/checksums.txt index 48a13b53e8..5df27bbf61 100644 --- a/build/checksums.txt +++ b/build/checksums.txt @@ -1,19 +1,19 @@ # This file contains sha256 checksums of optional build dependencies. -2255eb3e4e824dd7d5fcdc2e7f84534371c186312e546fb1086a34c17752f431 go1.17.2.src.tar.gz -7914497a302a132a465d33f5ee044ce05568bacdb390ab805cb75a3435a23f94 go1.17.2.darwin-amd64.tar.gz -ce8771bd3edfb5b28104084b56bbb532eeb47fbb7769c3e664c6223712c30904 go1.17.2.darwin-arm64.tar.gz -8cea5b8d1f8e8cbb58069bfed58954c71c5b1aca2f3c857765dae83bf724d0d7 go1.17.2.freebsd-386.tar.gz -c96e57218fb03e74d683ad63b1684d44c89d5e5b994f36102b33dce21b58499a go1.17.2.freebsd-amd64.tar.gz -8617f2e40d51076983502894181ae639d1d8101bfbc4d7463a2b442f239f5596 go1.17.2.linux-386.tar.gz -f242a9db6a0ad1846de7b6d94d507915d14062660616a61ef7c808a76e4f1676 go1.17.2.linux-amd64.tar.gz -a5a43c9cdabdb9f371d56951b14290eba8ce2f9b0db48fb5fc657943984fd4fc go1.17.2.linux-arm64.tar.gz -04d16105008230a9763005be05606f7eb1c683a3dbf0fbfed4034b23889cb7f2 go1.17.2.linux-armv6l.tar.gz -12e2dc7e0ffeebe77083f267ef6705fec1621cdf2ed6489b3af04a13597ed68d go1.17.2.linux-ppc64le.tar.gz -c4b2349a8d11350ca038b8c57f3cc58dc0b31284bcbed4f7fca39aeed28b4a51 go1.17.2.linux-s390x.tar.gz -8a85257a351996fdf045fe95ed5fdd6917dd48636d562dd11dedf193005a53e0 go1.17.2.windows-386.zip -fa6da0b829a66f5fab7e4e312fd6aa1b2d8f045c7ecee83b3d00f6fe5306759a go1.17.2.windows-amd64.zip -00575c85dc7a129ba892685a456b27a3f3670f71c8bfde1c5ad151f771d55df7 go1.17.2.windows-arm64.zip +3defb9a09bed042403195e872dcbc8c6fae1485963332279668ec52e80a95a2d go1.17.5.src.tar.gz +2db6a5d25815b56072465a2cacc8ed426c18f1d5fc26c1fc8c4f5a7188658264 go1.17.5.darwin-amd64.tar.gz +111f71166de0cb8089bb3e8f9f5b02d76e1bf1309256824d4062a47b0e5f98e0 go1.17.5.darwin-arm64.tar.gz +443c1cd9768df02085014f1eb034ebc7dbe032ffc8a9bb9f2e6617d037eee23c go1.17.5.freebsd-386.tar.gz +17180bdc4126acffd0ebf86d66ef5cbc3488b6734e93374fb00eb09494e006d3 go1.17.5.freebsd-amd64.tar.gz +4f4914303bc18f24fd137a97e595735308f5ce81323c7224c12466fd763fc59f go1.17.5.linux-386.tar.gz +bd78114b0d441b029c8fe0341f4910370925a4d270a6a590668840675b0c653e go1.17.5.linux-amd64.tar.gz +6f95ce3da40d9ce1355e48f31f4eb6508382415ca4d7413b1e7a3314e6430e7e go1.17.5.linux-arm64.tar.gz +aa1fb6c53b4fe72f159333362a10aca37ae938bde8adc9c6eaf2a8e87d1e47de go1.17.5.linux-armv6l.tar.gz +3d4be616e568f0a02cb7f7769bcaafda4b0969ed0f9bb4277619930b96847e70 go1.17.5.linux-ppc64le.tar.gz +8087d4fe991e82804e6485c26568c2e0ee0bfde00ceb9015dc86cb6bf84ef40b go1.17.5.linux-s390x.tar.gz +6d7b9948ee14a906b14f5cbebdfab63cd6828b0b618160847ecd3cc3470a26fe go1.17.5.windows-386.zip +671faf99cd5d81cd7e40936c0a94363c64d654faa0148d2af4bbc262555620b9 go1.17.5.windows-amd64.zip +45e88676b68e9cf364be469b5a27965397f4e339aa622c2f52c10433c56e5030 go1.17.5.windows-arm64.zip d4bd25b9814eeaa2134197dd2c7671bb791eae786d42010d9d788af20dee4bfa golangci-lint-1.42.0-darwin-amd64.tar.gz e56859c04a2ad5390c6a497b1acb1cc9329ecb1010260c6faae9b5a4c35b35ea golangci-lint-1.42.0-darwin-arm64.tar.gz diff --git a/build/ci.go b/build/ci.go index 80d4269b24..8b302511a7 100644 --- a/build/ci.go +++ b/build/ci.go @@ -33,7 +33,6 @@ Available commands are: nsis -- creates a Windows NSIS installer aar [ -local ] [ -sign key-id ] [-deploy repo] [ -upload dest ] -- creates an Android archive xcode [ -local ] [ -sign key-id ] [-deploy repo] [ -upload dest ] -- creates an iOS XCode framework - xgo [ -alltools ] [ options ] -- cross builds according to options purge [ -store blobstore ] [ -days threshold ] -- purges old archives from the blobstore For all commands, -n prevents execution of external programs (dry run mode). @@ -148,7 +147,7 @@ var ( // This is the version of go that will be downloaded by // // go run ci.go install -dlgo - dlgoVersion = "1.17.2" + dlgoVersion = "1.17.5" ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) @@ -188,8 +187,6 @@ func main() { doAndroidArchive(os.Args[2:]) case "xcode": doXCodeFramework(os.Args[2:]) - case "xgo": - doXgo(os.Args[2:]) case "purge": doPurge(os.Args[2:]) default: @@ -1209,48 +1206,6 @@ func newPodMetadata(env build.Environment, archive string) podMetadata { } } -// Cross compilation - -func doXgo(cmdline []string) { - var ( - alltools = flag.Bool("alltools", false, `Flag whether we're building all known tools, or only on in particular`) - ) - flag.CommandLine.Parse(cmdline) - env := build.Env() - var tc build.GoToolchain - - // Make sure xgo is available for cross compilation - build.MustRun(tc.Install(GOBIN, "github.com/karalabe/xgo@latest")) - - // If all tools building is requested, build everything the builder wants - args := append(buildFlags(env), flag.Args()...) - - if *alltools { - args = append(args, []string{"--dest", GOBIN}...) - for _, res := range allToolsArchiveFiles { - if strings.HasPrefix(res, GOBIN) { - // Binary tool found, cross build it explicitly - args = append(args, "./"+filepath.Join("cmd", filepath.Base(res))) - build.MustRun(xgoTool(args)) - args = args[:len(args)-1] - } - } - return - } - - // Otherwise execute the explicit cross compilation - path := args[len(args)-1] - args = append(args[:len(args)-1], []string{"--dest", GOBIN, path}...) - build.MustRun(xgoTool(args)) -} - -func xgoTool(args []string) *exec.Cmd { - cmd := exec.Command(filepath.Join(GOBIN, "xgo"), args...) - cmd.Env = os.Environ() - cmd.Env = append(cmd.Env, []string{"GOBIN=" + GOBIN}...) - return cmd -} - // Binary distribution cleanups func doPurge(cmdline []string) { diff --git a/cmd/clef/main.go b/cmd/clef/main.go index 61d2811f65..3aaf898db2 100644 --- a/cmd/clef/main.go +++ b/cmd/clef/main.go @@ -898,7 +898,7 @@ func testExternalUI(api *core.SignerAPI) { addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") data := `{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"test","type":"uint8"},{"name":"wallet","type":"address"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]},"primaryType":"Mail","domain":{"name":"Ether Mail","version":"1","chainId":"1","verifyingContract":"0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"from":{"name":"Cow","test":"3","wallet":"0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"},"to":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB","test":"2"},"contents":"Hello, Bob!"}}` //_, err := api.SignData(ctx, accounts.MimetypeTypedData, *addr, hexutil.Encode([]byte(data))) - var typedData core.TypedData + var typedData apitypes.TypedData json.Unmarshal([]byte(data), &typedData) _, err := api.SignTypedData(ctx, *addr, typedData) expectApprove("sign 712 typed data", err) @@ -1025,7 +1025,7 @@ func GenDoc(ctx *cli.Context) { "of the work in canonicalizing and making sense of the data, and it's up to the UI to present" + "the user with the contents of the `message`" sighash, msg := accounts.TextAndHash([]byte("hello world")) - messages := []*core.NameValueType{{Name: "message", Value: msg, Typ: accounts.MimetypeTextPlain}} + messages := []*apitypes.NameValueType{{Name: "message", Value: msg, Typ: accounts.MimetypeTextPlain}} add("SignDataRequest", desc, &core.SignDataRequest{ Address: common.NewMixedcaseAddress(a), diff --git a/cmd/devp2p/dns_cloudflare.go b/cmd/devp2p/dns_cloudflare.go index 596254df91..d67aaea1a7 100644 --- a/cmd/devp2p/dns_cloudflare.go +++ b/cmd/devp2p/dns_cloudflare.go @@ -133,7 +133,8 @@ func (c *cloudflareClient) uploadRecords(name string, records map[string]string) log.Info(fmt.Sprintf("Creating %s = %q", path, val)) ttl := rootTTL if path != name { - ttl = treeNodeTTL // Max TTL permitted by Cloudflare + ttl = treeNodeTTLCloudflare // Max TTL permitted by Cloudflare + } record := cloudflare.DNSRecord{Type: "TXT", Name: path, Content: val, TTL: ttl} _, err = c.CreateDNSRecord(context.Background(), c.zoneID, record) diff --git a/cmd/devp2p/dnscmd.go b/cmd/devp2p/dnscmd.go index 66deef56ea..85f28b8cb1 100644 --- a/cmd/devp2p/dnscmd.go +++ b/cmd/devp2p/dnscmd.go @@ -115,8 +115,9 @@ var ( ) const ( - rootTTL = 30 * 60 // 30 min - treeNodeTTL = 4 * 7 * 24 * 60 * 60 // 4 weeks + rootTTL = 30 * 60 // 30 min + treeNodeTTL = 4 * 7 * 24 * 60 * 60 // 4 weeks + treeNodeTTLCloudflare = 24 * 60 * 60 // 1 day ) // dnsSync performs dnsSyncCommand. diff --git a/cmd/devp2p/internal/ethtest/helpers.go b/cmd/devp2p/internal/ethtest/helpers.go index 88d8e143c1..e695cd42d6 100644 --- a/cmd/devp2p/internal/ethtest/helpers.go +++ b/cmd/devp2p/internal/ethtest/helpers.go @@ -131,7 +131,7 @@ func (c *Conn) handshake() error { } c.negotiateEthProtocol(msg.Caps) if c.negotiatedProtoVersion == 0 { - return fmt.Errorf("unexpected eth protocol version") + return fmt.Errorf("could not negotiate protocol (remote caps: %v, local eth version: %v)", msg.Caps, c.ourHighestProtoVersion) } return nil default: diff --git a/cmd/devp2p/internal/ethtest/suite.go b/cmd/devp2p/internal/ethtest/suite.go index bbc955cd7b..28ba4aa767 100644 --- a/cmd/devp2p/internal/ethtest/suite.go +++ b/cmd/devp2p/internal/ethtest/suite.go @@ -52,35 +52,35 @@ func NewSuite(dest *enode.Node, chainfile string, genesisfile string) (*Suite, e func (s *Suite) AllEthTests() []utesting.Test { return []utesting.Test{ // status - {Name: "TestStatus", Fn: s.TestStatus}, + {Name: "TestStatus65", Fn: s.TestStatus65}, {Name: "TestStatus66", Fn: s.TestStatus66}, // get block headers - {Name: "TestGetBlockHeaders", Fn: s.TestGetBlockHeaders}, + {Name: "TestGetBlockHeaders65", Fn: s.TestGetBlockHeaders65}, {Name: "TestGetBlockHeaders66", Fn: s.TestGetBlockHeaders66}, {Name: "TestSimultaneousRequests66", Fn: s.TestSimultaneousRequests66}, {Name: "TestSameRequestID66", Fn: s.TestSameRequestID66}, {Name: "TestZeroRequestID66", Fn: s.TestZeroRequestID66}, // get block bodies - {Name: "TestGetBlockBodies", Fn: s.TestGetBlockBodies}, + {Name: "TestGetBlockBodies65", Fn: s.TestGetBlockBodies65}, {Name: "TestGetBlockBodies66", Fn: s.TestGetBlockBodies66}, // broadcast - {Name: "TestBroadcast", Fn: s.TestBroadcast}, + {Name: "TestBroadcast65", Fn: s.TestBroadcast65}, {Name: "TestBroadcast66", Fn: s.TestBroadcast66}, - {Name: "TestLargeAnnounce", Fn: s.TestLargeAnnounce}, + {Name: "TestLargeAnnounce65", Fn: s.TestLargeAnnounce65}, {Name: "TestLargeAnnounce66", Fn: s.TestLargeAnnounce66}, - {Name: "TestOldAnnounce", Fn: s.TestOldAnnounce}, + {Name: "TestOldAnnounce65", Fn: s.TestOldAnnounce65}, {Name: "TestOldAnnounce66", Fn: s.TestOldAnnounce66}, - {Name: "TestBlockHashAnnounce", Fn: s.TestBlockHashAnnounce}, + {Name: "TestBlockHashAnnounce65", Fn: s.TestBlockHashAnnounce65}, {Name: "TestBlockHashAnnounce66", Fn: s.TestBlockHashAnnounce66}, // malicious handshakes + status - {Name: "TestMaliciousHandshake", Fn: s.TestMaliciousHandshake}, - {Name: "TestMaliciousStatus", Fn: s.TestMaliciousStatus}, + {Name: "TestMaliciousHandshake65", Fn: s.TestMaliciousHandshake65}, + {Name: "TestMaliciousStatus65", Fn: s.TestMaliciousStatus65}, {Name: "TestMaliciousHandshake66", Fn: s.TestMaliciousHandshake66}, {Name: "TestMaliciousStatus66", Fn: s.TestMaliciousStatus66}, // test transactions - {Name: "TestTransaction", Fn: s.TestTransaction}, + {Name: "TestTransaction65", Fn: s.TestTransaction65}, {Name: "TestTransaction66", Fn: s.TestTransaction66}, - {Name: "TestMaliciousTx", Fn: s.TestMaliciousTx}, + {Name: "TestMaliciousTx65", Fn: s.TestMaliciousTx65}, {Name: "TestMaliciousTx66", Fn: s.TestMaliciousTx66}, {Name: "TestLargeTxRequest66", Fn: s.TestLargeTxRequest66}, {Name: "TestNewPooledTxs66", Fn: s.TestNewPooledTxs66}, @@ -89,17 +89,17 @@ func (s *Suite) AllEthTests() []utesting.Test { func (s *Suite) EthTests() []utesting.Test { return []utesting.Test{ - {Name: "TestStatus", Fn: s.TestStatus}, - {Name: "TestGetBlockHeaders", Fn: s.TestGetBlockHeaders}, - {Name: "TestGetBlockBodies", Fn: s.TestGetBlockBodies}, - {Name: "TestBroadcast", Fn: s.TestBroadcast}, - {Name: "TestLargeAnnounce", Fn: s.TestLargeAnnounce}, - {Name: "TestOldAnnounce", Fn: s.TestOldAnnounce}, - {Name: "TestBlockHashAnnounce", Fn: s.TestBlockHashAnnounce}, - {Name: "TestMaliciousHandshake", Fn: s.TestMaliciousHandshake}, - {Name: "TestMaliciousStatus", Fn: s.TestMaliciousStatus}, - {Name: "TestTransaction", Fn: s.TestTransaction}, - {Name: "TestMaliciousTx", Fn: s.TestMaliciousTx}, + {Name: "TestStatus65", Fn: s.TestStatus65}, + {Name: "TestGetBlockHeaders65", Fn: s.TestGetBlockHeaders65}, + {Name: "TestGetBlockBodies65", Fn: s.TestGetBlockBodies65}, + {Name: "TestBroadcast65", Fn: s.TestBroadcast65}, + {Name: "TestLargeAnnounce65", Fn: s.TestLargeAnnounce65}, + {Name: "TestOldAnnounce65", Fn: s.TestOldAnnounce65}, + {Name: "TestBlockHashAnnounce65", Fn: s.TestBlockHashAnnounce65}, + {Name: "TestMaliciousHandshake65", Fn: s.TestMaliciousHandshake65}, + {Name: "TestMaliciousStatus65", Fn: s.TestMaliciousStatus65}, + {Name: "TestTransaction65", Fn: s.TestTransaction65}, + {Name: "TestMaliciousTx65", Fn: s.TestMaliciousTx65}, } } @@ -130,9 +130,9 @@ var ( eth65 = false // indicates whether suite should negotiate eth65 connection or below. ) -// TestStatus attempts to connect to the given node and exchange +// TestStatus65 attempts to connect to the given node and exchange // a status message with it. -func (s *Suite) TestStatus(t *utesting.T) { +func (s *Suite) TestStatus65(t *utesting.T) { conn, err := s.dial() if err != nil { t.Fatalf("dial failed: %v", err) @@ -156,9 +156,9 @@ func (s *Suite) TestStatus66(t *utesting.T) { } } -// TestGetBlockHeaders tests whether the given node can respond to +// TestGetBlockHeaders65 tests whether the given node can respond to // a `GetBlockHeaders` request accurately. -func (s *Suite) TestGetBlockHeaders(t *utesting.T) { +func (s *Suite) TestGetBlockHeaders65(t *utesting.T) { conn, err := s.dial() if err != nil { t.Fatalf("dial failed: %v", err) @@ -392,9 +392,9 @@ func (s *Suite) TestZeroRequestID66(t *utesting.T) { } } -// TestGetBlockBodies tests whether the given node can respond to +// TestGetBlockBodies65 tests whether the given node can respond to // a `GetBlockBodies` request and that the response is accurate. -func (s *Suite) TestGetBlockBodies(t *utesting.T) { +func (s *Suite) TestGetBlockBodies65(t *utesting.T) { conn, err := s.dial() if err != nil { t.Fatalf("dial failed: %v", err) @@ -460,9 +460,9 @@ func (s *Suite) TestGetBlockBodies66(t *utesting.T) { } } -// TestBroadcast tests whether a block announcement is correctly +// TestBroadcast65 tests whether a block announcement is correctly // propagated to the given node's peer(s). -func (s *Suite) TestBroadcast(t *utesting.T) { +func (s *Suite) TestBroadcast65(t *utesting.T) { if err := s.sendNextBlock(eth65); err != nil { t.Fatalf("block broadcast failed: %v", err) } @@ -476,8 +476,8 @@ func (s *Suite) TestBroadcast66(t *utesting.T) { } } -// TestLargeAnnounce tests the announcement mechanism with a large block. -func (s *Suite) TestLargeAnnounce(t *utesting.T) { +// TestLargeAnnounce65 tests the announcement mechanism with a large block. +func (s *Suite) TestLargeAnnounce65(t *utesting.T) { nextBlock := len(s.chain.blocks) blocks := []*NewBlock{ { @@ -569,8 +569,8 @@ func (s *Suite) TestLargeAnnounce66(t *utesting.T) { } } -// TestOldAnnounce tests the announcement mechanism with an old block. -func (s *Suite) TestOldAnnounce(t *utesting.T) { +// TestOldAnnounce65 tests the announcement mechanism with an old block. +func (s *Suite) TestOldAnnounce65(t *utesting.T) { if err := s.oldAnnounce(eth65); err != nil { t.Fatal(err) } @@ -584,9 +584,9 @@ func (s *Suite) TestOldAnnounce66(t *utesting.T) { } } -// TestBlockHashAnnounce sends a new block hash announcement and expects +// TestBlockHashAnnounce65 sends a new block hash announcement and expects // the node to perform a `GetBlockHeaders` request. -func (s *Suite) TestBlockHashAnnounce(t *utesting.T) { +func (s *Suite) TestBlockHashAnnounce65(t *utesting.T) { if err := s.hashAnnounce(eth65); err != nil { t.Fatalf("block hash announcement failed: %v", err) } @@ -600,8 +600,8 @@ func (s *Suite) TestBlockHashAnnounce66(t *utesting.T) { } } -// TestMaliciousHandshake tries to send malicious data during the handshake. -func (s *Suite) TestMaliciousHandshake(t *utesting.T) { +// TestMaliciousHandshake65 tries to send malicious data during the handshake. +func (s *Suite) TestMaliciousHandshake65(t *utesting.T) { if err := s.maliciousHandshakes(t, eth65); err != nil { t.Fatal(err) } @@ -614,8 +614,8 @@ func (s *Suite) TestMaliciousHandshake66(t *utesting.T) { } } -// TestMaliciousStatus sends a status package with a large total difficulty. -func (s *Suite) TestMaliciousStatus(t *utesting.T) { +// TestMaliciousStatus65 sends a status package with a large total difficulty. +func (s *Suite) TestMaliciousStatus65(t *utesting.T) { conn, err := s.dial() if err != nil { t.Fatalf("dial failed: %v", err) @@ -641,9 +641,9 @@ func (s *Suite) TestMaliciousStatus66(t *utesting.T) { } } -// TestTransaction sends a valid transaction to the node and +// TestTransaction65 sends a valid transaction to the node and // checks if the transaction gets propagated. -func (s *Suite) TestTransaction(t *utesting.T) { +func (s *Suite) TestTransaction65(t *utesting.T) { if err := s.sendSuccessfulTxs(t, eth65); err != nil { t.Fatal(err) } @@ -657,9 +657,9 @@ func (s *Suite) TestTransaction66(t *utesting.T) { } } -// TestMaliciousTx sends several invalid transactions and tests whether +// TestMaliciousTx65 sends several invalid transactions and tests whether // the node will propagate them. -func (s *Suite) TestMaliciousTx(t *utesting.T) { +func (s *Suite) TestMaliciousTx65(t *utesting.T) { if err := s.sendMaliciousTxs(t, eth65); err != nil { t.Fatal(err) } diff --git a/cmd/devp2p/internal/v4test/discv4tests.go b/cmd/devp2p/internal/v4test/discv4tests.go index 04ad67637a..5f340ed94c 100644 --- a/cmd/devp2p/internal/v4test/discv4tests.go +++ b/cmd/devp2p/internal/v4test/discv4tests.go @@ -229,7 +229,7 @@ func PingPastExpiration(t *utesting.T) { reply, _, _ := te.read(te.l1) if reply != nil { - t.Fatal("Expected no reply, got", reply) + t.Fatalf("Expected no reply, got %v %v", reply.Name(), reply) } } @@ -247,7 +247,7 @@ func WrongPacketType(t *utesting.T) { reply, _, _ := te.read(te.l1) if reply != nil { - t.Fatal("Expected no reply, got", reply) + t.Fatalf("Expected no reply, got %v %v", reply.Name(), reply) } } @@ -282,9 +282,16 @@ func FindnodeWithoutEndpointProof(t *utesting.T) { rand.Read(req.Target[:]) te.send(te.l1, &req) - reply, _, _ := te.read(te.l1) - if reply != nil { - t.Fatal("Expected no response, got", reply) + for { + reply, _, _ := te.read(te.l1) + if reply == nil { + // No response, all good + break + } + if reply.Kind() == v4wire.PingPacket { + continue // A ping is ok, just ignore it + } + t.Fatalf("Expected no reply, got %v %v", reply.Name(), reply) } } @@ -304,7 +311,7 @@ func BasicFindnode(t *utesting.T) { t.Fatal("read find nodes", err) } if reply.Kind() != v4wire.NeighborsPacket { - t.Fatal("Expected neighbors, got", reply.Name()) + t.Fatalf("Expected neighbors, got %v %v", reply.Name(), reply) } } @@ -341,7 +348,7 @@ func UnsolicitedNeighbors(t *utesting.T) { t.Fatal("read find nodes", err) } if reply.Kind() != v4wire.NeighborsPacket { - t.Fatal("Expected neighbors, got", reply.Name()) + t.Fatalf("Expected neighbors, got %v %v", reply.Name(), reply) } nodes := reply.(*v4wire.Neighbors).Nodes if contains(nodes, encFakeKey) { diff --git a/cmd/devp2p/nodesetcmd.go b/cmd/devp2p/nodesetcmd.go index ae636f5caa..2269a44810 100644 --- a/cmd/devp2p/nodesetcmd.go +++ b/cmd/devp2p/nodesetcmd.go @@ -239,6 +239,8 @@ func ethFilter(args []string) (nodeFilter, error) { filter = forkid.NewStaticFilter(params.MumbaiChainConfig, params.MumbaiGenesisHash) case "bor-mainnet": filter = forkid.NewStaticFilter(params.BorMainnetChainConfig, params.BorMainnetGenesisHash) + case "sepolia": + filter = forkid.NewStaticFilter(params.SepoliaChainConfig, params.SepoliaGenesisHash) default: return nil, fmt.Errorf("unknown network %q", args[0]) } diff --git a/cmd/evm/internal/t8ntool/block.go b/cmd/evm/internal/t8ntool/block.go new file mode 100644 index 0000000000..d4edd33bde --- /dev/null +++ b/cmd/evm/internal/t8ntool/block.go @@ -0,0 +1,380 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package t8ntool + +import ( + "crypto/ecdsa" + "encoding/json" + "errors" + "fmt" + "math/big" + "os" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/clique" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" + "gopkg.in/urfave/cli.v1" +) + +//go:generate gencodec -type header -field-override headerMarshaling -out gen_header.go +type header struct { + ParentHash common.Hash `json:"parentHash"` + OmmerHash *common.Hash `json:"sha3Uncles"` + Coinbase *common.Address `json:"miner"` + Root common.Hash `json:"stateRoot" gencodec:"required"` + TxHash *common.Hash `json:"transactionsRoot"` + ReceiptHash *common.Hash `json:"receiptsRoot"` + Bloom types.Bloom `json:"logsBloom"` + Difficulty *big.Int `json:"difficulty"` + Number *big.Int `json:"number" gencodec:"required"` + GasLimit uint64 `json:"gasLimit" gencodec:"required"` + GasUsed uint64 `json:"gasUsed"` + Time uint64 `json:"timestamp" gencodec:"required"` + Extra []byte `json:"extraData"` + MixDigest common.Hash `json:"mixHash"` + Nonce *types.BlockNonce `json:"nonce"` + BaseFee *big.Int `json:"baseFeePerGas" rlp:"optional"` +} + +type headerMarshaling struct { + Difficulty *math.HexOrDecimal256 + Number *math.HexOrDecimal256 + GasLimit math.HexOrDecimal64 + GasUsed math.HexOrDecimal64 + Time math.HexOrDecimal64 + Extra hexutil.Bytes + BaseFee *math.HexOrDecimal256 +} + +type bbInput struct { + Header *header `json:"header,omitempty"` + OmmersRlp []string `json:"ommers,omitempty"` + TxRlp string `json:"txs,omitempty"` + Clique *cliqueInput `json:"clique,omitempty"` + + Ethash bool `json:"-"` + EthashDir string `json:"-"` + PowMode ethash.Mode `json:"-"` + Txs []*types.Transaction `json:"-"` + Ommers []*types.Header `json:"-"` +} + +type cliqueInput struct { + Key *ecdsa.PrivateKey + Voted *common.Address + Authorize *bool + Vanity common.Hash +} + +// UnmarshalJSON implements json.Unmarshaler interface. +func (c *cliqueInput) UnmarshalJSON(input []byte) error { + var x struct { + Key *common.Hash `json:"secretKey"` + Voted *common.Address `json:"voted"` + Authorize *bool `json:"authorize"` + Vanity common.Hash `json:"vanity"` + } + if err := json.Unmarshal(input, &x); err != nil { + return err + } + if x.Key == nil { + return errors.New("missing required field 'secretKey' for cliqueInput") + } + if ecdsaKey, err := crypto.ToECDSA(x.Key[:]); err != nil { + return err + } else { + c.Key = ecdsaKey + } + c.Voted = x.Voted + c.Authorize = x.Authorize + c.Vanity = x.Vanity + return nil +} + +// ToBlock converts i into a *types.Block +func (i *bbInput) ToBlock() *types.Block { + header := &types.Header{ + ParentHash: i.Header.ParentHash, + UncleHash: types.EmptyUncleHash, + Coinbase: common.Address{}, + Root: i.Header.Root, + TxHash: types.EmptyRootHash, + ReceiptHash: types.EmptyRootHash, + Bloom: i.Header.Bloom, + Difficulty: common.Big0, + Number: i.Header.Number, + GasLimit: i.Header.GasLimit, + GasUsed: i.Header.GasUsed, + Time: i.Header.Time, + Extra: i.Header.Extra, + MixDigest: i.Header.MixDigest, + BaseFee: i.Header.BaseFee, + } + + // Fill optional values. + if i.Header.OmmerHash != nil { + header.UncleHash = *i.Header.OmmerHash + } else if len(i.Ommers) != 0 { + // Calculate the ommer hash if none is provided and there are ommers to hash + header.UncleHash = types.CalcUncleHash(i.Ommers) + } + if i.Header.Coinbase != nil { + header.Coinbase = *i.Header.Coinbase + } + if i.Header.TxHash != nil { + header.TxHash = *i.Header.TxHash + } + if i.Header.ReceiptHash != nil { + header.ReceiptHash = *i.Header.ReceiptHash + } + if i.Header.Nonce != nil { + header.Nonce = *i.Header.Nonce + } + if header.Difficulty != nil { + header.Difficulty = i.Header.Difficulty + } + return types.NewBlockWithHeader(header).WithBody(i.Txs, i.Ommers) +} + +// SealBlock seals the given block using the configured engine. +func (i *bbInput) SealBlock(block *types.Block) (*types.Block, error) { + switch { + case i.Ethash: + return i.sealEthash(block) + case i.Clique != nil: + return i.sealClique(block) + default: + return block, nil + } +} + +// sealEthash seals the given block using ethash. +func (i *bbInput) sealEthash(block *types.Block) (*types.Block, error) { + if i.Header.Nonce != nil { + return nil, NewError(ErrorConfig, fmt.Errorf("sealing with ethash will overwrite provided nonce")) + } + ethashConfig := ethash.Config{ + PowMode: i.PowMode, + DatasetDir: i.EthashDir, + CacheDir: i.EthashDir, + DatasetsInMem: 1, + DatasetsOnDisk: 2, + CachesInMem: 2, + CachesOnDisk: 3, + } + engine := ethash.New(ethashConfig, nil, true) + defer engine.Close() + // Use a buffered chan for results. + // If the testmode is used, the sealer will return quickly, and complain + // "Sealing result is not read by miner" if it cannot write the result. + results := make(chan *types.Block, 1) + if err := engine.Seal(nil, block, results, nil); err != nil { + panic(fmt.Sprintf("failed to seal block: %v", err)) + } + found := <-results + return block.WithSeal(found.Header()), nil +} + +// sealClique seals the given block using clique. +func (i *bbInput) sealClique(block *types.Block) (*types.Block, error) { + // If any clique value overwrites an explicit header value, fail + // to avoid silently building a block with unexpected values. + if i.Header.Extra != nil { + return nil, NewError(ErrorConfig, fmt.Errorf("sealing with clique will overwrite provided extra data")) + } + header := block.Header() + if i.Clique.Voted != nil { + if i.Header.Coinbase != nil { + return nil, NewError(ErrorConfig, fmt.Errorf("sealing with clique and voting will overwrite provided coinbase")) + } + header.Coinbase = *i.Clique.Voted + } + if i.Clique.Authorize != nil { + if i.Header.Nonce != nil { + return nil, NewError(ErrorConfig, fmt.Errorf("sealing with clique and voting will overwrite provided nonce")) + } + if *i.Clique.Authorize { + header.Nonce = [8]byte{} + } else { + header.Nonce = [8]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + } + } + // Extra is fixed 32 byte vanity and 65 byte signature + header.Extra = make([]byte, 32+65) + copy(header.Extra[0:32], i.Clique.Vanity.Bytes()[:]) + + // Sign the seal hash and fill in the rest of the extra data + h := clique.SealHash(header) + sighash, err := crypto.Sign(h[:], i.Clique.Key) + if err != nil { + return nil, err + } + copy(header.Extra[32:], sighash) + block = block.WithSeal(header) + return block, nil +} + +// BuildBlock constructs a block from the given inputs. +func BuildBlock(ctx *cli.Context) error { + // Configure the go-ethereum logger + glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) + glogger.Verbosity(log.Lvl(ctx.Int(VerbosityFlag.Name))) + log.Root().SetHandler(glogger) + + baseDir, err := createBasedir(ctx) + if err != nil { + return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err)) + } + inputData, err := readInput(ctx) + if err != nil { + return err + } + block := inputData.ToBlock() + block, err = inputData.SealBlock(block) + if err != nil { + return err + } + return dispatchBlock(ctx, baseDir, block) +} + +func readInput(ctx *cli.Context) (*bbInput, error) { + var ( + headerStr = ctx.String(InputHeaderFlag.Name) + ommersStr = ctx.String(InputOmmersFlag.Name) + txsStr = ctx.String(InputTxsRlpFlag.Name) + cliqueStr = ctx.String(SealCliqueFlag.Name) + ethashOn = ctx.Bool(SealEthashFlag.Name) + ethashDir = ctx.String(SealEthashDirFlag.Name) + ethashMode = ctx.String(SealEthashModeFlag.Name) + inputData = &bbInput{} + ) + if ethashOn && cliqueStr != "" { + return nil, NewError(ErrorConfig, fmt.Errorf("both ethash and clique sealing specified, only one may be chosen")) + } + if ethashOn { + inputData.Ethash = ethashOn + inputData.EthashDir = ethashDir + switch ethashMode { + case "normal": + inputData.PowMode = ethash.ModeNormal + case "test": + inputData.PowMode = ethash.ModeTest + case "fake": + inputData.PowMode = ethash.ModeFake + default: + return nil, NewError(ErrorConfig, fmt.Errorf("unknown pow mode: %s, supported modes: test, fake, normal", ethashMode)) + } + } + if headerStr == stdinSelector || ommersStr == stdinSelector || txsStr == stdinSelector || cliqueStr == stdinSelector { + decoder := json.NewDecoder(os.Stdin) + if err := decoder.Decode(inputData); err != nil { + return nil, NewError(ErrorJson, fmt.Errorf("failed unmarshaling stdin: %v", err)) + } + } + if cliqueStr != stdinSelector && cliqueStr != "" { + var clique cliqueInput + if err := readFile(cliqueStr, "clique", &clique); err != nil { + return nil, err + } + inputData.Clique = &clique + } + if headerStr != stdinSelector { + var env header + if err := readFile(headerStr, "header", &env); err != nil { + return nil, err + } + inputData.Header = &env + } + if ommersStr != stdinSelector && ommersStr != "" { + var ommers []string + if err := readFile(ommersStr, "ommers", &ommers); err != nil { + return nil, err + } + inputData.OmmersRlp = ommers + } + if txsStr != stdinSelector { + var txs string + if err := readFile(txsStr, "txs", &txs); err != nil { + return nil, err + } + inputData.TxRlp = txs + } + // Deserialize rlp txs and ommers + var ( + ommers = []*types.Header{} + txs = []*types.Transaction{} + ) + if inputData.TxRlp != "" { + if err := rlp.DecodeBytes(common.FromHex(inputData.TxRlp), &txs); err != nil { + return nil, NewError(ErrorRlp, fmt.Errorf("unable to decode transaction from rlp data: %v", err)) + } + inputData.Txs = txs + } + for _, str := range inputData.OmmersRlp { + type extblock struct { + Header *types.Header + Txs []*types.Transaction + Ommers []*types.Header + } + var ommer *extblock + if err := rlp.DecodeBytes(common.FromHex(str), &ommer); err != nil { + return nil, NewError(ErrorRlp, fmt.Errorf("unable to decode ommer from rlp data: %v", err)) + } + ommers = append(ommers, ommer.Header) + } + inputData.Ommers = ommers + + return inputData, nil +} + +// dispatchOutput writes the output data to either stderr or stdout, or to the specified +// files +func dispatchBlock(ctx *cli.Context, baseDir string, block *types.Block) error { + raw, _ := rlp.EncodeToBytes(block) + + type blockInfo struct { + Rlp hexutil.Bytes `json:"rlp"` + Hash common.Hash `json:"hash"` + } + var enc blockInfo + enc.Rlp = raw + enc.Hash = block.Hash() + + b, err := json.MarshalIndent(enc, "", " ") + if err != nil { + return NewError(ErrorJson, fmt.Errorf("failed marshalling output: %v", err)) + } + switch dest := ctx.String(OutputBlockFlag.Name); dest { + case "stdout": + os.Stdout.Write(b) + os.Stdout.WriteString("\n") + case "stderr": + os.Stderr.Write(b) + os.Stderr.WriteString("\n") + default: + if err := saveFile(baseDir, dest, enc); err != nil { + return err + } + } + return nil +} diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index fae65767be..dfdde42173 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -49,12 +49,13 @@ type Prestate struct { type ExecutionResult struct { StateRoot common.Hash `json:"stateRoot"` TxRoot common.Hash `json:"txRoot"` - ReceiptRoot common.Hash `json:"receiptRoot"` + ReceiptRoot common.Hash `json:"receiptsRoot"` LogsHash common.Hash `json:"logsHash"` Bloom types.Bloom `json:"logsBloom" gencodec:"required"` Receipts types.Receipts `json:"receipts"` Rejected []*rejectedTx `json:"rejected,omitempty"` Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"required"` + GasUsed math.HexOrDecimal64 `json:"gasUsed"` } type ommer struct { @@ -96,7 +97,7 @@ type rejectedTx struct { // Apply applies a set of transactions to a pre-state func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, txs types.Transactions, miningReward int64, - getTracerFn func(txIndex int, txHash common.Hash) (tracer vm.Tracer, err error)) (*state.StateDB, *ExecutionResult, error) { + getTracerFn func(txIndex int, txHash common.Hash) (tracer vm.EVMLogger, err error)) (*state.StateDB, *ExecutionResult, error) { // Capture errors for BLOCKHASH operation, if we haven't been supplied the // required blockhashes @@ -255,6 +256,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, Receipts: receipts, Rejected: rejectedTxs, Difficulty: (*math.HexOrDecimal256)(vmContext.Difficulty), + GasUsed: (math.HexOrDecimal64)(gasUsed), } return statedb, execRs, nil } diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go index 05b6ed1647..b6054ea562 100644 --- a/cmd/evm/internal/t8ntool/flags.go +++ b/cmd/evm/internal/t8ntool/flags.go @@ -32,7 +32,11 @@ var ( } TraceDisableMemoryFlag = cli.BoolTFlag{ Name: "trace.nomemory", - Usage: "Disable full memory dump in traces", + Usage: "Disable full memory dump in traces (deprecated)", + } + TraceEnableMemoryFlag = cli.BoolFlag{ + Name: "trace.memory", + Usage: "Enable full memory dump in traces", } TraceDisableStackFlag = cli.BoolFlag{ Name: "trace.nostack", @@ -40,7 +44,11 @@ var ( } TraceDisableReturnDataFlag = cli.BoolTFlag{ Name: "trace.noreturndata", - Usage: "Disable return data output in traces", + Usage: "Disable return data output in traces (deprecated)", + } + TraceEnableReturnDataFlag = cli.BoolFlag{ + Name: "trace.returndata", + Usage: "Enable return data output in traces", } OutputBasedir = cli.StringFlag{ Name: "output.basedir", @@ -68,6 +76,14 @@ var ( "\t - into the file ", Value: "result.json", } + OutputBlockFlag = cli.StringFlag{ + Name: "output.block", + Usage: "Determines where to put the `block` after building.\n" + + "\t`stdout` - into the stdout output\n" + + "\t`stderr` - into the stderr output\n" + + "\t - into the file ", + Value: "block.json", + } InputAllocFlag = cli.StringFlag{ Name: "input.alloc", Usage: "`stdin` or file name of where to find the prestate alloc to use.", @@ -81,10 +97,41 @@ var ( InputTxsFlag = cli.StringFlag{ Name: "input.txs", Usage: "`stdin` or file name of where to find the transactions to apply. " + - "If the file prefix is '.rlp', then the data is interpreted as an RLP list of signed transactions." + + "If the file extension is '.rlp', then the data is interpreted as an RLP list of signed transactions." + "The '.rlp' format is identical to the output.body format.", Value: "txs.json", } + InputHeaderFlag = cli.StringFlag{ + Name: "input.header", + Usage: "`stdin` or file name of where to find the block header to use.", + Value: "header.json", + } + InputOmmersFlag = cli.StringFlag{ + Name: "input.ommers", + Usage: "`stdin` or file name of where to find the list of ommer header RLPs to use.", + } + InputTxsRlpFlag = cli.StringFlag{ + Name: "input.txs", + Usage: "`stdin` or file name of where to find the transactions list in RLP form.", + Value: "txs.rlp", + } + SealCliqueFlag = cli.StringFlag{ + Name: "seal.clique", + Usage: "Seal block with Clique. `stdin` or file name of where to find the Clique sealing data.", + } + SealEthashFlag = cli.BoolFlag{ + Name: "seal.ethash", + Usage: "Seal block with ethash.", + } + SealEthashDirFlag = cli.StringFlag{ + Name: "seal.ethash.dir", + Usage: "Path to ethash DAG. If none exists, a new DAG will be generated.", + } + SealEthashModeFlag = cli.StringFlag{ + Name: "seal.ethash.mode", + Usage: "Defines the type and amount of PoW verification an ethash engine makes.", + Value: "normal", + } RewardFlag = cli.Int64Flag{ Name: "state.reward", Usage: "Mining reward. Set to -1 to disable", diff --git a/cmd/evm/internal/t8ntool/gen_header.go b/cmd/evm/internal/t8ntool/gen_header.go new file mode 100644 index 0000000000..196e49dd71 --- /dev/null +++ b/cmd/evm/internal/t8ntool/gen_header.go @@ -0,0 +1,135 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package t8ntool + +import ( + "encoding/json" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" +) + +var _ = (*headerMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (h header) MarshalJSON() ([]byte, error) { + type header struct { + ParentHash common.Hash `json:"parentHash"` + OmmerHash *common.Hash `json:"sha3Uncles"` + Coinbase *common.Address `json:"miner"` + Root common.Hash `json:"stateRoot" gencodec:"required"` + TxHash *common.Hash `json:"transactionsRoot"` + ReceiptHash *common.Hash `json:"receiptsRoot"` + Bloom types.Bloom `json:"logsBloom"` + Difficulty *math.HexOrDecimal256 `json:"difficulty"` + Number *math.HexOrDecimal256 `json:"number" gencodec:"required"` + GasLimit math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"` + GasUsed math.HexOrDecimal64 `json:"gasUsed"` + Time math.HexOrDecimal64 `json:"timestamp" gencodec:"required"` + Extra hexutil.Bytes `json:"extraData"` + MixDigest common.Hash `json:"mixHash"` + Nonce *types.BlockNonce `json:"nonce"` + BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas" rlp:"optional"` + } + var enc header + enc.ParentHash = h.ParentHash + enc.OmmerHash = h.OmmerHash + enc.Coinbase = h.Coinbase + enc.Root = h.Root + enc.TxHash = h.TxHash + enc.ReceiptHash = h.ReceiptHash + enc.Bloom = h.Bloom + enc.Difficulty = (*math.HexOrDecimal256)(h.Difficulty) + enc.Number = (*math.HexOrDecimal256)(h.Number) + enc.GasLimit = math.HexOrDecimal64(h.GasLimit) + enc.GasUsed = math.HexOrDecimal64(h.GasUsed) + enc.Time = math.HexOrDecimal64(h.Time) + enc.Extra = h.Extra + enc.MixDigest = h.MixDigest + enc.Nonce = h.Nonce + enc.BaseFee = (*math.HexOrDecimal256)(h.BaseFee) + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (h *header) UnmarshalJSON(input []byte) error { + type header struct { + ParentHash *common.Hash `json:"parentHash"` + OmmerHash *common.Hash `json:"sha3Uncles"` + Coinbase *common.Address `json:"miner"` + Root *common.Hash `json:"stateRoot" gencodec:"required"` + TxHash *common.Hash `json:"transactionsRoot"` + ReceiptHash *common.Hash `json:"receiptsRoot"` + Bloom *types.Bloom `json:"logsBloom"` + Difficulty *math.HexOrDecimal256 `json:"difficulty"` + Number *math.HexOrDecimal256 `json:"number" gencodec:"required"` + GasLimit *math.HexOrDecimal64 `json:"gasLimit" gencodec:"required"` + GasUsed *math.HexOrDecimal64 `json:"gasUsed"` + Time *math.HexOrDecimal64 `json:"timestamp" gencodec:"required"` + Extra *hexutil.Bytes `json:"extraData"` + MixDigest *common.Hash `json:"mixHash"` + Nonce *types.BlockNonce `json:"nonce"` + BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas" rlp:"optional"` + } + var dec header + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.ParentHash != nil { + h.ParentHash = *dec.ParentHash + } + if dec.OmmerHash != nil { + h.OmmerHash = dec.OmmerHash + } + if dec.Coinbase != nil { + h.Coinbase = dec.Coinbase + } + if dec.Root == nil { + return errors.New("missing required field 'stateRoot' for header") + } + h.Root = *dec.Root + if dec.TxHash != nil { + h.TxHash = dec.TxHash + } + if dec.ReceiptHash != nil { + h.ReceiptHash = dec.ReceiptHash + } + if dec.Bloom != nil { + h.Bloom = *dec.Bloom + } + if dec.Difficulty != nil { + h.Difficulty = (*big.Int)(dec.Difficulty) + } + if dec.Number == nil { + return errors.New("missing required field 'number' for header") + } + h.Number = (*big.Int)(dec.Number) + if dec.GasLimit == nil { + return errors.New("missing required field 'gasLimit' for header") + } + h.GasLimit = uint64(*dec.GasLimit) + if dec.GasUsed != nil { + h.GasUsed = uint64(*dec.GasUsed) + } + if dec.Time == nil { + return errors.New("missing required field 'timestamp' for header") + } + h.Time = uint64(*dec.Time) + if dec.Extra != nil { + h.Extra = *dec.Extra + } + if dec.MixDigest != nil { + h.MixDigest = *dec.MixDigest + } + if dec.Nonce != nil { + h.Nonce = dec.Nonce + } + if dec.BaseFee != nil { + h.BaseFee = (*big.Int)(dec.BaseFee) + } + return nil +} diff --git a/cmd/evm/internal/t8ntool/transaction.go b/cmd/evm/internal/t8ntool/transaction.go index b89ca9be92..6f1c964ada 100644 --- a/cmd/evm/internal/t8ntool/transaction.go +++ b/cmd/evm/internal/t8ntool/transaction.go @@ -36,17 +36,19 @@ import ( ) type result struct { - Error error - Address common.Address - Hash common.Hash + Error error + Address common.Address + Hash common.Hash + IntrinsicGas uint64 } // MarshalJSON marshals as JSON with a hash. func (r *result) MarshalJSON() ([]byte, error) { type xx struct { - Error string `json:"error,omitempty"` - Address *common.Address `json:"address,omitempty"` - Hash *common.Hash `json:"hash,omitempty"` + Error string `json:"error,omitempty"` + Address *common.Address `json:"address,omitempty"` + Hash *common.Hash `json:"hash,omitempty"` + IntrinsicGas hexutil.Uint64 `json:"intrinsicGas,omitempty"` } var out xx if r.Error != nil { @@ -58,6 +60,7 @@ func (r *result) MarshalJSON() ([]byte, error) { if r.Hash != (common.Hash{}) { out.Hash = &r.Hash } + out.IntrinsicGas = hexutil.Uint64(r.IntrinsicGas) return json.Marshal(out) } @@ -79,7 +82,7 @@ func Transaction(ctx *cli.Context) error { ) // Construct the chainconfig if cConf, _, err := tests.GetChainConfig(ctx.String(ForknameFlag.Name)); err != nil { - return NewError(ErrorVMConfig, fmt.Errorf("failed constructing chain configuration: %v", err)) + return NewError(ErrorConfig, fmt.Errorf("failed constructing chain configuration: %v", err)) } else { chainConfig = cConf } @@ -118,6 +121,9 @@ func Transaction(ctx *cli.Context) error { } var results []result for it.Next() { + if err := it.Err(); err != nil { + return NewError(ErrorIO, err) + } var tx types.Transaction err := rlp.DecodeBytes(it.Value(), &tx) if err != nil { @@ -132,12 +138,38 @@ func Transaction(ctx *cli.Context) error { } else { r.Address = sender } - + // Check intrinsic gas if gas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.To() == nil, chainConfig.IsHomestead(new(big.Int)), chainConfig.IsIstanbul(new(big.Int))); err != nil { r.Error = err - } else if tx.Gas() < gas { - r.Error = fmt.Errorf("%w: have %d, want %d", core.ErrIntrinsicGas, tx.Gas(), gas) + results = append(results, r) + continue + } else { + r.IntrinsicGas = gas + if tx.Gas() < gas { + r.Error = fmt.Errorf("%w: have %d, want %d", core.ErrIntrinsicGas, tx.Gas(), gas) + results = append(results, r) + continue + } + } + // Validate <256bit fields + switch { + case tx.Nonce()+1 < tx.Nonce(): + r.Error = errors.New("nonce exceeds 2^64-1") + case tx.Value().BitLen() > 256: + r.Error = errors.New("value exceeds 256 bits") + case tx.GasPrice().BitLen() > 256: + r.Error = errors.New("gasPrice exceeds 256 bits") + case tx.GasTipCap().BitLen() > 256: + r.Error = errors.New("maxPriorityFeePerGas exceeds 256 bits") + case tx.GasFeeCap().BitLen() > 256: + r.Error = errors.New("maxFeePerGas exceeds 256 bits") + case tx.GasFeeCap().Cmp(tx.GasTipCap()) < 0: + r.Error = errors.New("maxFeePerGas < maxPriorityFeePerGas") + case new(big.Int).Mul(tx.GasPrice(), new(big.Int).SetUint64(tx.Gas())).BitLen() > 256: + r.Error = errors.New("gas * gasPrice exceeds 256 bits") + case new(big.Int).Mul(tx.GasFeeCap(), new(big.Int).SetUint64(tx.Gas())).BitLen() > 256: + r.Error = errors.New("gas * maxFeePerGas exceeds 256 bits") } results = append(results, r) } diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 88a9c5e622..11d71e4ce5 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -34,6 +34,7 @@ import ( "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/eth/tracers/logger" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" @@ -43,11 +44,12 @@ import ( const ( ErrorEVM = 2 - ErrorVMConfig = 3 + ErrorConfig = 3 ErrorMissingBlockhash = 4 ErrorJson = 10 ErrorIO = 11 + ErrorRlp = 12 stdinSelector = "stdin" ) @@ -88,28 +90,33 @@ func Transition(ctx *cli.Context) error { log.Root().SetHandler(glogger) var ( - err error - tracer vm.Tracer - baseDir = "" + err error + tracer vm.EVMLogger ) - var getTracer func(txIndex int, txHash common.Hash) (vm.Tracer, error) + var getTracer func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) - // If user specified a basedir, make sure it exists - if ctx.IsSet(OutputBasedir.Name) { - if base := ctx.String(OutputBasedir.Name); len(base) > 0 { - err := os.MkdirAll(base, 0755) // //rw-r--r-- - if err != nil { - return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err)) - } - baseDir = base - } + baseDir, err := createBasedir(ctx) + if err != nil { + return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err)) } if ctx.Bool(TraceFlag.Name) { + if ctx.IsSet(TraceDisableMemoryFlag.Name) && ctx.IsSet(TraceEnableMemoryFlag.Name) { + return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name)) + } + if ctx.IsSet(TraceDisableReturnDataFlag.Name) && ctx.IsSet(TraceEnableReturnDataFlag.Name) { + return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name)) + } + if ctx.IsSet(TraceDisableMemoryFlag.Name) { + log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name)) + } + if ctx.IsSet(TraceDisableReturnDataFlag.Name) { + log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name)) + } // Configure the EVM logger - logConfig := &vm.LogConfig{ + logConfig := &logger.Config{ DisableStack: ctx.Bool(TraceDisableStackFlag.Name), - EnableMemory: !ctx.Bool(TraceDisableMemoryFlag.Name), - EnableReturnData: !ctx.Bool(TraceDisableReturnDataFlag.Name), + EnableMemory: !ctx.Bool(TraceDisableMemoryFlag.Name) || ctx.Bool(TraceEnableMemoryFlag.Name), + EnableReturnData: !ctx.Bool(TraceDisableReturnDataFlag.Name) || ctx.Bool(TraceEnableReturnDataFlag.Name), Debug: true, } var prevFile *os.File @@ -119,7 +126,7 @@ func Transition(ctx *cli.Context) error { prevFile.Close() } }() - getTracer = func(txIndex int, txHash common.Hash) (vm.Tracer, error) { + getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { if prevFile != nil { prevFile.Close() } @@ -128,10 +135,10 @@ func Transition(ctx *cli.Context) error { return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err)) } prevFile = traceFile - return vm.NewJSONLogger(logConfig, traceFile), nil + return logger.NewJSONLogger(logConfig, traceFile), nil } } else { - getTracer = func(txIndex int, txHash common.Hash) (tracer vm.Tracer, err error) { + getTracer = func(txIndex int, txHash common.Hash) (tracer vm.EVMLogger, err error) { return nil, nil } } @@ -155,29 +162,17 @@ func Transition(ctx *cli.Context) error { } } if allocStr != stdinSelector { - inFile, err := os.Open(allocStr) - if err != nil { - return NewError(ErrorIO, fmt.Errorf("failed reading alloc file: %v", err)) - } - defer inFile.Close() - decoder := json.NewDecoder(inFile) - if err := decoder.Decode(&inputData.Alloc); err != nil { - return NewError(ErrorJson, fmt.Errorf("failed unmarshaling alloc-file: %v", err)) + if err := readFile(allocStr, "alloc", &inputData.Alloc); err != nil { + return err } } prestate.Pre = inputData.Alloc // Set the block environment if envStr != stdinSelector { - inFile, err := os.Open(envStr) - if err != nil { - return NewError(ErrorIO, fmt.Errorf("failed reading env file: %v", err)) - } - defer inFile.Close() - decoder := json.NewDecoder(inFile) var env stEnv - if err := decoder.Decode(&env); err != nil { - return NewError(ErrorJson, fmt.Errorf("failed unmarshaling env-file: %v", err)) + if err := readFile(envStr, "env", &env); err != nil { + return err } inputData.Env = &env } @@ -190,7 +185,7 @@ func Transition(ctx *cli.Context) error { // Construct the chainconfig var chainConfig *params.ChainConfig if cConf, extraEips, err := tests.GetChainConfig(ctx.String(ForknameFlag.Name)); err != nil { - return NewError(ErrorVMConfig, fmt.Errorf("failed constructing chain configuration: %v", err)) + return NewError(ErrorConfig, fmt.Errorf("failed constructing chain configuration: %v", err)) } else { chainConfig = cConf vmConfig.ExtraEips = extraEips @@ -254,18 +249,18 @@ func Transition(ctx *cli.Context) error { // Sanity check, to not `panic` in state_transition if chainConfig.IsLondon(big.NewInt(int64(prestate.Env.Number))) { if prestate.Env.BaseFee == nil { - return NewError(ErrorVMConfig, errors.New("EIP-1559 config but missing 'currentBaseFee' in env section")) + return NewError(ErrorConfig, errors.New("EIP-1559 config but missing 'currentBaseFee' in env section")) } } if env := prestate.Env; env.Difficulty == nil { // If difficulty was not provided by caller, we need to calculate it. switch { case env.ParentDifficulty == nil: - return NewError(ErrorVMConfig, errors.New("currentDifficulty was not provided, and cannot be calculated due to missing parentDifficulty")) + return NewError(ErrorConfig, errors.New("currentDifficulty was not provided, and cannot be calculated due to missing parentDifficulty")) case env.Number == 0: - return NewError(ErrorVMConfig, errors.New("currentDifficulty needs to be provided for block number 0")) + return NewError(ErrorConfig, errors.New("currentDifficulty needs to be provided for block number 0")) case env.Timestamp <= env.ParentTimestamp: - return NewError(ErrorVMConfig, fmt.Errorf("currentDifficulty cannot be calculated -- currentTime (%d) needs to be after parent time (%d)", + return NewError(ErrorConfig, fmt.Errorf("currentDifficulty cannot be calculated -- currentTime (%d) needs to be after parent time (%d)", env.Timestamp, env.ParentTimestamp)) } prestate.Env.Difficulty = calcDifficulty(chainConfig, env.Number, env.Timestamp, @@ -286,27 +281,34 @@ func Transition(ctx *cli.Context) error { // txWithKey is a helper-struct, to allow us to use the types.Transaction along with // a `secretKey`-field, for input type txWithKey struct { - key *ecdsa.PrivateKey - tx *types.Transaction + key *ecdsa.PrivateKey + tx *types.Transaction + protected bool } func (t *txWithKey) UnmarshalJSON(input []byte) error { - // Read the secretKey, if present - type sKey struct { - Key *common.Hash `json:"secretKey"` + // Read the metadata, if present + type txMetadata struct { + Key *common.Hash `json:"secretKey"` + Protected *bool `json:"protected"` } - var key sKey - if err := json.Unmarshal(input, &key); err != nil { + var data txMetadata + if err := json.Unmarshal(input, &data); err != nil { return err } - if key.Key != nil { - k := key.Key.Hex()[2:] + if data.Key != nil { + k := data.Key.Hex()[2:] if ecdsaKey, err := crypto.HexToECDSA(k); err != nil { return err } else { t.key = ecdsaKey } } + if data.Protected != nil { + t.protected = *data.Protected + } else { + t.protected = true + } // Now, read the transaction itself var tx types.Transaction if err := json.Unmarshal(input, &tx); err != nil { @@ -335,7 +337,15 @@ func signUnsignedTransactions(txs []*txWithKey, signer types.Signer) (types.Tran v, r, s := tx.RawSignatureValues() if key != nil && v.BitLen()+r.BitLen()+s.BitLen() == 0 { // This transaction needs to be signed - signed, err := types.SignTx(tx, signer, key) + var ( + signed *types.Transaction + err error + ) + if txWithKey.protected { + signed, err = types.SignTx(tx, signer, key) + } else { + signed, err = types.SignTx(tx, types.FrontierSigner{}, key) + } if err != nil { return nil, NewError(ErrorJson, fmt.Errorf("tx %d: failed to sign tx: %v", i, err)) } diff --git a/cmd/evm/internal/t8ntool/utils.go b/cmd/evm/internal/t8ntool/utils.go new file mode 100644 index 0000000000..1c54f09bf4 --- /dev/null +++ b/cmd/evm/internal/t8ntool/utils.go @@ -0,0 +1,54 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see . + +package t8ntool + +import ( + "encoding/json" + "fmt" + "os" + + "gopkg.in/urfave/cli.v1" +) + +// readFile reads the json-data in the provided path and marshals into dest. +func readFile(path, desc string, dest interface{}) error { + inFile, err := os.Open(path) + if err != nil { + return NewError(ErrorIO, fmt.Errorf("failed reading %s file: %v", desc, err)) + } + defer inFile.Close() + decoder := json.NewDecoder(inFile) + if err := decoder.Decode(dest); err != nil { + return NewError(ErrorJson, fmt.Errorf("failed unmarshaling %s file: %v", desc, err)) + } + return nil +} + +// createBasedir makes sure the basedir exists, if user specified one. +func createBasedir(ctx *cli.Context) (string, error) { + baseDir := "" + if ctx.IsSet(OutputBasedir.Name) { + if base := ctx.String(OutputBasedir.Name); len(base) > 0 { + err := os.MkdirAll(base, 0755) // //rw-r--r-- + if err != nil { + return "", err + } + baseDir = base + } + } + return baseDir, nil +} diff --git a/cmd/evm/main.go b/cmd/evm/main.go index 26064efc3c..2f404d48e9 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -139,8 +139,10 @@ var stateTransitionCommand = cli.Command{ Flags: []cli.Flag{ t8ntool.TraceFlag, t8ntool.TraceDisableMemoryFlag, + t8ntool.TraceEnableMemoryFlag, t8ntool.TraceDisableStackFlag, t8ntool.TraceDisableReturnDataFlag, + t8ntool.TraceEnableReturnDataFlag, t8ntool.OutputBasedir, t8ntool.OutputAllocFlag, t8ntool.OutputResultFlag, @@ -167,6 +169,25 @@ var transactionCommand = cli.Command{ }, } +var blockBuilderCommand = cli.Command{ + Name: "block-builder", + Aliases: []string{"b11r"}, + Usage: "builds a block", + Action: t8ntool.BuildBlock, + Flags: []cli.Flag{ + t8ntool.OutputBasedir, + t8ntool.OutputBlockFlag, + t8ntool.InputHeaderFlag, + t8ntool.InputOmmersFlag, + t8ntool.InputTxsRlpFlag, + t8ntool.SealCliqueFlag, + t8ntool.SealEthashFlag, + t8ntool.SealEthashDirFlag, + t8ntool.SealEthashModeFlag, + t8ntool.VerbosityFlag, + }, +} + func init() { app.Flags = []cli.Flag{ BenchFlag, @@ -200,6 +221,7 @@ func init() { stateTestCommand, stateTransitionCommand, transactionCommand, + blockBuilderCommand, } cli.CommandHelpTemplate = flags.OriginCommandHelpTemplate } diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index cedbd22815..889de43e0a 100644 --- a/cmd/evm/runner.go +++ b/cmd/evm/runner.go @@ -36,6 +36,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/core/vm/runtime" + "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "gopkg.in/urfave/cli.v1" @@ -107,7 +108,7 @@ func runCmd(ctx *cli.Context) error { glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) glogger.Verbosity(log.Lvl(ctx.GlobalInt(VerbosityFlag.Name))) log.Root().SetHandler(glogger) - logconfig := &vm.LogConfig{ + logconfig := &logger.Config{ EnableMemory: !ctx.GlobalBool(DisableMemoryFlag.Name), DisableStack: ctx.GlobalBool(DisableStackFlag.Name), DisableStorage: ctx.GlobalBool(DisableStorageFlag.Name), @@ -116,8 +117,8 @@ func runCmd(ctx *cli.Context) error { } var ( - tracer vm.Tracer - debugLogger *vm.StructLogger + tracer vm.EVMLogger + debugLogger *logger.StructLogger statedb *state.StateDB chainConfig *params.ChainConfig sender = common.BytesToAddress([]byte("sender")) @@ -125,12 +126,12 @@ func runCmd(ctx *cli.Context) error { genesisConfig *core.Genesis ) if ctx.GlobalBool(MachineFlag.Name) { - tracer = vm.NewJSONLogger(logconfig, os.Stdout) + tracer = logger.NewJSONLogger(logconfig, os.Stdout) } else if ctx.GlobalBool(DebugFlag.Name) { - debugLogger = vm.NewStructLogger(logconfig) + debugLogger = logger.NewStructLogger(logconfig) tracer = debugLogger } else { - debugLogger = vm.NewStructLogger(logconfig) + debugLogger = logger.NewStructLogger(logconfig) } if ctx.GlobalString(GenesisFlag.Name) != "" { gen := readGenesis(ctx.GlobalString(GenesisFlag.Name)) @@ -288,10 +289,10 @@ func runCmd(ctx *cli.Context) error { if ctx.GlobalBool(DebugFlag.Name) { if debugLogger != nil { fmt.Fprintln(os.Stderr, "#### TRACE ####") - vm.WriteTrace(os.Stderr, debugLogger.StructLogs()) + logger.WriteTrace(os.Stderr, debugLogger.StructLogs()) } fmt.Fprintln(os.Stderr, "#### LOGS ####") - vm.WriteLogs(os.Stderr, statedb.Logs()) + logger.WriteLogs(os.Stderr, statedb.Logs()) } if bench || ctx.GlobalBool(StatDumpFlag.Name) { diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go index ab27046091..90596d9b3c 100644 --- a/cmd/evm/staterunner.go +++ b/cmd/evm/staterunner.go @@ -25,6 +25,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/tests" @@ -58,26 +59,26 @@ func stateTestCmd(ctx *cli.Context) error { log.Root().SetHandler(glogger) // Configure the EVM logger - config := &vm.LogConfig{ + config := &logger.Config{ EnableMemory: !ctx.GlobalBool(DisableMemoryFlag.Name), DisableStack: ctx.GlobalBool(DisableStackFlag.Name), DisableStorage: ctx.GlobalBool(DisableStorageFlag.Name), EnableReturnData: !ctx.GlobalBool(DisableReturnDataFlag.Name), } var ( - tracer vm.Tracer - debugger *vm.StructLogger + tracer vm.EVMLogger + debugger *logger.StructLogger ) switch { case ctx.GlobalBool(MachineFlag.Name): - tracer = vm.NewJSONLogger(config, os.Stderr) + tracer = logger.NewJSONLogger(config, os.Stderr) case ctx.GlobalBool(DebugFlag.Name): - debugger = vm.NewStructLogger(config) + debugger = logger.NewStructLogger(config) tracer = debugger default: - debugger = vm.NewStructLogger(config) + debugger = logger.NewStructLogger(config) } // Load the test content from the input file src, err := ioutil.ReadFile(ctx.Args().First()) @@ -118,7 +119,7 @@ func stateTestCmd(ctx *cli.Context) error { if ctx.GlobalBool(DebugFlag.Name) { if debugger != nil { fmt.Fprintln(os.Stderr, "#### TRACE ####") - vm.WriteTrace(os.Stderr, debugger.StructLogs()) + logger.WriteTrace(os.Stderr, debugger.StructLogs()) } } } diff --git a/cmd/evm/t8n_test.go b/cmd/evm/t8n_test.go index 325e0fac6e..3f0bd3185f 100644 --- a/cmd/evm/t8n_test.go +++ b/cmd/evm/t8n_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/docker/docker/pkg/reexec" + "github.com/ethereum/go-ethereum/cmd/evm/internal/t8ntool" "github.com/ethereum/go-ethereum/internal/cmdtest" ) @@ -130,7 +131,7 @@ func TestT8n(t *testing.T) { output: t8nOutput{alloc: true, result: true}, expExitCode: 4, }, - { // Ommer test + { // Uncle test base: "./testdata/5", input: t8nInput{ "alloc.json", "txs.json", "env.json", "Byzantium", "0x80", @@ -170,13 +171,53 @@ func TestT8n(t *testing.T) { output: t8nOutput{result: true}, expOut: "exp2.json", }, + { // Difficulty calculation - with ommers + Berlin + base: "./testdata/14", + input: t8nInput{ + "alloc.json", "txs.json", "env.uncles.json", "Berlin", "", + }, + output: t8nOutput{result: true}, + expOut: "exp_berlin.json", + }, + { // Difficulty calculation on arrow glacier + base: "./testdata/19", + input: t8nInput{ + "alloc.json", "txs.json", "env.json", "London", "", + }, + output: t8nOutput{result: true}, + expOut: "exp_london.json", + }, + { // Difficulty calculation on arrow glacier + base: "./testdata/19", + input: t8nInput{ + "alloc.json", "txs.json", "env.json", "ArrowGlacier", "", + }, + output: t8nOutput{result: true}, + expOut: "exp_arrowglacier.json", + }, + { // Sign unprotected (pre-EIP155) transaction + base: "./testdata/23", + input: t8nInput{ + "alloc.json", "txs.json", "env.json", "Berlin", "", + }, + output: t8nOutput{result: true}, + expOut: "exp.json", + }, } { args := []string{"t8n"} args = append(args, tc.output.get()...) args = append(args, tc.input.get(tc.base)...) + var qArgs []string // quoted args for debugging purposes + for _, arg := range args { + if len(arg) == 0 { + qArgs = append(qArgs, `""`) + } else { + qArgs = append(qArgs, arg) + } + } + tt.Logf("args: %v\n", strings.Join(qArgs, " ")) tt.Run("evm-test", args...) - tt.Logf("args: %v\n", strings.Join(args, " ")) // Compare the expected output, if provided if tc.expOut != "" { want, err := os.ReadFile(fmt.Sprintf("%v/%v", tc.base, tc.expOut)) @@ -257,6 +298,22 @@ func TestT9n(t *testing.T) { }, expOut: "exp.json", }, + { // Transactions with value exceeding 256 bits + base: "./testdata/17", + input: t9nInput{ + inTxs: "signed_txs.rlp", + stFork: "London", + }, + expOut: "exp.json", + }, + { // Invalid RLP + base: "./testdata/18", + input: t9nInput{ + inTxs: "invalid.rlp", + stFork: "London", + }, + expExitCode: t8ntool.ErrorIO, + }, } { args := []string{"t9n"} @@ -287,6 +344,126 @@ func TestT9n(t *testing.T) { } } +type b11rInput struct { + inEnv string + inOmmersRlp string + inTxsRlp string + inClique string + ethash bool + ethashMode string + ethashDir string +} + +func (args *b11rInput) get(base string) []string { + var out []string + if opt := args.inEnv; opt != "" { + out = append(out, "--input.header") + out = append(out, fmt.Sprintf("%v/%v", base, opt)) + } + if opt := args.inOmmersRlp; opt != "" { + out = append(out, "--input.ommers") + out = append(out, fmt.Sprintf("%v/%v", base, opt)) + } + if opt := args.inTxsRlp; opt != "" { + out = append(out, "--input.txs") + out = append(out, fmt.Sprintf("%v/%v", base, opt)) + } + if opt := args.inClique; opt != "" { + out = append(out, "--seal.clique") + out = append(out, fmt.Sprintf("%v/%v", base, opt)) + } + if args.ethash { + out = append(out, "--seal.ethash") + } + if opt := args.ethashMode; opt != "" { + out = append(out, "--seal.ethash.mode") + out = append(out, fmt.Sprintf("%v/%v", base, opt)) + } + if opt := args.ethashDir; opt != "" { + out = append(out, "--seal.ethash.dir") + out = append(out, fmt.Sprintf("%v/%v", base, opt)) + } + out = append(out, "--output.block") + out = append(out, "stdout") + return out +} + +func TestB11r(t *testing.T) { + tt := new(testT8n) + tt.TestCmd = cmdtest.NewTestCmd(t, tt) + for i, tc := range []struct { + base string + input b11rInput + expExitCode int + expOut string + }{ + { // unsealed block + base: "./testdata/20", + input: b11rInput{ + inEnv: "header.json", + inOmmersRlp: "ommers.json", + inTxsRlp: "txs.rlp", + }, + expOut: "exp.json", + }, + { // ethash test seal + base: "./testdata/21", + input: b11rInput{ + inEnv: "header.json", + inOmmersRlp: "ommers.json", + inTxsRlp: "txs.rlp", + }, + expOut: "exp.json", + }, + { // clique test seal + base: "./testdata/21", + input: b11rInput{ + inEnv: "header.json", + inOmmersRlp: "ommers.json", + inTxsRlp: "txs.rlp", + inClique: "clique.json", + }, + expOut: "exp-clique.json", + }, + { // block with ommers + base: "./testdata/22", + input: b11rInput{ + inEnv: "header.json", + inOmmersRlp: "ommers.json", + inTxsRlp: "txs.rlp", + }, + expOut: "exp.json", + }, + } { + + args := []string{"b11r"} + args = append(args, tc.input.get(tc.base)...) + + tt.Run("evm-test", args...) + tt.Logf("args:\n go run . %v\n", strings.Join(args, " ")) + // Compare the expected output, if provided + if tc.expOut != "" { + want, err := os.ReadFile(fmt.Sprintf("%v/%v", tc.base, tc.expOut)) + if err != nil { + t.Fatalf("test %d: could not read expected output: %v", i, err) + } + have := tt.Output() + ok, err := cmpJson(have, want) + switch { + case err != nil: + t.Logf(string(have)) + t.Fatalf("test %d, json parsing failed: %v", i, err) + case !ok: + t.Fatalf("test %d: output wrong, have \n%v\nwant\n%v\n", i, string(have), string(want)) + } + } + tt.WaitExit() + if have, want := tt.ExitStatus(), tc.expExitCode; have != want { + t.Fatalf("test %d: wrong exit code, have %d, want %d", i, have, want) + } + } +} + // cmpJson compares the JSON in two byte slices. func cmpJson(a, b []byte) (bool, error) { var j, j2 interface{} diff --git a/cmd/evm/testdata/1/exp.json b/cmd/evm/testdata/1/exp.json index 17d2f8267c..7d3805012d 100644 --- a/cmd/evm/testdata/1/exp.json +++ b/cmd/evm/testdata/1/exp.json @@ -15,7 +15,7 @@ "result": { "stateRoot": "0x84208a19bc2b46ada7445180c1db162be5b39b9abc8c0a54b05d32943eae4e13", "txRoot": "0xc4761fd7b87ff2364c7c60b6c5c8d02e522e815328aaea3f20e3b7b7ef52c42d", - "receiptRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", + "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "receipts": [ @@ -38,6 +38,7 @@ "error": "nonce too low: address 0x8A8eAFb1cf62BfBeb1741769DAE1a9dd47996192, tx: 0 state: 1" } ], - "currentDifficulty": "0x20000" + "currentDifficulty": "0x20000", + "gasUsed": "0x5208" } -} \ No newline at end of file +} diff --git a/cmd/evm/testdata/13/exp2.json b/cmd/evm/testdata/13/exp2.json index 01ab59e845..ba8c9f865b 100644 --- a/cmd/evm/testdata/13/exp2.json +++ b/cmd/evm/testdata/13/exp2.json @@ -2,7 +2,7 @@ "result": { "stateRoot": "0xe4b924a6adb5959fccf769d5b7bb2f6359e26d1e76a2443c5a91a36d826aef61", "txRoot": "0x013509c8563d41c0ae4bf38f2d6d19fc6512a1d0d6be045079c8c9f68bf45f9d", - "receiptRoot": "0xa532a08aa9f62431d6fe5d924951b8efb86ed3c54d06fee77788c3767dd13420", + "receiptsRoot": "0xa532a08aa9f62431d6fe5d924951b8efb86ed3c54d06fee77788c3767dd13420", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "receipts": [ @@ -33,6 +33,7 @@ "transactionIndex": "0x1" } ], - "currentDifficulty": "0x20000" + "currentDifficulty": "0x20000", + "gasUsed": "0x109a0" } } diff --git a/cmd/evm/testdata/14/exp.json b/cmd/evm/testdata/14/exp.json index bbe6a1317d..9bf5635f5b 100644 --- a/cmd/evm/testdata/14/exp.json +++ b/cmd/evm/testdata/14/exp.json @@ -2,10 +2,11 @@ "result": { "stateRoot": "0x6f058887ca01549716789c380ede95aecc510e6d1fdc4dbf67d053c7c07f4bdc", "txRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "receiptRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "currentDifficulty": "0x2000020000000", - "receipts": [] + "receipts": [], + "gasUsed": "0x0" } -} \ No newline at end of file +} diff --git a/cmd/evm/testdata/14/exp2.json b/cmd/evm/testdata/14/exp2.json index 195c738d99..9c9025381f 100644 --- a/cmd/evm/testdata/14/exp2.json +++ b/cmd/evm/testdata/14/exp2.json @@ -2,10 +2,11 @@ "result": { "stateRoot": "0x6f058887ca01549716789c380ede95aecc510e6d1fdc4dbf67d053c7c07f4bdc", "txRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "receiptRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "receipts": [], - "currentDifficulty": "0x1ff8020000000" + "currentDifficulty": "0x1ff8020000000", + "gasUsed": "0x0" } -} \ No newline at end of file +} diff --git a/cmd/evm/testdata/14/exp_berlin.json b/cmd/evm/testdata/14/exp_berlin.json new file mode 100644 index 0000000000..c2bf953119 --- /dev/null +++ b/cmd/evm/testdata/14/exp_berlin.json @@ -0,0 +1,12 @@ +{ + "result": { + "stateRoot": "0x6f058887ca01549716789c380ede95aecc510e6d1fdc4dbf67d053c7c07f4bdc", + "txRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "receipts": [], + "currentDifficulty": "0x1ff9000000000", + "gasUsed": "0x0" + } +} diff --git a/cmd/evm/testdata/15/exp2.json b/cmd/evm/testdata/15/exp2.json index 85d821f557..dd5e8a358c 100644 --- a/cmd/evm/testdata/15/exp2.json +++ b/cmd/evm/testdata/15/exp2.json @@ -1,10 +1,12 @@ [ { "address": "0xd02d72e067e77158444ef2020ff2d325f929b363", - "hash": "0xa98a24882ea90916c6a86da650fbc6b14238e46f0af04a131ce92be897507476" + "hash": "0xa98a24882ea90916c6a86da650fbc6b14238e46f0af04a131ce92be897507476", + "intrinsicGas": "0x5208" }, { "address": "0xd02d72e067e77158444ef2020ff2d325f929b363", - "hash": "0x36bad80acce7040c45fd32764b5c2b2d2e6f778669fb41791f73f546d56e739a" + "hash": "0x36bad80acce7040c45fd32764b5c2b2d2e6f778669fb41791f73f546d56e739a", + "intrinsicGas": "0x5208" } ] diff --git a/cmd/evm/testdata/16/exp.json b/cmd/evm/testdata/16/exp.json index ea855aeecd..137ade6513 100644 --- a/cmd/evm/testdata/16/exp.json +++ b/cmd/evm/testdata/16/exp.json @@ -1,11 +1,13 @@ [ { "address": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "hash": "0x7cc3d1a8540a44736750f03bb4d85c0113be4b3472a71bf82241a3b261b479e6" + "hash": "0x7cc3d1a8540a44736750f03bb4d85c0113be4b3472a71bf82241a3b261b479e6", + "intrinsicGas": "0x5208" }, { "error": "intrinsic gas too low: have 82, want 21000", "address": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "hash": "0x3b2d2609e4361562edb9169314f4c05afc6dbf5d706bf9dda5abe242ab76a22b" + "hash": "0x3b2d2609e4361562edb9169314f4c05afc6dbf5d706bf9dda5abe242ab76a22b", + "intrinsicGas": "0x5208" } ] \ No newline at end of file diff --git a/cmd/evm/testdata/17/exp.json b/cmd/evm/testdata/17/exp.json new file mode 100644 index 0000000000..485906041b --- /dev/null +++ b/cmd/evm/testdata/17/exp.json @@ -0,0 +1,22 @@ + [ + { + "error": "value exceeds 256 bits", + "address": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "hash": "0xfbd91685dcbf8172f0e8c53e2ddbb4d26707840da6b51a74371f62a33868fd82", + "intrinsicGas": "0x5208" + }, + { + "error": "gasPrice exceeds 256 bits", + "address": "0x1b57ccef1fe5fb73f1e64530fb4ebd9cf1655964", + "hash": "0x45dc05035cada83748e4c1fe617220106b331eca054f44c2304d5654a9fb29d5", + "intrinsicGas": "0x5208" + }, + { + "error": "invalid transaction v, r, s values", + "hash": "0xf06691c2a803ab7f3c81d06a0c0a896f80f311105c599fc59a9fdbc669356d35" + }, + { + "error": "invalid transaction v, r, s values", + "hash": "0x84703b697ad5b0db25e4f1f98fb6b1adce85b9edb2232eeba9cedd8c6601694b" + } +] \ No newline at end of file diff --git a/cmd/evm/testdata/17/rlpdata.txt b/cmd/evm/testdata/17/rlpdata.txt new file mode 100644 index 0000000000..874461fd76 --- /dev/null +++ b/cmd/evm/testdata/17/rlpdata.txt @@ -0,0 +1,46 @@ +[ + [ + "", + "d", + 5208, + d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0, + 010000000000000000000000000000000000000000000000000000000000000001, + "", + 1b, + c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549d, + 6180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28, + ], + [ + "", + 010000000000000000000000000000000000000000000000000000000000000001, + 5208, + d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0, + 11, + "", + 1b, + c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549d, + 6180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28, + ], + [ + "", + 11, + 5208, + d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0, + 11, + "", + 1b, + c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549daa, + 6180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28, + ], + [ + "", + 11, + 5208, + d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0, + 11, + "", + 1b, + c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549d, + 6180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28bb, + ], +] diff --git a/cmd/evm/testdata/17/signed_txs.rlp b/cmd/evm/testdata/17/signed_txs.rlp new file mode 100644 index 0000000000..0e351fb03c --- /dev/null +++ b/cmd/evm/testdata/17/signed_txs.rlp @@ -0,0 +1 @@ +"0xf901c8f880806482520894d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a1010000000000000000000000000000000000000000000000000000000000000001801ba0c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549da06180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28f88080a101000000000000000000000000000000000000000000000000000000000000000182520894d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d011801ba0c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549da06180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28f860801182520894d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d011801ba1c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549daaa06180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28f860801182520894d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d011801ba0c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549da16180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28bb" \ No newline at end of file diff --git a/cmd/evm/testdata/18/README.md b/cmd/evm/testdata/18/README.md new file mode 100644 index 0000000000..360a9bba01 --- /dev/null +++ b/cmd/evm/testdata/18/README.md @@ -0,0 +1,9 @@ +# Invalid rlp + +This folder contains a sample of invalid RLP, and it's expected +that the t9n handles this properly: + +``` +$ go run . t9n --input.txs=./testdata/18/invalid.rlp --state.fork=London +ERROR(11): rlp: value size exceeds available input length +``` \ No newline at end of file diff --git a/cmd/evm/testdata/18/invalid.rlp b/cmd/evm/testdata/18/invalid.rlp new file mode 100644 index 0000000000..7ff2824caf --- /dev/null +++ b/cmd/evm/testdata/18/invalid.rlp @@ -0,0 +1 @@ +"0xf852328001825208870b9331677e6ebf0a801ca098ff921201554726367d2be8c804a7ff89ccf285ebc57dff8ae4c44b9c19ac4aa03887321be575c8095f789dd4c743dfe42c1820f9231f98a962b210e3ac2452a3" \ No newline at end of file diff --git a/cmd/evm/testdata/19/alloc.json b/cmd/evm/testdata/19/alloc.json new file mode 100644 index 0000000000..cef1a25ff0 --- /dev/null +++ b/cmd/evm/testdata/19/alloc.json @@ -0,0 +1,12 @@ +{ + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x5ffd4878be161d74", + "code": "0x", + "nonce": "0xac", + "storage": {} + }, + "0x8a8eafb1cf62bfbeb1741769dae1a9dd47996192":{ + "balance": "0xfeedbead", + "nonce" : "0x00" + } +} \ No newline at end of file diff --git a/cmd/evm/testdata/19/env.json b/cmd/evm/testdata/19/env.json new file mode 100644 index 0000000000..0c64392aff --- /dev/null +++ b/cmd/evm/testdata/19/env.json @@ -0,0 +1,9 @@ +{ + "currentCoinbase": "0xc94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentGasLimit": "0x750a163df65e8a", + "currentBaseFee": "0x500", + "currentNumber": "13000000", + "currentTimestamp": "100015", + "parentTimestamp" : "99999", + "parentDifficulty" : "0x2000000000000" +} diff --git a/cmd/evm/testdata/19/exp_arrowglacier.json b/cmd/evm/testdata/19/exp_arrowglacier.json new file mode 100644 index 0000000000..9cf56ffafc --- /dev/null +++ b/cmd/evm/testdata/19/exp_arrowglacier.json @@ -0,0 +1,12 @@ +{ + "result": { + "stateRoot": "0x6f058887ca01549716789c380ede95aecc510e6d1fdc4dbf67d053c7c07f4bdc", + "txRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "currentDifficulty": "0x2000000200000", + "receipts": [], + "gasUsed": "0x0" + } +} diff --git a/cmd/evm/testdata/19/exp_london.json b/cmd/evm/testdata/19/exp_london.json new file mode 100644 index 0000000000..a06bc8ca69 --- /dev/null +++ b/cmd/evm/testdata/19/exp_london.json @@ -0,0 +1,12 @@ +{ + "result": { + "stateRoot": "0x6f058887ca01549716789c380ede95aecc510e6d1fdc4dbf67d053c7c07f4bdc", + "txRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "currentDifficulty": "0x2000080000000", + "receipts": [], + "gasUsed": "0x0" + } +} diff --git a/cmd/evm/testdata/19/readme.md b/cmd/evm/testdata/19/readme.md new file mode 100644 index 0000000000..5fae183f48 --- /dev/null +++ b/cmd/evm/testdata/19/readme.md @@ -0,0 +1,9 @@ +## Difficulty calculation + +This test shows how the `evm t8n` can be used to calculate the (ethash) difficulty, if none is provided by the caller, +this time on `ArrowGlacier` (Eip 4345). + +Calculating it (with an empty set of txs) using `ArrowGlacier` rules (and no provided unclehash for the parent block): +``` +[user@work evm]$ ./evm t8n --input.alloc=./testdata/14/alloc.json --input.txs=./testdata/14/txs.json --input.env=./testdata/14/env.json --output.result=stdout --state.fork=ArrowGlacier +``` \ No newline at end of file diff --git a/cmd/evm/testdata/19/txs.json b/cmd/evm/testdata/19/txs.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/cmd/evm/testdata/19/txs.json @@ -0,0 +1 @@ +[] diff --git a/cmd/evm/testdata/20/exp.json b/cmd/evm/testdata/20/exp.json new file mode 100644 index 0000000000..7bec6cefd6 --- /dev/null +++ b/cmd/evm/testdata/20/exp.json @@ -0,0 +1,4 @@ +{ + "rlp": "0xf902d9f90211a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e997a23b159e2e2a5ce72333262972374b15425ca0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e99476574682f76312e302e312f6c696e75782f676f312e342e32a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf8897435673d874f7c8f8c2f85f8002825208948a8eafb1cf62bfbeb1741769dae1a9dd4799619201801ba09500e8ba27d3c33ca7764e107410f44cbd8c19794bde214d694683a7aa998cdba07235ae07e4bd6e0206d102b1f8979d6adab280466b6a82d2208ee08951f1f600f85f8002825208948a8eafb1cf62bfbeb1741769dae1a9dd4799619201801ba09500e8ba27d3c33ca7764e107410f44cbd8c19794bde214d694683a7aa998cdba07235ae07e4bd6e0206d102b1f8979d6adab280466b6a82d2208ee08951f1f600c0", + "hash": "0xaba9a3b6a4e96e9ecffcadaa5a2ae0589359455617535cd86589fe1dd26fe899" +} diff --git a/cmd/evm/testdata/20/header.json b/cmd/evm/testdata/20/header.json new file mode 100644 index 0000000000..fb9b7fc563 --- /dev/null +++ b/cmd/evm/testdata/20/header.json @@ -0,0 +1,14 @@ +{ + "parentHash": "0xd6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34e", + "miner": "0xe997a23b159e2e2a5ce72333262972374b15425c", + "stateRoot": "0x325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2e", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x1000", + "number": "0xc3be", + "gasLimit": "0x50785", + "gasUsed": "0x0", + "timestamp": "0x55c5277e", + "extraData": "0x476574682f76312e302e312f6c696e75782f676f312e342e32", + "mixHash": "0x5865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf", + "nonce": "0x97435673d874f7c8" +} diff --git a/cmd/evm/testdata/20/ommers.json b/cmd/evm/testdata/20/ommers.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/cmd/evm/testdata/20/ommers.json @@ -0,0 +1 @@ +[] diff --git a/cmd/evm/testdata/20/readme.md b/cmd/evm/testdata/20/readme.md new file mode 100644 index 0000000000..2c448a96e6 --- /dev/null +++ b/cmd/evm/testdata/20/readme.md @@ -0,0 +1,11 @@ +# Block building + +This test shows how `b11r` can be used to assemble an unsealed block. + +```console +$ go run . b11r --input.header=testdata/20/header.json --input.txs=testdata/20/txs.rlp --input.ommers=testdata/20/ommers.json --output.block=stdout +{ + "rlp": "0xf90216f90211a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e997a23b159e2e2a5ce72333262972374b15425ca0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e99476574682f76312e302e312f6c696e75782f676f312e342e32a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf8897435673d874f7c8c0c0", + "hash": "0xaba9a3b6a4e96e9ecffcadaa5a2ae0589359455617535cd86589fe1dd26fe899" +} +``` diff --git a/cmd/evm/testdata/20/txs.rlp b/cmd/evm/testdata/20/txs.rlp new file mode 100644 index 0000000000..3599ff0654 --- /dev/null +++ b/cmd/evm/testdata/20/txs.rlp @@ -0,0 +1 @@ +"0xf8c2f85f8002825208948a8eafb1cf62bfbeb1741769dae1a9dd4799619201801ba09500e8ba27d3c33ca7764e107410f44cbd8c19794bde214d694683a7aa998cdba07235ae07e4bd6e0206d102b1f8979d6adab280466b6a82d2208ee08951f1f600f85f8002825208948a8eafb1cf62bfbeb1741769dae1a9dd4799619201801ba09500e8ba27d3c33ca7764e107410f44cbd8c19794bde214d694683a7aa998cdba07235ae07e4bd6e0206d102b1f8979d6adab280466b6a82d2208ee08951f1f600" \ No newline at end of file diff --git a/cmd/evm/testdata/21/clique.json b/cmd/evm/testdata/21/clique.json new file mode 100644 index 0000000000..84fa259a0d --- /dev/null +++ b/cmd/evm/testdata/21/clique.json @@ -0,0 +1,6 @@ +{ + "secretKey": "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "voted": "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "authorize": false, + "vanity": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +} diff --git a/cmd/evm/testdata/21/exp-clique.json b/cmd/evm/testdata/21/exp-clique.json new file mode 100644 index 0000000000..c990ba8aa6 --- /dev/null +++ b/cmd/evm/testdata/21/exp-clique.json @@ -0,0 +1,4 @@ +{ + "rlp": "0xf9025ff9025aa0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277eb861aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac540a67aaee364005841da84f488f6b6d0116dfb5103d091402c81a163d5f66666595e37f56f196d8c5c98da714dbfae68d6b7e1790cc734a20ec6ce52213ad800a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf88ffffffffffffffffc0c0", + "hash": "0x71c59102cc805dbe8741e1210ebe229a321eff144ac7276006fefe39e8357dc7" +} diff --git a/cmd/evm/testdata/21/exp.json b/cmd/evm/testdata/21/exp.json new file mode 100644 index 0000000000..b3e5e7a831 --- /dev/null +++ b/cmd/evm/testdata/21/exp.json @@ -0,0 +1,4 @@ +{ + "rlp": "0xf901fdf901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000c0c0", + "hash": "0x801411e9f6609a659825690d13e4f75a3cfe9143952fa2d9573f3b0a5eb9ebbb" +} diff --git a/cmd/evm/testdata/21/header.json b/cmd/evm/testdata/21/header.json new file mode 100644 index 0000000000..62abe3cc2c --- /dev/null +++ b/cmd/evm/testdata/21/header.json @@ -0,0 +1,11 @@ +{ + "parentHash": "0xd6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34e", + "stateRoot": "0x325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2e", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x1000", + "number": "0xc3be", + "gasLimit": "0x50785", + "gasUsed": "0x0", + "timestamp": "0x55c5277e", + "mixHash": "0x5865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf" +} diff --git a/cmd/evm/testdata/21/ommers.json b/cmd/evm/testdata/21/ommers.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/cmd/evm/testdata/21/ommers.json @@ -0,0 +1 @@ +[] diff --git a/cmd/evm/testdata/21/readme.md b/cmd/evm/testdata/21/readme.md new file mode 100644 index 0000000000..b70f106ffc --- /dev/null +++ b/cmd/evm/testdata/21/readme.md @@ -0,0 +1,23 @@ +# Sealed block building + +This test shows how `b11r` can be used to assemble a sealed block. + +## Ethash + +```console +$ go run . b11r --input.header=testdata/21/header.json --input.txs=testdata/21/txs.rlp --input.ommers=testdata/21/ommers.json --seal.ethash --seal.ethash.mode=test --output.block=stdout +{ + "rlp": "0xf901fdf901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000c0c0", + "hash": "0x801411e9f6609a659825690d13e4f75a3cfe9143952fa2d9573f3b0a5eb9ebbb" +} +``` + +## Clique + +```console +$ go run . b11r --input.header=testdata/21/header.json --input.txs=testdata/21/txs.rlp --input.ommers=testdata/21/ommers.json --seal.clique=testdata/21/clique.json --output.block=stdout +{ + "rlp": "0xf9025ff9025aa0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277eb861aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac540a67aaee364005841da84f488f6b6d0116dfb5103d091402c81a163d5f66666595e37f56f196d8c5c98da714dbfae68d6b7e1790cc734a20ec6ce52213ad800a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf88ffffffffffffffffc0c0", + "hash": "0x71c59102cc805dbe8741e1210ebe229a321eff144ac7276006fefe39e8357dc7" +} +``` diff --git a/cmd/evm/testdata/21/txs.rlp b/cmd/evm/testdata/21/txs.rlp new file mode 100644 index 0000000000..e815397b33 --- /dev/null +++ b/cmd/evm/testdata/21/txs.rlp @@ -0,0 +1 @@ +"c0" diff --git a/cmd/evm/testdata/22/exp-clique.json b/cmd/evm/testdata/22/exp-clique.json new file mode 100644 index 0000000000..c990ba8aa6 --- /dev/null +++ b/cmd/evm/testdata/22/exp-clique.json @@ -0,0 +1,4 @@ +{ + "rlp": "0xf9025ff9025aa0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277eb861aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac540a67aaee364005841da84f488f6b6d0116dfb5103d091402c81a163d5f66666595e37f56f196d8c5c98da714dbfae68d6b7e1790cc734a20ec6ce52213ad800a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf88ffffffffffffffffc0c0", + "hash": "0x71c59102cc805dbe8741e1210ebe229a321eff144ac7276006fefe39e8357dc7" +} diff --git a/cmd/evm/testdata/22/exp.json b/cmd/evm/testdata/22/exp.json new file mode 100644 index 0000000000..14fd81997d --- /dev/null +++ b/cmd/evm/testdata/22/exp.json @@ -0,0 +1,4 @@ +{ + "rlp": "0xf905f5f901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea06eb9f0c3cd68c9e97134e6725d12b1f1d8f0644458da6870a37ff84c908fb1e7940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000c0f903f6f901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000f901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000", + "hash": "0xd9a81c8fcd57a7f2a0d2c375eff6ad192c30c3729a271303f0a9a7e1b357e755" +} diff --git a/cmd/evm/testdata/22/header.json b/cmd/evm/testdata/22/header.json new file mode 100644 index 0000000000..62abe3cc2c --- /dev/null +++ b/cmd/evm/testdata/22/header.json @@ -0,0 +1,11 @@ +{ + "parentHash": "0xd6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34e", + "stateRoot": "0x325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2e", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x1000", + "number": "0xc3be", + "gasLimit": "0x50785", + "gasUsed": "0x0", + "timestamp": "0x55c5277e", + "mixHash": "0x5865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf" +} diff --git a/cmd/evm/testdata/22/ommers.json b/cmd/evm/testdata/22/ommers.json new file mode 100644 index 0000000000..997015b3ce --- /dev/null +++ b/cmd/evm/testdata/22/ommers.json @@ -0,0 +1 @@ +["0xf901fdf901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000c0c0","0xf901fdf901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000c0c0"] diff --git a/cmd/evm/testdata/22/readme.md b/cmd/evm/testdata/22/readme.md new file mode 100644 index 0000000000..2cac8a2434 --- /dev/null +++ b/cmd/evm/testdata/22/readme.md @@ -0,0 +1,11 @@ +# Building blocks with ommers + +This test shows how `b11r` can chain together ommer assembles into a canonical block. + +```console +$ echo "{ \"ommers\": [`go run . b11r --input.header=testdata/22/header.json --input.txs=testdata/22/txs.rlp --output.block=stdout | jq '.[\"rlp\"]'`,`go run . b11r --input.header=testdata/22/header.json --input.txs=testdata/22/txs.rlp --output.block=stdout | jq '.[\"rlp\"]'`]}" | go run . b11r --input.header=testdata/22/header.json --input.txs=testdata/22/txs.rlp --input.ommers=stdin --output.block=stdout +{ + "rlp": "0xf905f5f901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea06eb9f0c3cd68c9e97134e6725d12b1f1d8f0644458da6870a37ff84c908fb1e7940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000c0f903f6f901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000f901f8a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082100082c3be83050785808455c5277e80a05865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf880000000000000000", + "hash": "0xd9a81c8fcd57a7f2a0d2c375eff6ad192c30c3729a271303f0a9a7e1b357e755" +} +``` diff --git a/cmd/evm/testdata/22/txs.rlp b/cmd/evm/testdata/22/txs.rlp new file mode 100644 index 0000000000..e815397b33 --- /dev/null +++ b/cmd/evm/testdata/22/txs.rlp @@ -0,0 +1 @@ +"c0" diff --git a/cmd/evm/testdata/23/alloc.json b/cmd/evm/testdata/23/alloc.json new file mode 100644 index 0000000000..239b3553f9 --- /dev/null +++ b/cmd/evm/testdata/23/alloc.json @@ -0,0 +1,16 @@ +{ + "0x095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6001", + "nonce" : "0x00", + "storage" : { + } + }, + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } +} diff --git a/cmd/evm/testdata/23/env.json b/cmd/evm/testdata/23/env.json new file mode 100644 index 0000000000..1b46321512 --- /dev/null +++ b/cmd/evm/testdata/23/env.json @@ -0,0 +1,7 @@ +{ + "currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x020000", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x05", + "currentTimestamp" : "0x03e8" +} diff --git a/cmd/evm/testdata/23/exp.json b/cmd/evm/testdata/23/exp.json new file mode 100644 index 0000000000..e51f37d9c7 --- /dev/null +++ b/cmd/evm/testdata/23/exp.json @@ -0,0 +1,25 @@ +{ + "result": { + "stateRoot": "0x65334305e4accfa18352deb24f007b837b5036425b0712cf0e65a43bfa95154d", + "txRoot": "0x75e61774a2ff58cbe32653420256c7f44bc715715a423b0b746d5c622979af6b", + "receiptsRoot": "0xf951f9396af203499cc7d379715a9110323de73967c5700e2f424725446a3c76", + "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "receipts": [ + { + "root": "0x", + "status": "0x1", + "cumulativeGasUsed": "0x520b", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logs": null, + "transactionHash": "0x72fadbef39cd251a437eea619cfeda752271a5faaaa2147df012e112159ffb81", + "contractAddress": "0x0000000000000000000000000000000000000000", + "gasUsed": "0x520b", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "transactionIndex": "0x0" + } + ], + "currentDifficulty": "0x20000", + "gasUsed": "0x520b" + } +} diff --git a/cmd/evm/testdata/23/readme.md b/cmd/evm/testdata/23/readme.md new file mode 100644 index 0000000000..85fe8db66c --- /dev/null +++ b/cmd/evm/testdata/23/readme.md @@ -0,0 +1 @@ +These files examplify how to sign a transaction using the pre-EIP155 scheme. diff --git a/cmd/evm/testdata/23/txs.json b/cmd/evm/testdata/23/txs.json new file mode 100644 index 0000000000..22f3840f84 --- /dev/null +++ b/cmd/evm/testdata/23/txs.json @@ -0,0 +1,15 @@ +[ + { + "input" : "0x", + "gas" : "0x5f5e100", + "gasPrice" : "0x1", + "nonce" : "0x0", + "to" : "0x095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x186a0", + "v" : "0x0", + "r" : "0x0", + "s" : "0x0", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "protected": false + } +] diff --git a/cmd/evm/testdata/3/exp.json b/cmd/evm/testdata/3/exp.json index ade09e9ac1..71b3d2f559 100644 --- a/cmd/evm/testdata/3/exp.json +++ b/cmd/evm/testdata/3/exp.json @@ -15,7 +15,7 @@ "result": { "stateRoot": "0xb7341da3f9f762a6884eaa186c32942734c146b609efee11c4b0214c44857ea1", "txRoot": "0x75e61774a2ff58cbe32653420256c7f44bc715715a423b0b746d5c622979af6b", - "receiptRoot": "0xd0d26df80374a327c025d405ebadc752b1bbd089d864801ae78ab704bcad8086", + "receiptsRoot": "0xd0d26df80374a327c025d405ebadc752b1bbd089d864801ae78ab704bcad8086", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "receipts": [ @@ -32,6 +32,7 @@ "transactionIndex": "0x0" } ], - "currentDifficulty": "0x20000" + "currentDifficulty": "0x20000", + "gasUsed": "0x521f" } } diff --git a/cmd/evm/testdata/5/exp.json b/cmd/evm/testdata/5/exp.json index 6340d4cc30..7d715672c5 100644 --- a/cmd/evm/testdata/5/exp.json +++ b/cmd/evm/testdata/5/exp.json @@ -13,10 +13,11 @@ "result": { "stateRoot": "0xa7312add33811645c6aa65d928a1a4f49d65d448801912c069a0aa8fe9c1f393", "txRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "receiptRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "receipts": [], - "currentDifficulty": "0x20000" + "currentDifficulty": "0x20000", + "gasUsed": "0x0" } } diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 84f931c233..a178f6c751 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -66,6 +66,7 @@ It expects the genesis file as argument.`, Flags: []cli.Flag{ utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -146,7 +147,9 @@ be gzipped.`, }, Category: "BLOCKCHAIN COMMANDS", Description: ` - The import-preimages command imports hash preimages from an RLP encoded stream.`, +The import-preimages command imports hash preimages from an RLP encoded stream. +It's deprecated, please use "geth db import" instead. +`, } exportPreimagesCommand = cli.Command{ Action: utils.MigrateFlags(exportPreimages), @@ -160,7 +163,9 @@ be gzipped.`, }, Category: "BLOCKCHAIN COMMANDS", Description: ` -The export-preimages command export hash preimages to an RLP encoded stream`, +The export-preimages command exports hash preimages to an RLP encoded stream. +It's deprecated, please use "geth db export" instead. +`, } dumpCommand = cli.Command{ Action: utils.MigrateFlags(dump), @@ -375,7 +380,6 @@ func exportPreimages(ctx *cli.Context) error { if len(ctx.Args()) < 1 { utils.Fatalf("This command requires an argument.") } - stack, _ := makeConfigNode(ctx) defer stack.Close() diff --git a/cmd/geth/config.go b/cmd/geth/config.go index bb8e5688a5..6be6480a09 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -33,7 +33,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/scwallet" "github.com/ethereum/go-ethereum/accounts/usbwallet" "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/eth/catalyst" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/internal/ethapi" @@ -169,20 +168,13 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { // makeFullNode loads geth configuration and creates the Ethereum backend. func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { stack, cfg := makeConfigNode(ctx) - if ctx.GlobalIsSet(utils.OverrideLondonFlag.Name) { - cfg.Eth.OverrideLondon = new(big.Int).SetUint64(ctx.GlobalUint64(utils.OverrideLondonFlag.Name)) + if ctx.GlobalIsSet(utils.OverrideArrowGlacierFlag.Name) { + cfg.Eth.OverrideArrowGlacier = new(big.Int).SetUint64(ctx.GlobalUint64(utils.OverrideArrowGlacierFlag.Name)) } - backend, eth := utils.RegisterEthService(stack, &cfg.Eth) - - // Configure catalyst. - if ctx.GlobalBool(utils.CatalystFlag.Name) { - if eth == nil { - utils.Fatalf("Catalyst does not work in light client mode.") - } - if err := catalyst.Register(stack, eth); err != nil { - utils.Fatalf("%v", err) - } + if ctx.GlobalIsSet(utils.OverrideTerminalTotalDifficulty.Name) { + cfg.Eth.OverrideTerminalTotalDifficulty = new(big.Int).SetUint64(ctx.GlobalUint64(utils.OverrideTerminalTotalDifficulty.Name)) } + backend, _ := utils.RegisterEthService(stack, &cfg.Eth, ctx.GlobalBool(utils.CatalystFlag.Name)) // Configure GraphQL if requested if ctx.GlobalIsSet(utils.GraphQLEnabledFlag.Name) { diff --git a/cmd/geth/consolecmd.go b/cmd/geth/consolecmd.go index 75f9a82aa8..4364d1af3b 100644 --- a/cmd/geth/consolecmd.go +++ b/cmd/geth/consolecmd.go @@ -77,13 +77,13 @@ func localConsole(ctx *cli.Context) error { // Create and start the node based on the CLI flags prepare(ctx) stack, backend := makeFullNode(ctx) - startNode(ctx, stack, backend) + startNode(ctx, stack, backend, true) defer stack.Close() - // Attach to the newly started node and start the JavaScript console + // Attach to the newly started node and create the JavaScript console. client, err := stack.Attach() if err != nil { - utils.Fatalf("Failed to attach to the inproc geth: %v", err) + return fmt.Errorf("Failed to attach to the inproc geth: %v", err) } config := console.Config{ DataDir: utils.MakeDataDir(ctx), @@ -91,29 +91,34 @@ func localConsole(ctx *cli.Context) error { Client: client, Preload: utils.MakeConsolePreloads(ctx), } - console, err := console.New(config) if err != nil { - utils.Fatalf("Failed to start the JavaScript console: %v", err) + return fmt.Errorf("Failed to start the JavaScript console: %v", err) } defer console.Stop(false) - // If only a short execution was requested, evaluate and return + // If only a short execution was requested, evaluate and return. if script := ctx.GlobalString(utils.ExecFlag.Name); script != "" { console.Evaluate(script) return nil } - // Otherwise print the welcome screen and enter interactive mode + + // Track node shutdown and stop the console when it goes down. + // This happens when SIGTERM is sent to the process. + go func() { + stack.Wait() + console.StopInteractive() + }() + + // Print the welcome screen and enter interactive mode. console.Welcome() console.Interactive() - return nil } // remoteConsole will connect to a remote geth instance, attaching a JavaScript // console to it. func remoteConsole(ctx *cli.Context) error { - // Attach to a remotely running geth instance and start the JavaScript console endpoint := ctx.Args().First() if endpoint == "" { path := node.DefaultDataDir() @@ -137,6 +142,8 @@ func remoteConsole(ctx *cli.Context) error { } else if ctx.GlobalBool(utils.MumbaiFlag.Name) || ctx.GlobalBool(utils.BorMainnetFlag.Name) { homeDir, _ := os.UserHomeDir() path = filepath.Join(homeDir, "/.bor/data") + } else if ctx.GlobalBool(utils.SepoliaFlag.Name) { + path = filepath.Join(path, "sepolia") } } endpoint = fmt.Sprintf("%s/geth.ipc", path) @@ -151,7 +158,6 @@ func remoteConsole(ctx *cli.Context) error { Client: client, Preload: utils.MakeConsolePreloads(ctx), } - console, err := console.New(config) if err != nil { utils.Fatalf("Failed to start the JavaScript console: %v", err) @@ -166,7 +172,6 @@ func remoteConsole(ctx *cli.Context) error { // Otherwise print the welcome screen and enter interactive mode console.Welcome() console.Interactive() - return nil } @@ -190,13 +195,13 @@ func dialRPC(endpoint string) (*rpc.Client, error) { func ephemeralConsole(ctx *cli.Context) error { // Create and start the node based on the CLI flags stack, backend := makeFullNode(ctx) - startNode(ctx, stack, backend) + startNode(ctx, stack, backend, false) defer stack.Close() // Attach to the newly started node and start the JavaScript console client, err := stack.Attach() if err != nil { - utils.Fatalf("Failed to attach to the inproc geth: %v", err) + return fmt.Errorf("Failed to attach to the inproc geth: %v", err) } config := console.Config{ DataDir: utils.MakeDataDir(ctx), @@ -207,22 +212,24 @@ func ephemeralConsole(ctx *cli.Context) error { console, err := console.New(config) if err != nil { - utils.Fatalf("Failed to start the JavaScript console: %v", err) + return fmt.Errorf("Failed to start the JavaScript console: %v", err) } defer console.Stop(false) - // Evaluate each of the specified JavaScript files + // Interrupt the JS interpreter when node is stopped. + go func() { + stack.Wait() + console.Stop(false) + }() + + // Evaluate each of the specified JavaScript files. for _, file := range ctx.Args() { if err = console.Execute(file); err != nil { - utils.Fatalf("Failed to execute %s: %v", file, err) + return fmt.Errorf("Failed to execute %s: %v", file, err) } } - go func() { - stack.Wait() - console.Stop(false) - }() + // The main script is now done, but keep running timers/callbacks. console.Stop(true) - return nil } diff --git a/cmd/geth/dbcmd.go b/cmd/geth/dbcmd.go index 71ac86458b..37ed0dcc69 100644 --- a/cmd/geth/dbcmd.go +++ b/cmd/geth/dbcmd.go @@ -17,11 +17,16 @@ package main import ( + "bytes" + "errors" "fmt" "os" + "os/signal" "path/filepath" "sort" "strconv" + "strings" + "syscall" "time" "github.com/ethereum/go-ethereum/cmd/utils" @@ -62,6 +67,8 @@ Remove blockchain and state databases`, dbPutCmd, dbGetSlotsCmd, dbDumpFreezerIndex, + dbImportCmd, + dbExportCmd, }, } dbInspectCmd = cli.Command{ @@ -70,9 +77,11 @@ Remove blockchain and state databases`, ArgsUsage: " ", Flags: []cli.Flag{ utils.DataDirFlag, + utils.AncientFlag, utils.SyncModeFlag, utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -90,6 +99,7 @@ Remove blockchain and state databases`, utils.SyncModeFlag, utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -105,6 +115,7 @@ Remove blockchain and state databases`, utils.SyncModeFlag, utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -126,6 +137,7 @@ corruption if it is aborted during execution'!`, utils.SyncModeFlag, utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -143,6 +155,7 @@ corruption if it is aborted during execution'!`, utils.SyncModeFlag, utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -161,6 +174,7 @@ WARNING: This is a low-level operation which may cause database corruption!`, utils.SyncModeFlag, utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -179,6 +193,7 @@ WARNING: This is a low-level operation which may cause database corruption!`, utils.SyncModeFlag, utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -196,6 +211,7 @@ WARNING: This is a low-level operation which may cause database corruption!`, utils.SyncModeFlag, utils.MainnetFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -203,6 +219,36 @@ WARNING: This is a low-level operation which may cause database corruption!`, }, Description: "This command displays information about the freezer index.", } + dbImportCmd = cli.Command{ + Action: utils.MigrateFlags(importLDBdata), + Name: "import", + Usage: "Imports leveldb-data from an exported RLP dump.", + ArgsUsage: " has .gz suffix, gzip compression will be used.", + ArgsUsage: " ", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.SyncModeFlag, + utils.MainnetFlag, + utils.RopstenFlag, + utils.RinkebyFlag, + utils.GoerliFlag, + }, + Description: "Exports the specified chain data to an RLP encoded stream, optionally gzip-compressed.", + } ) func removeDB(ctx *cli.Context) error { @@ -351,14 +397,15 @@ func dbGet(ctx *cli.Context) error { db := utils.MakeChainDatabase(ctx, stack, true) defer db.Close() - key, err := hexutil.Decode(ctx.Args().Get(0)) + key, err := parseHexOrString(ctx.Args().Get(0)) if err != nil { log.Info("Could not decode the key", "error", err) return err } + data, err := db.Get(key) if err != nil { - log.Info("Get operation failed", "error", err) + log.Info("Get operation failed", "key", fmt.Sprintf("0x%#x", key), "error", err) return err } fmt.Printf("key %#x: %#x\n", key, data) @@ -376,7 +423,7 @@ func dbDelete(ctx *cli.Context) error { db := utils.MakeChainDatabase(ctx, stack, false) defer db.Close() - key, err := hexutil.Decode(ctx.Args().Get(0)) + key, err := parseHexOrString(ctx.Args().Get(0)) if err != nil { log.Info("Could not decode the key", "error", err) return err @@ -386,7 +433,7 @@ func dbDelete(ctx *cli.Context) error { fmt.Printf("Previous value: %#x\n", data) } if err = db.Delete(key); err != nil { - log.Info("Delete operation returned an error", "error", err) + log.Info("Delete operation returned an error", "key", fmt.Sprintf("0x%#x", key), "error", err) return err } return nil @@ -409,7 +456,7 @@ func dbPut(ctx *cli.Context) error { data []byte err error ) - key, err = hexutil.Decode(ctx.Args().Get(0)) + key, err = parseHexOrString(ctx.Args().Get(0)) if err != nil { log.Info("Could not decode the key", "error", err) return err @@ -515,3 +562,142 @@ func freezerInspect(ctx *cli.Context) error { } return nil } + +// ParseHexOrString tries to hexdecode b, but if the prefix is missing, it instead just returns the raw bytes +func parseHexOrString(str string) ([]byte, error) { + b, err := hexutil.Decode(str) + if errors.Is(err, hexutil.ErrMissingPrefix) { + return []byte(str), nil + } + return b, err +} + +func importLDBdata(ctx *cli.Context) error { + start := 0 + switch ctx.NArg() { + case 1: + break + case 2: + s, err := strconv.Atoi(ctx.Args().Get(1)) + if err != nil { + return fmt.Errorf("second arg must be an integer: %v", err) + } + start = s + default: + return fmt.Errorf("required arguments: %v", ctx.Command.ArgsUsage) + } + var ( + fName = ctx.Args().Get(0) + stack, _ = makeConfigNode(ctx) + interrupt = make(chan os.Signal, 1) + stop = make(chan struct{}) + ) + defer stack.Close() + signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM) + defer signal.Stop(interrupt) + defer close(interrupt) + go func() { + if _, ok := <-interrupt; ok { + log.Info("Interrupted during ldb import, stopping at next batch") + } + close(stop) + }() + db := utils.MakeChainDatabase(ctx, stack, false) + return utils.ImportLDBData(db, fName, int64(start), stop) +} + +type preimageIterator struct { + iter ethdb.Iterator +} + +func (iter *preimageIterator) Next() (byte, []byte, []byte, bool) { + for iter.iter.Next() { + key := iter.iter.Key() + if bytes.HasPrefix(key, rawdb.PreimagePrefix) && len(key) == (len(rawdb.PreimagePrefix)+common.HashLength) { + return utils.OpBatchAdd, key, iter.iter.Value(), true + } + } + return 0, nil, nil, false +} + +func (iter *preimageIterator) Release() { + iter.iter.Release() +} + +type snapshotIterator struct { + init bool + account ethdb.Iterator + storage ethdb.Iterator +} + +func (iter *snapshotIterator) Next() (byte, []byte, []byte, bool) { + if !iter.init { + iter.init = true + return utils.OpBatchDel, rawdb.SnapshotRootKey, nil, true + } + for iter.account.Next() { + key := iter.account.Key() + if bytes.HasPrefix(key, rawdb.SnapshotAccountPrefix) && len(key) == (len(rawdb.SnapshotAccountPrefix)+common.HashLength) { + return utils.OpBatchAdd, key, iter.account.Value(), true + } + } + for iter.storage.Next() { + key := iter.storage.Key() + if bytes.HasPrefix(key, rawdb.SnapshotStoragePrefix) && len(key) == (len(rawdb.SnapshotStoragePrefix)+2*common.HashLength) { + return utils.OpBatchAdd, key, iter.storage.Value(), true + } + } + return 0, nil, nil, false +} + +func (iter *snapshotIterator) Release() { + iter.account.Release() + iter.storage.Release() +} + +// chainExporters defines the export scheme for all exportable chain data. +var chainExporters = map[string]func(db ethdb.Database) utils.ChainDataIterator{ + "preimage": func(db ethdb.Database) utils.ChainDataIterator { + iter := db.NewIterator(rawdb.PreimagePrefix, nil) + return &preimageIterator{iter: iter} + }, + "snapshot": func(db ethdb.Database) utils.ChainDataIterator { + account := db.NewIterator(rawdb.SnapshotAccountPrefix, nil) + storage := db.NewIterator(rawdb.SnapshotStoragePrefix, nil) + return &snapshotIterator{account: account, storage: storage} + }, +} + +func exportChaindata(ctx *cli.Context) error { + if ctx.NArg() < 2 { + return fmt.Errorf("required arguments: %v", ctx.Command.ArgsUsage) + } + // Parse the required chain data type, make sure it's supported. + kind := ctx.Args().Get(0) + kind = strings.ToLower(strings.Trim(kind, " ")) + exporter, ok := chainExporters[kind] + if !ok { + var kinds []string + for kind := range chainExporters { + kinds = append(kinds, kind) + } + return fmt.Errorf("invalid data type %s, supported types: %s", kind, strings.Join(kinds, ", ")) + } + var ( + stack, _ = makeConfigNode(ctx) + interrupt = make(chan os.Signal, 1) + stop = make(chan struct{}) + ) + defer stack.Close() + signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM) + defer signal.Stop(interrupt) + defer close(interrupt) + go func() { + if _, ok := <-interrupt; ok { + log.Info("Interrupted during db export, stopping at next batch") + } + close(stop) + }() + db := utils.MakeChainDatabase(ctx, stack, true) + return utils.ExportChaindata(ctx.Args().Get(1), kind, exporter(db), stop) +} diff --git a/cmd/geth/main.go b/cmd/geth/main.go index bec77e261d..756a397d32 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -39,6 +39,11 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/node" + + // Force-load the tracer engines to trigger registration + _ "github.com/ethereum/go-ethereum/eth/tracers/js" + _ "github.com/ethereum/go-ethereum/eth/tracers/native" + "gopkg.in/urfave/cli.v1" ) @@ -68,7 +73,8 @@ var ( utils.NoUSBFlag, utils.USBFlag, utils.SmartCardDaemonPathFlag, - utils.OverrideLondonFlag, + utils.OverrideArrowGlacierFlag, + utils.OverrideTerminalTotalDifficulty, utils.EthashCacheDirFlag, utils.EthashCachesInMemoryFlag, utils.EthashCachesOnDiskFlag, @@ -137,7 +143,9 @@ var ( utils.MainnetFlag, utils.DeveloperFlag, utils.DeveloperPeriodFlag, + utils.DeveloperGasLimitFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -273,6 +281,9 @@ func prepare(ctx *cli.Context) { case ctx.GlobalIsSet(utils.RopstenFlag.Name): log.Info("Starting Geth on Ropsten testnet...") + case ctx.GlobalIsSet(utils.SepoliaFlag.Name): + log.Info("Starting Geth on Sepolia testnet...") + case ctx.GlobalIsSet(utils.RinkebyFlag.Name): log.Info("Starting Geth on Rinkeby testnet...") @@ -294,7 +305,12 @@ func prepare(ctx *cli.Context) { // If we're a full node on mainnet without --cache specified, bump default cache allowance if ctx.GlobalString(utils.SyncModeFlag.Name) != "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) && !ctx.GlobalIsSet(utils.NetworkIdFlag.Name) { // Make sure we're not on any supported preconfigured testnet either - if !ctx.GlobalIsSet(utils.RopstenFlag.Name) && !ctx.GlobalIsSet(utils.RinkebyFlag.Name) && !ctx.GlobalIsSet(utils.GoerliFlag.Name) && !ctx.GlobalIsSet(utils.MumbaiFlag.Name) && !ctx.GlobalIsSet(utils.DeveloperFlag.Name) { + if !ctx.GlobalIsSet(utils.RopstenFlag.Name) && + !ctx.GlobalIsSet(utils.SepoliaFlag.Name) && + !ctx.GlobalIsSet(utils.RinkebyFlag.Name) && + !ctx.GlobalIsSet(utils.GoerliFlag.Name) && + !ctx.GlobalIsSet(utils.DeveloperFlag.Name) && + !ctx.GlobalIsSet(utils.MumbaiFlag.Name) { // Nope, we're really on mainnet. Bump that cache up! log.Info("Bumping default cache on mainnet", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 4096) ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(4096)) @@ -325,7 +341,7 @@ func geth(ctx *cli.Context) error { stack, backend := makeFullNode(ctx) defer stack.Close() - startNode(ctx, stack, backend) + startNode(ctx, stack, backend, false) stack.Wait() return nil } @@ -333,11 +349,11 @@ func geth(ctx *cli.Context) error { // startNode boots up the system node and all registered protocols, after which // it unlocks any requested accounts, and starts the RPC/IPC interfaces and the // miner. -func startNode(ctx *cli.Context, stack *node.Node, backend ethapi.Backend) { +func startNode(ctx *cli.Context, stack *node.Node, backend ethapi.Backend, isConsole bool) { debug.Memsize.Add("node", stack) // Start up the node itself - utils.StartNode(ctx, stack) + utils.StartNode(ctx, stack, isConsole) // Unlock any account specifically requested unlockAccounts(ctx, stack) diff --git a/cmd/geth/snapshot.go b/cmd/geth/snapshot.go index a174090743..6ca8b768a3 100644 --- a/cmd/geth/snapshot.go +++ b/cmd/geth/snapshot.go @@ -62,6 +62,7 @@ var ( utils.DataDirFlag, utils.AncientFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -94,6 +95,7 @@ the trie clean cache with default directory will be deleted. utils.DataDirFlag, utils.AncientFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -116,6 +118,7 @@ In other words, this command does the snapshot to trie conversion. utils.DataDirFlag, utils.AncientFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -140,6 +143,7 @@ It's also usable without snapshot enabled. utils.DataDirFlag, utils.AncientFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, @@ -165,6 +169,7 @@ It's also usable without snapshot enabled. utils.DataDirFlag, utils.AncientFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.RinkebyFlag, utils.GoerliFlag, utils.MumbaiFlag, diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 0da312cf56..17d93f06e0 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -47,6 +47,7 @@ var AppHelpFlagGroups = []flags.FlagGroup{ utils.BorMainnetFlag, utils.RinkebyFlag, utils.RopstenFlag, + utils.SepoliaFlag, utils.SyncModeFlag, utils.ExitWhenSyncedFlag, utils.GCModeFlag, @@ -76,6 +77,7 @@ var AppHelpFlagGroups = []flags.FlagGroup{ Flags: []cli.Flag{ utils.DeveloperFlag, utils.DeveloperPeriodFlag, + utils.DeveloperGasLimitFlag, }, }, { diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index 83536506c4..c0edc54019 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -17,7 +17,6 @@ package main import ( - "bufio" "encoding/json" "fmt" "io/ioutil" @@ -32,8 +31,10 @@ import ( "sync" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/console/prompt" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/log" + "github.com/peterh/liner" "golang.org/x/crypto/ssh/terminal" ) @@ -76,17 +77,27 @@ type wizard struct { servers map[string]*sshClient // SSH connections to servers to administer services map[string][]string // Ethereum services known to be running on servers - in *bufio.Reader // Wrapper around stdin to allow reading user input - lock sync.Mutex // Lock to protect configs during concurrent service discovery + lock sync.Mutex // Lock to protect configs during concurrent service discovery +} + +// prompts the user for input with the given prompt string. Returns when a value is entered. +// Causes the wizard to exit if ctrl-d is pressed +func promptInput(p string) string { + for { + text, err := prompt.Stdin.PromptInput(p) + if err != nil { + if err != liner.ErrPromptAborted { + log.Crit("Failed to read user input", "err", err) + } + } else { + return text + } + } } // read reads a single line from stdin, trimming if from spaces. func (w *wizard) read() string { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") return strings.TrimSpace(text) } @@ -94,11 +105,7 @@ func (w *wizard) read() string { // non-emptyness. func (w *wizard) readString() string { for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") if text = strings.TrimSpace(text); text != "" { return text } @@ -108,11 +115,7 @@ func (w *wizard) readString() string { // readDefaultString reads a single line from stdin, trimming if from spaces. If // an empty line is entered, the default value is returned. func (w *wizard) readDefaultString(def string) string { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") if text = strings.TrimSpace(text); text != "" { return text } @@ -124,11 +127,7 @@ func (w *wizard) readDefaultString(def string) string { // value is returned. func (w *wizard) readDefaultYesNo(def bool) bool { for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") if text = strings.ToLower(strings.TrimSpace(text)); text == "" { return def } @@ -146,11 +145,7 @@ func (w *wizard) readDefaultYesNo(def bool) bool { // interpret it as a URL (http, https or file). func (w *wizard) readURL() *url.URL { for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") uri, err := url.Parse(strings.TrimSpace(text)) if err != nil { log.Error("Invalid input, expected URL", "err", err) @@ -164,11 +159,7 @@ func (w *wizard) readURL() *url.URL { // to parse into an integer. func (w *wizard) readInt() int { for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") if text = strings.TrimSpace(text); text == "" { continue } @@ -186,11 +177,7 @@ func (w *wizard) readInt() int { // returned. func (w *wizard) readDefaultInt(def int) int { for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") if text = strings.TrimSpace(text); text == "" { return def } @@ -208,11 +195,7 @@ func (w *wizard) readDefaultInt(def int) int { // default value is returned. func (w *wizard) readDefaultBigInt(def *big.Int) *big.Int { for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") if text = strings.TrimSpace(text); text == "" { return def } @@ -225,38 +208,11 @@ func (w *wizard) readDefaultBigInt(def *big.Int) *big.Int { } } -/* -// readFloat reads a single line from stdin, trimming if from spaces, enforcing it -// to parse into a float. -func (w *wizard) readFloat() float64 { - for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } - if text = strings.TrimSpace(text); text == "" { - continue - } - val, err := strconv.ParseFloat(strings.TrimSpace(text), 64) - if err != nil { - log.Error("Invalid input, expected float", "err", err) - continue - } - return val - } -} -*/ - // readDefaultFloat reads a single line from stdin, trimming if from spaces, enforcing // it to parse into a float. If an empty line is entered, the default value is returned. func (w *wizard) readDefaultFloat(def float64) float64 { for { - fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") if text = strings.TrimSpace(text); text == "" { return def } @@ -285,12 +241,7 @@ func (w *wizard) readPassword() string { // it to an Ethereum address. func (w *wizard) readAddress() *common.Address { for { - // Read the address from the user - fmt.Printf("> 0x") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> 0x") if text = strings.TrimSpace(text); text == "" { return nil } @@ -311,11 +262,7 @@ func (w *wizard) readAddress() *common.Address { func (w *wizard) readDefaultAddress(def common.Address) common.Address { for { // Read the address from the user - fmt.Printf("> 0x") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> 0x") if text = strings.TrimSpace(text); text == "" { return def } @@ -334,8 +281,9 @@ func (w *wizard) readJSON() string { var blob json.RawMessage for { - fmt.Printf("> ") - if err := json.NewDecoder(w.in).Decode(&blob); err != nil { + text := promptInput("> ") + reader := strings.NewReader(text) + if err := json.NewDecoder(reader).Decode(&blob); err != nil { log.Error("Invalid JSON, please try again", "err", err) continue } @@ -351,10 +299,7 @@ func (w *wizard) readIPAddress() string { for { // Read the IP address from the user fmt.Printf("> ") - text, err := w.in.ReadString('\n') - if err != nil { - log.Crit("Failed to read user input", "err", err) - } + text := promptInput("> ") if text = strings.TrimSpace(text); text == "" { return "" } diff --git a/cmd/puppeth/wizard_intro.go b/cmd/puppeth/wizard_intro.go index 75fb04b76f..dd4b606c4a 100644 --- a/cmd/puppeth/wizard_intro.go +++ b/cmd/puppeth/wizard_intro.go @@ -17,14 +17,12 @@ package main import ( - "bufio" "encoding/json" "fmt" "io/ioutil" "os" "path/filepath" "strings" - "sync" "github.com/ethereum/go-ethereum/log" ) @@ -38,7 +36,6 @@ func makeWizard(network string) *wizard { }, servers: make(map[string]*sshClient), services: make(map[string][]string), - in: bufio.NewReader(os.Stdin), } } @@ -82,25 +79,17 @@ func (w *wizard) run() { } else if err := json.Unmarshal(blob, &w.conf); err != nil { log.Crit("Previous configuration corrupted", "path", w.conf.path, "err", err) } else { - // Dial all previously known servers concurrently - var pend sync.WaitGroup + // Dial all previously known servers for server, pubkey := range w.conf.Servers { - pend.Add(1) - - go func(server string, pubkey []byte) { - defer pend.Done() - - log.Info("Dialing previously configured server", "server", server) - client, err := dial(server, pubkey) - if err != nil { - log.Error("Previous server unreachable", "server", server, "err", err) - } - w.lock.Lock() - w.servers[server] = client - w.lock.Unlock() - }(server, pubkey) + log.Info("Dialing previously configured server", "server", server) + client, err := dial(server, pubkey) + if err != nil { + log.Error("Previous server unreachable", "server", server, "err", err) + } + w.lock.Lock() + w.servers[server] = client + w.lock.Unlock() } - pend.Wait() w.networkStats() } // Basics done, loop ad infinitum about what to do diff --git a/cmd/rlpdump/main.go b/cmd/rlpdump/main.go index d0f993c5b8..9c0af01248 100644 --- a/cmd/rlpdump/main.go +++ b/cmd/rlpdump/main.go @@ -18,7 +18,9 @@ package main import ( + "bufio" "bytes" + "container/list" "encoding/hex" "flag" "fmt" @@ -26,18 +28,20 @@ import ( "os" "strings" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/rlp" ) var ( - hexMode = flag.String("hex", "", "dump given hex data") - noASCII = flag.Bool("noascii", false, "don't print ASCII strings readably") - single = flag.Bool("single", false, "print only the first element, discard the rest") + hexMode = flag.String("hex", "", "dump given hex data") + reverseMode = flag.Bool("reverse", false, "convert ASCII to rlp") + noASCII = flag.Bool("noascii", false, "don't print ASCII strings readably") + single = flag.Bool("single", false, "print only the first element, discard the rest") ) func init() { flag.Usage = func() { - fmt.Fprintln(os.Stderr, "Usage:", os.Args[0], "[-noascii] [-hex ] [filename]") + fmt.Fprintln(os.Stderr, "Usage:", os.Args[0], "[-noascii] [-hex ][-reverse] [filename]") flag.PrintDefaults() fmt.Fprintln(os.Stderr, ` Dumps RLP data from the given file in readable form. @@ -73,23 +77,40 @@ func main() { flag.Usage() os.Exit(2) } + out := os.Stdout + if *reverseMode { + data, err := textToRlp(r) + if err != nil { + die(err) + } + fmt.Printf("0x%x\n", data) + return + } else { + err := rlpToText(r, out) + if err != nil { + die(err) + } + } +} +func rlpToText(r io.Reader, out io.Writer) error { s := rlp.NewStream(r, 0) for { - if err := dump(s, 0); err != nil { + if err := dump(s, 0, out); err != nil { if err != io.EOF { - die(err) + return err } break } - fmt.Println() + fmt.Fprintln(out) if *single { break } } + return nil } -func dump(s *rlp.Stream, depth int) error { +func dump(s *rlp.Stream, depth int, out io.Writer) error { kind, size, err := s.Kind() if err != nil { return err @@ -101,28 +122,28 @@ func dump(s *rlp.Stream, depth int) error { return err } if len(str) == 0 || !*noASCII && isASCII(str) { - fmt.Printf("%s%q", ws(depth), str) + fmt.Fprintf(out, "%s%q", ws(depth), str) } else { - fmt.Printf("%s%x", ws(depth), str) + fmt.Fprintf(out, "%s%x", ws(depth), str) } case rlp.List: s.List() defer s.ListEnd() if size == 0 { - fmt.Print(ws(depth) + "[]") + fmt.Fprintf(out, ws(depth)+"[]") } else { - fmt.Println(ws(depth) + "[") + fmt.Fprintln(out, ws(depth)+"[") for i := 0; ; i++ { if i > 0 { - fmt.Print(",\n") + fmt.Fprint(out, ",\n") } - if err := dump(s, depth+1); err == rlp.EOL { + if err := dump(s, depth+1, out); err == rlp.EOL { break } else if err != nil { return err } } - fmt.Print(ws(depth) + "]") + fmt.Fprint(out, ws(depth)+"]") } } return nil @@ -145,3 +166,45 @@ func die(args ...interface{}) { fmt.Fprintln(os.Stderr, args...) os.Exit(1) } + +// textToRlp converts text into RLP (best effort). +func textToRlp(r io.Reader) ([]byte, error) { + // We're expecting the input to be well-formed, meaning that + // - each element is on a separate line + // - each line is either an (element OR a list start/end) + comma + // - an element is either hex-encoded bytes OR a quoted string + var ( + scanner = bufio.NewScanner(r) + obj []interface{} + stack = list.New() + ) + for scanner.Scan() { + t := strings.TrimSpace(scanner.Text()) + if len(t) == 0 { + continue + } + switch t { + case "[": // list start + stack.PushFront(obj) + obj = make([]interface{}, 0) + case "]", "],": // list end + parent := stack.Remove(stack.Front()).([]interface{}) + obj = append(parent, obj) + case "[],": // empty list + obj = append(obj, make([]interface{}, 0)) + default: // element + data := []byte(t)[:len(t)-1] // cut off comma + if data[0] == '"' { // ascii string + data = []byte(t)[1 : len(data)-1] + } else { // hex data + data = common.FromHex(string(data)) + } + obj = append(obj, data) + } + } + if err := scanner.Err(); err != nil { + return nil, err + } + data, err := rlp.EncodeToBytes(obj[0]) + return data, err +} diff --git a/cmd/rlpdump/rlpdump_test.go b/cmd/rlpdump/rlpdump_test.go new file mode 100644 index 0000000000..ea607e3808 --- /dev/null +++ b/cmd/rlpdump/rlpdump_test.go @@ -0,0 +1,65 @@ +package main + +import ( + "bytes" + "fmt" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +func TestRoundtrip(t *testing.T) { + for i, want := range []string{ + "0xf880806482520894d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a1010000000000000000000000000000000000000000000000000000000000000001801ba0c16787a8e25e941d67691954642876c08f00996163ae7dfadbbfd6cd436f549da06180e5626cae31590f40641fe8f63734316c4bfeb4cdfab6714198c1044d2e28", + "0xd5c0d3cb84746573742a2a808213378667617a6f6e6b", + "0xc780c0c1c0825208", + } { + var out strings.Builder + err := rlpToText(bytes.NewReader(common.FromHex(want)), &out) + if err != nil { + t.Fatal(err) + } + text := out.String() + rlpBytes, err := textToRlp(strings.NewReader(text)) + if err != nil { + t.Errorf("test %d: error %v", i, err) + continue + } + have := fmt.Sprintf("0x%x", rlpBytes) + if have != want { + t.Errorf("test %d: have\n%v\nwant:\n%v\n", i, have, want) + } + } +} + +func TestTextToRlp(t *testing.T) { + type tc struct { + text string + want string + } + cases := []tc{ + { + text: `[ + "", + [], +[ + [], + ], + 5208, +]`, + want: "0xc780c0c1c0825208", + }, + } + for i, tc := range cases { + have, err := textToRlp(strings.NewReader(tc.text)) + if err != nil { + t.Errorf("test %d: error %v", i, err) + continue + } + if hexutil.Encode(have) != tc.want { + t.Errorf("test %d:\nhave %v\nwant %v", i, hexutil.Encode(have), tc.want) + } + } +} diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index d4051e59ef..f8e40b187c 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -18,7 +18,9 @@ package utils import ( + "bufio" "compress/gzip" + "errors" "fmt" "io" "os" @@ -66,7 +68,7 @@ func Fatalf(format string, args ...interface{}) { os.Exit(1) } -func StartNode(ctx *cli.Context, stack *node.Node) { +func StartNode(ctx *cli.Context, stack *node.Node, isConsole bool) { if err := stack.Start(); err != nil { Fatalf("Error starting protocol stack: %v", err) } @@ -85,17 +87,33 @@ func StartNode(ctx *cli.Context, stack *node.Node) { go monitorFreeDiskSpace(sigc, stack.InstanceDir(), uint64(minFreeDiskSpace)*1024*1024) } - <-sigc - log.Info("Got interrupt, shutting down...") - go stack.Close() - for i := 10; i > 0; i-- { - <-sigc - if i > 1 { - log.Warn("Already shutting down, interrupt more to panic.", "times", i-1) + shutdown := func() { + log.Info("Got interrupt, shutting down...") + go stack.Close() + for i := 10; i > 0; i-- { + <-sigc + if i > 1 { + log.Warn("Already shutting down, interrupt more to panic.", "times", i-1) + } + } + debug.Exit() // ensure trace and CPU profile data is flushed. + debug.LoudPanic("boom") + } + + if isConsole { + // In JS console mode, SIGINT is ignored because it's handled by the console. + // However, SIGTERM still shuts down the node. + for { + sig := <-sigc + if sig == syscall.SIGTERM { + shutdown() + return + } } + } else { + <-sigc + shutdown() } - debug.Exit() // ensure trace and CPU profile data is flushed. - debug.LoudPanic("boom") }() } @@ -270,6 +288,7 @@ func ExportAppendChain(blockchain *core.BlockChain, fn string, first uint64, las } // ImportPreimages imports a batch of exported hash preimages into the database. +// It's a part of the deprecated functionality, should be removed in the future. func ImportPreimages(db ethdb.Database, fn string) error { log.Info("Importing preimages", "file", fn) @@ -280,7 +299,7 @@ func ImportPreimages(db ethdb.Database, fn string) error { } defer fh.Close() - var reader io.Reader = fh + var reader io.Reader = bufio.NewReader(fh) if strings.HasSuffix(fn, ".gz") { if reader, err = gzip.NewReader(reader); err != nil { return err @@ -288,7 +307,7 @@ func ImportPreimages(db ethdb.Database, fn string) error { } stream := rlp.NewStream(reader, 0) - // Import the preimages in batches to prevent disk trashing + // Import the preimages in batches to prevent disk thrashing preimages := make(map[common.Hash][]byte) for { @@ -317,6 +336,7 @@ func ImportPreimages(db ethdb.Database, fn string) error { // ExportPreimages exports all known hash preimages into the specified file, // truncating any data already present in the file. +// It's a part of the deprecated functionality, should be removed in the future. func ExportPreimages(db ethdb.Database, fn string) error { log.Info("Exporting preimages", "file", fn) @@ -344,3 +364,207 @@ func ExportPreimages(db ethdb.Database, fn string) error { log.Info("Exported preimages", "file", fn) return nil } + +// exportHeader is used in the export/import flow. When we do an export, +// the first element we output is the exportHeader. +// Whenever a backwards-incompatible change is made, the Version header +// should be bumped. +// If the importer sees a higher version, it should reject the import. +type exportHeader struct { + Magic string // Always set to 'gethdbdump' for disambiguation + Version uint64 + Kind string + UnixTime uint64 +} + +const exportMagic = "gethdbdump" +const ( + OpBatchAdd = 0 + OpBatchDel = 1 +) + +// ImportLDBData imports a batch of snapshot data into the database +func ImportLDBData(db ethdb.Database, f string, startIndex int64, interrupt chan struct{}) error { + log.Info("Importing leveldb data", "file", f) + + // Open the file handle and potentially unwrap the gzip stream + fh, err := os.Open(f) + if err != nil { + return err + } + defer fh.Close() + + var reader io.Reader = bufio.NewReader(fh) + if strings.HasSuffix(f, ".gz") { + if reader, err = gzip.NewReader(reader); err != nil { + return err + } + } + stream := rlp.NewStream(reader, 0) + + // Read the header + var header exportHeader + if err := stream.Decode(&header); err != nil { + return fmt.Errorf("could not decode header: %v", err) + } + if header.Magic != exportMagic { + return errors.New("incompatible data, wrong magic") + } + if header.Version != 0 { + return fmt.Errorf("incompatible version %d, (support only 0)", header.Version) + } + log.Info("Importing data", "file", f, "type", header.Kind, "data age", + common.PrettyDuration(time.Since(time.Unix(int64(header.UnixTime), 0)))) + + // Import the snapshot in batches to prevent disk thrashing + var ( + count int64 + start = time.Now() + logged = time.Now() + batch = db.NewBatch() + ) + for { + // Read the next entry + var ( + op byte + key, val []byte + ) + if err := stream.Decode(&op); err != nil { + if err == io.EOF { + break + } + return err + } + if err := stream.Decode(&key); err != nil { + return err + } + if err := stream.Decode(&val); err != nil { + return err + } + if count < startIndex { + count++ + continue + } + switch op { + case OpBatchDel: + batch.Delete(key) + case OpBatchAdd: + batch.Put(key, val) + default: + return fmt.Errorf("unknown op %d\n", op) + } + if batch.ValueSize() > ethdb.IdealBatchSize { + if err := batch.Write(); err != nil { + return err + } + batch.Reset() + } + // Check interruption emitted by ctrl+c + if count%1000 == 0 { + select { + case <-interrupt: + if err := batch.Write(); err != nil { + return err + } + log.Info("External data import interrupted", "file", f, "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + return nil + default: + } + } + if count%1000 == 0 && time.Since(logged) > 8*time.Second { + log.Info("Importing external data", "file", f, "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + count += 1 + } + // Flush the last batch snapshot data + if batch.ValueSize() > 0 { + if err := batch.Write(); err != nil { + return err + } + } + log.Info("Imported chain data", "file", f, "count", count, + "elapsed", common.PrettyDuration(time.Since(start))) + return nil +} + +// ChainDataIterator is an interface wraps all necessary functions to iterate +// the exporting chain data. +type ChainDataIterator interface { + // Next returns the key-value pair for next exporting entry in the iterator. + // When the end is reached, it will return (0, nil, nil, false). + Next() (byte, []byte, []byte, bool) + + // Release releases associated resources. Release should always succeed and can + // be called multiple times without causing error. + Release() +} + +// ExportChaindata exports the given data type (truncating any data already present) +// in the file. If the suffix is 'gz', gzip compression is used. +func ExportChaindata(fn string, kind string, iter ChainDataIterator, interrupt chan struct{}) error { + log.Info("Exporting chain data", "file", fn, "kind", kind) + defer iter.Release() + + // Open the file handle and potentially wrap with a gzip stream + fh, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm) + if err != nil { + return err + } + defer fh.Close() + + var writer io.Writer = fh + if strings.HasSuffix(fn, ".gz") { + writer = gzip.NewWriter(writer) + defer writer.(*gzip.Writer).Close() + } + // Write the header + if err := rlp.Encode(writer, &exportHeader{ + Magic: exportMagic, + Version: 0, + Kind: kind, + UnixTime: uint64(time.Now().Unix()), + }); err != nil { + return err + } + // Extract data from source iterator and dump them out to file + var ( + count int64 + start = time.Now() + logged = time.Now() + ) + for { + op, key, val, ok := iter.Next() + if !ok { + break + } + if err := rlp.Encode(writer, op); err != nil { + return err + } + if err := rlp.Encode(writer, key); err != nil { + return err + } + if err := rlp.Encode(writer, val); err != nil { + return err + } + if count%1000 == 0 { + // Check interruption emitted by ctrl+c + select { + case <-interrupt: + log.Info("Chain data exporting interrupted", "file", fn, + "kind", kind, "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + return nil + default: + } + if time.Since(logged) > 8*time.Second { + log.Info("Exporting chain data", "file", fn, "kind", kind, + "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + count++ + } + log.Info("Exported chain data", "file", fn, "kind", kind, "count", count, + "elapsed", common.PrettyDuration(time.Since(start))) + return nil +} diff --git a/cmd/utils/export_test.go b/cmd/utils/export_test.go new file mode 100644 index 0000000000..a05121d28c --- /dev/null +++ b/cmd/utils/export_test.go @@ -0,0 +1,198 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of go-ethereum. +// +// 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 . + +package utils + +import ( + "fmt" + "os" + "strings" + "testing" + "time" + + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/rlp" +) + +// TestExport does basic sanity checks on the export/import functionality +func TestExport(t *testing.T) { + f := fmt.Sprintf("%v/tempdump", os.TempDir()) + defer func() { + os.Remove(f) + }() + testExport(t, f) +} + +func TestExportGzip(t *testing.T) { + f := fmt.Sprintf("%v/tempdump.gz", os.TempDir()) + defer func() { + os.Remove(f) + }() + testExport(t, f) +} + +type testIterator struct { + index int +} + +func newTestIterator() *testIterator { + return &testIterator{index: -1} +} + +func (iter *testIterator) Next() (byte, []byte, []byte, bool) { + if iter.index >= 999 { + return 0, nil, nil, false + } + iter.index += 1 + if iter.index == 42 { + iter.index += 1 + } + return OpBatchAdd, []byte(fmt.Sprintf("key-%04d", iter.index)), + []byte(fmt.Sprintf("value %d", iter.index)), true +} + +func (iter *testIterator) Release() {} + +func testExport(t *testing.T, f string) { + err := ExportChaindata(f, "testdata", newTestIterator(), make(chan struct{})) + if err != nil { + t.Fatal(err) + } + db := rawdb.NewMemoryDatabase() + err = ImportLDBData(db, f, 5, make(chan struct{})) + if err != nil { + t.Fatal(err) + } + // verify + for i := 0; i < 1000; i++ { + v, err := db.Get([]byte(fmt.Sprintf("key-%04d", i))) + if (i < 5 || i == 42) && err == nil { + t.Fatalf("expected no element at idx %d, got '%v'", i, string(v)) + } + if !(i < 5 || i == 42) { + if err != nil { + t.Fatalf("expected element idx %d: %v", i, err) + } + if have, want := string(v), fmt.Sprintf("value %d", i); have != want { + t.Fatalf("have %v, want %v", have, want) + } + } + } + v, err := db.Get([]byte(fmt.Sprintf("key-%04d", 1000))) + if err == nil { + t.Fatalf("expected no element at idx %d, got '%v'", 1000, string(v)) + } +} + +// testDeletion tests if the deletion markers can be exported/imported correctly +func TestDeletionExport(t *testing.T) { + f := fmt.Sprintf("%v/tempdump", os.TempDir()) + defer func() { + os.Remove(f) + }() + testDeletion(t, f) +} + +// TestDeletionExportGzip tests if the deletion markers can be exported/imported +// correctly with gz compression. +func TestDeletionExportGzip(t *testing.T) { + f := fmt.Sprintf("%v/tempdump.gz", os.TempDir()) + defer func() { + os.Remove(f) + }() + testDeletion(t, f) +} + +type deletionIterator struct { + index int +} + +func newDeletionIterator() *deletionIterator { + return &deletionIterator{index: -1} +} + +func (iter *deletionIterator) Next() (byte, []byte, []byte, bool) { + if iter.index >= 999 { + return 0, nil, nil, false + } + iter.index += 1 + if iter.index == 42 { + iter.index += 1 + } + return OpBatchDel, []byte(fmt.Sprintf("key-%04d", iter.index)), nil, true +} + +func (iter *deletionIterator) Release() {} + +func testDeletion(t *testing.T, f string) { + err := ExportChaindata(f, "testdata", newDeletionIterator(), make(chan struct{})) + if err != nil { + t.Fatal(err) + } + db := rawdb.NewMemoryDatabase() + for i := 0; i < 1000; i++ { + db.Put([]byte(fmt.Sprintf("key-%04d", i)), []byte(fmt.Sprintf("value %d", i))) + } + err = ImportLDBData(db, f, 5, make(chan struct{})) + if err != nil { + t.Fatal(err) + } + for i := 0; i < 1000; i++ { + v, err := db.Get([]byte(fmt.Sprintf("key-%04d", i))) + if i < 5 || i == 42 { + if err != nil { + t.Fatalf("expected element at idx %d, got '%v'", i, err) + } + if have, want := string(v), fmt.Sprintf("value %d", i); have != want { + t.Fatalf("have %v, want %v", have, want) + } + } + if !(i < 5 || i == 42) { + if err == nil { + t.Fatalf("expected no element idx %d: %v", i, string(v)) + } + } + } +} + +// TestImportFutureFormat tests that we reject unsupported future versions. +func TestImportFutureFormat(t *testing.T) { + f := fmt.Sprintf("%v/tempdump-future", os.TempDir()) + defer func() { + os.Remove(f) + }() + fh, err := os.OpenFile(f, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm) + if err != nil { + t.Fatal(err) + } + defer fh.Close() + if err := rlp.Encode(fh, &exportHeader{ + Magic: exportMagic, + Version: 500, + Kind: "testdata", + UnixTime: uint64(time.Now().Unix()), + }); err != nil { + t.Fatal(err) + } + db2 := rawdb.NewMemoryDatabase() + err = ImportLDBData(db2, f, 0, make(chan struct{})) + if err == nil { + t.Fatal("Expected error, got none") + } + if !strings.HasPrefix(err.Error(), "incompatible version") { + t.Fatalf("wrong error: %v", err) + } +} diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index c0db932dd7..40c8db4cc2 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -45,6 +45,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/catalyst" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/eth/gasprice" @@ -163,6 +164,10 @@ var ( Name: "bor-mainnet", Usage: "Bor mainnet", } + SepoliaFlag = cli.BoolFlag{ + Name: "sepolia", + Usage: "Sepolia network: pre-configured proof-of-work test network", + } DeveloperFlag = cli.BoolFlag{ Name: "dev", Usage: "Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled", @@ -171,6 +176,11 @@ var ( Name: "dev.period", Usage: "Block period to use in developer mode (0 = mine only if transaction pending)", } + DeveloperGasLimitFlag = cli.Uint64Flag{ + Name: "dev.gaslimit", + Usage: "Initial block gas limit", + Value: 11500000, + } IdentityFlag = cli.StringFlag{ Name: "identity", Usage: "Custom node name", @@ -213,7 +223,7 @@ var ( defaultSyncMode = ethconfig.Defaults.SyncMode SyncModeFlag = TextMarshalerFlag{ Name: "syncmode", - Usage: `Blockchain sync mode ("fast", "full", "snap" or "light")`, + Usage: `Blockchain sync mode ("snap", "full" or "light")`, Value: &defaultSyncMode, } GCModeFlag = cli.StringFlag{ @@ -243,9 +253,13 @@ var ( Usage: "Megabytes of memory allocated to bloom-filter for pruning", Value: 2048, } - OverrideLondonFlag = cli.Uint64Flag{ - Name: "override.london", - Usage: "Manually specify London fork-block, overriding the bundled setting", + OverrideArrowGlacierFlag = cli.Uint64Flag{ + Name: "override.arrowglacier", + Usage: "Manually specify Arrow Glacier fork-block, overriding the bundled setting", + } + OverrideTerminalTotalDifficulty = cli.Uint64Flag{ + Name: "override.terminaltotaldifficulty", + Usage: "Manually specify TerminalTotalDifficulty, overriding the bundled setting", } // Light server and client settings LightServeFlag = cli.IntFlag{ @@ -698,7 +712,7 @@ var ( } GpoMaxGasPriceFlag = cli.Int64Flag{ Name: "gpo.maxprice", - Usage: "Maximum gas price will be recommended by gpo", + Usage: "Maximum transaction priority fee (or gasprice before London fork) to be recommended by gpo", Value: ethconfig.Defaults.GPO.MaxPrice.Int64(), } GpoIgnoreGasPriceFlag = cli.Int64Flag{ @@ -814,6 +828,9 @@ func MakeDataDir(ctx *cli.Context) string { homeDir, _ := os.UserHomeDir() return filepath.Join(homeDir, "/.bor/data") } + if ctx.GlobalBool(SepoliaFlag.Name) { + return filepath.Join(path, "sepolia") + } return path } Fatalf("Cannot determine default data directory, please set manually (--datadir)") @@ -862,6 +879,8 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { urls = SplitAndTrim(ctx.GlobalString(BootnodesFlag.Name)) case ctx.GlobalBool(RopstenFlag.Name): urls = params.RopstenBootnodes + case ctx.GlobalBool(SepoliaFlag.Name): + urls = params.SepoliaBootnodes case ctx.GlobalBool(RinkebyFlag.Name): urls = params.RinkebyBootnodes case ctx.GlobalBool(GoerliFlag.Name): @@ -1202,7 +1221,7 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) { cfg.NetRestrict = list } - if ctx.GlobalBool(DeveloperFlag.Name) || ctx.GlobalBool(CatalystFlag.Name) { + if ctx.GlobalBool(DeveloperFlag.Name) { // --dev mode can't use p2p networking. cfg.MaxPeers = 0 cfg.ListenAddr = "" @@ -1295,6 +1314,8 @@ func setDataDir(ctx *cli.Context, cfg *node.Config) { case ctx.GlobalBool(BorMainnetFlag.Name) && cfg.DataDir == node.DefaultDataDir(): homeDir, _ := os.UserHomeDir() cfg.DataDir = filepath.Join(homeDir, "/.bor/data") + case ctx.GlobalBool(SepoliaFlag.Name) && cfg.DataDir == node.DefaultDataDir(): + cfg.DataDir = filepath.Join(node.DefaultDataDir(), "sepolia") } } @@ -1480,7 +1501,7 @@ func CheckExclusive(ctx *cli.Context, args ...interface{}) { // SetEthConfig applies eth-related command line flags to the config. func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { // Avoid conflicting network flags - CheckExclusive(ctx, MainnetFlag, DeveloperFlag, RopstenFlag, RinkebyFlag, GoerliFlag, MumbaiFlag, BorMainnetFlag) + CheckExclusive(ctx, MainnetFlag, DeveloperFlag, RopstenFlag, RinkebyFlag, GoerliFlag, MumbaiFlag, BorMainnetFlag, SepoliaFlag) CheckExclusive(ctx, LightServeFlag, SyncModeFlag, "light") CheckExclusive(ctx, DeveloperFlag, ExternalSignerFlag) // Can't use both ephemeral unlocked and external signer if ctx.GlobalString(GCModeFlag.Name) == "archive" && ctx.GlobalUint64(TxLookupLimitFlag.Name) != 0 { @@ -1628,6 +1649,12 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { } cfg.Genesis = core.DefaultRopstenGenesisBlock() SetDNSDiscoveryDefaults(cfg, params.RopstenGenesisHash) + case ctx.GlobalBool(SepoliaFlag.Name): + if !ctx.GlobalIsSet(NetworkIdFlag.Name) { + cfg.NetworkId = 11155111 + } + cfg.Genesis = core.DefaultSepoliaGenesisBlock() + SetDNSDiscoveryDefaults(cfg, params.SepoliaGenesisHash) case ctx.GlobalBool(RinkebyFlag.Name): if !ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = 4 @@ -1684,7 +1711,7 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { log.Info("Using developer account", "address", developer.Address) // Create a new developer genesis block or reuse existing one - cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), developer.Address) + cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), ctx.GlobalUint64(DeveloperGasLimitFlag.Name), developer.Address) if ctx.GlobalIsSet(DataDirFlag.Name) { // Check if we have an already initialized chain and fall back to // that if so. Otherwise we need to generate a new genesis spec. @@ -1723,13 +1750,18 @@ func SetDNSDiscoveryDefaults(cfg *ethconfig.Config, genesis common.Hash) { // RegisterEthService adds an Ethereum client to the stack. // The second return value is the full node instance, which may be nil if the // node is running as a light client. -func RegisterEthService(stack *node.Node, cfg *ethconfig.Config) (ethapi.Backend, *eth.Ethereum) { +func RegisterEthService(stack *node.Node, cfg *ethconfig.Config, isCatalyst bool) (ethapi.Backend, *eth.Ethereum) { if cfg.SyncMode == downloader.LightSync { backend, err := les.New(stack, cfg) if err != nil { Fatalf("Failed to register the Ethereum service: %v", err) } stack.RegisterAPIs(tracers.APIs(backend.ApiBackend)) + if isCatalyst { + if err := catalyst.RegisterLight(stack, backend); err != nil { + Fatalf("Failed to register the catalyst service: %v", err) + } + } return backend.ApiBackend, nil } backend, err := eth.New(stack, cfg) @@ -1742,6 +1774,11 @@ func RegisterEthService(stack *node.Node, cfg *ethconfig.Config) (ethapi.Backend Fatalf("Failed to create the LES server: %v", err) } } + if isCatalyst { + if err := catalyst.Register(stack, backend); err != nil { + Fatalf("Failed to register the catalyst service: %v", err) + } + } stack.RegisterAPIs(tracers.APIs(backend.APIBackend)) return backend.APIBackend, backend } @@ -1866,6 +1903,8 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { genesis = core.DefaultGenesisBlock() case ctx.GlobalBool(RopstenFlag.Name): genesis = core.DefaultRopstenGenesisBlock() + case ctx.GlobalBool(SepoliaFlag.Name): + genesis = core.DefaultSepoliaGenesisBlock() case ctx.GlobalBool(RinkebyFlag.Name): genesis = core.DefaultRinkebyGenesisBlock() case ctx.GlobalBool(GoerliFlag.Name): diff --git a/common/hexutil/hexutil.go b/common/hexutil/hexutil.go index 46223a2815..e0241f5f2b 100644 --- a/common/hexutil/hexutil.go +++ b/common/hexutil/hexutil.go @@ -176,13 +176,14 @@ func MustDecodeBig(input string) *big.Int { } // EncodeBig encodes bigint as a hex string with 0x prefix. -// The sign of the integer is ignored. func EncodeBig(bigint *big.Int) string { - nbits := bigint.BitLen() - if nbits == 0 { + if sign := bigint.Sign(); sign == 0 { return "0x0" + } else if sign > 0 { + return "0x" + bigint.Text(16) + } else { + return "-0x" + bigint.Text(16)[1:] } - return fmt.Sprintf("%#x", bigint) } func has0xPrefix(input string) bool { diff --git a/common/hexutil/hexutil_test.go b/common/hexutil/hexutil_test.go index ed6fccc3ca..f2b800d82c 100644 --- a/common/hexutil/hexutil_test.go +++ b/common/hexutil/hexutil_test.go @@ -201,3 +201,15 @@ func TestDecodeUint64(t *testing.T) { } } } + +func BenchmarkEncodeBig(b *testing.B) { + for _, bench := range encodeBigTests { + b.Run(bench.want, func(b *testing.B) { + b.ReportAllocs() + bigint := bench.input.(*big.Int) + for i := 0; i < b.N; i++ { + EncodeBig(bigint) + } + }) + } +} diff --git a/consensus/beacon/consensus.go b/consensus/beacon/consensus.go new file mode 100644 index 0000000000..9467fea67b --- /dev/null +++ b/consensus/beacon/consensus.go @@ -0,0 +1,376 @@ +// Copyright 2021 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 . + +package beacon + +import ( + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/trie" +) + +// Proof-of-stake protocol constants. +var ( + beaconDifficulty = common.Big0 // The default block difficulty in the beacon consensus + beaconNonce = types.EncodeNonce(0) // The default block nonce in the beacon consensus +) + +// Various error messages to mark blocks invalid. These should be private to +// prevent engine specific errors from being referenced in the remainder of the +// codebase, inherently breaking if the engine is swapped out. Please put common +// error types into the consensus package. +var ( + errTooManyUncles = errors.New("too many uncles") + errInvalidMixDigest = errors.New("invalid mix digest") + errInvalidNonce = errors.New("invalid nonce") + errInvalidUncleHash = errors.New("invalid uncle hash") +) + +// Beacon is a consensus engine that combines the eth1 consensus and proof-of-stake +// algorithm. There is a special flag inside to decide whether to use legacy consensus +// rules or new rules. The transition rule is described in the eth1/2 merge spec. +// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-3675.md +// +// The beacon here is a half-functional consensus engine with partial functions which +// is only used for necessary consensus checks. The legacy consensus engine can be any +// engine implements the consensus interface (except the beacon itself). +type Beacon struct { + ethone consensus.Engine // Original consensus engine used in eth1, e.g. ethash or clique +} + +// New creates a consensus engine with the given embedded eth1 engine. +func New(ethone consensus.Engine) *Beacon { + if _, ok := ethone.(*Beacon); ok { + panic("nested consensus engine") + } + return &Beacon{ethone: ethone} +} + +// Author implements consensus.Engine, returning the verified author of the block. +func (beacon *Beacon) Author(header *types.Header) (common.Address, error) { + if !beacon.IsPoSHeader(header) { + return beacon.ethone.Author(header) + } + return header.Coinbase, nil +} + +// VerifyHeader checks whether a header conforms to the consensus rules of the +// stock Ethereum consensus engine. +func (beacon *Beacon) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error { + reached, _ := IsTTDReached(chain, header.ParentHash, header.Number.Uint64()-1) + if !reached { + return beacon.ethone.VerifyHeader(chain, header, seal) + } + // Short circuit if the parent is not known + parent := chain.GetHeader(header.ParentHash, header.Number.Uint64()-1) + if parent == nil { + return consensus.ErrUnknownAncestor + } + // Sanity checks passed, do a proper verification + return beacon.verifyHeader(chain, header, parent) +} + +// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers +// concurrently. The method returns a quit channel to abort the operations and +// a results channel to retrieve the async verifications. +// VerifyHeaders expect the headers to be ordered and continuous. +func (beacon *Beacon) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) { + if !beacon.IsPoSHeader(headers[len(headers)-1]) { + return beacon.ethone.VerifyHeaders(chain, headers, seals) + } + var ( + preHeaders []*types.Header + postHeaders []*types.Header + preSeals []bool + ) + for index, header := range headers { + if beacon.IsPoSHeader(header) { + preHeaders = headers[:index] + postHeaders = headers[index:] + preSeals = seals[:index] + break + } + } + // All the headers have passed the transition point, use new rules. + if len(preHeaders) == 0 { + return beacon.verifyHeaders(chain, headers, nil) + } + // The transition point exists in the middle, separate the headers + // into two batches and apply different verification rules for them. + var ( + abort = make(chan struct{}) + results = make(chan error, len(headers)) + ) + go func() { + var ( + old, new, out = 0, len(preHeaders), 0 + errors = make([]error, len(headers)) + done = make([]bool, len(headers)) + oldDone, oldResult = beacon.ethone.VerifyHeaders(chain, preHeaders, preSeals) + newDone, newResult = beacon.verifyHeaders(chain, postHeaders, preHeaders[len(preHeaders)-1]) + ) + for { + for ; done[out]; out++ { + results <- errors[out] + if out == len(headers)-1 { + return + } + } + select { + case err := <-oldResult: + errors[old], done[old] = err, true + old++ + case err := <-newResult: + errors[new], done[new] = err, true + new++ + case <-abort: + close(oldDone) + close(newDone) + return + } + } + }() + return abort, results +} + +// VerifyUncles verifies that the given block's uncles conform to the consensus +// rules of the Ethereum consensus engine. +func (beacon *Beacon) VerifyUncles(chain consensus.ChainReader, block *types.Block) error { + if !beacon.IsPoSHeader(block.Header()) { + return beacon.ethone.VerifyUncles(chain, block) + } + // Verify that there is no uncle block. It's explicitly disabled in the beacon + if len(block.Uncles()) > 0 { + return errTooManyUncles + } + return nil +} + +// verifyHeader checks whether a header conforms to the consensus rules of the +// stock Ethereum consensus engine. The difference between the beacon and classic is +// (a) The following fields are expected to be constants: +// - difficulty is expected to be 0 +// - nonce is expected to be 0 +// - unclehash is expected to be Hash(emptyHeader) +// to be the desired constants +// (b) the timestamp is not verified anymore +// (c) the extradata is limited to 32 bytes +func (beacon *Beacon) verifyHeader(chain consensus.ChainHeaderReader, header, parent *types.Header) error { + // Ensure that the header's extra-data section is of a reasonable size + if len(header.Extra) > 32 { + return fmt.Errorf("extra-data longer than 32 bytes (%d)", len(header.Extra)) + } + // Verify the seal parts. Ensure the mixhash, nonce and uncle hash are the expected value. + if header.MixDigest != (common.Hash{}) { + return errInvalidMixDigest + } + if header.Nonce != beaconNonce { + return errInvalidNonce + } + if header.UncleHash != types.EmptyUncleHash { + return errInvalidUncleHash + } + // Verify the block's difficulty to ensure it's the default constant + if beaconDifficulty.Cmp(header.Difficulty) != 0 { + return fmt.Errorf("invalid difficulty: have %v, want %v", header.Difficulty, beaconDifficulty) + } + // Verify that the gas limit is <= 2^63-1 + if header.GasLimit > params.MaxGasLimit { + return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, params.MaxGasLimit) + } + // Verify that the gasUsed is <= gasLimit + if header.GasUsed > header.GasLimit { + return fmt.Errorf("invalid gasUsed: have %d, gasLimit %d", header.GasUsed, header.GasLimit) + } + // Verify that the block number is parent's +1 + if diff := new(big.Int).Sub(header.Number, parent.Number); diff.Cmp(common.Big1) != 0 { + return consensus.ErrInvalidNumber + } + // Verify the header's EIP-1559 attributes. + return misc.VerifyEip1559Header(chain.Config(), parent, header) +} + +// verifyHeaders is similar to verifyHeader, but verifies a batch of headers +// concurrently. The method returns a quit channel to abort the operations and +// a results channel to retrieve the async verifications. An additional parent +// header will be passed if the relevant header is not in the database yet. +func (beacon *Beacon) verifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, ancestor *types.Header) (chan<- struct{}, <-chan error) { + var ( + abort = make(chan struct{}) + results = make(chan error, len(headers)) + ) + go func() { + for i, header := range headers { + var parent *types.Header + if i == 0 { + if ancestor != nil { + parent = ancestor + } else { + parent = chain.GetHeader(headers[0].ParentHash, headers[0].Number.Uint64()-1) + } + } else if headers[i-1].Hash() == headers[i].ParentHash { + parent = headers[i-1] + } + if parent == nil { + select { + case <-abort: + return + case results <- consensus.ErrUnknownAncestor: + } + continue + } + err := beacon.verifyHeader(chain, header, parent) + select { + case <-abort: + return + case results <- err: + } + } + }() + return abort, results +} + +// Prepare implements consensus.Engine, initializing the difficulty field of a +// header to conform to the beacon protocol. The changes are done inline. +func (beacon *Beacon) Prepare(chain consensus.ChainHeaderReader, header *types.Header) error { + // Transition isn't triggered yet, use the legacy rules for preparation. + reached, err := IsTTDReached(chain, header.ParentHash, header.Number.Uint64()-1) + if err != nil { + return err + } + if !reached { + return beacon.ethone.Prepare(chain, header) + } + header.Difficulty = beaconDifficulty + return nil +} + +// Finalize implements consensus.Engine, setting the final state on the header +func (beacon *Beacon) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header) { + // Finalize is different with Prepare, it can be used in both block generation + // and verification. So determine the consensus rules by header type. + if !beacon.IsPoSHeader(header) { + beacon.ethone.Finalize(chain, header, state, txs, uncles) + return + } + // The block reward is no longer handled here. It's done by the + // external consensus engine. + header.Root = state.IntermediateRoot(true) +} + +// FinalizeAndAssemble implements consensus.Engine, setting the final state and +// assembling the block. +func (beacon *Beacon) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { + // FinalizeAndAssemble is different with Prepare, it can be used in both block + // generation and verification. So determine the consensus rules by header type. + if !beacon.IsPoSHeader(header) { + return beacon.ethone.FinalizeAndAssemble(chain, header, state, txs, uncles, receipts) + } + // Finalize and assemble the block + beacon.Finalize(chain, header, state, txs, uncles) + return types.NewBlock(header, txs, uncles, receipts, trie.NewStackTrie(nil)), nil +} + +// Seal generates a new sealing request for the given input block and pushes +// the result into the given channel. +// +// Note, the method returns immediately and will send the result async. More +// than one result may also be returned depending on the consensus algorithm. +func (beacon *Beacon) Seal(chain consensus.ChainHeaderReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error { + if !beacon.IsPoSHeader(block.Header()) { + return beacon.ethone.Seal(chain, block, results, stop) + } + // The seal verification is done by the external consensus engine, + // return directly without pushing any block back. In another word + // beacon won't return any result by `results` channel which may + // blocks the receiver logic forever. + return nil +} + +// SealHash returns the hash of a block prior to it being sealed. +func (beacon *Beacon) SealHash(header *types.Header) common.Hash { + return beacon.ethone.SealHash(header) +} + +// CalcDifficulty is the difficulty adjustment algorithm. It returns +// the difficulty that a new block should have when created at time +// given the parent block's time and difficulty. +func (beacon *Beacon) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64, parent *types.Header) *big.Int { + // Transition isn't triggered yet, use the legacy rules for calculation + if reached, _ := IsTTDReached(chain, parent.Hash(), parent.Number.Uint64()); !reached { + return beacon.ethone.CalcDifficulty(chain, time, parent) + } + return beaconDifficulty +} + +// APIs implements consensus.Engine, returning the user facing RPC APIs. +func (beacon *Beacon) APIs(chain consensus.ChainHeaderReader) []rpc.API { + return beacon.ethone.APIs(chain) +} + +// Close shutdowns the consensus engine +func (beacon *Beacon) Close() error { + return beacon.ethone.Close() +} + +// IsPoSHeader reports the header belongs to the PoS-stage with some special fields. +// This function is not suitable for a part of APIs like Prepare or CalcDifficulty +// because the header difficulty is not set yet. +func (beacon *Beacon) IsPoSHeader(header *types.Header) bool { + if header.Difficulty == nil { + panic("IsPoSHeader called with invalid difficulty") + } + return header.Difficulty.Cmp(beaconDifficulty) == 0 +} + +// InnerEngine returns the embedded eth1 consensus engine. +func (beacon *Beacon) InnerEngine() consensus.Engine { + return beacon.ethone +} + +// SetThreads updates the mining threads. Delegate the call +// to the eth1 engine if it's threaded. +func (beacon *Beacon) SetThreads(threads int) { + type threaded interface { + SetThreads(threads int) + } + if th, ok := beacon.ethone.(threaded); ok { + th.SetThreads(threads) + } +} + +// IsTTDReached checks if the TotalTerminalDifficulty has been surpassed on the `parentHash` block. +// It depends on the parentHash already being stored in the database. +// If the parentHash is not stored in the database a UnknownAncestor error is returned. +func IsTTDReached(chain consensus.ChainHeaderReader, parentHash common.Hash, number uint64) (bool, error) { + if chain.Config().TerminalTotalDifficulty == nil { + return false, nil + } + td := chain.GetTd(parentHash, number) + if td == nil { + return false, consensus.ErrUnknownAncestor + } + return td.Cmp(chain.Config().TerminalTotalDifficulty) >= 0, nil +} diff --git a/consensus/clique/api.go b/consensus/clique/api.go index 6129b5cc52..cb270d321d 100644 --- a/consensus/clique/api.go +++ b/consensus/clique/api.go @@ -196,7 +196,11 @@ func (sb *blockNumberOrHashOrRLP) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &input); err != nil { return err } - sb.RLP = hexutil.MustDecode(input) + blob, err := hexutil.Decode(input) + if err != nil { + return err + } + sb.RLP = blob return nil } @@ -214,6 +218,9 @@ func (api *API) GetSigner(rlpOrBlockNr *blockNumberOrHashOrRLP) (common.Address, } else if number, ok := blockNrOrHash.Number(); ok { header = api.chain.GetHeaderByNumber(uint64(number.Int64())) } + if header == nil { + return common.Address{}, fmt.Errorf("missing block %v", blockNrOrHash.String()) + } return api.clique.Author(header) } block := new(types.Block) diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index a6a16c84af..685186817d 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -295,9 +295,8 @@ func (c *Clique) verifyHeader(chain consensus.ChainHeaderReader, header *types.H } } // Verify that the gas limit is <= 2^63-1 - cap := uint64(0x7fffffffffffffff) - if header.GasLimit > cap { - return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, cap) + if header.GasLimit > params.MaxGasLimit { + return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, params.MaxGasLimit) } // If all checks passed, validate any special fields for hard forks if err := misc.VerifyForkHashes(chain.Config(), header, false); err != nil { @@ -600,8 +599,7 @@ func (c *Clique) Seal(chain consensus.ChainHeaderReader, block *types.Block, res } // For 0-period chains, refuse to seal empty blocks (no reward but would spin sealing) if c.config.Period == 0 && len(block.Transactions()) == 0 { - log.Info("Sealing paused, waiting for transactions") - return nil + return errors.New("sealing paused while waiting for transactions") } // Don't hold the signer fields for the entire sealing procedure c.lock.RLock() @@ -621,8 +619,7 @@ func (c *Clique) Seal(chain consensus.ChainHeaderReader, block *types.Block, res if recent == signer { // Signer is among recents, only wait if the current block doesn't shift it out if limit := uint64(len(snap.Signers)/2 + 1); number < limit || seen > number-limit { - log.Info("Signed recently, must wait for others") - return nil + return errors.New("signed recently, must wait for others") } } } diff --git a/consensus/consensus.go b/consensus/consensus.go index 2a5aac945d..af8ce98ff3 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -44,6 +44,9 @@ type ChainHeaderReader interface { // GetHeaderByHash retrieves a block header from the database by its hash. GetHeaderByHash(hash common.Hash) *types.Header + + // GetTd retrieves the total difficulty from the database by hash and number. + GetTd(hash common.Hash, number uint64) *big.Int } // ChainReader defines a small collection of methods needed to access the local diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index 6ad9fc22be..7dec436a26 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -45,6 +45,11 @@ var ( maxUncles = 2 // Maximum number of uncles allowed in a single block allowedFutureBlockTimeSeconds = int64(15) // Max seconds from current time allowed for blocks, before they're considered future blocks + // calcDifficultyEip4345 is the difficulty adjustment algorithm as specified by EIP 4345. + // It offsets the bomb a total of 10.7M blocks. + // Specification EIP-4345: https://eips.ethereum.org/EIPS/eip-4345 + calcDifficultyEip4345 = makeDifficultyCalculator(big.NewInt(10_700_000)) + // calcDifficultyEip3554 is the difficulty adjustment algorithm as specified by EIP 3554. // It offsets the bomb a total of 9.7M blocks. // Specification EIP-3554: https://eips.ethereum.org/EIPS/eip-3554 @@ -276,9 +281,8 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainHeaderReader, header, pa return fmt.Errorf("invalid difficulty: have %v, want %v", header.Difficulty, expected) } // Verify that the gas limit is <= 2^63-1 - cap := uint64(0x7fffffffffffffff) - if header.GasLimit > cap { - return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, cap) + if header.GasLimit > params.MaxGasLimit { + return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, params.MaxGasLimit) } // Verify that the gasUsed is <= gasLimit if header.GasUsed > header.GasLimit { @@ -330,6 +334,8 @@ func (ethash *Ethash) CalcDifficulty(chain consensus.ChainHeaderReader, time uin func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int { next := new(big.Int).Add(parent.Number, big1) switch { + case config.IsArrowGlacier(next): + return calcDifficultyEip4345(time, parent) case config.IsLondon(next): return calcDifficultyEip3554(time, parent) case config.IsMuirGlacier(next): diff --git a/consensus/ethash/ethash.go b/consensus/ethash/ethash.go index ec06d02a54..4e33d99c8d 100644 --- a/consensus/ethash/ethash.go +++ b/consensus/ethash/ethash.go @@ -136,13 +136,16 @@ func memoryMapAndGenerate(path string, size uint64, lock bool, generator func(bu if err != nil { return nil, nil, nil, err } - if err = dump.Truncate(int64(len(dumpMagic))*4 + int64(size)); err != nil { + if err = ensureSize(dump, int64(len(dumpMagic))*4+int64(size)); err != nil { + dump.Close() + os.Remove(temp) return nil, nil, nil, err } // Memory map the file for writing and fill it with the generator mem, buffer, err := memoryMapFile(dump, true) if err != nil { dump.Close() + os.Remove(temp) return nil, nil, nil, err } copy(buffer, dumpMagic) @@ -358,7 +361,7 @@ func (d *dataset) generate(dir string, limit int, lock bool, test bool) { if err != nil { logger.Error("Failed to generate mapped ethash dataset", "err", err) - d.dataset = make([]uint32, dsize/2) + d.dataset = make([]uint32, dsize/4) generateDataset(d.dataset, d.epoch, cache) } // Iterate over all previous instances and delete old ones diff --git a/consensus/ethash/mmap_help_linux.go b/consensus/ethash/mmap_help_linux.go new file mode 100644 index 0000000000..b40a1dd25c --- /dev/null +++ b/consensus/ethash/mmap_help_linux.go @@ -0,0 +1,35 @@ +// Copyright 2021 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 . + +//go:build linux +// +build linux + +package ethash + +import ( + "os" + + "golang.org/x/sys/unix" +) + +// ensureSize expands the file to the given size. This is to prevent runtime +// errors later on, if the underlying file expands beyond the disk capacity, +// even though it ostensibly is already expanded, but due to being sparse +// does not actually occupy the full declared size on disk. +func ensureSize(f *os.File, size int64) error { + // Docs: https://www.man7.org/linux/man-pages/man2/fallocate.2.html + return unix.Fallocate(int(f.Fd()), 0, 0, size) +} diff --git a/consensus/ethash/mmap_help_other.go b/consensus/ethash/mmap_help_other.go new file mode 100644 index 0000000000..8ad514ce42 --- /dev/null +++ b/consensus/ethash/mmap_help_other.go @@ -0,0 +1,36 @@ +// Copyright 2021 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 . + +//go:build !linux +// +build !linux + +package ethash + +import ( + "os" +) + +// ensureSize expands the file to the given size. This is to prevent runtime +// errors later on, if the underlying file expands beyond the disk capacity, +// even though it ostensibly is already expanded, but due to being sparse +// does not actually occupy the full declared size on disk. +func ensureSize(f *os.File, size int64) error { + // On systems which do not support fallocate, we merely truncate it. + // More robust alternatives would be to + // - Use posix_fallocate, or + // - explicitly fill the file with zeroes. + return f.Truncate(size) +} diff --git a/consensus/merger.go b/consensus/merger.go new file mode 100644 index 0000000000..ffbcbf2b85 --- /dev/null +++ b/consensus/merger.go @@ -0,0 +1,110 @@ +// Copyright 2021 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 . + +package consensus + +import ( + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" +) + +// transitionStatus describes the status of eth1/2 transition. This switch +// between modes is a one-way action which is triggered by corresponding +// consensus-layer message. +type transitionStatus struct { + LeftPoW bool // The flag is set when the first NewHead message received + EnteredPoS bool // The flag is set when the first FinalisedBlock message received +} + +// Merger is an internal help structure used to track the eth1/2 transition status. +// It's a common structure can be used in both full node and light client. +type Merger struct { + db ethdb.KeyValueStore + status transitionStatus + mu sync.RWMutex +} + +// NewMerger creates a new Merger which stores its transition status in the provided db. +func NewMerger(db ethdb.KeyValueStore) *Merger { + var status transitionStatus + blob := rawdb.ReadTransitionStatus(db) + if len(blob) != 0 { + if err := rlp.DecodeBytes(blob, &status); err != nil { + log.Crit("Failed to decode the transition status", "err", err) + } + } + return &Merger{ + db: db, + status: status, + } +} + +// ReachTTD is called whenever the first NewHead message received +// from the consensus-layer. +func (m *Merger) ReachTTD() { + m.mu.Lock() + defer m.mu.Unlock() + + if m.status.LeftPoW { + return + } + m.status = transitionStatus{LeftPoW: true} + blob, err := rlp.EncodeToBytes(m.status) + if err != nil { + panic(fmt.Sprintf("Failed to encode the transition status: %v", err)) + } + rawdb.WriteTransitionStatus(m.db, blob) + log.Info("Left PoW stage") +} + +// FinalizePoS is called whenever the first FinalisedBlock message received +// from the consensus-layer. +func (m *Merger) FinalizePoS() { + m.mu.Lock() + defer m.mu.Unlock() + + if m.status.EnteredPoS { + return + } + m.status = transitionStatus{LeftPoW: true, EnteredPoS: true} + blob, err := rlp.EncodeToBytes(m.status) + if err != nil { + panic(fmt.Sprintf("Failed to encode the transition status: %v", err)) + } + rawdb.WriteTransitionStatus(m.db, blob) + log.Info("Entered PoS stage") +} + +// TDDReached reports whether the chain has left the PoW stage. +func (m *Merger) TDDReached() bool { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.status.LeftPoW +} + +// PoSFinalized reports whether the chain has entered the PoS stage. +func (m *Merger) PoSFinalized() bool { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.status.EnteredPoS +} diff --git a/console/console.go b/console/console.go index dd39300d0a..ab26bd64f7 100644 --- a/console/console.go +++ b/console/console.go @@ -17,6 +17,7 @@ package console import ( + "errors" "fmt" "io" "io/ioutil" @@ -26,6 +27,7 @@ import ( "regexp" "sort" "strings" + "sync" "syscall" "github.com/dop251/goja" @@ -74,6 +76,13 @@ type Console struct { histPath string // Absolute path to the console scrollback history history []string // Scroll history maintained by the console printer io.Writer // Output writer to serialize any display strings to + + interactiveStopped chan struct{} + stopInteractiveCh chan struct{} + signalReceived chan struct{} + stopped chan struct{} + wg sync.WaitGroup + stopOnce sync.Once } // New initializes a JavaScript interpreted runtime environment and sets defaults @@ -92,12 +101,16 @@ func New(config Config) (*Console, error) { // Initialize the console and return console := &Console{ - client: config.Client, - jsre: jsre.New(config.DocRoot, config.Printer), - prompt: config.Prompt, - prompter: config.Prompter, - printer: config.Printer, - histPath: filepath.Join(config.DataDir, HistoryFile), + client: config.Client, + jsre: jsre.New(config.DocRoot, config.Printer), + prompt: config.Prompt, + prompter: config.Prompter, + printer: config.Printer, + histPath: filepath.Join(config.DataDir, HistoryFile), + interactiveStopped: make(chan struct{}), + stopInteractiveCh: make(chan struct{}), + signalReceived: make(chan struct{}, 1), + stopped: make(chan struct{}), } if err := os.MkdirAll(config.DataDir, 0700); err != nil { return nil, err @@ -105,6 +118,10 @@ func New(config Config) (*Console, error) { if err := console.init(config.Preload); err != nil { return nil, err } + + console.wg.Add(1) + go console.interruptHandler() + return console, nil } @@ -337,9 +354,63 @@ func (c *Console) Evaluate(statement string) { } }() c.jsre.Evaluate(statement, c.printer) + + // Avoid exiting Interactive when jsre was interrupted by SIGINT. + c.clearSignalReceived() +} + +// interruptHandler runs in its own goroutine and waits for signals. +// When a signal is received, it interrupts the JS interpreter. +func (c *Console) interruptHandler() { + defer c.wg.Done() + + // During Interactive, liner inhibits the signal while it is prompting for + // input. However, the signal will be received while evaluating JS. + // + // On unsupported terminals, SIGINT can also happen while prompting. + // Unfortunately, it is not possible to abort the prompt in this case and + // the c.readLines goroutine leaks. + sig := make(chan os.Signal, 1) + signal.Notify(sig, syscall.SIGINT) + defer signal.Stop(sig) + + for { + select { + case <-sig: + c.setSignalReceived() + c.jsre.Interrupt(errors.New("interrupted")) + case <-c.stopInteractiveCh: + close(c.interactiveStopped) + c.jsre.Interrupt(errors.New("interrupted")) + case <-c.stopped: + return + } + } +} + +func (c *Console) setSignalReceived() { + select { + case c.signalReceived <- struct{}{}: + default: + } +} + +func (c *Console) clearSignalReceived() { + select { + case <-c.signalReceived: + default: + } } -// Interactive starts an interactive user session, where input is propted from +// StopInteractive causes Interactive to return as soon as possible. +func (c *Console) StopInteractive() { + select { + case c.stopInteractiveCh <- struct{}{}: + case <-c.stopped: + } +} + +// Interactive starts an interactive user session, where in.put is propted from // the configured user prompter. func (c *Console) Interactive() { var ( @@ -349,15 +420,11 @@ func (c *Console) Interactive() { inputLine = make(chan string, 1) // receives user input inputErr = make(chan error, 1) // receives liner errors requestLine = make(chan string) // requests a line of input - interrupt = make(chan os.Signal, 1) ) - // Monitor Ctrl-C. While liner does turn on the relevant terminal mode bits to avoid - // the signal, a signal can still be received for unsupported terminals. Unfortunately - // there is no way to cancel the line reader when this happens. The readLines - // goroutine will be leaked in this case. - signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM) - defer signal.Stop(interrupt) + defer func() { + c.writeHistory() + }() // The line reader runs in a separate goroutine. go c.readLines(inputLine, inputErr, requestLine) @@ -368,7 +435,14 @@ func (c *Console) Interactive() { requestLine <- prompt select { - case <-interrupt: + case <-c.interactiveStopped: + fmt.Fprintln(c.printer, "node is down, exiting console") + return + + case <-c.signalReceived: + // SIGINT received while prompting for input -> unsupported terminal. + // I'm not sure if the best choice would be to leave the console running here. + // Bash keeps running in this case. node.js does not. fmt.Fprintln(c.printer, "caught interrupt, exiting") return @@ -476,12 +550,19 @@ func (c *Console) Execute(path string) error { // Stop cleans up the console and terminates the runtime environment. func (c *Console) Stop(graceful bool) error { + c.stopOnce.Do(func() { + // Stop the interrupt handler. + close(c.stopped) + c.wg.Wait() + }) + + c.jsre.Stop(graceful) + return nil +} + +func (c *Console) writeHistory() error { if err := ioutil.WriteFile(c.histPath, []byte(strings.Join(c.history, "\n")), 0600); err != nil { return err } - if err := os.Chmod(c.histPath, 0600); err != nil { // Force 0600, even if it was different previously - return err - } - c.jsre.Stop(graceful) - return nil + return os.Chmod(c.histPath, 0600) // Force 0600, even if it was different previously } diff --git a/console/console_test.go b/console/console_test.go index f6ab781410..71c80c20fa 100644 --- a/console/console_test.go +++ b/console/console_test.go @@ -99,7 +99,7 @@ func newTester(t *testing.T, confOverride func(*ethconfig.Config)) *tester { t.Fatalf("failed to create node: %v", err) } ethConf := ðconfig.Config{ - Genesis: core.DeveloperGenesisBlock(15, common.Address{}), + Genesis: core.DeveloperGenesisBlock(15, 11_500_000, common.Address{}), Miner: miner.Config{ Etherbase: common.HexToAddress(testAddress), }, diff --git a/core/asm/lexer.go b/core/asm/lexer.go index 21cc8c4658..ed367939d7 100644 --- a/core/asm/lexer.go +++ b/core/asm/lexer.go @@ -68,10 +68,10 @@ func (it tokenType) String() string { var stringtokenTypes = []string{ eof: "EOF", + lineStart: "new line", + lineEnd: "end of line", invalidStatement: "invalid statement", element: "element", - lineEnd: "end of line", - lineStart: "new line", label: "label", labelDef: "label definition", number: "number", diff --git a/core/bench_test.go b/core/bench_test.go index ce288d372e..959979763d 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -75,7 +75,7 @@ var ( // This is the content of the genesis block used by the benchmarks. benchRootKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") benchRootAddr = crypto.PubkeyToAddress(benchRootKey.PublicKey) - benchRootFunds = math.BigPow(2, 100) + benchRootFunds = math.BigPow(2, 200) ) // genValueTx returns a block generator that includes a single @@ -86,7 +86,19 @@ func genValueTx(nbytes int) func(int, *BlockGen) { toaddr := common.Address{} data := make([]byte, nbytes) gas, _ := IntrinsicGas(data, nil, false, false, false) - tx, _ := types.SignTx(types.NewTransaction(gen.TxNonce(benchRootAddr), toaddr, big.NewInt(1), gas, nil, data), types.HomesteadSigner{}, benchRootKey) + signer := types.MakeSigner(gen.config, big.NewInt(int64(i))) + gasPrice := big.NewInt(0) + if gen.header.BaseFee != nil { + gasPrice = gen.header.BaseFee + } + tx, _ := types.SignNewTx(benchRootKey, signer, &types.LegacyTx{ + Nonce: gen.TxNonce(benchRootAddr), + To: &toaddr, + Value: big.NewInt(1), + Gas: gas, + Data: data, + GasPrice: gasPrice, + }) gen.AddTx(tx) } } @@ -110,24 +122,38 @@ func init() { // and fills the blocks with many small transactions. func genTxRing(naccounts int) func(int, *BlockGen) { from := 0 + availableFunds := new(big.Int).Set(benchRootFunds) return func(i int, gen *BlockGen) { block := gen.PrevBlock(i - 1) gas := block.GasLimit() + gasPrice := big.NewInt(0) + if gen.header.BaseFee != nil { + gasPrice = gen.header.BaseFee + } + signer := types.MakeSigner(gen.config, big.NewInt(int64(i))) for { gas -= params.TxGas if gas < params.TxGas { break } to := (from + 1) % naccounts - tx := types.NewTransaction( - gen.TxNonce(ringAddrs[from]), - ringAddrs[to], - benchRootFunds, - params.TxGas, - nil, - nil, - ) - tx, _ = types.SignTx(tx, types.HomesteadSigner{}, ringKeys[from]) + burn := new(big.Int).SetUint64(params.TxGas) + burn.Mul(burn, gen.header.BaseFee) + availableFunds.Sub(availableFunds, burn) + if availableFunds.Cmp(big.NewInt(1)) < 0 { + panic("not enough funds") + } + tx, err := types.SignNewTx(ringKeys[from], signer, + &types.LegacyTx{ + Nonce: gen.TxNonce(ringAddrs[from]), + To: &ringAddrs[to], + Value: availableFunds, + Gas: params.TxGas, + GasPrice: gasPrice, + }) + if err != nil { + panic(err) + } gen.AddTx(tx) from = to } @@ -245,6 +271,7 @@ func makeChainForBench(db ethdb.Database, full bool, count uint64) { block := types.NewBlockWithHeader(header) rawdb.WriteBody(db, hash, n, block.Body()) rawdb.WriteReceipts(db, hash, n, nil) + rawdb.WriteHeadBlockHash(db, hash) } } } @@ -278,6 +305,8 @@ func benchReadChain(b *testing.B, full bool, count uint64) { } makeChainForBench(db, full, count) db.Close() + cacheConfig := *defaultCacheConfig + cacheConfig.TrieDirtyDisabled = true b.ReportAllocs() b.ResetTimer() @@ -287,7 +316,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { if err != nil { b.Fatalf("error opening database at %v: %v", dir, err) } - chain, err := NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil) + chain, err := NewBlockChain(db, &cacheConfig, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil) if err != nil { b.Fatalf("error creating chain: %v", err) } diff --git a/core/block_validator_test.go b/core/block_validator_test.go index 86f9835a01..0f183ba527 100644 --- a/core/block_validator_test.go +++ b/core/block_validator_test.go @@ -17,14 +17,21 @@ package core import ( + "encoding/json" + "math/big" "runtime" "testing" "time" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/beacon" + "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core/rawdb" "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/params" ) @@ -76,6 +83,172 @@ func TestHeaderVerification(t *testing.T) { } } +func TestHeaderVerificationForMergingClique(t *testing.T) { testHeaderVerificationForMerging(t, true) } +func TestHeaderVerificationForMergingEthash(t *testing.T) { testHeaderVerificationForMerging(t, false) } + +// Tests the verification for eth1/2 merging, including pre-merge and post-merge +func testHeaderVerificationForMerging(t *testing.T, isClique bool) { + var ( + testdb = rawdb.NewMemoryDatabase() + preBlocks []*types.Block + postBlocks []*types.Block + runEngine consensus.Engine + chainConfig *params.ChainConfig + merger = consensus.NewMerger(rawdb.NewMemoryDatabase()) + ) + if isClique { + var ( + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr = crypto.PubkeyToAddress(key.PublicKey) + engine = clique.New(params.AllCliqueProtocolChanges.Clique, testdb) + ) + genspec := &Genesis{ + ExtraData: make([]byte, 32+common.AddressLength+crypto.SignatureLength), + Alloc: map[common.Address]GenesisAccount{ + addr: {Balance: big.NewInt(1)}, + }, + BaseFee: big.NewInt(params.InitialBaseFee), + } + copy(genspec.ExtraData[32:], addr[:]) + genesis := genspec.MustCommit(testdb) + + genEngine := beacon.New(engine) + preBlocks, _ = GenerateChain(params.AllCliqueProtocolChanges, genesis, genEngine, testdb, 8, nil) + td := 0 + for i, block := range preBlocks { + header := block.Header() + if i > 0 { + header.ParentHash = preBlocks[i-1].Hash() + } + header.Extra = make([]byte, 32+crypto.SignatureLength) + header.Difficulty = big.NewInt(2) + + sig, _ := crypto.Sign(genEngine.SealHash(header).Bytes(), key) + copy(header.Extra[len(header.Extra)-crypto.SignatureLength:], sig) + preBlocks[i] = block.WithSeal(header) + // calculate td + td += int(block.Difficulty().Uint64()) + } + config := *params.AllCliqueProtocolChanges + config.TerminalTotalDifficulty = big.NewInt(int64(td)) + postBlocks, _ = GenerateChain(&config, preBlocks[len(preBlocks)-1], genEngine, testdb, 8, nil) + chainConfig = &config + runEngine = beacon.New(engine) + } else { + gspec := &Genesis{Config: params.TestChainConfig} + genesis := gspec.MustCommit(testdb) + genEngine := beacon.New(ethash.NewFaker()) + + preBlocks, _ = GenerateChain(params.TestChainConfig, genesis, genEngine, testdb, 8, nil) + td := 0 + for _, block := range preBlocks { + // calculate td + td += int(block.Difficulty().Uint64()) + } + config := *params.TestChainConfig + config.TerminalTotalDifficulty = big.NewInt(int64(td)) + postBlocks, _ = GenerateChain(params.TestChainConfig, preBlocks[len(preBlocks)-1], genEngine, testdb, 8, nil) + + chainConfig = &config + runEngine = beacon.New(ethash.NewFaker()) + } + + preHeaders := make([]*types.Header, len(preBlocks)) + for i, block := range preBlocks { + preHeaders[i] = block.Header() + + blob, _ := json.Marshal(block.Header()) + t.Logf("Log header before the merging %d: %v", block.NumberU64(), string(blob)) + } + postHeaders := make([]*types.Header, len(postBlocks)) + for i, block := range postBlocks { + postHeaders[i] = block.Header() + + blob, _ := json.Marshal(block.Header()) + t.Logf("Log header after the merging %d: %v", block.NumberU64(), string(blob)) + } + // Run the header checker for blocks one-by-one, checking for both valid and invalid nonces + chain, _ := NewBlockChain(testdb, nil, chainConfig, runEngine, vm.Config{}, nil, nil) + defer chain.Stop() + + // Verify the blocks before the merging + for i := 0; i < len(preBlocks); i++ { + _, results := runEngine.VerifyHeaders(chain, []*types.Header{preHeaders[i]}, []bool{true}) + // Wait for the verification result + select { + case result := <-results: + if result != nil { + t.Errorf("test %d: verification failed %v", i, result) + } + case <-time.After(time.Second): + t.Fatalf("test %d: verification timeout", i) + } + // Make sure no more data is returned + select { + case result := <-results: + t.Fatalf("test %d: unexpected result returned: %v", i, result) + case <-time.After(25 * time.Millisecond): + } + chain.InsertChain(preBlocks[i : i+1]) + } + + // Make the transition + merger.ReachTTD() + merger.FinalizePoS() + + // Verify the blocks after the merging + for i := 0; i < len(postBlocks); i++ { + _, results := runEngine.VerifyHeaders(chain, []*types.Header{postHeaders[i]}, []bool{true}) + // Wait for the verification result + select { + case result := <-results: + if result != nil { + t.Errorf("test %d: verification failed %v", i, result) + } + case <-time.After(time.Second): + t.Fatalf("test %d: verification timeout", i) + } + // Make sure no more data is returned + select { + case result := <-results: + t.Fatalf("test %d: unexpected result returned: %v", i, result) + case <-time.After(25 * time.Millisecond): + } + chain.InsertBlockWithoutSetHead(postBlocks[i]) + } + + // Verify the blocks with pre-merge blocks and post-merge blocks + var ( + headers []*types.Header + seals []bool + ) + for _, block := range preBlocks { + headers = append(headers, block.Header()) + seals = append(seals, true) + } + for _, block := range postBlocks { + headers = append(headers, block.Header()) + seals = append(seals, true) + } + _, results := runEngine.VerifyHeaders(chain, headers, seals) + for i := 0; i < len(headers); i++ { + select { + case result := <-results: + if result != nil { + t.Errorf("test %d: verification failed %v", i, result) + } + case <-time.After(time.Second): + t.Fatalf("test %d: verification timeout", i) + } + } + // Make sure no more data is returned + select { + case result := <-results: + t.Fatalf("unexpected result returned: %v", result) + case <-time.After(25 * time.Millisecond): + } +} + // Tests that concurrent header verification works, for both good and bad blocks. func TestHeaderConcurrentVerification2(t *testing.T) { testHeaderConcurrentVerification(t, 2) } func TestHeaderConcurrentVerification8(t *testing.T) { testHeaderConcurrentVerification(t, 8) } diff --git a/core/blockchain.go b/core/blockchain.go index 05108a9c6b..88f4dd593e 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -22,7 +22,6 @@ import ( "fmt" "io" "math/big" - mrand "math/rand" "sort" "sync" "sync/atomic" @@ -43,7 +42,6 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" lru "github.com/hashicorp/golang-lru" ) @@ -209,10 +207,9 @@ type BlockChain struct { validator Validator // Block and state validator interface prefetcher Prefetcher processor Processor // Block transaction processor interface + forker *ForkChoice vmConfig vm.Config - shouldPreserve func(*types.Block) bool // Function used to determine whether should preserve the given block. - // Bor related changes borReceiptsCache *lru.Cache // Cache for the most recent bor receipt receipts per block stateSyncData []*types.StateSyncData // State sync data @@ -220,9 +217,9 @@ type BlockChain struct { } // NewBlockChain returns a fully initialised block chain using information -// available in the database. It initialises the default Ethereum Validator and -// Processor. -func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config, shouldPreserve func(block *types.Block) bool, txLookupLimit *uint64) (*BlockChain, error) { +// available in the database. It initialises the default Ethereum Validator +// and Processor. +func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config, shouldPreserve func(header *types.Header) bool, txLookupLimit *uint64) (*BlockChain, error) { if cacheConfig == nil { cacheConfig = defaultCacheConfig } @@ -245,20 +242,20 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par Journal: cacheConfig.TrieCleanJournal, Preimages: cacheConfig.Preimages, }), - quit: make(chan struct{}), - chainmu: syncx.NewClosableMutex(), - shouldPreserve: shouldPreserve, - bodyCache: bodyCache, - bodyRLPCache: bodyRLPCache, - receiptsCache: receiptsCache, - blockCache: blockCache, - txLookupCache: txLookupCache, - futureBlocks: futureBlocks, - engine: engine, - vmConfig: vmConfig, + quit: make(chan struct{}), + chainmu: syncx.NewClosableMutex(), + bodyCache: bodyCache, + bodyRLPCache: bodyRLPCache, + receiptsCache: receiptsCache, + blockCache: blockCache, + txLookupCache: txLookupCache, + futureBlocks: futureBlocks, + engine: engine, + vmConfig: vmConfig, borReceiptsCache: borReceiptsCache, } + bc.forker = NewForkChoice(bc, shouldPreserve) bc.validator = NewBlockValidator(chainConfig, bc, engine) bc.prefetcher = newStatePrefetcher(chainConfig, bc, engine) bc.processor = NewStateProcessor(chainConfig, bc, engine) @@ -306,7 +303,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par if diskRoot != (common.Hash{}) { log.Warn("Head state missing, repairing", "number", head.Number(), "hash", head.Hash(), "snaproot", diskRoot) - snapDisk, err := bc.SetHeadBeyondRoot(head.NumberU64(), diskRoot) + snapDisk, err := bc.setHeadBeyondRoot(head.NumberU64(), diskRoot, true) if err != nil { return nil, err } @@ -316,7 +313,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par } } else { log.Warn("Head state missing, repairing", "number", head.Number(), "hash", head.Hash()) - if err := bc.SetHead(head.NumberU64()); err != nil { + if _, err := bc.setHeadBeyondRoot(head.NumberU64(), common.Hash{}, true); err != nil { return nil, err } } @@ -392,7 +389,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par // Start future block processor. bc.wg.Add(1) - go bc.futureBlocksLoop() + go bc.updateFutureBlocks() // Start tx indexer/unindexer. if txLookupLimit != nil { @@ -418,11 +415,6 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par return bc, nil } -// GetVMConfig returns the block chain VM config. -func (bc *BlockChain) GetVMConfig() *vm.Config { - return &bc.vmConfig -} - // empty returns an indicator whether the blockchain is empty. // Note, it's a special case that we connect a non-empty ancient // database with an empty node, so that we can plugin the ancient @@ -497,11 +489,11 @@ func (bc *BlockChain) loadLastState() error { // was fast synced or full synced and in which state, the method will try to // delete minimal data from disk whilst retaining chain consistency. func (bc *BlockChain) SetHead(head uint64) error { - _, err := bc.SetHeadBeyondRoot(head, common.Hash{}) + _, err := bc.setHeadBeyondRoot(head, common.Hash{}, false) return err } -// SetHeadBeyondRoot rewinds the local chain to a new head with the extra condition +// setHeadBeyondRoot rewinds the local chain to a new head with the extra condition // that the rewind must pass the specified state root. This method is meant to be // used when rewinding with snapshots enabled to ensure that we go back further than // persistent disk layer. Depending on whether the node was fast synced or full, and @@ -509,7 +501,7 @@ func (bc *BlockChain) SetHead(head uint64) error { // retaining chain consistency. // // The method returns the block number where the requested root cap was found. -func (bc *BlockChain) SetHeadBeyondRoot(head uint64, root common.Hash) (uint64, error) { +func (bc *BlockChain) setHeadBeyondRoot(head uint64, root common.Hash, repair bool) (uint64, error) { if !bc.chainmu.TryLock() { return 0, errChainStopped } @@ -524,7 +516,7 @@ func (bc *BlockChain) SetHeadBeyondRoot(head uint64, root common.Hash) (uint64, frozen, _ := bc.db.Ancients() updateFn := func(db ethdb.KeyValueWriter, header *types.Header) (uint64, bool) { - // Rewind the block chain, ensuring we don't end up with a stateless head + // Rewind the blockchain, ensuring we don't end up with a stateless head // block. Note, depth equality is permitted to allow using SetHead as a // chain reparation mechanism without deleting any data! if currentBlock := bc.CurrentBlock(); currentBlock != nil && header.Number.Uint64() <= currentBlock.NumberU64() { @@ -627,8 +619,8 @@ func (bc *BlockChain) SetHeadBeyondRoot(head uint64, root common.Hash) (uint64, } // If SetHead was only called as a chain reparation method, try to skip // touching the header chain altogether, unless the freezer is broken - if block := bc.CurrentBlock(); block.NumberU64() == head { - if target, force := updateFn(bc.db, block.Header()); force { + if repair { + if target, force := updateFn(bc.db, bc.CurrentBlock().Header()); force { bc.hc.SetHead(target, updateFn, delFn) } } else { @@ -649,9 +641,9 @@ func (bc *BlockChain) SetHeadBeyondRoot(head uint64, root common.Hash) (uint64, return rootNumber, bc.loadLastState() } -// FastSyncCommitHead sets the current head block to the one defined by the hash +// SnapSyncCommitHead sets the current head block to the one defined by the hash // irrelevant what the chain contents were prior. -func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error { +func (bc *BlockChain) SnapSyncCommitHead(hash common.Hash) error { // Make sure that both the block as well at its state trie exists block := bc.GetBlockByHash(hash) if block == nil { @@ -678,53 +670,6 @@ func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error { return nil } -// GasLimit returns the gas limit of the current HEAD block. -func (bc *BlockChain) GasLimit() uint64 { - return bc.CurrentBlock().GasLimit() -} - -// CurrentBlock retrieves the current head block of the canonical chain. The -// block is retrieved from the blockchain's internal cache. -func (bc *BlockChain) CurrentBlock() *types.Block { - return bc.currentBlock.Load().(*types.Block) -} - -// Snapshots returns the blockchain snapshot tree. -func (bc *BlockChain) Snapshots() *snapshot.Tree { - return bc.snaps -} - -// CurrentFastBlock retrieves the current fast-sync head block of the canonical -// chain. The block is retrieved from the blockchain's internal cache. -func (bc *BlockChain) CurrentFastBlock() *types.Block { - return bc.currentFastBlock.Load().(*types.Block) -} - -// Validator returns the current validator. -func (bc *BlockChain) Validator() Validator { - return bc.validator -} - -// Processor returns the current processor. -func (bc *BlockChain) Processor() Processor { - return bc.processor -} - -// State returns a new mutable state based on the current HEAD block. -func (bc *BlockChain) State() (*state.StateDB, error) { - return bc.StateAt(bc.CurrentBlock().Root()) -} - -// StateAt returns a new mutable state based on a particular point in time. -func (bc *BlockChain) StateAt(root common.Hash) (*state.StateDB, error) { - return state.New(root, bc.stateCache, bc.snaps) -} - -// StateCache returns the caching database underpinning the blockchain instance. -func (bc *BlockChain) StateCache() state.Database { - return bc.stateCache -} - // Reset purges the entire blockchain, restoring it to its genesis state. func (bc *BlockChain) Reset() error { return bc.ResetWithGenesisBlock(bc.genesisBlock) @@ -803,220 +748,26 @@ func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error { // // Note, this function assumes that the `mu` mutex is held! func (bc *BlockChain) writeHeadBlock(block *types.Block) { - // If the block is on a side chain or an unknown one, force other heads onto it too - updateHeads := rawdb.ReadCanonicalHash(bc.db, block.NumberU64()) != block.Hash() - // Add the block to the canonical chain number scheme and mark as the head batch := bc.db.NewBatch() + rawdb.WriteHeadHeaderHash(batch, block.Hash()) + rawdb.WriteHeadFastBlockHash(batch, block.Hash()) rawdb.WriteCanonicalHash(batch, block.Hash(), block.NumberU64()) rawdb.WriteTxLookupEntriesByBlock(batch, block) rawdb.WriteHeadBlockHash(batch, block.Hash()) - // If the block is better than our head or is on a different chain, force update heads - if updateHeads { - rawdb.WriteHeadHeaderHash(batch, block.Hash()) - rawdb.WriteHeadFastBlockHash(batch, block.Hash()) - } // Flush the whole batch into the disk, exit the node if failed if err := batch.Write(); err != nil { log.Crit("Failed to update chain indexes and markers", "err", err) } // Update all in-memory chain markers in the last step - if updateHeads { - bc.hc.SetCurrentHeader(block.Header()) - bc.currentFastBlock.Store(block) - headFastBlockGauge.Update(int64(block.NumberU64())) - } - bc.currentBlock.Store(block) - headBlockGauge.Update(int64(block.NumberU64())) -} - -// Genesis retrieves the chain's genesis block. -func (bc *BlockChain) Genesis() *types.Block { - return bc.genesisBlock -} - -// GetBody retrieves a block body (transactions and uncles) from the database by -// hash, caching it if found. -func (bc *BlockChain) GetBody(hash common.Hash) *types.Body { - // Short circuit if the body's already in the cache, retrieve otherwise - if cached, ok := bc.bodyCache.Get(hash); ok { - body := cached.(*types.Body) - return body - } - number := bc.hc.GetBlockNumber(hash) - if number == nil { - return nil - } - body := rawdb.ReadBody(bc.db, hash, *number) - if body == nil { - return nil - } - // Cache the found body for next time and return - bc.bodyCache.Add(hash, body) - return body -} - -// GetBodyRLP retrieves a block body in RLP encoding from the database by hash, -// caching it if found. -func (bc *BlockChain) GetBodyRLP(hash common.Hash) rlp.RawValue { - // Short circuit if the body's already in the cache, retrieve otherwise - if cached, ok := bc.bodyRLPCache.Get(hash); ok { - return cached.(rlp.RawValue) - } - number := bc.hc.GetBlockNumber(hash) - if number == nil { - return nil - } - body := rawdb.ReadBodyRLP(bc.db, hash, *number) - if len(body) == 0 { - return nil - } - // Cache the found body for next time and return - bc.bodyRLPCache.Add(hash, body) - return body -} - -// HasBlock checks if a block is fully present in the database or not. -func (bc *BlockChain) HasBlock(hash common.Hash, number uint64) bool { - if bc.blockCache.Contains(hash) { - return true - } - return rawdb.HasBody(bc.db, hash, number) -} - -// HasFastBlock checks if a fast block is fully present in the database or not. -func (bc *BlockChain) HasFastBlock(hash common.Hash, number uint64) bool { - if !bc.HasBlock(hash, number) { - return false - } - if bc.receiptsCache.Contains(hash) { - return true - } - return rawdb.HasReceipts(bc.db, hash, number) -} - -// HasState checks if state trie is fully present in the database or not. -func (bc *BlockChain) HasState(hash common.Hash) bool { - _, err := bc.stateCache.OpenTrie(hash) - return err == nil -} - -// HasBlockAndState checks if a block and associated state trie is fully present -// in the database or not, caching it if present. -func (bc *BlockChain) HasBlockAndState(hash common.Hash, number uint64) bool { - // Check first that the block itself is known - block := bc.GetBlock(hash, number) - if block == nil { - return false - } - return bc.HasState(block.Root()) -} + bc.hc.SetCurrentHeader(block.Header()) -// GetBlock retrieves a block from the database by hash and number, -// caching it if found. -func (bc *BlockChain) GetBlock(hash common.Hash, number uint64) *types.Block { - // Short circuit if the block's already in the cache, retrieve otherwise - if block, ok := bc.blockCache.Get(hash); ok { - return block.(*types.Block) - } - block := rawdb.ReadBlock(bc.db, hash, number) - if block == nil { - return nil - } - // Cache the found block for next time and return - bc.blockCache.Add(block.Hash(), block) - return block -} + bc.currentFastBlock.Store(block) + headFastBlockGauge.Update(int64(block.NumberU64())) -// GetBlockByHash retrieves a block from the database by hash, caching it if found. -func (bc *BlockChain) GetBlockByHash(hash common.Hash) *types.Block { - number := bc.hc.GetBlockNumber(hash) - if number == nil { - return nil - } - return bc.GetBlock(hash, *number) -} - -// GetBlockByNumber retrieves a block from the database by number, caching it -// (associated with its hash) if found. -func (bc *BlockChain) GetBlockByNumber(number uint64) *types.Block { - hash := rawdb.ReadCanonicalHash(bc.db, number) - if hash == (common.Hash{}) { - return nil - } - return bc.GetBlock(hash, number) -} - -// GetReceiptsByHash retrieves the receipts for all transactions in a given block. -func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts { - if receipts, ok := bc.receiptsCache.Get(hash); ok { - return receipts.(types.Receipts) - } - number := rawdb.ReadHeaderNumber(bc.db, hash) - if number == nil { - return nil - } - receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) - if receipts == nil { - return nil - } - bc.receiptsCache.Add(hash, receipts) - return receipts -} - -// GetBlocksFromHash returns the block corresponding to hash and up to n-1 ancestors. -// [deprecated by eth/62] -func (bc *BlockChain) GetBlocksFromHash(hash common.Hash, n int) (blocks []*types.Block) { - number := bc.hc.GetBlockNumber(hash) - if number == nil { - return nil - } - for i := 0; i < n; i++ { - block := bc.GetBlock(hash, *number) - if block == nil { - break - } - blocks = append(blocks, block) - hash = block.ParentHash() - *number-- - } - return -} - -// GetUnclesInChain retrieves all the uncles from a given block backwards until -// a specific distance is reached. -func (bc *BlockChain) GetUnclesInChain(block *types.Block, length int) []*types.Header { - uncles := []*types.Header{} - for i := 0; block != nil && i < length; i++ { - uncles = append(uncles, block.Uncles()...) - block = bc.GetBlock(block.ParentHash(), block.NumberU64()-1) - } - return uncles -} - -// TrieNode retrieves a blob of data associated with a trie node -// either from ephemeral in-memory cache, or from persistent storage. -func (bc *BlockChain) TrieNode(hash common.Hash) ([]byte, error) { - return bc.stateCache.TrieDB().Node(hash) -} - -// ContractCode retrieves a blob of data associated with a contract hash -// either from ephemeral in-memory cache, or from persistent storage. -func (bc *BlockChain) ContractCode(hash common.Hash) ([]byte, error) { - return bc.stateCache.ContractCode(common.Hash{}, hash) -} - -// ContractCodeWithPrefix retrieves a blob of data associated with a contract -// hash either from ephemeral in-memory cache, or from persistent storage. -// -// If the code doesn't exist in the in-memory cache, check the storage with -// new code scheme. -func (bc *BlockChain) ContractCodeWithPrefix(hash common.Hash) ([]byte, error) { - type codeReader interface { - ContractCodeWithPrefix(addrHash, codeHash common.Hash) ([]byte, error) - } - return bc.stateCache.(codeReader).ContractCodeWithPrefix(common.Hash{}, hash) + bc.currentBlock.Store(block) + headBlockGauge.Update(int64(block.NumberU64())) } // Stop stops the blockchain service. If any imports are currently in progress @@ -1130,12 +881,6 @@ const ( SideStatTy ) -// numberHash is just a container for a number and a hash, to represent a block -type numberHash struct { - number uint64 - hash common.Hash -} - // InsertReceiptChain attempts to complete an already existing header chain with // transaction and receipt data. func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts, ancientLimit uint64) (int, error) { @@ -1181,13 +926,17 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ // Rewind may have occurred, skip in that case. if bc.CurrentHeader().Number.Cmp(head.Number()) >= 0 { - currentFastBlock, td := bc.CurrentFastBlock(), bc.GetTd(head.Hash(), head.NumberU64()) - if bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 { - rawdb.WriteHeadFastBlockHash(bc.db, head.Hash()) - bc.currentFastBlock.Store(head) - headFastBlockGauge.Update(int64(head.NumberU64())) - return true + reorg, err := bc.forker.ReorgNeeded(bc.CurrentFastBlock().Header(), head.Header()) + if err != nil { + log.Warn("Reorg failed", "err", err) + return false + } else if !reorg { + return false } + rawdb.WriteHeadFastBlockHash(bc.db, head.Hash()) + bc.currentFastBlock.Store(head) + headFastBlockGauge.Update(int64(head.NumberU64())) + return true } return false } @@ -1408,18 +1157,6 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ return 0, nil } -// SetTxLookupLimit is responsible for updating the txlookup limit to the -// original one stored in db if the new mismatches with the old one. -func (bc *BlockChain) SetTxLookupLimit(limit uint64) { - bc.txLookupLimit = limit -} - -// TxLookupLimit retrieves the txlookup limit used by blockchain to prune -// stale transaction indices. -func (bc *BlockChain) TxLookupLimit() uint64 { - return bc.txLookupLimit -} - var lastWrite uint64 // writeBlockWithoutState writes only the block and its metadata to the database, @@ -1452,30 +1189,15 @@ func (bc *BlockChain) writeKnownBlock(block *types.Block) error { return nil } -// WriteBlockWithState writes the block and all associated state to the database. -func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) { - if !bc.chainmu.TryLock() { - return NonStatTy, errInsertionInterrupted - } - defer bc.chainmu.Unlock() - return bc.writeBlockWithState(block, receipts, logs, state, emitHeadEvent) -} - -// writeBlockWithState writes the block and all associated state to the database, -// but is expects the chain mutex to be held. -func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) { - if bc.insertStopped() { - return NonStatTy, errInsertionInterrupted - } - +// writeBlockWithState writes block, metadata and corresponding state data to the +// database. +func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state *state.StateDB) ([]*types.Log, error) { // Calculate the total difficulty of the block ptd := bc.GetTd(block.ParentHash(), block.NumberU64()-1) if ptd == nil { - return NonStatTy, consensus.ErrUnknownAncestor + return []*types.Log{}, consensus.ErrUnknownAncestor } // Make sure no inconsistent state is leaked during insertion - currentBlock := bc.CurrentBlock() - localTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) externTd := new(big.Int).Add(block.Difficulty(), ptd) // Irrelevant of the canonical status, write the block itself to the database. @@ -1527,15 +1249,13 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types. // Commit all cached state changes into underlying memory database. root, err := state.Commit(bc.chainConfig.IsEIP158(block.Number())) if err != nil { - return NonStatTy, err + return []*types.Log{}, err } triedb := bc.stateCache.TrieDB() // If we're running an archive node, always flush if bc.cacheConfig.TrieDirtyDisabled { - if err := triedb.Commit(root, false, nil); err != nil { - return NonStatTy, err - } + return []*types.Log{}, triedb.Commit(root, false, nil) } else { // Full but not archive node, do proper garbage collection triedb.Reference(root, common.Hash{}) // metadata reference to keep trie alive @@ -1583,23 +1303,31 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types. } } } - // If the total difficulty is higher than our known, add it to the canonical chain - // Second clause in the if statement reduces the vulnerability to selfish mining. - // Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf - reorg := externTd.Cmp(localTd) > 0 - currentBlock = bc.CurrentBlock() - if !reorg && externTd.Cmp(localTd) == 0 { - // Split same-difficulty blocks by number, then preferentially select - // the block generated by the local miner as the canonical block. - if block.NumberU64() < currentBlock.NumberU64() { - reorg = true - } else if block.NumberU64() == currentBlock.NumberU64() { - var currentPreserve, blockPreserve bool - if bc.shouldPreserve != nil { - currentPreserve, blockPreserve = bc.shouldPreserve(currentBlock), bc.shouldPreserve(block) - } - reorg = !currentPreserve && (blockPreserve || mrand.Float64() < 0.5) - } + return stateSyncLogs, nil +} + +// WriteBlockWithState writes the block and all associated state to the database. +func (bc *BlockChain) WriteBlockAndSetHead(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) { + if !bc.chainmu.TryLock() { + return NonStatTy, errChainStopped + } + defer bc.chainmu.Unlock() + + return bc.writeBlockAndSetHead(block, receipts, logs, state, emitHeadEvent) +} + +// writeBlockAndSetHead writes the block and all associated state to the database, +// and also it applies the given block as the new chain head. This function expects +// the chain mutex to be held. +func (bc *BlockChain) writeBlockAndSetHead(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) { + var stateSyncLogs []*types.Log + if stateSyncLogs, err = bc.writeBlockWithState(block, receipts, logs, state); err != nil { + return NonStatTy, err + } + currentBlock := bc.CurrentBlock() + reorg, err := bc.forker.ReorgNeeded(currentBlock.Header(), block.Header()) + if err != nil { + return NonStatTy, err } if reorg { // Reorganise the chain if the parent is not the head block @@ -1631,7 +1359,7 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types. // In theory we should fire a ChainHeadEvent when we inject // a canonical block, but sometimes we can insert a batch of - // canonicial blocks. Avoid firing too much ChainHeadEvents, + // canonicial blocks. Avoid firing too many ChainHeadEvents, // we will fire an accumulated ChainHeadEvent and disable fire // event here. if emitHeadEvent { @@ -1651,11 +1379,18 @@ func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types. // addFutureBlock checks if the block is within the max allowed window to get // accepted for future processing, and returns an error if the block is too far // ahead and was not added. +// +// TODO after the transition, the future block shouldn't be kept. Because +// it's not checked in the Geth side anymore. func (bc *BlockChain) addFutureBlock(block *types.Block) error { max := uint64(time.Now().Unix() + maxTimeFutureBlocks) if block.Time() > max { return fmt.Errorf("future block timestamp %v > allowed %v", block.Time(), max) } + if block.Difficulty().Cmp(common.Big0) == 0 { + // Never add PoS blocks into the future queue + return nil + } bc.futureBlocks.Add(block.Hash(), block) return nil } @@ -1663,15 +1398,12 @@ func (bc *BlockChain) addFutureBlock(block *types.Block) error { // InsertChain attempts to insert the given batch of blocks in to the canonical // chain or, otherwise, create a fork. If an error is returned it will return // the index number of the failing block as well an error describing what went -// wrong. -// -// After insertion is done, all accumulated events will be fired. +// wrong. After insertion is done, all accumulated events will be fired. func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { // Sanity check that we have something meaningful to import if len(chain) == 0 { return 0, nil } - bc.blockProcFeed.Send(true) defer bc.blockProcFeed.Send(false) @@ -1690,26 +1422,12 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { prev.Hash().Bytes()[:4], i, block.NumberU64(), block.Hash().Bytes()[:4], block.ParentHash().Bytes()[:4]) } } - - // Pre-check passed, start the full block imports. - if !bc.chainmu.TryLock() { - return 0, errChainStopped - } - defer bc.chainmu.Unlock() - return bc.insertChain(chain, true) -} - -// InsertChainWithoutSealVerification works exactly the same -// except for seal verification, seal verification is omitted -func (bc *BlockChain) InsertChainWithoutSealVerification(block *types.Block) (int, error) { - bc.blockProcFeed.Send(true) - defer bc.blockProcFeed.Send(false) - + // Pre-checks passed, start the full block imports if !bc.chainmu.TryLock() { return 0, errChainStopped } defer bc.chainmu.Unlock() - return bc.insertChain(types.Blocks([]*types.Block{block}), false) + return bc.insertChain(chain, true, true) } // insertChain is the internal implementation of InsertChain, which assumes that @@ -1720,7 +1438,7 @@ func (bc *BlockChain) InsertChainWithoutSealVerification(block *types.Block) (in // racey behaviour. If a sidechain import is in progress, and the historic state // is imported, but then new canon-head is added before the actual sidechain // completes, then the historic state could be pruned again -func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, error) { +func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals, setHead bool) (int, error) { // If the chain is terminating, don't even bother starting up. if bc.insertStopped() { return 0, nil @@ -1752,25 +1470,33 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er // Peek the error for the first block to decide the directing import logic it := newInsertIterator(chain, results, bc.validator) - block, err := it.next() - // Left-trim all the known blocks - if err == ErrKnownBlock { + // Left-trim all the known blocks that don't need to build snapshot + if bc.skipBlock(err, it) { // First block (and state) is known // 1. We did a roll-back, and should now do a re-import // 2. The block is stored as a sidechain, and is lying about it's stateroot, and passes a stateroot // from the canonical chain, which has not been verified. // Skip all known blocks that are behind us. var ( - current = bc.CurrentBlock() - localTd = bc.GetTd(current.Hash(), current.NumberU64()) - externTd = bc.GetTd(block.ParentHash(), block.NumberU64()-1) // The first block can't be nil + reorg bool + current = bc.CurrentBlock() ) - for block != nil && err == ErrKnownBlock { - externTd = new(big.Int).Add(externTd, block.Difficulty()) - if localTd.Cmp(externTd) < 0 { - break + for block != nil && bc.skipBlock(err, it) { + reorg, err = bc.forker.ReorgNeeded(current.Header(), block.Header()) + if err != nil { + return it.index, err + } + if reorg { + // Switch to import mode if the forker says the reorg is necessary + // and also the block is not on the canonical chain. + // In eth2 the forker always returns true for reorg decision (blindly trusting + // the external consensus engine), but in order to prevent the unnecessary + // reorgs when importing known blocks, the special case is handled here. + if block.NumberU64() > current.NumberU64() || bc.GetCanonicalHash(block.NumberU64()) != block.Hash() { + break + } } log.Debug("Ignoring already known block", "number", block.Number(), "hash", block.Hash()) stats.ignored++ @@ -1785,7 +1511,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er // When node runs a fast sync again, it can re-import a batch of known blocks via // `insertChain` while a part of them have higher total difficulty than current // head full block(new pivot point). - for block != nil && err == ErrKnownBlock { + for block != nil && bc.skipBlock(err, it) { log.Debug("Writing previously known block", "number", block.Number(), "hash", block.Hash()) if err := bc.writeKnownBlock(block); err != nil { return it.index, err @@ -1797,11 +1523,17 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er // Falls through to the block import } switch { - // First block is pruned, insert as sidechain and reorg only if TD grows enough + // First block is pruned case errors.Is(err, consensus.ErrPrunedAncestor): - log.Debug("Pruned ancestor, inserting as sidechain", "number", block.Number(), "hash", block.Hash()) - return bc.insertSideChain(block, it) - + if setHead { + // First block is pruned, insert as sidechain and reorg only if TD grows enough + log.Debug("Pruned ancestor, inserting as sidechain", "number", block.Number(), "hash", block.Hash()) + return bc.insertSideChain(block, it) + } else { + // We're post-merge and the parent is pruned, try to recover the parent state + log.Debug("Pruned ancestor", "number", block.Number(), "hash", block.Hash()) + return it.index, bc.recoverAncestors(block) + } // First block is future, shove it (and all children) to the future queue (unknown ancestor) case errors.Is(err, consensus.ErrFutureBlock) || (errors.Is(err, consensus.ErrUnknownAncestor) && bc.futureBlocks.Contains(it.first().ParentHash())): for block != nil && (it.index == 0 || errors.Is(err, consensus.ErrUnknownAncestor)) { @@ -1817,8 +1549,10 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er // If there are any still remaining, mark as ignored return it.index, err - // Some other error occurred, abort - case err != nil: + // Some other error(except ErrKnownBlock) occurred, abort. + // ErrKnownBlock is allowed here since some known blocks + // still need re-execution to generate snapshots that are missing + case err != nil && !errors.Is(err, ErrKnownBlock): bc.futureBlocks.Remove(block.Hash()) stats.ignored += len(it.chain) bc.reportBlock(block, nil, err) @@ -1836,7 +1570,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er } }() - for ; block != nil && err == nil || err == ErrKnownBlock; block, err = it.next() { + for ; block != nil && err == nil || errors.Is(err, ErrKnownBlock); block, err = it.next() { // If the chain is terminating, stop processing blocks if bc.insertStopped() { log.Debug("Abort during block processing") @@ -1851,8 +1585,9 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er // Clique blocks where they can share state among each other, so importing an // older block might complete the state of the subsequent one. In this case, // just skip the block (we already validated it once fully (and crashed), since - // its header and body was already in the database). - if err == ErrKnownBlock { + // its header and body was already in the database). But if the corresponding + // snapshot layer is missing, forcibly rerun the execution to build it. + if bc.skipBlock(err, it) { logger := log.Debug if bc.chainConfig.Clique == nil { logger = log.Warn @@ -1958,12 +1693,17 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er // Update the metrics touched during block validation accountHashTimer.Update(statedb.AccountHashes) // Account hashes are complete, we can mark them storageHashTimer.Update(statedb.StorageHashes) // Storage hashes are complete, we can mark them - blockValidationTimer.Update(time.Since(substart) - (statedb.AccountHashes + statedb.StorageHashes - triehash)) // Write the block to the chain and get the status. substart = time.Now() - status, err := bc.writeBlockWithState(block, receipts, logs, statedb, false) + var status WriteStatus + if !setHead { + // Don't set the head, only insert the block + _, err = bc.writeBlockWithState(block, receipts, logs, statedb) + } else { + status, err = bc.writeBlockAndSetHead(block, receipts, logs, statedb, false) + } atomic.StoreUint32(&followupInterrupt, 1) if err != nil { return it.index, err @@ -1976,6 +1716,12 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er blockWriteTimer.Update(time.Since(substart) - statedb.AccountCommits - statedb.StorageCommits - statedb.SnapshotCommits) blockInsertTimer.UpdateSince(start) + if !setHead { + // We did not setHead, so we don't have any stats to update + log.Info("Inserted block", "number", block.Number(), "hash", block.Hash(), "txs", len(block.Transactions()), "elapsed", common.PrettyDuration(time.Since(start))) + return it.index, nil + } + switch status { case CanonStatTy: log.Debug("Inserted new block", "number", block.Number(), "hash", block.Hash(), @@ -2034,10 +1780,12 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, er // // The method writes all (header-and-body-valid) blocks to disk, then tries to // switch over to the new chain if the TD exceeded the current chain. +// insertSideChain is only used pre-merge. func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (int, error) { var ( - externTd *big.Int - current = bc.CurrentBlock() + externTd *big.Int + lastBlock = block + current = bc.CurrentBlock() ) // The first sidechain block error is already verified to be ErrPrunedAncestor. // Since we don't import them here, we expect ErrUnknownAncestor for the remaining @@ -2088,6 +1836,7 @@ func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (i "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()), "root", block.Root()) } + lastBlock = block } // At this point, we've written all sidechain blocks to database. Loop ended // either on some other error or all were processed. If there was some other @@ -2095,8 +1844,12 @@ func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (i // // If the externTd was larger than our local TD, we now need to reimport the previous // blocks to regenerate the required state - localTd := bc.GetTd(current.Hash(), current.NumberU64()) - if localTd.Cmp(externTd) > 0 { + reorg, err := bc.forker.ReorgNeeded(current.Header(), lastBlock.Header()) + if err != nil { + return it.index, err + } + if !reorg { + localTd := bc.GetTd(current.Hash(), current.NumberU64()) log.Info("Sidechain written to disk", "start", it.first().NumberU64(), "end", it.previous().Number, "sidetd", externTd, "localtd", localTd) return it.index, err } @@ -2132,7 +1885,7 @@ func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (i // memory here. if len(blocks) >= 2048 || memory > 64*1024*1024 { log.Info("Importing heavy sidechain segment", "blocks", len(blocks), "start", blocks[0].NumberU64(), "end", block.NumberU64()) - if _, err := bc.insertChain(blocks, false); err != nil { + if _, err := bc.insertChain(blocks, false, true); err != nil { return 0, err } blocks, memory = blocks[:0], 0 @@ -2146,14 +1899,104 @@ func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (i } if len(blocks) > 0 { log.Info("Importing sidechain segment", "start", blocks[0].NumberU64(), "end", blocks[len(blocks)-1].NumberU64()) - return bc.insertChain(blocks, false) + return bc.insertChain(blocks, false, true) } return 0, nil } +// recoverAncestors finds the closest ancestor with available state and re-execute +// all the ancestor blocks since that. +// recoverAncestors is only used post-merge. +func (bc *BlockChain) recoverAncestors(block *types.Block) error { + // Gather all the sidechain hashes (full blocks may be memory heavy) + var ( + hashes []common.Hash + numbers []uint64 + parent = block + ) + for parent != nil && !bc.HasState(parent.Root()) { + hashes = append(hashes, parent.Hash()) + numbers = append(numbers, parent.NumberU64()) + parent = bc.GetBlock(parent.ParentHash(), parent.NumberU64()-1) + + // If the chain is terminating, stop iteration + if bc.insertStopped() { + log.Debug("Abort during blocks iteration") + return errInsertionInterrupted + } + } + if parent == nil { + return errors.New("missing parent") + } + // Import all the pruned blocks to make the state available + for i := len(hashes) - 1; i >= 0; i-- { + // If the chain is terminating, stop processing blocks + if bc.insertStopped() { + log.Debug("Abort during blocks processing") + return errInsertionInterrupted + } + var b *types.Block + if i == 0 { + b = block + } else { + b = bc.GetBlock(hashes[i], numbers[i]) + } + if _, err := bc.insertChain(types.Blocks{b}, false, false); err != nil { + return err + } + } + return nil +} + +// collectLogs collects the logs that were generated or removed during +// the processing of the block that corresponds with the given hash. +// These logs are later announced as deleted or reborn. +func (bc *BlockChain) collectLogs(hash common.Hash, removed bool) []*types.Log { + number := bc.hc.GetBlockNumber(hash) + if number == nil { + return []*types.Log{} + } + receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) + + // Append bor receipt + borReceipt := rawdb.ReadBorReceipt(bc.db, hash, *number) + if borReceipt != nil { + receipts = append(receipts, borReceipt) + } + + var logs []*types.Log + for _, receipt := range receipts { + for _, log := range receipt.Logs { + l := *log + if removed { + l.Removed = true + } + logs = append(logs, &l) + } + } + return logs +} + +// mergeLogs returns a merged log slice with specified sort order. +func mergeLogs(logs [][]*types.Log, reverse bool) []*types.Log { + var ret []*types.Log + if reverse { + for i := len(logs) - 1; i >= 0; i-- { + ret = append(ret, logs[i]...) + } + } else { + for i := 0; i < len(logs); i++ { + ret = append(ret, logs[i]...) + } + } + return ret +} + // reorg takes two blocks, an old chain and a new chain and will reconstruct the // blocks and inserts them to be part of the new canonical chain and accumulates // potential missing transactions and post an event about them. +// Note the new head block won't be processed here, callers need to handle it +// externally. func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { var ( newChain types.Blocks @@ -2165,55 +2008,6 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { deletedLogs [][]*types.Log rebirthLogs [][]*types.Log - - // collectLogs collects the logs that were generated or removed during - // the processing of the block that corresponds with the given hash. - // These logs are later announced as deleted or reborn - collectLogs = func(hash common.Hash, removed bool) { - number := bc.hc.GetBlockNumber(hash) - if number == nil { - return - } - receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) - - // Append bor receipt - borReceipt := rawdb.ReadBorReceipt(bc.db, hash, *number) - if borReceipt != nil { - receipts = append(receipts, borReceipt) - } - - var logs []*types.Log - for _, receipt := range receipts { - for _, log := range receipt.Logs { - l := *log - if removed { - l.Removed = true - } - logs = append(logs, &l) - } - } - if len(logs) > 0 { - if removed { - deletedLogs = append(deletedLogs, logs) - } else { - rebirthLogs = append(rebirthLogs, logs) - } - } - } - // mergeLogs returns a merged log slice with specified sort order. - mergeLogs = func(logs [][]*types.Log, reverse bool) []*types.Log { - var ret []*types.Log - if reverse { - for i := len(logs) - 1; i >= 0; i-- { - ret = append(ret, logs[i]...) - } - } else { - for i := 0; i < len(logs); i++ { - ret = append(ret, logs[i]...) - } - } - return ret - } ) // Reduce the longer chain to the same number as the shorter one if oldBlock.NumberU64() > newBlock.NumberU64() { @@ -2221,7 +2015,12 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { for ; oldBlock != nil && oldBlock.NumberU64() != newBlock.NumberU64(); oldBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1) { oldChain = append(oldChain, oldBlock) deletedTxs = append(deletedTxs, oldBlock.Transactions()...) - collectLogs(oldBlock.Hash(), true) + + // Collect deleted logs for notification + logs := bc.collectLogs(oldBlock.Hash(), true) + if len(logs) > 0 { + deletedLogs = append(deletedLogs, logs) + } } } else { // New chain is longer, stash all blocks away for subsequent insertion @@ -2246,8 +2045,12 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { // Remove an old block as well as stash away a new block oldChain = append(oldChain, oldBlock) deletedTxs = append(deletedTxs, oldBlock.Transactions()...) - collectLogs(oldBlock.Hash(), true) + // Collect deleted logs for notification + logs := bc.collectLogs(oldBlock.Hash(), true) + if len(logs) > 0 { + deletedLogs = append(deletedLogs, logs) + } newChain = append(newChain, newBlock) // Step back with both chains @@ -2273,8 +2076,15 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { blockReorgAddMeter.Mark(int64(len(newChain))) blockReorgDropMeter.Mark(int64(len(oldChain))) blockReorgMeter.Mark(1) + } else if len(newChain) > 0 { + // Special case happens in the post merge stage that current head is + // the ancestor of new head while these two blocks are not consecutive + log.Info("Extend chain", "add", len(newChain), "number", newChain[0].NumberU64(), "hash", newChain[0].Hash()) + blockReorgAddMeter.Mark(int64(len(newChain))) } else { - log.Error("Impossible reorg, please file an issue", "oldnum", oldBlock.Number(), "oldhash", oldBlock.Hash(), "newnum", newBlock.Number(), "newhash", newBlock.Hash()) + // len(newChain) == 0 && len(oldChain) > 0 + // rewind the canonical chain to a lower point. + log.Error("Impossible reorg, please file an issue", "oldnum", oldBlock.Number(), "oldhash", oldBlock.Hash(), "oldblocks", len(oldChain), "newnum", newBlock.Number(), "newhash", newBlock.Hash(), "newblocks", len(newChain)) } // Insert the new chain(except the head block(reverse order)), // taking care of the proper incremental order. @@ -2283,8 +2093,10 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { bc.writeHeadBlock(newChain[i]) // Collect reborn logs due to chain reorg - collectLogs(newChain[i].Hash(), false) - + logs := bc.collectLogs(newChain[i].Hash(), false) + if len(logs) > 0 { + rebirthLogs = append(rebirthLogs, logs) + } // Collect the new added transactions. addedTxs = append(addedTxs, newChain[i].Transactions()...) } @@ -2324,12 +2136,54 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { return nil } -// futureBlocksLoop processes the 'future block' queue. -func (bc *BlockChain) futureBlocksLoop() { - defer bc.wg.Done() +// InsertBlockWithoutSetHead executes the block, runs the necessary verification +// upon it and then persist the block and the associate state into the database. +// The key difference between the InsertChain is it won't do the canonical chain +// updating. It relies on the additional SetChainHead call to finalize the entire +// procedure. +func (bc *BlockChain) InsertBlockWithoutSetHead(block *types.Block) error { + if !bc.chainmu.TryLock() { + return errChainStopped + } + defer bc.chainmu.Unlock() + + _, err := bc.insertChain(types.Blocks{block}, true, false) + return err +} + +// SetChainHead rewinds the chain to set the new head block as the specified +// block. It's possible that after the reorg the relevant state of head +// is missing. It can be fixed by inserting a new block which triggers +// the re-execution. +func (bc *BlockChain) SetChainHead(newBlock *types.Block) error { + if !bc.chainmu.TryLock() { + return errChainStopped + } + defer bc.chainmu.Unlock() + // Run the reorg if necessary and set the given block as new head. + if newBlock.ParentHash() != bc.CurrentBlock().Hash() { + if err := bc.reorg(bc.CurrentBlock(), newBlock); err != nil { + return err + } + } + bc.writeHeadBlock(newBlock) + + // Emit events + logs := bc.collectLogs(newBlock.Hash(), false) + bc.chainFeed.Send(ChainEvent{Block: newBlock, Hash: newBlock.Hash(), Logs: logs}) + if len(logs) > 0 { + bc.logsFeed.Send(logs) + } + bc.chainHeadFeed.Send(ChainHeadEvent{Block: newBlock}) + log.Info("Set the chain head", "number", newBlock.Number(), "hash", newBlock.Hash()) + return nil +} + +func (bc *BlockChain) updateFutureBlocks() { futureTimer := time.NewTicker(5 * time.Second) defer futureTimer.Stop() + defer bc.wg.Done() for { select { case <-futureTimer.C: @@ -2340,6 +2194,47 @@ func (bc *BlockChain) futureBlocksLoop() { } } +// skipBlock returns 'true', if the block being imported can be skipped over, meaning +// that the block does not need to be processed but can be considered already fully 'done'. +func (bc *BlockChain) skipBlock(err error, it *insertIterator) bool { + // We can only ever bypass processing if the only error returned by the validator + // is ErrKnownBlock, which means all checks passed, but we already have the block + // and state. + if !errors.Is(err, ErrKnownBlock) { + return false + } + // If we're not using snapshots, we can skip this, since we have both block + // and (trie-) state + if bc.snaps == nil { + return true + } + var ( + header = it.current() // header can't be nil + parentRoot common.Hash + ) + // If we also have the snapshot-state, we can skip the processing. + if bc.snaps.Snapshot(header.Root) != nil { + return true + } + // In this case, we have the trie-state but not snapshot-state. If the parent + // snapshot-state exists, we need to process this in order to not get a gap + // in the snapshot layers. + // Resolve parent block + if parent := it.previous(); parent != nil { + parentRoot = parent.Root + } else if parent = bc.GetHeaderByHash(header.ParentHash); parent != nil { + parentRoot = parent.Root + } + if parentRoot == (common.Hash{}) { + return false // Theoretically impossible case + } + // Parent is also missing snapshot: we can skip this. Otherwise process. + if bc.snaps.Snapshot(parentRoot) == nil { + return true + } + return false +} + // maintainTxIndex is responsible for the construction and deletion of the // transaction index. // @@ -2384,7 +2279,14 @@ func (bc *BlockChain) maintainTxIndex(ancients uint64) { // If a previous indexing existed, make sure that we fill in any missing entries if bc.txLookupLimit == 0 || head < bc.txLookupLimit { if *tail > 0 { - rawdb.IndexTransactions(bc.db, 0, *tail, bc.quit) + // It can happen when chain is rewound to a historical point which + // is even lower than the indexes tail, recap the indexing target + // to new head to avoid reading non-existent block bodies. + end := *tail + if end > head+1 { + end = head + 1 + } + rawdb.IndexTransactions(bc.db, 0, end, bc.quit) } return } @@ -2469,133 +2371,6 @@ func (bc *BlockChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (i return 0, errChainStopped } defer bc.chainmu.Unlock() - _, err := bc.hc.InsertHeaderChain(chain, start) + _, err := bc.hc.InsertHeaderChain(chain, start, bc.forker) return 0, err } - -// CurrentHeader retrieves the current head header of the canonical chain. The -// header is retrieved from the HeaderChain's internal cache. -func (bc *BlockChain) CurrentHeader() *types.Header { - return bc.hc.CurrentHeader() -} - -// GetTd retrieves a block's total difficulty in the canonical chain from the -// database by hash and number, caching it if found. -func (bc *BlockChain) GetTd(hash common.Hash, number uint64) *big.Int { - return bc.hc.GetTd(hash, number) -} - -// GetHeader retrieves a block header from the database by hash and number, -// caching it if found. -func (bc *BlockChain) GetHeader(hash common.Hash, number uint64) *types.Header { - // Blockchain might have cached the whole block, only if not go to headerchain - if block, ok := bc.blockCache.Get(hash); ok { - return block.(*types.Block).Header() - } - - return bc.hc.GetHeader(hash, number) -} - -// GetHeaderByHash retrieves a block header from the database by hash, caching it if -// found. -func (bc *BlockChain) GetHeaderByHash(hash common.Hash) *types.Header { - // Blockchain might have cached the whole block, only if not go to headerchain - if block, ok := bc.blockCache.Get(hash); ok { - return block.(*types.Block).Header() - } - - return bc.hc.GetHeaderByHash(hash) -} - -// HasHeader checks if a block header is present in the database or not, caching -// it if present. -func (bc *BlockChain) HasHeader(hash common.Hash, number uint64) bool { - return bc.hc.HasHeader(hash, number) -} - -// GetCanonicalHash returns the canonical hash for a given block number -func (bc *BlockChain) GetCanonicalHash(number uint64) common.Hash { - return bc.hc.GetCanonicalHash(number) -} - -// GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or -// a close ancestor of it is canonical. maxNonCanonical points to a downwards counter limiting the -// number of blocks to be individually checked before we reach the canonical chain. -// -// Note: ancestor == 0 returns the same block, 1 returns its parent and so on. -func (bc *BlockChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { - return bc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) -} - -// GetHeaderByNumber retrieves a block header from the database by number, -// caching it (associated with its hash) if found. -func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header { - return bc.hc.GetHeaderByNumber(number) -} - -// GetTransactionLookup retrieves the lookup associate with the given transaction -// hash from the cache or database. -func (bc *BlockChain) GetTransactionLookup(hash common.Hash) *rawdb.LegacyTxLookupEntry { - // Short circuit if the txlookup already in the cache, retrieve otherwise - if lookup, exist := bc.txLookupCache.Get(hash); exist { - return lookup.(*rawdb.LegacyTxLookupEntry) - } - tx, blockHash, blockNumber, txIndex := rawdb.ReadTransaction(bc.db, hash) - if tx == nil { - return nil - } - lookup := &rawdb.LegacyTxLookupEntry{BlockHash: blockHash, BlockIndex: blockNumber, Index: txIndex} - bc.txLookupCache.Add(hash, lookup) - return lookup -} - -// Config retrieves the chain's fork configuration. -func (bc *BlockChain) Config() *params.ChainConfig { return bc.chainConfig } - -// Engine retrieves the blockchain's consensus engine. -func (bc *BlockChain) Engine() consensus.Engine { return bc.engine } - -// SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent. -func (bc *BlockChain) SubscribeRemovedLogsEvent(ch chan<- RemovedLogsEvent) event.Subscription { - return bc.scope.Track(bc.rmLogsFeed.Subscribe(ch)) -} - -// SubscribeChainEvent registers a subscription of ChainEvent. -func (bc *BlockChain) SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription { - return bc.scope.Track(bc.chainFeed.Subscribe(ch)) -} - -// SubscribeChainHeadEvent registers a subscription of ChainHeadEvent. -func (bc *BlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription { - return bc.scope.Track(bc.chainHeadFeed.Subscribe(ch)) -} - -// SubscribeChainSideEvent registers a subscription of ChainSideEvent. -func (bc *BlockChain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Subscription { - return bc.scope.Track(bc.chainSideFeed.Subscribe(ch)) -} - -// SubscribeLogsEvent registers a subscription of []*types.Log. -func (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { - return bc.scope.Track(bc.logsFeed.Subscribe(ch)) -} - -// SubscribeBlockProcessingEvent registers a subscription of bool where true means -// block processing has started while false means it has stopped. -func (bc *BlockChain) SubscribeBlockProcessingEvent(ch chan<- bool) event.Subscription { - return bc.scope.Track(bc.blockProcFeed.Subscribe(ch)) -} - -// -// Bor related changes -// - -// SetStateSync set sync data in state_data -func (bc *BlockChain) SetStateSync(stateData []*types.StateSyncData) { - bc.stateSyncData = stateData -} - -// SubscribeStateSyncEvent registers a subscription of StateSyncEvent. -func (bc *BlockChain) SubscribeStateSyncEvent(ch chan<- StateSyncEvent) event.Subscription { - return bc.scope.Track(bc.stateSyncFeed.Subscribe(ch)) -} diff --git a/core/blockchain_insert.go b/core/blockchain_insert.go index cb8473c084..4464870279 100644 --- a/core/blockchain_insert.go +++ b/core/blockchain_insert.go @@ -150,6 +150,14 @@ func (it *insertIterator) previous() *types.Header { return it.chain[it.index-1].Header() } +// current returns the current header that is being processed, or nil. +func (it *insertIterator) current() *types.Header { + if it.index == -1 || it.index >= len(it.chain) { + return nil + } + return it.chain[it.index].Header() +} + // first returns the first block in the it. func (it *insertIterator) first() *types.Block { return it.chain[0] diff --git a/core/blockchain_reader.go b/core/blockchain_reader.go new file mode 100644 index 0000000000..9b32aa0f8f --- /dev/null +++ b/core/blockchain_reader.go @@ -0,0 +1,407 @@ +// Copyright 2021 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 . + +package core + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/state/snapshot" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" +) + +// CurrentHeader retrieves the current head header of the canonical chain. The +// header is retrieved from the HeaderChain's internal cache. +func (bc *BlockChain) CurrentHeader() *types.Header { + return bc.hc.CurrentHeader() +} + +// CurrentBlock retrieves the current head block of the canonical chain. The +// block is retrieved from the blockchain's internal cache. +func (bc *BlockChain) CurrentBlock() *types.Block { + return bc.currentBlock.Load().(*types.Block) +} + +// CurrentFastBlock retrieves the current fast-sync head block of the canonical +// chain. The block is retrieved from the blockchain's internal cache. +func (bc *BlockChain) CurrentFastBlock() *types.Block { + return bc.currentFastBlock.Load().(*types.Block) +} + +// HasHeader checks if a block header is present in the database or not, caching +// it if present. +func (bc *BlockChain) HasHeader(hash common.Hash, number uint64) bool { + return bc.hc.HasHeader(hash, number) +} + +// GetHeader retrieves a block header from the database by hash and number, +// caching it if found. +func (bc *BlockChain) GetHeader(hash common.Hash, number uint64) *types.Header { + return bc.hc.GetHeader(hash, number) +} + +// GetHeaderByHash retrieves a block header from the database by hash, caching it if +// found. +func (bc *BlockChain) GetHeaderByHash(hash common.Hash) *types.Header { + return bc.hc.GetHeaderByHash(hash) +} + +// GetHeaderByNumber retrieves a block header from the database by number, +// caching it (associated with its hash) if found. +func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header { + return bc.hc.GetHeaderByNumber(number) +} + +// GetHeadersFrom returns a contiguous segment of headers, in rlp-form, going +// backwards from the given number. +func (bc *BlockChain) GetHeadersFrom(number, count uint64) []rlp.RawValue { + return bc.hc.GetHeadersFrom(number, count) +} + +// GetBody retrieves a block body (transactions and uncles) from the database by +// hash, caching it if found. +func (bc *BlockChain) GetBody(hash common.Hash) *types.Body { + // Short circuit if the body's already in the cache, retrieve otherwise + if cached, ok := bc.bodyCache.Get(hash); ok { + body := cached.(*types.Body) + return body + } + number := bc.hc.GetBlockNumber(hash) + if number == nil { + return nil + } + body := rawdb.ReadBody(bc.db, hash, *number) + if body == nil { + return nil + } + // Cache the found body for next time and return + bc.bodyCache.Add(hash, body) + return body +} + +// GetBodyRLP retrieves a block body in RLP encoding from the database by hash, +// caching it if found. +func (bc *BlockChain) GetBodyRLP(hash common.Hash) rlp.RawValue { + // Short circuit if the body's already in the cache, retrieve otherwise + if cached, ok := bc.bodyRLPCache.Get(hash); ok { + return cached.(rlp.RawValue) + } + number := bc.hc.GetBlockNumber(hash) + if number == nil { + return nil + } + body := rawdb.ReadBodyRLP(bc.db, hash, *number) + if len(body) == 0 { + return nil + } + // Cache the found body for next time and return + bc.bodyRLPCache.Add(hash, body) + return body +} + +// HasBlock checks if a block is fully present in the database or not. +func (bc *BlockChain) HasBlock(hash common.Hash, number uint64) bool { + if bc.blockCache.Contains(hash) { + return true + } + return rawdb.HasBody(bc.db, hash, number) +} + +// HasFastBlock checks if a fast block is fully present in the database or not. +func (bc *BlockChain) HasFastBlock(hash common.Hash, number uint64) bool { + if !bc.HasBlock(hash, number) { + return false + } + if bc.receiptsCache.Contains(hash) { + return true + } + return rawdb.HasReceipts(bc.db, hash, number) +} + +// GetBlock retrieves a block from the database by hash and number, +// caching it if found. +func (bc *BlockChain) GetBlock(hash common.Hash, number uint64) *types.Block { + // Short circuit if the block's already in the cache, retrieve otherwise + if block, ok := bc.blockCache.Get(hash); ok { + return block.(*types.Block) + } + block := rawdb.ReadBlock(bc.db, hash, number) + if block == nil { + return nil + } + // Cache the found block for next time and return + bc.blockCache.Add(block.Hash(), block) + return block +} + +// GetBlockByHash retrieves a block from the database by hash, caching it if found. +func (bc *BlockChain) GetBlockByHash(hash common.Hash) *types.Block { + number := bc.hc.GetBlockNumber(hash) + if number == nil { + return nil + } + return bc.GetBlock(hash, *number) +} + +// GetBlockByNumber retrieves a block from the database by number, caching it +// (associated with its hash) if found. +func (bc *BlockChain) GetBlockByNumber(number uint64) *types.Block { + hash := rawdb.ReadCanonicalHash(bc.db, number) + if hash == (common.Hash{}) { + return nil + } + return bc.GetBlock(hash, number) +} + +// GetBlocksFromHash returns the block corresponding to hash and up to n-1 ancestors. +// [deprecated by eth/62] +func (bc *BlockChain) GetBlocksFromHash(hash common.Hash, n int) (blocks []*types.Block) { + number := bc.hc.GetBlockNumber(hash) + if number == nil { + return nil + } + for i := 0; i < n; i++ { + block := bc.GetBlock(hash, *number) + if block == nil { + break + } + blocks = append(blocks, block) + hash = block.ParentHash() + *number-- + } + return +} + +// GetReceiptsByHash retrieves the receipts for all transactions in a given block. +func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts { + if receipts, ok := bc.receiptsCache.Get(hash); ok { + return receipts.(types.Receipts) + } + number := rawdb.ReadHeaderNumber(bc.db, hash) + if number == nil { + return nil + } + receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) + if receipts == nil { + return nil + } + bc.receiptsCache.Add(hash, receipts) + return receipts +} + +// GetUnclesInChain retrieves all the uncles from a given block backwards until +// a specific distance is reached. +func (bc *BlockChain) GetUnclesInChain(block *types.Block, length int) []*types.Header { + uncles := []*types.Header{} + for i := 0; block != nil && i < length; i++ { + uncles = append(uncles, block.Uncles()...) + block = bc.GetBlock(block.ParentHash(), block.NumberU64()-1) + } + return uncles +} + +// GetCanonicalHash returns the canonical hash for a given block number +func (bc *BlockChain) GetCanonicalHash(number uint64) common.Hash { + return bc.hc.GetCanonicalHash(number) +} + +// GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or +// a close ancestor of it is canonical. maxNonCanonical points to a downwards counter limiting the +// number of blocks to be individually checked before we reach the canonical chain. +// +// Note: ancestor == 0 returns the same block, 1 returns its parent and so on. +func (bc *BlockChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { + return bc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) +} + +// GetTransactionLookup retrieves the lookup associate with the given transaction +// hash from the cache or database. +func (bc *BlockChain) GetTransactionLookup(hash common.Hash) *rawdb.LegacyTxLookupEntry { + // Short circuit if the txlookup already in the cache, retrieve otherwise + if lookup, exist := bc.txLookupCache.Get(hash); exist { + return lookup.(*rawdb.LegacyTxLookupEntry) + } + tx, blockHash, blockNumber, txIndex := rawdb.ReadTransaction(bc.db, hash) + if tx == nil { + return nil + } + lookup := &rawdb.LegacyTxLookupEntry{BlockHash: blockHash, BlockIndex: blockNumber, Index: txIndex} + bc.txLookupCache.Add(hash, lookup) + return lookup +} + +// GetTd retrieves a block's total difficulty in the canonical chain from the +// database by hash and number, caching it if found. +func (bc *BlockChain) GetTd(hash common.Hash, number uint64) *big.Int { + return bc.hc.GetTd(hash, number) +} + +// HasState checks if state trie is fully present in the database or not. +func (bc *BlockChain) HasState(hash common.Hash) bool { + _, err := bc.stateCache.OpenTrie(hash) + return err == nil +} + +// HasBlockAndState checks if a block and associated state trie is fully present +// in the database or not, caching it if present. +func (bc *BlockChain) HasBlockAndState(hash common.Hash, number uint64) bool { + // Check first that the block itself is known + block := bc.GetBlock(hash, number) + if block == nil { + return false + } + return bc.HasState(block.Root()) +} + +// TrieNode retrieves a blob of data associated with a trie node +// either from ephemeral in-memory cache, or from persistent storage. +func (bc *BlockChain) TrieNode(hash common.Hash) ([]byte, error) { + return bc.stateCache.TrieDB().Node(hash) +} + +// ContractCode retrieves a blob of data associated with a contract hash +// either from ephemeral in-memory cache, or from persistent storage. +func (bc *BlockChain) ContractCode(hash common.Hash) ([]byte, error) { + return bc.stateCache.ContractCode(common.Hash{}, hash) +} + +// ContractCodeWithPrefix retrieves a blob of data associated with a contract +// hash either from ephemeral in-memory cache, or from persistent storage. +// +// If the code doesn't exist in the in-memory cache, check the storage with +// new code scheme. +func (bc *BlockChain) ContractCodeWithPrefix(hash common.Hash) ([]byte, error) { + type codeReader interface { + ContractCodeWithPrefix(addrHash, codeHash common.Hash) ([]byte, error) + } + return bc.stateCache.(codeReader).ContractCodeWithPrefix(common.Hash{}, hash) +} + +// State returns a new mutable state based on the current HEAD block. +func (bc *BlockChain) State() (*state.StateDB, error) { + return bc.StateAt(bc.CurrentBlock().Root()) +} + +// StateAt returns a new mutable state based on a particular point in time. +func (bc *BlockChain) StateAt(root common.Hash) (*state.StateDB, error) { + return state.New(root, bc.stateCache, bc.snaps) +} + +// Config retrieves the chain's fork configuration. +func (bc *BlockChain) Config() *params.ChainConfig { return bc.chainConfig } + +// Engine retrieves the blockchain's consensus engine. +func (bc *BlockChain) Engine() consensus.Engine { return bc.engine } + +// Snapshots returns the blockchain snapshot tree. +func (bc *BlockChain) Snapshots() *snapshot.Tree { + return bc.snaps +} + +// Validator returns the current validator. +func (bc *BlockChain) Validator() Validator { + return bc.validator +} + +// Processor returns the current processor. +func (bc *BlockChain) Processor() Processor { + return bc.processor +} + +// StateCache returns the caching database underpinning the blockchain instance. +func (bc *BlockChain) StateCache() state.Database { + return bc.stateCache +} + +// GasLimit returns the gas limit of the current HEAD block. +func (bc *BlockChain) GasLimit() uint64 { + return bc.CurrentBlock().GasLimit() +} + +// Genesis retrieves the chain's genesis block. +func (bc *BlockChain) Genesis() *types.Block { + return bc.genesisBlock +} + +// GetVMConfig returns the block chain VM config. +func (bc *BlockChain) GetVMConfig() *vm.Config { + return &bc.vmConfig +} + +// SetTxLookupLimit is responsible for updating the txlookup limit to the +// original one stored in db if the new mismatches with the old one. +func (bc *BlockChain) SetTxLookupLimit(limit uint64) { + bc.txLookupLimit = limit +} + +// TxLookupLimit retrieves the txlookup limit used by blockchain to prune +// stale transaction indices. +func (bc *BlockChain) TxLookupLimit() uint64 { + return bc.txLookupLimit +} + +// SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent. +func (bc *BlockChain) SubscribeRemovedLogsEvent(ch chan<- RemovedLogsEvent) event.Subscription { + return bc.scope.Track(bc.rmLogsFeed.Subscribe(ch)) +} + +// SubscribeChainEvent registers a subscription of ChainEvent. +func (bc *BlockChain) SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription { + return bc.scope.Track(bc.chainFeed.Subscribe(ch)) +} + +// SubscribeChainHeadEvent registers a subscription of ChainHeadEvent. +func (bc *BlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription { + return bc.scope.Track(bc.chainHeadFeed.Subscribe(ch)) +} + +// SubscribeChainSideEvent registers a subscription of ChainSideEvent. +func (bc *BlockChain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Subscription { + return bc.scope.Track(bc.chainSideFeed.Subscribe(ch)) +} + +// SubscribeLogsEvent registers a subscription of []*types.Log. +func (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + return bc.scope.Track(bc.logsFeed.Subscribe(ch)) +} + +// SubscribeBlockProcessingEvent registers a subscription of bool where true means +// block processing has started while false means it has stopped. +func (bc *BlockChain) SubscribeBlockProcessingEvent(ch chan<- bool) event.Subscription { + return bc.scope.Track(bc.blockProcFeed.Subscribe(ch)) +} + +// +// Bor related changes +// + +// SetStateSync set sync data in state_data +func (bc *BlockChain) SetStateSync(stateData []*types.StateSyncData) { + bc.stateSyncData = stateData +} + +// SubscribeStateSyncEvent registers a subscription of StateSyncEvent. +func (bc *BlockChain) SubscribeStateSyncEvent(ch chan<- StateSyncEvent) event.Subscription { + return bc.scope.Track(bc.stateSyncFeed.Subscribe(ch)) +} diff --git a/core/blockchain_repair_test.go b/core/blockchain_repair_test.go index aca5546e20..eb5025ed55 100644 --- a/core/blockchain_repair_test.go +++ b/core/blockchain_repair_test.go @@ -79,10 +79,10 @@ func testShortRepair(t *testing.T, snapshots bool) { // already committed, after which the process crashed. In this case we expect the full // chain to be rolled back to the committed block, but the chain data itself left in // the database for replaying. -func TestShortFastSyncedRepair(t *testing.T) { testShortFastSyncedRepair(t, false) } -func TestShortFastSyncedRepairWithSnapshots(t *testing.T) { testShortFastSyncedRepair(t, true) } +func TestShortSnapSyncedRepair(t *testing.T) { testShortSnapSyncedRepair(t, false) } +func TestShortSnapSyncedRepairWithSnapshots(t *testing.T) { testShortSnapSyncedRepair(t, true) } -func testShortFastSyncedRepair(t *testing.T, snapshots bool) { +func testShortSnapSyncedRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // @@ -119,10 +119,10 @@ func testShortFastSyncedRepair(t *testing.T, snapshots bool) { // not yet committed, but the process crashed. In this case we expect the chain to // detect that it was fast syncing and not delete anything, since we can just pick // up directly where we left off. -func TestShortFastSyncingRepair(t *testing.T) { testShortFastSyncingRepair(t, false) } -func TestShortFastSyncingRepairWithSnapshots(t *testing.T) { testShortFastSyncingRepair(t, true) } +func TestShortSnapSyncingRepair(t *testing.T) { testShortSnapSyncingRepair(t, false) } +func TestShortSnapSyncingRepairWithSnapshots(t *testing.T) { testShortSnapSyncingRepair(t, true) } -func testShortFastSyncingRepair(t *testing.T, snapshots bool) { +func testShortSnapSyncingRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // @@ -203,14 +203,14 @@ func testShortOldForkedRepair(t *testing.T, snapshots bool) { // crashed. In this test scenario the side chain is below the committed block. In // this case we expect the canonical chain to be rolled back to the committed block, // but the chain data itself left in the database for replaying. -func TestShortOldForkedFastSyncedRepair(t *testing.T) { - testShortOldForkedFastSyncedRepair(t, false) +func TestShortOldForkedSnapSyncedRepair(t *testing.T) { + testShortOldForkedSnapSyncedRepair(t, false) } -func TestShortOldForkedFastSyncedRepairWithSnapshots(t *testing.T) { - testShortOldForkedFastSyncedRepair(t, true) +func TestShortOldForkedSnapSyncedRepairWithSnapshots(t *testing.T) { + testShortOldForkedSnapSyncedRepair(t, true) } -func testShortOldForkedFastSyncedRepair(t *testing.T, snapshots bool) { +func testShortOldForkedSnapSyncedRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3 @@ -250,14 +250,14 @@ func testShortOldForkedFastSyncedRepair(t *testing.T, snapshots bool) { // test scenario the side chain is below the committed block. In this case we expect // the chain to detect that it was fast syncing and not delete anything, since we // can just pick up directly where we left off. -func TestShortOldForkedFastSyncingRepair(t *testing.T) { - testShortOldForkedFastSyncingRepair(t, false) +func TestShortOldForkedSnapSyncingRepair(t *testing.T) { + testShortOldForkedSnapSyncingRepair(t, false) } -func TestShortOldForkedFastSyncingRepairWithSnapshots(t *testing.T) { - testShortOldForkedFastSyncingRepair(t, true) +func TestShortOldForkedSnapSyncingRepairWithSnapshots(t *testing.T) { + testShortOldForkedSnapSyncingRepair(t, true) } -func testShortOldForkedFastSyncingRepair(t *testing.T, snapshots bool) { +func testShortOldForkedSnapSyncingRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3 @@ -340,14 +340,14 @@ func testShortNewlyForkedRepair(t *testing.T, snapshots bool) { // crashed. In this test scenario the side chain reaches above the committed block. // In this case we expect the canonical chain to be rolled back to the committed // block, but the chain data itself left in the database for replaying. -func TestShortNewlyForkedFastSyncedRepair(t *testing.T) { - testShortNewlyForkedFastSyncedRepair(t, false) +func TestShortNewlyForkedSnapSyncedRepair(t *testing.T) { + testShortNewlyForkedSnapSyncedRepair(t, false) } -func TestShortNewlyForkedFastSyncedRepairWithSnapshots(t *testing.T) { - testShortNewlyForkedFastSyncedRepair(t, true) +func TestShortNewlyForkedSnapSyncedRepairWithSnapshots(t *testing.T) { + testShortNewlyForkedSnapSyncedRepair(t, true) } -func testShortNewlyForkedFastSyncedRepair(t *testing.T, snapshots bool) { +func testShortNewlyForkedSnapSyncedRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3->S4->S5->S6 @@ -387,14 +387,14 @@ func testShortNewlyForkedFastSyncedRepair(t *testing.T, snapshots bool) { // this test scenario the side chain reaches above the committed block. In this // case we expect the chain to detect that it was fast syncing and not delete // anything, since we can just pick up directly where we left off. -func TestShortNewlyForkedFastSyncingRepair(t *testing.T) { - testShortNewlyForkedFastSyncingRepair(t, false) +func TestShortNewlyForkedSnapSyncingRepair(t *testing.T) { + testShortNewlyForkedSnapSyncingRepair(t, false) } -func TestShortNewlyForkedFastSyncingRepairWithSnapshots(t *testing.T) { - testShortNewlyForkedFastSyncingRepair(t, true) +func TestShortNewlyForkedSnapSyncingRepairWithSnapshots(t *testing.T) { + testShortNewlyForkedSnapSyncingRepair(t, true) } -func testShortNewlyForkedFastSyncingRepair(t *testing.T, snapshots bool) { +func testShortNewlyForkedSnapSyncingRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3->S4->S5->S6 @@ -475,14 +475,14 @@ func testShortReorgedRepair(t *testing.T, snapshots bool) { // the fast sync pivot point was already committed to disk and then the process // crashed. In this case we expect the canonical chain to be rolled back to the // committed block, but the chain data itself left in the database for replaying. -func TestShortReorgedFastSyncedRepair(t *testing.T) { - testShortReorgedFastSyncedRepair(t, false) +func TestShortReorgedSnapSyncedRepair(t *testing.T) { + testShortReorgedSnapSyncedRepair(t, false) } -func TestShortReorgedFastSyncedRepairWithSnapshots(t *testing.T) { - testShortReorgedFastSyncedRepair(t, true) +func TestShortReorgedSnapSyncedRepairWithSnapshots(t *testing.T) { + testShortReorgedSnapSyncedRepair(t, true) } -func testShortReorgedFastSyncedRepair(t *testing.T, snapshots bool) { +func testShortReorgedSnapSyncedRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10 @@ -521,14 +521,14 @@ func testShortReorgedFastSyncedRepair(t *testing.T, snapshots bool) { // the fast sync pivot point was not yet committed, but the process crashed. In // this case we expect the chain to detect that it was fast syncing and not delete // anything, since we can just pick up directly where we left off. -func TestShortReorgedFastSyncingRepair(t *testing.T) { - testShortReorgedFastSyncingRepair(t, false) +func TestShortReorgedSnapSyncingRepair(t *testing.T) { + testShortReorgedSnapSyncingRepair(t, false) } -func TestShortReorgedFastSyncingRepairWithSnapshots(t *testing.T) { - testShortReorgedFastSyncingRepair(t, true) +func TestShortReorgedSnapSyncingRepairWithSnapshots(t *testing.T) { + testShortReorgedSnapSyncingRepair(t, true) } -func testShortReorgedFastSyncingRepair(t *testing.T, snapshots bool) { +func testShortReorgedSnapSyncingRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10 @@ -656,14 +656,14 @@ func testLongDeepRepair(t *testing.T, snapshots bool) { // sync pivot point - newer than the ancient limit - was already committed, after // which the process crashed. In this case we expect the chain to be rolled back // to the committed block, with everything afterwads kept as fast sync data. -func TestLongFastSyncedShallowRepair(t *testing.T) { - testLongFastSyncedShallowRepair(t, false) +func TestLongSnapSyncedShallowRepair(t *testing.T) { + testLongSnapSyncedShallowRepair(t, false) } -func TestLongFastSyncedShallowRepairWithSnapshots(t *testing.T) { - testLongFastSyncedShallowRepair(t, true) +func TestLongSnapSyncedShallowRepairWithSnapshots(t *testing.T) { + testLongSnapSyncedShallowRepair(t, true) } -func testLongFastSyncedShallowRepair(t *testing.T, snapshots bool) { +func testLongSnapSyncedShallowRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // @@ -705,10 +705,10 @@ func testLongFastSyncedShallowRepair(t *testing.T, snapshots bool) { // sync pivot point - older than the ancient limit - was already committed, after // which the process crashed. In this case we expect the chain to be rolled back // to the committed block, with everything afterwads deleted. -func TestLongFastSyncedDeepRepair(t *testing.T) { testLongFastSyncedDeepRepair(t, false) } -func TestLongFastSyncedDeepRepairWithSnapshots(t *testing.T) { testLongFastSyncedDeepRepair(t, true) } +func TestLongSnapSyncedDeepRepair(t *testing.T) { testLongSnapSyncedDeepRepair(t, false) } +func TestLongSnapSyncedDeepRepairWithSnapshots(t *testing.T) { testLongSnapSyncedDeepRepair(t, true) } -func testLongFastSyncedDeepRepair(t *testing.T, snapshots bool) { +func testLongSnapSyncedDeepRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // @@ -750,14 +750,14 @@ func testLongFastSyncedDeepRepair(t *testing.T, snapshots bool) { // process crashed. In this case we expect the chain to detect that it was fast // syncing and not delete anything, since we can just pick up directly where we // left off. -func TestLongFastSyncingShallowRepair(t *testing.T) { - testLongFastSyncingShallowRepair(t, false) +func TestLongSnapSyncingShallowRepair(t *testing.T) { + testLongSnapSyncingShallowRepair(t, false) } -func TestLongFastSyncingShallowRepairWithSnapshots(t *testing.T) { - testLongFastSyncingShallowRepair(t, true) +func TestLongSnapSyncingShallowRepairWithSnapshots(t *testing.T) { + testLongSnapSyncingShallowRepair(t, true) } -func testLongFastSyncingShallowRepair(t *testing.T, snapshots bool) { +func testLongSnapSyncingShallowRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // @@ -800,10 +800,10 @@ func testLongFastSyncingShallowRepair(t *testing.T, snapshots bool) { // process crashed. In this case we expect the chain to detect that it was fast // syncing and not delete anything, since we can just pick up directly where we // left off. -func TestLongFastSyncingDeepRepair(t *testing.T) { testLongFastSyncingDeepRepair(t, false) } -func TestLongFastSyncingDeepRepairWithSnapshots(t *testing.T) { testLongFastSyncingDeepRepair(t, true) } +func TestLongSnapSyncingDeepRepair(t *testing.T) { testLongSnapSyncingDeepRepair(t, false) } +func TestLongSnapSyncingDeepRepairWithSnapshots(t *testing.T) { testLongSnapSyncingDeepRepair(t, true) } -func testLongFastSyncingDeepRepair(t *testing.T, snapshots bool) { +func testLongSnapSyncingDeepRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // @@ -946,14 +946,14 @@ func testLongOldForkedDeepRepair(t *testing.T, snapshots bool) { // the side chain is below the committed block. In this case we expect the chain // to be rolled back to the committed block, with everything afterwads kept as // fast sync data; the side chain completely nuked by the freezer. -func TestLongOldForkedFastSyncedShallowRepair(t *testing.T) { - testLongOldForkedFastSyncedShallowRepair(t, false) +func TestLongOldForkedSnapSyncedShallowRepair(t *testing.T) { + testLongOldForkedSnapSyncedShallowRepair(t, false) } -func TestLongOldForkedFastSyncedShallowRepairWithSnapshots(t *testing.T) { - testLongOldForkedFastSyncedShallowRepair(t, true) +func TestLongOldForkedSnapSyncedShallowRepairWithSnapshots(t *testing.T) { + testLongOldForkedSnapSyncedShallowRepair(t, true) } -func testLongOldForkedFastSyncedShallowRepair(t *testing.T, snapshots bool) { +func testLongOldForkedSnapSyncedShallowRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3 @@ -998,14 +998,14 @@ func testLongOldForkedFastSyncedShallowRepair(t *testing.T, snapshots bool) { // the side chain is below the committed block. In this case we expect the canonical // chain to be rolled back to the committed block, with everything afterwads deleted; // the side chain completely nuked by the freezer. -func TestLongOldForkedFastSyncedDeepRepair(t *testing.T) { - testLongOldForkedFastSyncedDeepRepair(t, false) +func TestLongOldForkedSnapSyncedDeepRepair(t *testing.T) { + testLongOldForkedSnapSyncedDeepRepair(t, false) } -func TestLongOldForkedFastSyncedDeepRepairWithSnapshots(t *testing.T) { - testLongOldForkedFastSyncedDeepRepair(t, true) +func TestLongOldForkedSnapSyncedDeepRepairWithSnapshots(t *testing.T) { + testLongOldForkedSnapSyncedDeepRepair(t, true) } -func testLongOldForkedFastSyncedDeepRepair(t *testing.T, snapshots bool) { +func testLongOldForkedSnapSyncedDeepRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3 @@ -1049,14 +1049,14 @@ func testLongOldForkedFastSyncedDeepRepair(t *testing.T, snapshots bool) { // chain is below the committed block. In this case we expect the chain to detect // that it was fast syncing and not delete anything. The side chain is completely // nuked by the freezer. -func TestLongOldForkedFastSyncingShallowRepair(t *testing.T) { - testLongOldForkedFastSyncingShallowRepair(t, false) +func TestLongOldForkedSnapSyncingShallowRepair(t *testing.T) { + testLongOldForkedSnapSyncingShallowRepair(t, false) } -func TestLongOldForkedFastSyncingShallowRepairWithSnapshots(t *testing.T) { - testLongOldForkedFastSyncingShallowRepair(t, true) +func TestLongOldForkedSnapSyncingShallowRepairWithSnapshots(t *testing.T) { + testLongOldForkedSnapSyncingShallowRepair(t, true) } -func testLongOldForkedFastSyncingShallowRepair(t *testing.T, snapshots bool) { +func testLongOldForkedSnapSyncingShallowRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3 @@ -1101,14 +1101,14 @@ func testLongOldForkedFastSyncingShallowRepair(t *testing.T, snapshots bool) { // chain is below the committed block. In this case we expect the chain to detect // that it was fast syncing and not delete anything. The side chain is completely // nuked by the freezer. -func TestLongOldForkedFastSyncingDeepRepair(t *testing.T) { - testLongOldForkedFastSyncingDeepRepair(t, false) +func TestLongOldForkedSnapSyncingDeepRepair(t *testing.T) { + testLongOldForkedSnapSyncingDeepRepair(t, false) } -func TestLongOldForkedFastSyncingDeepRepairWithSnapshots(t *testing.T) { - testLongOldForkedFastSyncingDeepRepair(t, true) +func TestLongOldForkedSnapSyncingDeepRepairWithSnapshots(t *testing.T) { + testLongOldForkedSnapSyncingDeepRepair(t, true) } -func testLongOldForkedFastSyncingDeepRepair(t *testing.T, snapshots bool) { +func testLongOldForkedSnapSyncingDeepRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3 @@ -1252,14 +1252,14 @@ func testLongNewerForkedDeepRepair(t *testing.T, snapshots bool) { // the side chain is above the committed block. In this case we expect the chain // to be rolled back to the committed block, with everything afterwads kept as fast // sync data; the side chain completely nuked by the freezer. -func TestLongNewerForkedFastSyncedShallowRepair(t *testing.T) { - testLongNewerForkedFastSyncedShallowRepair(t, false) +func TestLongNewerForkedSnapSyncedShallowRepair(t *testing.T) { + testLongNewerForkedSnapSyncedShallowRepair(t, false) } -func TestLongNewerForkedFastSyncedShallowRepairWithSnapshots(t *testing.T) { - testLongNewerForkedFastSyncedShallowRepair(t, true) +func TestLongNewerForkedSnapSyncedShallowRepairWithSnapshots(t *testing.T) { + testLongNewerForkedSnapSyncedShallowRepair(t, true) } -func testLongNewerForkedFastSyncedShallowRepair(t *testing.T, snapshots bool) { +func testLongNewerForkedSnapSyncedShallowRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12 @@ -1304,14 +1304,14 @@ func testLongNewerForkedFastSyncedShallowRepair(t *testing.T, snapshots bool) { // the side chain is above the committed block. In this case we expect the canonical // chain to be rolled back to the committed block, with everything afterwads deleted; // the side chain completely nuked by the freezer. -func TestLongNewerForkedFastSyncedDeepRepair(t *testing.T) { - testLongNewerForkedFastSyncedDeepRepair(t, false) +func TestLongNewerForkedSnapSyncedDeepRepair(t *testing.T) { + testLongNewerForkedSnapSyncedDeepRepair(t, false) } -func TestLongNewerForkedFastSyncedDeepRepairWithSnapshots(t *testing.T) { - testLongNewerForkedFastSyncedDeepRepair(t, true) +func TestLongNewerForkedSnapSyncedDeepRepairWithSnapshots(t *testing.T) { + testLongNewerForkedSnapSyncedDeepRepair(t, true) } -func testLongNewerForkedFastSyncedDeepRepair(t *testing.T, snapshots bool) { +func testLongNewerForkedSnapSyncedDeepRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12 @@ -1355,14 +1355,14 @@ func testLongNewerForkedFastSyncedDeepRepair(t *testing.T, snapshots bool) { // chain is above the committed block. In this case we expect the chain to detect // that it was fast syncing and not delete anything. The side chain is completely // nuked by the freezer. -func TestLongNewerForkedFastSyncingShallowRepair(t *testing.T) { - testLongNewerForkedFastSyncingShallowRepair(t, false) +func TestLongNewerForkedSnapSyncingShallowRepair(t *testing.T) { + testLongNewerForkedSnapSyncingShallowRepair(t, false) } -func TestLongNewerForkedFastSyncingShallowRepairWithSnapshots(t *testing.T) { - testLongNewerForkedFastSyncingShallowRepair(t, true) +func TestLongNewerForkedSnapSyncingShallowRepairWithSnapshots(t *testing.T) { + testLongNewerForkedSnapSyncingShallowRepair(t, true) } -func testLongNewerForkedFastSyncingShallowRepair(t *testing.T, snapshots bool) { +func testLongNewerForkedSnapSyncingShallowRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12 @@ -1407,14 +1407,14 @@ func testLongNewerForkedFastSyncingShallowRepair(t *testing.T, snapshots bool) { // chain is above the committed block. In this case we expect the chain to detect // that it was fast syncing and not delete anything. The side chain is completely // nuked by the freezer. -func TestLongNewerForkedFastSyncingDeepRepair(t *testing.T) { - testLongNewerForkedFastSyncingDeepRepair(t, false) +func TestLongNewerForkedSnapSyncingDeepRepair(t *testing.T) { + testLongNewerForkedSnapSyncingDeepRepair(t, false) } -func TestLongNewerForkedFastSyncingDeepRepairWithSnapshots(t *testing.T) { - testLongNewerForkedFastSyncingDeepRepair(t, true) +func TestLongNewerForkedSnapSyncingDeepRepairWithSnapshots(t *testing.T) { + testLongNewerForkedSnapSyncingDeepRepair(t, true) } -func testLongNewerForkedFastSyncingDeepRepair(t *testing.T, snapshots bool) { +func testLongNewerForkedSnapSyncingDeepRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12 @@ -1552,14 +1552,14 @@ func testLongReorgedDeepRepair(t *testing.T, snapshots bool) { // expect the chain to be rolled back to the committed block, with everything // afterwads kept as fast sync data. The side chain completely nuked by the // freezer. -func TestLongReorgedFastSyncedShallowRepair(t *testing.T) { - testLongReorgedFastSyncedShallowRepair(t, false) +func TestLongReorgedSnapSyncedShallowRepair(t *testing.T) { + testLongReorgedSnapSyncedShallowRepair(t, false) } -func TestLongReorgedFastSyncedShallowRepairWithSnapshots(t *testing.T) { - testLongReorgedFastSyncedShallowRepair(t, true) +func TestLongReorgedSnapSyncedShallowRepairWithSnapshots(t *testing.T) { + testLongReorgedSnapSyncedShallowRepair(t, true) } -func testLongReorgedFastSyncedShallowRepair(t *testing.T, snapshots bool) { +func testLongReorgedSnapSyncedShallowRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12->S13->S14->S15->S16->S17->S18->S19->S20->S21->S22->S23->S24->S25->S26 @@ -1603,14 +1603,14 @@ func testLongReorgedFastSyncedShallowRepair(t *testing.T, snapshots bool) { // was already committed to disk and then the process crashed. In this case we // expect the canonical chains to be rolled back to the committed block, with // everything afterwads deleted. The side chain completely nuked by the freezer. -func TestLongReorgedFastSyncedDeepRepair(t *testing.T) { - testLongReorgedFastSyncedDeepRepair(t, false) +func TestLongReorgedSnapSyncedDeepRepair(t *testing.T) { + testLongReorgedSnapSyncedDeepRepair(t, false) } -func TestLongReorgedFastSyncedDeepRepairWithSnapshots(t *testing.T) { - testLongReorgedFastSyncedDeepRepair(t, true) +func TestLongReorgedSnapSyncedDeepRepairWithSnapshots(t *testing.T) { + testLongReorgedSnapSyncedDeepRepair(t, true) } -func testLongReorgedFastSyncedDeepRepair(t *testing.T, snapshots bool) { +func testLongReorgedSnapSyncedDeepRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12->S13->S14->S15->S16->S17->S18->S19->S20->S21->S22->S23->S24->S25->S26 @@ -1653,14 +1653,14 @@ func testLongReorgedFastSyncedDeepRepair(t *testing.T, snapshots bool) { // was not yet committed, but the process crashed. In this case we expect the // chain to detect that it was fast syncing and not delete anything, since we // can just pick up directly where we left off. -func TestLongReorgedFastSyncingShallowRepair(t *testing.T) { - testLongReorgedFastSyncingShallowRepair(t, false) +func TestLongReorgedSnapSyncingShallowRepair(t *testing.T) { + testLongReorgedSnapSyncingShallowRepair(t, false) } -func TestLongReorgedFastSyncingShallowRepairWithSnapshots(t *testing.T) { - testLongReorgedFastSyncingShallowRepair(t, true) +func TestLongReorgedSnapSyncingShallowRepairWithSnapshots(t *testing.T) { + testLongReorgedSnapSyncingShallowRepair(t, true) } -func testLongReorgedFastSyncingShallowRepair(t *testing.T, snapshots bool) { +func testLongReorgedSnapSyncingShallowRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12->S13->S14->S15->S16->S17->S18->S19->S20->S21->S22->S23->S24->S25->S26 @@ -1704,14 +1704,14 @@ func testLongReorgedFastSyncingShallowRepair(t *testing.T, snapshots bool) { // was not yet committed, but the process crashed. In this case we expect the // chain to detect that it was fast syncing and not delete anything, since we // can just pick up directly where we left off. -func TestLongReorgedFastSyncingDeepRepair(t *testing.T) { - testLongReorgedFastSyncingDeepRepair(t, false) +func TestLongReorgedSnapSyncingDeepRepair(t *testing.T) { + testLongReorgedSnapSyncingDeepRepair(t, false) } -func TestLongReorgedFastSyncingDeepRepairWithSnapshots(t *testing.T) { - testLongReorgedFastSyncingDeepRepair(t, true) +func TestLongReorgedSnapSyncingDeepRepairWithSnapshots(t *testing.T) { + testLongReorgedSnapSyncingDeepRepair(t, true) } -func testLongReorgedFastSyncingDeepRepair(t *testing.T, snapshots bool) { +func testLongReorgedSnapSyncingDeepRepair(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12->S13->S14->S15->S16->S17->S18->S19->S20->S21->S22->S23->S24->S25->S26 @@ -1829,7 +1829,7 @@ func testRepair(t *testing.T, tt *rewindTest, snapshots bool) { // Pull the plug on the database, simulating a hard crash db.Close() - // Start a new blockchain back up and see where the repait leads us + // Start a new blockchain back up and see where the repair leads us db, err = rawdb.NewLevelDBDatabaseWithFreezer(datadir, 0, 0, datadir, "", false) if err != nil { t.Fatalf("Failed to reopen persistent database: %v", err) @@ -1863,3 +1863,124 @@ func testRepair(t *testing.T, tt *rewindTest, snapshots bool) { t.Errorf("Frozen block count mismatch: have %d, want %d", frozen, tt.expFrozen) } } + +// TestIssue23496 tests scenario described in https://github.com/ethereum/go-ethereum/pull/23496#issuecomment-926393893 +// Credits to @zzyalbert for finding the issue. +// +// Local chain owns these blocks: +// G B1 B2 B3 B4 +// B1: state committed +// B2: snapshot disk layer +// B3: state committed +// B4: head block +// +// Crash happens without fully persisting snapshot and in-memory states, +// chain rewinds itself to the B1 (skip B3 in order to recover snapshot) +// In this case the snapshot layer of B3 is not created because of existent +// state. +func TestIssue23496(t *testing.T) { + // It's hard to follow the test case, visualize the input + //log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) + + // Create a temporary persistent database + datadir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("Failed to create temporary datadir: %v", err) + } + os.RemoveAll(datadir) + + db, err := rawdb.NewLevelDBDatabaseWithFreezer(datadir, 0, 0, datadir, "", false) + if err != nil { + t.Fatalf("Failed to create persistent database: %v", err) + } + defer db.Close() // Might double close, should be fine + + // Initialize a fresh chain + var ( + genesis = (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) + engine = ethash.NewFullFaker() + config = &CacheConfig{ + TrieCleanLimit: 256, + TrieDirtyLimit: 256, + TrieTimeLimit: 5 * time.Minute, + SnapshotLimit: 256, + SnapshotWait: true, + } + ) + chain, err := NewBlockChain(db, config, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + if err != nil { + t.Fatalf("Failed to create chain: %v", err) + } + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), 4, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{0x02}) + b.SetDifficulty(big.NewInt(1000000)) + }) + + // Insert block B1 and commit the state into disk + if _, err := chain.InsertChain(blocks[:1]); err != nil { + t.Fatalf("Failed to import canonical chain start: %v", err) + } + chain.stateCache.TrieDB().Commit(blocks[0].Root(), true, nil) + + // Insert block B2 and commit the snapshot into disk + if _, err := chain.InsertChain(blocks[1:2]); err != nil { + t.Fatalf("Failed to import canonical chain start: %v", err) + } + if err := chain.snaps.Cap(blocks[1].Root(), 0); err != nil { + t.Fatalf("Failed to flatten snapshots: %v", err) + } + + // Insert block B3 and commit the state into disk + if _, err := chain.InsertChain(blocks[2:3]); err != nil { + t.Fatalf("Failed to import canonical chain start: %v", err) + } + chain.stateCache.TrieDB().Commit(blocks[2].Root(), true, nil) + + // Insert the remaining blocks + if _, err := chain.InsertChain(blocks[3:]); err != nil { + t.Fatalf("Failed to import canonical chain tail: %v", err) + } + + // Pull the plug on the database, simulating a hard crash + db.Close() + + // Start a new blockchain back up and see where the repair leads us + db, err = rawdb.NewLevelDBDatabaseWithFreezer(datadir, 0, 0, datadir, "", false) + if err != nil { + t.Fatalf("Failed to reopen persistent database: %v", err) + } + defer db.Close() + + chain, err = NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + if err != nil { + t.Fatalf("Failed to recreate chain: %v", err) + } + defer chain.Stop() + + if head := chain.CurrentHeader(); head.Number.Uint64() != uint64(4) { + t.Errorf("Head header mismatch: have %d, want %d", head.Number, 4) + } + if head := chain.CurrentFastBlock(); head.NumberU64() != uint64(4) { + t.Errorf("Head fast block mismatch: have %d, want %d", head.NumberU64(), uint64(4)) + } + if head := chain.CurrentBlock(); head.NumberU64() != uint64(1) { + t.Errorf("Head block mismatch: have %d, want %d", head.NumberU64(), uint64(1)) + } + + // Reinsert B2-B4 + if _, err := chain.InsertChain(blocks[1:]); err != nil { + t.Fatalf("Failed to import canonical chain tail: %v", err) + } + if head := chain.CurrentHeader(); head.Number.Uint64() != uint64(4) { + t.Errorf("Head header mismatch: have %d, want %d", head.Number, 4) + } + if head := chain.CurrentFastBlock(); head.NumberU64() != uint64(4) { + t.Errorf("Head fast block mismatch: have %d, want %d", head.NumberU64(), uint64(4)) + } + if head := chain.CurrentBlock(); head.NumberU64() != uint64(4) { + t.Errorf("Head block mismatch: have %d, want %d", head.NumberU64(), uint64(4)) + } + if layer := chain.Snapshots().Snapshot(blocks[2].Root()); layer == nil { + t.Error("Failed to regenerate the snapshot of known state") + } +} diff --git a/core/blockchain_sethead_test.go b/core/blockchain_sethead_test.go index 27b6be6e13..b2b3a058a4 100644 --- a/core/blockchain_sethead_test.go +++ b/core/blockchain_sethead_test.go @@ -194,10 +194,10 @@ func testShortSetHead(t *testing.T, snapshots bool) { // Everything above the sethead point should be deleted. In between the committed // block and the requested head the data can remain as "fast sync" data to avoid // redownloading it. -func TestShortFastSyncedSetHead(t *testing.T) { testShortFastSyncedSetHead(t, false) } -func TestShortFastSyncedSetHeadWithSnapshots(t *testing.T) { testShortFastSyncedSetHead(t, true) } +func TestShortSnapSyncedSetHead(t *testing.T) { testShortSnapSyncedSetHead(t, false) } +func TestShortSnapSyncedSetHeadWithSnapshots(t *testing.T) { testShortSnapSyncedSetHead(t, true) } -func testShortFastSyncedSetHead(t *testing.T, snapshots bool) { +func testShortSnapSyncedSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // @@ -236,10 +236,10 @@ func testShortFastSyncedSetHead(t *testing.T, snapshots bool) { // detect that it was fast syncing and delete everything from the new head, since // we can just pick up fast syncing from there. The head full block should be set // to the genesis. -func TestShortFastSyncingSetHead(t *testing.T) { testShortFastSyncingSetHead(t, false) } -func TestShortFastSyncingSetHeadWithSnapshots(t *testing.T) { testShortFastSyncingSetHead(t, true) } +func TestShortSnapSyncingSetHead(t *testing.T) { testShortSnapSyncingSetHead(t, false) } +func TestShortSnapSyncingSetHeadWithSnapshots(t *testing.T) { testShortSnapSyncingSetHead(t, true) } -func testShortFastSyncingSetHead(t *testing.T, snapshots bool) { +func testShortSnapSyncingSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // @@ -326,14 +326,14 @@ func testShortOldForkedSetHead(t *testing.T, snapshots bool) { // block. Everything above the sethead point should be deleted. In between the // committed block and the requested head the data can remain as "fast sync" data // to avoid redownloading it. The side chain should be left alone as it was shorter. -func TestShortOldForkedFastSyncedSetHead(t *testing.T) { - testShortOldForkedFastSyncedSetHead(t, false) +func TestShortOldForkedSnapSyncedSetHead(t *testing.T) { + testShortOldForkedSnapSyncedSetHead(t, false) } -func TestShortOldForkedFastSyncedSetHeadWithSnapshots(t *testing.T) { - testShortOldForkedFastSyncedSetHead(t, true) +func TestShortOldForkedSnapSyncedSetHeadWithSnapshots(t *testing.T) { + testShortOldForkedSnapSyncedSetHead(t, true) } -func testShortOldForkedFastSyncedSetHead(t *testing.T, snapshots bool) { +func testShortOldForkedSnapSyncedSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3 @@ -375,14 +375,14 @@ func testShortOldForkedFastSyncedSetHead(t *testing.T, snapshots bool) { // the chain to detect that it was fast syncing and delete everything from the new // head, since we can just pick up fast syncing from there. The head full block // should be set to the genesis. -func TestShortOldForkedFastSyncingSetHead(t *testing.T) { - testShortOldForkedFastSyncingSetHead(t, false) +func TestShortOldForkedSnapSyncingSetHead(t *testing.T) { + testShortOldForkedSnapSyncingSetHead(t, false) } -func TestShortOldForkedFastSyncingSetHeadWithSnapshots(t *testing.T) { - testShortOldForkedFastSyncingSetHead(t, true) +func TestShortOldForkedSnapSyncingSetHeadWithSnapshots(t *testing.T) { + testShortOldForkedSnapSyncingSetHead(t, true) } -func testShortOldForkedFastSyncingSetHead(t *testing.T, snapshots bool) { +func testShortOldForkedSnapSyncingSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3 @@ -478,14 +478,14 @@ func testShortNewlyForkedSetHead(t *testing.T, snapshots bool) { // The side chain could be left to be if the fork point was before the new head // we are deleting to, but it would be exceedingly hard to detect that case and // properly handle it, so we'll trade extra work in exchange for simpler code. -func TestShortNewlyForkedFastSyncedSetHead(t *testing.T) { - testShortNewlyForkedFastSyncedSetHead(t, false) +func TestShortNewlyForkedSnapSyncedSetHead(t *testing.T) { + testShortNewlyForkedSnapSyncedSetHead(t, false) } -func TestShortNewlyForkedFastSyncedSetHeadWithSnapshots(t *testing.T) { - testShortNewlyForkedFastSyncedSetHead(t, true) +func TestShortNewlyForkedSnapSyncedSetHeadWithSnapshots(t *testing.T) { + testShortNewlyForkedSnapSyncedSetHead(t, true) } -func testShortNewlyForkedFastSyncedSetHead(t *testing.T, snapshots bool) { +func testShortNewlyForkedSnapSyncedSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8 @@ -531,14 +531,14 @@ func testShortNewlyForkedFastSyncedSetHead(t *testing.T, snapshots bool) { // The side chain could be left to be if the fork point was before the new head // we are deleting to, but it would be exceedingly hard to detect that case and // properly handle it, so we'll trade extra work in exchange for simpler code. -func TestShortNewlyForkedFastSyncingSetHead(t *testing.T) { - testShortNewlyForkedFastSyncingSetHead(t, false) +func TestShortNewlyForkedSnapSyncingSetHead(t *testing.T) { + testShortNewlyForkedSnapSyncingSetHead(t, false) } -func TestShortNewlyForkedFastSyncingSetHeadWithSnapshots(t *testing.T) { - testShortNewlyForkedFastSyncingSetHead(t, true) +func TestShortNewlyForkedSnapSyncingSetHeadWithSnapshots(t *testing.T) { + testShortNewlyForkedSnapSyncingSetHead(t, true) } -func testShortNewlyForkedFastSyncingSetHead(t *testing.T, snapshots bool) { +func testShortNewlyForkedSnapSyncingSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8 @@ -634,14 +634,14 @@ func testShortReorgedSetHead(t *testing.T, snapshots bool) { // The side chain could be left to be if the fork point was before the new head // we are deleting to, but it would be exceedingly hard to detect that case and // properly handle it, so we'll trade extra work in exchange for simpler code. -func TestShortReorgedFastSyncedSetHead(t *testing.T) { - testShortReorgedFastSyncedSetHead(t, false) +func TestShortReorgedSnapSyncedSetHead(t *testing.T) { + testShortReorgedSnapSyncedSetHead(t, false) } -func TestShortReorgedFastSyncedSetHeadWithSnapshots(t *testing.T) { - testShortReorgedFastSyncedSetHead(t, true) +func TestShortReorgedSnapSyncedSetHeadWithSnapshots(t *testing.T) { + testShortReorgedSnapSyncedSetHead(t, true) } -func testShortReorgedFastSyncedSetHead(t *testing.T, snapshots bool) { +func testShortReorgedSnapSyncedSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10 @@ -686,14 +686,14 @@ func testShortReorgedFastSyncedSetHead(t *testing.T, snapshots bool) { // The side chain could be left to be if the fork point was before the new head // we are deleting to, but it would be exceedingly hard to detect that case and // properly handle it, so we'll trade extra work in exchange for simpler code. -func TestShortReorgedFastSyncingSetHead(t *testing.T) { - testShortReorgedFastSyncingSetHead(t, false) +func TestShortReorgedSnapSyncingSetHead(t *testing.T) { + testShortReorgedSnapSyncingSetHead(t, false) } -func TestShortReorgedFastSyncingSetHeadWithSnapshots(t *testing.T) { - testShortReorgedFastSyncingSetHead(t, true) +func TestShortReorgedSnapSyncingSetHeadWithSnapshots(t *testing.T) { + testShortReorgedSnapSyncingSetHead(t, true) } -func testShortReorgedFastSyncingSetHead(t *testing.T, snapshots bool) { +func testShortReorgedSnapSyncingSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10 @@ -829,14 +829,14 @@ func testLongDeepSetHead(t *testing.T, snapshots bool) { // back to the committed block. Everything above the sethead point should be // deleted. In between the committed block and the requested head the data can // remain as "fast sync" data to avoid redownloading it. -func TestLongFastSyncedShallowSetHead(t *testing.T) { - testLongFastSyncedShallowSetHead(t, false) +func TestLongSnapSyncedShallowSetHead(t *testing.T) { + testLongSnapSyncedShallowSetHead(t, false) } -func TestLongFastSyncedShallowSetHeadWithSnapshots(t *testing.T) { - testLongFastSyncedShallowSetHead(t, true) +func TestLongSnapSyncedShallowSetHeadWithSnapshots(t *testing.T) { + testLongSnapSyncedShallowSetHead(t, true) } -func testLongFastSyncedShallowSetHead(t *testing.T, snapshots bool) { +func testLongSnapSyncedShallowSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // @@ -880,10 +880,10 @@ func testLongFastSyncedShallowSetHead(t *testing.T, snapshots bool) { // which sethead was called. In this case we expect the full chain to be rolled // back to the committed block. Since the ancient limit was underflown, everything // needs to be deleted onwards to avoid creating a gap. -func TestLongFastSyncedDeepSetHead(t *testing.T) { testLongFastSyncedDeepSetHead(t, false) } -func TestLongFastSyncedDeepSetHeadWithSnapshots(t *testing.T) { testLongFastSyncedDeepSetHead(t, true) } +func TestLongSnapSyncedDeepSetHead(t *testing.T) { testLongSnapSyncedDeepSetHead(t, false) } +func TestLongSnapSyncedDeepSetHeadWithSnapshots(t *testing.T) { testLongSnapSyncedDeepSetHead(t, true) } -func testLongFastSyncedDeepSetHead(t *testing.T, snapshots bool) { +func testLongSnapSyncedDeepSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // @@ -926,14 +926,14 @@ func testLongFastSyncedDeepSetHead(t *testing.T, snapshots bool) { // sethead was called. In this case we expect the chain to detect that it was fast // syncing and delete everything from the new head, since we can just pick up fast // syncing from there. -func TestLongFastSyncingShallowSetHead(t *testing.T) { - testLongFastSyncingShallowSetHead(t, false) +func TestLongSnapSyncingShallowSetHead(t *testing.T) { + testLongSnapSyncingShallowSetHead(t, false) } -func TestLongFastSyncingShallowSetHeadWithSnapshots(t *testing.T) { - testLongFastSyncingShallowSetHead(t, true) +func TestLongSnapSyncingShallowSetHeadWithSnapshots(t *testing.T) { + testLongSnapSyncingShallowSetHead(t, true) } -func testLongFastSyncingShallowSetHead(t *testing.T, snapshots bool) { +func testLongSnapSyncingShallowSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // @@ -977,14 +977,14 @@ func testLongFastSyncingShallowSetHead(t *testing.T, snapshots bool) { // sethead was called. In this case we expect the chain to detect that it was fast // syncing and delete everything from the new head, since we can just pick up fast // syncing from there. -func TestLongFastSyncingDeepSetHead(t *testing.T) { - testLongFastSyncingDeepSetHead(t, false) +func TestLongSnapSyncingDeepSetHead(t *testing.T) { + testLongSnapSyncingDeepSetHead(t, false) } -func TestLongFastSyncingDeepSetHeadWithSnapshots(t *testing.T) { - testLongFastSyncingDeepSetHead(t, true) +func TestLongSnapSyncingDeepSetHeadWithSnapshots(t *testing.T) { + testLongSnapSyncingDeepSetHead(t, true) } -func testLongFastSyncingDeepSetHead(t *testing.T, snapshots bool) { +func testLongSnapSyncingDeepSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // @@ -1132,14 +1132,14 @@ func testLongOldForkedDeepSetHead(t *testing.T, snapshots bool) { // sethead point should be deleted. In between the committed block and the // requested head the data can remain as "fast sync" data to avoid redownloading // it. The side chain is nuked by the freezer. -func TestLongOldForkedFastSyncedShallowSetHead(t *testing.T) { - testLongOldForkedFastSyncedShallowSetHead(t, false) +func TestLongOldForkedSnapSyncedShallowSetHead(t *testing.T) { + testLongOldForkedSnapSyncedShallowSetHead(t, false) } -func TestLongOldForkedFastSyncedShallowSetHeadWithSnapshots(t *testing.T) { - testLongOldForkedFastSyncedShallowSetHead(t, true) +func TestLongOldForkedSnapSyncedShallowSetHeadWithSnapshots(t *testing.T) { + testLongOldForkedSnapSyncedShallowSetHead(t, true) } -func testLongOldForkedFastSyncedShallowSetHead(t *testing.T, snapshots bool) { +func testLongOldForkedSnapSyncedShallowSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3 @@ -1186,14 +1186,14 @@ func testLongOldForkedFastSyncedShallowSetHead(t *testing.T, snapshots bool) { // full chain to be rolled back to the committed block. Since the ancient limit was // underflown, everything needs to be deleted onwards to avoid creating a gap. The // side chain is nuked by the freezer. -func TestLongOldForkedFastSyncedDeepSetHead(t *testing.T) { - testLongOldForkedFastSyncedDeepSetHead(t, false) +func TestLongOldForkedSnapSyncedDeepSetHead(t *testing.T) { + testLongOldForkedSnapSyncedDeepSetHead(t, false) } -func TestLongOldForkedFastSyncedDeepSetHeadWithSnapshots(t *testing.T) { - testLongOldForkedFastSyncedDeepSetHead(t, true) +func TestLongOldForkedSnapSyncedDeepSetHeadWithSnapshots(t *testing.T) { + testLongOldForkedSnapSyncedDeepSetHead(t, true) } -func testLongOldForkedFastSyncedDeepSetHead(t *testing.T, snapshots bool) { +func testLongOldForkedSnapSyncedDeepSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3 @@ -1239,14 +1239,14 @@ func testLongOldForkedFastSyncedDeepSetHead(t *testing.T, snapshots bool) { // that it was fast syncing and delete everything from the new head, since we can // just pick up fast syncing from there. The side chain is completely nuked by the // freezer. -func TestLongOldForkedFastSyncingShallowSetHead(t *testing.T) { - testLongOldForkedFastSyncingShallowSetHead(t, false) +func TestLongOldForkedSnapSyncingShallowSetHead(t *testing.T) { + testLongOldForkedSnapSyncingShallowSetHead(t, false) } -func TestLongOldForkedFastSyncingShallowSetHeadWithSnapshots(t *testing.T) { - testLongOldForkedFastSyncingShallowSetHead(t, true) +func TestLongOldForkedSnapSyncingShallowSetHeadWithSnapshots(t *testing.T) { + testLongOldForkedSnapSyncingShallowSetHead(t, true) } -func testLongOldForkedFastSyncingShallowSetHead(t *testing.T, snapshots bool) { +func testLongOldForkedSnapSyncingShallowSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3 @@ -1293,14 +1293,14 @@ func testLongOldForkedFastSyncingShallowSetHead(t *testing.T, snapshots bool) { // that it was fast syncing and delete everything from the new head, since we can // just pick up fast syncing from there. The side chain is completely nuked by the // freezer. -func TestLongOldForkedFastSyncingDeepSetHead(t *testing.T) { - testLongOldForkedFastSyncingDeepSetHead(t, false) +func TestLongOldForkedSnapSyncingDeepSetHead(t *testing.T) { + testLongOldForkedSnapSyncingDeepSetHead(t, false) } -func TestLongOldForkedFastSyncingDeepSetHeadWithSnapshots(t *testing.T) { - testLongOldForkedFastSyncingDeepSetHead(t, true) +func TestLongOldForkedSnapSyncingDeepSetHeadWithSnapshots(t *testing.T) { + testLongOldForkedSnapSyncingDeepSetHead(t, true) } -func testLongOldForkedFastSyncingDeepSetHead(t *testing.T, snapshots bool) { +func testLongOldForkedSnapSyncingDeepSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3 @@ -1446,15 +1446,15 @@ func testLongNewerForkedDeepSetHead(t *testing.T, snapshots bool) { // side chain, where the fast sync pivot point - newer than the ancient limit - // was already committed to disk and then sethead was called. In this test scenario // the side chain is above the committed block. In this case the freezer will delete -// the sidechain since it's dangling, reverting to TestLongFastSyncedShallowSetHead. -func TestLongNewerForkedFastSyncedShallowSetHead(t *testing.T) { - testLongNewerForkedFastSyncedShallowSetHead(t, false) +// the sidechain since it's dangling, reverting to TestLongSnapSyncedShallowSetHead. +func TestLongNewerForkedSnapSyncedShallowSetHead(t *testing.T) { + testLongNewerForkedSnapSyncedShallowSetHead(t, false) } -func TestLongNewerForkedFastSyncedShallowSetHeadWithSnapshots(t *testing.T) { - testLongNewerForkedFastSyncedShallowSetHead(t, true) +func TestLongNewerForkedSnapSyncedShallowSetHeadWithSnapshots(t *testing.T) { + testLongNewerForkedSnapSyncedShallowSetHead(t, true) } -func testLongNewerForkedFastSyncedShallowSetHead(t *testing.T, snapshots bool) { +func testLongNewerForkedSnapSyncedShallowSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12 @@ -1498,15 +1498,15 @@ func testLongNewerForkedFastSyncedShallowSetHead(t *testing.T, snapshots bool) { // side chain, where the fast sync pivot point - older than the ancient limit - // was already committed to disk and then sethead was called. In this test scenario // the side chain is above the committed block. In this case the freezer will delete -// the sidechain since it's dangling, reverting to TestLongFastSyncedDeepSetHead. -func TestLongNewerForkedFastSyncedDeepSetHead(t *testing.T) { - testLongNewerForkedFastSyncedDeepSetHead(t, false) +// the sidechain since it's dangling, reverting to TestLongSnapSyncedDeepSetHead. +func TestLongNewerForkedSnapSyncedDeepSetHead(t *testing.T) { + testLongNewerForkedSnapSyncedDeepSetHead(t, false) } -func TestLongNewerForkedFastSyncedDeepSetHeadWithSnapshots(t *testing.T) { - testLongNewerForkedFastSyncedDeepSetHead(t, true) +func TestLongNewerForkedSnapSyncedDeepSetHeadWithSnapshots(t *testing.T) { + testLongNewerForkedSnapSyncedDeepSetHead(t, true) } -func testLongNewerForkedFastSyncedDeepSetHead(t *testing.T, snapshots bool) { +func testLongNewerForkedSnapSyncedDeepSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12 @@ -1549,15 +1549,15 @@ func testLongNewerForkedFastSyncedDeepSetHead(t *testing.T, snapshots bool) { // side chain, where the fast sync pivot point - newer than the ancient limit - // was not yet committed, but sethead was called. In this test scenario the side // chain is above the committed block. In this case the freezer will delete the -// sidechain since it's dangling, reverting to TestLongFastSyncinghallowSetHead. -func TestLongNewerForkedFastSyncingShallowSetHead(t *testing.T) { - testLongNewerForkedFastSyncingShallowSetHead(t, false) +// sidechain since it's dangling, reverting to TestLongSnapSyncinghallowSetHead. +func TestLongNewerForkedSnapSyncingShallowSetHead(t *testing.T) { + testLongNewerForkedSnapSyncingShallowSetHead(t, false) } -func TestLongNewerForkedFastSyncingShallowSetHeadWithSnapshots(t *testing.T) { - testLongNewerForkedFastSyncingShallowSetHead(t, true) +func TestLongNewerForkedSnapSyncingShallowSetHeadWithSnapshots(t *testing.T) { + testLongNewerForkedSnapSyncingShallowSetHead(t, true) } -func testLongNewerForkedFastSyncingShallowSetHead(t *testing.T, snapshots bool) { +func testLongNewerForkedSnapSyncingShallowSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12 @@ -1601,15 +1601,15 @@ func testLongNewerForkedFastSyncingShallowSetHead(t *testing.T, snapshots bool) // side chain, where the fast sync pivot point - older than the ancient limit - // was not yet committed, but sethead was called. In this test scenario the side // chain is above the committed block. In this case the freezer will delete the -// sidechain since it's dangling, reverting to TestLongFastSyncingDeepSetHead. -func TestLongNewerForkedFastSyncingDeepSetHead(t *testing.T) { - testLongNewerForkedFastSyncingDeepSetHead(t, false) +// sidechain since it's dangling, reverting to TestLongSnapSyncingDeepSetHead. +func TestLongNewerForkedSnapSyncingDeepSetHead(t *testing.T) { + testLongNewerForkedSnapSyncingDeepSetHead(t, false) } -func TestLongNewerForkedFastSyncingDeepSetHeadWithSnapshots(t *testing.T) { - testLongNewerForkedFastSyncingDeepSetHead(t, true) +func TestLongNewerForkedSnapSyncingDeepSetHeadWithSnapshots(t *testing.T) { + testLongNewerForkedSnapSyncingDeepSetHead(t, true) } -func testLongNewerForkedFastSyncingDeepSetHead(t *testing.T, snapshots bool) { +func testLongNewerForkedSnapSyncingDeepSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12 @@ -1745,15 +1745,15 @@ func testLongReorgedDeepSetHead(t *testing.T, snapshots bool) { // side chain, where the fast sync pivot point - newer than the ancient limit - // was already committed to disk and then sethead was called. In this case the // freezer will delete the sidechain since it's dangling, reverting to -// TestLongFastSyncedShallowSetHead. -func TestLongReorgedFastSyncedShallowSetHead(t *testing.T) { - testLongReorgedFastSyncedShallowSetHead(t, false) +// TestLongSnapSyncedShallowSetHead. +func TestLongReorgedSnapSyncedShallowSetHead(t *testing.T) { + testLongReorgedSnapSyncedShallowSetHead(t, false) } -func TestLongReorgedFastSyncedShallowSetHeadWithSnapshots(t *testing.T) { - testLongReorgedFastSyncedShallowSetHead(t, true) +func TestLongReorgedSnapSyncedShallowSetHeadWithSnapshots(t *testing.T) { + testLongReorgedSnapSyncedShallowSetHead(t, true) } -func testLongReorgedFastSyncedShallowSetHead(t *testing.T, snapshots bool) { +func testLongReorgedSnapSyncedShallowSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12->S13->S14->S15->S16->S17->S18->S19->S20->S21->S22->S23->S24->S25->S26 @@ -1797,15 +1797,15 @@ func testLongReorgedFastSyncedShallowSetHead(t *testing.T, snapshots bool) { // side chain, where the fast sync pivot point - older than the ancient limit - // was already committed to disk and then sethead was called. In this case the // freezer will delete the sidechain since it's dangling, reverting to -// TestLongFastSyncedDeepSetHead. -func TestLongReorgedFastSyncedDeepSetHead(t *testing.T) { - testLongReorgedFastSyncedDeepSetHead(t, false) +// TestLongSnapSyncedDeepSetHead. +func TestLongReorgedSnapSyncedDeepSetHead(t *testing.T) { + testLongReorgedSnapSyncedDeepSetHead(t, false) } -func TestLongReorgedFastSyncedDeepSetHeadWithSnapshots(t *testing.T) { - testLongReorgedFastSyncedDeepSetHead(t, true) +func TestLongReorgedSnapSyncedDeepSetHeadWithSnapshots(t *testing.T) { + testLongReorgedSnapSyncedDeepSetHead(t, true) } -func testLongReorgedFastSyncedDeepSetHead(t *testing.T, snapshots bool) { +func testLongReorgedSnapSyncedDeepSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12->S13->S14->S15->S16->S17->S18->S19->S20->S21->S22->S23->S24->S25->S26 @@ -1850,14 +1850,14 @@ func testLongReorgedFastSyncedDeepSetHead(t *testing.T, snapshots bool) { // chain to detect that it was fast syncing and delete everything from the new // head, since we can just pick up fast syncing from there. The side chain is // completely nuked by the freezer. -func TestLongReorgedFastSyncingShallowSetHead(t *testing.T) { - testLongReorgedFastSyncingShallowSetHead(t, false) +func TestLongReorgedSnapSyncingShallowSetHead(t *testing.T) { + testLongReorgedSnapSyncingShallowSetHead(t, false) } -func TestLongReorgedFastSyncingShallowSetHeadWithSnapshots(t *testing.T) { - testLongReorgedFastSyncingShallowSetHead(t, true) +func TestLongReorgedSnapSyncingShallowSetHeadWithSnapshots(t *testing.T) { + testLongReorgedSnapSyncingShallowSetHead(t, true) } -func testLongReorgedFastSyncingShallowSetHead(t *testing.T, snapshots bool) { +func testLongReorgedSnapSyncingShallowSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12->S13->S14->S15->S16->S17->S18->S19->S20->S21->S22->S23->S24->S25->S26 @@ -1903,14 +1903,14 @@ func testLongReorgedFastSyncingShallowSetHead(t *testing.T, snapshots bool) { // chain to detect that it was fast syncing and delete everything from the new // head, since we can just pick up fast syncing from there. The side chain is // completely nuked by the freezer. -func TestLongReorgedFastSyncingDeepSetHead(t *testing.T) { - testLongReorgedFastSyncingDeepSetHead(t, false) +func TestLongReorgedSnapSyncingDeepSetHead(t *testing.T) { + testLongReorgedSnapSyncingDeepSetHead(t, false) } -func TestLongReorgedFastSyncingDeepSetHeadWithSnapshots(t *testing.T) { - testLongReorgedFastSyncingDeepSetHead(t, true) +func TestLongReorgedSnapSyncingDeepSetHeadWithSnapshots(t *testing.T) { + testLongReorgedSnapSyncingDeepSetHead(t, true) } -func testLongReorgedFastSyncingDeepSetHead(t *testing.T, snapshots bool) { +func testLongReorgedSnapSyncingDeepSetHead(t *testing.T, snapshots bool) { // Chain: // G->C1->C2->C3->C4->C5->C6->C7->C8->C9->C10->C11->C12->C13->C14->C15->C16->C17->C18->C19->C20->C21->C22->C23->C24 (HEAD) // └->S1->S2->S3->S4->S5->S6->S7->S8->S9->S10->S11->S12->S13->S14->S15->S16->S17->S18->S19->S20->S21->S22->S23->S24->S25->S26 diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 62036ae757..6e542fe2f4 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -28,13 +28,16 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/beacon" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "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/eth/tracers/logger" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" @@ -210,6 +213,55 @@ func TestLastBlock(t *testing.T) { } } +// Test inserts the blocks/headers after the fork choice rule is changed. +// The chain is reorged to whatever specified. +func testInsertAfterMerge(t *testing.T, blockchain *BlockChain, i, n int, full bool) { + // Copy old chain up to #i into a new db + db, blockchain2, err := newCanonical(ethash.NewFaker(), i, full) + if err != nil { + t.Fatal("could not make new canonical in testFork", err) + } + defer blockchain2.Stop() + + // Assert the chains have the same header/block at #i + var hash1, hash2 common.Hash + if full { + hash1 = blockchain.GetBlockByNumber(uint64(i)).Hash() + hash2 = blockchain2.GetBlockByNumber(uint64(i)).Hash() + } else { + hash1 = blockchain.GetHeaderByNumber(uint64(i)).Hash() + hash2 = blockchain2.GetHeaderByNumber(uint64(i)).Hash() + } + if hash1 != hash2 { + t.Errorf("chain content mismatch at %d: have hash %v, want hash %v", i, hash2, hash1) + } + + // Extend the newly created chain + if full { + blockChainB := makeBlockChain(blockchain2.CurrentBlock(), n, ethash.NewFaker(), db, forkSeed) + if _, err := blockchain2.InsertChain(blockChainB); err != nil { + t.Fatalf("failed to insert forking chain: %v", err) + } + if blockchain2.CurrentBlock().NumberU64() != blockChainB[len(blockChainB)-1].NumberU64() { + t.Fatalf("failed to reorg to the given chain") + } + if blockchain2.CurrentBlock().Hash() != blockChainB[len(blockChainB)-1].Hash() { + t.Fatalf("failed to reorg to the given chain") + } + } else { + headerChainB := makeHeaderChain(blockchain2.CurrentHeader(), n, ethash.NewFaker(), db, forkSeed) + if _, err := blockchain2.InsertHeaderChain(headerChainB, 1); err != nil { + t.Fatalf("failed to insert forking chain: %v", err) + } + if blockchain2.CurrentHeader().Number.Uint64() != headerChainB[len(headerChainB)-1].Number.Uint64() { + t.Fatalf("failed to reorg to the given chain") + } + if blockchain2.CurrentHeader().Hash() != headerChainB[len(headerChainB)-1].Hash() { + t.Fatalf("failed to reorg to the given chain") + } + } +} + // Tests that given a starting canonical chain of a given size, it can be extended // with various length chains. func TestExtendCanonicalHeaders(t *testing.T) { testExtendCanonical(t, false) } @@ -238,6 +290,25 @@ func testExtendCanonical(t *testing.T, full bool) { testFork(t, processor, length, 10, full, better) } +// Tests that given a starting canonical chain of a given size, it can be extended +// with various length chains. +func TestExtendCanonicalHeadersAfterMerge(t *testing.T) { testExtendCanonicalAfterMerge(t, false) } +func TestExtendCanonicalBlocksAfterMerge(t *testing.T) { testExtendCanonicalAfterMerge(t, true) } + +func testExtendCanonicalAfterMerge(t *testing.T, full bool) { + length := 5 + + // Make first chain starting from genesis + _, processor, err := newCanonical(ethash.NewFaker(), length, full) + if err != nil { + t.Fatalf("failed to make new canonical chain: %v", err) + } + defer processor.Stop() + + testInsertAfterMerge(t, processor, length, 1, full) + testInsertAfterMerge(t, processor, length, 10, full) +} + // Tests that given a starting canonical chain of a given size, creating shorter // forks do not take canonical ownership. func TestShorterForkHeaders(t *testing.T) { testShorterFork(t, false) } @@ -268,6 +339,29 @@ func testShorterFork(t *testing.T, full bool) { testFork(t, processor, 5, 4, full, worse) } +// Tests that given a starting canonical chain of a given size, creating shorter +// forks do not take canonical ownership. +func TestShorterForkHeadersAfterMerge(t *testing.T) { testShorterForkAfterMerge(t, false) } +func TestShorterForkBlocksAfterMerge(t *testing.T) { testShorterForkAfterMerge(t, true) } + +func testShorterForkAfterMerge(t *testing.T, full bool) { + length := 10 + + // Make first chain starting from genesis + _, processor, err := newCanonical(ethash.NewFaker(), length, full) + if err != nil { + t.Fatalf("failed to make new canonical chain: %v", err) + } + defer processor.Stop() + + testInsertAfterMerge(t, processor, 0, 3, full) + testInsertAfterMerge(t, processor, 0, 7, full) + testInsertAfterMerge(t, processor, 1, 1, full) + testInsertAfterMerge(t, processor, 1, 7, full) + testInsertAfterMerge(t, processor, 5, 3, full) + testInsertAfterMerge(t, processor, 5, 4, full) +} + // Tests that given a starting canonical chain of a given size, creating longer // forks do take canonical ownership. func TestLongerForkHeaders(t *testing.T) { testLongerFork(t, false) } @@ -283,19 +377,35 @@ func testLongerFork(t *testing.T, full bool) { } defer processor.Stop() - // Define the difficulty comparator - better := func(td1, td2 *big.Int) { - if td2.Cmp(td1) <= 0 { - t.Errorf("total difficulty mismatch: have %v, expected more than %v", td2, td1) - } + testInsertAfterMerge(t, processor, 0, 11, full) + testInsertAfterMerge(t, processor, 0, 15, full) + testInsertAfterMerge(t, processor, 1, 10, full) + testInsertAfterMerge(t, processor, 1, 12, full) + testInsertAfterMerge(t, processor, 5, 6, full) + testInsertAfterMerge(t, processor, 5, 8, full) +} + +// Tests that given a starting canonical chain of a given size, creating longer +// forks do take canonical ownership. +func TestLongerForkHeadersAfterMerge(t *testing.T) { testLongerForkAfterMerge(t, false) } +func TestLongerForkBlocksAfterMerge(t *testing.T) { testLongerForkAfterMerge(t, true) } + +func testLongerForkAfterMerge(t *testing.T, full bool) { + length := 10 + + // Make first chain starting from genesis + _, processor, err := newCanonical(ethash.NewFaker(), length, full) + if err != nil { + t.Fatalf("failed to make new canonical chain: %v", err) } - // Sum of numbers must be greater than `length` for this to be a longer fork - testFork(t, processor, 0, 11, full, better) - testFork(t, processor, 0, 15, full, better) - testFork(t, processor, 1, 10, full, better) - testFork(t, processor, 1, 12, full, better) - testFork(t, processor, 5, 6, full, better) - testFork(t, processor, 5, 8, full, better) + defer processor.Stop() + + testInsertAfterMerge(t, processor, 0, 11, full) + testInsertAfterMerge(t, processor, 0, 15, full) + testInsertAfterMerge(t, processor, 1, 10, full) + testInsertAfterMerge(t, processor, 1, 12, full) + testInsertAfterMerge(t, processor, 5, 6, full) + testInsertAfterMerge(t, processor, 5, 8, full) } // Tests that given a starting canonical chain of a given size, creating equal @@ -328,6 +438,29 @@ func testEqualFork(t *testing.T, full bool) { testFork(t, processor, 9, 1, full, equal) } +// Tests that given a starting canonical chain of a given size, creating equal +// forks do take canonical ownership. +func TestEqualForkHeadersAfterMerge(t *testing.T) { testEqualForkAfterMerge(t, false) } +func TestEqualForkBlocksAfterMerge(t *testing.T) { testEqualForkAfterMerge(t, true) } + +func testEqualForkAfterMerge(t *testing.T, full bool) { + length := 10 + + // Make first chain starting from genesis + _, processor, err := newCanonical(ethash.NewFaker(), length, full) + if err != nil { + t.Fatalf("failed to make new canonical chain: %v", err) + } + defer processor.Stop() + + testInsertAfterMerge(t, processor, 0, 10, full) + testInsertAfterMerge(t, processor, 1, 9, full) + testInsertAfterMerge(t, processor, 2, 8, full) + testInsertAfterMerge(t, processor, 5, 5, full) + testInsertAfterMerge(t, processor, 6, 4, full) + testInsertAfterMerge(t, processor, 9, 1, full) +} + // Tests that chains missing links do not get accepted by the processor. func TestBrokenHeaderChain(t *testing.T) { testBrokenChain(t, false) } func TestBrokenBlockChain(t *testing.T) { testBrokenChain(t, true) } @@ -360,7 +493,7 @@ func TestReorgLongHeaders(t *testing.T) { testReorgLong(t, false) } func TestReorgLongBlocks(t *testing.T) { testReorgLong(t, true) } func testReorgLong(t *testing.T, full bool) { - testReorg(t, []int64{0, 0, -9}, []int64{0, 0, 0, -9}, 393280, full) + testReorg(t, []int64{0, 0, -9}, []int64{0, 0, 0, -9}, 393280+params.GenesisDifficulty.Int64(), full) } // Tests that reorganising a short difficult chain after a long easy one @@ -380,7 +513,7 @@ func testReorgShort(t *testing.T, full bool) { for i := 0; i < len(diff); i++ { diff[i] = -9 } - testReorg(t, easy, diff, 12615120, full) + testReorg(t, easy, diff, 12615120+params.GenesisDifficulty.Int64(), full) } func testReorg(t *testing.T, first, second []int64, td int64, full bool) { @@ -1800,21 +1933,56 @@ func TestLowDiffLongChain(t *testing.T) { // - C is canon chain, containing blocks [G..Cn..Cm] // - A common ancestor is placed at prune-point + blocksBetweenCommonAncestorAndPruneblock // - The sidechain S is prepended with numCanonBlocksInSidechain blocks from the canon chain -func testSideImport(t *testing.T, numCanonBlocksInSidechain, blocksBetweenCommonAncestorAndPruneblock int) { - +// +// The mergePoint can be these values: +// -1: the transition won't happen +// 0: the transition happens since genesis +// 1: the transition happens after some chain segments +func testSideImport(t *testing.T, numCanonBlocksInSidechain, blocksBetweenCommonAncestorAndPruneblock int, mergePoint int) { + // Copy the TestChainConfig so we can modify it during tests + chainConfig := *params.TestChainConfig // Generate a canonical chain to act as the main dataset - engine := ethash.NewFaker() - db := rawdb.NewMemoryDatabase() - genesis := (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) - + var ( + merger = consensus.NewMerger(rawdb.NewMemoryDatabase()) + genEngine = beacon.New(ethash.NewFaker()) + runEngine = beacon.New(ethash.NewFaker()) + db = rawdb.NewMemoryDatabase() + + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr = crypto.PubkeyToAddress(key.PublicKey) + nonce = uint64(0) + + gspec = &Genesis{ + Config: &chainConfig, + Alloc: GenesisAlloc{addr: {Balance: big.NewInt(math.MaxInt64)}}, + BaseFee: big.NewInt(params.InitialBaseFee), + } + signer = types.LatestSigner(gspec.Config) + genesis, _ = gspec.Commit(db) + ) // Generate and import the canonical chain - blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*TriesInMemory, nil) diskdb := rawdb.NewMemoryDatabase() - (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(diskdb) - chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil, nil) + gspec.MustCommit(diskdb) + chain, err := NewBlockChain(diskdb, nil, &chainConfig, runEngine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("failed to create tester chain: %v", err) } + // Activate the transition since genesis if required + if mergePoint == 0 { + merger.ReachTTD() + merger.FinalizePoS() + + // Set the terminal total difficulty in the config + gspec.Config.TerminalTotalDifficulty = big.NewInt(0) + } + blocks, _ := GenerateChain(&chainConfig, genesis, genEngine, db, 2*TriesInMemory, func(i int, gen *BlockGen) { + tx, err := types.SignTx(types.NewTransaction(nonce, common.HexToAddress("deadbeef"), big.NewInt(100), 21000, big.NewInt(int64(i+1)*params.GWei), nil), signer, key) + if err != nil { + t.Fatalf("failed to create tx: %v", err) + } + gen.AddTx(tx) + nonce++ + }) if n, err := chain.InsertChain(blocks); err != nil { t.Fatalf("block %d: failed to insert into chain: %v", n, err) } @@ -1831,6 +1999,15 @@ func testSideImport(t *testing.T, numCanonBlocksInSidechain, blocksBetweenCommon if !chain.HasBlockAndState(firstNonPrunedBlock.Hash(), firstNonPrunedBlock.NumberU64()) { t.Errorf("Block %d pruned", firstNonPrunedBlock.NumberU64()) } + + // Activate the transition in the middle of the chain + if mergePoint == 1 { + merger.ReachTTD() + merger.FinalizePoS() + // Set the terminal total difficulty in the config + gspec.Config.TerminalTotalDifficulty = big.NewInt(int64(len(blocks))) + } + // Generate the sidechain // First block should be a known block, block after should be a pruned block. So // canon(pruned), side, side... @@ -1838,7 +2015,7 @@ func testSideImport(t *testing.T, numCanonBlocksInSidechain, blocksBetweenCommon // Generate fork chain, make it longer than canon parentIndex := lastPrunedIndex + blocksBetweenCommonAncestorAndPruneblock parent := blocks[parentIndex] - fork, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 2*TriesInMemory, func(i int, b *BlockGen) { + fork, _ := GenerateChain(&chainConfig, parent, genEngine, db, 2*TriesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) }) // Prepend the parent(s) @@ -1847,9 +2024,9 @@ func testSideImport(t *testing.T, numCanonBlocksInSidechain, blocksBetweenCommon sidechain = append(sidechain, blocks[parentIndex+1-i]) } sidechain = append(sidechain, fork...) - _, err = chain.InsertChain(sidechain) + n, err := chain.InsertChain(sidechain) if err != nil { - t.Errorf("Got error, %v", err) + t.Errorf("Got error, %v number %d - %d", err, sidechain[n].NumberU64(), n) } head := chain.CurrentBlock() if got := fork[len(fork)-1].Hash(); got != head.Hash() { @@ -1870,11 +2047,28 @@ func TestPrunedImportSide(t *testing.T) { //glogger := log.NewGlogHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(false))) //glogger.Verbosity(3) //log.Root().SetHandler(log.Handler(glogger)) - testSideImport(t, 3, 3) - testSideImport(t, 3, -3) - testSideImport(t, 10, 0) - testSideImport(t, 1, 10) - testSideImport(t, 1, -10) + testSideImport(t, 3, 3, -1) + testSideImport(t, 3, -3, -1) + testSideImport(t, 10, 0, -1) + testSideImport(t, 1, 10, -1) + testSideImport(t, 1, -10, -1) +} + +func TestPrunedImportSideWithMerging(t *testing.T) { + //glogger := log.NewGlogHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(false))) + //glogger.Verbosity(3) + //log.Root().SetHandler(log.Handler(glogger)) + testSideImport(t, 3, 3, 0) + testSideImport(t, 3, -3, 0) + testSideImport(t, 10, 0, 0) + testSideImport(t, 1, 10, 0) + testSideImport(t, 1, -10, 0) + + testSideImport(t, 3, 3, 1) + testSideImport(t, 3, -3, 1) + testSideImport(t, 10, 0, 1) + testSideImport(t, 1, 10, 1) + testSideImport(t, 1, -10, 1) } func TestInsertKnownHeaders(t *testing.T) { testInsertKnownChainData(t, "headers") } @@ -2002,6 +2196,179 @@ func testInsertKnownChainData(t *testing.T, typ string) { asserter(t, blocks2[len(blocks2)-1]) } +func TestInsertKnownHeadersWithMerging(t *testing.T) { + testInsertKnownChainDataWithMerging(t, "headers", 0) +} +func TestInsertKnownReceiptChainWithMerging(t *testing.T) { + testInsertKnownChainDataWithMerging(t, "receipts", 0) +} +func TestInsertKnownBlocksWithMerging(t *testing.T) { + testInsertKnownChainDataWithMerging(t, "blocks", 0) +} +func TestInsertKnownHeadersAfterMerging(t *testing.T) { + testInsertKnownChainDataWithMerging(t, "headers", 1) +} +func TestInsertKnownReceiptChainAfterMerging(t *testing.T) { + testInsertKnownChainDataWithMerging(t, "receipts", 1) +} +func TestInsertKnownBlocksAfterMerging(t *testing.T) { + testInsertKnownChainDataWithMerging(t, "blocks", 1) +} + +// mergeHeight can be assigned in these values: +// 0: means the merging is applied since genesis +// 1: means the merging is applied after the first segment +func testInsertKnownChainDataWithMerging(t *testing.T, typ string, mergeHeight int) { + // Copy the TestChainConfig so we can modify it during tests + chainConfig := *params.TestChainConfig + var ( + db = rawdb.NewMemoryDatabase() + genesis = (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee), Config: &chainConfig}).MustCommit(db) + runMerger = consensus.NewMerger(db) + runEngine = beacon.New(ethash.NewFaker()) + genEngine = beacon.New(ethash.NewFaker()) + ) + applyMerge := func(engine *beacon.Beacon, height int) { + if engine != nil { + runMerger.FinalizePoS() + // Set the terminal total difficulty in the config + chainConfig.TerminalTotalDifficulty = big.NewInt(int64(height)) + } + } + + // Apply merging since genesis + if mergeHeight == 0 { + applyMerge(genEngine, 0) + } + blocks, receipts := GenerateChain(&chainConfig, genesis, genEngine, db, 32, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) + + // Apply merging after the first segment + if mergeHeight == 1 { + applyMerge(genEngine, len(blocks)) + } + // Longer chain and shorter chain + blocks2, receipts2 := GenerateChain(&chainConfig, blocks[len(blocks)-1], genEngine, db, 65, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) + blocks3, receipts3 := GenerateChain(&chainConfig, blocks[len(blocks)-1], genEngine, db, 64, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{1}) + b.OffsetTime(-9) // Time shifted, difficulty shouldn't be changed + }) + + // Import the shared chain and the original canonical one + dir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(dir) + chaindb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), dir, "", false) + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(chaindb) + defer os.RemoveAll(dir) + + chain, err := NewBlockChain(chaindb, nil, &chainConfig, runEngine, vm.Config{}, nil, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + var ( + inserter func(blocks []*types.Block, receipts []types.Receipts) error + asserter func(t *testing.T, block *types.Block) + ) + if typ == "headers" { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + headers := make([]*types.Header, 0, len(blocks)) + for _, block := range blocks { + headers = append(headers, block.Header()) + } + _, err := chain.InsertHeaderChain(headers, 1) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentHeader().Hash() != block.Hash() { + t.Fatalf("current head header mismatch, have %v, want %v", chain.CurrentHeader().Hash().Hex(), block.Hash().Hex()) + } + } + } else if typ == "receipts" { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + headers := make([]*types.Header, 0, len(blocks)) + for _, block := range blocks { + headers = append(headers, block.Header()) + } + _, err := chain.InsertHeaderChain(headers, 1) + if err != nil { + return err + } + _, err = chain.InsertReceiptChain(blocks, receipts, 0) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentFastBlock().Hash() != block.Hash() { + t.Fatalf("current head fast block mismatch, have %v, want %v", chain.CurrentFastBlock().Hash().Hex(), block.Hash().Hex()) + } + } + } else { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + _, err := chain.InsertChain(blocks) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentBlock().Hash() != block.Hash() { + t.Fatalf("current head block mismatch, have %v, want %v", chain.CurrentBlock().Hash().Hex(), block.Hash().Hex()) + } + } + } + + // Apply merging since genesis if required + if mergeHeight == 0 { + applyMerge(runEngine, 0) + } + if err := inserter(blocks, receipts); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + + // Reimport the chain data again. All the imported + // chain data are regarded "known" data. + if err := inserter(blocks, receipts); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks[len(blocks)-1]) + + // Import a long canonical chain with some known data as prefix. + rollback := blocks[len(blocks)/2].NumberU64() + chain.SetHead(rollback - 1) + if err := inserter(blocks, receipts); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks[len(blocks)-1]) + + // Apply merging after the first segment + if mergeHeight == 1 { + applyMerge(runEngine, len(blocks)) + } + + // Import a longer chain with some known data as prefix. + if err := inserter(append(blocks, blocks2...), append(receipts, receipts2...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks2[len(blocks2)-1]) + + // Import a shorter chain with some known data as prefix. + // The reorg is expected since the fork choice rule is + // already changed. + if err := inserter(append(blocks, blocks3...), append(receipts, receipts3...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + // The head shouldn't change. + asserter(t, blocks3[len(blocks3)-1]) + + // Reimport the longer chain again, the reorg is still expected + chain.SetHead(rollback - 1) + if err := inserter(append(blocks, blocks2...), append(receipts, receipts2...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks2[len(blocks2)-1]) +} + // getLongAndShortChains returns two chains: A is longer, B is heavier. func getLongAndShortChains() (bc *BlockChain, longChain []*types.Block, heavyChain []*types.Block, err error) { // Generate a canonical chain to act as the main dataset @@ -2270,7 +2637,7 @@ func TestTransactionIndices(t *testing.T) { } } -func TestSkipStaleTxIndicesInFastSync(t *testing.T) { +func TestSkipStaleTxIndicesInSnapSync(t *testing.T) { // Configure and generate a sample block chain var ( gendb = rawdb.NewMemoryDatabase() @@ -2385,7 +2752,7 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in for txi := 0; txi < numTxs; txi++ { uniq := uint64(i*numTxs + txi) recipient := recipientFn(uniq) - tx, err := types.SignTx(types.NewTransaction(uniq, recipient, big.NewInt(1), params.TxGas, big.NewInt(1), nil), signer, testBankKey) + tx, err := types.SignTx(types.NewTransaction(uniq, recipient, big.NewInt(1), params.TxGas, block.header.BaseFee, nil), signer, testBankKey) if err != nil { b.Error(err) } @@ -2482,6 +2849,7 @@ func TestSideImportPrunedBlocks(t *testing.T) { // Generate and import the canonical chain blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*TriesInMemory, nil) diskdb := rawdb.NewMemoryDatabase() + (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil, nil) if err != nil { @@ -2690,7 +3058,7 @@ func TestDeleteRecreateSlots(t *testing.T) { gspec.MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{ Debug: true, - Tracer: vm.NewJSONLogger(nil, os.Stdout), + Tracer: logger.NewJSONLogger(nil, os.Stdout), }, nil, nil) if err != nil { t.Fatalf("failed to create tester chain: %v", err) @@ -2770,7 +3138,7 @@ func TestDeleteRecreateAccount(t *testing.T) { gspec.MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{ Debug: true, - Tracer: vm.NewJSONLogger(nil, os.Stdout), + Tracer: logger.NewJSONLogger(nil, os.Stdout), }, nil, nil) if err != nil { t.Fatalf("failed to create tester chain: %v", err) diff --git a/core/chain_makers.go b/core/chain_makers.go index b113c0d1be..c7bf60a4b0 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -155,6 +155,28 @@ func (b *BlockGen) TxNonce(addr common.Address) uint64 { // AddUncle adds an uncle header to the generated block. func (b *BlockGen) AddUncle(h *types.Header) { + // The uncle will have the same timestamp and auto-generated difficulty + h.Time = b.header.Time + + var parent *types.Header + for i := b.i - 1; i >= 0; i-- { + if b.chain[i].Hash() == h.ParentHash { + parent = b.chain[i].Header() + break + } + } + chainreader := &fakeChainReader{config: b.config} + h.Difficulty = b.engine.CalcDifficulty(chainreader, b.header.Time, parent) + + // The gas limit and price should be derived from the parent + h.GasLimit = parent.GasLimit + if b.config.IsLondon(h.Number) { + h.BaseFee = misc.CalcBaseFee(b.config, parent) + if !b.config.IsLondon(parent.Number) { + parentGasLimit := parent.GasLimit * params.ElasticityMultiplier + h.GasLimit = CalcGasLimit(parentGasLimit, parentGasLimit) + } + } b.uncles = append(b.uncles, h) } @@ -205,6 +227,18 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse b := &BlockGen{i: i, chain: blocks, parent: parent, statedb: statedb, config: config, engine: engine} b.header = makeHeader(chainreader, parent, statedb, b.engine) + // Set the difficulty for clique block. The chain maker doesn't have access + // to a chain, so the difficulty will be left unset (nil). Set it here to the + // correct value. + if b.header.Difficulty == nil { + if config.TerminalTotalDifficulty == nil { + // Clique chain + b.header.Difficulty = big.NewInt(2) + } else { + // Post-merge chain + b.header.Difficulty = big.NewInt(0) + } + } // Mutate the state and block according to any hard-fork specs if daoBlock := config.DAOForkBlock; daoBlock != nil { limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange) @@ -313,3 +347,4 @@ func (cr *fakeChainReader) GetHeaderByNumber(number uint64) *types.Header func (cr *fakeChainReader) GetHeaderByHash(hash common.Hash) *types.Header { return nil } func (cr *fakeChainReader) GetHeader(hash common.Hash, number uint64) *types.Header { return nil } func (cr *fakeChainReader) GetBlock(hash common.Hash, number uint64) *types.Block { return nil } +func (cr *fakeChainReader) GetTd(hash common.Hash, number uint64) *big.Int { return nil } diff --git a/core/error.go b/core/error.go index 594f3a26e5..51ebefc137 100644 --- a/core/error.go +++ b/core/error.go @@ -51,6 +51,10 @@ var ( // next one expected based on the local chain. ErrNonceTooHigh = errors.New("nonce too high") + // ErrNonceMax is returned if the nonce of a transaction sender account has + // maximum allowed value and would become invalid if incremented. + ErrNonceMax = errors.New("nonce has max value") + // ErrGasLimitReached is returned by the gas pool if the amount of gas required // by a transaction is higher than what's left in the block. ErrGasLimitReached = errors.New("gas limit reached") diff --git a/core/forkchoice.go b/core/forkchoice.go new file mode 100644 index 0000000000..b0dbb200ec --- /dev/null +++ b/core/forkchoice.go @@ -0,0 +1,108 @@ +// Copyright 2021 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 . + +package core + +import ( + crand "crypto/rand" + "errors" + "math/big" + mrand "math/rand" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +// ChainReader defines a small collection of methods needed to access the local +// blockchain during header verification. It's implemented by both blockchain +// and lightchain. +type ChainReader interface { + // Config retrieves the header chain's chain configuration. + Config() *params.ChainConfig + + // GetTd returns the total difficulty of a local block. + GetTd(common.Hash, uint64) *big.Int +} + +// ForkChoice is the fork chooser based on the highest total difficulty of the +// chain(the fork choice used in the eth1) and the external fork choice (the fork +// choice used in the eth2). This main goal of this ForkChoice is not only for +// offering fork choice during the eth1/2 merge phase, but also keep the compatibility +// for all other proof-of-work networks. +type ForkChoice struct { + chain ChainReader + rand *mrand.Rand + + // preserve is a helper function used in td fork choice. + // Miners will prefer to choose the local mined block if the + // local td is equal to the extern one. It can be nil for light + // client + preserve func(header *types.Header) bool +} + +func NewForkChoice(chainReader ChainReader, preserve func(header *types.Header) bool) *ForkChoice { + // Seed a fast but crypto originating random generator + seed, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64)) + if err != nil { + log.Crit("Failed to initialize random seed", "err", err) + } + return &ForkChoice{ + chain: chainReader, + rand: mrand.New(mrand.NewSource(seed.Int64())), + preserve: preserve, + } +} + +// ReorgNeeded returns whether the reorg should be applied +// based on the given external header and local canonical chain. +// In the td mode, the new head is chosen if the corresponding +// total difficulty is higher. In the extern mode, the trusted +// header is always selected as the head. +func (f *ForkChoice) ReorgNeeded(current *types.Header, header *types.Header) (bool, error) { + var ( + localTD = f.chain.GetTd(current.Hash(), current.Number.Uint64()) + externTd = f.chain.GetTd(header.Hash(), header.Number.Uint64()) + ) + if localTD == nil || externTd == nil { + return false, errors.New("missing td") + } + // Accept the new header as the chain head if the transition + // is already triggered. We assume all the headers after the + // transition come from the trusted consensus layer. + if ttd := f.chain.Config().TerminalTotalDifficulty; ttd != nil && ttd.Cmp(externTd) <= 0 { + return true, nil + } + // If the total difficulty is higher than our known, add it to the canonical chain + // Second clause in the if statement reduces the vulnerability to selfish mining. + // Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf + reorg := externTd.Cmp(localTD) > 0 + if !reorg && externTd.Cmp(localTD) == 0 { + number, headNumber := header.Number.Uint64(), current.Number.Uint64() + if number < headNumber { + reorg = true + } else if number == headNumber { + var currentPreserve, externPreserve bool + if f.preserve != nil { + currentPreserve, externPreserve = f.preserve(current), f.preserve(header) + } + reorg = !currentPreserve && (externPreserve || f.rand.Float64() < 0.5) + } + } + return reorg, nil +} diff --git a/core/forkid/forkid_test.go b/core/forkid/forkid_test.go index 916bffadc0..b0ee59b9eb 100644 --- a/core/forkid/forkid_test.go +++ b/core/forkid/forkid_test.go @@ -19,6 +19,7 @@ package forkid import ( "bytes" "math" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" @@ -29,6 +30,8 @@ import ( // TestCreation tests that different genesis and fork rule combinations result in // the correct fork ID. func TestCreation(t *testing.T) { + mergeConfig := *params.MainnetChainConfig + mergeConfig.MergeForkBlock = big.NewInt(15000000) type testcase struct { head uint64 want ID @@ -63,8 +66,10 @@ func TestCreation(t *testing.T) { {12243999, ID{Hash: checksumToBytes(0xe029e991), Next: 12244000}}, // Last Muir Glacier block {12244000, ID{Hash: checksumToBytes(0x0eb440f6), Next: 12965000}}, // First Berlin block {12964999, ID{Hash: checksumToBytes(0x0eb440f6), Next: 12965000}}, // Last Berlin block - {12965000, ID{Hash: checksumToBytes(0xb715077d), Next: 0}}, // First London block - {20000000, ID{Hash: checksumToBytes(0xb715077d), Next: 0}}, // Future London block + {12965000, ID{Hash: checksumToBytes(0xb715077d), Next: 13773000}}, // First London block + {13772999, ID{Hash: checksumToBytes(0xb715077d), Next: 13773000}}, // Last London block + {13773000, ID{Hash: checksumToBytes(0x20c327fc), Next: 0}}, // First Arrow Glacier block + {20000000, ID{Hash: checksumToBytes(0x20c327fc), Next: 0}}, // Future Arrow Glacier block }, }, // Ropsten test cases @@ -131,6 +136,38 @@ func TestCreation(t *testing.T) { {6000000, ID{Hash: checksumToBytes(0xB8C6299D), Next: 0}}, // Future London block }, }, + // Merge test cases + { + &mergeConfig, + params.MainnetGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Unsynced + {1149999, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Last Frontier block + {1150000, ID{Hash: checksumToBytes(0x97c2c34c), Next: 1920000}}, // First Homestead block + {1919999, ID{Hash: checksumToBytes(0x97c2c34c), Next: 1920000}}, // Last Homestead block + {1920000, ID{Hash: checksumToBytes(0x91d1f948), Next: 2463000}}, // First DAO block + {2462999, ID{Hash: checksumToBytes(0x91d1f948), Next: 2463000}}, // Last DAO block + {2463000, ID{Hash: checksumToBytes(0x7a64da13), Next: 2675000}}, // First Tangerine block + {2674999, ID{Hash: checksumToBytes(0x7a64da13), Next: 2675000}}, // Last Tangerine block + {2675000, ID{Hash: checksumToBytes(0x3edd5b10), Next: 4370000}}, // First Spurious block + {4369999, ID{Hash: checksumToBytes(0x3edd5b10), Next: 4370000}}, // Last Spurious block + {4370000, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}}, // First Byzantium block + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}}, // Last Byzantium block + {7280000, ID{Hash: checksumToBytes(0x668db0af), Next: 9069000}}, // First and last Constantinople, first Petersburg block + {9068999, ID{Hash: checksumToBytes(0x668db0af), Next: 9069000}}, // Last Petersburg block + {9069000, ID{Hash: checksumToBytes(0x879d6e30), Next: 9200000}}, // First Istanbul and first Muir Glacier block + {9199999, ID{Hash: checksumToBytes(0x879d6e30), Next: 9200000}}, // Last Istanbul and first Muir Glacier block + {9200000, ID{Hash: checksumToBytes(0xe029e991), Next: 12244000}}, // First Muir Glacier block + {12243999, ID{Hash: checksumToBytes(0xe029e991), Next: 12244000}}, // Last Muir Glacier block + {12244000, ID{Hash: checksumToBytes(0x0eb440f6), Next: 12965000}}, // First Berlin block + {12964999, ID{Hash: checksumToBytes(0x0eb440f6), Next: 12965000}}, // Last Berlin block + {12965000, ID{Hash: checksumToBytes(0xb715077d), Next: 13773000}}, // First London block + {13772999, ID{Hash: checksumToBytes(0xb715077d), Next: 13773000}}, // Last London block + {13773000, ID{Hash: checksumToBytes(0x20c327fc), Next: 15000000}}, // First Arrow Glacier block + {15000000, ID{Hash: checksumToBytes(0xe3abe201), Next: 0}}, // First Merge Start block + {20000000, ID{Hash: checksumToBytes(0xe3abe201), Next: 0}}, // Future Merge Start block + }, + }, } for i, tt := range tests { for j, ttt := range tt.cases { @@ -205,11 +242,11 @@ func TestValidation(t *testing.T) { // Local is mainnet Petersburg, remote is Rinkeby Petersburg. {7987396, ID{Hash: checksumToBytes(0xafec6b27), Next: 0}, ErrLocalIncompatibleOrStale}, - // Local is mainnet London, far in the future. Remote announces Gopherium (non existing fork) + // Local is mainnet Arrow Glacier, far in the future. Remote announces Gopherium (non existing fork) // at some future block 88888888, for itself, but past block for local. Local is incompatible. // // This case detects non-upgraded nodes with majority hash power (typical Ropsten mess). - {88888888, ID{Hash: checksumToBytes(0xb715077d), Next: 88888888}, ErrLocalIncompatibleOrStale}, + {88888888, ID{Hash: checksumToBytes(0x20c327fc), Next: 88888888}, ErrLocalIncompatibleOrStale}, // Local is mainnet Byzantium. Remote is also in Byzantium, but announces Gopherium (non existing // fork) at block 7279999, before Petersburg. Local is incompatible. diff --git a/core/genesis.go b/core/genesis.go index 2a65b4409e..49c3e47298 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -159,10 +159,10 @@ func (e *GenesisMismatchError) Error() string { // // The returned chain configuration is never nil. func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) { - return SetupGenesisBlockWithOverride(db, genesis, nil) + return SetupGenesisBlockWithOverride(db, genesis, nil, nil) } -func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, overrideLondon *big.Int) (*params.ChainConfig, common.Hash, error) { +func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, overrideArrowGlacier, overrideTerminalTotalDifficulty *big.Int) (*params.ChainConfig, common.Hash, error) { if genesis != nil && genesis.Config == nil { return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig } @@ -208,8 +208,11 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, override } // Get the existing chain configuration. newcfg := genesis.configOrDefault(stored) - if overrideLondon != nil { - newcfg.LondonBlock = overrideLondon + if overrideArrowGlacier != nil { + newcfg.ArrowGlacierBlock = overrideArrowGlacier + } + if overrideTerminalTotalDifficulty != nil { + newcfg.TerminalTotalDifficulty = overrideTerminalTotalDifficulty } if err := newcfg.CheckConfigForkOrder(); err != nil { return newcfg, common.Hash{}, err @@ -250,6 +253,8 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { return params.MainnetChainConfig case ghash == params.RopstenGenesisHash: return params.RopstenChainConfig + case ghash == params.SepoliaGenesisHash: + return params.SepoliaChainConfig case ghash == params.RinkebyGenesisHash: return params.RinkebyChainConfig case ghash == params.GoerliGenesisHash: @@ -333,7 +338,7 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { if config.Clique != nil && len(block.Extra()) == 0 { return nil, errors.New("can't start clique chain without signers") } - rawdb.WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty) + rawdb.WriteTd(db, block.Hash(), block.NumberU64(), block.Difficulty()) rawdb.WriteBlock(db, block) rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil) rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) @@ -439,8 +444,21 @@ func DefaultBorMainnetGenesisBlock() *Genesis { } } +// DefaultSepoliaGenesisBlock returns the Sepolia network genesis block. +func DefaultSepoliaGenesisBlock() *Genesis { + return &Genesis{ + Config: params.SepoliaChainConfig, + Nonce: 0, + ExtraData: []byte("Sepolia, Athens, Attica, Greece!"), + GasLimit: 0x1c9c380, + Difficulty: big.NewInt(0x20000), + Timestamp: 1633267481, + Alloc: decodePrealloc(sepoliaAllocData), + } +} + // DeveloperGenesisBlock returns the 'geth --dev' genesis block. -func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { +func DeveloperGenesisBlock(period uint64, gasLimit uint64, faucet common.Address) *Genesis { // Override the default period to the user requested one config := *params.AllCliqueProtocolChanges config.Clique = ¶ms.CliqueConfig{ @@ -452,7 +470,7 @@ func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { return &Genesis{ Config: &config, ExtraData: append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...), - GasLimit: 11500000, + GasLimit: gasLimit, BaseFee: big.NewInt(params.InitialBaseFee), Difficulty: big.NewInt(1), Alloc: map[common.Address]GenesisAccount{ diff --git a/core/genesis_alloc.go b/core/genesis_alloc.go index ee542334b5..3d053904e7 100644 --- a/core/genesis_alloc.go +++ b/core/genesis_alloc.go @@ -26,3 +26,4 @@ const ropstenAllocData = "\xf9\x03\xa4\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03 const rinkebyAllocData = "\xf9\x03\xb7\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xc2\x05\x01\xc2\x06\x01\xc2\a\x01\xc2\b\x01\xc2\t\x01\xc2\n\x01\xc2\v\x01\xc2\f\x01\xc2\r\x01\xc2\x0e\x01\xc2\x0f\x01\xc2\x10\x01\xc2\x11\x01\xc2\x12\x01\xc2\x13\x01\xc2\x14\x01\xc2\x15\x01\xc2\x16\x01\xc2\x17\x01\xc2\x18\x01\xc2\x19\x01\xc2\x1a\x01\xc2\x1b\x01\xc2\x1c\x01\xc2\x1d\x01\xc2\x1e\x01\xc2\x1f\x01\xc2 \x01\xc2!\x01\xc2\"\x01\xc2#\x01\xc2$\x01\xc2%\x01\xc2&\x01\xc2'\x01\xc2(\x01\xc2)\x01\xc2*\x01\xc2+\x01\xc2,\x01\xc2-\x01\xc2.\x01\xc2/\x01\xc20\x01\xc21\x01\xc22\x01\xc23\x01\xc24\x01\xc25\x01\xc26\x01\xc27\x01\xc28\x01\xc29\x01\xc2:\x01\xc2;\x01\xc2<\x01\xc2=\x01\xc2>\x01\xc2?\x01\xc2@\x01\xc2A\x01\xc2B\x01\xc2C\x01\xc2D\x01\xc2E\x01\xc2F\x01\xc2G\x01\xc2H\x01\xc2I\x01\xc2J\x01\xc2K\x01\xc2L\x01\xc2M\x01\xc2N\x01\xc2O\x01\xc2P\x01\xc2Q\x01\xc2R\x01\xc2S\x01\xc2T\x01\xc2U\x01\xc2V\x01\xc2W\x01\xc2X\x01\xc2Y\x01\xc2Z\x01\xc2[\x01\xc2\\\x01\xc2]\x01\xc2^\x01\xc2_\x01\xc2`\x01\xc2a\x01\xc2b\x01\xc2c\x01\xc2d\x01\xc2e\x01\xc2f\x01\xc2g\x01\xc2h\x01\xc2i\x01\xc2j\x01\xc2k\x01\xc2l\x01\xc2m\x01\xc2n\x01\xc2o\x01\xc2p\x01\xc2q\x01\xc2r\x01\xc2s\x01\xc2t\x01\xc2u\x01\xc2v\x01\xc2w\x01\xc2x\x01\xc2y\x01\xc2z\x01\xc2{\x01\xc2|\x01\xc2}\x01\xc2~\x01\xc2\u007f\x01\u00c1\x80\x01\u00c1\x81\x01\u00c1\x82\x01\u00c1\x83\x01\u00c1\x84\x01\u00c1\x85\x01\u00c1\x86\x01\u00c1\x87\x01\u00c1\x88\x01\u00c1\x89\x01\u00c1\x8a\x01\u00c1\x8b\x01\u00c1\x8c\x01\u00c1\x8d\x01\u00c1\x8e\x01\u00c1\x8f\x01\u00c1\x90\x01\u00c1\x91\x01\u00c1\x92\x01\u00c1\x93\x01\u00c1\x94\x01\u00c1\x95\x01\u00c1\x96\x01\u00c1\x97\x01\u00c1\x98\x01\u00c1\x99\x01\u00c1\x9a\x01\u00c1\x9b\x01\u00c1\x9c\x01\u00c1\x9d\x01\u00c1\x9e\x01\u00c1\x9f\x01\u00c1\xa0\x01\u00c1\xa1\x01\u00c1\xa2\x01\u00c1\xa3\x01\u00c1\xa4\x01\u00c1\xa5\x01\u00c1\xa6\x01\u00c1\xa7\x01\u00c1\xa8\x01\u00c1\xa9\x01\u00c1\xaa\x01\u00c1\xab\x01\u00c1\xac\x01\u00c1\xad\x01\u00c1\xae\x01\u00c1\xaf\x01\u00c1\xb0\x01\u00c1\xb1\x01\u00c1\xb2\x01\u00c1\xb3\x01\u00c1\xb4\x01\u00c1\xb5\x01\u00c1\xb6\x01\u00c1\xb7\x01\u00c1\xb8\x01\u00c1\xb9\x01\u00c1\xba\x01\u00c1\xbb\x01\u00c1\xbc\x01\u00c1\xbd\x01\u00c1\xbe\x01\u00c1\xbf\x01\u00c1\xc0\x01\u00c1\xc1\x01\u00c1\xc2\x01\u00c1\xc3\x01\u00c1\xc4\x01\u00c1\xc5\x01\u00c1\xc6\x01\u00c1\xc7\x01\u00c1\xc8\x01\u00c1\xc9\x01\u00c1\xca\x01\u00c1\xcb\x01\u00c1\xcc\x01\u00c1\xcd\x01\u00c1\xce\x01\u00c1\xcf\x01\u00c1\xd0\x01\u00c1\xd1\x01\u00c1\xd2\x01\u00c1\xd3\x01\u00c1\xd4\x01\u00c1\xd5\x01\u00c1\xd6\x01\u00c1\xd7\x01\u00c1\xd8\x01\u00c1\xd9\x01\u00c1\xda\x01\u00c1\xdb\x01\u00c1\xdc\x01\u00c1\xdd\x01\u00c1\xde\x01\u00c1\xdf\x01\u00c1\xe0\x01\u00c1\xe1\x01\u00c1\xe2\x01\u00c1\xe3\x01\u00c1\xe4\x01\u00c1\xe5\x01\u00c1\xe6\x01\u00c1\xe7\x01\u00c1\xe8\x01\u00c1\xe9\x01\u00c1\xea\x01\u00c1\xeb\x01\u00c1\xec\x01\u00c1\xed\x01\u00c1\xee\x01\u00c1\xef\x01\u00c1\xf0\x01\u00c1\xf1\x01\u00c1\xf2\x01\u00c1\xf3\x01\u00c1\xf4\x01\u00c1\xf5\x01\u00c1\xf6\x01\u00c1\xf7\x01\u00c1\xf8\x01\u00c1\xf9\x01\u00c1\xfa\x01\u00c1\xfb\x01\u00c1\xfc\x01\u00c1\xfd\x01\u00c1\xfe\x01\u00c1\xff\x01\xf6\x941\xb9\x8d\x14\x00{\xde\xe67)\x80\x86\x98\x8a\v\xbd1\x18E#\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" const goerliAllocData = "\xf9\x04\x06\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xc2\x05\x01\xc2\x06\x01\xc2\a\x01\xc2\b\x01\xc2\t\x01\xc2\n\x01\xc2\v\x01\xc2\f\x01\xc2\r\x01\xc2\x0e\x01\xc2\x0f\x01\xc2\x10\x01\xc2\x11\x01\xc2\x12\x01\xc2\x13\x01\xc2\x14\x01\xc2\x15\x01\xc2\x16\x01\xc2\x17\x01\xc2\x18\x01\xc2\x19\x01\xc2\x1a\x01\xc2\x1b\x01\xc2\x1c\x01\xc2\x1d\x01\xc2\x1e\x01\xc2\x1f\x01\xc2 \x01\xc2!\x01\xc2\"\x01\xc2#\x01\xc2$\x01\xc2%\x01\xc2&\x01\xc2'\x01\xc2(\x01\xc2)\x01\xc2*\x01\xc2+\x01\xc2,\x01\xc2-\x01\xc2.\x01\xc2/\x01\xc20\x01\xc21\x01\xc22\x01\xc23\x01\xc24\x01\xc25\x01\xc26\x01\xc27\x01\xc28\x01\xc29\x01\xc2:\x01\xc2;\x01\xc2<\x01\xc2=\x01\xc2>\x01\xc2?\x01\xc2@\x01\xc2A\x01\xc2B\x01\xc2C\x01\xc2D\x01\xc2E\x01\xc2F\x01\xc2G\x01\xc2H\x01\xc2I\x01\xc2J\x01\xc2K\x01\xc2L\x01\xc2M\x01\xc2N\x01\xc2O\x01\xc2P\x01\xc2Q\x01\xc2R\x01\xc2S\x01\xc2T\x01\xc2U\x01\xc2V\x01\xc2W\x01\xc2X\x01\xc2Y\x01\xc2Z\x01\xc2[\x01\xc2\\\x01\xc2]\x01\xc2^\x01\xc2_\x01\xc2`\x01\xc2a\x01\xc2b\x01\xc2c\x01\xc2d\x01\xc2e\x01\xc2f\x01\xc2g\x01\xc2h\x01\xc2i\x01\xc2j\x01\xc2k\x01\xc2l\x01\xc2m\x01\xc2n\x01\xc2o\x01\xc2p\x01\xc2q\x01\xc2r\x01\xc2s\x01\xc2t\x01\xc2u\x01\xc2v\x01\xc2w\x01\xc2x\x01\xc2y\x01\xc2z\x01\xc2{\x01\xc2|\x01\xc2}\x01\xc2~\x01\xc2\u007f\x01\u00c1\x80\x01\u00c1\x81\x01\u00c1\x82\x01\u00c1\x83\x01\u00c1\x84\x01\u00c1\x85\x01\u00c1\x86\x01\u00c1\x87\x01\u00c1\x88\x01\u00c1\x89\x01\u00c1\x8a\x01\u00c1\x8b\x01\u00c1\x8c\x01\u00c1\x8d\x01\u00c1\x8e\x01\u00c1\x8f\x01\u00c1\x90\x01\u00c1\x91\x01\u00c1\x92\x01\u00c1\x93\x01\u00c1\x94\x01\u00c1\x95\x01\u00c1\x96\x01\u00c1\x97\x01\u00c1\x98\x01\u00c1\x99\x01\u00c1\x9a\x01\u00c1\x9b\x01\u00c1\x9c\x01\u00c1\x9d\x01\u00c1\x9e\x01\u00c1\x9f\x01\u00c1\xa0\x01\u00c1\xa1\x01\u00c1\xa2\x01\u00c1\xa3\x01\u00c1\xa4\x01\u00c1\xa5\x01\u00c1\xa6\x01\u00c1\xa7\x01\u00c1\xa8\x01\u00c1\xa9\x01\u00c1\xaa\x01\u00c1\xab\x01\u00c1\xac\x01\u00c1\xad\x01\u00c1\xae\x01\u00c1\xaf\x01\u00c1\xb0\x01\u00c1\xb1\x01\u00c1\xb2\x01\u00c1\xb3\x01\u00c1\xb4\x01\u00c1\xb5\x01\u00c1\xb6\x01\u00c1\xb7\x01\u00c1\xb8\x01\u00c1\xb9\x01\u00c1\xba\x01\u00c1\xbb\x01\u00c1\xbc\x01\u00c1\xbd\x01\u00c1\xbe\x01\u00c1\xbf\x01\u00c1\xc0\x01\u00c1\xc1\x01\u00c1\xc2\x01\u00c1\xc3\x01\u00c1\xc4\x01\u00c1\xc5\x01\u00c1\xc6\x01\u00c1\xc7\x01\u00c1\xc8\x01\u00c1\xc9\x01\u00c1\xca\x01\u00c1\xcb\x01\u00c1\xcc\x01\u00c1\xcd\x01\u00c1\xce\x01\u00c1\xcf\x01\u00c1\xd0\x01\u00c1\xd1\x01\u00c1\xd2\x01\u00c1\xd3\x01\u00c1\xd4\x01\u00c1\xd5\x01\u00c1\xd6\x01\u00c1\xd7\x01\u00c1\xd8\x01\u00c1\xd9\x01\u00c1\xda\x01\u00c1\xdb\x01\u00c1\xdc\x01\u00c1\xdd\x01\u00c1\xde\x01\u00c1\xdf\x01\u00c1\xe0\x01\u00c1\xe1\x01\u00c1\xe2\x01\u00c1\xe3\x01\u00c1\xe4\x01\u00c1\xe5\x01\u00c1\xe6\x01\u00c1\xe7\x01\u00c1\xe8\x01\u00c1\xe9\x01\u00c1\xea\x01\u00c1\xeb\x01\u00c1\xec\x01\u00c1\xed\x01\u00c1\xee\x01\u00c1\xef\x01\u00c1\xf0\x01\u00c1\xf1\x01\u00c1\xf2\x01\u00c1\xf3\x01\u00c1\xf4\x01\u00c1\xf5\x01\u00c1\xf6\x01\u00c1\xf7\x01\u00c1\xf8\x01\u00c1\xf9\x01\u00c1\xfa\x01\u00c1\xfb\x01\u00c1\xfc\x01\u00c1\xfd\x01\u00c1\xfe\x01\u00c1\xff\x01\xe0\x94L*\xe4\x82Y5\x05\xf0\x16<\xde\xfc\a>\x81\xc6<\xdaA\a\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\xa8\xe8\xf1G2e\x8eKQ\xe8q\x191\x05:\x8ai\xba\xf2\xb1\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe1\x94\u0665\x17\x9f\t\x1d\x85\x05\x1d<\x98'\x85\xef\xd1E\\\uc199\x8b\bE\x95\x16\x14\x01HJ\x00\x00\x00\xe1\x94\u08bdBX\xd2v\x887\xba\xa2j(\xfeq\xdc\a\x9f\x84\u01cbJG\xe3\xc1$H\xf4\xad\x00\x00\x00" const calaverasAllocData = "\xf9\x06\x14\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xc2\x05\x01\xc2\x06\x01\xc2\a\x01\xc2\b\x01\xc2\t\x01\xc2\n\x01\xc2\v\x01\xc2\f\x01\xc2\r\x01\xc2\x0e\x01\xc2\x0f\x01\xc2\x10\x01\xc2\x11\x01\xc2\x12\x01\xc2\x13\x01\xc2\x14\x01\xc2\x15\x01\xc2\x16\x01\xc2\x17\x01\xc2\x18\x01\xc2\x19\x01\xc2\x1a\x01\xc2\x1b\x01\xc2\x1c\x01\xc2\x1d\x01\xc2\x1e\x01\xc2\x1f\x01\xc2 \x01\xc2!\x01\xc2\"\x01\xc2#\x01\xc2$\x01\xc2%\x01\xc2&\x01\xc2'\x01\xc2(\x01\xc2)\x01\xc2*\x01\xc2+\x01\xc2,\x01\xc2-\x01\xc2.\x01\xc2/\x01\xc20\x01\xc21\x01\xc22\x01\xc23\x01\xc24\x01\xc25\x01\xc26\x01\xc27\x01\xc28\x01\xc29\x01\xc2:\x01\xc2;\x01\xc2<\x01\xc2=\x01\xc2>\x01\xc2?\x01\xc2@\x01\xc2A\x01\xc2B\x01\xc2C\x01\xc2D\x01\xc2E\x01\xc2F\x01\xc2G\x01\xc2H\x01\xc2I\x01\xc2J\x01\xc2K\x01\xc2L\x01\xc2M\x01\xc2N\x01\xc2O\x01\xc2P\x01\xc2Q\x01\xc2R\x01\xc2S\x01\xc2T\x01\xc2U\x01\xc2V\x01\xc2W\x01\xc2X\x01\xc2Y\x01\xc2Z\x01\xc2[\x01\xc2\\\x01\xc2]\x01\xc2^\x01\xc2_\x01\xc2`\x01\xc2a\x01\xc2b\x01\xc2c\x01\xc2d\x01\xc2e\x01\xc2f\x01\xc2g\x01\xc2h\x01\xc2i\x01\xc2j\x01\xc2k\x01\xc2l\x01\xc2m\x01\xc2n\x01\xc2o\x01\xc2p\x01\xc2q\x01\xc2r\x01\xc2s\x01\xc2t\x01\xc2u\x01\xc2v\x01\xc2w\x01\xc2x\x01\xc2y\x01\xc2z\x01\xc2{\x01\xc2|\x01\xc2}\x01\xc2~\x01\xc2\u007f\x01\u00c1\x80\x01\u00c1\x81\x01\u00c1\x82\x01\u00c1\x83\x01\u00c1\x84\x01\u00c1\x85\x01\u00c1\x86\x01\u00c1\x87\x01\u00c1\x88\x01\u00c1\x89\x01\u00c1\x8a\x01\u00c1\x8b\x01\u00c1\x8c\x01\u00c1\x8d\x01\u00c1\x8e\x01\u00c1\x8f\x01\u00c1\x90\x01\u00c1\x91\x01\u00c1\x92\x01\u00c1\x93\x01\u00c1\x94\x01\u00c1\x95\x01\u00c1\x96\x01\u00c1\x97\x01\u00c1\x98\x01\u00c1\x99\x01\u00c1\x9a\x01\u00c1\x9b\x01\u00c1\x9c\x01\u00c1\x9d\x01\u00c1\x9e\x01\u00c1\x9f\x01\u00c1\xa0\x01\u00c1\xa1\x01\u00c1\xa2\x01\u00c1\xa3\x01\u00c1\xa4\x01\u00c1\xa5\x01\u00c1\xa6\x01\u00c1\xa7\x01\u00c1\xa8\x01\u00c1\xa9\x01\u00c1\xaa\x01\u00c1\xab\x01\u00c1\xac\x01\u00c1\xad\x01\u00c1\xae\x01\u00c1\xaf\x01\u00c1\xb0\x01\u00c1\xb1\x01\u00c1\xb2\x01\u00c1\xb3\x01\u00c1\xb4\x01\u00c1\xb5\x01\u00c1\xb6\x01\u00c1\xb7\x01\u00c1\xb8\x01\u00c1\xb9\x01\u00c1\xba\x01\u00c1\xbb\x01\u00c1\xbc\x01\u00c1\xbd\x01\u00c1\xbe\x01\u00c1\xbf\x01\u00c1\xc0\x01\u00c1\xc1\x01\u00c1\xc2\x01\u00c1\xc3\x01\u00c1\xc4\x01\u00c1\xc5\x01\u00c1\xc6\x01\u00c1\xc7\x01\u00c1\xc8\x01\u00c1\xc9\x01\u00c1\xca\x01\u00c1\xcb\x01\u00c1\xcc\x01\u00c1\xcd\x01\u00c1\xce\x01\u00c1\xcf\x01\u00c1\xd0\x01\u00c1\xd1\x01\u00c1\xd2\x01\u00c1\xd3\x01\u00c1\xd4\x01\u00c1\xd5\x01\u00c1\xd6\x01\u00c1\xd7\x01\u00c1\xd8\x01\u00c1\xd9\x01\u00c1\xda\x01\u00c1\xdb\x01\u00c1\xdc\x01\u00c1\xdd\x01\u00c1\xde\x01\u00c1\xdf\x01\u00c1\xe0\x01\u00c1\xe1\x01\u00c1\xe2\x01\u00c1\xe3\x01\u00c1\xe4\x01\u00c1\xe5\x01\u00c1\xe6\x01\u00c1\xe7\x01\u00c1\xe8\x01\u00c1\xe9\x01\u00c1\xea\x01\u00c1\xeb\x01\u00c1\xec\x01\u00c1\xed\x01\u00c1\xee\x01\u00c1\xef\x01\u00c1\xf0\x01\u00c1\xf1\x01\u00c1\xf2\x01\u00c1\xf3\x01\u00c1\xf4\x01\u00c1\xf5\x01\u00c1\xf6\x01\u00c1\xf7\x01\u00c1\xf8\x01\u00c1\xf9\x01\u00c1\xfa\x01\u00c1\xfb\x01\u00c1\xfc\x01\u00c1\xfd\x01\u00c1\xfe\x01\u00c1\xff\x01\xf6\x94\x0e\x89\xe2\xae\xdb\x1c\xfc\u06d4$\xd4\x1a\x1f!\x8fA2s\x81r\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\x10A\xaf\xbc\xb3Y\u0568\xdcX\xc1[/\xf5\x13T\xff\x8a!}\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94#o\xf1\xe9t\x19\xae\x93\xad\x80\xca\xfb\xaa!\"\f]x\xfb}\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94`\xad\xc0\xf8\x9aA\xaf#|\xe75T\xed\xe1p\xd73\xec\x14\xe0\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94y\x9d2\x9e_X4\x19\x16|\xd7\"\x96$\x85\x92n3\x8fJ\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94|\xf5\xb7\x9b\xfe)\x1ag\xab\x02\xb3\x93\xe4V\xcc\xc4\xc2f\xf7S\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\x8a\x8e\xaf\xb1\xcfb\xbf\xbe\xb1t\x17i\xda\xe1\xa9\xddG\x99a\x92\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\x8b\xa1\xf1\tU\x1b\xd42\x800\x12dZ\xc16\xdd\xd6M\xbar\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\xb0*.\xda\x1b1\u007f\xbd\x16v\x01(\x83k\n\u015bV\x0e\x9d\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\xba\xdc\r\xe9\xe0yK\x04\x9b^\xa6<>\x1ei\x8a4v\xc1r\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\xf00\v\ue24a\xe2r\xeb4~\x83i\xac\fv\xdfB\xc9?\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\xfe;U~\x8f\xb6+\x89\xf4\x91kr\x1b\xe5\\\ub08d\xbds\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +const sepoliaAllocData = "\xf9\x01\xee\u0791i\x16\xa8{\x823?BE\x04f#\xb27\x94\xc6\\\x8b\bE\x95\x16\x14\x01HJ\x00\x00\x00\xe1\x94\x10\xf5\xd4XT\xe08\a\x14\x85\xac\x9e@#\b\u03c0\xd2\xd2\xfe\x8bR\xb7\xd2\xdc\xc8\f\xd2\xe4\x00\x00\x00\u0794y\x9d2\x9e_X4\x19\x16|\xd7\"\x96$\x85\x92n3\x8fJ\x88\r\u0db3\xa7d\x00\x00\xe0\x94|\xf5\xb7\x9b\xfe)\x1ag\xab\x02\xb3\x93\xe4V\xcc\xc4\xc2f\xf7S\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\x8b\u007f\tw\xbbO\x0f\xbepv\xfa\"\xbc$\xac\xa0CX?^\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xa2\xa6\xd949\x14O\xfeM'\xc9\xe0\x88\xdc\u0637\x83\x94bc\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xaa\xec\x869DA\xf9\x15\xbc\xe3\xe6\xab9\x99w\xe9\x90o;i\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\u1532\x1c3\xde\x1f\xab?\xa1T\x99\xc6+Y\xfe\f\xc3%\x00 \u044bR\xb7\xd2\xdc\xc8\f\xd2\xe4\x00\x00\x00\xe0\x94\xbc\x11)Y6\xaay\u0554\x13\x9d\xe1\xb2\xe1&)AO;\u06ca\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xbe\xef2\xca[\x9a\x19\x8d'\xb4\xe0/LpC\x9f\xe6\x03V\u03ca\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe1\x94\xd7\xd7lX\xb3\xa5\x19\xe9\xfal\xc4\xd2-\xc0\x17%\x9b\u011f\x1e\x8bR\xb7\xd2\xdc\xc8\f\xd2\xe4\x00\x00\x00\xe0\x94\xd7\xed\xdbx\xed)[<\x96)$\x0e\x89$\xfb\x8d\x88t\xdd\u060a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\u0665\x17\x9f\t\x1d\x85\x05\x1d<\x98'\x85\xef\xd1E\\\uc199\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xe2\xe2e\x90(\x147\x84\xd5W\xbc\xeco\xf3\xa0r\x10H\x88\n\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xf4|\xae\x1c\xf7\x9c\xa6u\x8b\xfcx}\xbd!\u6f7eq\x12\xb8\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00" diff --git a/core/genesis_test.go b/core/genesis_test.go index 055be2796c..f3d6b23e5f 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -30,25 +30,6 @@ import ( "github.com/ethereum/go-ethereum/params" ) -func TestDefaultGenesisBlock(t *testing.T) { - block := DefaultGenesisBlock().ToBlock(nil) - if block.Hash() != params.MainnetGenesisHash { - t.Errorf("wrong mainnet genesis hash, got %v, want %v", block.Hash(), params.MainnetGenesisHash) - } - block = DefaultRopstenGenesisBlock().ToBlock(nil) - if block.Hash() != params.RopstenGenesisHash { - t.Errorf("wrong ropsten genesis hash, got %v, want %v", block.Hash(), params.RopstenGenesisHash) - } - block = DefaultRinkebyGenesisBlock().ToBlock(nil) - if block.Hash() != params.RinkebyGenesisHash { - t.Errorf("wrong rinkeby genesis hash, got %v, want %v", block.Hash(), params.RinkebyGenesisHash) - } - block = DefaultGoerliGenesisBlock().ToBlock(nil) - if block.Hash() != params.GoerliGenesisHash { - t.Errorf("wrong goerli genesis hash, got %v, want %v", block.Hash(), params.GoerliGenesisHash) - } -} - func TestInvalidCliqueConfig(t *testing.T) { block := DefaultGoerliGenesisBlock() block.ExtraData = []byte{} @@ -179,33 +160,56 @@ func TestSetupGenesis(t *testing.T) { } } -// TestGenesisHashes checks the congruity of default genesis data to corresponding hardcoded genesis hash values. +// TestGenesisHashes checks the congruity of default genesis data to +// corresponding hardcoded genesis hash values. func TestGenesisHashes(t *testing.T) { - cases := []struct { + for i, c := range []struct { genesis *Genesis - hash common.Hash + want common.Hash }{ - { - genesis: DefaultGenesisBlock(), - hash: params.MainnetGenesisHash, - }, - { - genesis: DefaultGoerliGenesisBlock(), - hash: params.GoerliGenesisHash, - }, - { - genesis: DefaultRopstenGenesisBlock(), - hash: params.RopstenGenesisHash, - }, - { - genesis: DefaultRinkebyGenesisBlock(), - hash: params.RinkebyGenesisHash, - }, - } - for i, c := range cases { - b := c.genesis.MustCommit(rawdb.NewMemoryDatabase()) - if got := b.Hash(); got != c.hash { - t.Errorf("case: %d, want: %s, got: %s", i, c.hash.Hex(), got.Hex()) + {DefaultGenesisBlock(), params.MainnetGenesisHash}, + {DefaultGoerliGenesisBlock(), params.GoerliGenesisHash}, + {DefaultRopstenGenesisBlock(), params.RopstenGenesisHash}, + {DefaultRinkebyGenesisBlock(), params.RinkebyGenesisHash}, + {DefaultSepoliaGenesisBlock(), params.SepoliaGenesisHash}, + } { + // Test via MustCommit + if have := c.genesis.MustCommit(rawdb.NewMemoryDatabase()).Hash(); have != c.want { + t.Errorf("case: %d a), want: %s, got: %s", i, c.want.Hex(), have.Hex()) + } + // Test via ToBlock + if have := c.genesis.ToBlock(nil).Hash(); have != c.want { + t.Errorf("case: %d a), want: %s, got: %s", i, c.want.Hex(), have.Hex()) } } } + +func TestGenesis_Commit(t *testing.T) { + genesis := &Genesis{ + BaseFee: big.NewInt(params.InitialBaseFee), + Config: params.TestChainConfig, + // difficulty is nil + } + + db := rawdb.NewMemoryDatabase() + genesisBlock, err := genesis.Commit(db) + if err != nil { + t.Fatal(err) + } + + if genesis.Difficulty != nil { + t.Fatalf("assumption wrong") + } + + // This value should have been set as default in the ToBlock method. + if genesisBlock.Difficulty().Cmp(params.GenesisDifficulty) != 0 { + t.Errorf("assumption wrong: want: %d, got: %v", params.GenesisDifficulty, genesisBlock.Difficulty()) + } + + // Expect the stored total difficulty to be the difficulty of the genesis block. + stored := rawdb.ReadTd(db, genesisBlock.Hash(), genesisBlock.NumberU64()) + + if stored.Cmp(genesisBlock.Difficulty()) != 0 { + t.Errorf("inequal difficulty; stored: %v, genesisBlock: %v", stored, genesisBlock.Difficulty()) + } +} diff --git a/core/headerchain.go b/core/headerchain.go index 9f2b708d0a..99364f638f 100644 --- a/core/headerchain.go +++ b/core/headerchain.go @@ -33,6 +33,7 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" lru "github.com/hashicorp/golang-lru" ) @@ -49,15 +50,14 @@ const ( // HeaderChain is responsible for maintaining the header chain including the // header query and updating. // -// The components maintained by headerchain includes: (1) total difficult +// The components maintained by headerchain includes: (1) total difficulty // (2) header (3) block hash -> number mapping (4) canonical number -> hash mapping // and (5) head header flag. // // It is not thread safe either, the encapsulating chain structures should do // the necessary mutex locking/unlocking. type HeaderChain struct { - config *params.ChainConfig - + config *params.ChainConfig chainDb ethdb.Database genesisHeader *types.Header @@ -86,7 +86,6 @@ func NewHeaderChain(chainDb ethdb.Database, config *params.ChainConfig, engine c if err != nil { return nil, err } - hc := &HeaderChain{ config: config, chainDb: chainDb, @@ -97,12 +96,10 @@ func NewHeaderChain(chainDb ethdb.Database, config *params.ChainConfig, engine c rand: mrand.New(mrand.NewSource(seed.Int64())), engine: engine, } - hc.genesisHeader = hc.GetHeaderByNumber(0) if hc.genesisHeader == nil { return nil, ErrNoGenesis } - hc.currentHeader.Store(hc.genesisHeader) if head := rawdb.ReadHeadBlockHash(chainDb); head != (common.Hash{}) { if chead := hc.GetHeaderByHash(head); chead != nil { @@ -111,7 +108,6 @@ func NewHeaderChain(chainDb ethdb.Database, config *params.ChainConfig, engine c } hc.currentHeaderHash = hc.CurrentHeader().Hash() headHeaderGauge.Update(hc.CurrentHeader().Number.Int64()) - return hc, nil } @@ -137,35 +133,93 @@ type headerWriteResult struct { lastHeader *types.Header } -// WriteHeaders writes a chain of headers into the local chain, given that the parents -// are already known. If the total difficulty of the newly inserted chain becomes -// greater than the current known TD, the canonical chain is reorged. -// -// Note: This method is not concurrent-safe with inserting blocks simultaneously -// into the chain, as side effects caused by reorganisations cannot be emulated -// without the real blocks. Hence, writing headers directly should only be done -// in two scenarios: pure-header mode of operation (light clients), or properly -// separated header/block phases (non-archive clients). -func (hc *HeaderChain) writeHeaders(headers []*types.Header) (result *headerWriteResult, err error) { +// Reorg reorgs the local canonical chain into the specified chain. The reorg +// can be classified into two cases: (a) extend the local chain (b) switch the +// head to the given header. +func (hc *HeaderChain) Reorg(headers []*types.Header) error { + // Short circuit if nothing to reorg. if len(headers) == 0 { - return &headerWriteResult{}, nil + return nil + } + // If the parent of the (first) block is already the canon header, + // we don't have to go backwards to delete canon blocks, but simply + // pile them onto the existing chain. Otherwise, do the necessary + // reorgs. + var ( + first = headers[0] + last = headers[len(headers)-1] + batch = hc.chainDb.NewBatch() + ) + if first.ParentHash != hc.currentHeaderHash { + // Delete any canonical number assignments above the new head + for i := last.Number.Uint64() + 1; ; i++ { + hash := rawdb.ReadCanonicalHash(hc.chainDb, i) + if hash == (common.Hash{}) { + break + } + rawdb.DeleteCanonicalHash(batch, i) + } + // Overwrite any stale canonical number assignments, going + // backwards from the first header in this import until the + // cross link between two chains. + var ( + header = first + headNumber = header.Number.Uint64() + headHash = header.Hash() + ) + for rawdb.ReadCanonicalHash(hc.chainDb, headNumber) != headHash { + rawdb.WriteCanonicalHash(batch, headHash, headNumber) + if headNumber == 0 { + break // It shouldn't be reached + } + headHash, headNumber = header.ParentHash, header.Number.Uint64()-1 + header = hc.GetHeader(headHash, headNumber) + if header == nil { + return fmt.Errorf("missing parent %d %x", headNumber, headHash) + } + } + } + // Extend the canonical chain with the new headers + for i := 0; i < len(headers)-1; i++ { + hash := headers[i+1].ParentHash // Save some extra hashing + num := headers[i].Number.Uint64() + rawdb.WriteCanonicalHash(batch, hash, num) + rawdb.WriteHeadHeaderHash(batch, hash) + } + // Write the last header + hash := headers[len(headers)-1].Hash() + num := headers[len(headers)-1].Number.Uint64() + rawdb.WriteCanonicalHash(batch, hash, num) + rawdb.WriteHeadHeaderHash(batch, hash) + + if err := batch.Write(); err != nil { + return err + } + // Last step update all in-memory head header markers + hc.currentHeaderHash = last.Hash() + hc.currentHeader.Store(types.CopyHeader(last)) + headHeaderGauge.Update(last.Number.Int64()) + return nil +} + +// WriteHeaders writes a chain of headers into the local chain, given that the +// parents are already known. The chain head header won't be updated in this +// function, the additional setChainHead is expected in order to finish the entire +// procedure. +func (hc *HeaderChain) WriteHeaders(headers []*types.Header) (int, error) { + if len(headers) == 0 { + return 0, nil } ptd := hc.GetTd(headers[0].ParentHash, headers[0].Number.Uint64()-1) if ptd == nil { - return &headerWriteResult{}, consensus.ErrUnknownAncestor + return 0, consensus.ErrUnknownAncestor } var ( - lastNumber = headers[0].Number.Uint64() - 1 // Last successfully imported number - lastHash = headers[0].ParentHash // Last imported header hash - newTD = new(big.Int).Set(ptd) // Total difficulty of inserted chain - - lastHeader *types.Header - inserted []numberHash // Ephemeral lookup of number/hash for the chain - firstInserted = -1 // Index of the first non-ignored header + newTD = new(big.Int).Set(ptd) // Total difficulty of inserted chain + inserted []rawdb.NumberHash // Ephemeral lookup of number/hash for the chain + parentKnown = true // Set to true to force hc.HasHeader check the first iteration + batch = hc.chainDb.NewBatch() ) - - batch := hc.chainDb.NewBatch() - parentKnown := true // Set to true to force hc.HasHeader check the first iteration for i, header := range headers { var hash common.Hash // The headers have already been validated at this point, so we already @@ -188,116 +242,67 @@ func (hc *HeaderChain) writeHeaders(headers []*types.Header) (result *headerWrit hc.tdCache.Add(hash, new(big.Int).Set(newTD)) rawdb.WriteHeader(batch, header) - inserted = append(inserted, numberHash{number, hash}) + inserted = append(inserted, rawdb.NumberHash{Number: number, Hash: hash}) hc.headerCache.Add(hash, header) hc.numberCache.Add(hash, number) - if firstInserted < 0 { - firstInserted = i - } } parentKnown = alreadyKnown - lastHeader, lastHash, lastNumber = header, hash, number } - // Skip the slow disk write of all headers if interrupted. if hc.procInterrupt() { log.Debug("Premature abort during headers import") - return &headerWriteResult{}, errors.New("aborted") + return 0, errors.New("aborted") } // Commit to disk! if err := batch.Write(); err != nil { log.Crit("Failed to write headers", "error", err) } - batch.Reset() + return len(inserted), nil +} +// writeHeadersAndSetHead writes a batch of block headers and applies the last +// header as the chain head if the fork choicer says it's ok to update the chain. +// Note: This method is not concurrent-safe with inserting blocks simultaneously +// into the chain, as side effects caused by reorganisations cannot be emulated +// without the real blocks. Hence, writing headers directly should only be done +// in two scenarios: pure-header mode of operation (light clients), or properly +// separated header/block phases (non-archive clients). +func (hc *HeaderChain) writeHeadersAndSetHead(headers []*types.Header, forker *ForkChoice) (*headerWriteResult, error) { + inserted, err := hc.WriteHeaders(headers) + if err != nil { + return nil, err + } var ( - head = hc.CurrentHeader().Number.Uint64() - localTD = hc.GetTd(hc.currentHeaderHash, head) - status = SideStatTy + lastHeader = headers[len(headers)-1] + lastHash = headers[len(headers)-1].Hash() + result = &headerWriteResult{ + status: NonStatTy, + ignored: len(headers) - inserted, + imported: inserted, + lastHash: lastHash, + lastHeader: lastHeader, + } ) - // If the total difficulty is higher than our known, add it to the canonical chain - // Second clause in the if statement reduces the vulnerability to selfish mining. - // Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf - reorg := newTD.Cmp(localTD) > 0 - if !reorg && newTD.Cmp(localTD) == 0 { - if lastNumber < head { - reorg = true - } else if lastNumber == head { - reorg = mrand.Float64() < 0.5 + // Ask the fork choicer if the reorg is necessary + if reorg, err := forker.ReorgNeeded(hc.CurrentHeader(), lastHeader); err != nil { + return nil, err + } else if !reorg { + if inserted != 0 { + result.status = SideStatTy } + return result, nil } - // If the parent of the (first) block is already the canon header, - // we don't have to go backwards to delete canon blocks, but - // simply pile them onto the existing chain - chainAlreadyCanon := headers[0].ParentHash == hc.currentHeaderHash - if reorg { - // If the header can be added into canonical chain, adjust the - // header chain markers(canonical indexes and head header flag). - // - // Note all markers should be written atomically. - markerBatch := batch // we can reuse the batch to keep allocs down - if !chainAlreadyCanon { - // Delete any canonical number assignments above the new head - for i := lastNumber + 1; ; i++ { - hash := rawdb.ReadCanonicalHash(hc.chainDb, i) - if hash == (common.Hash{}) { - break - } - rawdb.DeleteCanonicalHash(markerBatch, i) - } - // Overwrite any stale canonical number assignments, going - // backwards from the first header in this import - var ( - headHash = headers[0].ParentHash // inserted[0].parent? - headNumber = headers[0].Number.Uint64() - 1 // inserted[0].num-1 ? - headHeader = hc.GetHeader(headHash, headNumber) - ) - for rawdb.ReadCanonicalHash(hc.chainDb, headNumber) != headHash { - rawdb.WriteCanonicalHash(markerBatch, headHash, headNumber) - headHash = headHeader.ParentHash - headNumber = headHeader.Number.Uint64() - 1 - headHeader = hc.GetHeader(headHash, headNumber) - } - // If some of the older headers were already known, but obtained canon-status - // during this import batch, then we need to write that now - // Further down, we continue writing the staus for the ones that - // were not already known - for i := 0; i < firstInserted; i++ { - hash := headers[i].Hash() - num := headers[i].Number.Uint64() - rawdb.WriteCanonicalHash(markerBatch, hash, num) - rawdb.WriteHeadHeaderHash(markerBatch, hash) - } - } - // Extend the canonical chain with the new headers - for _, hn := range inserted { - rawdb.WriteCanonicalHash(markerBatch, hn.hash, hn.number) - rawdb.WriteHeadHeaderHash(markerBatch, hn.hash) - } - if err := markerBatch.Write(); err != nil { - log.Crit("Failed to write header markers into disk", "err", err) - } - markerBatch.Reset() - // Last step update all in-memory head header markers - hc.currentHeaderHash = lastHash - hc.currentHeader.Store(types.CopyHeader(lastHeader)) - headHeaderGauge.Update(lastHeader.Number.Int64()) - - // Chain status is canonical since this insert was a reorg. - // Note that all inserts which have higher TD than existing are 'reorg'. - status = CanonStatTy - } - - if len(inserted) == 0 { - status = NonStatTy - } - return &headerWriteResult{ - status: status, - ignored: len(headers) - len(inserted), - imported: len(inserted), - lastHash: lastHash, - lastHeader: lastHeader, - }, nil + // Special case, all the inserted headers are already on the canonical + // header chain, skip the reorg operation. + if hc.GetCanonicalHash(lastHeader.Number.Uint64()) == lastHash && lastHeader.Number.Uint64() <= hc.CurrentHeader().Number.Uint64() { + return result, nil + } + // Apply the reorg operation + if err := hc.Reorg(headers); err != nil { + return nil, err + } + result.status = CanonStatTy + return result, nil } func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) (int, error) { @@ -357,7 +362,7 @@ func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) return 0, nil } -// InsertHeaderChain inserts the given headers. +// InsertHeaderChain inserts the given headers and does the reorganisations. // // The validity of the headers is NOT CHECKED by this method, i.e. they need to be // validated by ValidateHeaderChain before calling InsertHeaderChain. @@ -367,20 +372,19 @@ func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) // // The returned 'write status' says if the inserted headers are part of the canonical chain // or a side chain. -func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, start time.Time) (WriteStatus, error) { +func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, start time.Time, forker *ForkChoice) (WriteStatus, error) { if hc.procInterrupt() { return 0, errors.New("aborted") } - res, err := hc.writeHeaders(chain) - + res, err := hc.writeHeadersAndSetHead(chain, forker) + if err != nil { + return 0, err + } // Report some public statistics so the user has a clue what's going on context := []interface{}{ "count", res.imported, "elapsed", common.PrettyDuration(time.Since(start)), } - if err != nil { - context = append(context, "err", err) - } if last := res.lastHeader; last != nil { context = append(context, "number", last.Number, "hash", res.lastHash) if timestamp := time.Unix(int64(last.Time), 0); time.Since(timestamp) > time.Minute { @@ -495,6 +499,46 @@ func (hc *HeaderChain) GetHeaderByNumber(number uint64) *types.Header { return hc.GetHeader(hash, number) } +// GetHeadersFrom returns a contiguous segment of headers, in rlp-form, going +// backwards from the given number. +// If the 'number' is higher than the highest local header, this method will +// return a best-effort response, containing the headers that we do have. +func (hc *HeaderChain) GetHeadersFrom(number, count uint64) []rlp.RawValue { + // If the request is for future headers, we still return the portion of + // headers that we are able to serve + if current := hc.CurrentHeader().Number.Uint64(); current < number { + if count > number-current { + count -= number - current + number = current + } else { + return nil + } + } + var headers []rlp.RawValue + // If we have some of the headers in cache already, use that before going to db. + hash := rawdb.ReadCanonicalHash(hc.chainDb, number) + if hash == (common.Hash{}) { + return nil + } + for count > 0 { + header, ok := hc.headerCache.Get(hash) + if !ok { + break + } + h := header.(*types.Header) + rlpData, _ := rlp.EncodeToBytes(h) + headers = append(headers, rlpData) + hash = h.ParentHash + count-- + number-- + } + // Read remaining from db + if count > 0 { + headers = append(headers, rawdb.ReadHeaderRange(hc.chainDb, number, count)...) + } + return headers +} + func (hc *HeaderChain) GetCanonicalHash(number uint64) common.Hash { return rawdb.ReadCanonicalHash(hc.chainDb, number) } diff --git a/core/headerchain_test.go b/core/headerchain_test.go index f3e40b6213..ed0522671f 100644 --- a/core/headerchain_test.go +++ b/core/headerchain_test.go @@ -51,10 +51,10 @@ func verifyUnbrokenCanonchain(hc *HeaderChain) error { return nil } -func testInsert(t *testing.T, hc *HeaderChain, chain []*types.Header, wantStatus WriteStatus, wantErr error) { +func testInsert(t *testing.T, hc *HeaderChain, chain []*types.Header, wantStatus WriteStatus, wantErr error, forker *ForkChoice) { t.Helper() - status, err := hc.InsertHeaderChain(chain, time.Now()) + status, err := hc.InsertHeaderChain(chain, time.Now(), forker) if status != wantStatus { t.Errorf("wrong write status from InsertHeaderChain: got %v, want %v", status, wantStatus) } @@ -80,37 +80,38 @@ func TestHeaderInsertion(t *testing.T) { } // chain A: G->A1->A2...A128 chainA := makeHeaderChain(genesis.Header(), 128, ethash.NewFaker(), db, 10) - // chain B: G->A1->B2...B128 + // chain B: G->A1->B1...B128 chainB := makeHeaderChain(chainA[0], 128, ethash.NewFaker(), db, 10) log.Root().SetHandler(log.StdoutHandler) + forker := NewForkChoice(hc, nil) // Inserting 64 headers on an empty chain, expecting // 1 callbacks, 1 canon-status, 0 sidestatus, - testInsert(t, hc, chainA[:64], CanonStatTy, nil) + testInsert(t, hc, chainA[:64], CanonStatTy, nil, forker) // Inserting 64 identical headers, expecting // 0 callbacks, 0 canon-status, 0 sidestatus, - testInsert(t, hc, chainA[:64], NonStatTy, nil) + testInsert(t, hc, chainA[:64], NonStatTy, nil, forker) // Inserting the same some old, some new headers // 1 callbacks, 1 canon, 0 side - testInsert(t, hc, chainA[32:96], CanonStatTy, nil) + testInsert(t, hc, chainA[32:96], CanonStatTy, nil, forker) // Inserting side blocks, but not overtaking the canon chain - testInsert(t, hc, chainB[0:32], SideStatTy, nil) + testInsert(t, hc, chainB[0:32], SideStatTy, nil, forker) // Inserting more side blocks, but we don't have the parent - testInsert(t, hc, chainB[34:36], NonStatTy, consensus.ErrUnknownAncestor) + testInsert(t, hc, chainB[34:36], NonStatTy, consensus.ErrUnknownAncestor, forker) // Inserting more sideblocks, overtaking the canon chain - testInsert(t, hc, chainB[32:97], CanonStatTy, nil) + testInsert(t, hc, chainB[32:97], CanonStatTy, nil, forker) // Inserting more A-headers, taking back the canonicality - testInsert(t, hc, chainA[90:100], CanonStatTy, nil) + testInsert(t, hc, chainA[90:100], CanonStatTy, nil, forker) // And B becomes canon again - testInsert(t, hc, chainB[97:107], CanonStatTy, nil) + testInsert(t, hc, chainB[97:107], CanonStatTy, nil, forker) // And B becomes even longer - testInsert(t, hc, chainB[107:128], CanonStatTy, nil) + testInsert(t, hc, chainB[107:128], CanonStatTy, nil, forker) } diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index 332a7016d1..2c285c60e7 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -35,20 +35,15 @@ import ( // ReadCanonicalHash retrieves the hash assigned to a canonical block number. func ReadCanonicalHash(db ethdb.Reader, number uint64) common.Hash { - data, _ := db.Ancient(freezerHashTable, number) - if len(data) == 0 { - data, _ = db.Get(headerHashKey(number)) - // In the background freezer is moving data from leveldb to flatten files. - // So during the first check for ancient db, the data is not yet in there, - // but when we reach into leveldb, the data was already moved. That would - // result in a not found error. + var data []byte + db.ReadAncients(func(reader ethdb.AncientReader) error { + data, _ = reader.Ancient(freezerHashTable, number) if len(data) == 0 { - data, _ = db.Ancient(freezerHashTable, number) + // Get it by hash from leveldb + data, _ = db.Get(headerHashKey(number)) } - } - if len(data) == 0 { - return common.Hash{} - } + return nil + }) return common.BytesToHash(data) } @@ -247,24 +242,6 @@ func WriteLastPivotNumber(db ethdb.KeyValueWriter, pivot uint64) { } } -// ReadFastTrieProgress retrieves the number of tries nodes fast synced to allow -// reporting correct numbers across restarts. -func ReadFastTrieProgress(db ethdb.KeyValueReader) uint64 { - data, _ := db.Get(fastTrieProgressKey) - if len(data) == 0 { - return 0 - } - return new(big.Int).SetBytes(data).Uint64() -} - -// WriteFastTrieProgress stores the fast sync trie process counter to support -// retrieving it across restarts. -func WriteFastTrieProgress(db ethdb.KeyValueWriter, count uint64) { - if err := db.Put(fastTrieProgressKey, new(big.Int).SetUint64(count).Bytes()); err != nil { - log.Crit("Failed to store fast sync trie progress", "err", err) - } -} - // ReadTxIndexTail retrieves the number of oldest indexed block // whose transaction indices has been indexed. If the corresponding entry // is non-existent in database it means the indexing has been finished. @@ -302,34 +279,77 @@ func WriteFastTxLookupLimit(db ethdb.KeyValueWriter, number uint64) { } } -// ReadHeaderRLP retrieves a block header in its raw RLP database encoding. -func ReadHeaderRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { - // First try to look up the data in ancient database. Extra hash - // comparison is necessary since ancient database only maintains - // the canonical data. - data, _ := db.Ancient(freezerHeaderTable, number) - if len(data) > 0 && crypto.Keccak256Hash(data) == hash { - return data +// ReadHeaderRange returns the rlp-encoded headers, starting at 'number', and going +// backwards towards genesis. This method assumes that the caller already has +// placed a cap on count, to prevent DoS issues. +// Since this method operates in head-towards-genesis mode, it will return an empty +// slice in case the head ('number') is missing. Hence, the caller must ensure that +// the head ('number') argument is actually an existing header. +// +// N.B: Since the input is a number, as opposed to a hash, it's implicit that +// this method only operates on canon headers. +func ReadHeaderRange(db ethdb.Reader, number uint64, count uint64) []rlp.RawValue { + var rlpHeaders []rlp.RawValue + if count == 0 { + return rlpHeaders + } + i := number + if count-1 > number { + // It's ok to request block 0, 1 item + count = number + 1 + } + limit, _ := db.Ancients() + // First read live blocks + if i >= limit { + // If we need to read live blocks, we need to figure out the hash first + hash := ReadCanonicalHash(db, number) + for ; i >= limit && count > 0; i-- { + if data, _ := db.Get(headerKey(i, hash)); len(data) > 0 { + rlpHeaders = append(rlpHeaders, data) + // Get the parent hash for next query + hash = types.HeaderParentHashFromRLP(data) + } else { + break // Maybe got moved to ancients + } + count-- + } } - // Then try to look up the data in leveldb. - data, _ = db.Get(headerKey(number, hash)) - if len(data) > 0 { - return data + if count == 0 { + return rlpHeaders } - // In the background freezer is moving data from leveldb to flatten files. - // So during the first check for ancient db, the data is not yet in there, - // but when we reach into leveldb, the data was already moved. That would - // result in a not found error. - data, _ = db.Ancient(freezerHeaderTable, number) - if len(data) > 0 && crypto.Keccak256Hash(data) == hash { - return data + // read remaining from ancients + max := count * 700 + data, err := db.AncientRange(freezerHeaderTable, i+1-count, count, max) + if err == nil && uint64(len(data)) == count { + // the data is on the order [h, h+1, .., n] -- reordering needed + for i := range data { + rlpHeaders = append(rlpHeaders, data[len(data)-1-i]) + } } - return nil // Can't find the data anywhere. + return rlpHeaders +} + +// ReadHeaderRLP retrieves a block header in its raw RLP database encoding. +func ReadHeaderRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + var data []byte + db.ReadAncients(func(reader ethdb.AncientReader) error { + // First try to look up the data in ancient database. Extra hash + // comparison is necessary since ancient database only maintains + // the canonical data. + data, _ = reader.Ancient(freezerHeaderTable, number) + if len(data) > 0 && crypto.Keccak256Hash(data) == hash { + return nil + } + // If not, try reading from leveldb + data, _ = db.Get(headerKey(number, hash)) + return nil + }) + return data } // HasHeader verifies the existence of a block header corresponding to the hash. func HasHeader(db ethdb.Reader, hash common.Hash, number uint64) bool { - if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + if isCanon(db, number, hash) { return true } if has, err := db.Has(headerKey(number, hash)); !has || err != nil { @@ -389,53 +409,51 @@ func deleteHeaderWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number } } +// isCanon is an internal utility method, to check whether the given number/hash +// is part of the ancient (canon) set. +func isCanon(reader ethdb.AncientReader, number uint64, hash common.Hash) bool { + h, err := reader.Ancient(freezerHashTable, number) + if err != nil { + return false + } + return bytes.Equal(h, hash[:]) +} + // ReadBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. func ReadBodyRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { // First try to look up the data in ancient database. Extra hash // comparison is necessary since ancient database only maintains // the canonical data. - data, _ := db.Ancient(freezerBodiesTable, number) - if len(data) > 0 { - h, _ := db.Ancient(freezerHashTable, number) - if common.BytesToHash(h) == hash { - return data - } - } - // Then try to look up the data in leveldb. - data, _ = db.Get(blockBodyKey(number, hash)) - if len(data) > 0 { - return data - } - // In the background freezer is moving data from leveldb to flatten files. - // So during the first check for ancient db, the data is not yet in there, - // but when we reach into leveldb, the data was already moved. That would - // result in a not found error. - data, _ = db.Ancient(freezerBodiesTable, number) - if len(data) > 0 { - h, _ := db.Ancient(freezerHashTable, number) - if common.BytesToHash(h) == hash { - return data + var data []byte + db.ReadAncients(func(reader ethdb.AncientReader) error { + // Check if the data is in ancients + if isCanon(reader, number, hash) { + data, _ = reader.Ancient(freezerBodiesTable, number) + return nil } - } - return nil // Can't find the data anywhere. + // If not, try reading from leveldb + data, _ = db.Get(blockBodyKey(number, hash)) + return nil + }) + return data } // ReadCanonicalBodyRLP retrieves the block body (transactions and uncles) for the canonical // block at number, in RLP encoding. func ReadCanonicalBodyRLP(db ethdb.Reader, number uint64) rlp.RawValue { - // If it's an ancient one, we don't need the canonical hash - data, _ := db.Ancient(freezerBodiesTable, number) - if len(data) == 0 { - // Need to get the hash - data, _ = db.Get(blockBodyKey(number, ReadCanonicalHash(db, number))) - // In the background freezer is moving data from leveldb to flatten files. - // So during the first check for ancient db, the data is not yet in there, - // but when we reach into leveldb, the data was already moved. That would - // result in a not found error. - if len(data) == 0 { - data, _ = db.Ancient(freezerBodiesTable, number) + var data []byte + db.ReadAncients(func(reader ethdb.AncientReader) error { + data, _ = reader.Ancient(freezerBodiesTable, number) + if len(data) > 0 { + return nil } - } + // Block is not in ancients, read from leveldb by hash and number. + // Note: ReadCanonicalHash cannot be used here because it also + // calls ReadAncients internally. + hash, _ := db.Get(headerHashKey(number)) + data, _ = db.Get(blockBodyKey(number, common.BytesToHash(hash))) + return nil + }) return data } @@ -448,7 +466,7 @@ func WriteBodyRLP(db ethdb.KeyValueWriter, hash common.Hash, number uint64, rlp // HasBody verifies the existence of a block body corresponding to the hash. func HasBody(db ethdb.Reader, hash common.Hash, number uint64) bool { - if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + if isCanon(db, number, hash) { return true } if has, err := db.Has(blockBodyKey(number, hash)); !has || err != nil { @@ -489,33 +507,18 @@ func DeleteBody(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { // ReadTdRLP retrieves a block's total difficulty corresponding to the hash in RLP encoding. func ReadTdRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { - // First try to look up the data in ancient database. Extra hash - // comparison is necessary since ancient database only maintains - // the canonical data. - data, _ := db.Ancient(freezerDifficultyTable, number) - if len(data) > 0 { - h, _ := db.Ancient(freezerHashTable, number) - if common.BytesToHash(h) == hash { - return data - } - } - // Then try to look up the data in leveldb. - data, _ = db.Get(headerTDKey(number, hash)) - if len(data) > 0 { - return data - } - // In the background freezer is moving data from leveldb to flatten files. - // So during the first check for ancient db, the data is not yet in there, - // but when we reach into leveldb, the data was already moved. That would - // result in a not found error. - data, _ = db.Ancient(freezerDifficultyTable, number) - if len(data) > 0 { - h, _ := db.Ancient(freezerHashTable, number) - if common.BytesToHash(h) == hash { - return data + var data []byte + db.ReadAncients(func(reader ethdb.AncientReader) error { + // Check if the data is in ancients + if isCanon(reader, number, hash) { + data, _ = reader.Ancient(freezerDifficultyTable, number) + return nil } - } - return nil // Can't find the data anywhere. + // If not, try reading from leveldb + data, _ = db.Get(headerTDKey(number, hash)) + return nil + }) + return data } // ReadTd retrieves a block's total difficulty corresponding to the hash. @@ -553,7 +556,7 @@ func DeleteTd(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { // HasReceipts verifies the existence of all the transaction receipts belonging // to a block. func HasReceipts(db ethdb.Reader, hash common.Hash, number uint64) bool { - if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + if isCanon(db, number, hash) { return true } if has, err := db.Has(blockReceiptsKey(number, hash)); !has || err != nil { @@ -564,33 +567,18 @@ func HasReceipts(db ethdb.Reader, hash common.Hash, number uint64) bool { // ReadReceiptsRLP retrieves all the transaction receipts belonging to a block in RLP encoding. func ReadReceiptsRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { - // First try to look up the data in ancient database. Extra hash - // comparison is necessary since ancient database only maintains - // the canonical data. - data, _ := db.Ancient(freezerReceiptTable, number) - if len(data) > 0 { - h, _ := db.Ancient(freezerHashTable, number) - if common.BytesToHash(h) == hash { - return data - } - } - // Then try to look up the data in leveldb. - data, _ = db.Get(blockReceiptsKey(number, hash)) - if len(data) > 0 { - return data - } - // In the background freezer is moving data from leveldb to flatten files. - // So during the first check for ancient db, the data is not yet in there, - // but when we reach into leveldb, the data was already moved. That would - // result in a not found error. - data, _ = db.Ancient(freezerReceiptTable, number) - if len(data) > 0 { - h, _ := db.Ancient(freezerHashTable, number) - if common.BytesToHash(h) == hash { - return data + var data []byte + db.ReadAncients(func(reader ethdb.AncientReader) error { + // Check if the data is in ancients + if isCanon(reader, number, hash) { + data, _ = reader.Ancient(freezerReceiptTable, number) + return nil } - } - return nil // Can't find the data anywhere. + // If not, try reading from leveldb + data, _ = db.Get(blockReceiptsKey(number, hash)) + return nil + }) + return data } // ReadRawReceipts retrieves all the transaction receipts belonging to a block. @@ -716,7 +704,7 @@ func deriveLogFields(receipts []*receiptLogs, hash common.Hash, number uint64, t // ReadLogs retrieves the logs for all transactions in a block. The log fields // are populated with metadata. In case the receipts or the block body // are not found, a nil is returned. -func ReadLogs(db ethdb.Reader, hash common.Hash, number uint64) [][]*types.Log { +func ReadLogs(db ethdb.Reader, hash common.Hash, number uint64, config *params.ChainConfig) [][]*types.Log { // Retrieve the flattened receipt slice data := ReadReceiptsRLP(db, hash, number) if len(data) == 0 { @@ -724,6 +712,11 @@ func ReadLogs(db ethdb.Reader, hash common.Hash, number uint64) [][]*types.Log { } receipts := []*receiptLogs{} if err := rlp.DecodeBytes(data, &receipts); err != nil { + // Receipts might be in the legacy format, try decoding that. + // TODO: to be removed after users migrated + if logs := readLegacyLogs(db, hash, number, config); logs != nil { + return logs + } log.Error("Invalid receipt array RLP", "hash", hash, "err", err) return nil } @@ -744,6 +737,21 @@ func ReadLogs(db ethdb.Reader, hash common.Hash, number uint64) [][]*types.Log { return logs } +// readLegacyLogs is a temporary workaround for when trying to read logs +// from a block which has its receipt stored in the legacy format. It'll +// be removed after users have migrated their freezer databases. +func readLegacyLogs(db ethdb.Reader, hash common.Hash, number uint64, config *params.ChainConfig) [][]*types.Log { + receipts := ReadReceipts(db, hash, number, config) + if receipts == nil { + return nil + } + logs := make([][]*types.Log, len(receipts)) + for i, receipt := range receipts { + logs[i] = receipt.Logs + } + return logs +} + // ReadBlock retrieves an entire block corresponding to the hash, assembling it // back from the stored header and body. If either the header or body could not // be retrieved nil is returned. diff --git a/core/rawdb/accessors_chain_test.go b/core/rawdb/accessors_chain_test.go index eb1951d326..d57b9899bf 100644 --- a/core/rawdb/accessors_chain_test.go +++ b/core/rawdb/accessors_chain_test.go @@ -744,7 +744,7 @@ func TestReadLogs(t *testing.T) { // Insert the receipt slice into the database and check presence WriteReceipts(db, hash, 0, receipts) - logs := ReadLogs(db, hash, 0) + logs := ReadLogs(db, hash, 0, params.TestChainConfig) if len(logs) == 0 { t.Fatalf("no logs returned") } @@ -883,3 +883,67 @@ func BenchmarkDecodeRLPLogs(b *testing.B) { } }) } + +func TestHeadersRLPStorage(t *testing.T) { + // Have N headers in the freezer + frdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(frdir) + + db, err := NewDatabaseWithFreezer(NewMemoryDatabase(), frdir, "", false) + if err != nil { + t.Fatalf("failed to create database with ancient backend") + } + defer db.Close() + // Create blocks + var chain []*types.Block + var pHash common.Hash + for i := 0; i < 100; i++ { + block := types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(int64(i)), + Extra: []byte("test block"), + UncleHash: types.EmptyUncleHash, + TxHash: types.EmptyRootHash, + ReceiptHash: types.EmptyRootHash, + ParentHash: pHash, + }) + chain = append(chain, block) + pHash = block.Hash() + } + var receipts []types.Receipts = make([]types.Receipts, 100) + // Write first half to ancients + WriteAncientBlocks(db, chain[:50], receipts[:50], big.NewInt(100)) + // Write second half to db + for i := 50; i < 100; i++ { + WriteCanonicalHash(db, chain[i].Hash(), chain[i].NumberU64()) + WriteBlock(db, chain[i]) + } + checkSequence := func(from, amount int) { + headersRlp := ReadHeaderRange(db, uint64(from), uint64(amount)) + if have, want := len(headersRlp), amount; have != want { + t.Fatalf("have %d headers, want %d", have, want) + } + for i, headerRlp := range headersRlp { + var header types.Header + if err := rlp.DecodeBytes(headerRlp, &header); err != nil { + t.Fatal(err) + } + if have, want := header.Number.Uint64(), uint64(from-i); have != want { + t.Fatalf("wrong number, have %d want %d", have, want) + } + } + } + checkSequence(99, 20) // Latest block and 19 parents + checkSequence(99, 50) // Latest block -> all db blocks + checkSequence(99, 51) // Latest block -> one from ancients + checkSequence(99, 52) // Latest blocks -> two from ancients + checkSequence(50, 2) // One from db, one from ancients + checkSequence(49, 1) // One from ancients + checkSequence(49, 50) // All ancient ones + checkSequence(99, 100) // All blocks + checkSequence(0, 1) // Only genesis + checkSequence(1, 1) // Only block 1 + checkSequence(1, 2) // Genesis + block 1 +} diff --git a/core/rawdb/accessors_metadata.go b/core/rawdb/accessors_metadata.go index 079e335fa6..3b0fcf0f2d 100644 --- a/core/rawdb/accessors_metadata.go +++ b/core/rawdb/accessors_metadata.go @@ -138,3 +138,38 @@ func PopUncleanShutdownMarker(db ethdb.KeyValueStore) { log.Warn("Failed to clear unclean-shutdown marker", "err", err) } } + +// UpdateUncleanShutdownMarker updates the last marker's timestamp to now. +func UpdateUncleanShutdownMarker(db ethdb.KeyValueStore) { + var uncleanShutdowns crashList + // Read old data + if data, err := db.Get(uncleanShutdownKey); err != nil { + log.Warn("Error reading unclean shutdown markers", "error", err) + } else if err := rlp.DecodeBytes(data, &uncleanShutdowns); err != nil { + log.Warn("Error decoding unclean shutdown markers", "error", err) + } + // This shouldn't happen because we push a marker on Backend instantiation + count := len(uncleanShutdowns.Recent) + if count == 0 { + log.Warn("No unclean shutdown marker to update") + return + } + uncleanShutdowns.Recent[count-1] = uint64(time.Now().Unix()) + data, _ := rlp.EncodeToBytes(uncleanShutdowns) + if err := db.Put(uncleanShutdownKey, data); err != nil { + log.Warn("Failed to write unclean-shutdown marker", "err", err) + } +} + +// ReadTransitionStatus retrieves the eth2 transition status from the database +func ReadTransitionStatus(db ethdb.KeyValueReader) []byte { + data, _ := db.Get(transitionStatusKey) + return data +} + +// WriteTransitionStatus stores the eth2 transition status to the database +func WriteTransitionStatus(db ethdb.KeyValueWriter, data []byte) { + if err := db.Put(transitionStatusKey, data); err != nil { + log.Crit("Failed to store the eth2 transition status", "err", err) + } +} diff --git a/core/rawdb/accessors_snapshot.go b/core/rawdb/accessors_snapshot.go index 88446e0792..1c828662c1 100644 --- a/core/rawdb/accessors_snapshot.go +++ b/core/rawdb/accessors_snapshot.go @@ -47,7 +47,7 @@ func DeleteSnapshotDisabled(db ethdb.KeyValueWriter) { // ReadSnapshotRoot retrieves the root of the block whose state is contained in // the persisted snapshot. func ReadSnapshotRoot(db ethdb.KeyValueReader) common.Hash { - data, _ := db.Get(snapshotRootKey) + data, _ := db.Get(SnapshotRootKey) if len(data) != common.HashLength { return common.Hash{} } @@ -57,7 +57,7 @@ func ReadSnapshotRoot(db ethdb.KeyValueReader) common.Hash { // WriteSnapshotRoot stores the root of the block whose state is contained in // the persisted snapshot. func WriteSnapshotRoot(db ethdb.KeyValueWriter, root common.Hash) { - if err := db.Put(snapshotRootKey, root[:]); err != nil { + if err := db.Put(SnapshotRootKey, root[:]); err != nil { log.Crit("Failed to store snapshot root", "err", err) } } @@ -67,7 +67,7 @@ func WriteSnapshotRoot(db ethdb.KeyValueWriter, root common.Hash) { // be used during updates, so a crash or failure will mark the entire snapshot // invalid. func DeleteSnapshotRoot(db ethdb.KeyValueWriter) { - if err := db.Delete(snapshotRootKey); err != nil { + if err := db.Delete(SnapshotRootKey); err != nil { log.Crit("Failed to remove snapshot root", "err", err) } } @@ -208,11 +208,3 @@ func WriteSnapshotSyncStatus(db ethdb.KeyValueWriter, status []byte) { log.Crit("Failed to store snapshot sync status", "err", err) } } - -// DeleteSnapshotSyncStatus deletes the serialized sync status saved at the last -// shutdown -func DeleteSnapshotSyncStatus(db ethdb.KeyValueWriter) { - if err := db.Delete(snapshotSyncStatusKey); err != nil { - log.Crit("Failed to remove snapshot sync status", "err", err) - } -} diff --git a/core/rawdb/chain_iterator.go b/core/rawdb/chain_iterator.go index ad222005be..0d5a5ee6a7 100644 --- a/core/rawdb/chain_iterator.go +++ b/core/rawdb/chain_iterator.go @@ -44,24 +44,29 @@ func InitDatabaseFromFreezer(db ethdb.Database) { logged = start.Add(-7 * time.Second) // Unindex during import is fast, don't double log hash common.Hash ) - for i := uint64(0); i < frozen; i++ { - // Since the freezer has all data in sequential order on a file, - // it would be 'neat' to read more data in one go, and let the - // freezerdb return N items (e.g up to 1000 items per go) - // That would require an API change in Ancients though - if h, err := db.Ancient(freezerHashTable, i); err != nil { + for i := uint64(0); i < frozen; { + // We read 100K hashes at a time, for a total of 3.2M + count := uint64(100_000) + if i+count > frozen { + count = frozen - i + } + data, err := db.AncientRange(freezerHashTable, i, count, 32*count) + if err != nil { log.Crit("Failed to init database from freezer", "err", err) - } else { - hash = common.BytesToHash(h) } - WriteHeaderNumber(batch, hash, i) - // If enough data was accumulated in memory or we're at the last block, dump to disk - if batch.ValueSize() > ethdb.IdealBatchSize { - if err := batch.Write(); err != nil { - log.Crit("Failed to write data to db", "err", err) + for j, h := range data { + number := i + uint64(j) + hash = common.BytesToHash(h) + WriteHeaderNumber(batch, hash, number) + // If enough data was accumulated in memory or we're at the last block, dump to disk + if batch.ValueSize() > ethdb.IdealBatchSize { + if err := batch.Write(); err != nil { + log.Crit("Failed to write data to db", "err", err) + } + batch.Reset() } - batch.Reset() } + i += uint64(len(data)) // If we've spent too much time already, notify the user of what we're doing if time.Since(logged) > 8*time.Second { log.Info("Initializing database from freezer", "total", frozen, "number", i, "hash", hash, "elapsed", common.PrettyDuration(time.Since(start))) @@ -242,7 +247,8 @@ func indexTransactions(db ethdb.Database, from uint64, to uint64, interrupt chan } } -// IndexTransactions creates txlookup indices of the specified block range. +// IndexTransactions creates txlookup indices of the specified block range. The from +// is included while to is excluded. // // This function iterates canonical chain in reverse order, it has one main advantage: // We can write tx index tail flag periodically even without the whole indexing @@ -334,6 +340,7 @@ func unindexTransactions(db ethdb.Database, from uint64, to uint64, interrupt ch } // UnindexTransactions removes txlookup indices of the specified block range. +// The from is included while to is excluded. // // There is a passed channel, the whole procedure will be interrupted if any // signal received. diff --git a/core/rawdb/database.go b/core/rawdb/database.go index 0e116ef999..5ef64d26a2 100644 --- a/core/rawdb/database.go +++ b/core/rawdb/database.go @@ -89,8 +89,8 @@ func (db *nofreezedb) Ancient(kind string, number uint64) ([]byte, error) { return nil, errNotSupported } -// ReadAncients returns an error as we don't have a backing chain freezer. -func (db *nofreezedb) ReadAncients(kind string, start, max, maxByteSize uint64) ([][]byte, error) { +// AncientRange returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) AncientRange(kind string, start, max, maxByteSize uint64) ([][]byte, error) { return nil, errNotSupported } @@ -119,6 +119,22 @@ func (db *nofreezedb) Sync() error { return errNotSupported } +func (db *nofreezedb) ReadAncients(fn func(reader ethdb.AncientReader) error) (err error) { + // Unlike other ancient-related methods, this method does not return + // errNotSupported when invoked. + // The reason for this is that the caller might want to do several things: + // 1. Check if something is in freezer, + // 2. If not, check leveldb. + // + // This will work, since the ancient-checks inside 'fn' will return errors, + // and the leveldb work will continue. + // + // If we instead were to return errNotSupported here, then the caller would + // have to explicitly check for that, having an extra clause to do the + // non-ancient operations. + return fn(db) +} + // NewDatabase creates a high level database on top of a given key-value data // store without a freezer moving immutable chain segments into cold storage. func NewDatabase(db ethdb.KeyValueStore) ethdb.Database { @@ -355,7 +371,7 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte) error { accountSnaps.Add(size) case bytes.HasPrefix(key, SnapshotStoragePrefix) && len(key) == (len(SnapshotStoragePrefix)+2*common.HashLength): storageSnaps.Add(size) - case bytes.HasPrefix(key, preimagePrefix) && len(key) == (len(preimagePrefix)+common.HashLength): + case bytes.HasPrefix(key, PreimagePrefix) && len(key) == (len(PreimagePrefix)+common.HashLength): preimages.Add(size) case bytes.HasPrefix(key, configPrefix) && len(key) == (len(configPrefix)+common.HashLength): metadata.Add(size) @@ -377,9 +393,9 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte) error { var accounted bool for _, meta := range [][]byte{ databaseVersionKey, headHeaderKey, headBlockKey, headFastBlockKey, lastPivotKey, - fastTrieProgressKey, snapshotDisabledKey, snapshotRootKey, snapshotJournalKey, + fastTrieProgressKey, snapshotDisabledKey, SnapshotRootKey, snapshotJournalKey, snapshotGeneratorKey, snapshotRecoveryKey, txIndexTailKey, fastTxLookupLimitKey, - uncleanShutdownKey, badBlockKey, + uncleanShutdownKey, badBlockKey, transitionStatusKey, } { if bytes.Equal(key, meta) { metadata.Add(size) diff --git a/core/rawdb/freezer.go b/core/rawdb/freezer.go index 0d4f0fa90a..94ceccc34a 100644 --- a/core/rawdb/freezer.go +++ b/core/rawdb/freezer.go @@ -80,8 +80,9 @@ type freezer struct { frozen uint64 // Number of blocks already frozen threshold uint64 // Number of recent blocks not to freeze (params.FullImmutabilityThreshold apart from tests) - // This lock synchronizes writers and the truncate operation. - writeLock sync.Mutex + // This lock synchronizes writers and the truncate operation, as well as + // the "atomic" (batched) read operations. + writeLock sync.RWMutex writeBatch *freezerBatch readonly bool @@ -213,12 +214,12 @@ func (f *freezer) Ancient(kind string, number uint64) ([]byte, error) { return nil, errUnknownTable } -// ReadAncients retrieves multiple items in sequence, starting from the index 'start'. +// AncientRange retrieves multiple items in sequence, starting from the index 'start'. // It will return // - at most 'max' items, // - at least 1 item (even if exceeding the maxByteSize), but will otherwise // return as many items as fit into maxByteSize. -func (f *freezer) ReadAncients(kind string, start, count, maxBytes uint64) ([][]byte, error) { +func (f *freezer) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { if table := f.tables[kind]; table != nil { return table.RetrieveItems(start, count, maxBytes) } @@ -234,8 +235,8 @@ func (f *freezer) Ancients() (uint64, error) { func (f *freezer) AncientSize(kind string) (uint64, error) { // This needs the write lock to avoid data races on table fields. // Speed doesn't matter here, AncientSize is for debugging. - f.writeLock.Lock() - defer f.writeLock.Unlock() + f.writeLock.RLock() + defer f.writeLock.RUnlock() if table := f.tables[kind]; table != nil { return table.size() @@ -243,6 +244,14 @@ func (f *freezer) AncientSize(kind string) (uint64, error) { return 0, errUnknownTable } +// ReadAncients runs the given read operation while ensuring that no writes take place +// on the underlying freezer. +func (f *freezer) ReadAncients(fn func(ethdb.AncientReader) error) (err error) { + f.writeLock.RLock() + defer f.writeLock.RUnlock() + return fn(f) +} + // ModifyAncients runs the given write operation. func (f *freezer) ModifyAncients(fn func(ethdb.AncientWriteOp) error) (writeSize int64, err error) { if f.readonly { diff --git a/core/rawdb/freezer_batch.go b/core/rawdb/freezer_batch.go index 8297c0ac1d..762fa8f25f 100644 --- a/core/rawdb/freezer_batch.go +++ b/core/rawdb/freezer_batch.go @@ -116,7 +116,7 @@ func (batch *freezerTableBatch) reset() { // existing data. func (batch *freezerTableBatch) Append(item uint64, data interface{}) error { if item != batch.curItem { - return errOutOrderInsertion + return fmt.Errorf("%w: have %d want %d", errOutOrderInsertion, item, batch.curItem) } // Encode the item. @@ -136,7 +136,7 @@ func (batch *freezerTableBatch) Append(item uint64, data interface{}) error { // existing data. func (batch *freezerTableBatch) AppendRaw(item uint64, blob []byte) error { if item != batch.curItem { - return errOutOrderInsertion + return fmt.Errorf("%w: have %d want %d", errOutOrderInsertion, item, batch.curItem) } encItem := blob diff --git a/core/rawdb/freezer_test.go b/core/rawdb/freezer_test.go index 7359131c89..fa84f80306 100644 --- a/core/rawdb/freezer_test.go +++ b/core/rawdb/freezer_test.go @@ -246,7 +246,7 @@ func TestFreezerConcurrentModifyTruncate(t *testing.T) { if truncateErr != nil { t.Fatal("concurrent truncate failed:", err) } - if !(modifyErr == nil || modifyErr == errOutOrderInsertion) { + if !(errors.Is(modifyErr, nil) || errors.Is(modifyErr, errOutOrderInsertion)) { t.Fatal("wrong error from concurrent modify:", modifyErr) } checkAncientCount(t, f, "test", 10) diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go index a6c9888522..942b8199e8 100644 --- a/core/rawdb/schema.go +++ b/core/rawdb/schema.go @@ -48,8 +48,8 @@ var ( // snapshotDisabledKey flags that the snapshot should not be maintained due to initial sync. snapshotDisabledKey = []byte("SnapshotDisabled") - // snapshotRootKey tracks the hash of the last snapshot. - snapshotRootKey = []byte("SnapshotRoot") + // SnapshotRootKey tracks the hash of the last snapshot. + SnapshotRootKey = []byte("SnapshotRoot") // snapshotJournalKey tracks the in-memory diff layers across restarts. snapshotJournalKey = []byte("SnapshotJournal") @@ -75,6 +75,9 @@ var ( // uncleanShutdownKey tracks the list of local crashes uncleanShutdownKey = []byte("unclean-shutdown") // config prefix for the db + // transitionStatusKey tracks the eth2 transition status. + transitionStatusKey = []byte("eth2-transition") + // Data item prefixes (use single byte to avoid mixing data types, avoid `i`, used for indexes). headerPrefix = []byte("h") // headerPrefix + num (uint64 big endian) + hash -> header headerTDSuffix = []byte("t") // headerPrefix + num (uint64 big endian) + hash + headerTDSuffix -> td @@ -90,7 +93,7 @@ var ( SnapshotStoragePrefix = []byte("o") // SnapshotStoragePrefix + account hash + storage hash -> storage trie value CodePrefix = []byte("c") // CodePrefix + code hash -> account code - preimagePrefix = []byte("secure-key-") // preimagePrefix + hash -> preimage + PreimagePrefix = []byte("secure-key-") // PreimagePrefix + hash -> preimage configPrefix = []byte("ethereum-config-") // config prefix for the db // Chain index prefixes (use `i` + single byte to avoid mixing data types). @@ -208,9 +211,9 @@ func bloomBitsKey(bit uint, section uint64, hash common.Hash) []byte { return key } -// preimageKey = preimagePrefix + hash +// preimageKey = PreimagePrefix + hash func preimageKey(hash common.Hash) []byte { - return append(preimagePrefix, hash.Bytes()...) + return append(PreimagePrefix, hash.Bytes()...) } // codeKey = CodePrefix + hash diff --git a/core/rawdb/table.go b/core/rawdb/table.go index 02e23b5174..91fc31b660 100644 --- a/core/rawdb/table.go +++ b/core/rawdb/table.go @@ -62,10 +62,10 @@ func (t *table) Ancient(kind string, number uint64) ([]byte, error) { return t.db.Ancient(kind, number) } -// ReadAncients is a noop passthrough that just forwards the request to the underlying +// AncientRange is a noop passthrough that just forwards the request to the underlying // database. -func (t *table) ReadAncients(kind string, start, count, maxBytes uint64) ([][]byte, error) { - return t.db.ReadAncients(kind, start, count, maxBytes) +func (t *table) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { + return t.db.AncientRange(kind, start, count, maxBytes) } // Ancients is a noop passthrough that just forwards the request to the underlying @@ -85,6 +85,10 @@ func (t *table) ModifyAncients(fn func(ethdb.AncientWriteOp) error) (int64, erro return t.db.ModifyAncients(fn) } +func (t *table) ReadAncients(fn func(reader ethdb.AncientReader) error) (err error) { + return t.db.ReadAncients(fn) +} + // TruncateAncients is a noop passthrough that just forwards the request to the underlying // database. func (t *table) TruncateAncients(items uint64) error { diff --git a/core/rlp_test.go b/core/rlp_test.go index 3a90811e74..40bcef5e55 100644 --- a/core/rlp_test.go +++ b/core/rlp_test.go @@ -40,7 +40,7 @@ func getBlock(transactions int, uncles int, dataSize int) *types.Block { // A sender who makes transactions, has some funds key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) - funds = big.NewInt(1000000000000000) + funds = big.NewInt(1_000_000_000_000_000_000) gspec = &Genesis{ Config: params.TestChainConfig, Alloc: GenesisAlloc{address: {Balance: funds}}, diff --git a/core/state/snapshot/difflayer_test.go b/core/state/snapshot/difflayer_test.go index 919af5fa86..e15c1d5049 100644 --- a/core/state/snapshot/difflayer_test.go +++ b/core/state/snapshot/difflayer_test.go @@ -388,7 +388,7 @@ func BenchmarkJournal(b *testing.B) { } return newDiffLayer(parent, common.Hash{}, destructs, accounts, storage) } - layer := snapshot(new(diskLayer)) + layer := snapshot(emptyLayer()) for i := 1; i < 128; i++ { layer = fill(layer) } diff --git a/core/state/snapshot/generate.go b/core/state/snapshot/generate.go index 3e11b4ac6b..9d74ca4d9b 100644 --- a/core/state/snapshot/generate.go +++ b/core/state/snapshot/generate.go @@ -48,13 +48,13 @@ var ( // accountCheckRange is the upper limit of the number of accounts involved in // each range check. This is a value estimated based on experience. If this // value is too large, the failure rate of range prove will increase. Otherwise - // the the value is too small, the efficiency of the state recovery will decrease. + // the value is too small, the efficiency of the state recovery will decrease. accountCheckRange = 128 // storageCheckRange is the upper limit of the number of storage slots involved // in each range check. This is a value estimated based on experience. If this // value is too large, the failure rate of range prove will increase. Otherwise - // the the value is too small, the efficiency of the state recovery will decrease. + // the value is too small, the efficiency of the state recovery will decrease. storageCheckRange = 1024 // errMissingTrie is returned if the target trie is missing while the generation @@ -560,6 +560,12 @@ func (dl *diskLayer) generate(stats *generatorStats) { default: } if batch.ValueSize() > ethdb.IdealBatchSize || abort != nil { + if bytes.Compare(currentLocation, dl.genMarker) < 0 { + log.Error("Snapshot generator went backwards", + "currentLocation", fmt.Sprintf("%x", currentLocation), + "genMarker", fmt.Sprintf("%x", dl.genMarker)) + } + // Flush out the batch anyway no matter it's empty or not. // It's possible that all the states are recovered and the // generation indeed makes progress. @@ -634,8 +640,14 @@ func (dl *diskLayer) generate(stats *generatorStats) { stats.storage += common.StorageSize(1 + common.HashLength + dataLen) stats.accounts++ } + marker := accountHash[:] + // If the snap generation goes here after interrupted, genMarker may go backward + // when last genMarker is consisted of accountHash and storageHash + if accMarker != nil && bytes.Equal(marker, accMarker) && len(dl.genMarker) > common.HashLength { + marker = dl.genMarker[:] + } // If we've exceeded our batch allowance or termination was requested, flush to disk - if err := checkAndFlush(accountHash[:]); err != nil { + if err := checkAndFlush(marker); err != nil { return err } // If the iterated account is the contract, create a further loop to diff --git a/core/state/snapshot/wipe.go b/core/state/snapshot/wipe.go index 2cab57393b..b774c37a4b 100644 --- a/core/state/snapshot/wipe.go +++ b/core/state/snapshot/wipe.go @@ -21,67 +21,11 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" ) -// wipeSnapshot starts a goroutine to iterate over the entire key-value database -// and delete all the data associated with the snapshot (accounts, storage, -// metadata). After all is done, the snapshot range of the database is compacted -// to free up unused data blocks. -func wipeSnapshot(db ethdb.KeyValueStore, full bool) chan struct{} { - // Wipe the snapshot root marker synchronously - if full { - rawdb.DeleteSnapshotRoot(db) - } - // Wipe everything else asynchronously - wiper := make(chan struct{}, 1) - go func() { - if err := wipeContent(db); err != nil { - log.Error("Failed to wipe state snapshot", "err", err) // Database close will trigger this - return - } - close(wiper) - }() - return wiper -} - -// wipeContent iterates over the entire key-value database and deletes all the -// data associated with the snapshot (accounts, storage), but not the root hash -// as the wiper is meant to run on a background thread but the root needs to be -// removed in sync to avoid data races. After all is done, the snapshot range of -// the database is compacted to free up unused data blocks. -func wipeContent(db ethdb.KeyValueStore) error { - if err := wipeKeyRange(db, "accounts", rawdb.SnapshotAccountPrefix, nil, nil, len(rawdb.SnapshotAccountPrefix)+common.HashLength, snapWipedAccountMeter, true); err != nil { - return err - } - if err := wipeKeyRange(db, "storage", rawdb.SnapshotStoragePrefix, nil, nil, len(rawdb.SnapshotStoragePrefix)+2*common.HashLength, snapWipedStorageMeter, true); err != nil { - return err - } - // Compact the snapshot section of the database to get rid of unused space - start := time.Now() - - log.Info("Compacting snapshot account area ") - end := common.CopyBytes(rawdb.SnapshotAccountPrefix) - end[len(end)-1]++ - - if err := db.Compact(rawdb.SnapshotAccountPrefix, end); err != nil { - return err - } - log.Info("Compacting snapshot storage area ") - end = common.CopyBytes(rawdb.SnapshotStoragePrefix) - end[len(end)-1]++ - - if err := db.Compact(rawdb.SnapshotStoragePrefix, end); err != nil { - return err - } - log.Info("Compacted snapshot area in database", "elapsed", common.PrettyDuration(time.Since(start))) - - return nil -} - // wipeKeyRange deletes a range of keys from the database starting with prefix // and having a specific total key length. The start and limit is optional for // specifying a particular key range for deletion. diff --git a/core/state/snapshot/wipe_test.go b/core/state/snapshot/wipe_test.go index 2c45652a96..c5b3401365 100644 --- a/core/state/snapshot/wipe_test.go +++ b/core/state/snapshot/wipe_test.go @@ -30,95 +30,50 @@ import ( func TestWipe(t *testing.T) { // Create a database with some random snapshot data db := memorydb.New() - for i := 0; i < 128; i++ { - account := randomHash() - rawdb.WriteAccountSnapshot(db, account, randomHash().Bytes()) - for j := 0; j < 1024; j++ { - rawdb.WriteStorageSnapshot(db, account, randomHash(), randomHash().Bytes()) - } + rawdb.WriteAccountSnapshot(db, randomHash(), randomHash().Bytes()) } - rawdb.WriteSnapshotRoot(db, randomHash()) - // Add some random non-snapshot data too to make wiping harder - for i := 0; i < 65536; i++ { - // Generate a key that's the wrong length for a state snapshot item - var keysize int - for keysize == 0 || keysize == 32 || keysize == 64 { - keysize = 8 + rand.Intn(64) // +8 to ensure we will "never" randomize duplicates - } - // Randomize the suffix, dedup and inject it under the snapshot namespace - keysuffix := make([]byte, keysize) + for i := 0; i < 500; i++ { + // Generate keys with wrong length for a state snapshot item + keysuffix := make([]byte, 31) rand.Read(keysuffix) - - if rand.Int31n(2) == 0 { - db.Put(append(rawdb.SnapshotAccountPrefix, keysuffix...), randomHash().Bytes()) - } else { - db.Put(append(rawdb.SnapshotStoragePrefix, keysuffix...), randomHash().Bytes()) - } + db.Put(append(rawdb.SnapshotAccountPrefix, keysuffix...), randomHash().Bytes()) + keysuffix = make([]byte, 33) + rand.Read(keysuffix) + db.Put(append(rawdb.SnapshotAccountPrefix, keysuffix...), randomHash().Bytes()) } - // Sanity check that all the keys are present - var items int - - it := db.NewIterator(rawdb.SnapshotAccountPrefix, nil) - defer it.Release() - - for it.Next() { - key := it.Key() - if len(key) == len(rawdb.SnapshotAccountPrefix)+common.HashLength { - items++ + count := func() (items int) { + it := db.NewIterator(rawdb.SnapshotAccountPrefix, nil) + defer it.Release() + for it.Next() { + if len(it.Key()) == len(rawdb.SnapshotAccountPrefix)+common.HashLength { + items++ + } } + return items } - it = db.NewIterator(rawdb.SnapshotStoragePrefix, nil) - defer it.Release() - - for it.Next() { - key := it.Key() - if len(key) == len(rawdb.SnapshotStoragePrefix)+2*common.HashLength { - items++ - } - } - if items != 128+128*1024 { - t.Fatalf("snapshot size mismatch: have %d, want %d", items, 128+128*1024) + // Sanity check that all the keys are present + if items := count(); items != 128 { + t.Fatalf("snapshot size mismatch: have %d, want %d", items, 128) } - if hash := rawdb.ReadSnapshotRoot(db); hash == (common.Hash{}) { - t.Errorf("snapshot block marker mismatch: have %#x, want ", hash) + // Wipe the accounts + if err := wipeKeyRange(db, "accounts", rawdb.SnapshotAccountPrefix, nil, nil, + len(rawdb.SnapshotAccountPrefix)+common.HashLength, snapWipedAccountMeter, true); err != nil { + t.Fatal(err) } - // Wipe all snapshot entries from the database - <-wipeSnapshot(db, true) - // Iterate over the database end ensure no snapshot information remains - it = db.NewIterator(rawdb.SnapshotAccountPrefix, nil) - defer it.Release() - - for it.Next() { - key := it.Key() - if len(key) == len(rawdb.SnapshotAccountPrefix)+common.HashLength { - t.Errorf("snapshot entry remained after wipe: %x", key) - } - } - it = db.NewIterator(rawdb.SnapshotStoragePrefix, nil) - defer it.Release() - - for it.Next() { - key := it.Key() - if len(key) == len(rawdb.SnapshotStoragePrefix)+2*common.HashLength { - t.Errorf("snapshot entry remained after wipe: %x", key) - } - } - if hash := rawdb.ReadSnapshotRoot(db); hash != (common.Hash{}) { - t.Errorf("snapshot block marker remained after wipe: %#x", hash) + if items := count(); items != 0 { + t.Fatalf("snapshot size mismatch: have %d, want %d", items, 0) } // Iterate over the database and ensure miscellaneous items are present - items = 0 - - it = db.NewIterator(nil, nil) + items := 0 + it := db.NewIterator(nil, nil) defer it.Release() - for it.Next() { items++ } - if items != 65536 { - t.Fatalf("misc item count mismatch: have %d, want %d", items, 65536) + if items != 1000 { + t.Fatalf("misc item count mismatch: have %d, want %d", items, 1000) } } diff --git a/core/state/sync.go b/core/state/sync.go index 734961d9c5..cc7d01a218 100644 --- a/core/state/sync.go +++ b/core/state/sync.go @@ -27,7 +27,7 @@ import ( ) // NewStateSync create a new state trie download scheduler. -func NewStateSync(root common.Hash, database ethdb.KeyValueReader, bloom *trie.SyncBloom, onLeaf func(paths [][]byte, leaf []byte) error) *trie.Sync { +func NewStateSync(root common.Hash, database ethdb.KeyValueReader, onLeaf func(paths [][]byte, leaf []byte) error) *trie.Sync { // Register the storage slot callback if the external callback is specified. var onSlot func(paths [][]byte, hexpath []byte, leaf []byte, parent common.Hash) error if onLeaf != nil { @@ -52,6 +52,6 @@ func NewStateSync(root common.Hash, database ethdb.KeyValueReader, bloom *trie.S syncer.AddCodeEntry(common.BytesToHash(obj.CodeHash), hexpath, parent) return nil } - syncer = trie.NewSync(root, database, onAccount, bloom) + syncer = trie.NewSync(root, database, onAccount) return syncer } diff --git a/core/state/sync_test.go b/core/state/sync_test.go index beb8fcfd9c..007590c76d 100644 --- a/core/state/sync_test.go +++ b/core/state/sync_test.go @@ -26,7 +26,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/ethdb/memorydb" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" ) @@ -134,7 +133,7 @@ func checkStateConsistency(db ethdb.Database, root common.Hash) error { // Tests that an empty state is not scheduled for syncing. func TestEmptyStateSync(t *testing.T) { empty := common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") - sync := NewStateSync(empty, rawdb.NewMemoryDatabase(), trie.NewSyncBloom(1, memorydb.New()), nil) + sync := NewStateSync(empty, rawdb.NewMemoryDatabase(), nil) if nodes, paths, codes := sync.Missing(1); len(nodes) != 0 || len(paths) != 0 || len(codes) != 0 { t.Errorf(" content requested for empty state: %v, %v, %v", nodes, paths, codes) } @@ -171,7 +170,7 @@ func testIterativeStateSync(t *testing.T, count int, commit bool, bypath bool) { // Create a destination state and sync with the scheduler dstDb := rawdb.NewMemoryDatabase() - sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb), nil) + sched := NewStateSync(srcRoot, dstDb, nil) nodes, paths, codes := sched.Missing(count) var ( @@ -250,7 +249,7 @@ func TestIterativeDelayedStateSync(t *testing.T) { // Create a destination state and sync with the scheduler dstDb := rawdb.NewMemoryDatabase() - sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb), nil) + sched := NewStateSync(srcRoot, dstDb, nil) nodes, _, codes := sched.Missing(0) queue := append(append([]common.Hash{}, nodes...), codes...) @@ -298,7 +297,7 @@ func testIterativeRandomStateSync(t *testing.T, count int) { // Create a destination state and sync with the scheduler dstDb := rawdb.NewMemoryDatabase() - sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb), nil) + sched := NewStateSync(srcRoot, dstDb, nil) queue := make(map[common.Hash]struct{}) nodes, _, codes := sched.Missing(count) @@ -348,7 +347,7 @@ func TestIterativeRandomDelayedStateSync(t *testing.T) { // Create a destination state and sync with the scheduler dstDb := rawdb.NewMemoryDatabase() - sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb), nil) + sched := NewStateSync(srcRoot, dstDb, nil) queue := make(map[common.Hash]struct{}) nodes, _, codes := sched.Missing(0) @@ -415,7 +414,7 @@ func TestIncompleteStateSync(t *testing.T) { // Create a destination state and sync with the scheduler dstDb := rawdb.NewMemoryDatabase() - sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb), nil) + sched := NewStateSync(srcRoot, dstDb, nil) var added []common.Hash diff --git a/core/state_processor_test.go b/core/state_processor_test.go index 13a9eb810d..aa8e4bebf9 100644 --- a/core/state_processor_test.go +++ b/core/state_processor_test.go @@ -17,10 +17,12 @@ package core import ( + "crypto/ecdsa" "math/big" "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/consensus/misc" @@ -54,11 +56,12 @@ func TestStateProcessorErrors(t *testing.T) { LondonBlock: big.NewInt(0), Ethash: new(params.EthashConfig), } - signer = types.LatestSigner(config) - testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + signer = types.LatestSigner(config) + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + key2, _ = crypto.HexToECDSA("0202020202020202020202020202020202020202020202020202002020202020") ) - var makeTx = func(nonce uint64, to common.Address, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte) *types.Transaction { - tx, _ := types.SignTx(types.NewTransaction(nonce, to, amount, gasLimit, gasPrice, data), signer, testKey) + var makeTx = func(key *ecdsa.PrivateKey, nonce uint64, to common.Address, amount *big.Int, gasLimit uint64, gasPrice *big.Int, data []byte) *types.Transaction { + tx, _ := types.SignTx(types.NewTransaction(nonce, to, amount, gasLimit, gasPrice, data), signer, key) return tx } var mkDynamicTx = func(nonce uint64, to common.Address, gasLimit uint64, gasTipCap, gasFeeCap *big.Int) *types.Transaction { @@ -69,7 +72,7 @@ func TestStateProcessorErrors(t *testing.T) { Gas: gasLimit, To: &to, Value: big.NewInt(0), - }), signer, testKey) + }), signer, key1) return tx } { // Tests against a 'recent' chain definition @@ -82,6 +85,10 @@ func TestStateProcessorErrors(t *testing.T) { Balance: big.NewInt(1000000000000000000), // 1 ether Nonce: 0, }, + common.HexToAddress("0xfd0810DD14796680f72adf1a371963d0745BCc64"): GenesisAccount{ + Balance: big.NewInt(1000000000000000000), // 1 ether + Nonce: math.MaxUint64, + }, }, } genesis = gspec.MustCommit(db) @@ -97,32 +104,38 @@ func TestStateProcessorErrors(t *testing.T) { }{ { // ErrNonceTooLow txs: []*types.Transaction{ - makeTx(0, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(875000000), nil), - makeTx(0, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(875000000), nil), + makeTx(key1, 0, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(875000000), nil), + makeTx(key1, 0, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(875000000), nil), }, want: "could not apply tx 1 [0x0026256b3939ed97e2c4a6f3fce8ecf83bdcfa6d507c47838c308a1fb0436f62]: nonce too low: address 0x71562b71999873DB5b286dF957af199Ec94617F7, tx: 0 state: 1", }, { // ErrNonceTooHigh txs: []*types.Transaction{ - makeTx(100, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(875000000), nil), + makeTx(key1, 100, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(875000000), nil), }, want: "could not apply tx 0 [0xdebad714ca7f363bd0d8121c4518ad48fa469ca81b0a081be3d10c17460f751b]: nonce too high: address 0x71562b71999873DB5b286dF957af199Ec94617F7, tx: 100 state: 0", }, + { // ErrNonceMax + txs: []*types.Transaction{ + makeTx(key2, math.MaxUint64, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(875000000), nil), + }, + want: "could not apply tx 0 [0x84ea18d60eb2bb3b040e3add0eb72f757727122cc257dd858c67cb6591a85986]: nonce has max value: address 0xfd0810DD14796680f72adf1a371963d0745BCc64, nonce: 18446744073709551615", + }, { // ErrGasLimitReached txs: []*types.Transaction{ - makeTx(0, common.Address{}, big.NewInt(0), 21000000, big.NewInt(875000000), nil), + makeTx(key1, 0, common.Address{}, big.NewInt(0), 21000000, big.NewInt(875000000), nil), }, want: "could not apply tx 0 [0xbd49d8dadfd47fb846986695f7d4da3f7b2c48c8da82dbc211a26eb124883de9]: gas limit reached", }, { // ErrInsufficientFundsForTransfer txs: []*types.Transaction{ - makeTx(0, common.Address{}, big.NewInt(1000000000000000000), params.TxGas, big.NewInt(875000000), nil), + makeTx(key1, 0, common.Address{}, big.NewInt(1000000000000000000), params.TxGas, big.NewInt(875000000), nil), }, want: "could not apply tx 0 [0x98c796b470f7fcab40aaef5c965a602b0238e1034cce6fb73823042dd0638d74]: insufficient funds for gas * price + value: address 0x71562b71999873DB5b286dF957af199Ec94617F7 have 1000000000000000000 want 1000018375000000000", }, { // ErrInsufficientFunds txs: []*types.Transaction{ - makeTx(0, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(900000000000000000), nil), + makeTx(key1, 0, common.Address{}, big.NewInt(0), params.TxGas, big.NewInt(900000000000000000), nil), }, want: "could not apply tx 0 [0x4a69690c4b0cd85e64d0d9ea06302455b01e10a83db964d60281739752003440]: insufficient funds for gas * price + value: address 0x71562b71999873DB5b286dF957af199Ec94617F7 have 1000000000000000000 want 18900000000000000000000", }, @@ -132,13 +145,13 @@ func TestStateProcessorErrors(t *testing.T) { // multiplication len(data) +gas_per_byte overflows uint64. Not testable at the moment { // ErrIntrinsicGas txs: []*types.Transaction{ - makeTx(0, common.Address{}, big.NewInt(0), params.TxGas-1000, big.NewInt(875000000), nil), + makeTx(key1, 0, common.Address{}, big.NewInt(0), params.TxGas-1000, big.NewInt(875000000), nil), }, want: "could not apply tx 0 [0xcf3b049a0b516cb4f9274b3e2a264359e2ba53b2fb64b7bda2c634d5c9d01fca]: intrinsic gas too low: have 20000, want 21000", }, { // ErrGasLimitReached txs: []*types.Transaction{ - makeTx(0, common.Address{}, big.NewInt(0), params.TxGas*1000, big.NewInt(875000000), nil), + makeTx(key1, 0, common.Address{}, big.NewInt(0), params.TxGas*1000, big.NewInt(875000000), nil), }, want: "could not apply tx 0 [0xbd49d8dadfd47fb846986695f7d4da3f7b2c48c8da82dbc211a26eb124883de9]: gas limit reached", }, diff --git a/core/state_transition.go b/core/state_transition.go index f650922f2f..81c56fb42f 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -222,6 +222,9 @@ func (st *StateTransition) preCheck() error { } else if stNonce > msgNonce { return fmt.Errorf("%w: address %v, tx: %d state: %d", ErrNonceTooLow, st.msg.From().Hex(), msgNonce, stNonce) + } else if stNonce+1 < stNonce { + return fmt.Errorf("%w: address %v, nonce: %d", ErrNonceMax, + st.msg.From().Hex(), stNonce) } // Make sure the sender is an EOA if codeHash := st.state.GetCodeHash(st.msg.From()); codeHash != emptyCodeHash && codeHash != (common.Hash{}) { diff --git a/core/tx_list.go b/core/tx_list.go index ea96f3ebbd..f141a03bbd 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -295,9 +295,9 @@ func (l *txList) Add(tx *types.Transaction, priceBump uint64) (bool, *types.Tran thresholdFeeCap := aFeeCap.Div(aFeeCap, b) thresholdTip := aTip.Div(aTip, b) - // Have to ensure that either the new fee cap or tip is higher than the + // We have to ensure that both the new fee cap and tip are higher than the // old ones as well as checking the percentage threshold to ensure that - // this is accurate for low (Wei-level) gas price replacements + // this is accurate for low (Wei-level) gas price replacements. if tx.GasFeeCapIntCmp(thresholdFeeCap) < 0 || tx.GasTipCapIntCmp(thresholdTip) < 0 { return false, nil } diff --git a/core/tx_list_test.go b/core/tx_list_test.go index 3a5842d2e8..ef49cae1dd 100644 --- a/core/tx_list_test.go +++ b/core/tx_list_test.go @@ -51,7 +51,7 @@ func TestStrictTxListAdd(t *testing.T) { } } -func BenchmarkTxListAdd(t *testing.B) { +func BenchmarkTxListAdd(b *testing.B) { // Generate a list of transactions to insert key, _ := crypto.GenerateKey() @@ -60,11 +60,13 @@ func BenchmarkTxListAdd(t *testing.B) { txs[i] = transaction(uint64(i), 0, key) } // Insert the transactions in a random order - list := newTxList(true) priceLimit := big.NewInt(int64(DefaultTxPoolConfig.PriceLimit)) - t.ResetTimer() - for _, v := range rand.Perm(len(txs)) { - list.Add(txs[v], DefaultTxPoolConfig.PriceBump) - list.Filter(priceLimit, DefaultTxPoolConfig.PriceBump) + b.ResetTimer() + for i := 0; i < b.N; i++ { + list := newTxList(true) + for _, v := range rand.Perm(len(txs)) { + list.Add(txs[v], DefaultTxPoolConfig.PriceBump) + list.Filter(priceLimit, DefaultTxPoolConfig.PriceBump) + } } } diff --git a/core/tx_noncer.go b/core/tx_noncer.go index aa87c643ae..d6d2200775 100644 --- a/core/tx_noncer.go +++ b/core/tx_noncer.go @@ -77,3 +77,11 @@ func (txn *txNoncer) setIfLower(addr common.Address, nonce uint64) { } txn.nonces[addr] = nonce } + +// setAll sets the nonces for all accounts to the given map. +func (txn *txNoncer) setAll(all map[common.Address]uint64) { + txn.lock.Lock() + defer txn.lock.Unlock() + + txn.nonces = all +} diff --git a/core/tx_pool.go b/core/tx_pool.go index 4b2beba206..91d221ded0 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -1188,16 +1188,18 @@ func (pool *TxPool) runReorg(done chan struct{}, reset *txpoolResetRequest, dirt pool.priced.Reheap() } } + // Update all accounts to the latest known pending nonce + nonces := make(map[common.Address]uint64, len(pool.pending)) + for addr, list := range pool.pending { + highestPending := list.LastElement() + nonces[addr] = highestPending.Nonce() + 1 + } + pool.pendingNonces.setAll(nonces) } // Ensure pool.queue and pool.pending sizes stay within the configured limits. pool.truncatePending() pool.truncateQueue() - // Update all accounts to the latest known pending nonce - for addr, list := range pool.pending { - highestPending := list.LastElement() - pool.pendingNonces.set(addr, highestPending.Nonce()+1) - } dropBetweenReorgHistogram.Update(int64(pool.changesSinceReorg)) pool.changesSinceReorg = 0 // Reset change counter pool.mu.Unlock() diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 1406c8df02..a7af275835 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -2540,3 +2540,24 @@ func BenchmarkInsertRemoteWithAllLocals(b *testing.B) { pool.Stop() } } + +// Benchmarks the speed of batch transaction insertion in case of multiple accounts. +func BenchmarkPoolMultiAccountBatchInsert(b *testing.B) { + // Generate a batch of transactions to enqueue into the pool + pool, _ := setupTxPool() + defer pool.Stop() + b.ReportAllocs() + batches := make(types.Transactions, b.N) + for i := 0; i < b.N; i++ { + key, _ := crypto.GenerateKey() + account := crypto.PubkeyToAddress(key.PublicKey) + pool.currentState.AddBalance(account, big.NewInt(1000000)) + tx := transaction(uint64(0), 100000, key) + batches[i] = tx + } + // Benchmark importing the transactions into the queue + b.ResetTimer() + for _, tx := range batches { + pool.AddRemotesSync([]*types.Transaction{tx}) + } +} diff --git a/core/types/block.go b/core/types/block.go index 360f1eb47c..f38c55c1ff 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -85,6 +85,12 @@ type Header struct { // BaseFee was added by EIP-1559 and is ignored in legacy headers. BaseFee *big.Int `json:"baseFeePerGas" rlp:"optional"` + + /* + TODO (MariusVanDerWijden) Add this field once needed + // Random was added during the merge and contains the BeaconState randomness + Random common.Hash `json:"random" rlp:"optional"` + */ } // field type overrides for gencodec @@ -383,3 +389,21 @@ func (b *Block) Hash() common.Hash { } type Blocks []*Block + +// HeaderParentHashFromRLP returns the parentHash of an RLP-encoded +// header. If 'header' is invalid, the zero hash is returned. +func HeaderParentHashFromRLP(header []byte) common.Hash { + // parentHash is the first list element. + listContent, _, err := rlp.SplitList(header) + if err != nil { + return common.Hash{} + } + parentHash, _, err := rlp.SplitString(listContent) + if err != nil { + return common.Hash{} + } + if len(parentHash) != 32 { + return common.Hash{} + } + return common.BytesToHash(parentHash) +} diff --git a/core/types/block_test.go b/core/types/block_test.go index 0b9a4def8d..5cdea3fc06 100644 --- a/core/types/block_test.go +++ b/core/types/block_test.go @@ -281,3 +281,64 @@ func makeBenchBlock() *Block { } return NewBlock(header, txs, uncles, receipts, newHasher()) } + +func TestRlpDecodeParentHash(t *testing.T) { + // A minimum one + want := common.HexToHash("0x112233445566778899001122334455667788990011223344556677889900aabb") + if rlpData, err := rlp.EncodeToBytes(Header{ParentHash: want}); err != nil { + t.Fatal(err) + } else { + if have := HeaderParentHashFromRLP(rlpData); have != want { + t.Fatalf("have %x, want %x", have, want) + } + } + // And a maximum one + // | Difficulty | dynamic| *big.Int | 0x5ad3c2c71bbff854908 (current mainnet TD: 76 bits) | + // | Number | dynamic| *big.Int | 64 bits | + // | Extra | dynamic| []byte | 65+32 byte (clique) | + // | BaseFee | dynamic| *big.Int | 64 bits | + mainnetTd := new(big.Int) + mainnetTd.SetString("5ad3c2c71bbff854908", 16) + if rlpData, err := rlp.EncodeToBytes(Header{ + ParentHash: want, + Difficulty: mainnetTd, + Number: new(big.Int).SetUint64(math.MaxUint64), + Extra: make([]byte, 65+32), + BaseFee: new(big.Int).SetUint64(math.MaxUint64), + }); err != nil { + t.Fatal(err) + } else { + if have := HeaderParentHashFromRLP(rlpData); have != want { + t.Fatalf("have %x, want %x", have, want) + } + } + // Also test a very very large header. + { + // The rlp-encoding of the heder belowCauses _total_ length of 65540, + // which is the first to blow the fast-path. + h := Header{ + ParentHash: want, + Extra: make([]byte, 65041), + } + if rlpData, err := rlp.EncodeToBytes(h); err != nil { + t.Fatal(err) + } else { + if have := HeaderParentHashFromRLP(rlpData); have != want { + t.Fatalf("have %x, want %x", have, want) + } + } + } + { + // Test some invalid erroneous stuff + for i, rlpData := range [][]byte{ + nil, + common.FromHex("0x"), + common.FromHex("0x01"), + common.FromHex("0x3031323334"), + } { + if have, want := HeaderParentHashFromRLP(rlpData), (common.Hash{}); have != want { + t.Fatalf("invalid %d: have %x, want %x", i, have, want) + } + } + } +} diff --git a/core/types/dynamic_fee_tx.go b/core/types/dynamic_fee_tx.go index 585c029d89..53f246ea1f 100644 --- a/core/types/dynamic_fee_tx.go +++ b/core/types/dynamic_fee_tx.go @@ -25,8 +25,8 @@ import ( type DynamicFeeTx struct { ChainID *big.Int Nonce uint64 - GasTipCap *big.Int - GasFeeCap *big.Int + GasTipCap *big.Int // a.k.a. maxPriorityFeePerGas + GasFeeCap *big.Int // a.k.a. maxFeePerGas Gas uint64 To *common.Address `rlp:"nil"` // nil means contract creation Value *big.Int diff --git a/core/vm/analysis.go b/core/vm/analysis.go index 449cded2a8..3733bab6a7 100644 --- a/core/vm/analysis.go +++ b/core/vm/analysis.go @@ -17,12 +17,12 @@ package vm const ( - set2BitsMask = uint16(0b1100_0000_0000_0000) - set3BitsMask = uint16(0b1110_0000_0000_0000) - set4BitsMask = uint16(0b1111_0000_0000_0000) - set5BitsMask = uint16(0b1111_1000_0000_0000) - set6BitsMask = uint16(0b1111_1100_0000_0000) - set7BitsMask = uint16(0b1111_1110_0000_0000) + set2BitsMask = uint16(0b11) + set3BitsMask = uint16(0b111) + set4BitsMask = uint16(0b1111) + set5BitsMask = uint16(0b1_1111) + set6BitsMask = uint16(0b11_1111) + set7BitsMask = uint16(0b111_1111) ) // bitvec is a bit vector which maps bytes in a program. @@ -30,32 +30,26 @@ const ( // it's data (i.e. argument of PUSHxx). type bitvec []byte -var lookup = [8]byte{ - 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1, -} - func (bits bitvec) set1(pos uint64) { - bits[pos/8] |= lookup[pos%8] + bits[pos/8] |= 1 << (pos % 8) } func (bits bitvec) setN(flag uint16, pos uint64) { - a := flag >> (pos % 8) - bits[pos/8] |= byte(a >> 8) - if b := byte(a); b != 0 { - // If the bit-setting affects the neighbouring byte, we can assign - no need to OR it, - // since it's the first write to that byte + a := flag << (pos % 8) + bits[pos/8] |= byte(a) + if b := byte(a >> 8); b != 0 { bits[pos/8+1] = b } } func (bits bitvec) set8(pos uint64) { - a := byte(0xFF >> (pos % 8)) + a := byte(0xFF << (pos % 8)) bits[pos/8] |= a bits[pos/8+1] = ^a } func (bits bitvec) set16(pos uint64) { - a := byte(0xFF >> (pos % 8)) + a := byte(0xFF << (pos % 8)) bits[pos/8] |= a bits[pos/8+1] = 0xFF bits[pos/8+2] = ^a @@ -63,7 +57,7 @@ func (bits bitvec) set16(pos uint64) { // codeSegment checks if the position is in a code segment. func (bits *bitvec) codeSegment(pos uint64) bool { - return ((*bits)[pos/8] & (0x80 >> (pos % 8))) == 0 + return (((*bits)[pos/8] >> (pos % 8)) & 1) == 0 } // codeBitmap collects data locations in code. diff --git a/core/vm/analysis_test.go b/core/vm/analysis_test.go index d7f21e04aa..398861f8ae 100644 --- a/core/vm/analysis_test.go +++ b/core/vm/analysis_test.go @@ -17,6 +17,7 @@ package vm import ( + "math/bits" "testing" "github.com/ethereum/go-ethereum/crypto" @@ -28,24 +29,27 @@ func TestJumpDestAnalysis(t *testing.T) { exp byte which int }{ - {[]byte{byte(PUSH1), 0x01, 0x01, 0x01}, 0x40, 0}, - {[]byte{byte(PUSH1), byte(PUSH1), byte(PUSH1), byte(PUSH1)}, 0x50, 0}, - {[]byte{byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), 0x01, 0x01, 0x01}, 0x7F, 0}, - {[]byte{byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 1}, - {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), byte(PUSH2), byte(PUSH2), 0x01, 0x01, 0x01}, 0x03, 0}, - {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1}, - {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x74, 0}, - {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1}, - {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x3F, 0}, - {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xC0, 1}, - {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x7F, 0}, - {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xFF, 1}, - {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 2}, - {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0x7f, 0}, - {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0xA0, 1}, - {[]byte{byte(PUSH32)}, 0x7F, 0}, - {[]byte{byte(PUSH32)}, 0xFF, 1}, - {[]byte{byte(PUSH32)}, 0xFF, 2}, + {[]byte{byte(PUSH1), 0x01, 0x01, 0x01}, 0b0000_0010, 0}, + {[]byte{byte(PUSH1), byte(PUSH1), byte(PUSH1), byte(PUSH1)}, 0b0000_1010, 0}, + {[]byte{0x00, byte(PUSH1), 0x00, byte(PUSH1), 0x00, byte(PUSH1), 0x00, byte(PUSH1)}, 0b0101_0100, 0}, + {[]byte{byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), 0x01, 0x01, 0x01}, bits.Reverse8(0x7F), 0}, + {[]byte{byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0001, 1}, + {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), byte(PUSH2), byte(PUSH2), 0x01, 0x01, 0x01}, 0b1100_0000, 0}, + {[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0000, 1}, + {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0010_1110, 0}, + {[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0000, 1}, + {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b1111_1100, 0}, + {[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0011, 1}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b1111_1110, 0}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b1111_1111, 1}, + {[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0b0000_0001, 2}, + {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0b1111_1110, 0}, + {[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0b0000_0101, 1}, + {[]byte{byte(PUSH32)}, 0b1111_1110, 0}, + {[]byte{byte(PUSH32)}, 0b1111_1111, 1}, + {[]byte{byte(PUSH32)}, 0b1111_1111, 2}, + {[]byte{byte(PUSH32)}, 0b1111_1111, 3}, + {[]byte{byte(PUSH32)}, 0b0000_0001, 4}, } for i, test := range tests { ret := codeBitmap(test.code) diff --git a/core/vm/contract.go b/core/vm/contract.go index 61dbd5007a..bb0902969e 100644 --- a/core/vm/contract.go +++ b/core/vm/contract.go @@ -143,16 +143,11 @@ func (c *Contract) AsDelegate() *Contract { // GetOp returns the n'th element in the contract's byte array func (c *Contract) GetOp(n uint64) OpCode { - return OpCode(c.GetByte(n)) -} - -// GetByte returns the n'th byte in the contract's byte array -func (c *Contract) GetByte(n uint64) byte { if n < uint64(len(c.Code)) { - return c.Code[n] + return OpCode(c.Code[n]) } - return 0 + return STOP } // Caller returns the caller of the contract. diff --git a/core/vm/errors.go b/core/vm/errors.go index c7cfeae53c..004f8ef1c8 100644 --- a/core/vm/errors.go +++ b/core/vm/errors.go @@ -35,6 +35,11 @@ var ( ErrReturnDataOutOfBounds = errors.New("return data out of bounds") ErrGasUintOverflow = errors.New("gas uint64 overflow") ErrInvalidCode = errors.New("invalid code: must not begin with 0xef") + ErrNonceUintOverflow = errors.New("nonce uint64 overflow") + + // errStopToken is an internal token indicating interpreter loop termination, + // never returned to outside callers. + errStopToken = errors.New("stop token") ) // ErrStackUnderflow wraps an evm error when the items on the stack less diff --git a/core/vm/evm.go b/core/vm/evm.go index 3b4bd69d75..2c7880b3bf 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -165,9 +165,6 @@ func (evm *EVM) Interpreter() *EVMInterpreter { // the necessary steps to create accounts and reverses the state in case of an // execution error or failed value transfer. func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) { - if evm.Config.NoRecursion && evm.depth > 0 { - return nil, gas, nil - } // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth @@ -182,9 +179,14 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas if !evm.StateDB.Exist(addr) { if !isPrecompile && evm.chainRules.IsEIP158 && value.Sign() == 0 { // Calling a non existing account, don't do anything, but ping the tracer - if evm.Config.Debug && evm.depth == 0 { - evm.Config.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value) - evm.Config.Tracer.CaptureEnd(ret, 0, 0, nil) + if evm.Config.Debug { + if evm.depth == 0 { + evm.Config.Tracer.CaptureStart(evm, caller.Address(), addr, false, input, gas, value) + evm.Config.Tracer.CaptureEnd(ret, 0, 0, nil) + } else { + evm.Config.Tracer.CaptureEnter(CALL, caller.Address(), addr, input, gas, value) + evm.Config.Tracer.CaptureExit(ret, 0, nil) + } } return nil, gas, nil } @@ -249,9 +251,6 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas // CallCode differs from Call in the sense that it executes the given address' // code with the caller as context. func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error) { - if evm.Config.NoRecursion && evm.depth > 0 { - return nil, gas, nil - } // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth @@ -300,9 +299,6 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, // DelegateCall differs from CallCode in the sense that it executes the given address' // code with the caller as context and the caller is set to the caller of the caller. func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { - if evm.Config.NoRecursion && evm.depth > 0 { - return nil, gas, nil - } // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth @@ -342,9 +338,6 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by // Opcodes that attempt to perform such modifications will result in exceptions // instead of performing the modifications. func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { - if evm.Config.NoRecursion && evm.depth > 0 { - return nil, gas, nil - } // Fail if we're trying to execute above the call depth limit if evm.depth > int(params.CallCreateDepth) { return nil, gas, ErrDepth @@ -419,6 +412,9 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, return nil, common.Address{}, gas, ErrInsufficientBalance } nonce := evm.StateDB.GetNonce(caller.Address()) + if nonce+1 < nonce { + return nil, common.Address{}, gas, ErrNonceUintOverflow + } evm.StateDB.SetNonce(caller.Address(), nonce+1) // We add this to the access list _before_ taking a snapshot. Even if the creation fails, // the access-list change should not be rolled back @@ -443,10 +439,6 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, contract := NewContract(caller, AccountRef(address), value, gas) contract.SetCodeOptionalHash(&address, codeAndHash) - if evm.Config.NoRecursion && evm.depth > 0 { - return nil, address, gas, nil - } - if evm.Config.Debug { if evm.depth == 0 { evm.Config.Tracer.CaptureStart(evm, caller.Address(), address, true, codeAndHash.code, gas, value) @@ -510,7 +502,7 @@ func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *big.I // Create2 creates a new contract using code as deployment code. // -// The different between Create2 with Create is Create2 uses sha3(0xff ++ msg.sender ++ salt ++ sha3(init_code))[12:] +// The different between Create2 with Create is Create2 uses keccak256(0xff ++ msg.sender ++ salt ++ keccak256(init_code))[12:] // instead of the usual sender-and-nonce-hash as the address where the contract is initialized at. func (evm *EVM) Create2(caller ContractRef, code []byte, gas uint64, endowment *big.Int, salt *uint256.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { codeAndHash := &codeAndHash{code: code} diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index 19d2198af6..4c2cb3e5cf 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -247,7 +247,7 @@ func makeGasLog(n uint64) gasFunc { } } -func gasSha3(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { +func gasKeccak256(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err @@ -256,7 +256,7 @@ func gasSha3(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize if overflow { return 0, ErrGasUintOverflow } - if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Sha3WordGas); overflow { + if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Keccak256WordGas); overflow { return 0, ErrGasUintOverflow } if gas, overflow = math.SafeAdd(gas, wordGas); overflow { @@ -290,7 +290,7 @@ func gasCreate2(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memoryS if overflow { return 0, ErrGasUintOverflow } - if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Sha3WordGas); overflow { + if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Keccak256WordGas); overflow { return 0, ErrGasUintOverflow } if gas, overflow = math.SafeAdd(gas, wordGas); overflow { diff --git a/core/vm/instructions.go b/core/vm/instructions.go index bda480f083..4eda3bf531 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -17,6 +17,8 @@ package vm import ( + "sync/atomic" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" @@ -231,7 +233,7 @@ func opSAR(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte return nil, nil } -func opSha3(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { +func opKeccak256(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { offset, size := scope.Stack.pop(), scope.Stack.peek() data := scope.Memory.GetPtr(int64(offset.Uint64()), int64(size.Uint64())) @@ -514,6 +516,9 @@ func opSload(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]by } func opSstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } loc := scope.Stack.pop() val := scope.Stack.pop() interpreter.evm.StateDB.SetState(scope.Contract.Address(), @@ -522,23 +527,27 @@ func opSstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]b } func opJump(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if atomic.LoadInt32(&interpreter.evm.abort) != 0 { + return nil, errStopToken + } pos := scope.Stack.pop() if !scope.Contract.validJumpdest(&pos) { return nil, ErrInvalidJump } - *pc = pos.Uint64() + *pc = pos.Uint64() - 1 // pc will be increased by the interpreter loop return nil, nil } func opJumpi(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if atomic.LoadInt32(&interpreter.evm.abort) != 0 { + return nil, errStopToken + } pos, cond := scope.Stack.pop(), scope.Stack.pop() if !cond.IsZero() { if !scope.Contract.validJumpdest(&pos) { return nil, ErrInvalidJump } - *pc = pos.Uint64() - } else { - *pc++ + *pc = pos.Uint64() - 1 // pc will be increased by the interpreter loop } return nil, nil } @@ -563,6 +572,9 @@ func opGas(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte } func opCreate(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } var ( value = scope.Stack.pop() offset, size = scope.Stack.pop(), scope.Stack.pop() @@ -598,12 +610,17 @@ func opCreate(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]b scope.Contract.Gas += returnGas if suberr == ErrExecutionReverted { + interpreter.returnData = res // set REVERT data to return data buffer return res, nil } + interpreter.returnData = nil // clear dirty return data buffer return nil, nil } func opCreate2(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } var ( endowment = scope.Stack.pop() offset, size = scope.Stack.pop(), scope.Stack.pop() @@ -634,8 +651,10 @@ func opCreate2(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([] scope.Contract.Gas += returnGas if suberr == ErrExecutionReverted { + interpreter.returnData = res // set REVERT data to return data buffer return res, nil } + interpreter.returnData = nil // clear dirty return data buffer return nil, nil } @@ -651,6 +670,9 @@ func opCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byt // Get the arguments from the memory. args := scope.Memory.GetPtr(int64(inOffset.Uint64()), int64(inSize.Uint64())) + if interpreter.readOnly && !value.IsZero() { + return nil, ErrWriteProtection + } var bigVal = big0 //TODO: use uint256.Int instead of converting with toBig() // By using big0 here, we save an alloc for the most common case (non-ether-transferring contract calls), @@ -674,6 +696,7 @@ func opCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byt } scope.Contract.Gas += returnGas + interpreter.returnData = ret return ret, nil } @@ -709,6 +732,7 @@ func opCallCode(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([ } scope.Contract.Gas += returnGas + interpreter.returnData = ret return ret, nil } @@ -737,6 +761,7 @@ func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext } scope.Contract.Gas += returnGas + interpreter.returnData = ret return ret, nil } @@ -765,6 +790,7 @@ func opStaticCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) } scope.Contract.Gas += returnGas + interpreter.returnData = ret return ret, nil } @@ -772,21 +798,29 @@ func opReturn(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]b offset, size := scope.Stack.pop(), scope.Stack.pop() ret := scope.Memory.GetPtr(int64(offset.Uint64()), int64(size.Uint64())) - return ret, nil + return ret, errStopToken } func opRevert(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { offset, size := scope.Stack.pop(), scope.Stack.pop() ret := scope.Memory.GetPtr(int64(offset.Uint64()), int64(size.Uint64())) - return ret, nil + interpreter.returnData = ret + return ret, ErrExecutionReverted +} + +func opUndefined(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + return nil, &ErrInvalidOpCode{opcode: OpCode(scope.Contract.Code[*pc])} } func opStop(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { - return nil, nil + return nil, errStopToken } -func opSuicide(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { +func opSelfdestruct(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } beneficiary := scope.Stack.pop() balance := interpreter.evm.StateDB.GetBalance(scope.Contract.Address()) interpreter.evm.StateDB.AddBalance(beneficiary.Bytes20(), balance) @@ -795,7 +829,7 @@ func opSuicide(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([] interpreter.cfg.Tracer.CaptureEnter(SELFDESTRUCT, scope.Contract.Address(), beneficiary.Bytes20(), []byte{}, 0, balance) interpreter.cfg.Tracer.CaptureExit([]byte{}, 0, nil) } - return nil, nil + return nil, errStopToken } // following functions are used by the instruction jump table @@ -803,6 +837,9 @@ func opSuicide(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([] // make log instruction function func makeLog(size int) executionFunc { return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.readOnly { + return nil, ErrWriteProtection + } topics := make([]common.Hash, size) stack := scope.Stack mStart, mSize := stack.pop(), stack.pop() diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go index 560d26a0b8..e67acd8327 100644 --- a/core/vm/instructions_test.go +++ b/core/vm/instructions_test.go @@ -525,12 +525,14 @@ func TestOpMstore(t *testing.T) { mem.Resize(64) pc := uint64(0) v := "abcdef00000000000000abba000000000deaf000000c0de00100000000133700" - stack.pushN(*new(uint256.Int).SetBytes(common.Hex2Bytes(v)), *new(uint256.Int)) + stack.push(new(uint256.Int).SetBytes(common.Hex2Bytes(v))) + stack.push(new(uint256.Int)) opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) if got := common.Bytes2Hex(mem.GetCopy(0, 32)); got != v { t.Fatalf("Mstore fail, got %v, expected %v", got, v) } - stack.pushN(*new(uint256.Int).SetUint64(0x1), *new(uint256.Int)) + stack.push(new(uint256.Int).SetUint64(0x1)) + stack.push(new(uint256.Int)) opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) if common.Bytes2Hex(mem.GetCopy(0, 32)) != "0000000000000000000000000000000000000000000000000000000000000001" { t.Fatalf("Mstore failed to overwrite previous value") @@ -553,12 +555,13 @@ func BenchmarkOpMstore(bench *testing.B) { bench.ResetTimer() for i := 0; i < bench.N; i++ { - stack.pushN(*value, *memStart) + stack.push(value) + stack.push(memStart) opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) } } -func BenchmarkOpSHA3(bench *testing.B) { +func BenchmarkOpKeccak256(bench *testing.B) { var ( env = NewEVM(BlockContext{}, TxContext{}, nil, params.TestChainConfig, Config{}) stack = newstack() @@ -572,8 +575,9 @@ func BenchmarkOpSHA3(bench *testing.B) { bench.ResetTimer() for i := 0; i < bench.N; i++ { - stack.pushN(*uint256.NewInt(32), *start) - opSha3(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) + stack.push(uint256.NewInt(32)) + stack.push(start) + opKeccak256(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) } } diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 9fb83799c9..1660e3ce0f 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -18,7 +18,6 @@ package vm import ( "hash" - "sync/atomic" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" @@ -27,13 +26,12 @@ import ( // Config are the configuration options for the Interpreter type Config struct { - Debug bool // Enables debugging - Tracer Tracer // Opcode logger - NoRecursion bool // Disables call, callcode, delegate call and create - NoBaseFee bool // Forces the EIP-1559 baseFee to 0 (needed for 0 price calls) - EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages + Debug bool // Enables debugging + Tracer EVMLogger // Opcode logger + NoBaseFee bool // Forces the EIP-1559 baseFee to 0 (needed for 0 price calls) + EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages - JumpTable [256]*operation // EVM instruction table, automatically populated if unset + JumpTable *JumpTable // EVM instruction table, automatically populated if unset ExtraEips []int // Additional EIPS that are to be enabled } @@ -68,39 +66,37 @@ type EVMInterpreter struct { // NewEVMInterpreter returns a new instance of the Interpreter. func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { - // We use the STOP instruction whether to see - // the jump table was initialised. If it was not - // we'll set the default jump table. - if cfg.JumpTable[STOP] == nil { - var jt JumpTable + // If jump table was not initialised we set the default one. + if cfg.JumpTable == nil { switch { case evm.chainRules.IsLondon: - jt = londonInstructionSet + cfg.JumpTable = &londonInstructionSet case evm.chainRules.IsBerlin: - jt = berlinInstructionSet + cfg.JumpTable = &berlinInstructionSet case evm.chainRules.IsIstanbul: - jt = istanbulInstructionSet + cfg.JumpTable = &istanbulInstructionSet case evm.chainRules.IsConstantinople: - jt = constantinopleInstructionSet + cfg.JumpTable = &constantinopleInstructionSet case evm.chainRules.IsByzantium: - jt = byzantiumInstructionSet + cfg.JumpTable = &byzantiumInstructionSet case evm.chainRules.IsEIP158: - jt = spuriousDragonInstructionSet + cfg.JumpTable = &spuriousDragonInstructionSet case evm.chainRules.IsEIP150: - jt = tangerineWhistleInstructionSet + cfg.JumpTable = &tangerineWhistleInstructionSet case evm.chainRules.IsHomestead: - jt = homesteadInstructionSet + cfg.JumpTable = &homesteadInstructionSet default: - jt = frontierInstructionSet + cfg.JumpTable = &frontierInstructionSet } for i, eip := range cfg.ExtraEips { - if err := EnableEIP(eip, &jt); err != nil { + copy := *cfg.JumpTable + if err := EnableEIP(eip, ©); err != nil { // Disable it, so caller can check if it's activated or not cfg.ExtraEips = append(cfg.ExtraEips[:i], cfg.ExtraEips[i+1:]...) log.Error("EIP activation failed", "eip", eip, "error", err) } + cfg.JumpTable = © } - cfg.JumpTable = jt } return &EVMInterpreter{ @@ -152,9 +148,9 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( pc = uint64(0) // program counter cost uint64 // copies used by tracer - pcCopy uint64 // needed for the deferred Tracer - gasCopy uint64 // for Tracer to log gas remaining before execution - logged bool // deferred Tracer should ignore already logged steps + pcCopy uint64 // needed for the deferred EVMLogger + gasCopy uint64 // for EVMLogger to log gas remaining before execution + logged bool // deferred EVMLogger should ignore already logged steps res []byte // result of the opcode execution function ) // Don't move this deferrred function, it's placed before the capturestate-deferred method, @@ -169,9 +165,9 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( defer func() { if err != nil { if !logged { - in.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) + in.cfg.Tracer.CaptureState(pcCopy, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) } else { - in.cfg.Tracer.CaptureFault(in.evm, pcCopy, op, gasCopy, cost, callContext, in.evm.depth, err) + in.cfg.Tracer.CaptureFault(pcCopy, op, gasCopy, cost, callContext, in.evm.depth, err) } } }() @@ -180,101 +176,70 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( // explicit STOP, RETURN or SELFDESTRUCT is executed, an error occurred during // the execution of one of the operations or until the done flag is set by the // parent context. - steps := 0 for { - steps++ - if steps%1000 == 0 && atomic.LoadInt32(&in.evm.abort) != 0 { - break - } if in.cfg.Debug { // Capture pre-execution values for tracing. logged, pcCopy, gasCopy = false, pc, contract.Gas } - // Get the operation from the jump table and validate the stack to ensure there are // enough stack items available to perform the operation. op = contract.GetOp(pc) operation := in.cfg.JumpTable[op] - if operation == nil { - return nil, &ErrInvalidOpCode{opcode: op} - } + cost = operation.constantGas // For tracing // Validate stack if sLen := stack.len(); sLen < operation.minStack { return nil, &ErrStackUnderflow{stackLen: sLen, required: operation.minStack} } else if sLen > operation.maxStack { return nil, &ErrStackOverflow{stackLen: sLen, limit: operation.maxStack} } - // If the operation is valid, enforce write restrictions - if in.readOnly && in.evm.chainRules.IsByzantium { - // If the interpreter is operating in readonly mode, make sure no - // state-modifying operation is performed. The 3rd stack item - // for a call operation is the value. Transferring value from one - // account to the others means the state is modified and should also - // return with an error. - if operation.writes || (op == CALL && stack.Back(2).Sign() != 0) { - return nil, ErrWriteProtection - } - } - // Static portion of gas - cost = operation.constantGas // For tracing - if !contract.UseGas(operation.constantGas) { + if !contract.UseGas(cost) { return nil, ErrOutOfGas } - - var memorySize uint64 - // calculate the new memory size and expand the memory to fit - // the operation - // Memory check needs to be done prior to evaluating the dynamic gas portion, - // to detect calculation overflows - if operation.memorySize != nil { - memSize, overflow := operation.memorySize(stack) - if overflow { - return nil, ErrGasUintOverflow - } - // memory is expanded in words of 32 bytes. Gas - // is also calculated in words. - if memorySize, overflow = math.SafeMul(toWordSize(memSize), 32); overflow { - return nil, ErrGasUintOverflow - } - } - // Dynamic portion of gas - // consume the gas and return an error if not enough gas is available. - // cost is explicitly set so that the capture state defer method can get the proper cost if operation.dynamicGas != nil { + // All ops with a dynamic memory usage also has a dynamic gas cost. + var memorySize uint64 + // calculate the new memory size and expand the memory to fit + // the operation + // Memory check needs to be done prior to evaluating the dynamic gas portion, + // to detect calculation overflows + if operation.memorySize != nil { + memSize, overflow := operation.memorySize(stack) + if overflow { + return nil, ErrGasUintOverflow + } + // memory is expanded in words of 32 bytes. Gas + // is also calculated in words. + if memorySize, overflow = math.SafeMul(toWordSize(memSize), 32); overflow { + return nil, ErrGasUintOverflow + } + } + // Consume the gas and return an error if not enough gas is available. + // cost is explicitly set so that the capture state defer method can get the proper cost var dynamicCost uint64 dynamicCost, err = operation.dynamicGas(in.evm, contract, stack, mem, memorySize) - cost += dynamicCost // total cost, for debug tracing + cost += dynamicCost // for tracing if err != nil || !contract.UseGas(dynamicCost) { return nil, ErrOutOfGas } + if memorySize > 0 { + mem.Resize(memorySize) + } } - if memorySize > 0 { - mem.Resize(memorySize) - } - if in.cfg.Debug { - in.cfg.Tracer.CaptureState(in.evm, pc, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) + in.cfg.Tracer.CaptureState(pc, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) logged = true } - // execute the operation res, err = operation.execute(&pc, in, callContext) - // if the operation clears the return data (e.g. it has returning data) - // set the last return to the result of the operation. - if operation.returns { - in.returnData = res + if err != nil { + break } + pc++ + } - switch { - case err != nil: - return nil, err - case operation.reverts: - return res, ErrExecutionReverted - case operation.halts: - return res, nil - case !operation.jumps: - pc++ - } + if err == errStopToken { + err = nil // clear stop token error } - return nil, nil + + return res, err } diff --git a/core/vm/interpreter_test.go b/core/vm/interpreter_test.go new file mode 100644 index 0000000000..dfae0f2e2a --- /dev/null +++ b/core/vm/interpreter_test.go @@ -0,0 +1,77 @@ +// Copyright 2021 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 . + +package vm + +import ( + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/params" +) + +var loopInterruptTests = []string{ + // infinite loop using JUMP: push(2) jumpdest dup1 jump + "60025b8056", + // infinite loop using JUMPI: push(1) push(4) jumpdest dup2 dup2 jumpi + "600160045b818157", +} + +func TestLoopInterrupt(t *testing.T) { + address := common.BytesToAddress([]byte("contract")) + vmctx := BlockContext{ + Transfer: func(StateDB, common.Address, common.Address, *big.Int) {}, + } + + for i, tt := range loopInterruptTests { + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + statedb.CreateAccount(address) + statedb.SetCode(address, common.Hex2Bytes(tt)) + statedb.Finalise(true) + + evm := NewEVM(vmctx, TxContext{}, statedb, params.AllEthashProtocolChanges, Config{}) + + errChannel := make(chan error) + timeout := make(chan bool) + + go func(evm *EVM) { + _, _, err := evm.Call(AccountRef(common.Address{}), address, nil, math.MaxUint64, new(big.Int)) + errChannel <- err + }(evm) + + go func() { + <-time.After(time.Second) + timeout <- true + }() + + evm.Cancel() + + select { + case <-timeout: + t.Errorf("test %d timed out", i) + case err := <-errChannel: + if err != nil { + t.Errorf("test %d failure: %v", i, err) + } + } + } + +} diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 329ad77cbf..6dea5d81f3 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -17,6 +17,8 @@ package vm import ( + "fmt" + "github.com/ethereum/go-ethereum/params" ) @@ -40,12 +42,6 @@ type operation struct { // memorySize returns the memory size required for the operation memorySize memorySizeFunc - - halts bool // indicates whether the operation should halt further execution - jumps bool // indicates whether the program counter should not increment - writes bool // determines whether this a state modifying operation - reverts bool // determines whether the operation reverts state (implicitly halts) - returns bool // determines whether the operations sets the return data content } var ( @@ -63,13 +59,31 @@ var ( // JumpTable contains the EVM opcodes supported at a given fork. type JumpTable [256]*operation +func validate(jt JumpTable) JumpTable { + for i, op := range jt { + if op == nil { + panic(fmt.Sprintf("op 0x%x is not set", i)) + } + // The interpreter has an assumption that if the memorySize function is + // set, then the dynamicGas function is also set. This is a somewhat + // arbitrary assumption, and can be removed if we need to -- but it + // allows us to avoid a condition check. As long as we have that assumption + // in there, this little sanity check prevents us from merging in a + // change which violates it. + if op.memorySize != nil && op.dynamicGas == nil { + panic(fmt.Sprintf("op %v has dynamic memory but not dynamic gas", OpCode(i).String())) + } + } + return jt +} + // newLondonInstructionSet returns the frontier, homestead, byzantium, // contantinople, istanbul, petersburg, berlin and london instructions. func newLondonInstructionSet() JumpTable { instructionSet := newBerlinInstructionSet() enable3529(&instructionSet) // EIP-3529: Reduction in refunds https://eips.ethereum.org/EIPS/eip-3529 enable3198(&instructionSet) // Base fee opcode https://eips.ethereum.org/EIPS/eip-3198 - return instructionSet + return validate(instructionSet) } // newBerlinInstructionSet returns the frontier, homestead, byzantium, @@ -77,7 +91,7 @@ func newLondonInstructionSet() JumpTable { func newBerlinInstructionSet() JumpTable { instructionSet := newIstanbulInstructionSet() enable2929(&instructionSet) // Access lists for trie accesses https://eips.ethereum.org/EIPS/eip-2929 - return instructionSet + return validate(instructionSet) } // newIstanbulInstructionSet returns the frontier, homestead, byzantium, @@ -89,7 +103,7 @@ func newIstanbulInstructionSet() JumpTable { enable1884(&instructionSet) // Reprice reader opcodes - https://eips.ethereum.org/EIPS/eip-1884 enable2200(&instructionSet) // Net metered SSTORE - https://eips.ethereum.org/EIPS/eip-2200 - return instructionSet + return validate(instructionSet) } // newConstantinopleInstructionSet returns the frontier, homestead, @@ -127,10 +141,8 @@ func newConstantinopleInstructionSet() JumpTable { minStack: minStack(4, 1), maxStack: maxStack(4, 1), memorySize: memoryCreate2, - writes: true, - returns: true, } - return instructionSet + return validate(instructionSet) } // newByzantiumInstructionSet returns the frontier, homestead and @@ -144,7 +156,6 @@ func newByzantiumInstructionSet() JumpTable { minStack: minStack(6, 1), maxStack: maxStack(6, 1), memorySize: memoryStaticCall, - returns: true, } instructionSet[RETURNDATASIZE] = &operation{ execute: opReturnDataSize, @@ -166,17 +177,15 @@ func newByzantiumInstructionSet() JumpTable { minStack: minStack(2, 0), maxStack: maxStack(2, 0), memorySize: memoryRevert, - reverts: true, - returns: true, } - return instructionSet + return validate(instructionSet) } // EIP 158 a.k.a Spurious Dragon func newSpuriousDragonInstructionSet() JumpTable { instructionSet := newTangerineWhistleInstructionSet() instructionSet[EXP].dynamicGas = gasExpEIP158 - return instructionSet + return validate(instructionSet) } @@ -190,7 +199,7 @@ func newTangerineWhistleInstructionSet() JumpTable { instructionSet[CALL].constantGas = params.CallGasEIP150 instructionSet[CALLCODE].constantGas = params.CallGasEIP150 instructionSet[DELEGATECALL].constantGas = params.CallGasEIP150 - return instructionSet + return validate(instructionSet) } // newHomesteadInstructionSet returns the frontier and homestead @@ -204,21 +213,19 @@ func newHomesteadInstructionSet() JumpTable { minStack: minStack(6, 1), maxStack: maxStack(6, 1), memorySize: memoryDelegateCall, - returns: true, } - return instructionSet + return validate(instructionSet) } // newFrontierInstructionSet returns the frontier instructions // that can be executed during the frontier phase. func newFrontierInstructionSet() JumpTable { - return JumpTable{ + tbl := JumpTable{ STOP: { execute: opStop, constantGas: 0, minStack: minStack(0, 0), maxStack: maxStack(0, 0), - halts: true, }, ADD: { execute: opAdd, @@ -352,13 +359,13 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(2, 1), maxStack: maxStack(2, 1), }, - SHA3: { - execute: opSha3, - constantGas: params.Sha3Gas, - dynamicGas: gasSha3, + KECCAK256: { + execute: opKeccak256, + constantGas: params.Keccak256Gas, + dynamicGas: gasKeccak256, minStack: minStack(2, 1), maxStack: maxStack(2, 1), - memorySize: memorySha3, + memorySize: memoryKeccak256, }, ADDRESS: { execute: opAddress, @@ -521,21 +528,18 @@ func newFrontierInstructionSet() JumpTable { dynamicGas: gasSStore, minStack: minStack(2, 0), maxStack: maxStack(2, 0), - writes: true, }, JUMP: { execute: opJump, constantGas: GasMidStep, minStack: minStack(1, 0), maxStack: maxStack(1, 0), - jumps: true, }, JUMPI: { execute: opJumpi, constantGas: GasSlowStep, minStack: minStack(2, 0), maxStack: maxStack(2, 0), - jumps: true, }, PC: { execute: opPc, @@ -951,7 +955,6 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(2, 0), maxStack: maxStack(2, 0), memorySize: memoryLog, - writes: true, }, LOG1: { execute: makeLog(1), @@ -959,7 +962,6 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(3, 0), maxStack: maxStack(3, 0), memorySize: memoryLog, - writes: true, }, LOG2: { execute: makeLog(2), @@ -967,7 +969,6 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(4, 0), maxStack: maxStack(4, 0), memorySize: memoryLog, - writes: true, }, LOG3: { execute: makeLog(3), @@ -975,7 +976,6 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(5, 0), maxStack: maxStack(5, 0), memorySize: memoryLog, - writes: true, }, LOG4: { execute: makeLog(4), @@ -983,7 +983,6 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(6, 0), maxStack: maxStack(6, 0), memorySize: memoryLog, - writes: true, }, CREATE: { execute: opCreate, @@ -992,8 +991,6 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(3, 1), maxStack: maxStack(3, 1), memorySize: memoryCreate, - writes: true, - returns: true, }, CALL: { execute: opCall, @@ -1002,7 +999,6 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(7, 1), maxStack: maxStack(7, 1), memorySize: memoryCall, - returns: true, }, CALLCODE: { execute: opCallCode, @@ -1011,7 +1007,6 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(7, 1), maxStack: maxStack(7, 1), memorySize: memoryCall, - returns: true, }, RETURN: { execute: opReturn, @@ -1019,15 +1014,21 @@ func newFrontierInstructionSet() JumpTable { minStack: minStack(2, 0), maxStack: maxStack(2, 0), memorySize: memoryReturn, - halts: true, }, SELFDESTRUCT: { - execute: opSuicide, + execute: opSelfdestruct, dynamicGas: gasSelfdestruct, minStack: minStack(1, 0), maxStack: maxStack(1, 0), - halts: true, - writes: true, }, } + + // Fill all unassigned slots with opUndefined. + for i, entry := range tbl { + if entry == nil { + tbl[i] = &operation{execute: opUndefined, maxStack: maxStack(0, 0)} + } + } + + return validate(tbl) } diff --git a/core/vm/logger.go b/core/vm/logger.go index 52dc0b8a0e..3af5aec199 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2021 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 @@ -17,340 +17,22 @@ package vm import ( - "encoding/hex" - "fmt" - "io" "math/big" - "strings" "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/params" - "github.com/holiman/uint256" ) -// Storage represents a contract's storage. -type Storage map[common.Hash]common.Hash - -// Copy duplicates the current storage. -func (s Storage) Copy() Storage { - cpy := make(Storage) - for key, value := range s { - cpy[key] = value - } - return cpy -} - -// LogConfig are the configuration options for structured logger the EVM -type LogConfig struct { - EnableMemory bool // enable memory capture - DisableStack bool // disable stack capture - DisableStorage bool // disable storage capture - EnableReturnData bool // enable return data capture - Debug bool // print output during capture end - Limit int // maximum length of output, but zero means unlimited - // Chain overrides, can be used to execute a trace using future fork rules - Overrides *params.ChainConfig `json:"overrides,omitempty"` -} - -//go:generate gencodec -type StructLog -field-override structLogMarshaling -out gen_structlog.go - -// StructLog is emitted to the EVM each cycle and lists information about the current internal state -// prior to the execution of the statement. -type StructLog struct { - Pc uint64 `json:"pc"` - Op OpCode `json:"op"` - Gas uint64 `json:"gas"` - GasCost uint64 `json:"gasCost"` - Memory []byte `json:"memory"` - MemorySize int `json:"memSize"` - Stack []uint256.Int `json:"stack"` - ReturnData []byte `json:"returnData"` - Storage map[common.Hash]common.Hash `json:"-"` - Depth int `json:"depth"` - RefundCounter uint64 `json:"refund"` - Err error `json:"-"` -} - -// overrides for gencodec -type structLogMarshaling struct { - Gas math.HexOrDecimal64 - GasCost math.HexOrDecimal64 - Memory hexutil.Bytes - ReturnData hexutil.Bytes - OpName string `json:"opName"` // adds call to OpName() in MarshalJSON - ErrorString string `json:"error"` // adds call to ErrorString() in MarshalJSON -} - -// OpName formats the operand name in a human-readable format. -func (s *StructLog) OpName() string { - return s.Op.String() -} - -// ErrorString formats the log's error as a string. -func (s *StructLog) ErrorString() string { - if s.Err != nil { - return s.Err.Error() - } - return "" -} - -// Tracer is used to collect execution traces from an EVM transaction +// EVMLogger is used to collect execution traces from an EVM transaction // execution. CaptureState is called for each step of the VM with the // current VM state. // Note that reference types are actual VM data structures; make copies // if you need to retain them beyond the current call. -type Tracer interface { +type EVMLogger interface { CaptureStart(env *EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) - CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) + CaptureState(pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) CaptureEnter(typ OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) CaptureExit(output []byte, gasUsed uint64, err error) - CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) + CaptureFault(pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) } - -// StructLogger is an EVM state logger and implements Tracer. -// -// StructLogger can capture state based on the given Log configuration and also keeps -// a track record of modified storage which is used in reporting snapshots of the -// contract their storage. -type StructLogger struct { - cfg LogConfig - - storage map[common.Address]Storage - logs []StructLog - output []byte - err error -} - -// NewStructLogger returns a new logger -func NewStructLogger(cfg *LogConfig) *StructLogger { - logger := &StructLogger{ - storage: make(map[common.Address]Storage), - } - if cfg != nil { - logger.cfg = *cfg - } - return logger -} - -// Reset clears the data held by the logger. -func (l *StructLogger) Reset() { - l.storage = make(map[common.Address]Storage) - l.output = make([]byte, 0) - l.logs = l.logs[:0] - l.err = nil -} - -// CaptureStart implements the Tracer interface to initialize the tracing operation. -func (l *StructLogger) CaptureStart(env *EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { -} - -// CaptureState logs a new structured log message and pushes it out to the environment -// -// CaptureState also tracks SLOAD/SSTORE ops to track storage change. -func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) { - memory := scope.Memory - stack := scope.Stack - contract := scope.Contract - // check if already accumulated the specified number of logs - if l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) { - return - } - // Copy a snapshot of the current memory state to a new buffer - var mem []byte - if l.cfg.EnableMemory { - mem = make([]byte, len(memory.Data())) - copy(mem, memory.Data()) - } - // Copy a snapshot of the current stack state to a new buffer - var stck []uint256.Int - if !l.cfg.DisableStack { - stck = make([]uint256.Int, len(stack.Data())) - for i, item := range stack.Data() { - stck[i] = item - } - } - // Copy a snapshot of the current storage to a new container - var storage Storage - if !l.cfg.DisableStorage && (op == SLOAD || op == SSTORE) { - // initialise new changed values storage container for this contract - // if not present. - if l.storage[contract.Address()] == nil { - l.storage[contract.Address()] = make(Storage) - } - // capture SLOAD opcodes and record the read entry in the local storage - if op == SLOAD && stack.len() >= 1 { - var ( - address = common.Hash(stack.data[stack.len()-1].Bytes32()) - value = env.StateDB.GetState(contract.Address(), address) - ) - l.storage[contract.Address()][address] = value - storage = l.storage[contract.Address()].Copy() - } else if op == SSTORE && stack.len() >= 2 { - // capture SSTORE opcodes and record the written entry in the local storage. - var ( - value = common.Hash(stack.data[stack.len()-2].Bytes32()) - address = common.Hash(stack.data[stack.len()-1].Bytes32()) - ) - l.storage[contract.Address()][address] = value - storage = l.storage[contract.Address()].Copy() - } - } - var rdata []byte - if l.cfg.EnableReturnData { - rdata = make([]byte, len(rData)) - copy(rdata, rData) - } - // create a new snapshot of the EVM. - log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, rdata, storage, depth, env.StateDB.GetRefund(), err} - l.logs = append(l.logs, log) -} - -// CaptureFault implements the Tracer interface to trace an execution fault -// while running an opcode. -func (l *StructLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) { -} - -// CaptureEnd is called after the call finishes to finalize the tracing. -func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) { - l.output = output - l.err = err - if l.cfg.Debug { - fmt.Printf("0x%x\n", output) - if err != nil { - fmt.Printf(" error: %v\n", err) - } - } -} - -func (l *StructLogger) CaptureEnter(typ OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { -} - -func (l *StructLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} - -// StructLogs returns the captured log entries. -func (l *StructLogger) StructLogs() []StructLog { return l.logs } - -// Error returns the VM error captured by the trace. -func (l *StructLogger) Error() error { return l.err } - -// Output returns the VM return value captured by the trace. -func (l *StructLogger) Output() []byte { return l.output } - -// WriteTrace writes a formatted trace to the given writer -func WriteTrace(writer io.Writer, logs []StructLog) { - for _, log := range logs { - fmt.Fprintf(writer, "%-16spc=%08d gas=%v cost=%v", log.Op, log.Pc, log.Gas, log.GasCost) - if log.Err != nil { - fmt.Fprintf(writer, " ERROR: %v", log.Err) - } - fmt.Fprintln(writer) - - if len(log.Stack) > 0 { - fmt.Fprintln(writer, "Stack:") - for i := len(log.Stack) - 1; i >= 0; i-- { - fmt.Fprintf(writer, "%08d %s\n", len(log.Stack)-i-1, log.Stack[i].Hex()) - } - } - if len(log.Memory) > 0 { - fmt.Fprintln(writer, "Memory:") - fmt.Fprint(writer, hex.Dump(log.Memory)) - } - if len(log.Storage) > 0 { - fmt.Fprintln(writer, "Storage:") - for h, item := range log.Storage { - fmt.Fprintf(writer, "%x: %x\n", h, item) - } - } - if len(log.ReturnData) > 0 { - fmt.Fprintln(writer, "ReturnData:") - fmt.Fprint(writer, hex.Dump(log.ReturnData)) - } - fmt.Fprintln(writer) - } -} - -// WriteLogs writes vm logs in a readable format to the given writer -func WriteLogs(writer io.Writer, logs []*types.Log) { - for _, log := range logs { - fmt.Fprintf(writer, "LOG%d: %x bn=%d txi=%x\n", len(log.Topics), log.Address, log.BlockNumber, log.TxIndex) - - for i, topic := range log.Topics { - fmt.Fprintf(writer, "%08d %x\n", i, topic) - } - - fmt.Fprint(writer, hex.Dump(log.Data)) - fmt.Fprintln(writer) - } -} - -type mdLogger struct { - out io.Writer - cfg *LogConfig -} - -// NewMarkdownLogger creates a logger which outputs information in a format adapted -// for human readability, and is also a valid markdown table -func NewMarkdownLogger(cfg *LogConfig, writer io.Writer) *mdLogger { - l := &mdLogger{writer, cfg} - if l.cfg == nil { - l.cfg = &LogConfig{} - } - return l -} - -func (t *mdLogger) CaptureStart(env *EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { - if !create { - fmt.Fprintf(t.out, "From: `%v`\nTo: `%v`\nData: `0x%x`\nGas: `%d`\nValue `%v` wei\n", - from.String(), to.String(), - input, gas, value) - } else { - fmt.Fprintf(t.out, "From: `%v`\nCreate at: `%v`\nData: `0x%x`\nGas: `%d`\nValue `%v` wei\n", - from.String(), to.String(), - input, gas, value) - } - - fmt.Fprintf(t.out, ` -| Pc | Op | Cost | Stack | RStack | Refund | -|-------|-------------|------|-----------|-----------|---------| -`) -} - -// CaptureState also tracks SLOAD/SSTORE ops to track storage change. -func (t *mdLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) { - stack := scope.Stack - fmt.Fprintf(t.out, "| %4d | %10v | %3d |", pc, op, cost) - - if !t.cfg.DisableStack { - // format stack - var a []string - for _, elem := range stack.data { - a = append(a, elem.Hex()) - } - b := fmt.Sprintf("[%v]", strings.Join(a, ",")) - fmt.Fprintf(t.out, "%10v |", b) - } - fmt.Fprintf(t.out, "%10v |", env.StateDB.GetRefund()) - fmt.Fprintln(t.out, "") - if err != nil { - fmt.Fprintf(t.out, "Error: %v\n", err) - } -} - -func (t *mdLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) { - fmt.Fprintf(t.out, "\nError: at pc=%d, op=%v: %v\n", pc, op, err) -} - -func (t *mdLogger) CaptureEnd(output []byte, gasUsed uint64, tm time.Duration, err error) { - fmt.Fprintf(t.out, "\nOutput: `0x%x`\nConsumed gas: `%d`\nError: `%v`\n", - output, gasUsed, err) -} - -func (t *mdLogger) CaptureEnter(typ OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { -} - -func (t *mdLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} diff --git a/core/vm/memory_table.go b/core/vm/memory_table.go index 4fcb41442c..e35ca84e0e 100644 --- a/core/vm/memory_table.go +++ b/core/vm/memory_table.go @@ -16,7 +16,7 @@ package vm -func memorySha3(stack *Stack) (uint64, bool) { +func memoryKeccak256(stack *Stack) (uint64, bool) { return calcMemSize64(stack.Back(0), stack.Back(1)) } diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index 286307ae91..a1833e5109 100644 --- a/core/vm/opcodes.go +++ b/core/vm/opcodes.go @@ -32,75 +32,70 @@ func (op OpCode) IsPush() bool { return false } -// IsStaticJump specifies if an opcode is JUMP. -func (op OpCode) IsStaticJump() bool { - return op == JUMP -} - // 0x0 range - arithmetic ops. const ( - STOP OpCode = iota - ADD - MUL - SUB - DIV - SDIV - MOD - SMOD - ADDMOD - MULMOD - EXP - SIGNEXTEND + STOP OpCode = 0x0 + ADD OpCode = 0x1 + MUL OpCode = 0x2 + SUB OpCode = 0x3 + DIV OpCode = 0x4 + SDIV OpCode = 0x5 + MOD OpCode = 0x6 + SMOD OpCode = 0x7 + ADDMOD OpCode = 0x8 + MULMOD OpCode = 0x9 + EXP OpCode = 0xa + SIGNEXTEND OpCode = 0xb ) // 0x10 range - comparison ops. const ( - LT OpCode = iota + 0x10 - GT - SLT - SGT - EQ - ISZERO - AND - OR - XOR - NOT - BYTE - SHL - SHR - SAR + LT OpCode = 0x10 + GT OpCode = 0x11 + SLT OpCode = 0x12 + SGT OpCode = 0x13 + EQ OpCode = 0x14 + ISZERO OpCode = 0x15 + AND OpCode = 0x16 + OR OpCode = 0x17 + XOR OpCode = 0x18 + NOT OpCode = 0x19 + BYTE OpCode = 0x1a + SHL OpCode = 0x1b + SHR OpCode = 0x1c + SAR OpCode = 0x1d - SHA3 OpCode = 0x20 + KECCAK256 OpCode = 0x20 ) // 0x30 range - closure state. const ( - ADDRESS OpCode = 0x30 + iota - BALANCE - ORIGIN - CALLER - CALLVALUE - CALLDATALOAD - CALLDATASIZE - CALLDATACOPY - CODESIZE - CODECOPY - GASPRICE - EXTCODESIZE - EXTCODECOPY - RETURNDATASIZE - RETURNDATACOPY - EXTCODEHASH + ADDRESS OpCode = 0x30 + BALANCE OpCode = 0x31 + ORIGIN OpCode = 0x32 + CALLER OpCode = 0x33 + CALLVALUE OpCode = 0x34 + CALLDATALOAD OpCode = 0x35 + CALLDATASIZE OpCode = 0x36 + CALLDATACOPY OpCode = 0x37 + CODESIZE OpCode = 0x38 + CODECOPY OpCode = 0x39 + GASPRICE OpCode = 0x3a + EXTCODESIZE OpCode = 0x3b + EXTCODECOPY OpCode = 0x3c + RETURNDATASIZE OpCode = 0x3d + RETURNDATACOPY OpCode = 0x3e + EXTCODEHASH OpCode = 0x3f ) // 0x40 range - block operations. const ( - BLOCKHASH OpCode = 0x40 + iota - COINBASE - TIMESTAMP - NUMBER - DIFFICULTY - GASLIMIT + BLOCKHASH OpCode = 0x40 + COINBASE OpCode = 0x41 + TIMESTAMP OpCode = 0x42 + NUMBER OpCode = 0x43 + DIFFICULTY OpCode = 0x44 + GASLIMIT OpCode = 0x45 CHAINID OpCode = 0x46 SELFBALANCE OpCode = 0x47 BASEFEE OpCode = 0x48 @@ -122,7 +117,7 @@ const ( JUMPDEST OpCode = 0x5b ) -// 0x60 range. +// 0x60 range - pushes. const ( PUSH1 OpCode = 0x60 + iota PUSH2 @@ -156,7 +151,11 @@ const ( PUSH30 PUSH31 PUSH32 - DUP1 +) + +// 0x80 range - dups. +const ( + DUP1 = 0x80 + iota DUP2 DUP3 DUP4 @@ -172,7 +171,11 @@ const ( DUP14 DUP15 DUP16 - SWAP1 +) + +// 0x90 range - swaps. +const ( + SWAP1 = 0x90 + iota SWAP2 SWAP3 SWAP4 @@ -199,23 +202,18 @@ const ( LOG4 ) -// unofficial opcodes used for parsing. -const ( - PUSH OpCode = 0xb0 + iota - DUP - SWAP -) - // 0xf0 range - closures. const ( - CREATE OpCode = 0xf0 + iota - CALL - CALLCODE - RETURN - DELEGATECALL - CREATE2 + CREATE OpCode = 0xf0 + CALL OpCode = 0xf1 + CALLCODE OpCode = 0xf2 + RETURN OpCode = 0xf3 + DELEGATECALL OpCode = 0xf4 + CREATE2 OpCode = 0xf5 + STATICCALL OpCode = 0xfa REVERT OpCode = 0xfd + INVALID OpCode = 0xfe SELFDESTRUCT OpCode = 0xff ) @@ -252,7 +250,7 @@ var opCodeToString = map[OpCode]string{ MULMOD: "MULMOD", // 0x20 range - crypto. - SHA3: "SHA3", + KECCAK256: "KECCAK256", // 0x30 range - closure state. ADDRESS: "ADDRESS", @@ -381,11 +379,8 @@ var opCodeToString = map[OpCode]string{ CREATE2: "CREATE2", STATICCALL: "STATICCALL", REVERT: "REVERT", + INVALID: "INVALID", SELFDESTRUCT: "SELFDESTRUCT", - - PUSH: "PUSH", - DUP: "DUP", - SWAP: "SWAP", } func (op OpCode) String() string { @@ -424,7 +419,7 @@ var stringToOp = map[string]OpCode{ "SAR": SAR, "ADDMOD": ADDMOD, "MULMOD": MULMOD, - "SHA3": SHA3, + "KECCAK256": KECCAK256, "ADDRESS": ADDRESS, "BALANCE": BALANCE, "ORIGIN": ORIGIN, @@ -539,6 +534,7 @@ var stringToOp = map[string]OpCode{ "RETURN": RETURN, "CALLCODE": CALLCODE, "REVERT": REVERT, + "INVALID": INVALID, "SELFDESTRUCT": SELFDESTRUCT, } diff --git a/core/vm/runtime/runtime_test.go b/core/vm/runtime/runtime_test.go index 9f4bafbc7f..97673b4906 100644 --- a/core/vm/runtime/runtime_test.go +++ b/core/vm/runtime/runtime_test.go @@ -34,7 +34,11 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/tracers" + "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum/go-ethereum/params" + + // force-load js tracers to trigger registration + _ "github.com/ethereum/go-ethereum/eth/tracers/js" ) func TestDefaults(t *testing.T) { @@ -323,19 +327,19 @@ func TestBlockhash(t *testing.T) { } type stepCounter struct { - inner *vm.JSONLogger + inner *logger.JSONLogger steps int } func (s *stepCounter) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { } -func (s *stepCounter) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { +func (s *stepCounter) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { } func (s *stepCounter) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {} -func (s *stepCounter) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +func (s *stepCounter) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { s.steps++ // Enable this for more output //s.inner.CaptureState(env, pc, op, gas, cost, memory, stack, rStack, contract, depth, err) @@ -490,7 +494,7 @@ func BenchmarkSimpleLoop(b *testing.B) { byte(vm.JUMP), } - //tracer := vm.NewJSONLogger(nil, os.Stdout) + //tracer := logger.NewJSONLogger(nil, os.Stdout) //Execute(loopingCode, nil, &Config{ // EVMConfig: vm.Config{ // Debug: true, @@ -511,7 +515,7 @@ func BenchmarkSimpleLoop(b *testing.B) { // TestEip2929Cases contains various testcases that are used for // EIP-2929 about gas repricings func TestEip2929Cases(t *testing.T) { - + t.Skip("Test only useful for generating documentation") id := 1 prettyPrint := func(comment string, code []byte) { @@ -533,7 +537,7 @@ func TestEip2929Cases(t *testing.T) { Execute(code, nil, &Config{ EVMConfig: vm.Config{ Debug: true, - Tracer: vm.NewMarkdownLogger(nil, os.Stdout), + Tracer: logger.NewMarkdownLogger(nil, os.Stdout), ExtraEips: []int{2929}, }, }) @@ -683,7 +687,7 @@ func TestColdAccountAccessCost(t *testing.T) { want: 7600, }, } { - tracer := vm.NewStructLogger(nil) + tracer := logger.NewStructLogger(nil) Execute(tc.code, nil, &Config{ EVMConfig: vm.Config{ Debug: true, diff --git a/core/vm/stack.go b/core/vm/stack.go index 220f97c89f..9e7e887ccd 100644 --- a/core/vm/stack.go +++ b/core/vm/stack.go @@ -54,10 +54,6 @@ func (st *Stack) push(d *uint256.Int) { // NOTE push limit (1024) is checked in baseCheck st.data = append(st.data, *d) } -func (st *Stack) pushN(ds ...uint256.Int) { - // FIXME: Is there a way to pass args by pointers. - st.data = append(st.data, ds...) -} func (st *Stack) pop() (ret uint256.Int) { ret = st.data[len(st.data)-1] diff --git a/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s b/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s index 1e2d7ff961..5a9cc3ffcf 100644 --- a/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s +++ b/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s @@ -11,7 +11,7 @@ Note: - To avoid unnecessary loads and make use of available registers, two 'passes' have every time been interleaved, with the odd passes accumulating c' and d' - which will be added to c and d respectively in the the even passes + which will be added to c and d respectively in the even passes */ diff --git a/eth/api.go b/eth/api.go index 3ec72c58e4..f81dfa922b 100644 --- a/eth/api.go +++ b/eth/api.go @@ -170,7 +170,7 @@ func (api *PrivateAdminAPI) ExportChain(file string, first *uint64, last *uint64 last = &head } if _, err := os.Stat(file); err == nil { - // File already exists. Allowing overwrite could be a DoS vecotor, + // File already exists. Allowing overwrite could be a DoS vector, // since the 'file' may point to arbitrary paths on the drive return false, errors.New("location would overwrite an existing file") } diff --git a/eth/api_backend.go b/eth/api_backend.go index 01e68f6781..6577ac1e1a 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -187,7 +187,7 @@ func (b *EthAPIBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*typ if number == nil { return nil, errors.New("failed to get block number from hash") } - logs := rawdb.ReadLogs(db, hash, *number) + logs := rawdb.ReadLogs(db, hash, *number, b.eth.blockchain.Config()) if logs == nil { return nil, errors.New("failed to get logs for block") } @@ -352,8 +352,8 @@ func (b *EthAPIBackend) StartMining(threads int) error { return b.eth.StartMining(threads) } -func (b *EthAPIBackend) StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive bool) (*state.StateDB, error) { - return b.eth.stateAtBlock(block, reexec, base, checkLive) +func (b *EthAPIBackend) StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive, preferDisk bool) (*state.StateDB, error) { + return b.eth.StateAtBlock(block, reexec, base, checkLive, preferDisk) } func (b *EthAPIBackend) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (core.Message, vm.BlockContext, *state.StateDB, error) { diff --git a/eth/backend.go b/eth/backend.go index fe2637d37e..f1ece4f3fe 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/beacon" "github.com/ethereum/go-ethereum/consensus/bor" "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/core" @@ -47,6 +48,7 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/internal/shutdowncheck" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/node" @@ -72,6 +74,7 @@ type Ethereum struct { handler *handler ethDialCandidates enode.Iterator snapDialCandidates enode.Iterator + merger *consensus.Merger // DB interfaces chainDb ethdb.Database // Block chain database @@ -96,6 +99,8 @@ type Ethereum struct { p2pServer *p2p.Server lock sync.RWMutex // Protects the variadic fields (e.g. gas price and etherbase) + + shutdownTracker *shutdowncheck.ShutdownTracker // Tracks if and when the node has shutdown ungracefully } // New creates a new Ethereum object (including the @@ -132,7 +137,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { if err != nil { return nil, err } - chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, config.Genesis, config.OverrideLondon) + chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, config.Genesis, config.OverrideArrowGlacier, config.OverrideTerminalTotalDifficulty) if _, ok := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !ok { return nil, genesisErr } @@ -141,8 +146,10 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { if err := pruner.RecoverPruning(stack.ResolvePath(""), chainDb, stack.ResolvePath(config.TrieCleanCacheJournal)); err != nil { log.Error("Failed to recover state", "error", err) } + merger := consensus.NewMerger(chainDb) eth := &Ethereum{ config: config, + merger: merger, chainDb: chainDb, eventMux: stack.EventMux(), accountManager: stack.AccountManager(), @@ -154,6 +161,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { bloomRequests: make(chan chan *bloombits.Retrieval), bloomIndexer: core.NewBloomIndexer(chainDb, params.BloomBitsBlocks, params.BloomConfirms), p2pServer: stack.Server(), + shutdownTracker: shutdowncheck.NewShutdownTracker(chainDb), } // START: Bor changes @@ -238,6 +246,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { Database: chainDb, Chain: eth.blockchain, TxPool: eth.txPool, + Merger: merger, Network: config.NetworkId, Sync: config.SyncMode, BloomCache: uint64(cacheLimit), @@ -248,7 +257,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { return nil, err } - eth.miner = miner.New(eth, &config.Miner, chainConfig, eth.EventMux(), eth.engine, eth.isLocalBlock) + eth.miner = miner.New(eth, &config.Miner, chainConfig, eth.EventMux(), eth.engine, eth.isLocalBlock, merger) eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) // Setup DNS discovery iterators. @@ -269,19 +278,10 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { stack.RegisterAPIs(eth.APIs()) stack.RegisterProtocols(eth.Protocols()) stack.RegisterLifecycle(eth) - // Check for unclean shutdown - if uncleanShutdowns, discards, err := rawdb.PushUncleanShutdownMarker(chainDb); err != nil { - log.Error("Could not update unclean-shutdown-marker list", "error", err) - } else { - if discards > 0 { - log.Warn("Old unclean shutdowns found", "count", discards) - } - for _, tstamp := range uncleanShutdowns { - t := time.Unix(int64(tstamp), 0) - log.Warn("Unclean shutdown detected", "booted", t, - "age", common.PrettyAge(t)) - } - } + + // Successful startup; push a marker and check previous unclean shutdowns. + eth.shutdownTracker.MarkStartup() + return eth, nil } @@ -398,10 +398,10 @@ func (s *Ethereum) Etherbase() (eb common.Address, err error) { // // We regard two types of accounts as local miner account: etherbase // and accounts specified via `txpool.locals` flag. -func (s *Ethereum) isLocalBlock(block *types.Block) bool { - author, err := s.engine.Author(block.Header()) +func (s *Ethereum) isLocalBlock(header *types.Header) bool { + author, err := s.engine.Author(header) if err != nil { - log.Warn("Failed to retrieve block author", "number", block.NumberU64(), "hash", block.Hash(), "err", err) + log.Warn("Failed to retrieve block author", "number", header.Number.Uint64(), "hash", header.Hash(), "err", err) return false } // Check whether the given address is etherbase. @@ -424,7 +424,7 @@ func (s *Ethereum) isLocalBlock(block *types.Block) bool { // shouldPreserve checks whether we should preserve the given block // during the chain reorg depending on whether the author of block // is a local account. -func (s *Ethereum) shouldPreserve(block *types.Block) bool { +func (s *Ethereum) shouldPreserve(header *types.Header) bool { // The reason we need to disable the self-reorg preserving for clique // is it can be probable to introduce a deadlock. // @@ -444,7 +444,7 @@ func (s *Ethereum) shouldPreserve(block *types.Block) bool { if _, ok := s.engine.(*clique.Clique); ok { return false } - return s.isLocalBlock(block) + return s.isLocalBlock(header) } // SetEtherbase sets the mining reward address. @@ -485,13 +485,21 @@ func (s *Ethereum) StartMining(threads int) error { log.Error("Cannot start mining without etherbase", "err", err) return fmt.Errorf("etherbase missing: %v", err) } - if clique, ok := s.engine.(*clique.Clique); ok { + var cli *clique.Clique + if c, ok := s.engine.(*clique.Clique); ok { + cli = c + } else if cl, ok := s.engine.(*beacon.Beacon); ok { + if c, ok := cl.InnerEngine().(*clique.Clique); ok { + cli = c + } + } + if cli != nil { wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) if wallet == nil || err != nil { log.Error("Etherbase account unavailable locally", "err", err) return fmt.Errorf("signer missing: %v", err) } - clique.Authorize(eb, wallet.SignData) + cli.Authorize(eb, wallet.SignData) } if bor, ok := s.engine.(*bor.Bor); ok { wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) @@ -536,8 +544,14 @@ func (s *Ethereum) ChainDb() ethdb.Database { return s.chainDb } func (s *Ethereum) IsListening() bool { return true } // Always listening func (s *Ethereum) Downloader() *downloader.Downloader { return s.handler.downloader } func (s *Ethereum) Synced() bool { return atomic.LoadUint32(&s.handler.acceptTxs) == 1 } +func (s *Ethereum) SetSynced() { atomic.StoreUint32(&s.handler.acceptTxs, 1) } func (s *Ethereum) ArchiveMode() bool { return s.config.NoPruning } func (s *Ethereum) BloomIndexer() *core.ChainIndexer { return s.bloomIndexer } +func (s *Ethereum) Merger() *consensus.Merger { return s.merger } +func (s *Ethereum) SyncMode() downloader.SyncMode { + mode, _ := s.handler.chainSync.modeAndLocalHead() + return mode +} // Protocols returns all the currently configured // network protocols to start. @@ -557,6 +571,9 @@ func (s *Ethereum) Start() error { // Start the bloom bits servicing goroutines s.startBloomHandlers(params.BloomBitsBlocks) + // Regularly update shutdown marker + s.shutdownTracker.Start() + // Figure out a max peers count based on the server limits maxPeers := s.p2pServer.MaxPeers if s.config.LightServ > 0 { @@ -585,7 +602,10 @@ func (s *Ethereum) Stop() error { s.miner.Close() s.blockchain.Stop() s.engine.Close() - rawdb.PopUncleanShutdownMarker(s.chainDb) + + // Clean shutdown marker as the last thing before closing db + s.shutdownTracker.Stop() + s.chainDb.Close() s.eventMux.Stop() diff --git a/eth/catalyst/api.go b/eth/catalyst/api.go index 3913da7572..3c0b6d9e43 100644 --- a/eth/catalyst/api.go +++ b/eth/catalyst/api.go @@ -18,17 +18,23 @@ package catalyst import ( + "crypto/sha256" + "encoding/binary" "errors" "fmt" "math/big" "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/beacon" "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/les" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" chainParams "github.com/ethereum/go-ethereum/params" @@ -36,31 +42,81 @@ import ( "github.com/ethereum/go-ethereum/trie" ) -// Register adds catalyst APIs to the node. +var ( + VALID = GenericStringResponse{"VALID"} + SUCCESS = GenericStringResponse{"SUCCESS"} + INVALID = ForkChoiceResponse{Status: "INVALID", PayloadID: nil} + SYNCING = ForkChoiceResponse{Status: "SYNCING", PayloadID: nil} + GenericServerError = rpc.CustomError{Code: -32000, ValidationError: "Server error"} + UnknownPayload = rpc.CustomError{Code: -32001, ValidationError: "Unknown payload"} + InvalidTB = rpc.CustomError{Code: -32002, ValidationError: "Invalid terminal block"} + InvalidPayloadID = rpc.CustomError{Code: 1, ValidationError: "invalid payload id"} +) + +// Register adds catalyst APIs to the full node. func Register(stack *node.Node, backend *eth.Ethereum) error { - chainconfig := backend.BlockChain().Config() - if chainconfig.TerminalTotalDifficulty == nil { - return errors.New("catalyst started without valid total difficulty") - } + log.Warn("Catalyst mode enabled", "protocol", "eth") + stack.RegisterAPIs([]rpc.API{ + { + Namespace: "engine", + Version: "1.0", + Service: NewConsensusAPI(backend, nil), + Public: true, + }, + }) + return nil +} - log.Warn("Catalyst mode enabled") +// RegisterLight adds catalyst APIs to the light client. +func RegisterLight(stack *node.Node, backend *les.LightEthereum) error { + log.Warn("Catalyst mode enabled", "protocol", "les") stack.RegisterAPIs([]rpc.API{ { - Namespace: "consensus", + Namespace: "engine", Version: "1.0", - Service: newConsensusAPI(backend), + Service: NewConsensusAPI(nil, backend), Public: true, }, }) return nil } -type consensusAPI struct { - eth *eth.Ethereum +type ConsensusAPI struct { + light bool + eth *eth.Ethereum + les *les.LightEthereum + engine consensus.Engine // engine is the post-merge consensus engine, only for block creation + preparedBlocks map[uint64]*ExecutableDataV1 } -func newConsensusAPI(eth *eth.Ethereum) *consensusAPI { - return &consensusAPI{eth: eth} +func NewConsensusAPI(eth *eth.Ethereum, les *les.LightEthereum) *ConsensusAPI { + var engine consensus.Engine + if eth == nil { + if les.BlockChain().Config().TerminalTotalDifficulty == nil { + panic("Catalyst started without valid total difficulty") + } + if b, ok := les.Engine().(*beacon.Beacon); ok { + engine = beacon.New(b.InnerEngine()) + } else { + engine = beacon.New(les.Engine()) + } + } else { + if eth.BlockChain().Config().TerminalTotalDifficulty == nil { + panic("Catalyst started without valid total difficulty") + } + if b, ok := eth.Engine().(*beacon.Beacon); ok { + engine = beacon.New(b.InnerEngine()) + } else { + engine = beacon.New(eth.Engine()) + } + } + return &ConsensusAPI{ + light: eth == nil, + eth: eth, + les: les, + engine: engine, + preparedBlocks: make(map[uint64]*ExecutableDataV1), + } } // blockExecutionEnv gathers all the data required to execute @@ -89,8 +145,24 @@ func (env *blockExecutionEnv) commitTransaction(tx *types.Transaction, coinbase return nil } -func (api *consensusAPI) makeEnv(parent *types.Block, header *types.Header) (*blockExecutionEnv, error) { - state, err := api.eth.BlockChain().StateAt(parent.Root()) +func (api *ConsensusAPI) makeEnv(parent *types.Block, header *types.Header) (*blockExecutionEnv, error) { + // The parent state might be missing. It can be the special scenario + // that consensus layer tries to build a new block based on the very + // old side chain block and the relevant state is already pruned. So + // try to retrieve the live state from the chain, if it's not existent, + // do the necessary recovery work. + var ( + err error + state *state.StateDB + ) + if api.eth.BlockChain().HasState(parent.Root()) { + state, err = api.eth.BlockChain().StateAt(parent.Root()) + } else { + // The maximum acceptable reorg depth can be limited by the + // finalised block somehow. TODO(rjl493456442) fix the hard- + // coded number here later. + state, err = api.eth.StateAtBlock(parent, 1000, nil, false, false) + } if err != nil { return nil, err } @@ -103,57 +175,160 @@ func (api *consensusAPI) makeEnv(parent *types.Block, header *types.Header) (*bl return env, nil } +func (api *ConsensusAPI) GetPayloadV1(payloadID hexutil.Bytes) (*ExecutableDataV1, error) { + hash := []byte(payloadID) + if len(hash) < 8 { + return nil, &InvalidPayloadID + } + id := binary.BigEndian.Uint64(hash[:8]) + data, ok := api.preparedBlocks[id] + if !ok { + return nil, &UnknownPayload + } + return data, nil +} + +func (api *ConsensusAPI) ForkchoiceUpdatedV1(heads ForkchoiceStateV1, PayloadAttributes *PayloadAttributesV1) (ForkChoiceResponse, error) { + if heads.HeadBlockHash == (common.Hash{}) { + return ForkChoiceResponse{Status: SUCCESS.Status, PayloadID: nil}, nil + } + if err := api.checkTerminalTotalDifficulty(heads.HeadBlockHash); err != nil { + if block := api.eth.BlockChain().GetBlockByHash(heads.HeadBlockHash); block == nil { + // TODO (MariusVanDerWijden) trigger sync + return SYNCING, nil + } + return INVALID, err + } + // If the finalized block is set, check if it is in our blockchain + if heads.FinalizedBlockHash != (common.Hash{}) { + if block := api.eth.BlockChain().GetBlockByHash(heads.FinalizedBlockHash); block == nil { + // TODO (MariusVanDerWijden) trigger sync + return SYNCING, nil + } + } + // SetHead + if err := api.setHead(heads.HeadBlockHash); err != nil { + return INVALID, err + } + // Assemble block (if needed) + if PayloadAttributes != nil { + data, err := api.assembleBlock(heads.HeadBlockHash, PayloadAttributes) + if err != nil { + return INVALID, err + } + hash := computePayloadId(heads.HeadBlockHash, PayloadAttributes) + id := binary.BigEndian.Uint64(hash) + api.preparedBlocks[id] = data + log.Info("Created payload", "payloadid", id) + // TODO (MariusVanDerWijden) do something with the payloadID? + hex := hexutil.Bytes(hash) + return ForkChoiceResponse{Status: SUCCESS.Status, PayloadID: &hex}, nil + } + return ForkChoiceResponse{Status: SUCCESS.Status, PayloadID: nil}, nil +} + +func computePayloadId(headBlockHash common.Hash, params *PayloadAttributesV1) []byte { + // Hash + hasher := sha256.New() + hasher.Write(headBlockHash[:]) + binary.Write(hasher, binary.BigEndian, params.Timestamp) + hasher.Write(params.Random[:]) + hasher.Write(params.SuggestedFeeRecipient[:]) + return hasher.Sum([]byte{})[:8] +} + +func (api *ConsensusAPI) invalid() ExecutePayloadResponse { + if api.light { + return ExecutePayloadResponse{Status: INVALID.Status, LatestValidHash: api.les.BlockChain().CurrentHeader().Hash()} + } + return ExecutePayloadResponse{Status: INVALID.Status, LatestValidHash: api.eth.BlockChain().CurrentHeader().Hash()} +} + +// ExecutePayload creates an Eth1 block, inserts it in the chain, and returns the status of the chain. +func (api *ConsensusAPI) ExecutePayloadV1(params ExecutableDataV1) (ExecutePayloadResponse, error) { + block, err := ExecutableDataToBlock(params) + if err != nil { + return api.invalid(), err + } + if api.light { + parent := api.les.BlockChain().GetHeaderByHash(params.ParentHash) + if parent == nil { + return api.invalid(), fmt.Errorf("could not find parent %x", params.ParentHash) + } + if err = api.les.BlockChain().InsertHeader(block.Header()); err != nil { + return api.invalid(), err + } + return ExecutePayloadResponse{Status: VALID.Status, LatestValidHash: block.Hash()}, nil + } + if !api.eth.BlockChain().HasBlock(block.ParentHash(), block.NumberU64()-1) { + /* + TODO (MariusVanDerWijden) reenable once sync is merged + if err := api.eth.Downloader().BeaconSync(api.eth.SyncMode(), block.Header()); err != nil { + return SYNCING, err + } + */ + // TODO (MariusVanDerWijden) we should return nil here not empty hash + return ExecutePayloadResponse{Status: SYNCING.Status, LatestValidHash: common.Hash{}}, nil + } + parent := api.eth.BlockChain().GetBlockByHash(params.ParentHash) + td := api.eth.BlockChain().GetTd(parent.Hash(), block.NumberU64()-1) + ttd := api.eth.BlockChain().Config().TerminalTotalDifficulty + if td.Cmp(ttd) < 0 { + return api.invalid(), fmt.Errorf("can not execute payload on top of block with low td got: %v threshold %v", td, ttd) + } + if err := api.eth.BlockChain().InsertBlockWithoutSetHead(block); err != nil { + return api.invalid(), err + } + + if merger := api.merger(); !merger.TDDReached() { + merger.ReachTTD() + } + return ExecutePayloadResponse{Status: VALID.Status, LatestValidHash: block.Hash()}, nil +} + // AssembleBlock creates a new block, inserts it into the chain, and returns the "execution // data" required for eth2 clients to process the new block. -func (api *consensusAPI) AssembleBlock(params assembleBlockParams) (*executableData, error) { - log.Info("Producing block", "parentHash", params.ParentHash) +func (api *ConsensusAPI) assembleBlock(parentHash common.Hash, params *PayloadAttributesV1) (*ExecutableDataV1, error) { + if api.light { + return nil, errors.New("not supported") + } + log.Info("Producing block", "parentHash", parentHash) bc := api.eth.BlockChain() - parent := bc.GetBlockByHash(params.ParentHash) + parent := bc.GetBlockByHash(parentHash) if parent == nil { - log.Warn("Cannot assemble block with parent hash to unknown block", "parentHash", params.ParentHash) - return nil, fmt.Errorf("cannot assemble block with unknown parent %s", params.ParentHash) + log.Warn("Cannot assemble block with parent hash to unknown block", "parentHash", parentHash) + return nil, fmt.Errorf("cannot assemble block with unknown parent %s", parentHash) } - pool := api.eth.TxPool() - - if parent.Time() >= params.Timestamp { - return nil, fmt.Errorf("child timestamp lower than parent's: %d >= %d", parent.Time(), params.Timestamp) + if params.Timestamp < parent.Time() { + return nil, fmt.Errorf("child timestamp lower than parent's: %d < %d", params.Timestamp, parent.Time()) } if now := uint64(time.Now().Unix()); params.Timestamp > now+1 { - wait := time.Duration(params.Timestamp-now) * time.Second - log.Info("Producing block too far in the future", "wait", common.PrettyDuration(wait)) - time.Sleep(wait) - } - - pending := pool.Pending(true) - - coinbase, err := api.eth.Etherbase() - if err != nil { - return nil, err + diff := time.Duration(params.Timestamp-now) * time.Second + log.Warn("Producing block too far in the future", "diff", common.PrettyDuration(diff)) } + pending := api.eth.TxPool().Pending(true) + coinbase := params.SuggestedFeeRecipient num := parent.Number() header := &types.Header{ ParentHash: parent.Hash(), Number: num.Add(num, common.Big1), Coinbase: coinbase, GasLimit: parent.GasLimit(), // Keep the gas limit constant in this prototype - Extra: []byte{}, + Extra: []byte{}, // TODO (MariusVanDerWijden) properly set extra data Time: params.Timestamp, } if config := api.eth.BlockChain().Config(); config.IsLondon(header.Number) { header.BaseFee = misc.CalcBaseFee(config, parent.Header()) } - err = api.eth.Engine().Prepare(bc, header) - if err != nil { + if err := api.engine.Prepare(bc, header); err != nil { return nil, err } - env, err := api.makeEnv(parent, header) if err != nil { return nil, err } - var ( signer = types.MakeSigner(bc.Config(), header.Number) txHeap = types.NewTransactionsByPriceAndNonce(signer, pending, nil) @@ -204,25 +379,12 @@ func (api *consensusAPI) AssembleBlock(params assembleBlockParams) (*executableD txHeap.Shift() } } - // Create the block. - block, err := api.eth.Engine().FinalizeAndAssemble(bc, header, env.state, transactions, nil /* uncles */, env.receipts) + block, err := api.engine.FinalizeAndAssemble(bc, header, env.state, transactions, nil /* uncles */, env.receipts) if err != nil { return nil, err } - return &executableData{ - BlockHash: block.Hash(), - ParentHash: block.ParentHash(), - Miner: block.Coinbase(), - StateRoot: block.Root(), - Number: block.NumberU64(), - GasLimit: block.GasLimit(), - GasUsed: block.GasUsed(), - Timestamp: block.Time(), - ReceiptRoot: block.ReceiptHash(), - LogsBloom: block.Bloom().Bytes(), - Transactions: encodeTransactions(block.Transactions()), - }, nil + return BlockToExecutableData(block, params.Random), nil } func encodeTransactions(txs []*types.Transaction) [][]byte { @@ -245,66 +407,130 @@ func decodeTransactions(enc [][]byte) ([]*types.Transaction, error) { return txs, nil } -func insertBlockParamsToBlock(config *chainParams.ChainConfig, parent *types.Header, params executableData) (*types.Block, error) { +func ExecutableDataToBlock(params ExecutableDataV1) (*types.Block, error) { txs, err := decodeTransactions(params.Transactions) if err != nil { return nil, err } - + if len(params.ExtraData) > 32 { + return nil, fmt.Errorf("invalid extradata length: %v", len(params.ExtraData)) + } number := big.NewInt(0) number.SetUint64(params.Number) header := &types.Header{ ParentHash: params.ParentHash, UncleHash: types.EmptyUncleHash, - Coinbase: params.Miner, + Coinbase: params.FeeRecipient, Root: params.StateRoot, TxHash: types.DeriveSha(types.Transactions(txs), trie.NewStackTrie(nil)), - ReceiptHash: params.ReceiptRoot, + ReceiptHash: params.ReceiptsRoot, Bloom: types.BytesToBloom(params.LogsBloom), - Difficulty: big.NewInt(1), + Difficulty: common.Big0, Number: number, GasLimit: params.GasLimit, GasUsed: params.GasUsed, Time: params.Timestamp, - } - if config.IsLondon(number) { - header.BaseFee = misc.CalcBaseFee(config, parent) + BaseFee: params.BaseFeePerGas, + Extra: params.ExtraData, + // TODO (MariusVanDerWijden) add params.Random to header once required } block := types.NewBlockWithHeader(header).WithBody(txs, nil /* uncles */) + if block.Hash() != params.BlockHash { + return nil, fmt.Errorf("blockhash mismatch, want %x, got %x", params.BlockHash, block.Hash()) + } return block, nil } -// NewBlock creates an Eth1 block, inserts it in the chain, and either returns true, -// or false + an error. This is a bit redundant for go, but simplifies things on the -// eth2 side. -func (api *consensusAPI) NewBlock(params executableData) (*newBlockResponse, error) { - parent := api.eth.BlockChain().GetBlockByHash(params.ParentHash) - if parent == nil { - return &newBlockResponse{false}, fmt.Errorf("could not find parent %x", params.ParentHash) - } - block, err := insertBlockParamsToBlock(api.eth.BlockChain().Config(), parent.Header(), params) - if err != nil { - return nil, err +func BlockToExecutableData(block *types.Block, random common.Hash) *ExecutableDataV1 { + return &ExecutableDataV1{ + BlockHash: block.Hash(), + ParentHash: block.ParentHash(), + FeeRecipient: block.Coinbase(), + StateRoot: block.Root(), + Number: block.NumberU64(), + GasLimit: block.GasLimit(), + GasUsed: block.GasUsed(), + BaseFeePerGas: block.BaseFee(), + Timestamp: block.Time(), + ReceiptsRoot: block.ReceiptHash(), + LogsBloom: block.Bloom().Bytes(), + Transactions: encodeTransactions(block.Transactions()), + Random: random, + ExtraData: block.Extra(), } - _, err = api.eth.BlockChain().InsertChainWithoutSealVerification(block) - return &newBlockResponse{err == nil}, err } // Used in tests to add a the list of transactions from a block to the tx pool. -func (api *consensusAPI) addBlockTxs(block *types.Block) error { - for _, tx := range block.Transactions() { +func (api *ConsensusAPI) insertTransactions(txs types.Transactions) error { + for _, tx := range txs { api.eth.TxPool().AddLocal(tx) } return nil } -// FinalizeBlock is called to mark a block as synchronized, so -// that data that is no longer needed can be removed. -func (api *consensusAPI) FinalizeBlock(blockHash common.Hash) (*genericResponse, error) { - return &genericResponse{true}, nil +func (api *ConsensusAPI) checkTerminalTotalDifficulty(head common.Hash) error { + // shortcut if we entered PoS already + if api.merger().PoSFinalized() { + return nil + } + // make sure the parent has enough terminal total difficulty + newHeadBlock := api.eth.BlockChain().GetBlockByHash(head) + if newHeadBlock == nil { + return &GenericServerError + } + td := api.eth.BlockChain().GetTd(newHeadBlock.Hash(), newHeadBlock.NumberU64()) + if td != nil && td.Cmp(api.eth.BlockChain().Config().TerminalTotalDifficulty) < 0 { + return &InvalidTB + } + return nil +} + +// setHead is called to perform a force choice. +func (api *ConsensusAPI) setHead(newHead common.Hash) error { + log.Info("Setting head", "head", newHead) + if api.light { + headHeader := api.les.BlockChain().CurrentHeader() + if headHeader.Hash() == newHead { + return nil + } + newHeadHeader := api.les.BlockChain().GetHeaderByHash(newHead) + if newHeadHeader == nil { + return &GenericServerError + } + if err := api.les.BlockChain().SetChainHead(newHeadHeader); err != nil { + return err + } + // Trigger the transition if it's the first `NewHead` event. + merger := api.merger() + if !merger.PoSFinalized() { + merger.FinalizePoS() + } + return nil + } + headBlock := api.eth.BlockChain().CurrentBlock() + if headBlock.Hash() == newHead { + return nil + } + newHeadBlock := api.eth.BlockChain().GetBlockByHash(newHead) + if newHeadBlock == nil { + return &GenericServerError + } + if err := api.eth.BlockChain().SetChainHead(newHeadBlock); err != nil { + return err + } + // Trigger the transition if it's the first `NewHead` event. + if merger := api.merger(); !merger.PoSFinalized() { + merger.FinalizePoS() + } + // TODO (MariusVanDerWijden) are we really synced now? + api.eth.SetSynced() + return nil } -// SetHead is called to perform a force choice. -func (api *consensusAPI) SetHead(newHead common.Hash) (*genericResponse, error) { - return &genericResponse{true}, nil +// Helper function, return the merger instance. +func (api *ConsensusAPI) merger() *consensus.Merger { + if api.light { + return api.les.Merger() + } + return api.eth.Merger() } diff --git a/eth/catalyst/api_test.go b/eth/catalyst/api_test.go index 1104208630..6e52c4fea2 100644 --- a/eth/catalyst/api_test.go +++ b/eth/catalyst/api_test.go @@ -19,7 +19,10 @@ package catalyst import ( "math/big" "testing" + "time" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" @@ -38,10 +41,10 @@ var ( // testAddr is the Ethereum address of the tester account. testAddr = crypto.PubkeyToAddress(testKey.PublicKey) - testBalance = big.NewInt(2e15) + testBalance = big.NewInt(2e18) ) -func generateTestChain() (*core.Genesis, []*types.Block) { +func generatePreMergeChain(n int) (*core.Genesis, []*types.Block) { db := rawdb.NewMemoryDatabase() config := params.AllEthashProtocolChanges genesis := &core.Genesis{ @@ -51,177 +54,280 @@ func generateTestChain() (*core.Genesis, []*types.Block) { Timestamp: 9000, BaseFee: big.NewInt(params.InitialBaseFee), } + testNonce := uint64(0) generate := func(i int, g *core.BlockGen) { g.OffsetTime(5) g.SetExtra([]byte("test")) - } - gblock := genesis.ToBlock(db) - engine := ethash.NewFaker() - blocks, _ := core.GenerateChain(config, gblock, engine, db, 10, generate) - blocks = append([]*types.Block{gblock}, blocks...) - return genesis, blocks -} - -// TODO (MariusVanDerWijden) reenable once engine api is updated to the latest spec -/* -func generateTestChainWithFork(n int, fork int) (*core.Genesis, []*types.Block, []*types.Block) { - if fork >= n { - fork = n - 1 - } - db := rawdb.NewMemoryDatabase() - config := ¶ms.ChainConfig{ - ChainID: big.NewInt(1337), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - MuirGlacierBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), - LondonBlock: big.NewInt(0), - TerminalTotalDifficulty: big.NewInt(0), - Ethash: new(params.EthashConfig), - } - genesis := &core.Genesis{ - Config: config, - Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, - ExtraData: []byte("test genesis"), - Timestamp: 9000, - BaseFee: big.NewInt(params.InitialBaseFee), - } - generate := func(i int, g *core.BlockGen) { - g.OffsetTime(5) - g.SetExtra([]byte("test")) - } - generateFork := func(i int, g *core.BlockGen) { - g.OffsetTime(5) - g.SetExtra([]byte("testF")) + tx, _ := types.SignTx(types.NewTransaction(testNonce, common.HexToAddress("0x9a9070028361F7AAbeB3f2F2Dc07F82C4a98A02a"), big.NewInt(1), params.TxGas, big.NewInt(params.InitialBaseFee*2), nil), types.LatestSigner(config), testKey) + g.AddTx(tx) + testNonce++ } gblock := genesis.ToBlock(db) engine := ethash.NewFaker() blocks, _ := core.GenerateChain(config, gblock, engine, db, n, generate) - blocks = append([]*types.Block{gblock}, blocks...) - forkedBlocks, _ := core.GenerateChain(config, blocks[fork], engine, db, n-fork, generateFork) - return genesis, blocks, forkedBlocks + totalDifficulty := big.NewInt(0) + for _, b := range blocks { + totalDifficulty.Add(totalDifficulty, b.Difficulty()) + } + config.TerminalTotalDifficulty = totalDifficulty + return genesis, blocks } -*/ func TestEth2AssembleBlock(t *testing.T) { - genesis, blocks := generateTestChain() - n, ethservice := startEthService(t, genesis, blocks[1:9]) + genesis, blocks := generatePreMergeChain(10) + n, ethservice := startEthService(t, genesis, blocks) defer n.Close() - api := newConsensusAPI(ethservice) + api := NewConsensusAPI(ethservice, nil) signer := types.NewEIP155Signer(ethservice.BlockChain().Config().ChainID) - tx, err := types.SignTx(types.NewTransaction(0, blocks[8].Coinbase(), big.NewInt(1000), params.TxGas, big.NewInt(params.InitialBaseFee), nil), signer, testKey) + tx, err := types.SignTx(types.NewTransaction(uint64(10), blocks[9].Coinbase(), big.NewInt(1000), params.TxGas, big.NewInt(params.InitialBaseFee), nil), signer, testKey) if err != nil { t.Fatalf("error signing transaction, err=%v", err) } ethservice.TxPool().AddLocal(tx) - blockParams := assembleBlockParams{ - ParentHash: blocks[8].ParentHash(), - Timestamp: blocks[8].Time(), + blockParams := PayloadAttributesV1{ + Timestamp: blocks[9].Time() + 5, } - execData, err := api.AssembleBlock(blockParams) - + execData, err := api.assembleBlock(blocks[9].Hash(), &blockParams) if err != nil { t.Fatalf("error producing block, err=%v", err) } - if len(execData.Transactions) != 1 { t.Fatalf("invalid number of transactions %d != 1", len(execData.Transactions)) } } func TestEth2AssembleBlockWithAnotherBlocksTxs(t *testing.T) { - genesis, blocks := generateTestChain() - n, ethservice := startEthService(t, genesis, blocks[1:9]) + genesis, blocks := generatePreMergeChain(10) + n, ethservice := startEthService(t, genesis, blocks[:9]) defer n.Close() - api := newConsensusAPI(ethservice) + api := NewConsensusAPI(ethservice, nil) // Put the 10th block's tx in the pool and produce a new block - api.addBlockTxs(blocks[9]) - blockParams := assembleBlockParams{ - ParentHash: blocks[9].ParentHash(), - Timestamp: blocks[9].Time(), + api.insertTransactions(blocks[9].Transactions()) + blockParams := PayloadAttributesV1{ + Timestamp: blocks[8].Time() + 5, } - execData, err := api.AssembleBlock(blockParams) + execData, err := api.assembleBlock(blocks[8].Hash(), &blockParams) if err != nil { t.Fatalf("error producing block, err=%v", err) } + if len(execData.Transactions) != blocks[9].Transactions().Len() { + t.Fatalf("invalid number of transactions %d != 1", len(execData.Transactions)) + } +} +func TestSetHeadBeforeTotalDifficulty(t *testing.T) { + genesis, blocks := generatePreMergeChain(10) + n, ethservice := startEthService(t, genesis, blocks) + defer n.Close() + + api := NewConsensusAPI(ethservice, nil) + fcState := ForkchoiceStateV1{ + HeadBlockHash: blocks[5].Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err == nil { + t.Errorf("fork choice updated before total terminal difficulty should fail") + } +} + +func TestEth2PrepareAndGetPayload(t *testing.T) { + genesis, blocks := generatePreMergeChain(10) + // We need to properly set the terminal total difficulty + genesis.Config.TerminalTotalDifficulty.Sub(genesis.Config.TerminalTotalDifficulty, blocks[9].Difficulty()) + n, ethservice := startEthService(t, genesis, blocks[:9]) + defer n.Close() + + api := NewConsensusAPI(ethservice, nil) + + // Put the 10th block's tx in the pool and produce a new block + api.insertTransactions(blocks[9].Transactions()) + blockParams := PayloadAttributesV1{ + Timestamp: blocks[8].Time() + 5, + } + fcState := ForkchoiceStateV1{ + HeadBlockHash: blocks[8].Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + _, err := api.ForkchoiceUpdatedV1(fcState, &blockParams) + if err != nil { + t.Fatalf("error preparing payload, err=%v", err) + } + payloadID := computePayloadId(fcState.HeadBlockHash, &blockParams) + execData, err := api.GetPayloadV1(hexutil.Bytes(payloadID)) + if err != nil { + t.Fatalf("error getting payload, err=%v", err) + } if len(execData.Transactions) != blocks[9].Transactions().Len() { t.Fatalf("invalid number of transactions %d != 1", len(execData.Transactions)) } } -// TODO (MariusVanDerWijden) reenable once engine api is updated to the latest spec -/* +func checkLogEvents(t *testing.T, logsCh <-chan []*types.Log, rmLogsCh <-chan core.RemovedLogsEvent, wantNew, wantRemoved int) { + t.Helper() + + if len(logsCh) != wantNew { + t.Fatalf("wrong number of log events: got %d, want %d", len(logsCh), wantNew) + } + if len(rmLogsCh) != wantRemoved { + t.Fatalf("wrong number of removed log events: got %d, want %d", len(rmLogsCh), wantRemoved) + } + // Drain events. + for i := 0; i < len(logsCh); i++ { + <-logsCh + } + for i := 0; i < len(rmLogsCh); i++ { + <-rmLogsCh + } +} + func TestEth2NewBlock(t *testing.T) { - genesis, blocks, forkedBlocks := generateTestChainWithFork(10, 4) - n, ethservice := startEthService(t, genesis, blocks[1:5]) + genesis, preMergeBlocks := generatePreMergeChain(10) + n, ethservice := startEthService(t, genesis, preMergeBlocks) + ethservice.Merger().ReachTTD() defer n.Close() - api := newConsensusAPI(ethservice) - for i := 5; i < 10; i++ { - p := executableData{ - ParentHash: ethservice.BlockChain().CurrentBlock().Hash(), - Miner: blocks[i].Coinbase(), - StateRoot: blocks[i].Root(), - GasLimit: blocks[i].GasLimit(), - GasUsed: blocks[i].GasUsed(), - Transactions: encodeTransactions(blocks[i].Transactions()), - ReceiptRoot: blocks[i].ReceiptHash(), - LogsBloom: blocks[i].Bloom().Bytes(), - BlockHash: blocks[i].Hash(), - Timestamp: blocks[i].Time(), - Number: uint64(i), - } - success, err := api.NewBlock(p) - if err != nil || !success.Valid { + var ( + api = NewConsensusAPI(ethservice, nil) + parent = preMergeBlocks[len(preMergeBlocks)-1] + + // This EVM code generates a log when the contract is created. + logCode = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") + ) + // The event channels. + newLogCh := make(chan []*types.Log, 10) + rmLogsCh := make(chan core.RemovedLogsEvent, 10) + ethservice.BlockChain().SubscribeLogsEvent(newLogCh) + ethservice.BlockChain().SubscribeRemovedLogsEvent(rmLogsCh) + + for i := 0; i < 10; i++ { + statedb, _ := ethservice.BlockChain().StateAt(parent.Root()) + nonce := statedb.GetNonce(testAddr) + tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey) + ethservice.TxPool().AddLocal(tx) + + execData, err := api.assembleBlock(parent.Hash(), &PayloadAttributesV1{ + Timestamp: parent.Time() + 5, + }) + if err != nil { + t.Fatalf("Failed to create the executable data %v", err) + } + block, err := ExecutableDataToBlock(*execData) + if err != nil { + t.Fatalf("Failed to convert executable data to block %v", err) + } + newResp, err := api.ExecutePayloadV1(*execData) + if err != nil || newResp.Status != "VALID" { + t.Fatalf("Failed to insert block: %v", err) + } + if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64()-1 { + t.Fatalf("Chain head shouldn't be updated") + } + checkLogEvents(t, newLogCh, rmLogsCh, 0, 0) + fcState := ForkchoiceStateV1{ + HeadBlockHash: block.Hash(), + SafeBlockHash: block.Hash(), + FinalizedBlockHash: block.Hash(), + } + if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil { t.Fatalf("Failed to insert block: %v", err) } + if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64() { + t.Fatalf("Chain head should be updated") + } + checkLogEvents(t, newLogCh, rmLogsCh, 1, 0) + + parent = block } - exp := ethservice.BlockChain().CurrentBlock().Hash() - - // Introduce the fork point. - lastBlockNum := blocks[4].Number() - lastBlock := blocks[4] - for i := 0; i < 4; i++ { - lastBlockNum.Add(lastBlockNum, big.NewInt(1)) - p := executableData{ - ParentHash: lastBlock.Hash(), - Miner: forkedBlocks[i].Coinbase(), - StateRoot: forkedBlocks[i].Root(), - Number: lastBlockNum.Uint64(), - GasLimit: forkedBlocks[i].GasLimit(), - GasUsed: forkedBlocks[i].GasUsed(), - Transactions: encodeTransactions(blocks[i].Transactions()), - ReceiptRoot: forkedBlocks[i].ReceiptHash(), - LogsBloom: forkedBlocks[i].Bloom().Bytes(), - BlockHash: forkedBlocks[i].Hash(), - Timestamp: forkedBlocks[i].Time(), - } - success, err := api.NewBlock(p) - if err != nil || !success.Valid { - t.Fatalf("Failed to insert forked block #%d: %v", i, err) - } - lastBlock, err = insertBlockParamsToBlock(ethservice.BlockChain().Config(), lastBlock.Header(), p) + // Introduce fork chain + var ( + head = ethservice.BlockChain().CurrentBlock().NumberU64() + ) + parent = preMergeBlocks[len(preMergeBlocks)-1] + for i := 0; i < 10; i++ { + execData, err := api.assembleBlock(parent.Hash(), &PayloadAttributesV1{ + Timestamp: parent.Time() + 6, + }) if err != nil { - t.Fatal(err) + t.Fatalf("Failed to create the executable data %v", err) + } + block, err := ExecutableDataToBlock(*execData) + if err != nil { + t.Fatalf("Failed to convert executable data to block %v", err) + } + newResp, err := api.ExecutePayloadV1(*execData) + if err != nil || newResp.Status != "VALID" { + t.Fatalf("Failed to insert block: %v", err) + } + if ethservice.BlockChain().CurrentBlock().NumberU64() != head { + t.Fatalf("Chain head shouldn't be updated") } - } - if ethservice.BlockChain().CurrentBlock().Hash() != exp { - t.Fatalf("Wrong head after inserting fork %x != %x", exp, ethservice.BlockChain().CurrentBlock().Hash()) + fcState := ForkchoiceStateV1{ + HeadBlockHash: block.Hash(), + SafeBlockHash: block.Hash(), + FinalizedBlockHash: block.Hash(), + } + if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil { + t.Fatalf("Failed to insert block: %v", err) + } + if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64() { + t.Fatalf("Chain head should be updated") + } + parent, head = block, block.NumberU64() } } -*/ + +func TestEth2DeepReorg(t *testing.T) { + // TODO (MariusVanDerWijden) TestEth2DeepReorg is currently broken, because it tries to reorg + // before the totalTerminalDifficulty threshold + /* + genesis, preMergeBlocks := generatePreMergeChain(core.TriesInMemory * 2) + n, ethservice := startEthService(t, genesis, preMergeBlocks) + defer n.Close() + + var ( + api = NewConsensusAPI(ethservice, nil) + parent = preMergeBlocks[len(preMergeBlocks)-core.TriesInMemory-1] + head = ethservice.BlockChain().CurrentBlock().NumberU64() + ) + if ethservice.BlockChain().HasBlockAndState(parent.Hash(), parent.NumberU64()) { + t.Errorf("Block %d not pruned", parent.NumberU64()) + } + for i := 0; i < 10; i++ { + execData, err := api.assembleBlock(AssembleBlockParams{ + ParentHash: parent.Hash(), + Timestamp: parent.Time() + 5, + }) + if err != nil { + t.Fatalf("Failed to create the executable data %v", err) + } + block, err := ExecutableDataToBlock(ethservice.BlockChain().Config(), parent.Header(), *execData) + if err != nil { + t.Fatalf("Failed to convert executable data to block %v", err) + } + newResp, err := api.ExecutePayload(*execData) + if err != nil || newResp.Status != "VALID" { + t.Fatalf("Failed to insert block: %v", err) + } + if ethservice.BlockChain().CurrentBlock().NumberU64() != head { + t.Fatalf("Chain head shouldn't be updated") + } + if err := api.setHead(block.Hash()); err != nil { + t.Fatalf("Failed to set head: %v", err) + } + if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64() { + t.Fatalf("Chain head should be updated") + } + parent, head = block, block.NumberU64() + } + */ +} // startEthService creates a full node instance for testing. func startEthService(t *testing.T, genesis *core.Genesis, blocks []*types.Block) (*node.Node, *eth.Ethereum) { @@ -232,7 +338,7 @@ func startEthService(t *testing.T, genesis *core.Genesis, blocks []*types.Block) t.Fatal("can't create node:", err) } - ethcfg := ðconfig.Config{Genesis: genesis, Ethash: ethash.Config{PowMode: ethash.ModeFake}} + ethcfg := ðconfig.Config{Genesis: genesis, Ethash: ethash.Config{PowMode: ethash.ModeFake}, TrieTimeout: time.Minute, TrieDirtyCache: 256, TrieCleanCache: 256} ethservice, err := eth.New(n, ethcfg) if err != nil { t.Fatal("can't create eth service:", err) @@ -245,6 +351,69 @@ func startEthService(t *testing.T, genesis *core.Genesis, blocks []*types.Block) t.Fatal("can't import test blocks:", err) } ethservice.SetEtherbase(testAddr) + ethservice.SetSynced() return n, ethservice } + +func TestFullAPI(t *testing.T) { + genesis, preMergeBlocks := generatePreMergeChain(10) + n, ethservice := startEthService(t, genesis, preMergeBlocks) + ethservice.Merger().ReachTTD() + defer n.Close() + var ( + api = NewConsensusAPI(ethservice, nil) + parent = ethservice.BlockChain().CurrentBlock() + // This EVM code generates a log when the contract is created. + logCode = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") + ) + for i := 0; i < 10; i++ { + statedb, _ := ethservice.BlockChain().StateAt(parent.Root()) + nonce := statedb.GetNonce(testAddr) + tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey) + ethservice.TxPool().AddLocal(tx) + + params := PayloadAttributesV1{ + Timestamp: parent.Time() + 1, + Random: crypto.Keccak256Hash([]byte{byte(i)}), + SuggestedFeeRecipient: parent.Coinbase(), + } + fcState := ForkchoiceStateV1{ + HeadBlockHash: parent.Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + resp, err := api.ForkchoiceUpdatedV1(fcState, ¶ms) + if err != nil { + t.Fatalf("error preparing payload, err=%v", err) + } + if resp.Status != SUCCESS.Status { + t.Fatalf("error preparing payload, invalid status: %v", resp.Status) + } + payloadID := computePayloadId(parent.Hash(), ¶ms) + payload, err := api.GetPayloadV1(hexutil.Bytes(payloadID)) + if err != nil { + t.Fatalf("can't get payload: %v", err) + } + execResp, err := api.ExecutePayloadV1(*payload) + if err != nil { + t.Fatalf("can't execute payload: %v", err) + } + if execResp.Status != VALID.Status { + t.Fatalf("invalid status: %v", execResp.Status) + } + fcState = ForkchoiceStateV1{ + HeadBlockHash: payload.BlockHash, + SafeBlockHash: payload.ParentHash, + FinalizedBlockHash: payload.ParentHash, + } + if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil { + t.Fatalf("Failed to insert block: %v", err) + } + if ethservice.BlockChain().CurrentBlock().NumberU64() != payload.Number { + t.Fatalf("Chain head should be updated") + } + parent = ethservice.BlockChain().CurrentBlock() + + } +} diff --git a/eth/catalyst/api_types.go b/eth/catalyst/api_types.go index d5d351a991..1f6703030a 100644 --- a/eth/catalyst/api_types.go +++ b/eth/catalyst/api_types.go @@ -17,54 +17,98 @@ package catalyst import ( + "math/big" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ) -//go:generate go run github.com/fjl/gencodec -type assembleBlockParams -field-override assembleBlockParamsMarshaling -out gen_blockparams.go +//go:generate go run github.com/fjl/gencodec -type PayloadAttributesV1 -field-override payloadAttributesMarshaling -out gen_blockparams.go -// Structure described at https://hackmd.io/T9x2mMA4S7us8tJwEB3FDQ -type assembleBlockParams struct { - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - Timestamp uint64 `json:"timestamp" gencodec:"required"` +// Structure described at https://github.com/ethereum/execution-apis/pull/74 +type PayloadAttributesV1 struct { + Timestamp uint64 `json:"timestamp" gencodec:"required"` + Random common.Hash `json:"random" gencodec:"required"` + SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` } -// JSON type overrides for assembleBlockParams. -type assembleBlockParamsMarshaling struct { +// JSON type overrides for PayloadAttributesV1. +type payloadAttributesMarshaling struct { Timestamp hexutil.Uint64 } -//go:generate go run github.com/fjl/gencodec -type executableData -field-override executableDataMarshaling -out gen_ed.go - -// Structure described at https://notes.ethereum.org/@n0ble/rayonism-the-merge-spec#Parameters1 -type executableData struct { - BlockHash common.Hash `json:"blockHash" gencodec:"required"` - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - Miner common.Address `json:"miner" gencodec:"required"` - StateRoot common.Hash `json:"stateRoot" gencodec:"required"` - Number uint64 `json:"number" gencodec:"required"` - GasLimit uint64 `json:"gasLimit" gencodec:"required"` - GasUsed uint64 `json:"gasUsed" gencodec:"required"` - Timestamp uint64 `json:"timestamp" gencodec:"required"` - ReceiptRoot common.Hash `json:"receiptsRoot" gencodec:"required"` - LogsBloom []byte `json:"logsBloom" gencodec:"required"` - Transactions [][]byte `json:"transactions" gencodec:"required"` +//go:generate go run github.com/fjl/gencodec -type ExecutableDataV1 -field-override executableDataMarshaling -out gen_ed.go + +// Structure described at https://github.com/ethereum/execution-apis/src/engine/specification.md +type ExecutableDataV1 struct { + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom []byte `json:"logsBloom" gencodec:"required"` + Random common.Hash `json:"random" gencodec:"required"` + Number uint64 `json:"blockNumber" gencodec:"required"` + GasLimit uint64 `json:"gasLimit" gencodec:"required"` + GasUsed uint64 `json:"gasUsed" gencodec:"required"` + Timestamp uint64 `json:"timestamp" gencodec:"required"` + ExtraData []byte `json:"extraData" gencodec:"required"` + BaseFeePerGas *big.Int `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions [][]byte `json:"transactions" gencodec:"required"` } // JSON type overrides for executableData. type executableDataMarshaling struct { - Number hexutil.Uint64 - GasLimit hexutil.Uint64 - GasUsed hexutil.Uint64 - Timestamp hexutil.Uint64 - LogsBloom hexutil.Bytes - Transactions []hexutil.Bytes + Number hexutil.Uint64 + GasLimit hexutil.Uint64 + GasUsed hexutil.Uint64 + Timestamp hexutil.Uint64 + BaseFeePerGas *hexutil.Big + ExtraData hexutil.Bytes + LogsBloom hexutil.Bytes + Transactions []hexutil.Bytes +} + +//go:generate go run github.com/fjl/gencodec -type PayloadResponse -field-override payloadResponseMarshaling -out gen_payload.go + +type PayloadResponse struct { + PayloadID uint64 `json:"payloadId"` } -type newBlockResponse struct { +// JSON type overrides for payloadResponse. +type payloadResponseMarshaling struct { + PayloadID hexutil.Uint64 +} + +type NewBlockResponse struct { Valid bool `json:"valid"` } -type genericResponse struct { +type GenericResponse struct { Success bool `json:"success"` } + +type GenericStringResponse struct { + Status string `json:"status"` +} + +type ExecutePayloadResponse struct { + Status string `json:"status"` + LatestValidHash common.Hash `json:"latestValidHash"` +} + +type ConsensusValidatedParams struct { + BlockHash common.Hash `json:"blockHash"` + Status string `json:"status"` +} + +type ForkChoiceResponse struct { + Status string `json:"status"` + PayloadID *hexutil.Bytes `json:"payloadId"` +} + +type ForkchoiceStateV1 struct { + HeadBlockHash common.Hash `json:"headBlockHash"` + SafeBlockHash common.Hash `json:"safeBlockHash"` + FinalizedBlockHash common.Hash `json:"finalizedBlockHash"` +} diff --git a/eth/catalyst/gen_blockparams.go b/eth/catalyst/gen_blockparams.go index a9a08ec3a8..ccf5c327ff 100644 --- a/eth/catalyst/gen_blockparams.go +++ b/eth/catalyst/gen_blockparams.go @@ -10,37 +10,44 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ) -var _ = (*assembleBlockParamsMarshaling)(nil) +var _ = (*payloadAttributesMarshaling)(nil) // MarshalJSON marshals as JSON. -func (a assembleBlockParams) MarshalJSON() ([]byte, error) { - type assembleBlockParams struct { - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` +func (p PayloadAttributesV1) MarshalJSON() ([]byte, error) { + type PayloadAttributesV1 struct { + Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` + Random common.Hash `json:"random" gencodec:"required"` + SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` } - var enc assembleBlockParams - enc.ParentHash = a.ParentHash - enc.Timestamp = hexutil.Uint64(a.Timestamp) + var enc PayloadAttributesV1 + enc.Timestamp = hexutil.Uint64(p.Timestamp) + enc.Random = p.Random + enc.SuggestedFeeRecipient = p.SuggestedFeeRecipient return json.Marshal(&enc) } // UnmarshalJSON unmarshals from JSON. -func (a *assembleBlockParams) UnmarshalJSON(input []byte) error { - type assembleBlockParams struct { - ParentHash *common.Hash `json:"parentHash" gencodec:"required"` - Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` +func (p *PayloadAttributesV1) UnmarshalJSON(input []byte) error { + type PayloadAttributesV1 struct { + Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` + Random *common.Hash `json:"random" gencodec:"required"` + SuggestedFeeRecipient *common.Address `json:"suggestedFeeRecipient" gencodec:"required"` } - var dec assembleBlockParams + var dec PayloadAttributesV1 if err := json.Unmarshal(input, &dec); err != nil { return err } - if dec.ParentHash == nil { - return errors.New("missing required field 'parentHash' for assembleBlockParams") - } - a.ParentHash = *dec.ParentHash if dec.Timestamp == nil { - return errors.New("missing required field 'timestamp' for assembleBlockParams") + return errors.New("missing required field 'timestamp' for PayloadAttributesV1") + } + p.Timestamp = uint64(*dec.Timestamp) + if dec.Random == nil { + return errors.New("missing required field 'random' for PayloadAttributesV1") + } + p.Random = *dec.Random + if dec.SuggestedFeeRecipient == nil { + return errors.New("missing required field 'suggestedFeeRecipient' for PayloadAttributesV1") } - a.Timestamp = uint64(*dec.Timestamp) + p.SuggestedFeeRecipient = *dec.SuggestedFeeRecipient return nil } diff --git a/eth/catalyst/gen_ed.go b/eth/catalyst/gen_ed.go index 4c2e4c8ead..46eb45808b 100644 --- a/eth/catalyst/gen_ed.go +++ b/eth/catalyst/gen_ed.go @@ -5,6 +5,7 @@ package catalyst import ( "encoding/json" "errors" + "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -13,31 +14,37 @@ import ( var _ = (*executableDataMarshaling)(nil) // MarshalJSON marshals as JSON. -func (e executableData) MarshalJSON() ([]byte, error) { - type executableData struct { - BlockHash common.Hash `json:"blockHash" gencodec:"required"` - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - Miner common.Address `json:"miner" gencodec:"required"` - StateRoot common.Hash `json:"stateRoot" gencodec:"required"` - Number hexutil.Uint64 `json:"number" gencodec:"required"` - GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` - GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` - Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` - ReceiptRoot common.Hash `json:"receiptsRoot" gencodec:"required"` - LogsBloom hexutil.Bytes `json:"logsBloom" gencodec:"required"` - Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` - } - var enc executableData - enc.BlockHash = e.BlockHash +func (e ExecutableDataV1) MarshalJSON() ([]byte, error) { + type ExecutableDataV1 struct { + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom hexutil.Bytes `json:"logsBloom" gencodec:"required"` + Random common.Hash `json:"random" gencodec:"required"` + Number hexutil.Uint64 `json:"blockNumber" gencodec:"required"` + GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` + GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` + ExtraData hexutil.Bytes `json:"extraData" gencodec:"required"` + BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` + } + var enc ExecutableDataV1 enc.ParentHash = e.ParentHash - enc.Miner = e.Miner + enc.FeeRecipient = e.FeeRecipient enc.StateRoot = e.StateRoot + enc.ReceiptsRoot = e.ReceiptsRoot + enc.LogsBloom = e.LogsBloom + enc.Random = e.Random enc.Number = hexutil.Uint64(e.Number) enc.GasLimit = hexutil.Uint64(e.GasLimit) enc.GasUsed = hexutil.Uint64(e.GasUsed) enc.Timestamp = hexutil.Uint64(e.Timestamp) - enc.ReceiptRoot = e.ReceiptRoot - enc.LogsBloom = e.LogsBloom + enc.ExtraData = e.ExtraData + enc.BaseFeePerGas = (*hexutil.Big)(e.BaseFeePerGas) + enc.BlockHash = e.BlockHash if e.Transactions != nil { enc.Transactions = make([]hexutil.Bytes, len(e.Transactions)) for k, v := range e.Transactions { @@ -48,66 +55,81 @@ func (e executableData) MarshalJSON() ([]byte, error) { } // UnmarshalJSON unmarshals from JSON. -func (e *executableData) UnmarshalJSON(input []byte) error { - type executableData struct { - BlockHash *common.Hash `json:"blockHash" gencodec:"required"` - ParentHash *common.Hash `json:"parentHash" gencodec:"required"` - Miner *common.Address `json:"miner" gencodec:"required"` - StateRoot *common.Hash `json:"stateRoot" gencodec:"required"` - Number *hexutil.Uint64 `json:"number" gencodec:"required"` - GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` - GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` - Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` - ReceiptRoot *common.Hash `json:"receiptsRoot" gencodec:"required"` - LogsBloom *hexutil.Bytes `json:"logsBloom" gencodec:"required"` - Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` - } - var dec executableData +func (e *ExecutableDataV1) UnmarshalJSON(input []byte) error { + type ExecutableDataV1 struct { + ParentHash *common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient *common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot *common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot *common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom *hexutil.Bytes `json:"logsBloom" gencodec:"required"` + Random *common.Hash `json:"random" gencodec:"required"` + Number *hexutil.Uint64 `json:"blockNumber" gencodec:"required"` + GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` + GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` + ExtraData *hexutil.Bytes `json:"extraData" gencodec:"required"` + BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` + BlockHash *common.Hash `json:"blockHash" gencodec:"required"` + Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` + } + var dec ExecutableDataV1 if err := json.Unmarshal(input, &dec); err != nil { return err } - if dec.BlockHash == nil { - return errors.New("missing required field 'blockHash' for executableData") - } - e.BlockHash = *dec.BlockHash if dec.ParentHash == nil { - return errors.New("missing required field 'parentHash' for executableData") + return errors.New("missing required field 'parentHash' for ExecutableDataV1") } e.ParentHash = *dec.ParentHash - if dec.Miner == nil { - return errors.New("missing required field 'miner' for executableData") + if dec.FeeRecipient == nil { + return errors.New("missing required field 'feeRecipient' for ExecutableDataV1") } - e.Miner = *dec.Miner + e.FeeRecipient = *dec.FeeRecipient if dec.StateRoot == nil { - return errors.New("missing required field 'stateRoot' for executableData") + return errors.New("missing required field 'stateRoot' for ExecutableDataV1") } e.StateRoot = *dec.StateRoot + if dec.ReceiptsRoot == nil { + return errors.New("missing required field 'receiptsRoot' for ExecutableDataV1") + } + e.ReceiptsRoot = *dec.ReceiptsRoot + if dec.LogsBloom == nil { + return errors.New("missing required field 'logsBloom' for ExecutableDataV1") + } + e.LogsBloom = *dec.LogsBloom + if dec.Random == nil { + return errors.New("missing required field 'random' for ExecutableDataV1") + } + e.Random = *dec.Random if dec.Number == nil { - return errors.New("missing required field 'number' for executableData") + return errors.New("missing required field 'blockNumber' for ExecutableDataV1") } e.Number = uint64(*dec.Number) if dec.GasLimit == nil { - return errors.New("missing required field 'gasLimit' for executableData") + return errors.New("missing required field 'gasLimit' for ExecutableDataV1") } e.GasLimit = uint64(*dec.GasLimit) if dec.GasUsed == nil { - return errors.New("missing required field 'gasUsed' for executableData") + return errors.New("missing required field 'gasUsed' for ExecutableDataV1") } e.GasUsed = uint64(*dec.GasUsed) if dec.Timestamp == nil { - return errors.New("missing required field 'timestamp' for executableData") + return errors.New("missing required field 'timestamp' for ExecutableDataV1") } e.Timestamp = uint64(*dec.Timestamp) - if dec.ReceiptRoot == nil { - return errors.New("missing required field 'receiptsRoot' for executableData") + if dec.ExtraData == nil { + return errors.New("missing required field 'extraData' for ExecutableDataV1") } - e.ReceiptRoot = *dec.ReceiptRoot - if dec.LogsBloom == nil { - return errors.New("missing required field 'logsBloom' for executableData") + e.ExtraData = *dec.ExtraData + if dec.BaseFeePerGas == nil { + return errors.New("missing required field 'baseFeePerGas' for ExecutableDataV1") } - e.LogsBloom = *dec.LogsBloom + e.BaseFeePerGas = (*big.Int)(dec.BaseFeePerGas) + if dec.BlockHash == nil { + return errors.New("missing required field 'blockHash' for ExecutableDataV1") + } + e.BlockHash = *dec.BlockHash if dec.Transactions == nil { - return errors.New("missing required field 'transactions' for executableData") + return errors.New("missing required field 'transactions' for ExecutableDataV1") } e.Transactions = make([][]byte, len(dec.Transactions)) for k, v := range dec.Transactions { diff --git a/eth/catalyst/gen_payload.go b/eth/catalyst/gen_payload.go new file mode 100644 index 0000000000..a0b00fcfd8 --- /dev/null +++ b/eth/catalyst/gen_payload.go @@ -0,0 +1,36 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package catalyst + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*payloadResponseMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (p PayloadResponse) MarshalJSON() ([]byte, error) { + type PayloadResponse struct { + PayloadID hexutil.Uint64 `json:"payloadId"` + } + var enc PayloadResponse + enc.PayloadID = hexutil.Uint64(p.PayloadID) + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (p *PayloadResponse) UnmarshalJSON(input []byte) error { + type PayloadResponse struct { + PayloadID *hexutil.Uint64 `json:"payloadId"` + } + var dec PayloadResponse + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.PayloadID != nil { + p.PayloadID = uint64(*dec.PayloadID) + } + return nil +} diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index fcd94b366d..cd399be7b0 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -35,9 +35,7 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" ) var ( @@ -45,7 +43,6 @@ var ( MaxHeaderFetch = 192 // Amount of block headers to be fetched per retrieval request MaxSkeletonSize = 128 // Number of header fetches to need for a skeleton assembly MaxReceiptFetch = 256 // Amount of transaction receipts to allow fetching per request - MaxStateFetch = 384 // Amount of node state values to allow fetching per request maxQueuedHeaders = 32 * 1024 // [eth/62] Maximum number of headers to queue for import (DOS protection) maxHeadersProcess = 2048 // Number of header download results to import at once into the chain @@ -56,11 +53,11 @@ var ( reorgProtThreshold = 48 // Threshold number of recent blocks to disable mini reorg protection reorgProtHeaderDelay = 2 // Number of headers to delay delivering to cover mini reorgs - fsHeaderCheckFrequency = 100 // Verification frequency of the downloaded headers during fast sync + fsHeaderCheckFrequency = 100 // Verification frequency of the downloaded headers during snap sync fsHeaderSafetyNet = 2048 // Number of headers to discard in case a chain violation is detected fsHeaderForceVerify = 24 // Number of headers to verify before and after the pivot to accept it fsHeaderContCheck = 3 * time.Second // Time interval to check for header continuations during state download - fsMinFullBlocks = 64 // Number of blocks to retrieve fully even in fast sync + fsMinFullBlocks = 64 // Number of blocks to retrieve fully even in snap sync ) var ( @@ -80,27 +77,34 @@ var ( errCancelStateFetch = errors.New("state data download canceled (requested)") errCancelContentProcessing = errors.New("content processing canceled (requested)") errCanceled = errors.New("syncing canceled (requested)") - errNoSyncActive = errors.New("no sync active") errTooOld = errors.New("peer's protocol version too old") errNoAncestorFound = errors.New("no common ancestor found") ) +// peerDropFn is a callback type for dropping a peer detected as malicious. +type peerDropFn func(id string) + +// headerTask is a set of downloaded headers to queue along with their precomputed +// hashes to avoid constant rehashing. +type headerTask struct { + headers []*types.Header + hashes []common.Hash +} + type Downloader struct { mode uint32 // Synchronisation mode defining the strategy used (per sync cycle), use d.getMode() to get the SyncMode mux *event.TypeMux // Event multiplexer to announce sync operation events - checkpoint uint64 // Checkpoint block number to enforce head against (e.g. fast sync) + checkpoint uint64 // Checkpoint block number to enforce head against (e.g. snap sync) genesis uint64 // Genesis block number to limit sync to (e.g. light client CHT) queue *queue // Scheduler for selecting the hashes to download peers *peerSet // Set of active peers from which download can proceed - stateDB ethdb.Database // Database to state sync into (and deduplicate via) - stateBloom *trie.SyncBloom // Bloom filter for fast trie node and contract code existence checks + stateDB ethdb.Database // Database to state sync into (and deduplicate via) // Statistics - syncStatsChainOrigin uint64 // Origin block number where syncing started at - syncStatsChainHeight uint64 // Highest block number known when syncing started - syncStatsState stateSyncStats + syncStatsChainOrigin uint64 // Origin block number where syncing started at + syncStatsChainHeight uint64 // Highest block number known when syncing started syncStatsLock sync.RWMutex // Lock protecting the sync stats fields lightchain LightChain @@ -117,12 +121,7 @@ type Downloader struct { ancientLimit uint64 // The maximum block number which can be regarded as ancient data. // Channels - headerCh chan dataPack // Channel receiving inbound block headers - bodyCh chan dataPack // Channel receiving inbound block bodies - receiptCh chan dataPack // Channel receiving inbound receipts - bodyWakeCh chan bool // Channel to signal the block body fetcher of new tasks - receiptWakeCh chan bool // Channel to signal the receipt fetcher of new tasks - headerProcCh chan []*types.Header // Channel to feed the header processor new tasks + headerProcCh chan *headerTask // Channel to feed the header processor new tasks // State sync pivotHeader *types.Header // Pivot block header to dynamically push the syncing state root @@ -131,8 +130,6 @@ type Downloader struct { snapSync bool // Whether to run state sync over the snap protocol SnapSyncer *snap.Syncer // TODO(karalabe): make private! hack for now stateSyncStart chan *stateSync - trackStateReq chan *stateReq - stateCh chan dataPack // Channel receiving inbound node state data // Cancellation and termination cancelPeer string // Identifier of the peer currently being used as the master (cancel on drop) @@ -171,14 +168,14 @@ type LightChain interface { SetHead(uint64) error } -// BlockChain encapsulates functions required to sync a (full or fast) blockchain. +// BlockChain encapsulates functions required to sync a (full or snap) blockchain. type BlockChain interface { LightChain // HasBlock verifies a block's presence in the local chain. HasBlock(common.Hash, uint64) bool - // HasFastBlock verifies a fast block's presence in the local chain. + // HasFastBlock verifies a snap block's presence in the local chain. HasFastBlock(common.Hash, uint64) bool // GetBlockByHash retrieves a block from the local chain. @@ -187,11 +184,11 @@ type BlockChain interface { // CurrentBlock retrieves the head block from the local chain. CurrentBlock() *types.Block - // CurrentFastBlock retrieves the head fast block from the local chain. + // CurrentFastBlock retrieves the head snap block from the local chain. CurrentFastBlock() *types.Block - // FastSyncCommitHead directly commits the head block to a certain entity. - FastSyncCommitHead(common.Hash) error + // SnapSyncCommitHead directly commits the head block to a certain entity. + SnapSyncCommitHead(common.Hash) error // InsertChain inserts a batch of blocks into the local chain. InsertChain(types.Blocks) (int, error) @@ -204,13 +201,12 @@ type BlockChain interface { } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(checkpoint uint64, stateDb ethdb.Database, stateBloom *trie.SyncBloom, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { +func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { if lightchain == nil { lightchain = chain } dl := &Downloader{ stateDB: stateDb, - stateBloom: stateBloom, mux: mux, checkpoint: checkpoint, queue: newQueue(blockCacheMaxItems, blockCacheInitialItems), @@ -218,20 +214,10 @@ func New(checkpoint uint64, stateDb ethdb.Database, stateBloom *trie.SyncBloom, blockchain: chain, lightchain: lightchain, dropPeer: dropPeer, - headerCh: make(chan dataPack, 1), - bodyCh: make(chan dataPack, 1), - receiptCh: make(chan dataPack, 1), - bodyWakeCh: make(chan bool, 1), - receiptWakeCh: make(chan bool, 1), - headerProcCh: make(chan []*types.Header, 1), + headerProcCh: make(chan *headerTask, 1), quitCh: make(chan struct{}), - stateCh: make(chan dataPack), SnapSyncer: snap.NewSyncer(stateDb), stateSyncStart: make(chan *stateSync), - syncStatsState: stateSyncStats{ - processed: rawdb.ReadFastTrieProgress(stateDb), - }, - trackStateReq: make(chan *stateReq), } go dl.stateFetcher() return dl @@ -241,7 +227,7 @@ func New(checkpoint uint64, stateDb ethdb.Database, stateBloom *trie.SyncBloom, // block where synchronisation started at (may have failed/suspended); the block // or header sync is currently at; and the latest known block which the sync targets. // -// In addition, during the state download phase of fast synchronisation the number +// In addition, during the state download phase of snap synchronisation the number // of processed and the total number of known states are also returned. Otherwise // these are zero. func (d *Downloader) Progress() ethereum.SyncProgress { @@ -254,19 +240,31 @@ func (d *Downloader) Progress() ethereum.SyncProgress { switch { case d.blockchain != nil && mode == FullSync: current = d.blockchain.CurrentBlock().NumberU64() - case d.blockchain != nil && mode == FastSync: + case d.blockchain != nil && mode == SnapSync: current = d.blockchain.CurrentFastBlock().NumberU64() case d.lightchain != nil: current = d.lightchain.CurrentHeader().Number.Uint64() default: log.Error("Unknown downloader chain/mode combo", "light", d.lightchain != nil, "full", d.blockchain != nil, "mode", mode) } + progress, pending := d.SnapSyncer.Progress() + return ethereum.SyncProgress{ - StartingBlock: d.syncStatsChainOrigin, - CurrentBlock: current, - HighestBlock: d.syncStatsChainHeight, - PulledStates: d.syncStatsState.processed, - KnownStates: d.syncStatsState.processed + d.syncStatsState.pending, + StartingBlock: d.syncStatsChainOrigin, + CurrentBlock: current, + HighestBlock: d.syncStatsChainHeight, + SyncedAccounts: progress.AccountSynced, + SyncedAccountBytes: uint64(progress.AccountBytes), + SyncedBytecodes: progress.BytecodeSynced, + SyncedBytecodeBytes: uint64(progress.BytecodeBytes), + SyncedStorage: progress.StorageSynced, + SyncedStorageBytes: uint64(progress.StorageBytes), + HealedTrienodes: progress.TrienodeHealSynced, + HealedTrienodeBytes: uint64(progress.TrienodeHealBytes), + HealedBytecodes: progress.BytecodeHealSynced, + HealedBytecodeBytes: uint64(progress.BytecodeHealBytes), + HealingTrienodes: pending.TrienodeHeal, + HealingBytecode: pending.BytecodeHeal, } } @@ -364,47 +362,27 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode if atomic.CompareAndSwapInt32(&d.notified, 0, 1) { log.Info("Block synchronisation started") } - // If we are already full syncing, but have a fast-sync bloom filter laying - // around, make sure it doesn't use memory any more. This is a special case - // when the user attempts to fast sync a new empty network. - if mode == FullSync && d.stateBloom != nil { - d.stateBloom.Close() - } - // If snap sync was requested, create the snap scheduler and switch to fast - // sync mode. Long term we could drop fast sync or merge the two together, + // If snap sync was requested, create the snap scheduler and switch to snap + // sync mode. Long term we could drop snap sync or merge the two together, // but until snap becomes prevalent, we should support both. TODO(karalabe). if mode == SnapSync { - if !d.snapSync { - // Snap sync uses the snapshot namespace to store potentially flakey data until - // sync completely heals and finishes. Pause snapshot maintenance in the mean - // time to prevent access. - if snapshots := d.blockchain.Snapshots(); snapshots != nil { // Only nil in tests - snapshots.Disable() - } - log.Warn("Enabling snapshot sync prototype") - d.snapSync = true + // Snap sync uses the snapshot namespace to store potentially flakey data until + // sync completely heals and finishes. Pause snapshot maintenance in the mean- + // time to prevent access. + if snapshots := d.blockchain.Snapshots(); snapshots != nil { // Only nil in tests + snapshots.Disable() } - mode = FastSync } // Reset the queue, peer set and wake channels to clean any internal leftover state d.queue.Reset(blockCacheMaxItems, blockCacheInitialItems) d.peers.Reset() - for _, ch := range []chan bool{d.bodyWakeCh, d.receiptWakeCh} { + for _, ch := range []chan bool{d.queue.blockWakeCh, d.queue.receiptWakeCh} { select { case <-ch: default: } } - for _, ch := range []chan dataPack{d.headerCh, d.bodyCh, d.receiptCh} { - for empty := false; !empty; { - select { - case <-ch: - default: - empty = true - } - } - } for empty := false; !empty; { select { case <-d.headerProcCh: @@ -463,9 +441,9 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I if err != nil { return err } - if mode == FastSync && pivot == nil { + if mode == SnapSync && pivot == nil { // If no pivot block was returned, the head is below the min full block - // threshold (i.e. new chain). In that case we won't really fast sync + // threshold (i.e. new chain). In that case we won't really snap sync // anyway, but still need a valid pivot block to avoid some code hitting // nil panics on an access. pivot = d.blockchain.CurrentBlock().Header() @@ -483,8 +461,8 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I d.syncStatsChainHeight = height d.syncStatsLock.Unlock() - // Ensure our origin point is below any fast sync pivot point - if mode == FastSync { + // Ensure our origin point is below any snap sync pivot point + if mode == SnapSync { if height <= uint64(fsMinFullBlocks) { origin = 0 } else { @@ -493,17 +471,17 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I origin = pivotNumber - 1 } // Write out the pivot into the database so a rollback beyond it will - // reenable fast sync + // reenable snap sync rawdb.WriteLastPivotNumber(d.stateDB, pivotNumber) } } d.committed = 1 - if mode == FastSync && pivot.Number.Uint64() != 0 { + if mode == SnapSync && pivot.Number.Uint64() != 0 { d.committed = 0 } - if mode == FastSync { + if mode == SnapSync { // Set the ancient data limitation. - // If we are running fast sync, all block data older than ancientLimit will be + // If we are running snap sync, all block data older than ancientLimit will be // written to the ancient store. More recent data will be written to the active // database and will wait for the freezer to migrate. // @@ -535,7 +513,7 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I } // Rewind the ancient store and blockchain if reorg happens. if origin+1 < frozen { - if err := d.lightchain.SetHead(origin + 1); err != nil { + if err := d.lightchain.SetHead(origin); err != nil { return err } } @@ -546,17 +524,17 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I d.syncInitHook(origin, height) } fetchers := []func() error{ - func() error { return d.fetchHeaders(p, origin+1) }, // Headers are always retrieved - func() error { return d.fetchBodies(origin + 1) }, // Bodies are retrieved during normal and fast sync - func() error { return d.fetchReceipts(origin + 1) }, // Receipts are retrieved during fast sync + func() error { return d.fetchHeaders(p, origin+1, latest.Number.Uint64()) }, // Headers are always retrieved + func() error { return d.fetchBodies(origin + 1) }, // Bodies are retrieved during normal and snap sync + func() error { return d.fetchReceipts(origin + 1) }, // Receipts are retrieved during snap sync func() error { return d.processHeaders(origin+1, td) }, } - if mode == FastSync { + if mode == SnapSync { d.pivotLock.Lock() d.pivotHeader = pivot d.pivotLock.Unlock() - fetchers = append(fetchers, func() error { return d.processFastSyncContent() }) + fetchers = append(fetchers, func() error { return d.processSnapSyncContent() }) } else if mode == FullSync { fetchers = append(fetchers, d.processFullSyncContent) } @@ -625,9 +603,6 @@ func (d *Downloader) Terminate() { default: close(d.quitCh) } - if d.stateBloom != nil { - d.stateBloom.Close() - } d.quitLock.Unlock() // Cancel any pending download requests @@ -643,60 +618,38 @@ func (d *Downloader) fetchHead(p *peerConnection) (head *types.Header, pivot *ty // Request the advertised remote head block and wait for the response latest, _ := p.peer.Head() fetch := 1 - if mode == FastSync { + if mode == SnapSync { fetch = 2 // head + pivot headers } - go p.peer.RequestHeadersByHash(latest, fetch, fsMinFullBlocks-1, true) - - ttl := d.peers.rates.TargetTimeout() - timeout := time.After(ttl) - for { - select { - case <-d.cancelCh: - return nil, nil, errCanceled - - case packet := <-d.headerCh: - // Discard anything not from the origin peer - if packet.PeerId() != p.id { - log.Debug("Received headers from incorrect peer", "peer", packet.PeerId()) - break - } - // Make sure the peer gave us at least one and at most the requested headers - headers := packet.(*headerPack).headers - if len(headers) == 0 || len(headers) > fetch { - return nil, nil, fmt.Errorf("%w: returned headers %d != requested %d", errBadPeer, len(headers), fetch) - } - // The first header needs to be the head, validate against the checkpoint - // and request. If only 1 header was returned, make sure there's no pivot - // or there was not one requested. - head := headers[0] - if (mode == FastSync || mode == LightSync) && head.Number.Uint64() < d.checkpoint { - return nil, nil, fmt.Errorf("%w: remote head %d below checkpoint %d", errUnsyncedPeer, head.Number, d.checkpoint) - } - if len(headers) == 1 { - if mode == FastSync && head.Number.Uint64() > uint64(fsMinFullBlocks) { - return nil, nil, fmt.Errorf("%w: no pivot included along head header", errBadPeer) - } - p.log.Debug("Remote head identified, no pivot", "number", head.Number, "hash", head.Hash()) - return head, nil, nil - } - // At this point we have 2 headers in total and the first is the - // validated head of the chain. Check the pivot number and return, - pivot := headers[1] - if pivot.Number.Uint64() != head.Number.Uint64()-uint64(fsMinFullBlocks) { - return nil, nil, fmt.Errorf("%w: remote pivot %d != requested %d", errInvalidChain, pivot.Number, head.Number.Uint64()-uint64(fsMinFullBlocks)) - } - return head, pivot, nil - - case <-timeout: - p.log.Debug("Waiting for head header timed out", "elapsed", ttl) - return nil, nil, errTimeout - - case <-d.bodyCh: - case <-d.receiptCh: - // Out of bounds delivery, ignore + headers, hashes, err := d.fetchHeadersByHash(p, latest, fetch, fsMinFullBlocks-1, true) + if err != nil { + return nil, nil, err + } + // Make sure the peer gave us at least one and at most the requested headers + if len(headers) == 0 || len(headers) > fetch { + return nil, nil, fmt.Errorf("%w: returned headers %d != requested %d", errBadPeer, len(headers), fetch) + } + // The first header needs to be the head, validate against the checkpoint + // and request. If only 1 header was returned, make sure there's no pivot + // or there was not one requested. + head = headers[0] + if (mode == SnapSync || mode == LightSync) && head.Number.Uint64() < d.checkpoint { + return nil, nil, fmt.Errorf("%w: remote head %d below checkpoint %d", errUnsyncedPeer, head.Number, d.checkpoint) + } + if len(headers) == 1 { + if mode == SnapSync && head.Number.Uint64() > uint64(fsMinFullBlocks) { + return nil, nil, fmt.Errorf("%w: no pivot included along head header", errBadPeer) } + p.log.Debug("Remote head identified, no pivot", "number", head.Number, "hash", hashes[0]) + return head, nil, nil } + // At this point we have 2 headers in total and the first is the + // validated head of the chain. Check the pivot number and return, + pivot = headers[1] + if pivot.Number.Uint64() != head.Number.Uint64()-uint64(fsMinFullBlocks) { + return nil, nil, fmt.Errorf("%w: remote pivot %d != requested %d", errInvalidChain, pivot.Number, head.Number.Uint64()-uint64(fsMinFullBlocks)) + } + return head, pivot, nil } // calculateRequestSpan calculates what headers to request from a peer when trying to determine the @@ -767,7 +720,7 @@ func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) switch mode { case FullSync: localHeight = d.blockchain.CurrentBlock().NumberU64() - case FastSync: + case SnapSync: localHeight = d.blockchain.CurrentFastBlock().NumberU64() default: localHeight = d.lightchain.CurrentHeader().Number.Uint64() @@ -822,76 +775,52 @@ func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) return ancestor, nil } -func (d *Downloader) findAncestorSpanSearch(p *peerConnection, mode SyncMode, remoteHeight, localHeight uint64, floor int64) (commonAncestor uint64, err error) { +func (d *Downloader) findAncestorSpanSearch(p *peerConnection, mode SyncMode, remoteHeight, localHeight uint64, floor int64) (uint64, error) { from, count, skip, max := calculateRequestSpan(remoteHeight, localHeight) p.log.Trace("Span searching for common ancestor", "count", count, "from", from, "skip", skip) - go p.peer.RequestHeadersByNumber(uint64(from), count, skip, false) - + headers, hashes, err := d.fetchHeadersByNumber(p, uint64(from), count, skip, false) + if err != nil { + return 0, err + } // Wait for the remote response to the head fetch number, hash := uint64(0), common.Hash{} - ttl := d.peers.rates.TargetTimeout() - timeout := time.After(ttl) - - for finished := false; !finished; { - select { - case <-d.cancelCh: - return 0, errCanceled - - case packet := <-d.headerCh: - // Discard anything not from the origin peer - if packet.PeerId() != p.id { - log.Debug("Received headers from incorrect peer", "peer", packet.PeerId()) - break - } - // Make sure the peer actually gave something valid - headers := packet.(*headerPack).headers - if len(headers) == 0 { - p.log.Warn("Empty head header set") - return 0, errEmptyHeaderSet - } - // Make sure the peer's reply conforms to the request - for i, header := range headers { - expectNumber := from + int64(i)*int64(skip+1) - if number := header.Number.Int64(); number != expectNumber { - p.log.Warn("Head headers broke chain ordering", "index", i, "requested", expectNumber, "received", number) - return 0, fmt.Errorf("%w: %v", errInvalidChain, errors.New("head headers broke chain ordering")) - } - } - // Check if a common ancestor was found - finished = true - for i := len(headers) - 1; i >= 0; i-- { - // Skip any headers that underflow/overflow our requested set - if headers[i].Number.Int64() < from || headers[i].Number.Uint64() > max { - continue - } - // Otherwise check if we already know the header or not - h := headers[i].Hash() - n := headers[i].Number.Uint64() - - var known bool - switch mode { - case FullSync: - known = d.blockchain.HasBlock(h, n) - case FastSync: - known = d.blockchain.HasFastBlock(h, n) - default: - known = d.lightchain.HasHeader(h, n) - } - if known { - number, hash = n, h - break - } - } - - case <-timeout: - p.log.Debug("Waiting for head header timed out", "elapsed", ttl) - return 0, errTimeout - - case <-d.bodyCh: - case <-d.receiptCh: - // Out of bounds delivery, ignore + // Make sure the peer actually gave something valid + if len(headers) == 0 { + p.log.Warn("Empty head header set") + return 0, errEmptyHeaderSet + } + // Make sure the peer's reply conforms to the request + for i, header := range headers { + expectNumber := from + int64(i)*int64(skip+1) + if number := header.Number.Int64(); number != expectNumber { + p.log.Warn("Head headers broke chain ordering", "index", i, "requested", expectNumber, "received", number) + return 0, fmt.Errorf("%w: %v", errInvalidChain, errors.New("head headers broke chain ordering")) + } + } + // Check if a common ancestor was found + for i := len(headers) - 1; i >= 0; i-- { + // Skip any headers that underflow/overflow our requested set + if headers[i].Number.Int64() < from || headers[i].Number.Uint64() > max { + continue + } + // Otherwise check if we already know the header or not + h := hashes[i] + n := headers[i].Number.Uint64() + + var known bool + switch mode { + case FullSync: + known = d.blockchain.HasBlock(h, n) + case SnapSync: + known = d.blockchain.HasFastBlock(h, n) + default: + known = d.lightchain.HasHeader(h, n) + } + if known { + number, hash = n, h + break } } // If the head fetch already found an ancestor, return @@ -906,7 +835,7 @@ func (d *Downloader) findAncestorSpanSearch(p *peerConnection, mode SyncMode, re return 0, errNoAncestorFound } -func (d *Downloader) findAncestorBinarySearch(p *peerConnection, mode SyncMode, remoteHeight uint64, floor int64) (commonAncestor uint64, err error) { +func (d *Downloader) findAncestorBinarySearch(p *peerConnection, mode SyncMode, remoteHeight uint64, floor int64) (uint64, error) { hash := common.Hash{} // Ancestor not found, we need to binary search over our chain @@ -920,65 +849,39 @@ func (d *Downloader) findAncestorBinarySearch(p *peerConnection, mode SyncMode, // Split our chain interval in two, and request the hash to cross check check := (start + end) / 2 - ttl := d.peers.rates.TargetTimeout() - timeout := time.After(ttl) - - go p.peer.RequestHeadersByNumber(check, 1, 0, false) - - // Wait until a reply arrives to this request - for arrived := false; !arrived; { - select { - case <-d.cancelCh: - return 0, errCanceled - - case packet := <-d.headerCh: - // Discard anything not from the origin peer - if packet.PeerId() != p.id { - log.Debug("Received headers from incorrect peer", "peer", packet.PeerId()) - break - } - // Make sure the peer actually gave something valid - headers := packet.(*headerPack).headers - if len(headers) != 1 { - p.log.Warn("Multiple headers for single request", "headers", len(headers)) - return 0, fmt.Errorf("%w: multiple headers (%d) for single request", errBadPeer, len(headers)) - } - arrived = true - - // Modify the search interval based on the response - h := headers[0].Hash() - n := headers[0].Number.Uint64() - - var known bool - switch mode { - case FullSync: - known = d.blockchain.HasBlock(h, n) - case FastSync: - known = d.blockchain.HasFastBlock(h, n) - default: - known = d.lightchain.HasHeader(h, n) - } - if !known { - end = check - break - } - header := d.lightchain.GetHeaderByHash(h) // Independent of sync mode, header surely exists - if header.Number.Uint64() != check { - p.log.Warn("Received non requested header", "number", header.Number, "hash", header.Hash(), "request", check) - return 0, fmt.Errorf("%w: non-requested header (%d)", errBadPeer, header.Number) - } - start = check - hash = h - - case <-timeout: - p.log.Debug("Waiting for search header timed out", "elapsed", ttl) - return 0, errTimeout - - case <-d.bodyCh: - case <-d.receiptCh: - // Out of bounds delivery, ignore - } + headers, hashes, err := d.fetchHeadersByNumber(p, check, 1, 0, false) + if err != nil { + return 0, err + } + // Make sure the peer actually gave something valid + if len(headers) != 1 { + p.log.Warn("Multiple headers for single request", "headers", len(headers)) + return 0, fmt.Errorf("%w: multiple headers (%d) for single request", errBadPeer, len(headers)) + } + // Modify the search interval based on the response + h := hashes[0] + n := headers[0].Number.Uint64() + + var known bool + switch mode { + case FullSync: + known = d.blockchain.HasBlock(h, n) + case SnapSync: + known = d.blockchain.HasFastBlock(h, n) + default: + known = d.lightchain.HasHeader(h, n) + } + if !known { + end = check + continue + } + header := d.lightchain.GetHeaderByHash(h) // Independent of sync mode, header surely exists + if header.Number.Uint64() != check { + p.log.Warn("Received non requested header", "number", header.Number, "hash", header.Hash(), "request", check) + return 0, fmt.Errorf("%w: non-requested header (%d)", errBadPeer, header.Number) } + start = check + hash = h } // Ensure valid ancestry and return if int64(start) <= floor { @@ -997,227 +900,216 @@ func (d *Downloader) findAncestorBinarySearch(p *peerConnection, mode SyncMode, // other peers are only accepted if they map cleanly to the skeleton. If no one // can fill in the skeleton - not even the origin peer - it's assumed invalid and // the origin is dropped. -func (d *Downloader) fetchHeaders(p *peerConnection, from uint64) error { +func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, head uint64) error { p.log.Debug("Directing header downloads", "origin", from) defer p.log.Debug("Header download terminated") - // Create a timeout timer, and the associated header fetcher - skeleton := true // Skeleton assembly phase or finishing up - pivoting := false // Whether the next request is pivot verification - request := time.Now() // time of the last skeleton fetch request - timeout := time.NewTimer(0) // timer to dump a non-responsive active peer - <-timeout.C // timeout channel should be initially empty - defer timeout.Stop() - - var ttl time.Duration - getHeaders := func(from uint64) { - request = time.Now() + // Start pulling the header chain skeleton until all is done + var ( + skeleton = true // Skeleton assembly phase or finishing up + pivoting = false // Whether the next request is pivot verification + ancestor = from + mode = d.getMode() + ) + for { + // Pull the next batch of headers, it either: + // - Pivot check to see if the chain moved too far + // - Skeleton retrieval to permit concurrent header fetches + // - Full header retrieval if we're near the chain head + var ( + headers []*types.Header + hashes []common.Hash + err error + ) + switch { + case pivoting: + d.pivotLock.RLock() + pivot := d.pivotHeader.Number.Uint64() + d.pivotLock.RUnlock() - ttl = d.peers.rates.TargetTimeout() - timeout.Reset(ttl) + p.log.Trace("Fetching next pivot header", "number", pivot+uint64(fsMinFullBlocks)) + headers, hashes, err = d.fetchHeadersByNumber(p, pivot+uint64(fsMinFullBlocks), 2, fsMinFullBlocks-9, false) // move +64 when it's 2x64-8 deep - if skeleton { + case skeleton: p.log.Trace("Fetching skeleton headers", "count", MaxHeaderFetch, "from", from) - go p.peer.RequestHeadersByNumber(from+uint64(MaxHeaderFetch)-1, MaxSkeletonSize, MaxHeaderFetch-1, false) - } else { + headers, hashes, err = d.fetchHeadersByNumber(p, from+uint64(MaxHeaderFetch)-1, MaxSkeletonSize, MaxHeaderFetch-1, false) + + default: p.log.Trace("Fetching full headers", "count", MaxHeaderFetch, "from", from) - go p.peer.RequestHeadersByNumber(from, MaxHeaderFetch, 0, false) + headers, hashes, err = d.fetchHeadersByNumber(p, from, MaxHeaderFetch, 0, false) } - } - getNextPivot := func() { - pivoting = true - request = time.Now() - - ttl = d.peers.rates.TargetTimeout() - timeout.Reset(ttl) + switch err { + case nil: + // Headers retrieved, continue with processing - d.pivotLock.RLock() - pivot := d.pivotHeader.Number.Uint64() - d.pivotLock.RUnlock() - - p.log.Trace("Fetching next pivot header", "number", pivot+uint64(fsMinFullBlocks)) - go p.peer.RequestHeadersByNumber(pivot+uint64(fsMinFullBlocks), 2, fsMinFullBlocks-9, false) // move +64 when it's 2x64-8 deep - } - // Start pulling the header chain skeleton until all is done - ancestor := from - getHeaders(from) + case errCanceled: + // Sync cancelled, no issue, propagate up + return err - mode := d.getMode() - for { - select { - case <-d.cancelCh: - return errCanceled + default: + // Header retrieval either timed out, or the peer failed in some strange way + // (e.g. disconnect). Consider the master peer bad and drop + d.dropPeer(p.id) - case packet := <-d.headerCh: - // Make sure the active peer is giving us the skeleton headers - if packet.PeerId() != p.id { - log.Debug("Received skeleton from incorrect peer", "peer", packet.PeerId()) - break + // Finish the sync gracefully instead of dumping the gathered data though + for _, ch := range []chan bool{d.queue.blockWakeCh, d.queue.receiptWakeCh} { + select { + case ch <- false: + case <-d.cancelCh: + } } - headerReqTimer.UpdateSince(request) - timeout.Stop() - - // If the pivot is being checked, move if it became stale and run the real retrieval - var pivot uint64 - - d.pivotLock.RLock() - if d.pivotHeader != nil { - pivot = d.pivotHeader.Number.Uint64() + select { + case d.headerProcCh <- nil: + case <-d.cancelCh: } - d.pivotLock.RUnlock() + return fmt.Errorf("%w: header request failed: %v", errBadPeer, err) + } + // If the pivot is being checked, move if it became stale and run the real retrieval + var pivot uint64 - if pivoting { - if packet.Items() == 2 { - // Retrieve the headers and do some sanity checks, just in case - headers := packet.(*headerPack).headers + d.pivotLock.RLock() + if d.pivotHeader != nil { + pivot = d.pivotHeader.Number.Uint64() + } + d.pivotLock.RUnlock() - if have, want := headers[0].Number.Uint64(), pivot+uint64(fsMinFullBlocks); have != want { - log.Warn("Peer sent invalid next pivot", "have", have, "want", want) - return fmt.Errorf("%w: next pivot number %d != requested %d", errInvalidChain, have, want) - } - if have, want := headers[1].Number.Uint64(), pivot+2*uint64(fsMinFullBlocks)-8; have != want { - log.Warn("Peer sent invalid pivot confirmer", "have", have, "want", want) - return fmt.Errorf("%w: next pivot confirmer number %d != requested %d", errInvalidChain, have, want) - } - log.Warn("Pivot seemingly stale, moving", "old", pivot, "new", headers[0].Number) - pivot = headers[0].Number.Uint64() + if pivoting { + if len(headers) == 2 { + if have, want := headers[0].Number.Uint64(), pivot+uint64(fsMinFullBlocks); have != want { + log.Warn("Peer sent invalid next pivot", "have", have, "want", want) + return fmt.Errorf("%w: next pivot number %d != requested %d", errInvalidChain, have, want) + } + if have, want := headers[1].Number.Uint64(), pivot+2*uint64(fsMinFullBlocks)-8; have != want { + log.Warn("Peer sent invalid pivot confirmer", "have", have, "want", want) + return fmt.Errorf("%w: next pivot confirmer number %d != requested %d", errInvalidChain, have, want) + } + log.Warn("Pivot seemingly stale, moving", "old", pivot, "new", headers[0].Number) + pivot = headers[0].Number.Uint64() - d.pivotLock.Lock() - d.pivotHeader = headers[0] - d.pivotLock.Unlock() + d.pivotLock.Lock() + d.pivotHeader = headers[0] + d.pivotLock.Unlock() - // Write out the pivot into the database so a rollback beyond - // it will reenable fast sync and update the state root that - // the state syncer will be downloading. - rawdb.WriteLastPivotNumber(d.stateDB, pivot) - } - pivoting = false - getHeaders(from) - continue + // Write out the pivot into the database so a rollback beyond + // it will reenable snap sync and update the state root that + // the state syncer will be downloading. + rawdb.WriteLastPivotNumber(d.stateDB, pivot) } - // If the skeleton's finished, pull any remaining head headers directly from the origin - if skeleton && packet.Items() == 0 { - skeleton = false - getHeaders(from) - continue + // Disable the pivot check and fetch the next batch of headers + pivoting = false + continue + } + // If the skeleton's finished, pull any remaining head headers directly from the origin + if skeleton && len(headers) == 0 { + // A malicious node might withhold advertised headers indefinitely + if from+uint64(MaxHeaderFetch)-1 <= head { + p.log.Warn("Peer withheld skeleton headers", "advertised", head, "withheld", from+uint64(MaxHeaderFetch)-1) + return fmt.Errorf("%w: withheld skeleton headers: advertised %d, withheld #%d", errStallingPeer, head, from+uint64(MaxHeaderFetch)-1) } - // If no more headers are inbound, notify the content fetchers and return - if packet.Items() == 0 { - // Don't abort header fetches while the pivot is downloading - if atomic.LoadInt32(&d.committed) == 0 && pivot <= from { - p.log.Debug("No headers, waiting for pivot commit") - select { - case <-time.After(fsHeaderContCheck): - getHeaders(from) - continue - case <-d.cancelCh: - return errCanceled - } - } - // Pivot done (or not in fast sync) and no more headers, terminate the process - p.log.Debug("No more headers available") + p.log.Debug("No skeleton, fetching headers directly") + skeleton = false + continue + } + // If no more headers are inbound, notify the content fetchers and return + if len(headers) == 0 { + // Don't abort header fetches while the pivot is downloading + if atomic.LoadInt32(&d.committed) == 0 && pivot <= from { + p.log.Debug("No headers, waiting for pivot commit") select { - case d.headerProcCh <- nil: - return nil + case <-time.After(fsHeaderContCheck): + continue case <-d.cancelCh: return errCanceled } } - headers := packet.(*headerPack).headers - - // If we received a skeleton batch, resolve internals concurrently - if skeleton { - filled, proced, err := d.fillHeaderSkeleton(from, headers) - if err != nil { - p.log.Debug("Skeleton chain invalid", "err", err) - return fmt.Errorf("%w: %v", errInvalidChain, err) - } - headers = filled[proced:] - from += uint64(proced) - } else { - // If we're closing in on the chain head, but haven't yet reached it, delay - // the last few headers so mini reorgs on the head don't cause invalid hash - // chain errors. - if n := len(headers); n > 0 { - // Retrieve the current head we're at - var head uint64 - if mode == LightSync { - head = d.lightchain.CurrentHeader().Number.Uint64() - } else { - head = d.blockchain.CurrentFastBlock().NumberU64() - if full := d.blockchain.CurrentBlock().NumberU64(); head < full { - head = full - } - } - // If the head is below the common ancestor, we're actually deduplicating - // already existing chain segments, so use the ancestor as the fake head. - // Otherwise we might end up delaying header deliveries pointlessly. - if head < ancestor { - head = ancestor - } - // If the head is way older than this batch, delay the last few headers - if head+uint64(reorgProtThreshold) < headers[n-1].Number.Uint64() { - delay := reorgProtHeaderDelay - if delay > n { - delay = n - } - headers = headers[:n-delay] - } - } + // Pivot done (or not in snap sync) and no more headers, terminate the process + p.log.Debug("No more headers available") + select { + case d.headerProcCh <- nil: + return nil + case <-d.cancelCh: + return errCanceled } - // Insert all the new headers and fetch the next batch - if len(headers) > 0 { - p.log.Trace("Scheduling new headers", "count", len(headers), "from", from) - select { - case d.headerProcCh <- headers: - case <-d.cancelCh: - return errCanceled - } - from += uint64(len(headers)) + } + // If we received a skeleton batch, resolve internals concurrently + var progressed bool + if skeleton { + filled, hashset, proced, err := d.fillHeaderSkeleton(from, headers) + if err != nil { + p.log.Debug("Skeleton chain invalid", "err", err) + return fmt.Errorf("%w: %v", errInvalidChain, err) + } + headers = filled[proced:] + hashes = hashset[proced:] - // If we're still skeleton filling fast sync, check pivot staleness - // before continuing to the next skeleton filling - if skeleton && pivot > 0 { - getNextPivot() + progressed = proced > 0 + from += uint64(proced) + } else { + // A malicious node might withhold advertised headers indefinitely + if n := len(headers); n < MaxHeaderFetch && headers[n-1].Number.Uint64() < head { + p.log.Warn("Peer withheld headers", "advertised", head, "delivered", headers[n-1].Number.Uint64()) + return fmt.Errorf("%w: withheld headers: advertised %d, delivered %d", errStallingPeer, head, headers[n-1].Number.Uint64()) + } + // If we're closing in on the chain head, but haven't yet reached it, delay + // the last few headers so mini reorgs on the head don't cause invalid hash + // chain errors. + if n := len(headers); n > 0 { + // Retrieve the current head we're at + var head uint64 + if mode == LightSync { + head = d.lightchain.CurrentHeader().Number.Uint64() } else { - getHeaders(from) + head = d.blockchain.CurrentFastBlock().NumberU64() + if full := d.blockchain.CurrentBlock().NumberU64(); head < full { + head = full + } } - } else { - // No headers delivered, or all of them being delayed, sleep a bit and retry - p.log.Trace("All headers delayed, waiting") - select { - case <-time.After(fsHeaderContCheck): - getHeaders(from) - continue - case <-d.cancelCh: - return errCanceled + // If the head is below the common ancestor, we're actually deduplicating + // already existing chain segments, so use the ancestor as the fake head. + // Otherwise, we might end up delaying header deliveries pointlessly. + if head < ancestor { + head = ancestor } - } - - case <-timeout.C: - if d.dropPeer == nil { - // The dropPeer method is nil when `--copydb` is used for a local copy. - // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored - p.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", p.id) - break - } - // Header retrieval timed out, consider the peer bad and drop - p.log.Debug("Header request timed out", "elapsed", ttl) - headerTimeoutMeter.Mark(1) - d.dropPeer(p.id) - - // Finish the sync gracefully instead of dumping the gathered data though - for _, ch := range []chan bool{d.bodyWakeCh, d.receiptWakeCh} { - select { - case ch <- false: - case <-d.cancelCh: + // If the head is way older than this batch, delay the last few headers + if head+uint64(reorgProtThreshold) < headers[n-1].Number.Uint64() { + delay := reorgProtHeaderDelay + if delay > n { + delay = n + } + headers = headers[:n-delay] + hashes = hashes[:n-delay] } } + } + // If no headers have bene delivered, or all of them have been delayed, + // sleep a bit and retry. Take care with headers already consumed during + // skeleton filling + if len(headers) == 0 && !progressed { + p.log.Trace("All headers delayed, waiting") select { - case d.headerProcCh <- nil: + case <-time.After(fsHeaderContCheck): + continue case <-d.cancelCh: + return errCanceled + } + } + // Insert any remaining new headers and fetch the next batch + if len(headers) > 0 { + p.log.Trace("Scheduling new headers", "count", len(headers), "from", from) + select { + case d.headerProcCh <- &headerTask{ + headers: headers, + hashes: hashes, + }: + case <-d.cancelCh: + return errCanceled } - return fmt.Errorf("%w: header request timed out", errBadPeer) + from += uint64(len(headers)) + } + // If we're still skeleton filling snap sync, check pivot staleness + // before continuing to the next skeleton filling + if skeleton && pivot > 0 { + pivoting = true } } } @@ -1231,33 +1123,19 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64) error { // // The method returns the entire filled skeleton and also the number of headers // already forwarded for processing. -func (d *Downloader) fillHeaderSkeleton(from uint64, skeleton []*types.Header) ([]*types.Header, int, error) { +func (d *Downloader) fillHeaderSkeleton(from uint64, skeleton []*types.Header) ([]*types.Header, []common.Hash, int, error) { log.Debug("Filling up skeleton", "from", from) d.queue.ScheduleSkeleton(from, skeleton) - var ( - deliver = func(packet dataPack) (int, error) { - pack := packet.(*headerPack) - return d.queue.DeliverHeaders(pack.peerID, pack.headers, d.headerProcCh) - } - expire = func() map[string]int { return d.queue.ExpireHeaders(d.peers.rates.TargetTimeout()) } - reserve = func(p *peerConnection, count int) (*fetchRequest, bool, bool) { - return d.queue.ReserveHeaders(p, count), false, false - } - fetch = func(p *peerConnection, req *fetchRequest) error { return p.FetchHeaders(req.From, MaxHeaderFetch) } - capacity = func(p *peerConnection) int { return p.HeaderCapacity(d.peers.rates.TargetRoundTrip()) } - setIdle = func(p *peerConnection, accepted int, deliveryTime time.Time) { - p.SetHeadersIdle(accepted, deliveryTime) - } - ) - err := d.fetchParts(d.headerCh, deliver, d.queue.headerContCh, expire, - d.queue.PendingHeaders, d.queue.InFlightHeaders, reserve, - nil, fetch, d.queue.CancelHeaders, capacity, d.peers.HeaderIdlePeers, setIdle, "headers") - - log.Debug("Skeleton fill terminated", "err", err) - - filled, proced := d.queue.RetrieveHeaders() - return filled, proced, err + err := d.concurrentFetch((*headerQueue)(d)) + if err != nil { + log.Debug("Skeleton fill failed", "err", err) + } + filled, hashes, proced := d.queue.RetrieveHeaders() + if err == nil { + log.Debug("Skeleton fill succeeded", "filled", len(filled), "processed", proced) + } + return filled, hashes, proced, err } // fetchBodies iteratively downloads the scheduled block bodies, taking any @@ -1265,20 +1143,7 @@ func (d *Downloader) fillHeaderSkeleton(from uint64, skeleton []*types.Header) ( // and also periodically checking for timeouts. func (d *Downloader) fetchBodies(from uint64) error { log.Debug("Downloading block bodies", "origin", from) - - var ( - deliver = func(packet dataPack) (int, error) { - pack := packet.(*bodyPack) - return d.queue.DeliverBodies(pack.peerID, pack.transactions, pack.uncles) - } - expire = func() map[string]int { return d.queue.ExpireBodies(d.peers.rates.TargetTimeout()) } - fetch = func(p *peerConnection, req *fetchRequest) error { return p.FetchBodies(req) } - capacity = func(p *peerConnection) int { return p.BlockCapacity(d.peers.rates.TargetRoundTrip()) } - setIdle = func(p *peerConnection, accepted int, deliveryTime time.Time) { p.SetBodiesIdle(accepted, deliveryTime) } - ) - err := d.fetchParts(d.bodyCh, deliver, d.bodyWakeCh, expire, - d.queue.PendingBlocks, d.queue.InFlightBlocks, d.queue.ReserveBodies, - d.bodyFetchHook, fetch, d.queue.CancelBodies, capacity, d.peers.BodyIdlePeers, setIdle, "bodies") + err := d.concurrentFetch((*bodyQueue)(d)) log.Debug("Block body download terminated", "err", err) return err @@ -1288,225 +1153,13 @@ func (d *Downloader) fetchBodies(from uint64) error { // available peers, reserving a chunk of receipts for each, waiting for delivery // and also periodically checking for timeouts. func (d *Downloader) fetchReceipts(from uint64) error { - log.Debug("Downloading transaction receipts", "origin", from) + log.Debug("Downloading receipts", "origin", from) + err := d.concurrentFetch((*receiptQueue)(d)) - var ( - deliver = func(packet dataPack) (int, error) { - pack := packet.(*receiptPack) - return d.queue.DeliverReceipts(pack.peerID, pack.receipts) - } - expire = func() map[string]int { return d.queue.ExpireReceipts(d.peers.rates.TargetTimeout()) } - fetch = func(p *peerConnection, req *fetchRequest) error { return p.FetchReceipts(req) } - capacity = func(p *peerConnection) int { return p.ReceiptCapacity(d.peers.rates.TargetRoundTrip()) } - setIdle = func(p *peerConnection, accepted int, deliveryTime time.Time) { - p.SetReceiptsIdle(accepted, deliveryTime) - } - ) - err := d.fetchParts(d.receiptCh, deliver, d.receiptWakeCh, expire, - d.queue.PendingReceipts, d.queue.InFlightReceipts, d.queue.ReserveReceipts, - d.receiptFetchHook, fetch, d.queue.CancelReceipts, capacity, d.peers.ReceiptIdlePeers, setIdle, "receipts") - - log.Debug("Transaction receipt download terminated", "err", err) + log.Debug("Receipt download terminated", "err", err) return err } -// fetchParts iteratively downloads scheduled block parts, taking any available -// peers, reserving a chunk of fetch requests for each, waiting for delivery and -// also periodically checking for timeouts. -// -// As the scheduling/timeout logic mostly is the same for all downloaded data -// types, this method is used by each for data gathering and is instrumented with -// various callbacks to handle the slight differences between processing them. -// -// The instrumentation parameters: -// - errCancel: error type to return if the fetch operation is cancelled (mostly makes logging nicer) -// - deliveryCh: channel from which to retrieve downloaded data packets (merged from all concurrent peers) -// - deliver: processing callback to deliver data packets into type specific download queues (usually within `queue`) -// - wakeCh: notification channel for waking the fetcher when new tasks are available (or sync completed) -// - expire: task callback method to abort requests that took too long and return the faulty peers (traffic shaping) -// - pending: task callback for the number of requests still needing download (detect completion/non-completability) -// - inFlight: task callback for the number of in-progress requests (wait for all active downloads to finish) -// - throttle: task callback to check if the processing queue is full and activate throttling (bound memory use) -// - reserve: task callback to reserve new download tasks to a particular peer (also signals partial completions) -// - fetchHook: tester callback to notify of new tasks being initiated (allows testing the scheduling logic) -// - fetch: network callback to actually send a particular download request to a physical remote peer -// - cancel: task callback to abort an in-flight download request and allow rescheduling it (in case of lost peer) -// - capacity: network callback to retrieve the estimated type-specific bandwidth capacity of a peer (traffic shaping) -// - idle: network callback to retrieve the currently (type specific) idle peers that can be assigned tasks -// - setIdle: network callback to set a peer back to idle and update its estimated capacity (traffic shaping) -// - kind: textual label of the type being downloaded to display in log messages -func (d *Downloader) fetchParts(deliveryCh chan dataPack, deliver func(dataPack) (int, error), wakeCh chan bool, - expire func() map[string]int, pending func() int, inFlight func() bool, reserve func(*peerConnection, int) (*fetchRequest, bool, bool), - fetchHook func([]*types.Header), fetch func(*peerConnection, *fetchRequest) error, cancel func(*fetchRequest), capacity func(*peerConnection) int, - idle func() ([]*peerConnection, int), setIdle func(*peerConnection, int, time.Time), kind string) error { - - // Create a ticker to detect expired retrieval tasks - ticker := time.NewTicker(100 * time.Millisecond) - defer ticker.Stop() - - update := make(chan struct{}, 1) - - // Prepare the queue and fetch block parts until the block header fetcher's done - finished := false - for { - select { - case <-d.cancelCh: - return errCanceled - - case packet := <-deliveryCh: - deliveryTime := time.Now() - // If the peer was previously banned and failed to deliver its pack - // in a reasonable time frame, ignore its message. - if peer := d.peers.Peer(packet.PeerId()); peer != nil { - // Deliver the received chunk of data and check chain validity - accepted, err := deliver(packet) - if errors.Is(err, errInvalidChain) { - return err - } - // Unless a peer delivered something completely else than requested (usually - // caused by a timed out request which came through in the end), set it to - // idle. If the delivery's stale, the peer should have already been idled. - if !errors.Is(err, errStaleDelivery) { - setIdle(peer, accepted, deliveryTime) - } - // Issue a log to the user to see what's going on - switch { - case err == nil && packet.Items() == 0: - peer.log.Trace("Requested data not delivered", "type", kind) - case err == nil: - peer.log.Trace("Delivered new batch of data", "type", kind, "count", packet.Stats()) - default: - peer.log.Debug("Failed to deliver retrieved data", "type", kind, "err", err) - } - } - // Blocks assembled, try to update the progress - select { - case update <- struct{}{}: - default: - } - - case cont := <-wakeCh: - // The header fetcher sent a continuation flag, check if it's done - if !cont { - finished = true - } - // Headers arrive, try to update the progress - select { - case update <- struct{}{}: - default: - } - - case <-ticker.C: - // Sanity check update the progress - select { - case update <- struct{}{}: - default: - } - - case <-update: - // Short circuit if we lost all our peers - if d.peers.Len() == 0 { - return errNoPeers - } - // Check for fetch request timeouts and demote the responsible peers - for pid, fails := range expire() { - if peer := d.peers.Peer(pid); peer != nil { - // If a lot of retrieval elements expired, we might have overestimated the remote peer or perhaps - // ourselves. Only reset to minimal throughput but don't drop just yet. If even the minimal times - // out that sync wise we need to get rid of the peer. - // - // The reason the minimum threshold is 2 is because the downloader tries to estimate the bandwidth - // and latency of a peer separately, which requires pushing the measures capacity a bit and seeing - // how response times reacts, to it always requests one more than the minimum (i.e. min 2). - if fails > 2 { - peer.log.Trace("Data delivery timed out", "type", kind) - setIdle(peer, 0, time.Now()) - } else { - peer.log.Debug("Stalling delivery, dropping", "type", kind) - - if d.dropPeer == nil { - // The dropPeer method is nil when `--copydb` is used for a local copy. - // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored - peer.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", pid) - } else { - d.dropPeer(pid) - - // If this peer was the master peer, abort sync immediately - d.cancelLock.RLock() - master := pid == d.cancelPeer - d.cancelLock.RUnlock() - - if master { - d.cancel() - return errTimeout - } - } - } - } - } - // If there's nothing more to fetch, wait or terminate - if pending() == 0 { - if !inFlight() && finished { - log.Debug("Data fetching completed", "type", kind) - return nil - } - break - } - // Send a download request to all idle peers, until throttled - progressed, throttled, running := false, false, inFlight() - idles, total := idle() - pendCount := pending() - for _, peer := range idles { - // Short circuit if throttling activated - if throttled { - break - } - // Short circuit if there is no more available task. - if pendCount = pending(); pendCount == 0 { - break - } - // Reserve a chunk of fetches for a peer. A nil can mean either that - // no more headers are available, or that the peer is known not to - // have them. - request, progress, throttle := reserve(peer, capacity(peer)) - if progress { - progressed = true - } - if throttle { - throttled = true - throttleCounter.Inc(1) - } - if request == nil { - continue - } - if request.From > 0 { - peer.log.Trace("Requesting new batch of data", "type", kind, "from", request.From) - } else { - peer.log.Trace("Requesting new batch of data", "type", kind, "count", len(request.Headers), "from", request.Headers[0].Number) - } - // Fetch the chunk and make sure any errors return the hashes to the queue - if fetchHook != nil { - fetchHook(request.Headers) - } - if err := fetch(peer, request); err != nil { - // Although we could try and make an attempt to fix this, this error really - // means that we've double allocated a fetch task to a peer. If that is the - // case, the internal state of the downloader and the queue is very wrong so - // better hard crash and note the error instead of silently accumulating into - // a much bigger issue. - panic(fmt.Sprintf("%v: %s fetch assignment failed", peer, kind)) - } - running = true - } - // Make sure that we have peers available for fetching. If all peers have been tried - // and all failed throw an error - if !progressed && !throttled && !running && len(idles) == total && pendCount > 0 { - return errPeersUnavailable - } - } - } -} - // processHeaders takes batches of retrieved headers from an input channel and // keeps processing and scheduling them into the header chain and downloader's // queue until the stream ends or a failure occurs. @@ -1535,7 +1188,7 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { } log.Warn("Rolled back chain segment", "header", fmt.Sprintf("%d->%d", lastHeader, d.lightchain.CurrentHeader().Number), - "fast", fmt.Sprintf("%d->%d", lastFastBlock, curFastBlock), + "snap", fmt.Sprintf("%d->%d", lastFastBlock, curFastBlock), "block", fmt.Sprintf("%d->%d", lastBlock, curBlock), "reason", rollbackErr) } }() @@ -1548,11 +1201,11 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { rollbackErr = errCanceled return errCanceled - case headers := <-d.headerProcCh: + case task := <-d.headerProcCh: // Terminate header processing if we synced up - if len(headers) == 0 { + if task == nil || len(task.headers) == 0 { // Notify everyone that headers are fully processed - for _, ch := range []chan bool{d.bodyWakeCh, d.receiptWakeCh} { + for _, ch := range []chan bool{d.queue.blockWakeCh, d.queue.receiptWakeCh} { select { case ch <- false: case <-d.cancelCh: @@ -1576,14 +1229,14 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { return errStallingPeer } } - // If fast or light syncing, ensure promised headers are indeed delivered. This is + // If snap or light syncing, ensure promised headers are indeed delivered. This is // needed to detect scenarios where an attacker feeds a bad pivot and then bails out // of delivering the post-pivot blocks that would flag the invalid content. // // This check cannot be executed "as is" for full imports, since blocks may still be // queued for processing when the header download completes. However, as long as the // peer gave us something useful, we're already happy/progressed (above check). - if mode == FastSync || mode == LightSync { + if mode == SnapSync || mode == LightSync { head := d.lightchain.CurrentHeader() if td.Cmp(d.lightchain.GetTd(head.Hash(), head.Number.Uint64())) > 0 { return errStallingPeer @@ -1594,6 +1247,8 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { return nil } // Otherwise split the chunk of headers into batches and process them + headers, hashes := task.headers, task.hashes + gotHeaders = true for len(headers) > 0 { // Terminate if something failed in between processing chunks @@ -1608,10 +1263,11 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { if limit > len(headers) { limit = len(headers) } - chunk := headers[:limit] + chunkHeaders := headers[:limit] + chunkHashes := hashes[:limit] // In case of header only syncing, validate the chunk immediately - if mode == FastSync || mode == LightSync { + if mode == SnapSync || mode == LightSync { // If we're importing pure headers, verify based on their recentness var pivot uint64 @@ -1622,22 +1278,22 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { d.pivotLock.RUnlock() frequency := fsHeaderCheckFrequency - if chunk[len(chunk)-1].Number.Uint64()+uint64(fsHeaderForceVerify) > pivot { + if chunkHeaders[len(chunkHeaders)-1].Number.Uint64()+uint64(fsHeaderForceVerify) > pivot { frequency = 1 } - if n, err := d.lightchain.InsertHeaderChain(chunk, frequency); err != nil { + if n, err := d.lightchain.InsertHeaderChain(chunkHeaders, frequency); err != nil { rollbackErr = err // If some headers were inserted, track them as uncertain - if (mode == FastSync || frequency > 1) && n > 0 && rollback == 0 { - rollback = chunk[0].Number.Uint64() + if (mode == SnapSync || frequency > 1) && n > 0 && rollback == 0 { + rollback = chunkHeaders[0].Number.Uint64() } - log.Warn("Invalid header encountered", "number", chunk[n].Number, "hash", chunk[n].Hash(), "parent", chunk[n].ParentHash, "err", err) + log.Warn("Invalid header encountered", "number", chunkHeaders[n].Number, "hash", chunkHashes[n], "parent", chunkHeaders[n].ParentHash, "err", err) return fmt.Errorf("%w: %v", errInvalidChain, err) } // All verifications passed, track all headers within the alloted limits - if mode == FastSync { - head := chunk[len(chunk)-1].Number.Uint64() + if mode == SnapSync { + head := chunkHeaders[len(chunkHeaders)-1].Number.Uint64() if head-rollback > uint64(fsHeaderSafetyNet) { rollback = head - uint64(fsHeaderSafetyNet) } else { @@ -1646,9 +1302,9 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { } } // Unless we're doing light chains, schedule the headers for associated content retrieval - if mode == FullSync || mode == FastSync { + if mode == FullSync || mode == SnapSync { // If we've reached the allowed number of pending headers, stall a bit - for d.queue.PendingBlocks() >= maxQueuedHeaders || d.queue.PendingReceipts() >= maxQueuedHeaders { + for d.queue.PendingBodies() >= maxQueuedHeaders || d.queue.PendingReceipts() >= maxQueuedHeaders { select { case <-d.cancelCh: rollbackErr = errCanceled @@ -1657,13 +1313,14 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { } } // Otherwise insert the headers for content retrieval - inserts := d.queue.Schedule(chunk, origin) - if len(inserts) != len(chunk) { - rollbackErr = fmt.Errorf("stale headers: len inserts %v len(chunk) %v", len(inserts), len(chunk)) + inserts := d.queue.Schedule(chunkHeaders, chunkHashes, origin) + if len(inserts) != len(chunkHeaders) { + rollbackErr = fmt.Errorf("stale headers: len inserts %v len(chunk) %v", len(inserts), len(chunkHeaders)) return fmt.Errorf("%w: stale headers", errBadPeer) } } headers = headers[limit:] + hashes = hashes[limit:] origin += uint64(limit) } // Update the highest block number we know if a higher one is found. @@ -1674,7 +1331,7 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { d.syncStatsLock.Unlock() // Signal the content downloaders of the availablility of new tasks - for _, ch := range []chan bool{d.bodyWakeCh, d.receiptWakeCh} { + for _, ch := range []chan bool{d.queue.blockWakeCh, d.queue.receiptWakeCh} { select { case ch <- true: default: @@ -1720,6 +1377,9 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error { for i, result := range results { blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) } + // Downloaded blocks are always regarded as trusted after the + // transition. Because the downloaded chain is guided by the + // consensus-layer. if index, err := d.blockchain.InsertChain(blocks); err != nil { if index < len(results) { log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err) @@ -1735,9 +1395,9 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error { return nil } -// processFastSyncContent takes fetch results from the queue and writes them to the +// processSnapSyncContent takes fetch results from the queue and writes them to the // database. It also controls the synchronisation of state nodes of the pivot block. -func (d *Downloader) processFastSyncContent() error { +func (d *Downloader) processSnapSyncContent() error { // Start syncing state of the reported head block. This should get us most of // the state of the pivot block. d.pivotLock.RLock() @@ -1800,7 +1460,7 @@ func (d *Downloader) processFastSyncContent() error { } else { results = append(append([]*fetchResult{oldPivot}, oldTail...), results...) } - // Split around the pivot block and process the two sides via fast/full sync + // Split around the pivot block and process the two sides via snap/full sync if atomic.LoadInt32(&d.committed) == 0 { latest := results[len(results)-1].Header // If the height is above the pivot block by 2 sets, it means the pivot @@ -1819,12 +1479,12 @@ func (d *Downloader) processFastSyncContent() error { d.pivotLock.Unlock() // Write out the pivot into the database so a rollback beyond it will - // reenable fast sync + // reenable snap sync rawdb.WriteLastPivotNumber(d.stateDB, pivot.Number.Uint64()) } } P, beforeP, afterP := splitAroundPivot(pivot.Number.Uint64(), results) - if err := d.commitFastSyncData(beforeP, sync); err != nil { + if err := d.commitSnapSyncData(beforeP, sync); err != nil { return err } if P != nil { @@ -1882,7 +1542,7 @@ func splitAroundPivot(pivot uint64, results []*fetchResult) (p *fetchResult, bef return p, before, after } -func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *stateSync) error { +func (d *Downloader) commitSnapSyncData(results []*fetchResult, stateSync *stateSync) error { // Check for any early termination requests if len(results) == 0 { return nil @@ -1898,7 +1558,7 @@ func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *state } // Retrieve the a batch of results to import first, last := results[0].Header, results[len(results)-1].Header - log.Debug("Inserting fast-sync blocks", "items", len(results), + log.Debug("Inserting snap-sync blocks", "items", len(results), "firstnum", first.Number, "firsthash", first.Hash(), "lastnumn", last.Number, "lasthash", last.Hash(), ) @@ -1917,49 +1577,19 @@ func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *state func (d *Downloader) commitPivotBlock(result *fetchResult) error { block := types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) - log.Debug("Committing fast sync pivot as new head", "number", block.Number(), "hash", block.Hash()) + log.Debug("Committing snap sync pivot as new head", "number", block.Number(), "hash", block.Hash()) // Commit the pivot block as the new head, will require full sync from here on if _, err := d.blockchain.InsertReceiptChain([]*types.Block{block}, []types.Receipts{result.Receipts}, d.ancientLimit); err != nil { return err } - if err := d.blockchain.FastSyncCommitHead(block.Hash()); err != nil { + if err := d.blockchain.SnapSyncCommitHead(block.Hash()); err != nil { return err } atomic.StoreInt32(&d.committed, 1) - - // If we had a bloom filter for the state sync, deallocate it now. Note, we only - // deallocate internally, but keep the empty wrapper. This ensures that if we do - // a rollback after committing the pivot and restarting fast sync, we don't end - // up using a nil bloom. Empty bloom is fine, it just returns that it does not - // have the info we need, so reach down to the database instead. - if d.stateBloom != nil { - d.stateBloom.Close() - } return nil } -// DeliverHeaders injects a new batch of block headers received from a remote -// node into the download schedule. -func (d *Downloader) DeliverHeaders(id string, headers []*types.Header) error { - return d.deliver(d.headerCh, &headerPack{id, headers}, headerInMeter, headerDropMeter) -} - -// DeliverBodies injects a new batch of block bodies received from a remote node. -func (d *Downloader) DeliverBodies(id string, transactions [][]*types.Transaction, uncles [][]*types.Header) error { - return d.deliver(d.bodyCh, &bodyPack{id, transactions, uncles}, bodyInMeter, bodyDropMeter) -} - -// DeliverReceipts injects a new batch of receipts received from a remote node. -func (d *Downloader) DeliverReceipts(id string, receipts [][]*types.Receipt) error { - return d.deliver(d.receiptCh, &receiptPack{id, receipts}, receiptInMeter, receiptDropMeter) -} - -// DeliverNodeData injects a new batch of node state data received from a remote node. -func (d *Downloader) DeliverNodeData(id string, data [][]byte) error { - return d.deliver(d.stateCh, &statePack{id, data}, stateInMeter, stateDropMeter) -} - // DeliverSnapPacket is invoked from a peer's message handler when it transmits a // data packet for the local node to consume. func (d *Downloader) DeliverSnapPacket(peer *snap.Peer, packet snap.Packet) error { @@ -1985,27 +1615,3 @@ func (d *Downloader) DeliverSnapPacket(peer *snap.Peer, packet snap.Packet) erro return fmt.Errorf("unexpected snap packet type: %T", packet) } } - -// deliver injects a new batch of data received from a remote node. -func (d *Downloader) deliver(destCh chan dataPack, packet dataPack, inMeter, dropMeter metrics.Meter) (err error) { - // Update the delivery metrics for both good and failed deliveries - inMeter.Mark(int64(packet.Items())) - defer func() { - if err != nil { - dropMeter.Mark(int64(packet.Items())) - } - }() - // Deliver or abort if the sync is canceled while queuing - d.cancelLock.RLock() - cancel := d.cancelCh - d.cancelLock.RUnlock() - if cancel == nil { - return errNoSyncActive - } - select { - case destCh <- packet: - return nil - case <-cancel: - return errNoSyncActive - } -} diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 17cd3630c9..70c6a51215 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -19,7 +19,9 @@ package downloader import ( "errors" "fmt" + "io/ioutil" "math/big" + "os" "strings" "sync" "sync/atomic" @@ -28,68 +30,52 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" - "github.com/ethereum/go-ethereum/core/state/snapshot" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/protocols/eth" - "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" ) -// Reduce some of the parameters to make the tester faster. -func init() { - fullMaxForkAncestry = 10000 - lightMaxForkAncestry = 10000 - blockCacheMaxItems = 1024 - fsHeaderContCheck = 500 * time.Millisecond -} - // downloadTester is a test simulator for mocking out local block chain. type downloadTester struct { + freezer string + chain *core.BlockChain downloader *Downloader - genesis *types.Block // Genesis blocks used by the tester and peers - stateDb ethdb.Database // Database used by the tester for syncing from peers - peerDb ethdb.Database // Database of the peers containing all data - peers map[string]*downloadTesterPeer - - ownHashes []common.Hash // Hash chain belonging to the tester - ownHeaders map[common.Hash]*types.Header // Headers belonging to the tester - ownBlocks map[common.Hash]*types.Block // Blocks belonging to the tester - ownReceipts map[common.Hash]types.Receipts // Receipts belonging to the tester - ownChainTd map[common.Hash]*big.Int // Total difficulties of the blocks in the local chain - - ancientHeaders map[common.Hash]*types.Header // Ancient headers belonging to the tester - ancientBlocks map[common.Hash]*types.Block // Ancient blocks belonging to the tester - ancientReceipts map[common.Hash]types.Receipts // Ancient receipts belonging to the tester - ancientChainTd map[common.Hash]*big.Int // Ancient total difficulties of the blocks in the local chain - - lock sync.RWMutex + peers map[string]*downloadTesterPeer + lock sync.RWMutex } // newTester creates a new downloader test mocker. func newTester() *downloadTester { + freezer, err := ioutil.TempDir("", "") + if err != nil { + panic(err) + } + db, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), freezer, "", false) + if err != nil { + panic(err) + } + core.GenesisBlockForTesting(db, testAddress, big.NewInt(1000000000000000)) + + chain, err := core.NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil) + if err != nil { + panic(err) + } tester := &downloadTester{ - genesis: testGenesis, - peerDb: testDB, - peers: make(map[string]*downloadTesterPeer), - ownHashes: []common.Hash{testGenesis.Hash()}, - ownHeaders: map[common.Hash]*types.Header{testGenesis.Hash(): testGenesis.Header()}, - ownBlocks: map[common.Hash]*types.Block{testGenesis.Hash(): testGenesis}, - ownReceipts: map[common.Hash]types.Receipts{testGenesis.Hash(): nil}, - ownChainTd: map[common.Hash]*big.Int{testGenesis.Hash(): testGenesis.Difficulty()}, - - // Initialize ancient store with test genesis block - ancientHeaders: map[common.Hash]*types.Header{testGenesis.Hash(): testGenesis.Header()}, - ancientBlocks: map[common.Hash]*types.Block{testGenesis.Hash(): testGenesis}, - ancientReceipts: map[common.Hash]types.Receipts{testGenesis.Hash(): nil}, - ancientChainTd: map[common.Hash]*big.Int{testGenesis.Hash(): testGenesis.Difficulty()}, - } - tester.stateDb = rawdb.NewMemoryDatabase() - tester.stateDb.Put(testGenesis.Root().Bytes(), []byte{0x00}) - - tester.downloader = New(0, tester.stateDb, trie.NewSyncBloom(1, tester.stateDb), new(event.TypeMux), tester, nil, tester.dropPeer) + freezer: freezer, + chain: chain, + peers: make(map[string]*downloadTesterPeer), + } + tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer) return tester } @@ -97,20 +83,20 @@ func newTester() *downloadTester { // held resources. func (dl *downloadTester) terminate() { dl.downloader.Terminate() + dl.chain.Stop() + + os.RemoveAll(dl.freezer) } // sync starts synchronizing with a remote peer, blocking until it completes. func (dl *downloadTester) sync(id string, td *big.Int, mode SyncMode) error { - dl.lock.RLock() - hash := dl.peers[id].chain.headBlock().Hash() - // If no particular TD was requested, load from the peer's blockchain + head := dl.peers[id].chain.CurrentBlock() if td == nil { - td = dl.peers[id].chain.td(hash) + // If no particular TD was requested, load from the peer's blockchain + td = dl.peers[id].chain.GetTd(head.Hash(), head.NumberU64()) } - dl.lock.RUnlock() - // Synchronise with the chosen peer and ensure proper cleanup afterwards - err := dl.downloader.synchronise(id, hash, td, mode) + err := dl.downloader.synchronise(id, head.Hash(), td, mode) select { case <-dl.downloader.cancelCh: // Ok, downloader fully cancelled after sync cycle @@ -121,367 +107,306 @@ func (dl *downloadTester) sync(id string, td *big.Int, mode SyncMode) error { return err } -// HasHeader checks if a header is present in the testers canonical chain. -func (dl *downloadTester) HasHeader(hash common.Hash, number uint64) bool { - return dl.GetHeaderByHash(hash) != nil -} - -// HasBlock checks if a block is present in the testers canonical chain. -func (dl *downloadTester) HasBlock(hash common.Hash, number uint64) bool { - return dl.GetBlockByHash(hash) != nil -} +// newPeer registers a new block download source into the downloader. +func (dl *downloadTester) newPeer(id string, version uint, blocks []*types.Block) *downloadTesterPeer { + dl.lock.Lock() + defer dl.lock.Unlock() -// HasFastBlock checks if a block is present in the testers canonical chain. -func (dl *downloadTester) HasFastBlock(hash common.Hash, number uint64) bool { - dl.lock.RLock() - defer dl.lock.RUnlock() + peer := &downloadTesterPeer{ + dl: dl, + id: id, + chain: newTestBlockchain(blocks), + withholdHeaders: make(map[common.Hash]struct{}), + } + dl.peers[id] = peer - if _, ok := dl.ancientReceipts[hash]; ok { - return true + if err := dl.downloader.RegisterPeer(id, version, peer); err != nil { + panic(err) + } + if err := dl.downloader.SnapSyncer.Register(peer); err != nil { + panic(err) } - _, ok := dl.ownReceipts[hash] - return ok + return peer } -// GetHeader retrieves a header from the testers canonical chain. -func (dl *downloadTester) GetHeaderByHash(hash common.Hash) *types.Header { - dl.lock.RLock() - defer dl.lock.RUnlock() - return dl.getHeaderByHash(hash) -} +// dropPeer simulates a hard peer removal from the connection pool. +func (dl *downloadTester) dropPeer(id string) { + dl.lock.Lock() + defer dl.lock.Unlock() -// getHeaderByHash returns the header if found either within ancients or own blocks) -// This method assumes that the caller holds at least the read-lock (dl.lock) -func (dl *downloadTester) getHeaderByHash(hash common.Hash) *types.Header { - header := dl.ancientHeaders[hash] - if header != nil { - return header - } - return dl.ownHeaders[hash] + delete(dl.peers, id) + dl.downloader.SnapSyncer.Unregister(id) + dl.downloader.UnregisterPeer(id) } -// GetBlock retrieves a block from the testers canonical chain. -func (dl *downloadTester) GetBlockByHash(hash common.Hash) *types.Block { - dl.lock.RLock() - defer dl.lock.RUnlock() +type downloadTesterPeer struct { + dl *downloadTester + id string + chain *core.BlockChain - block := dl.ancientBlocks[hash] - if block != nil { - return block - } - return dl.ownBlocks[hash] + withholdHeaders map[common.Hash]struct{} } -// CurrentHeader retrieves the current head header from the canonical chain. -func (dl *downloadTester) CurrentHeader() *types.Header { - dl.lock.RLock() - defer dl.lock.RUnlock() +// Head constructs a function to retrieve a peer's current head hash +// and total difficulty. +func (dlp *downloadTesterPeer) Head() (common.Hash, *big.Int) { + head := dlp.chain.CurrentBlock() + return head.Hash(), dlp.chain.GetTd(head.Hash(), head.NumberU64()) +} - for i := len(dl.ownHashes) - 1; i >= 0; i-- { - if header := dl.ancientHeaders[dl.ownHashes[i]]; header != nil { - return header - } - if header := dl.ownHeaders[dl.ownHashes[i]]; header != nil { - return header +func unmarshalRlpHeaders(rlpdata []rlp.RawValue) []*types.Header { + var headers = make([]*types.Header, len(rlpdata)) + for i, data := range rlpdata { + var h types.Header + if err := rlp.DecodeBytes(data, &h); err != nil { + panic(err) } + headers[i] = &h } - return dl.genesis.Header() + return headers } -// CurrentBlock retrieves the current head block from the canonical chain. -func (dl *downloadTester) CurrentBlock() *types.Block { - dl.lock.RLock() - defer dl.lock.RUnlock() - - for i := len(dl.ownHashes) - 1; i >= 0; i-- { - if block := dl.ancientBlocks[dl.ownHashes[i]]; block != nil { - if _, err := dl.stateDb.Get(block.Root().Bytes()); err == nil { - return block - } - return block - } - if block := dl.ownBlocks[dl.ownHashes[i]]; block != nil { - if _, err := dl.stateDb.Get(block.Root().Bytes()); err == nil { - return block +// RequestHeadersByHash constructs a GetBlockHeaders function based on a hashed +// origin; associated with a particular peer in the download tester. The returned +// function can be used to retrieve batches of headers from the particular peer. +func (dlp *downloadTesterPeer) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool, sink chan *eth.Response) (*eth.Request, error) { + // Service the header query via the live handler code + rlpHeaders := eth.ServiceGetBlockHeadersQuery(dlp.chain, ð.GetBlockHeadersPacket{ + Origin: eth.HashOrNumber{ + Hash: origin, + }, + Amount: uint64(amount), + Skip: uint64(skip), + Reverse: reverse, + }, nil) + headers := unmarshalRlpHeaders(rlpHeaders) + // If a malicious peer is simulated withholding headers, delete them + for hash := range dlp.withholdHeaders { + for i, header := range headers { + if header.Hash() == hash { + headers = append(headers[:i], headers[i+1:]...) + break } } } - return dl.genesis -} - -// CurrentFastBlock retrieves the current head fast-sync block from the canonical chain. -func (dl *downloadTester) CurrentFastBlock() *types.Block { - dl.lock.RLock() - defer dl.lock.RUnlock() - - for i := len(dl.ownHashes) - 1; i >= 0; i-- { - if block := dl.ancientBlocks[dl.ownHashes[i]]; block != nil { - return block - } - if block := dl.ownBlocks[dl.ownHashes[i]]; block != nil { - return block - } + hashes := make([]common.Hash, len(headers)) + for i, header := range headers { + hashes[i] = header.Hash() } - return dl.genesis -} - -// FastSyncCommitHead manually sets the head block to a given hash. -func (dl *downloadTester) FastSyncCommitHead(hash common.Hash) error { - // For now only check that the state trie is correct - if block := dl.GetBlockByHash(hash); block != nil { - _, err := trie.NewSecure(block.Root(), trie.NewDatabase(dl.stateDb)) - return err + // Deliver the headers to the downloader + req := ð.Request{ + Peer: dlp.id, } - return fmt.Errorf("non existent block: %x", hash[:4]) -} - -// GetTd retrieves the block's total difficulty from the canonical chain. -func (dl *downloadTester) GetTd(hash common.Hash, number uint64) *big.Int { - dl.lock.RLock() - defer dl.lock.RUnlock() - - return dl.getTd(hash) -} - -// getTd retrieves the block's total difficulty if found either within -// ancients or own blocks). -// This method assumes that the caller holds at least the read-lock (dl.lock) -func (dl *downloadTester) getTd(hash common.Hash) *big.Int { - if td := dl.ancientChainTd[hash]; td != nil { - return td + res := ð.Response{ + Req: req, + Res: (*eth.BlockHeadersPacket)(&headers), + Meta: hashes, + Time: 1, + Done: make(chan error, 1), // Ignore the returned status } - return dl.ownChainTd[hash] + go func() { + sink <- res + }() + return req, nil } -// InsertHeaderChain injects a new batch of headers into the simulated chain. -func (dl *downloadTester) InsertHeaderChain(headers []*types.Header, checkFreq int) (i int, err error) { - dl.lock.Lock() - defer dl.lock.Unlock() - // Do a quick check, as the blockchain.InsertHeaderChain doesn't insert anything in case of errors - if dl.getHeaderByHash(headers[0].ParentHash) == nil { - return 0, fmt.Errorf("InsertHeaderChain: unknown parent at first position, parent of number %d", headers[0].Number) - } - var hashes []common.Hash - for i := 1; i < len(headers); i++ { - hash := headers[i-1].Hash() - if headers[i].ParentHash != headers[i-1].Hash() { - return i, fmt.Errorf("non-contiguous import at position %d", i) +// RequestHeadersByNumber constructs a GetBlockHeaders function based on a numbered +// origin; associated with a particular peer in the download tester. The returned +// function can be used to retrieve batches of headers from the particular peer. +func (dlp *downloadTesterPeer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool, sink chan *eth.Response) (*eth.Request, error) { + // Service the header query via the live handler code + rlpHeaders := eth.ServiceGetBlockHeadersQuery(dlp.chain, ð.GetBlockHeadersPacket{ + Origin: eth.HashOrNumber{ + Number: origin, + }, + Amount: uint64(amount), + Skip: uint64(skip), + Reverse: reverse, + }, nil) + headers := unmarshalRlpHeaders(rlpHeaders) + // If a malicious peer is simulated withholding headers, delete them + for hash := range dlp.withholdHeaders { + for i, header := range headers { + if header.Hash() == hash { + headers = append(headers[:i], headers[i+1:]...) + break + } } - hashes = append(hashes, hash) } - hashes = append(hashes, headers[len(headers)-1].Hash()) - // Do a full insert if pre-checks passed + hashes := make([]common.Hash, len(headers)) for i, header := range headers { - hash := hashes[i] - if dl.getHeaderByHash(hash) != nil { - continue - } - if dl.getHeaderByHash(header.ParentHash) == nil { - // This _should_ be impossible, due to precheck and induction - return i, fmt.Errorf("InsertHeaderChain: unknown parent at position %d", i) - } - dl.ownHashes = append(dl.ownHashes, hash) - dl.ownHeaders[hash] = header - - td := dl.getTd(header.ParentHash) - dl.ownChainTd[hash] = new(big.Int).Add(td, header.Difficulty) + hashes[i] = header.Hash() } - return len(headers), nil -} - -// InsertChain injects a new batch of blocks into the simulated chain. -func (dl *downloadTester) InsertChain(blocks types.Blocks) (i int, err error) { - dl.lock.Lock() - defer dl.lock.Unlock() - for i, block := range blocks { - if parent, ok := dl.ownBlocks[block.ParentHash()]; !ok { - return i, fmt.Errorf("InsertChain: unknown parent at position %d / %d", i, len(blocks)) - } else if _, err := dl.stateDb.Get(parent.Root().Bytes()); err != nil { - return i, fmt.Errorf("InsertChain: unknown parent state %x: %v", parent.Root(), err) - } - if hdr := dl.getHeaderByHash(block.Hash()); hdr == nil { - dl.ownHashes = append(dl.ownHashes, block.Hash()) - dl.ownHeaders[block.Hash()] = block.Header() - } - dl.ownBlocks[block.Hash()] = block - dl.ownReceipts[block.Hash()] = make(types.Receipts, 0) - dl.stateDb.Put(block.Root().Bytes(), []byte{0x00}) - td := dl.getTd(block.ParentHash()) - dl.ownChainTd[block.Hash()] = new(big.Int).Add(td, block.Difficulty()) + // Deliver the headers to the downloader + req := ð.Request{ + Peer: dlp.id, + } + res := ð.Response{ + Req: req, + Res: (*eth.BlockHeadersPacket)(&headers), + Meta: hashes, + Time: 1, + Done: make(chan error, 1), // Ignore the returned status } - return len(blocks), nil + go func() { + sink <- res + }() + return req, nil } -// InsertReceiptChain injects a new batch of receipts into the simulated chain. -func (dl *downloadTester) InsertReceiptChain(blocks types.Blocks, receipts []types.Receipts, ancientLimit uint64) (i int, err error) { - dl.lock.Lock() - defer dl.lock.Unlock() - - for i := 0; i < len(blocks) && i < len(receipts); i++ { - if _, ok := dl.ownHeaders[blocks[i].Hash()]; !ok { - return i, errors.New("unknown owner") - } - if _, ok := dl.ancientBlocks[blocks[i].ParentHash()]; !ok { - if _, ok := dl.ownBlocks[blocks[i].ParentHash()]; !ok { - return i, errors.New("InsertReceiptChain: unknown parent") - } - } - if blocks[i].NumberU64() <= ancientLimit { - dl.ancientBlocks[blocks[i].Hash()] = blocks[i] - dl.ancientReceipts[blocks[i].Hash()] = receipts[i] - - // Migrate from active db to ancient db - dl.ancientHeaders[blocks[i].Hash()] = blocks[i].Header() - dl.ancientChainTd[blocks[i].Hash()] = new(big.Int).Add(dl.ancientChainTd[blocks[i].ParentHash()], blocks[i].Difficulty()) - delete(dl.ownHeaders, blocks[i].Hash()) - delete(dl.ownChainTd, blocks[i].Hash()) - } else { - dl.ownBlocks[blocks[i].Hash()] = blocks[i] - dl.ownReceipts[blocks[i].Hash()] = receipts[i] - } +// RequestBodies constructs a getBlockBodies method associated with a particular +// peer in the download tester. The returned function can be used to retrieve +// batches of block bodies from the particularly requested peer. +func (dlp *downloadTesterPeer) RequestBodies(hashes []common.Hash, sink chan *eth.Response) (*eth.Request, error) { + blobs := eth.ServiceGetBlockBodiesQuery(dlp.chain, hashes) + + bodies := make([]*eth.BlockBody, len(blobs)) + for i, blob := range blobs { + bodies[i] = new(eth.BlockBody) + rlp.DecodeBytes(blob, bodies[i]) + } + var ( + txsHashes = make([]common.Hash, len(bodies)) + uncleHashes = make([]common.Hash, len(bodies)) + ) + hasher := trie.NewStackTrie(nil) + for i, body := range bodies { + txsHashes[i] = types.DeriveSha(types.Transactions(body.Transactions), hasher) + uncleHashes[i] = types.CalcUncleHash(body.Uncles) + } + req := ð.Request{ + Peer: dlp.id, + } + res := ð.Response{ + Req: req, + Res: (*eth.BlockBodiesPacket)(&bodies), + Meta: [][]common.Hash{txsHashes, uncleHashes}, + Time: 1, + Done: make(chan error, 1), // Ignore the returned status } - return len(blocks), nil + go func() { + sink <- res + }() + return req, nil } -// SetHead rewinds the local chain to a new head. -func (dl *downloadTester) SetHead(head uint64) error { - dl.lock.Lock() - defer dl.lock.Unlock() +// RequestReceipts constructs a getReceipts method associated with a particular +// peer in the download tester. The returned function can be used to retrieve +// batches of block receipts from the particularly requested peer. +func (dlp *downloadTesterPeer) RequestReceipts(hashes []common.Hash, sink chan *eth.Response) (*eth.Request, error) { + blobs := eth.ServiceGetReceiptsQuery(dlp.chain, hashes) - // Find the hash of the head to reset to - var hash common.Hash - for h, header := range dl.ownHeaders { - if header.Number.Uint64() == head { - hash = h - } + receipts := make([][]*types.Receipt, len(blobs)) + for i, blob := range blobs { + rlp.DecodeBytes(blob, &receipts[i]) } - for h, header := range dl.ancientHeaders { - if header.Number.Uint64() == head { - hash = h - } - } - if hash == (common.Hash{}) { - return fmt.Errorf("unknown head to set: %d", head) + hasher := trie.NewStackTrie(nil) + hashes = make([]common.Hash, len(receipts)) + for i, receipt := range receipts { + hashes[i] = types.DeriveSha(types.Receipts(receipt), hasher) } - // Find the offset in the header chain - var offset int - for o, h := range dl.ownHashes { - if h == hash { - offset = o - break - } + req := ð.Request{ + Peer: dlp.id, } - // Remove all the hashes and associated data afterwards - for i := offset + 1; i < len(dl.ownHashes); i++ { - delete(dl.ownChainTd, dl.ownHashes[i]) - delete(dl.ownHeaders, dl.ownHashes[i]) - delete(dl.ownReceipts, dl.ownHashes[i]) - delete(dl.ownBlocks, dl.ownHashes[i]) - - delete(dl.ancientChainTd, dl.ownHashes[i]) - delete(dl.ancientHeaders, dl.ownHashes[i]) - delete(dl.ancientReceipts, dl.ownHashes[i]) - delete(dl.ancientBlocks, dl.ownHashes[i]) + res := ð.Response{ + Req: req, + Res: (*eth.ReceiptsPacket)(&receipts), + Meta: hashes, + Time: 1, + Done: make(chan error, 1), // Ignore the returned status } - dl.ownHashes = dl.ownHashes[:offset+1] - return nil -} - -// Rollback removes some recently added elements from the chain. -func (dl *downloadTester) Rollback(hashes []common.Hash) { + go func() { + sink <- res + }() + return req, nil } -// newPeer registers a new block download source into the downloader. -func (dl *downloadTester) newPeer(id string, version uint, chain *testChain) error { - dl.lock.Lock() - defer dl.lock.Unlock() - - peer := &downloadTesterPeer{dl: dl, id: id, chain: chain} - dl.peers[id] = peer - return dl.downloader.RegisterPeer(id, version, peer) +// ID retrieves the peer's unique identifier. +func (dlp *downloadTesterPeer) ID() string { + return dlp.id } -// dropPeer simulates a hard peer removal from the connection pool. -func (dl *downloadTester) dropPeer(id string) { - dl.lock.Lock() - defer dl.lock.Unlock() +// RequestAccountRange fetches a batch of accounts rooted in a specific account +// trie, starting with the origin. +func (dlp *downloadTesterPeer) RequestAccountRange(id uint64, root, origin, limit common.Hash, bytes uint64) error { + // Create the request and service it + req := &snap.GetAccountRangePacket{ + ID: id, + Root: root, + Origin: origin, + Limit: limit, + Bytes: bytes, + } + slimaccs, proofs := snap.ServiceGetAccountRangeQuery(dlp.chain, req) - delete(dl.peers, id) - dl.downloader.UnregisterPeer(id) -} + // We need to convert to non-slim format, delegate to the packet code + res := &snap.AccountRangePacket{ + ID: id, + Accounts: slimaccs, + Proof: proofs, + } + hashes, accounts, _ := res.Unpack() -// Snapshots implements the BlockChain interface for the downloader, but is a noop. -func (dl *downloadTester) Snapshots() *snapshot.Tree { + go dlp.dl.downloader.SnapSyncer.OnAccounts(dlp, id, hashes, accounts, proofs) return nil } -type downloadTesterPeer struct { - dl *downloadTester - id string - chain *testChain - missingStates map[common.Hash]bool // State entries that fast sync should not return -} - -// Head constructs a function to retrieve a peer's current head hash -// and total difficulty. -func (dlp *downloadTesterPeer) Head() (common.Hash, *big.Int) { - b := dlp.chain.headBlock() - return b.Hash(), dlp.chain.td(b.Hash()) -} +// RequestStorageRanges fetches a batch of storage slots belonging to one or +// more accounts. If slots from only one accout is requested, an origin marker +// may also be used to retrieve from there. +func (dlp *downloadTesterPeer) RequestStorageRanges(id uint64, root common.Hash, accounts []common.Hash, origin, limit []byte, bytes uint64) error { + // Create the request and service it + req := &snap.GetStorageRangesPacket{ + ID: id, + Accounts: accounts, + Root: root, + Origin: origin, + Limit: limit, + Bytes: bytes, + } + storage, proofs := snap.ServiceGetStorageRangesQuery(dlp.chain, req) -// RequestHeadersByHash constructs a GetBlockHeaders function based on a hashed -// origin; associated with a particular peer in the download tester. The returned -// function can be used to retrieve batches of headers from the particular peer. -func (dlp *downloadTesterPeer) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error { - result := dlp.chain.headersByHash(origin, amount, skip, reverse) - go dlp.dl.downloader.DeliverHeaders(dlp.id, result) - return nil -} + // We need to convert to demultiplex, delegate to the packet code + res := &snap.StorageRangesPacket{ + ID: id, + Slots: storage, + Proof: proofs, + } + hashes, slots := res.Unpack() -// RequestHeadersByNumber constructs a GetBlockHeaders function based on a numbered -// origin; associated with a particular peer in the download tester. The returned -// function can be used to retrieve batches of headers from the particular peer. -func (dlp *downloadTesterPeer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { - result := dlp.chain.headersByNumber(origin, amount, skip, reverse) - go dlp.dl.downloader.DeliverHeaders(dlp.id, result) + go dlp.dl.downloader.SnapSyncer.OnStorage(dlp, id, hashes, slots, proofs) return nil } -// RequestBodies constructs a getBlockBodies method associated with a particular -// peer in the download tester. The returned function can be used to retrieve -// batches of block bodies from the particularly requested peer. -func (dlp *downloadTesterPeer) RequestBodies(hashes []common.Hash) error { - txs, uncles := dlp.chain.bodies(hashes) - go dlp.dl.downloader.DeliverBodies(dlp.id, txs, uncles) +// RequestByteCodes fetches a batch of bytecodes by hash. +func (dlp *downloadTesterPeer) RequestByteCodes(id uint64, hashes []common.Hash, bytes uint64) error { + req := &snap.GetByteCodesPacket{ + ID: id, + Hashes: hashes, + Bytes: bytes, + } + codes := snap.ServiceGetByteCodesQuery(dlp.chain, req) + go dlp.dl.downloader.SnapSyncer.OnByteCodes(dlp, id, codes) return nil } -// RequestReceipts constructs a getReceipts method associated with a particular -// peer in the download tester. The returned function can be used to retrieve -// batches of block receipts from the particularly requested peer. -func (dlp *downloadTesterPeer) RequestReceipts(hashes []common.Hash) error { - receipts := dlp.chain.receipts(hashes) - go dlp.dl.downloader.DeliverReceipts(dlp.id, receipts) +// RequestTrieNodes fetches a batch of account or storage trie nodes rooted in +// a specificstate trie. +func (dlp *downloadTesterPeer) RequestTrieNodes(id uint64, root common.Hash, paths []snap.TrieNodePathSet, bytes uint64) error { + req := &snap.GetTrieNodesPacket{ + ID: id, + Root: root, + Paths: paths, + Bytes: bytes, + } + nodes, _ := snap.ServiceGetTrieNodesQuery(dlp.chain, req, time.Now()) + go dlp.dl.downloader.SnapSyncer.OnTrieNodes(dlp, id, nodes) return nil } -// RequestNodeData constructs a getNodeData method associated with a particular -// peer in the download tester. The returned function can be used to retrieve -// batches of node state data from the particularly requested peer. -func (dlp *downloadTesterPeer) RequestNodeData(hashes []common.Hash) error { - dlp.dl.lock.RLock() - defer dlp.dl.lock.RUnlock() - - results := make([][]byte, 0, len(hashes)) - for _, hash := range hashes { - if data, err := dlp.dl.peerDb.Get(hash.Bytes()); err == nil { - if !dlp.missingStates[hash] { - results = append(results, data) - } - } - } - go dlp.dl.downloader.DeliverNodeData(dlp.id, results) - return nil +// Log retrieves the peer's own contextual logger. +func (dlp *downloadTesterPeer) Log() log.Logger { + return log.New("peer", dlp.id) } // assertOwnChain checks if the local chain contains the correct number of items @@ -490,71 +415,52 @@ func assertOwnChain(t *testing.T, tester *downloadTester, length int) { // Mark this method as a helper to report errors at callsite, not in here t.Helper() - assertOwnForkedChain(t, tester, 1, []int{length}) -} - -// assertOwnForkedChain checks if the local forked chain contains the correct -// number of items of the various chain components. -func assertOwnForkedChain(t *testing.T, tester *downloadTester, common int, lengths []int) { - // Mark this method as a helper to report errors at callsite, not in here - t.Helper() - - // Initialize the counters for the first fork - headers, blocks, receipts := lengths[0], lengths[0], lengths[0] - - // Update the counters for each subsequent fork - for _, length := range lengths[1:] { - headers += length - common - blocks += length - common - receipts += length - common - } + headers, blocks, receipts := length, length, length if tester.downloader.getMode() == LightSync { blocks, receipts = 1, 1 } - if hs := len(tester.ownHeaders) + len(tester.ancientHeaders) - 1; hs != headers { + if hs := int(tester.chain.CurrentHeader().Number.Uint64()) + 1; hs != headers { t.Fatalf("synchronised headers mismatch: have %v, want %v", hs, headers) } - if bs := len(tester.ownBlocks) + len(tester.ancientBlocks) - 1; bs != blocks { + if bs := int(tester.chain.CurrentBlock().NumberU64()) + 1; bs != blocks { t.Fatalf("synchronised blocks mismatch: have %v, want %v", bs, blocks) } - if rs := len(tester.ownReceipts) + len(tester.ancientReceipts) - 1; rs != receipts { + if rs := int(tester.chain.CurrentFastBlock().NumberU64()) + 1; rs != receipts { t.Fatalf("synchronised receipts mismatch: have %v, want %v", rs, receipts) } } func TestCanonicalSynchronisation66Full(t *testing.T) { testCanonSync(t, eth.ETH66, FullSync) } -func TestCanonicalSynchronisation66Fast(t *testing.T) { testCanonSync(t, eth.ETH66, FastSync) } +func TestCanonicalSynchronisation66Snap(t *testing.T) { testCanonSync(t, eth.ETH66, SnapSync) } func TestCanonicalSynchronisation66Light(t *testing.T) { testCanonSync(t, eth.ETH66, LightSync) } func testCanonSync(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() // Create a small enough block chain to download chain := testChainBase.shorten(blockCacheMaxItems - 15) - tester.newPeer("peer", protocol, chain) + tester.newPeer("peer", protocol, chain.blocks[1:]) // Synchronise with the peer and make sure all relevant data was retrieved if err := tester.sync("peer", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chain.len()) + assertOwnChain(t, tester, len(chain.blocks)) } // Tests that if a large batch of blocks are being downloaded, it is throttled // until the cached blocks are retrieved. func TestThrottling66Full(t *testing.T) { testThrottling(t, eth.ETH66, FullSync) } -func TestThrottling66Fast(t *testing.T) { testThrottling(t, eth.ETH66, FastSync) } +func TestThrottling66Snap(t *testing.T) { testThrottling(t, eth.ETH66, SnapSync) } func testThrottling(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() tester := newTester() + defer tester.terminate() // Create a long block chain to download and the tester - targetBlocks := testChainBase.len() - 1 - tester.newPeer("peer", protocol, testChainBase) + targetBlocks := len(testChainBase.blocks) - 1 + tester.newPeer("peer", protocol, testChainBase.blocks[1:]) // Wrap the importer to allow stepping blocked, proceed := uint32(0), make(chan struct{}) @@ -571,7 +477,7 @@ func testThrottling(t *testing.T, protocol uint, mode SyncMode) { for { // Check the retrieval count synchronously (! reason for this ugly block) tester.lock.RLock() - retrieved := len(tester.ownBlocks) + retrieved := int(tester.chain.CurrentFastBlock().Number().Uint64()) + 1 tester.lock.RUnlock() if retrieved >= targetBlocks+1 { break @@ -587,7 +493,7 @@ func testThrottling(t *testing.T, protocol uint, mode SyncMode) { { cached = tester.downloader.queue.resultCache.countCompleted() frozen = int(atomic.LoadUint32(&blocked)) - retrieved = len(tester.ownBlocks) + retrieved = int(tester.chain.CurrentFastBlock().Number().Uint64()) + 1 } tester.downloader.queue.resultCache.lock.Unlock() tester.downloader.queue.lock.Unlock() @@ -603,12 +509,11 @@ func testThrottling(t *testing.T, protocol uint, mode SyncMode) { // Make sure we filled up the cache, then exhaust it time.Sleep(25 * time.Millisecond) // give it a chance to screw up tester.lock.RLock() - retrieved = len(tester.ownBlocks) + retrieved = int(tester.chain.CurrentFastBlock().Number().Uint64()) + 1 tester.lock.RUnlock() if cached != blockCacheMaxItems && cached != blockCacheMaxItems-reorgProtHeaderDelay && retrieved+cached+frozen != targetBlocks+1 && retrieved+cached+frozen != targetBlocks+1-reorgProtHeaderDelay { t.Fatalf("block count mismatch: have %v, want %v (owned %v, blocked %v, target %v)", cached, blockCacheMaxItems, retrieved, frozen, targetBlocks+1) } - // Permit the blocked blocks to import if atomic.LoadUint32(&blocked) > 0 { atomic.StoreUint32(&blocked, uint32(0)) @@ -620,93 +525,85 @@ func testThrottling(t *testing.T, protocol uint, mode SyncMode) { if err := <-errc; err != nil { t.Fatalf("block synchronization failed: %v", err) } - tester.terminate() - } // Tests that simple synchronization against a forked chain works correctly. In // this test common ancestor lookup should *not* be short circuited, and a full // binary search should be executed. func TestForkedSync66Full(t *testing.T) { testForkedSync(t, eth.ETH66, FullSync) } -func TestForkedSync66Fast(t *testing.T) { testForkedSync(t, eth.ETH66, FastSync) } +func TestForkedSync66Snap(t *testing.T) { testForkedSync(t, eth.ETH66, SnapSync) } func TestForkedSync66Light(t *testing.T) { testForkedSync(t, eth.ETH66, LightSync) } func testForkedSync(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() - chainA := testChainForkLightA.shorten(testChainBase.len() + 80) - chainB := testChainForkLightB.shorten(testChainBase.len() + 80) - tester.newPeer("fork A", protocol, chainA) - tester.newPeer("fork B", protocol, chainB) + chainA := testChainForkLightA.shorten(len(testChainBase.blocks) + 80) + chainB := testChainForkLightB.shorten(len(testChainBase.blocks) + 81) + tester.newPeer("fork A", protocol, chainA.blocks[1:]) + tester.newPeer("fork B", protocol, chainB.blocks[1:]) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("fork A", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chainA.len()) + assertOwnChain(t, tester, len(chainA.blocks)) // Synchronise with the second peer and make sure that fork is pulled too if err := tester.sync("fork B", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnForkedChain(t, tester, testChainBase.len(), []int{chainA.len(), chainB.len()}) + assertOwnChain(t, tester, len(chainB.blocks)) } // Tests that synchronising against a much shorter but much heavyer fork works // corrently and is not dropped. func TestHeavyForkedSync66Full(t *testing.T) { testHeavyForkedSync(t, eth.ETH66, FullSync) } -func TestHeavyForkedSync66Fast(t *testing.T) { testHeavyForkedSync(t, eth.ETH66, FastSync) } +func TestHeavyForkedSync66Snap(t *testing.T) { testHeavyForkedSync(t, eth.ETH66, SnapSync) } func TestHeavyForkedSync66Light(t *testing.T) { testHeavyForkedSync(t, eth.ETH66, LightSync) } func testHeavyForkedSync(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() - chainA := testChainForkLightA.shorten(testChainBase.len() + 80) - chainB := testChainForkHeavy.shorten(testChainBase.len() + 80) - tester.newPeer("light", protocol, chainA) - tester.newPeer("heavy", protocol, chainB) + chainA := testChainForkLightA.shorten(len(testChainBase.blocks) + 80) + chainB := testChainForkHeavy.shorten(len(testChainBase.blocks) + 79) + tester.newPeer("light", protocol, chainA.blocks[1:]) + tester.newPeer("heavy", protocol, chainB.blocks[1:]) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("light", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chainA.len()) + assertOwnChain(t, tester, len(chainA.blocks)) // Synchronise with the second peer and make sure that fork is pulled too if err := tester.sync("heavy", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnForkedChain(t, tester, testChainBase.len(), []int{chainA.len(), chainB.len()}) + assertOwnChain(t, tester, len(chainB.blocks)) } // Tests that chain forks are contained within a certain interval of the current // chain head, ensuring that malicious peers cannot waste resources by feeding // long dead chains. func TestBoundedForkedSync66Full(t *testing.T) { testBoundedForkedSync(t, eth.ETH66, FullSync) } -func TestBoundedForkedSync66Fast(t *testing.T) { testBoundedForkedSync(t, eth.ETH66, FastSync) } +func TestBoundedForkedSync66Snap(t *testing.T) { testBoundedForkedSync(t, eth.ETH66, SnapSync) } func TestBoundedForkedSync66Light(t *testing.T) { testBoundedForkedSync(t, eth.ETH66, LightSync) } func testBoundedForkedSync(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() chainA := testChainForkLightA chainB := testChainForkLightB - tester.newPeer("original", protocol, chainA) - tester.newPeer("rewriter", protocol, chainB) + tester.newPeer("original", protocol, chainA.blocks[1:]) + tester.newPeer("rewriter", protocol, chainB.blocks[1:]) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("original", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chainA.len()) + assertOwnChain(t, tester, len(chainA.blocks)) // Synchronise with the second peer and ensure that the fork is rejected to being too old if err := tester.sync("rewriter", nil, mode); err != errInvalidAncestor { @@ -720,69 +617,46 @@ func testBoundedForkedSync(t *testing.T, protocol uint, mode SyncMode) { func TestBoundedHeavyForkedSync66Full(t *testing.T) { testBoundedHeavyForkedSync(t, eth.ETH66, FullSync) } -func TestBoundedHeavyForkedSync66Fast(t *testing.T) { - testBoundedHeavyForkedSync(t, eth.ETH66, FastSync) +func TestBoundedHeavyForkedSync66Snap(t *testing.T) { + testBoundedHeavyForkedSync(t, eth.ETH66, SnapSync) } func TestBoundedHeavyForkedSync66Light(t *testing.T) { testBoundedHeavyForkedSync(t, eth.ETH66, LightSync) } func testBoundedHeavyForkedSync(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() tester := newTester() + defer tester.terminate() // Create a long enough forked chain chainA := testChainForkLightA chainB := testChainForkHeavy - tester.newPeer("original", protocol, chainA) + tester.newPeer("original", protocol, chainA.blocks[1:]) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("original", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chainA.len()) + assertOwnChain(t, tester, len(chainA.blocks)) - tester.newPeer("heavy-rewriter", protocol, chainB) + tester.newPeer("heavy-rewriter", protocol, chainB.blocks[1:]) // Synchronise with the second peer and ensure that the fork is rejected to being too old if err := tester.sync("heavy-rewriter", nil, mode); err != errInvalidAncestor { t.Fatalf("sync failure mismatch: have %v, want %v", err, errInvalidAncestor) } - tester.terminate() -} - -// Tests that an inactive downloader will not accept incoming block headers, -// bodies and receipts. -func TestInactiveDownloader63(t *testing.T) { - t.Parallel() - - tester := newTester() - defer tester.terminate() - - // Check that neither block headers nor bodies are accepted - if err := tester.downloader.DeliverHeaders("bad peer", []*types.Header{}); err != errNoSyncActive { - t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) - } - if err := tester.downloader.DeliverBodies("bad peer", [][]*types.Transaction{}, [][]*types.Header{}); err != errNoSyncActive { - t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) - } - if err := tester.downloader.DeliverReceipts("bad peer", [][]*types.Receipt{}); err != errNoSyncActive { - t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) - } } // Tests that a canceled download wipes all previously accumulated state. func TestCancel66Full(t *testing.T) { testCancel(t, eth.ETH66, FullSync) } -func TestCancel66Fast(t *testing.T) { testCancel(t, eth.ETH66, FastSync) } +func TestCancel66Snap(t *testing.T) { testCancel(t, eth.ETH66, SnapSync) } func TestCancel66Light(t *testing.T) { testCancel(t, eth.ETH66, LightSync) } func testCancel(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() chain := testChainBase.shorten(MaxHeaderFetch) - tester.newPeer("peer", protocol, chain) + tester.newPeer("peer", protocol, chain.blocks[1:]) // Make sure canceling works with a pristine downloader tester.downloader.Cancel() @@ -801,12 +675,10 @@ func testCancel(t *testing.T, protocol uint, mode SyncMode) { // Tests that synchronisation from multiple peers works as intended (multi thread sanity test). func TestMultiSynchronisation66Full(t *testing.T) { testMultiSynchronisation(t, eth.ETH66, FullSync) } -func TestMultiSynchronisation66Fast(t *testing.T) { testMultiSynchronisation(t, eth.ETH66, FastSync) } +func TestMultiSynchronisation66Snap(t *testing.T) { testMultiSynchronisation(t, eth.ETH66, SnapSync) } func TestMultiSynchronisation66Light(t *testing.T) { testMultiSynchronisation(t, eth.ETH66, LightSync) } func testMultiSynchronisation(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() @@ -816,23 +688,21 @@ func testMultiSynchronisation(t *testing.T, protocol uint, mode SyncMode) { for i := 0; i < targetPeers; i++ { id := fmt.Sprintf("peer #%d", i) - tester.newPeer(id, protocol, chain.shorten(chain.len()/(i+1))) + tester.newPeer(id, protocol, chain.shorten(len(chain.blocks) / (i + 1)).blocks[1:]) } if err := tester.sync("peer #0", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chain.len()) + assertOwnChain(t, tester, len(chain.blocks)) } // Tests that synchronisations behave well in multi-version protocol environments // and not wreak havoc on other nodes in the network. func TestMultiProtoSynchronisation66Full(t *testing.T) { testMultiProtoSync(t, eth.ETH66, FullSync) } -func TestMultiProtoSynchronisation66Fast(t *testing.T) { testMultiProtoSync(t, eth.ETH66, FastSync) } +func TestMultiProtoSynchronisation66Snap(t *testing.T) { testMultiProtoSync(t, eth.ETH66, SnapSync) } func TestMultiProtoSynchronisation66Light(t *testing.T) { testMultiProtoSync(t, eth.ETH66, LightSync) } func testMultiProtoSync(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() @@ -840,14 +710,14 @@ func testMultiProtoSync(t *testing.T, protocol uint, mode SyncMode) { chain := testChainBase.shorten(blockCacheMaxItems - 15) // Create peers of every type - tester.newPeer("peer 66", eth.ETH66, chain) - //tester.newPeer("peer 65", eth.ETH67, chain) + tester.newPeer("peer 66", eth.ETH66, chain.blocks[1:]) + //tester.newPeer("peer 65", eth.ETH67, chain.blocks[1:) // Synchronise with the requested peer and make sure all blocks were retrieved if err := tester.sync(fmt.Sprintf("peer %d", protocol), nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chain.len()) + assertOwnChain(t, tester, len(chain.blocks)) // Check that no peers have been dropped off for _, version := range []int{66} { @@ -861,18 +731,16 @@ func testMultiProtoSync(t *testing.T, protocol uint, mode SyncMode) { // Tests that if a block is empty (e.g. header only), no body request should be // made, and instead the header should be assembled into a whole block in itself. func TestEmptyShortCircuit66Full(t *testing.T) { testEmptyShortCircuit(t, eth.ETH66, FullSync) } -func TestEmptyShortCircuit66Fast(t *testing.T) { testEmptyShortCircuit(t, eth.ETH66, FastSync) } +func TestEmptyShortCircuit66Snap(t *testing.T) { testEmptyShortCircuit(t, eth.ETH66, SnapSync) } func TestEmptyShortCircuit66Light(t *testing.T) { testEmptyShortCircuit(t, eth.ETH66, LightSync) } func testEmptyShortCircuit(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() // Create a block chain to download chain := testChainBase - tester.newPeer("peer", protocol, chain) + tester.newPeer("peer", protocol, chain.blocks[1:]) // Instrument the downloader to signal body requests bodiesHave, receiptsHave := int32(0), int32(0) @@ -886,17 +754,17 @@ func testEmptyShortCircuit(t *testing.T, protocol uint, mode SyncMode) { if err := tester.sync("peer", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chain.len()) + assertOwnChain(t, tester, len(chain.blocks)) // Validate the number of block bodies that should have been requested bodiesNeeded, receiptsNeeded := 0, 0 - for _, block := range chain.blockm { - if mode != LightSync && block != tester.genesis && (len(block.Transactions()) > 0 || len(block.Uncles()) > 0) { + for _, block := range chain.blocks[1:] { + if mode != LightSync && (len(block.Transactions()) > 0 || len(block.Uncles()) > 0) { bodiesNeeded++ } } - for _, receipt := range chain.receiptm { - if mode == FastSync && len(receipt) > 0 { + for _, block := range chain.blocks[1:] { + if mode == SnapSync && len(block.Transactions()) > 0 { receiptsNeeded++ } } @@ -911,72 +779,64 @@ func testEmptyShortCircuit(t *testing.T, protocol uint, mode SyncMode) { // Tests that headers are enqueued continuously, preventing malicious nodes from // stalling the downloader by feeding gapped header chains. func TestMissingHeaderAttack66Full(t *testing.T) { testMissingHeaderAttack(t, eth.ETH66, FullSync) } -func TestMissingHeaderAttack66Fast(t *testing.T) { testMissingHeaderAttack(t, eth.ETH66, FastSync) } +func TestMissingHeaderAttack66Snap(t *testing.T) { testMissingHeaderAttack(t, eth.ETH66, SnapSync) } func TestMissingHeaderAttack66Light(t *testing.T) { testMissingHeaderAttack(t, eth.ETH66, LightSync) } func testMissingHeaderAttack(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() chain := testChainBase.shorten(blockCacheMaxItems - 15) - brokenChain := chain.shorten(chain.len()) - delete(brokenChain.headerm, brokenChain.chain[brokenChain.len()/2]) - tester.newPeer("attack", protocol, brokenChain) + + attacker := tester.newPeer("attack", protocol, chain.blocks[1:]) + attacker.withholdHeaders[chain.blocks[len(chain.blocks)/2-1].Hash()] = struct{}{} if err := tester.sync("attack", nil, mode); err == nil { t.Fatalf("succeeded attacker synchronisation") } // Synchronise with the valid peer and make sure sync succeeds - tester.newPeer("valid", protocol, chain) + tester.newPeer("valid", protocol, chain.blocks[1:]) if err := tester.sync("valid", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chain.len()) + assertOwnChain(t, tester, len(chain.blocks)) } // Tests that if requested headers are shifted (i.e. first is missing), the queue // detects the invalid numbering. func TestShiftedHeaderAttack66Full(t *testing.T) { testShiftedHeaderAttack(t, eth.ETH66, FullSync) } -func TestShiftedHeaderAttack66Fast(t *testing.T) { testShiftedHeaderAttack(t, eth.ETH66, FastSync) } +func TestShiftedHeaderAttack66Snap(t *testing.T) { testShiftedHeaderAttack(t, eth.ETH66, SnapSync) } func TestShiftedHeaderAttack66Light(t *testing.T) { testShiftedHeaderAttack(t, eth.ETH66, LightSync) } func testShiftedHeaderAttack(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() chain := testChainBase.shorten(blockCacheMaxItems - 15) // Attempt a full sync with an attacker feeding shifted headers - brokenChain := chain.shorten(chain.len()) - delete(brokenChain.headerm, brokenChain.chain[1]) - delete(brokenChain.blockm, brokenChain.chain[1]) - delete(brokenChain.receiptm, brokenChain.chain[1]) - tester.newPeer("attack", protocol, brokenChain) + attacker := tester.newPeer("attack", protocol, chain.blocks[1:]) + attacker.withholdHeaders[chain.blocks[1].Hash()] = struct{}{} + if err := tester.sync("attack", nil, mode); err == nil { t.Fatalf("succeeded attacker synchronisation") } - // Synchronise with the valid peer and make sure sync succeeds - tester.newPeer("valid", protocol, chain) + tester.newPeer("valid", protocol, chain.blocks[1:]) if err := tester.sync("valid", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - assertOwnChain(t, tester, chain.len()) + assertOwnChain(t, tester, len(chain.blocks)) } // Tests that upon detecting an invalid header, the recent ones are rolled back // for various failure scenarios. Afterwards a full sync is attempted to make // sure no state was corrupted. -func TestInvalidHeaderRollback66Fast(t *testing.T) { testInvalidHeaderRollback(t, eth.ETH66, FastSync) } +func TestInvalidHeaderRollback66Snap(t *testing.T) { testInvalidHeaderRollback(t, eth.ETH66, SnapSync) } func testInvalidHeaderRollback(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() + defer tester.terminate() // Create a small enough block chain to download targetBlocks := 3*fsHeaderSafetyNet + 256 + fsMinFullBlocks @@ -985,78 +845,67 @@ func testInvalidHeaderRollback(t *testing.T, protocol uint, mode SyncMode) { // Attempt to sync with an attacker that feeds junk during the fast sync phase. // This should result in the last fsHeaderSafetyNet headers being rolled back. missing := fsHeaderSafetyNet + MaxHeaderFetch + 1 - fastAttackChain := chain.shorten(chain.len()) - delete(fastAttackChain.headerm, fastAttackChain.chain[missing]) - tester.newPeer("fast-attack", protocol, fastAttackChain) + + fastAttacker := tester.newPeer("fast-attack", protocol, chain.blocks[1:]) + fastAttacker.withholdHeaders[chain.blocks[missing].Hash()] = struct{}{} if err := tester.sync("fast-attack", nil, mode); err == nil { t.Fatalf("succeeded fast attacker synchronisation") } - if head := tester.CurrentHeader().Number.Int64(); int(head) > MaxHeaderFetch { + if head := tester.chain.CurrentHeader().Number.Int64(); int(head) > MaxHeaderFetch { t.Errorf("rollback head mismatch: have %v, want at most %v", head, MaxHeaderFetch) } - // Attempt to sync with an attacker that feeds junk during the block import phase. // This should result in both the last fsHeaderSafetyNet number of headers being // rolled back, and also the pivot point being reverted to a non-block status. missing = 3*fsHeaderSafetyNet + MaxHeaderFetch + 1 - blockAttackChain := chain.shorten(chain.len()) - delete(fastAttackChain.headerm, fastAttackChain.chain[missing]) // Make sure the fast-attacker doesn't fill in - delete(blockAttackChain.headerm, blockAttackChain.chain[missing]) - tester.newPeer("block-attack", protocol, blockAttackChain) + + blockAttacker := tester.newPeer("block-attack", protocol, chain.blocks[1:]) + fastAttacker.withholdHeaders[chain.blocks[missing].Hash()] = struct{}{} // Make sure the fast-attacker doesn't fill in + blockAttacker.withholdHeaders[chain.blocks[missing].Hash()] = struct{}{} if err := tester.sync("block-attack", nil, mode); err == nil { t.Fatalf("succeeded block attacker synchronisation") } - if head := tester.CurrentHeader().Number.Int64(); int(head) > 2*fsHeaderSafetyNet+MaxHeaderFetch { + if head := tester.chain.CurrentHeader().Number.Int64(); int(head) > 2*fsHeaderSafetyNet+MaxHeaderFetch { t.Errorf("rollback head mismatch: have %v, want at most %v", head, 2*fsHeaderSafetyNet+MaxHeaderFetch) } - if mode == FastSync { - if head := tester.CurrentBlock().NumberU64(); head != 0 { + if mode == SnapSync { + if head := tester.chain.CurrentBlock().NumberU64(); head != 0 { t.Errorf("fast sync pivot block #%d not rolled back", head) } } - // Attempt to sync with an attacker that withholds promised blocks after the // fast sync pivot point. This could be a trial to leave the node with a bad // but already imported pivot block. - withholdAttackChain := chain.shorten(chain.len()) - tester.newPeer("withhold-attack", protocol, withholdAttackChain) + withholdAttacker := tester.newPeer("withhold-attack", protocol, chain.blocks[1:]) + tester.downloader.syncInitHook = func(uint64, uint64) { - for i := missing; i < withholdAttackChain.len(); i++ { - delete(withholdAttackChain.headerm, withholdAttackChain.chain[i]) + for i := missing; i < len(chain.blocks); i++ { + withholdAttacker.withholdHeaders[chain.blocks[i].Hash()] = struct{}{} } tester.downloader.syncInitHook = nil } if err := tester.sync("withhold-attack", nil, mode); err == nil { t.Fatalf("succeeded withholding attacker synchronisation") } - if head := tester.CurrentHeader().Number.Int64(); int(head) > 2*fsHeaderSafetyNet+MaxHeaderFetch { + if head := tester.chain.CurrentHeader().Number.Int64(); int(head) > 2*fsHeaderSafetyNet+MaxHeaderFetch { t.Errorf("rollback head mismatch: have %v, want at most %v", head, 2*fsHeaderSafetyNet+MaxHeaderFetch) } - if mode == FastSync { - if head := tester.CurrentBlock().NumberU64(); head != 0 { + if mode == SnapSync { + if head := tester.chain.CurrentBlock().NumberU64(); head != 0 { t.Errorf("fast sync pivot block #%d not rolled back", head) } } - - // synchronise with the valid peer and make sure sync succeeds. Since the last rollback + // Synchronise with the valid peer and make sure sync succeeds. Since the last rollback // should also disable fast syncing for this process, verify that we did a fresh full // sync. Note, we can't assert anything about the receipts since we won't purge the // database of them, hence we can't use assertOwnChain. - tester.newPeer("valid", protocol, chain) + tester.newPeer("valid", protocol, chain.blocks[1:]) if err := tester.sync("valid", nil, mode); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - if hs := len(tester.ownHeaders); hs != chain.len() { - t.Fatalf("synchronised headers mismatch: have %v, want %v", hs, chain.len()) - } - if mode != LightSync { - if bs := len(tester.ownBlocks); bs != chain.len() { - t.Fatalf("synchronised blocks mismatch: have %v, want %v", bs, chain.len()) - } - } - tester.terminate() + assertOwnChain(t, tester, len(chain.blocks)) } // Tests that a peer advertising a high TD doesn't get to stall the downloader @@ -1064,32 +913,28 @@ func testInvalidHeaderRollback(t *testing.T, protocol uint, mode SyncMode) { func TestHighTDStarvationAttack66Full(t *testing.T) { testHighTDStarvationAttack(t, eth.ETH66, FullSync) } -func TestHighTDStarvationAttack66Fast(t *testing.T) { - testHighTDStarvationAttack(t, eth.ETH66, FastSync) +func TestHighTDStarvationAttack66Snap(t *testing.T) { + testHighTDStarvationAttack(t, eth.ETH66, SnapSync) } func TestHighTDStarvationAttack66Light(t *testing.T) { testHighTDStarvationAttack(t, eth.ETH66, LightSync) } func testHighTDStarvationAttack(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() + defer tester.terminate() chain := testChainBase.shorten(1) - tester.newPeer("attack", protocol, chain) + tester.newPeer("attack", protocol, chain.blocks[1:]) if err := tester.sync("attack", big.NewInt(1000000), mode); err != errStallingPeer { t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errStallingPeer) } - tester.terminate() } // Tests that misbehaving peers are disconnected, whilst behaving ones are not. func TestBlockHeaderAttackerDropping66(t *testing.T) { testBlockHeaderAttackerDropping(t, eth.ETH66) } func testBlockHeaderAttackerDropping(t *testing.T, protocol uint) { - t.Parallel() - // Define the disconnection requirement for individual hash fetch errors tests := []struct { result error @@ -1119,16 +964,14 @@ func testBlockHeaderAttackerDropping(t *testing.T, protocol uint) { for i, tt := range tests { // Register a new peer and ensure its presence id := fmt.Sprintf("test %d", i) - if err := tester.newPeer(id, protocol, chain); err != nil { - t.Fatalf("test %d: failed to register new peer: %v", i, err) - } + tester.newPeer(id, protocol, chain.blocks[1:]) if _, ok := tester.peers[id]; !ok { t.Fatalf("test %d: registered peer not found", i) } // Simulate a synchronisation and check the required result tester.downloader.synchroniseMock = func(string, common.Hash) error { return tt.result } - tester.downloader.Synchronise(id, tester.genesis.Hash(), big.NewInt(1000), FullSync) + tester.downloader.Synchronise(id, tester.chain.Genesis().Hash(), big.NewInt(1000), FullSync) if _, ok := tester.peers[id]; !ok != tt.drop { t.Errorf("test %d: peer drop mismatch for %v: have %v, want %v", i, tt.result, !ok, tt.drop) } @@ -1138,14 +981,13 @@ func testBlockHeaderAttackerDropping(t *testing.T, protocol uint) { // Tests that synchronisation progress (origin block number, current block number // and highest block number) is tracked and updated correctly. func TestSyncProgress66Full(t *testing.T) { testSyncProgress(t, eth.ETH66, FullSync) } -func TestSyncProgress66Fast(t *testing.T) { testSyncProgress(t, eth.ETH66, FastSync) } +func TestSyncProgress66Snap(t *testing.T) { testSyncProgress(t, eth.ETH66, SnapSync) } func TestSyncProgress66Light(t *testing.T) { testSyncProgress(t, eth.ETH66, LightSync) } func testSyncProgress(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() + chain := testChainBase.shorten(blockCacheMaxItems - 15) // Set a sync init hook to catch progress changes @@ -1159,7 +1001,7 @@ func testSyncProgress(t *testing.T, protocol uint, mode SyncMode) { checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) // Synchronise half the blocks and check initial progress - tester.newPeer("peer-half", protocol, chain.shorten(chain.len()/2)) + tester.newPeer("peer-half", protocol, chain.shorten(len(chain.blocks) / 2).blocks[1:]) pending := new(sync.WaitGroup) pending.Add(1) @@ -1171,13 +1013,13 @@ func testSyncProgress(t *testing.T, protocol uint, mode SyncMode) { }() <-starting checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ - HighestBlock: uint64(chain.len()/2 - 1), + HighestBlock: uint64(len(chain.blocks)/2 - 1), }) progress <- struct{}{} pending.Wait() // Synchronise all the blocks and check continuation progress - tester.newPeer("peer-full", protocol, chain) + tester.newPeer("peer-full", protocol, chain.blocks[1:]) pending.Add(1) go func() { defer pending.Done() @@ -1187,18 +1029,18 @@ func testSyncProgress(t *testing.T, protocol uint, mode SyncMode) { }() <-starting checkProgress(t, tester.downloader, "completing", ethereum.SyncProgress{ - StartingBlock: uint64(chain.len()/2 - 1), - CurrentBlock: uint64(chain.len()/2 - 1), - HighestBlock: uint64(chain.len() - 1), + StartingBlock: uint64(len(chain.blocks)/2 - 1), + CurrentBlock: uint64(len(chain.blocks)/2 - 1), + HighestBlock: uint64(len(chain.blocks) - 1), }) // Check final progress after successful sync progress <- struct{}{} pending.Wait() checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ - StartingBlock: uint64(chain.len()/2 - 1), - CurrentBlock: uint64(chain.len() - 1), - HighestBlock: uint64(chain.len() - 1), + StartingBlock: uint64(len(chain.blocks)/2 - 1), + CurrentBlock: uint64(len(chain.blocks) - 1), + HighestBlock: uint64(len(chain.blocks) - 1), }) } @@ -1207,9 +1049,7 @@ func checkProgress(t *testing.T, d *Downloader, stage string, want ethereum.Sync t.Helper() p := d.Progress() - p.KnownStates, p.PulledStates = 0, 0 - want.KnownStates, want.PulledStates = 0, 0 - if p != want { + if p.StartingBlock != want.StartingBlock || p.CurrentBlock != want.CurrentBlock || p.HighestBlock != want.HighestBlock { t.Fatalf("%s progress mismatch:\nhave %+v\nwant %+v", stage, p, want) } } @@ -1218,16 +1058,15 @@ func checkProgress(t *testing.T, d *Downloader, stage string, want ethereum.Sync // number) is tracked and updated correctly in case of a fork (or manual head // revertal). func TestForkedSyncProgress66Full(t *testing.T) { testForkedSyncProgress(t, eth.ETH66, FullSync) } -func TestForkedSyncProgress66Fast(t *testing.T) { testForkedSyncProgress(t, eth.ETH66, FastSync) } +func TestForkedSyncProgress66Snap(t *testing.T) { testForkedSyncProgress(t, eth.ETH66, SnapSync) } func TestForkedSyncProgress66Light(t *testing.T) { testForkedSyncProgress(t, eth.ETH66, LightSync) } func testForkedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() - chainA := testChainForkLightA.shorten(testChainBase.len() + MaxHeaderFetch) - chainB := testChainForkLightB.shorten(testChainBase.len() + MaxHeaderFetch) + + chainA := testChainForkLightA.shorten(len(testChainBase.blocks) + MaxHeaderFetch) + chainB := testChainForkLightB.shorten(len(testChainBase.blocks) + MaxHeaderFetch) // Set a sync init hook to catch progress changes starting := make(chan struct{}) @@ -1240,7 +1079,7 @@ func testForkedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) // Synchronise with one of the forks and check progress - tester.newPeer("fork A", protocol, chainA) + tester.newPeer("fork A", protocol, chainA.blocks[1:]) pending := new(sync.WaitGroup) pending.Add(1) go func() { @@ -1252,7 +1091,7 @@ func testForkedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { <-starting checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ - HighestBlock: uint64(chainA.len() - 1), + HighestBlock: uint64(len(chainA.blocks) - 1), }) progress <- struct{}{} pending.Wait() @@ -1261,7 +1100,7 @@ func testForkedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { tester.downloader.syncStatsChainOrigin = tester.downloader.syncStatsChainHeight // Synchronise with the second fork and check progress resets - tester.newPeer("fork B", protocol, chainB) + tester.newPeer("fork B", protocol, chainB.blocks[1:]) pending.Add(1) go func() { defer pending.Done() @@ -1271,18 +1110,18 @@ func testForkedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { }() <-starting checkProgress(t, tester.downloader, "forking", ethereum.SyncProgress{ - StartingBlock: uint64(testChainBase.len()) - 1, - CurrentBlock: uint64(chainA.len() - 1), - HighestBlock: uint64(chainB.len() - 1), + StartingBlock: uint64(len(testChainBase.blocks)) - 1, + CurrentBlock: uint64(len(chainA.blocks) - 1), + HighestBlock: uint64(len(chainB.blocks) - 1), }) // Check final progress after successful sync progress <- struct{}{} pending.Wait() checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ - StartingBlock: uint64(testChainBase.len()) - 1, - CurrentBlock: uint64(chainB.len() - 1), - HighestBlock: uint64(chainB.len() - 1), + StartingBlock: uint64(len(testChainBase.blocks)) - 1, + CurrentBlock: uint64(len(chainB.blocks) - 1), + HighestBlock: uint64(len(chainB.blocks) - 1), }) } @@ -1290,14 +1129,13 @@ func testForkedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { // origin is not updated in the next sync cycle, as it should be considered the // continuation of the previous sync and not a new instance. func TestFailedSyncProgress66Full(t *testing.T) { testFailedSyncProgress(t, eth.ETH66, FullSync) } -func TestFailedSyncProgress66Fast(t *testing.T) { testFailedSyncProgress(t, eth.ETH66, FastSync) } +func TestFailedSyncProgress66Snap(t *testing.T) { testFailedSyncProgress(t, eth.ETH66, SnapSync) } func TestFailedSyncProgress66Light(t *testing.T) { testFailedSyncProgress(t, eth.ETH66, LightSync) } func testFailedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() + chain := testChainBase.shorten(blockCacheMaxItems - 15) // Set a sync init hook to catch progress changes @@ -1311,12 +1149,10 @@ func testFailedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) // Attempt a full sync with a faulty peer - brokenChain := chain.shorten(chain.len()) - missing := brokenChain.len() / 2 - delete(brokenChain.headerm, brokenChain.chain[missing]) - delete(brokenChain.blockm, brokenChain.chain[missing]) - delete(brokenChain.receiptm, brokenChain.chain[missing]) - tester.newPeer("faulty", protocol, brokenChain) + missing := len(chain.blocks)/2 - 1 + + faulter := tester.newPeer("faulty", protocol, chain.blocks[1:]) + faulter.withholdHeaders[chain.blocks[missing].Hash()] = struct{}{} pending := new(sync.WaitGroup) pending.Add(1) @@ -1328,7 +1164,7 @@ func testFailedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { }() <-starting checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ - HighestBlock: uint64(brokenChain.len() - 1), + HighestBlock: uint64(len(chain.blocks) - 1), }) progress <- struct{}{} pending.Wait() @@ -1336,7 +1172,7 @@ func testFailedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { // Synchronise with a good peer and check that the progress origin remind the same // after a failure - tester.newPeer("valid", protocol, chain) + tester.newPeer("valid", protocol, chain.blocks[1:]) pending.Add(1) go func() { defer pending.Done() @@ -1351,22 +1187,21 @@ func testFailedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { progress <- struct{}{} pending.Wait() checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ - CurrentBlock: uint64(chain.len() - 1), - HighestBlock: uint64(chain.len() - 1), + CurrentBlock: uint64(len(chain.blocks) - 1), + HighestBlock: uint64(len(chain.blocks) - 1), }) } // Tests that if an attacker fakes a chain height, after the attack is detected, // the progress height is successfully reduced at the next sync invocation. func TestFakedSyncProgress66Full(t *testing.T) { testFakedSyncProgress(t, eth.ETH66, FullSync) } -func TestFakedSyncProgress66Fast(t *testing.T) { testFakedSyncProgress(t, eth.ETH66, FastSync) } +func TestFakedSyncProgress66Snap(t *testing.T) { testFakedSyncProgress(t, eth.ETH66, SnapSync) } func TestFakedSyncProgress66Light(t *testing.T) { testFakedSyncProgress(t, eth.ETH66, LightSync) } func testFakedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - tester := newTester() defer tester.terminate() + chain := testChainBase.shorten(blockCacheMaxItems - 15) // Set a sync init hook to catch progress changes @@ -1379,13 +1214,11 @@ func testFakedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) // Create and sync with an attacker that promises a higher chain than available. - brokenChain := chain.shorten(chain.len()) + attacker := tester.newPeer("attack", protocol, chain.blocks[1:]) numMissing := 5 - for i := brokenChain.len() - 2; i > brokenChain.len()-numMissing; i-- { - delete(brokenChain.headerm, brokenChain.chain[i]) + for i := len(chain.blocks) - 2; i > len(chain.blocks)-numMissing; i-- { + attacker.withholdHeaders[chain.blocks[i].Hash()] = struct{}{} } - tester.newPeer("attack", protocol, brokenChain) - pending := new(sync.WaitGroup) pending.Add(1) go func() { @@ -1396,7 +1229,7 @@ func testFakedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { }() <-starting checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ - HighestBlock: uint64(brokenChain.len() - 1), + HighestBlock: uint64(len(chain.blocks) - 1), }) progress <- struct{}{} pending.Wait() @@ -1404,8 +1237,8 @@ func testFakedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { // Synchronise with a good peer and check that the progress height has been reduced to // the true value. - validChain := chain.shorten(chain.len() - numMissing) - tester.newPeer("valid", protocol, validChain) + validChain := chain.shorten(len(chain.blocks) - numMissing) + tester.newPeer("valid", protocol, validChain.blocks[1:]) pending.Add(1) go func() { @@ -1417,100 +1250,17 @@ func testFakedSyncProgress(t *testing.T, protocol uint, mode SyncMode) { <-starting checkProgress(t, tester.downloader, "completing", ethereum.SyncProgress{ CurrentBlock: afterFailedSync.CurrentBlock, - HighestBlock: uint64(validChain.len() - 1), + HighestBlock: uint64(len(validChain.blocks) - 1), }) - // Check final progress after successful sync. progress <- struct{}{} pending.Wait() checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ - CurrentBlock: uint64(validChain.len() - 1), - HighestBlock: uint64(validChain.len() - 1), + CurrentBlock: uint64(len(validChain.blocks) - 1), + HighestBlock: uint64(len(validChain.blocks) - 1), }) } -// This test reproduces an issue where unexpected deliveries would -// block indefinitely if they arrived at the right time. -func TestDeliverHeadersHang66Full(t *testing.T) { testDeliverHeadersHang(t, eth.ETH66, FullSync) } -func TestDeliverHeadersHang66Fast(t *testing.T) { testDeliverHeadersHang(t, eth.ETH66, FastSync) } -func TestDeliverHeadersHang66Light(t *testing.T) { testDeliverHeadersHang(t, eth.ETH66, LightSync) } - -func testDeliverHeadersHang(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - - master := newTester() - defer master.terminate() - chain := testChainBase.shorten(15) - - for i := 0; i < 200; i++ { - tester := newTester() - tester.peerDb = master.peerDb - tester.newPeer("peer", protocol, chain) - - // Whenever the downloader requests headers, flood it with - // a lot of unrequested header deliveries. - tester.downloader.peers.peers["peer"].peer = &floodingTestPeer{ - peer: tester.downloader.peers.peers["peer"].peer, - tester: tester, - } - if err := tester.sync("peer", nil, mode); err != nil { - t.Errorf("test %d: sync failed: %v", i, err) - } - tester.terminate() - } -} - -type floodingTestPeer struct { - peer Peer - tester *downloadTester -} - -func (ftp *floodingTestPeer) Head() (common.Hash, *big.Int) { return ftp.peer.Head() } -func (ftp *floodingTestPeer) RequestHeadersByHash(hash common.Hash, count int, skip int, reverse bool) error { - return ftp.peer.RequestHeadersByHash(hash, count, skip, reverse) -} -func (ftp *floodingTestPeer) RequestBodies(hashes []common.Hash) error { - return ftp.peer.RequestBodies(hashes) -} -func (ftp *floodingTestPeer) RequestReceipts(hashes []common.Hash) error { - return ftp.peer.RequestReceipts(hashes) -} -func (ftp *floodingTestPeer) RequestNodeData(hashes []common.Hash) error { - return ftp.peer.RequestNodeData(hashes) -} - -func (ftp *floodingTestPeer) RequestHeadersByNumber(from uint64, count, skip int, reverse bool) error { - deliveriesDone := make(chan struct{}, 500) - for i := 0; i < cap(deliveriesDone)-1; i++ { - peer := fmt.Sprintf("fake-peer%d", i) - go func() { - ftp.tester.downloader.DeliverHeaders(peer, []*types.Header{{}, {}, {}, {}}) - deliveriesDone <- struct{}{} - }() - } - - // None of the extra deliveries should block. - timeout := time.After(60 * time.Second) - launched := false - for i := 0; i < cap(deliveriesDone); i++ { - select { - case <-deliveriesDone: - if !launched { - // Start delivering the requested headers - // after one of the flooding responses has arrived. - go func() { - ftp.peer.RequestHeadersByNumber(from, count, skip, reverse) - deliveriesDone <- struct{}{} - }() - launched = true - } - case <-timeout: - panic("blocked") - } - } - return nil -} - func TestRemoteHeaderRequestSpan(t *testing.T) { testCases := []struct { remoteHeight uint64 @@ -1589,14 +1339,12 @@ func TestRemoteHeaderRequestSpan(t *testing.T) { // Tests that peers below a pre-configured checkpoint block are prevented from // being fast-synced from, avoiding potential cheap eclipse attacks. func TestCheckpointEnforcement66Full(t *testing.T) { testCheckpointEnforcement(t, eth.ETH66, FullSync) } -func TestCheckpointEnforcement66Fast(t *testing.T) { testCheckpointEnforcement(t, eth.ETH66, FastSync) } +func TestCheckpointEnforcement66Snap(t *testing.T) { testCheckpointEnforcement(t, eth.ETH66, SnapSync) } func TestCheckpointEnforcement66Light(t *testing.T) { testCheckpointEnforcement(t, eth.ETH66, LightSync) } func testCheckpointEnforcement(t *testing.T, protocol uint, mode SyncMode) { - t.Parallel() - // Create a new tester with a particular hard coded checkpoint block tester := newTester() defer tester.terminate() @@ -1605,18 +1353,18 @@ func testCheckpointEnforcement(t *testing.T, protocol uint, mode SyncMode) { chain := testChainBase.shorten(int(tester.downloader.checkpoint) - 1) // Attempt to sync with the peer and validate the result - tester.newPeer("peer", protocol, chain) + tester.newPeer("peer", protocol, chain.blocks[1:]) var expect error - if mode == FastSync || mode == LightSync { + if mode == SnapSync || mode == LightSync { expect = errUnsyncedPeer } if err := tester.sync("peer", nil, mode); !errors.Is(err, expect) { t.Fatalf("block sync error mismatch: have %v, want %v", err, expect) } - if mode == FastSync || mode == LightSync { + if mode == SnapSync || mode == LightSync { assertOwnChain(t, tester, 1) } else { - assertOwnChain(t, tester, chain.len()) + assertOwnChain(t, tester, len(chain.blocks)) } } diff --git a/eth/downloader/fetchers.go b/eth/downloader/fetchers.go new file mode 100644 index 0000000000..021e8c4f9b --- /dev/null +++ b/eth/downloader/fetchers.go @@ -0,0 +1,115 @@ +// Copyright 2021 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 . + +package downloader + +import ( + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/protocols/eth" +) + +// fetchHeadersByHash is a blocking version of Peer.RequestHeadersByHash which +// handles all the cancellation, interruption and timeout mechanisms of a data +// retrieval to allow blocking API calls. +func (d *Downloader) fetchHeadersByHash(p *peerConnection, hash common.Hash, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + // Create the response sink and send the network request + start := time.Now() + resCh := make(chan *eth.Response) + + req, err := p.peer.RequestHeadersByHash(hash, amount, skip, reverse, resCh) + if err != nil { + return nil, nil, err + } + defer req.Close() + + // Wait until the response arrives, the request is cancelled or times out + ttl := d.peers.rates.TargetTimeout() + + timeoutTimer := time.NewTimer(ttl) + defer timeoutTimer.Stop() + + select { + case <-d.cancelCh: + return nil, nil, errCanceled + + case <-timeoutTimer.C: + // Header retrieval timed out, update the metrics + p.log.Debug("Header request timed out", "elapsed", ttl) + headerTimeoutMeter.Mark(1) + + return nil, nil, errTimeout + + case res := <-resCh: + // Headers successfully retrieved, update the metrics + headerReqTimer.Update(time.Since(start)) + headerInMeter.Mark(int64(len(*res.Res.(*eth.BlockHeadersPacket)))) + + // Don't reject the packet even if it turns out to be bad, downloader will + // disconnect the peer on its own terms. Simply delivery the headers to + // be processed by the caller + res.Done <- nil + + return *res.Res.(*eth.BlockHeadersPacket), res.Meta.([]common.Hash), nil + } +} + +// fetchHeadersByNumber is a blocking version of Peer.RequestHeadersByNumber which +// handles all the cancellation, interruption and timeout mechanisms of a data +// retrieval to allow blocking API calls. +func (d *Downloader) fetchHeadersByNumber(p *peerConnection, number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + // Create the response sink and send the network request + start := time.Now() + resCh := make(chan *eth.Response) + + req, err := p.peer.RequestHeadersByNumber(number, amount, skip, reverse, resCh) + if err != nil { + return nil, nil, err + } + defer req.Close() + + // Wait until the response arrives, the request is cancelled or times out + ttl := d.peers.rates.TargetTimeout() + + timeoutTimer := time.NewTimer(ttl) + defer timeoutTimer.Stop() + + select { + case <-d.cancelCh: + return nil, nil, errCanceled + + case <-timeoutTimer.C: + // Header retrieval timed out, update the metrics + p.log.Debug("Header request timed out", "elapsed", ttl) + headerTimeoutMeter.Mark(1) + + return nil, nil, errTimeout + + case res := <-resCh: + // Headers successfully retrieved, update the metrics + headerReqTimer.Update(time.Since(start)) + headerInMeter.Mark(int64(len(*res.Res.(*eth.BlockHeadersPacket)))) + + // Don't reject the packet even if it turns out to be bad, downloader will + // disconnect the peer on its own terms. Simply delivery the headers to + // be processed by the caller + res.Done <- nil + + return *res.Res.(*eth.BlockHeadersPacket), res.Meta.([]common.Hash), nil + } +} diff --git a/eth/downloader/fetchers_concurrent.go b/eth/downloader/fetchers_concurrent.go new file mode 100644 index 0000000000..4bade2b4c3 --- /dev/null +++ b/eth/downloader/fetchers_concurrent.go @@ -0,0 +1,381 @@ +// Copyright 2021 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 . + +package downloader + +import ( + "errors" + "sort" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/log" +) + +// timeoutGracePeriod is the amount of time to allow for a peer to deliver a +// response to a locally already timed out request. Timeouts are not penalized +// as a peer might be temporarily overloaded, however, they still must reply +// to each request. Failing to do so is considered a protocol violation. +var timeoutGracePeriod = 2 * time.Minute + +// typedQueue is an interface defining the adaptor needed to translate the type +// specific downloader/queue schedulers into the type-agnostic general concurrent +// fetcher algorithm calls. +type typedQueue interface { + // waker returns a notification channel that gets pinged in case more fetches + // have been queued up, so the fetcher might assign it to idle peers. + waker() chan bool + + // pending returns the number of wrapped items that are currently queued for + // fetching by the concurrent downloader. + pending() int + + // capacity is responsible for calculating how many items of the abstracted + // type a particular peer is estimated to be able to retrieve within the + // alloted round trip time. + capacity(peer *peerConnection, rtt time.Duration) int + + // updateCapacity is responsible for updating how many items of the abstracted + // type a particular peer is estimated to be able to retrieve in a unit time. + updateCapacity(peer *peerConnection, items int, elapsed time.Duration) + + // reserve is responsible for allocating a requested number of pending items + // from the download queue to the specified peer. + reserve(peer *peerConnection, items int) (*fetchRequest, bool, bool) + + // unreserve is resposible for removing the current retrieval allocation + // assigned to a specific peer and placing it back into the pool to allow + // reassigning to some other peer. + unreserve(peer string) int + + // request is responsible for converting a generic fetch request into a typed + // one and sending it to the remote peer for fulfillment. + request(peer *peerConnection, req *fetchRequest, resCh chan *eth.Response) (*eth.Request, error) + + // deliver is responsible for taking a generic response packet from the + // concurrent fetcher, unpacking the type specific data and delivering + // it to the downloader's queue. + deliver(peer *peerConnection, packet *eth.Response) (int, error) +} + +// concurrentFetch iteratively downloads scheduled block parts, taking available +// peers, reserving a chunk of fetch requests for each and waiting for delivery +// or timeouts. +func (d *Downloader) concurrentFetch(queue typedQueue) error { + // Create a delivery channel to accept responses from all peers + responses := make(chan *eth.Response) + + // Track the currently active requests and their timeout order + pending := make(map[string]*eth.Request) + defer func() { + // Abort all requests on sync cycle cancellation. The requests may still + // be fulfilled by the remote side, but the dispatcher will not wait to + // deliver them since nobody's going to be listening. + for _, req := range pending { + req.Close() + } + }() + ordering := make(map[*eth.Request]int) + timeouts := prque.New(func(data interface{}, index int) { + ordering[data.(*eth.Request)] = index + }) + + timeout := time.NewTimer(0) + if !timeout.Stop() { + <-timeout.C + } + defer timeout.Stop() + + // Track the timed-out but not-yet-answered requests separately. We want to + // keep tracking which peers are busy (potentially overloaded), so removing + // all trace of a timed out request is not good. We also can't just cancel + // the pending request altogether as that would prevent a late response from + // being delivered, thus never unblocking the peer. + stales := make(map[string]*eth.Request) + defer func() { + // Abort all requests on sync cycle cancellation. The requests may still + // be fulfilled by the remote side, but the dispatcher will not wait to + // deliver them since nobody's going to be listening. + for _, req := range stales { + req.Close() + } + }() + // Subscribe to peer lifecycle events to schedule tasks to new joiners and + // reschedule tasks upon disconnections. We don't care which event happened + // for simplicity, so just use a single channel. + peering := make(chan *peeringEvent, 64) // arbitrary buffer, just some burst protection + + peeringSub := d.peers.SubscribeEvents(peering) + defer peeringSub.Unsubscribe() + + // Prepare the queue and fetch block parts until the block header fetcher's done + finished := false + for { + // Short circuit if we lost all our peers + if d.peers.Len() == 0 { + return errNoPeers + } + // If there's nothing more to fetch, wait or terminate + if queue.pending() == 0 { + if len(pending) == 0 && finished { + return nil + } + } else { + // Send a download request to all idle peers, until throttled + var ( + idles []*peerConnection + caps []int + ) + for _, peer := range d.peers.AllPeers() { + pending, stale := pending[peer.id], stales[peer.id] + if pending == nil && stale == nil { + idles = append(idles, peer) + caps = append(caps, queue.capacity(peer, time.Second)) + } else if stale != nil { + if waited := time.Since(stale.Sent); waited > timeoutGracePeriod { + // Request has been in flight longer than the grace period + // permitted it, consider the peer malicious attempting to + // stall the sync. + peer.log.Warn("Peer stalling, dropping", "waited", common.PrettyDuration(waited)) + d.dropPeer(peer.id) + } + } + } + sort.Sort(&peerCapacitySort{idles, caps}) + + var ( + progressed bool + throttled bool + queued = queue.pending() + ) + for _, peer := range idles { + // Short circuit if throttling activated or there are no more + // queued tasks to be retrieved + if throttled { + break + } + if queued = queue.pending(); queued == 0 { + break + } + // Reserve a chunk of fetches for a peer. A nil can mean either that + // no more headers are available, or that the peer is known not to + // have them. + request, progress, throttle := queue.reserve(peer, queue.capacity(peer, d.peers.rates.TargetRoundTrip())) + if progress { + progressed = true + } + if throttle { + throttled = true + throttleCounter.Inc(1) + } + if request == nil { + continue + } + // Fetch the chunk and make sure any errors return the hashes to the queue + req, err := queue.request(peer, request, responses) + if err != nil { + // Sending the request failed, which generally means the peer + // was diconnected in between assignment and network send. + // Although all peer removal operations return allocated tasks + // to the queue, that is async, and we can do better here by + // immediately pushing the unfulfilled requests. + queue.unreserve(peer.id) // TODO(karalabe): This needs a non-expiration method + continue + } + pending[peer.id] = req + + ttl := d.peers.rates.TargetTimeout() + ordering[req] = timeouts.Size() + + timeouts.Push(req, -time.Now().Add(ttl).UnixNano()) + if timeouts.Size() == 1 { + timeout.Reset(ttl) + } + } + // Make sure that we have peers available for fetching. If all peers have been tried + // and all failed throw an error + if !progressed && !throttled && len(pending) == 0 && len(idles) == d.peers.Len() && queued > 0 { + return errPeersUnavailable + } + } + // Wait for something to happen + select { + case <-d.cancelCh: + // If sync was cancelled, tear down the parallel retriever. Pending + // requests will be cancelled locally, and the remote responses will + // be dropped when they arrive + return errCanceled + + case event := <-peering: + // A peer joined or left, the tasks queue and allocations need to be + // checked for potential assignment or reassignment + peerid := event.peer.id + + if event.join { + // Sanity check the internal state; this can be dropped later + if _, ok := pending[peerid]; ok { + event.peer.log.Error("Pending request exists for joining peer") + } + if _, ok := stales[peerid]; ok { + event.peer.log.Error("Stale request exists for joining peer") + } + // Loop back to the entry point for task assignment + continue + } + // A peer left, any existing requests need to be untracked, pending + // tasks returned and possible reassignment checked + if req, ok := pending[peerid]; ok { + queue.unreserve(peerid) // TODO(karalabe): This needs a non-expiration method + delete(pending, peerid) + req.Close() + + if index, live := ordering[req]; live { + timeouts.Remove(index) + if index == 0 { + if !timeout.Stop() { + <-timeout.C + } + if timeouts.Size() > 0 { + _, exp := timeouts.Peek() + timeout.Reset(time.Until(time.Unix(0, -exp))) + } + } + delete(ordering, req) + } + } + if req, ok := stales[peerid]; ok { + delete(stales, peerid) + req.Close() + } + + case <-timeout.C: + // Retrieve the next request which should have timed out. The check + // below is purely for to catch programming errors, given the correct + // code, there's no possible order of events that should result in a + // timeout firing for a non-existent event. + item, exp := timeouts.Peek() + if now, at := time.Now(), time.Unix(0, -exp); now.Before(at) { + log.Error("Timeout triggered but not reached", "left", at.Sub(now)) + timeout.Reset(at.Sub(now)) + continue + } + req := item.(*eth.Request) + + // Stop tracking the timed out request from a timing perspective, + // cancel it, so it's not considered in-flight anymore, but keep + // the peer marked busy to prevent assigning a second request and + // overloading it further. + delete(pending, req.Peer) + stales[req.Peer] = req + delete(ordering, req) + + timeouts.Pop() + if timeouts.Size() > 0 { + _, exp := timeouts.Peek() + timeout.Reset(time.Until(time.Unix(0, -exp))) + } + // New timeout potentially set if there are more requests pending, + // reschedule the failed one to a free peer + fails := queue.unreserve(req.Peer) + + // Finally, update the peer's retrieval capacity, or if it's already + // below the minimum allowance, drop the peer. If a lot of retrieval + // elements expired, we might have overestimated the remote peer or + // perhaps ourselves. Only reset to minimal throughput but don't drop + // just yet. + // + // The reason the minimum threshold is 2 is that the downloader tries + // to estimate the bandwidth and latency of a peer separately, which + // requires pushing the measured capacity a bit and seeing how response + // times reacts, to it always requests one more than the minimum (i.e. + // min 2). + peer := d.peers.Peer(req.Peer) + if peer == nil { + // If the peer got disconnected in between, we should really have + // short-circuited it already. Just in case there's some strange + // codepath, leave this check in not to crash. + log.Error("Delivery timeout from unknown peer", "peer", req.Peer) + continue + } + if fails > 2 { + queue.updateCapacity(peer, 0, 0) + } else { + d.dropPeer(peer.id) + + // If this peer was the master peer, abort sync immediately + d.cancelLock.RLock() + master := peer.id == d.cancelPeer + d.cancelLock.RUnlock() + + if master { + d.cancel() + return errTimeout + } + } + + case res := <-responses: + // Response arrived, it may be for an existing or an already timed + // out request. If the former, update the timeout heap and perhaps + // reschedule the timeout timer. + index, live := ordering[res.Req] + if live { + timeouts.Remove(index) + if index == 0 { + if !timeout.Stop() { + <-timeout.C + } + if timeouts.Size() > 0 { + _, exp := timeouts.Peek() + timeout.Reset(time.Until(time.Unix(0, -exp))) + } + } + delete(ordering, res.Req) + } + // Delete the pending request (if it still exists) and mark the peer idle + delete(pending, res.Req.Peer) + delete(stales, res.Req.Peer) + + // Signal the dispatcher that the round trip is done. We'll drop the + // peer if the data turns out to be junk. + res.Done <- nil + res.Req.Close() + + // If the peer was previously banned and failed to deliver its pack + // in a reasonable time frame, ignore its message. + if peer := d.peers.Peer(res.Req.Peer); peer != nil { + // Deliver the received chunk of data and check chain validity + accepted, err := queue.deliver(peer, res) + if errors.Is(err, errInvalidChain) { + return err + } + // Unless a peer delivered something completely else than requested (usually + // caused by a timed out request which came through in the end), set it to + // idle. If the delivery's stale, the peer should have already been idled. + if !errors.Is(err, errStaleDelivery) { + queue.updateCapacity(peer, accepted, res.Time) + } + } + + case cont := <-queue.waker(): + // The header fetcher sent a continuation flag, check if it's done + if !cont { + finished = true + } + } + } +} diff --git a/eth/downloader/fetchers_concurrent_bodies.go b/eth/downloader/fetchers_concurrent_bodies.go new file mode 100644 index 0000000000..a8de410323 --- /dev/null +++ b/eth/downloader/fetchers_concurrent_bodies.go @@ -0,0 +1,105 @@ +// Copyright 2021 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 . + +package downloader + +import ( + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/log" +) + +// bodyQueue implements typedQueue and is a type adapter between the generic +// concurrent fetcher and the downloader. +type bodyQueue Downloader + +// waker returns a notification channel that gets pinged in case more body +// fetches have been queued up, so the fetcher might assign it to idle peers. +func (q *bodyQueue) waker() chan bool { + return q.queue.blockWakeCh +} + +// pending returns the number of bodies that are currently queued for fetching +// by the concurrent downloader. +func (q *bodyQueue) pending() int { + return q.queue.PendingBodies() +} + +// capacity is responsible for calculating how many bodies a particular peer is +// estimated to be able to retrieve within the alloted round trip time. +func (q *bodyQueue) capacity(peer *peerConnection, rtt time.Duration) int { + return peer.BodyCapacity(rtt) +} + +// updateCapacity is responsible for updating how many bodies a particular peer +// is estimated to be able to retrieve in a unit time. +func (q *bodyQueue) updateCapacity(peer *peerConnection, items int, span time.Duration) { + peer.UpdateBodyRate(items, span) +} + +// reserve is responsible for allocating a requested number of pending bodies +// from the download queue to the specified peer. +func (q *bodyQueue) reserve(peer *peerConnection, items int) (*fetchRequest, bool, bool) { + return q.queue.ReserveBodies(peer, items) +} + +// unreserve is resposible for removing the current body retrieval allocation +// assigned to a specific peer and placing it back into the pool to allow +// reassigning to some other peer. +func (q *bodyQueue) unreserve(peer string) int { + fails := q.queue.ExpireBodies(peer) + if fails > 2 { + log.Trace("Body delivery timed out", "peer", peer) + } else { + log.Debug("Body delivery stalling", "peer", peer) + } + return fails +} + +// request is responsible for converting a generic fetch request into a body +// one and sending it to the remote peer for fulfillment. +func (q *bodyQueue) request(peer *peerConnection, req *fetchRequest, resCh chan *eth.Response) (*eth.Request, error) { + peer.log.Trace("Requesting new batch of bodies", "count", len(req.Headers), "from", req.Headers[0].Number) + if q.bodyFetchHook != nil { + q.bodyFetchHook(req.Headers) + } + + hashes := make([]common.Hash, 0, len(req.Headers)) + for _, header := range req.Headers { + hashes = append(hashes, header.Hash()) + } + return peer.peer.RequestBodies(hashes, resCh) +} + +// deliver is responsible for taking a generic response packet from the concurrent +// fetcher, unpacking the body data and delivering it to the downloader's queue. +func (q *bodyQueue) deliver(peer *peerConnection, packet *eth.Response) (int, error) { + txs, uncles := packet.Res.(*eth.BlockBodiesPacket).Unpack() + hashsets := packet.Meta.([][]common.Hash) // {txs hashes, uncle hashes} + + accepted, err := q.queue.DeliverBodies(peer.id, txs, hashsets[0], uncles, hashsets[1]) + switch { + case err == nil && len(txs) == 0: + peer.log.Trace("Requested bodies delivered") + case err == nil: + peer.log.Trace("Delivered new batch of bodies", "count", len(txs), "accepted", accepted) + default: + peer.log.Debug("Failed to deliver retrieved bodies", "err", err) + } + return accepted, err +} diff --git a/eth/downloader/fetchers_concurrent_headers.go b/eth/downloader/fetchers_concurrent_headers.go new file mode 100644 index 0000000000..bd3bb3e00b --- /dev/null +++ b/eth/downloader/fetchers_concurrent_headers.go @@ -0,0 +1,97 @@ +// Copyright 2021 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 . + +package downloader + +import ( + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/log" +) + +// headerQueue implements typedQueue and is a type adapter between the generic +// concurrent fetcher and the downloader. +type headerQueue Downloader + +// waker returns a notification channel that gets pinged in case more header +// fetches have been queued up, so the fetcher might assign it to idle peers. +func (q *headerQueue) waker() chan bool { + return q.queue.headerContCh +} + +// pending returns the number of headers that are currently queued for fetching +// by the concurrent downloader. +func (q *headerQueue) pending() int { + return q.queue.PendingHeaders() +} + +// capacity is responsible for calculating how many headers a particular peer is +// estimated to be able to retrieve within the alloted round trip time. +func (q *headerQueue) capacity(peer *peerConnection, rtt time.Duration) int { + return peer.HeaderCapacity(rtt) +} + +// updateCapacity is responsible for updating how many headers a particular peer +// is estimated to be able to retrieve in a unit time. +func (q *headerQueue) updateCapacity(peer *peerConnection, items int, span time.Duration) { + peer.UpdateHeaderRate(items, span) +} + +// reserve is responsible for allocating a requested number of pending headers +// from the download queue to the specified peer. +func (q *headerQueue) reserve(peer *peerConnection, items int) (*fetchRequest, bool, bool) { + return q.queue.ReserveHeaders(peer, items), false, false +} + +// unreserve is resposible for removing the current header retrieval allocation +// assigned to a specific peer and placing it back into the pool to allow +// reassigning to some other peer. +func (q *headerQueue) unreserve(peer string) int { + fails := q.queue.ExpireHeaders(peer) + if fails > 2 { + log.Trace("Header delivery timed out", "peer", peer) + } else { + log.Debug("Header delivery stalling", "peer", peer) + } + return fails +} + +// request is responsible for converting a generic fetch request into a header +// one and sending it to the remote peer for fulfillment. +func (q *headerQueue) request(peer *peerConnection, req *fetchRequest, resCh chan *eth.Response) (*eth.Request, error) { + peer.log.Trace("Requesting new batch of headers", "from", req.From) + return peer.peer.RequestHeadersByNumber(req.From, MaxHeaderFetch, 0, false, resCh) +} + +// deliver is responsible for taking a generic response packet from the concurrent +// fetcher, unpacking the header data and delivering it to the downloader's queue. +func (q *headerQueue) deliver(peer *peerConnection, packet *eth.Response) (int, error) { + headers := *packet.Res.(*eth.BlockHeadersPacket) + hashes := packet.Meta.([]common.Hash) + + accepted, err := q.queue.DeliverHeaders(peer.id, headers, hashes, q.headerProcCh) + switch { + case err == nil && len(headers) == 0: + peer.log.Trace("Requested headers delivered") + case err == nil: + peer.log.Trace("Delivered new batch of headers", "count", len(headers), "accepted", accepted) + default: + peer.log.Debug("Failed to deliver retrieved headers", "err", err) + } + return accepted, err +} diff --git a/eth/downloader/fetchers_concurrent_receipts.go b/eth/downloader/fetchers_concurrent_receipts.go new file mode 100644 index 0000000000..fee2c34101 --- /dev/null +++ b/eth/downloader/fetchers_concurrent_receipts.go @@ -0,0 +1,104 @@ +// Copyright 2021 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 . + +package downloader + +import ( + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/log" +) + +// receiptQueue implements typedQueue and is a type adapter between the generic +// concurrent fetcher and the downloader. +type receiptQueue Downloader + +// waker returns a notification channel that gets pinged in case more reecipt +// fetches have been queued up, so the fetcher might assign it to idle peers. +func (q *receiptQueue) waker() chan bool { + return q.queue.receiptWakeCh +} + +// pending returns the number of receipt that are currently queued for fetching +// by the concurrent downloader. +func (q *receiptQueue) pending() int { + return q.queue.PendingReceipts() +} + +// capacity is responsible for calculating how many receipts a particular peer is +// estimated to be able to retrieve within the alloted round trip time. +func (q *receiptQueue) capacity(peer *peerConnection, rtt time.Duration) int { + return peer.ReceiptCapacity(rtt) +} + +// updateCapacity is responsible for updating how many receipts a particular peer +// is estimated to be able to retrieve in a unit time. +func (q *receiptQueue) updateCapacity(peer *peerConnection, items int, span time.Duration) { + peer.UpdateReceiptRate(items, span) +} + +// reserve is responsible for allocating a requested number of pending receipts +// from the download queue to the specified peer. +func (q *receiptQueue) reserve(peer *peerConnection, items int) (*fetchRequest, bool, bool) { + return q.queue.ReserveReceipts(peer, items) +} + +// unreserve is resposible for removing the current receipt retrieval allocation +// assigned to a specific peer and placing it back into the pool to allow +// reassigning to some other peer. +func (q *receiptQueue) unreserve(peer string) int { + fails := q.queue.ExpireReceipts(peer) + if fails > 2 { + log.Trace("Receipt delivery timed out", "peer", peer) + } else { + log.Debug("Receipt delivery stalling", "peer", peer) + } + return fails +} + +// request is responsible for converting a generic fetch request into a receipt +// one and sending it to the remote peer for fulfillment. +func (q *receiptQueue) request(peer *peerConnection, req *fetchRequest, resCh chan *eth.Response) (*eth.Request, error) { + peer.log.Trace("Requesting new batch of receipts", "count", len(req.Headers), "from", req.Headers[0].Number) + if q.receiptFetchHook != nil { + q.receiptFetchHook(req.Headers) + } + hashes := make([]common.Hash, 0, len(req.Headers)) + for _, header := range req.Headers { + hashes = append(hashes, header.Hash()) + } + return peer.peer.RequestReceipts(hashes, resCh) +} + +// deliver is responsible for taking a generic response packet from the concurrent +// fetcher, unpacking the receipt data and delivering it to the downloader's queue. +func (q *receiptQueue) deliver(peer *peerConnection, packet *eth.Response) (int, error) { + receipts := *packet.Res.(*eth.ReceiptsPacket) + hashes := packet.Meta.([]common.Hash) // {receipt hashes} + + accepted, err := q.queue.DeliverReceipts(peer.id, receipts, hashes) + switch { + case err == nil && len(receipts) == 0: + peer.log.Trace("Requested receipts delivered") + case err == nil: + peer.log.Trace("Delivered new batch of receipts", "count", len(receipts), "accepted", accepted) + default: + peer.log.Debug("Failed to deliver retrieved receipts", "err", err) + } + return accepted, err +} diff --git a/eth/downloader/metrics.go b/eth/downloader/metrics.go index c38732043a..23c033a8ad 100644 --- a/eth/downloader/metrics.go +++ b/eth/downloader/metrics.go @@ -38,8 +38,5 @@ var ( receiptDropMeter = metrics.NewRegisteredMeter("eth/downloader/receipts/drop", nil) receiptTimeoutMeter = metrics.NewRegisteredMeter("eth/downloader/receipts/timeout", nil) - stateInMeter = metrics.NewRegisteredMeter("eth/downloader/states/in", nil) - stateDropMeter = metrics.NewRegisteredMeter("eth/downloader/states/drop", nil) - throttleCounter = metrics.NewRegisteredCounter("eth/downloader/throttle", nil) ) diff --git a/eth/downloader/modes.go b/eth/downloader/modes.go index 3ea14d22d7..d388b9ee4d 100644 --- a/eth/downloader/modes.go +++ b/eth/downloader/modes.go @@ -24,7 +24,6 @@ type SyncMode uint32 const ( FullSync SyncMode = iota // Synchronise the entire blockchain history from full blocks - FastSync // Quickly download the headers, full sync only at the chain SnapSync // Download the chain and the state via compact snapshots LightSync // Download only the headers and terminate afterwards ) @@ -38,8 +37,6 @@ func (mode SyncMode) String() string { switch mode { case FullSync: return "full" - case FastSync: - return "fast" case SnapSync: return "snap" case LightSync: @@ -53,8 +50,6 @@ func (mode SyncMode) MarshalText() ([]byte, error) { switch mode { case FullSync: return []byte("full"), nil - case FastSync: - return []byte("fast"), nil case SnapSync: return []byte("snap"), nil case LightSync: @@ -68,14 +63,12 @@ func (mode *SyncMode) UnmarshalText(text []byte) error { switch string(text) { case "full": *mode = FullSync - case "fast": - *mode = FastSync case "snap": *mode = SnapSync case "light": *mode = LightSync default: - return fmt.Errorf(`unknown sync mode %q, want "full", "fast" or "light"`, text) + return fmt.Errorf(`unknown sync mode %q, want "full", "snap" or "light"`, text) } return nil } diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index 8632948329..324fdb9cd5 100644 --- a/eth/downloader/peer.go +++ b/eth/downloader/peer.go @@ -22,9 +22,7 @@ package downloader import ( "errors" "math/big" - "sort" "sync" - "sync/atomic" "time" "github.com/ethereum/go-ethereum/common" @@ -39,7 +37,6 @@ const ( ) var ( - errAlreadyFetching = errors.New("already fetching blocks from peer") errAlreadyRegistered = errors.New("peer is already registered") errNotRegistered = errors.New("peer is not registered") ) @@ -48,16 +45,6 @@ var ( type peerConnection struct { id string // Unique identifier of the peer - headerIdle int32 // Current header activity state of the peer (idle = 0, active = 1) - blockIdle int32 // Current block activity state of the peer (idle = 0, active = 1) - receiptIdle int32 // Current receipt activity state of the peer (idle = 0, active = 1) - stateIdle int32 // Current node data activity state of the peer (idle = 0, active = 1) - - headerStarted time.Time // Time instance when the last header fetch was started - blockStarted time.Time // Time instance when the last block (body) fetch was started - receiptStarted time.Time // Time instance when the last receipt fetch was started - stateStarted time.Time // Time instance when the last node data fetch was started - rates *msgrate.Tracker // Tracker to hone in on the number of items retrievable per second lacking map[common.Hash]struct{} // Set of hashes not to request (didn't have previously) @@ -71,16 +58,15 @@ type peerConnection struct { // LightPeer encapsulates the methods required to synchronise with a remote light peer. type LightPeer interface { Head() (common.Hash, *big.Int) - RequestHeadersByHash(common.Hash, int, int, bool) error - RequestHeadersByNumber(uint64, int, int, bool) error + RequestHeadersByHash(common.Hash, int, int, bool, chan *eth.Response) (*eth.Request, error) + RequestHeadersByNumber(uint64, int, int, bool, chan *eth.Response) (*eth.Request, error) } // Peer encapsulates the methods required to synchronise with a remote full peer. type Peer interface { LightPeer - RequestBodies([]common.Hash) error - RequestReceipts([]common.Hash) error - RequestNodeData([]common.Hash) error + RequestBodies([]common.Hash, chan *eth.Response) (*eth.Request, error) + RequestReceipts([]common.Hash, chan *eth.Response) (*eth.Request, error) } // lightPeerWrapper wraps a LightPeer struct, stubbing out the Peer-only methods. @@ -89,21 +75,18 @@ type lightPeerWrapper struct { } func (w *lightPeerWrapper) Head() (common.Hash, *big.Int) { return w.peer.Head() } -func (w *lightPeerWrapper) RequestHeadersByHash(h common.Hash, amount int, skip int, reverse bool) error { - return w.peer.RequestHeadersByHash(h, amount, skip, reverse) +func (w *lightPeerWrapper) RequestHeadersByHash(h common.Hash, amount int, skip int, reverse bool, sink chan *eth.Response) (*eth.Request, error) { + return w.peer.RequestHeadersByHash(h, amount, skip, reverse, sink) } -func (w *lightPeerWrapper) RequestHeadersByNumber(i uint64, amount int, skip int, reverse bool) error { - return w.peer.RequestHeadersByNumber(i, amount, skip, reverse) +func (w *lightPeerWrapper) RequestHeadersByNumber(i uint64, amount int, skip int, reverse bool, sink chan *eth.Response) (*eth.Request, error) { + return w.peer.RequestHeadersByNumber(i, amount, skip, reverse, sink) } -func (w *lightPeerWrapper) RequestBodies([]common.Hash) error { +func (w *lightPeerWrapper) RequestBodies([]common.Hash, chan *eth.Response) (*eth.Request, error) { panic("RequestBodies not supported in light client mode sync") } -func (w *lightPeerWrapper) RequestReceipts([]common.Hash) error { +func (w *lightPeerWrapper) RequestReceipts([]common.Hash, chan *eth.Response) (*eth.Request, error) { panic("RequestReceipts not supported in light client mode sync") } -func (w *lightPeerWrapper) RequestNodeData([]common.Hash) error { - panic("RequestNodeData not supported in light client mode sync") -} // newPeerConnection creates a new downloader peer. func newPeerConnection(id string, version uint, peer Peer, logger log.Logger) *peerConnection { @@ -121,114 +104,28 @@ func (p *peerConnection) Reset() { p.lock.Lock() defer p.lock.Unlock() - atomic.StoreInt32(&p.headerIdle, 0) - atomic.StoreInt32(&p.blockIdle, 0) - atomic.StoreInt32(&p.receiptIdle, 0) - atomic.StoreInt32(&p.stateIdle, 0) - p.lacking = make(map[common.Hash]struct{}) } -// FetchHeaders sends a header retrieval request to the remote peer. -func (p *peerConnection) FetchHeaders(from uint64, count int) error { - // Short circuit if the peer is already fetching - if !atomic.CompareAndSwapInt32(&p.headerIdle, 0, 1) { - return errAlreadyFetching - } - p.headerStarted = time.Now() - - // Issue the header retrieval request (absolute upwards without gaps) - go p.peer.RequestHeadersByNumber(from, count, 0, false) - - return nil -} - -// FetchBodies sends a block body retrieval request to the remote peer. -func (p *peerConnection) FetchBodies(request *fetchRequest) error { - // Short circuit if the peer is already fetching - if !atomic.CompareAndSwapInt32(&p.blockIdle, 0, 1) { - return errAlreadyFetching - } - p.blockStarted = time.Now() - - go func() { - // Convert the header set to a retrievable slice - hashes := make([]common.Hash, 0, len(request.Headers)) - for _, header := range request.Headers { - hashes = append(hashes, header.Hash()) - } - p.peer.RequestBodies(hashes) - }() - - return nil -} - -// FetchReceipts sends a receipt retrieval request to the remote peer. -func (p *peerConnection) FetchReceipts(request *fetchRequest) error { - // Short circuit if the peer is already fetching - if !atomic.CompareAndSwapInt32(&p.receiptIdle, 0, 1) { - return errAlreadyFetching - } - p.receiptStarted = time.Now() - - go func() { - // Convert the header set to a retrievable slice - hashes := make([]common.Hash, 0, len(request.Headers)) - for _, header := range request.Headers { - hashes = append(hashes, header.Hash()) - } - p.peer.RequestReceipts(hashes) - }() - - return nil +// UpdateHeaderRate updates the peer's estimated header retrieval throughput with +// the current measurement. +func (p *peerConnection) UpdateHeaderRate(delivered int, elapsed time.Duration) { + p.rates.Update(eth.BlockHeadersMsg, elapsed, delivered) } -// FetchNodeData sends a node state data retrieval request to the remote peer. -func (p *peerConnection) FetchNodeData(hashes []common.Hash) error { - // Short circuit if the peer is already fetching - if !atomic.CompareAndSwapInt32(&p.stateIdle, 0, 1) { - return errAlreadyFetching - } - p.stateStarted = time.Now() - - go p.peer.RequestNodeData(hashes) - - return nil +// UpdateBodyRate updates the peer's estimated body retrieval throughput with the +// current measurement. +func (p *peerConnection) UpdateBodyRate(delivered int, elapsed time.Duration) { + p.rates.Update(eth.BlockBodiesMsg, elapsed, delivered) } -// SetHeadersIdle sets the peer to idle, allowing it to execute new header retrieval -// requests. Its estimated header retrieval throughput is updated with that measured -// just now. -func (p *peerConnection) SetHeadersIdle(delivered int, deliveryTime time.Time) { - p.rates.Update(eth.BlockHeadersMsg, deliveryTime.Sub(p.headerStarted), delivered) - atomic.StoreInt32(&p.headerIdle, 0) +// UpdateReceiptRate updates the peer's estimated receipt retrieval throughput +// with the current measurement. +func (p *peerConnection) UpdateReceiptRate(delivered int, elapsed time.Duration) { + p.rates.Update(eth.ReceiptsMsg, elapsed, delivered) } -// SetBodiesIdle sets the peer to idle, allowing it to execute block body retrieval -// requests. Its estimated body retrieval throughput is updated with that measured -// just now. -func (p *peerConnection) SetBodiesIdle(delivered int, deliveryTime time.Time) { - p.rates.Update(eth.BlockBodiesMsg, deliveryTime.Sub(p.blockStarted), delivered) - atomic.StoreInt32(&p.blockIdle, 0) -} - -// SetReceiptsIdle sets the peer to idle, allowing it to execute new receipt -// retrieval requests. Its estimated receipt retrieval throughput is updated -// with that measured just now. -func (p *peerConnection) SetReceiptsIdle(delivered int, deliveryTime time.Time) { - p.rates.Update(eth.ReceiptsMsg, deliveryTime.Sub(p.receiptStarted), delivered) - atomic.StoreInt32(&p.receiptIdle, 0) -} - -// SetNodeDataIdle sets the peer to idle, allowing it to execute new state trie -// data retrieval requests. Its estimated state retrieval throughput is updated -// with that measured just now. -func (p *peerConnection) SetNodeDataIdle(delivered int, deliveryTime time.Time) { - p.rates.Update(eth.NodeDataMsg, deliveryTime.Sub(p.stateStarted), delivered) - atomic.StoreInt32(&p.stateIdle, 0) -} - -// HeaderCapacity retrieves the peers header download allowance based on its +// HeaderCapacity retrieves the peer's header download allowance based on its // previously discovered throughput. func (p *peerConnection) HeaderCapacity(targetRTT time.Duration) int { cap := p.rates.Capacity(eth.BlockHeadersMsg, targetRTT) @@ -238,9 +135,9 @@ func (p *peerConnection) HeaderCapacity(targetRTT time.Duration) int { return cap } -// BlockCapacity retrieves the peers block download allowance based on its +// BodyCapacity retrieves the peer's body download allowance based on its // previously discovered throughput. -func (p *peerConnection) BlockCapacity(targetRTT time.Duration) int { +func (p *peerConnection) BodyCapacity(targetRTT time.Duration) int { cap := p.rates.Capacity(eth.BlockBodiesMsg, targetRTT) if cap > MaxBlockFetch { cap = MaxBlockFetch @@ -258,16 +155,6 @@ func (p *peerConnection) ReceiptCapacity(targetRTT time.Duration) int { return cap } -// NodeDataCapacity retrieves the peers state download allowance based on its -// previously discovered throughput. -func (p *peerConnection) NodeDataCapacity(targetRTT time.Duration) int { - cap := p.rates.Capacity(eth.NodeDataMsg, targetRTT) - if cap > MaxStateFetch { - cap = MaxStateFetch - } - return cap -} - // MarkLacking appends a new entity to the set of items (blocks, receipts, states) // that a peer is known not to have (i.e. have been requested before). If the // set reaches its maximum allowed capacity, items are randomly dropped off. @@ -294,14 +181,19 @@ func (p *peerConnection) Lacks(hash common.Hash) bool { return ok } +// peeringEvent is sent on the peer event feed when a remote peer connects or +// disconnects. +type peeringEvent struct { + peer *peerConnection + join bool +} + // peerSet represents the collection of active peer participating in the chain // download procedure. type peerSet struct { - peers map[string]*peerConnection - rates *msgrate.Trackers // Set of rate trackers to give the sync a common beat - - newPeerFeed event.Feed - peerDropFeed event.Feed + peers map[string]*peerConnection + rates *msgrate.Trackers // Set of rate trackers to give the sync a common beat + events event.Feed // Feed to publish peer lifecycle events on lock sync.RWMutex } @@ -314,14 +206,9 @@ func newPeerSet() *peerSet { } } -// SubscribeNewPeers subscribes to peer arrival events. -func (ps *peerSet) SubscribeNewPeers(ch chan<- *peerConnection) event.Subscription { - return ps.newPeerFeed.Subscribe(ch) -} - -// SubscribePeerDrops subscribes to peer departure events. -func (ps *peerSet) SubscribePeerDrops(ch chan<- *peerConnection) event.Subscription { - return ps.peerDropFeed.Subscribe(ch) +// SubscribeEvents subscribes to peer arrival and departure events. +func (ps *peerSet) SubscribeEvents(ch chan<- *peeringEvent) event.Subscription { + return ps.events.Subscribe(ch) } // Reset iterates over the current peer set, and resets each of the known peers @@ -355,7 +242,7 @@ func (ps *peerSet) Register(p *peerConnection) error { ps.peers[p.id] = p ps.lock.Unlock() - ps.newPeerFeed.Send(p) + ps.events.Send(&peeringEvent{peer: p, join: true}) return nil } @@ -372,7 +259,7 @@ func (ps *peerSet) Unregister(id string) error { ps.rates.Untrack(id) ps.lock.Unlock() - ps.peerDropFeed.Send(p) + ps.events.Send(&peeringEvent{peer: p, join: false}) return nil } @@ -404,82 +291,6 @@ func (ps *peerSet) AllPeers() []*peerConnection { return list } -// HeaderIdlePeers retrieves a flat list of all the currently header-idle peers -// within the active peer set, ordered by their reputation. -func (ps *peerSet) HeaderIdlePeers() ([]*peerConnection, int) { - idle := func(p *peerConnection) bool { - return atomic.LoadInt32(&p.headerIdle) == 0 - } - throughput := func(p *peerConnection) int { - return p.rates.Capacity(eth.BlockHeadersMsg, time.Second) - } - return ps.idlePeers(eth.ETH66, eth.ETH66, idle, throughput) -} - -// BodyIdlePeers retrieves a flat list of all the currently body-idle peers within -// the active peer set, ordered by their reputation. -func (ps *peerSet) BodyIdlePeers() ([]*peerConnection, int) { - idle := func(p *peerConnection) bool { - return atomic.LoadInt32(&p.blockIdle) == 0 - } - throughput := func(p *peerConnection) int { - return p.rates.Capacity(eth.BlockBodiesMsg, time.Second) - } - return ps.idlePeers(eth.ETH66, eth.ETH66, idle, throughput) -} - -// ReceiptIdlePeers retrieves a flat list of all the currently receipt-idle peers -// within the active peer set, ordered by their reputation. -func (ps *peerSet) ReceiptIdlePeers() ([]*peerConnection, int) { - idle := func(p *peerConnection) bool { - return atomic.LoadInt32(&p.receiptIdle) == 0 - } - throughput := func(p *peerConnection) int { - return p.rates.Capacity(eth.ReceiptsMsg, time.Second) - } - return ps.idlePeers(eth.ETH66, eth.ETH66, idle, throughput) -} - -// NodeDataIdlePeers retrieves a flat list of all the currently node-data-idle -// peers within the active peer set, ordered by their reputation. -func (ps *peerSet) NodeDataIdlePeers() ([]*peerConnection, int) { - idle := func(p *peerConnection) bool { - return atomic.LoadInt32(&p.stateIdle) == 0 - } - throughput := func(p *peerConnection) int { - return p.rates.Capacity(eth.NodeDataMsg, time.Second) - } - return ps.idlePeers(eth.ETH66, eth.ETH66, idle, throughput) -} - -// idlePeers retrieves a flat list of all currently idle peers satisfying the -// protocol version constraints, using the provided function to check idleness. -// The resulting set of peers are sorted by their capacity. -func (ps *peerSet) idlePeers(minProtocol, maxProtocol uint, idleCheck func(*peerConnection) bool, capacity func(*peerConnection) int) ([]*peerConnection, int) { - ps.lock.RLock() - defer ps.lock.RUnlock() - - var ( - total = 0 - idle = make([]*peerConnection, 0, len(ps.peers)) - tps = make([]int, 0, len(ps.peers)) - ) - for _, p := range ps.peers { - if p.version >= minProtocol && p.version <= maxProtocol { - if idleCheck(p) { - idle = append(idle, p) - tps = append(tps, capacity(p)) - } - total++ - } - } - - // And sort them - sortPeers := &peerCapacitySort{idle, tps} - sort.Sort(sortPeers) - return sortPeers.p, total -} - // peerCapacitySort implements sort.Interface. // It sorts peer connections by capacity (descending). type peerCapacitySort struct { diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index 04ec12cfa9..ff34d932f0 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -31,7 +31,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/trie" ) const ( @@ -54,8 +53,8 @@ var ( // fetchRequest is a currently running data retrieval operation. type fetchRequest struct { Peer *peerConnection // Peer to which the request was sent - From uint64 // [eth/62] Requested chain element index (used for skeleton fills only) - Headers []*types.Header // [eth/62] Requested headers, sorted by request order + From uint64 // Requested chain element index (used for skeleton fills only) + Headers []*types.Header // Requested headers, sorted by request order Time time.Time // Time when the request was made } @@ -119,6 +118,7 @@ type queue struct { headerPeerMiss map[string]map[uint64]struct{} // Set of per-peer header batches known to be unavailable headerPendPool map[string]*fetchRequest // Currently pending header retrieval operations headerResults []*types.Header // Result cache accumulating the completed headers + headerHashes []common.Hash // Result cache accumulating the completed header hashes headerProced int // Number of headers already processed from the results headerOffset uint64 // Number of the first header in the result cache headerContCh chan bool // Channel to notify when header download finishes @@ -127,10 +127,12 @@ type queue struct { blockTaskPool map[common.Hash]*types.Header // Pending block (body) retrieval tasks, mapping hashes to headers blockTaskQueue *prque.Prque // Priority queue of the headers to fetch the blocks (bodies) for blockPendPool map[string]*fetchRequest // Currently pending block (body) retrieval operations + blockWakeCh chan bool // Channel to notify the block fetcher of new tasks receiptTaskPool map[common.Hash]*types.Header // Pending receipt retrieval tasks, mapping hashes to headers receiptTaskQueue *prque.Prque // Priority queue of the headers to fetch the receipts for receiptPendPool map[string]*fetchRequest // Currently pending receipt retrieval operations + receiptWakeCh chan bool // Channel to notify when receipt fetcher of new tasks resultCache *resultStore // Downloaded but not yet delivered fetch results resultSize common.StorageSize // Approximate size of a block (exponential moving average) @@ -146,9 +148,11 @@ type queue struct { func newQueue(blockCacheLimit int, thresholdInitialSize int) *queue { lock := new(sync.RWMutex) q := &queue{ - headerContCh: make(chan bool), + headerContCh: make(chan bool, 1), blockTaskQueue: prque.New(nil), + blockWakeCh: make(chan bool, 1), receiptTaskQueue: prque.New(nil), + receiptWakeCh: make(chan bool, 1), active: sync.NewCond(lock), lock: lock, } @@ -196,8 +200,8 @@ func (q *queue) PendingHeaders() int { return q.headerTaskQueue.Size() } -// PendingBlocks retrieves the number of block (body) requests pending for retrieval. -func (q *queue) PendingBlocks() int { +// PendingBodies retrieves the number of block body requests pending for retrieval. +func (q *queue) PendingBodies() int { q.lock.Lock() defer q.lock.Unlock() @@ -212,15 +216,6 @@ func (q *queue) PendingReceipts() int { return q.receiptTaskQueue.Size() } -// InFlightHeaders retrieves whether there are header fetch requests currently -// in flight. -func (q *queue) InFlightHeaders() bool { - q.lock.Lock() - defer q.lock.Unlock() - - return len(q.headerPendPool) > 0 -} - // InFlightBlocks retrieves whether there are block fetch requests currently in // flight. func (q *queue) InFlightBlocks() bool { @@ -265,6 +260,7 @@ func (q *queue) ScheduleSkeleton(from uint64, skeleton []*types.Header) { q.headerTaskQueue = prque.New(nil) q.headerPeerMiss = make(map[string]map[uint64]struct{}) // Reset availability to correct invalid chains q.headerResults = make([]*types.Header, len(skeleton)*MaxHeaderFetch) + q.headerHashes = make([]common.Hash, len(skeleton)*MaxHeaderFetch) q.headerProced = 0 q.headerOffset = from q.headerContCh = make(chan bool, 1) @@ -279,27 +275,27 @@ func (q *queue) ScheduleSkeleton(from uint64, skeleton []*types.Header) { // RetrieveHeaders retrieves the header chain assemble based on the scheduled // skeleton. -func (q *queue) RetrieveHeaders() ([]*types.Header, int) { +func (q *queue) RetrieveHeaders() ([]*types.Header, []common.Hash, int) { q.lock.Lock() defer q.lock.Unlock() - headers, proced := q.headerResults, q.headerProced - q.headerResults, q.headerProced = nil, 0 + headers, hashes, proced := q.headerResults, q.headerHashes, q.headerProced + q.headerResults, q.headerHashes, q.headerProced = nil, nil, 0 - return headers, proced + return headers, hashes, proced } // Schedule adds a set of headers for the download queue for scheduling, returning // the new headers encountered. -func (q *queue) Schedule(headers []*types.Header, from uint64) []*types.Header { +func (q *queue) Schedule(headers []*types.Header, hashes []common.Hash, from uint64) []*types.Header { q.lock.Lock() defer q.lock.Unlock() // Insert all the headers prioritised by the contained block number inserts := make([]*types.Header, 0, len(headers)) - for _, header := range headers { + for i, header := range headers { // Make sure chain order is honoured and preserved throughout - hash := header.Hash() + hash := hashes[i] if header.Number == nil || header.Number.Uint64() != from { log.Warn("Header broke chain ordering", "number", header.Number, "hash", hash, "expected", from) break @@ -318,7 +314,7 @@ func (q *queue) Schedule(headers []*types.Header, from uint64) []*types.Header { q.blockTaskQueue.Push(header, -int64(header.Number.Uint64())) } // Queue for receipt retrieval - if q.mode == FastSync && !header.EmptyReceipts() { + if q.mode == SnapSync && !header.EmptyReceipts() { if _, ok := q.receiptTaskPool[hash]; ok { log.Warn("Header already scheduled for receipt fetch", "number", header.Number, "hash", hash) } else { @@ -383,6 +379,13 @@ func (q *queue) Results(block bool) []*fetchResult { throttleThreshold := uint64((common.StorageSize(blockCacheMemory) + q.resultSize - 1) / q.resultSize) throttleThreshold = q.resultCache.SetThrottleThreshold(throttleThreshold) + // With results removed from the cache, wake throttled fetchers + for _, ch := range []chan bool{q.blockWakeCh, q.receiptWakeCh} { + select { + case ch <- true: + default: + } + } // Log some info at certain times if time.Since(q.lastStatLog) > 60*time.Second { q.lastStatLog = time.Now() @@ -503,7 +506,7 @@ func (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common // we can ask the resultcache if this header is within the // "prioritized" segment of blocks. If it is not, we need to throttle - stale, throttle, item, err := q.resultCache.AddFetch(header, q.mode == FastSync) + stale, throttle, item, err := q.resultCache.AddFetch(header, q.mode == SnapSync) if stale { // Don't put back in the task queue, this item has already been // delivered upstream @@ -566,40 +569,6 @@ func (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common return request, progress, throttled } -// CancelHeaders aborts a fetch request, returning all pending skeleton indexes to the queue. -func (q *queue) CancelHeaders(request *fetchRequest) { - q.lock.Lock() - defer q.lock.Unlock() - q.cancel(request, q.headerTaskQueue, q.headerPendPool) -} - -// CancelBodies aborts a body fetch request, returning all pending headers to the -// task queue. -func (q *queue) CancelBodies(request *fetchRequest) { - q.lock.Lock() - defer q.lock.Unlock() - q.cancel(request, q.blockTaskQueue, q.blockPendPool) -} - -// CancelReceipts aborts a body fetch request, returning all pending headers to -// the task queue. -func (q *queue) CancelReceipts(request *fetchRequest) { - q.lock.Lock() - defer q.lock.Unlock() - q.cancel(request, q.receiptTaskQueue, q.receiptPendPool) -} - -// Cancel aborts a fetch request, returning all pending hashes to the task queue. -func (q *queue) cancel(request *fetchRequest, taskQueue *prque.Prque, pendPool map[string]*fetchRequest) { - if request.From > 0 { - taskQueue.Push(request.From, -int64(request.From)) - } - for _, header := range request.Headers { - taskQueue.Push(header, -int64(header.Number.Uint64())) - } - delete(pendPool, request.Peer.id) -} - // Revoke cancels all pending requests belonging to a given peer. This method is // meant to be called during a peer drop to quickly reassign owned data fetches // to remaining nodes. @@ -607,6 +576,10 @@ func (q *queue) Revoke(peerID string) { q.lock.Lock() defer q.lock.Unlock() + if request, ok := q.headerPendPool[peerID]; ok { + q.headerTaskQueue.Push(request.From, -int64(request.From)) + delete(q.headerPendPool, peerID) + } if request, ok := q.blockPendPool[peerID]; ok { for _, header := range request.Headers { q.blockTaskQueue.Push(header, -int64(header.Number.Uint64())) @@ -621,62 +594,60 @@ func (q *queue) Revoke(peerID string) { } } -// ExpireHeaders checks for in flight requests that exceeded a timeout allowance, -// canceling them and returning the responsible peers for penalisation. -func (q *queue) ExpireHeaders(timeout time.Duration) map[string]int { +// ExpireHeaders cancels a request that timed out and moves the pending fetch +// task back into the queue for rescheduling. +func (q *queue) ExpireHeaders(peer string) int { q.lock.Lock() defer q.lock.Unlock() - return q.expire(timeout, q.headerPendPool, q.headerTaskQueue, headerTimeoutMeter) + headerTimeoutMeter.Mark(1) + return q.expire(peer, q.headerPendPool, q.headerTaskQueue) } // ExpireBodies checks for in flight block body requests that exceeded a timeout // allowance, canceling them and returning the responsible peers for penalisation. -func (q *queue) ExpireBodies(timeout time.Duration) map[string]int { +func (q *queue) ExpireBodies(peer string) int { q.lock.Lock() defer q.lock.Unlock() - return q.expire(timeout, q.blockPendPool, q.blockTaskQueue, bodyTimeoutMeter) + bodyTimeoutMeter.Mark(1) + return q.expire(peer, q.blockPendPool, q.blockTaskQueue) } // ExpireReceipts checks for in flight receipt requests that exceeded a timeout // allowance, canceling them and returning the responsible peers for penalisation. -func (q *queue) ExpireReceipts(timeout time.Duration) map[string]int { +func (q *queue) ExpireReceipts(peer string) int { q.lock.Lock() defer q.lock.Unlock() - return q.expire(timeout, q.receiptPendPool, q.receiptTaskQueue, receiptTimeoutMeter) + receiptTimeoutMeter.Mark(1) + return q.expire(peer, q.receiptPendPool, q.receiptTaskQueue) } -// expire is the generic check that move expired tasks from a pending pool back -// into a task pool, returning all entities caught with expired tasks. +// expire is the generic check that moves a specific expired task from a pending +// pool back into a task pool. // -// Note, this method expects the queue lock to be already held. The -// reason the lock is not obtained in here is because the parameters already need -// to access the queue, so they already need a lock anyway. -func (q *queue) expire(timeout time.Duration, pendPool map[string]*fetchRequest, taskQueue *prque.Prque, timeoutMeter metrics.Meter) map[string]int { - // Iterate over the expired requests and return each to the queue - expiries := make(map[string]int) - for id, request := range pendPool { - if time.Since(request.Time) > timeout { - // Update the metrics with the timeout - timeoutMeter.Mark(1) - - // Return any non satisfied requests to the pool - if request.From > 0 { - taskQueue.Push(request.From, -int64(request.From)) - } - for _, header := range request.Headers { - taskQueue.Push(header, -int64(header.Number.Uint64())) - } - // Add the peer to the expiry report along the number of failed requests - expiries[id] = len(request.Headers) - - // Remove the expired requests from the pending pool directly - delete(pendPool, id) - } +// Note, this method expects the queue lock to be already held. The reason the +// lock is not obtained in here is that the parameters already need to access +// the queue, so they already need a lock anyway. +func (q *queue) expire(peer string, pendPool map[string]*fetchRequest, taskQueue *prque.Prque) int { + // Retrieve the request being expired and log an error if it's non-existnet, + // as there's no order of events that should lead to such expirations. + req := pendPool[peer] + if req == nil { + log.Error("Expired request does not exist", "peer", peer) + return 0 + } + delete(pendPool, peer) + + // Return any non-satisfied requests to the pool + if req.From > 0 { + taskQueue.Push(req.From, -int64(req.From)) + } + for _, header := range req.Headers { + taskQueue.Push(header, -int64(header.Number.Uint64())) } - return expiries + return len(req.Headers) } // DeliverHeaders injects a header retrieval response into the header results @@ -684,9 +655,9 @@ func (q *queue) expire(timeout time.Duration, pendPool map[string]*fetchRequest, // if they do not map correctly to the skeleton. // // If the headers are accepted, the method makes an attempt to deliver the set -// of ready headers to the processor to keep the pipeline full. However it will +// of ready headers to the processor to keep the pipeline full. However, it will // not block to prevent stalling other pending deliveries. -func (q *queue) DeliverHeaders(id string, headers []*types.Header, headerProcCh chan []*types.Header) (int, error) { +func (q *queue) DeliverHeaders(id string, headers []*types.Header, hashes []common.Hash, headerProcCh chan *headerTask) (int, error) { q.lock.Lock() defer q.lock.Unlock() @@ -700,28 +671,31 @@ func (q *queue) DeliverHeaders(id string, headers []*types.Header, headerProcCh // Short circuit if the data was never requested request := q.headerPendPool[id] if request == nil { + headerDropMeter.Mark(int64(len(headers))) return 0, errNoFetchesPending } - headerReqTimer.UpdateSince(request.Time) delete(q.headerPendPool, id) + headerReqTimer.UpdateSince(request.Time) + headerInMeter.Mark(int64(len(headers))) + // Ensure headers can be mapped onto the skeleton chain target := q.headerTaskPool[request.From].Hash() accepted := len(headers) == MaxHeaderFetch if accepted { if headers[0].Number.Uint64() != request.From { - logger.Trace("First header broke chain ordering", "number", headers[0].Number, "hash", headers[0].Hash(), "expected", request.From) + logger.Trace("First header broke chain ordering", "number", headers[0].Number, "hash", hashes[0], "expected", request.From) accepted = false - } else if headers[len(headers)-1].Hash() != target { - logger.Trace("Last header broke skeleton structure ", "number", headers[len(headers)-1].Number, "hash", headers[len(headers)-1].Hash(), "expected", target) + } else if hashes[len(headers)-1] != target { + logger.Trace("Last header broke skeleton structure ", "number", headers[len(headers)-1].Number, "hash", hashes[len(headers)-1], "expected", target) accepted = false } } if accepted { - parentHash := headers[0].Hash() + parentHash := hashes[0] for i, header := range headers[1:] { - hash := header.Hash() + hash := hashes[i+1] if want := request.From + 1 + uint64(i); header.Number.Uint64() != want { logger.Warn("Header broke chain ordering", "number", header.Number, "hash", hash, "expected", want) accepted = false @@ -739,6 +713,7 @@ func (q *queue) DeliverHeaders(id string, headers []*types.Header, headerProcCh // If the batch of headers wasn't accepted, mark as unavailable if !accepted { logger.Trace("Skeleton filling not accepted", "from", request.From) + headerDropMeter.Mark(int64(len(headers))) miss := q.headerPeerMiss[id] if miss == nil { @@ -752,6 +727,8 @@ func (q *queue) DeliverHeaders(id string, headers []*types.Header, headerProcCh } // Clean up a successful fetch and try to deliver any sub-results copy(q.headerResults[request.From-q.headerOffset:], headers) + copy(q.headerHashes[request.From-q.headerOffset:], hashes) + delete(q.headerTaskPool, request.From) ready := 0 @@ -760,13 +737,19 @@ func (q *queue) DeliverHeaders(id string, headers []*types.Header, headerProcCh } if ready > 0 { // Headers are ready for delivery, gather them and push forward (non blocking) - process := make([]*types.Header, ready) - copy(process, q.headerResults[q.headerProced:q.headerProced+ready]) + processHeaders := make([]*types.Header, ready) + copy(processHeaders, q.headerResults[q.headerProced:q.headerProced+ready]) + + processHashes := make([]common.Hash, ready) + copy(processHashes, q.headerHashes[q.headerProced:q.headerProced+ready]) select { - case headerProcCh <- process: - logger.Trace("Pre-scheduled new headers", "count", len(process), "from", process[0].Number) - q.headerProced += len(process) + case headerProcCh <- &headerTask{ + headers: processHeaders, + hashes: processHashes, + }: + logger.Trace("Pre-scheduled new headers", "count", len(processHeaders), "from", processHeaders[0].Number) + q.headerProced += len(processHeaders) default: } } @@ -780,15 +763,15 @@ func (q *queue) DeliverHeaders(id string, headers []*types.Header, headerProcCh // DeliverBodies injects a block body retrieval response into the results queue. // The method returns the number of blocks bodies accepted from the delivery and // also wakes any threads waiting for data delivery. -func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, uncleLists [][]*types.Header) (int, error) { +func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, txListHashes []common.Hash, uncleLists [][]*types.Header, uncleListHashes []common.Hash) (int, error) { q.lock.Lock() defer q.lock.Unlock() - trieHasher := trie.NewStackTrie(nil) + validate := func(index int, header *types.Header) error { - if types.DeriveSha(types.Transactions(txLists[index]), trieHasher) != header.TxHash { + if txListHashes[index] != header.TxHash { return errInvalidBody } - if types.CalcUncleHash(uncleLists[index]) != header.UncleHash { + if uncleListHashes[index] != header.UncleHash { return errInvalidBody } return nil @@ -800,18 +783,18 @@ func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, uncleLi result.SetBodyDone() } return q.deliver(id, q.blockTaskPool, q.blockTaskQueue, q.blockPendPool, - bodyReqTimer, len(txLists), validate, reconstruct) + bodyReqTimer, bodyInMeter, bodyDropMeter, len(txLists), validate, reconstruct) } // DeliverReceipts injects a receipt retrieval response into the results queue. // The method returns the number of transaction receipts accepted from the delivery // and also wakes any threads waiting for data delivery. -func (q *queue) DeliverReceipts(id string, receiptList [][]*types.Receipt) (int, error) { +func (q *queue) DeliverReceipts(id string, receiptList [][]*types.Receipt, receiptListHashes []common.Hash) (int, error) { q.lock.Lock() defer q.lock.Unlock() - trieHasher := trie.NewStackTrie(nil) + validate := func(index int, header *types.Header) error { - if types.DeriveSha(types.Receipts(receiptList[index]), trieHasher) != header.ReceiptHash { + if receiptListHashes[index] != header.ReceiptHash { return errInvalidReceipt } return nil @@ -821,7 +804,7 @@ func (q *queue) DeliverReceipts(id string, receiptList [][]*types.Receipt) (int, result.SetReceiptsDone() } return q.deliver(id, q.receiptTaskPool, q.receiptTaskQueue, q.receiptPendPool, - receiptReqTimer, len(receiptList), validate, reconstruct) + receiptReqTimer, receiptInMeter, receiptDropMeter, len(receiptList), validate, reconstruct) } // deliver injects a data retrieval response into the results queue. @@ -830,18 +813,22 @@ func (q *queue) DeliverReceipts(id string, receiptList [][]*types.Receipt) (int, // reason this lock is not obtained in here is because the parameters already need // to access the queue, so they already need a lock anyway. func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header, - taskQueue *prque.Prque, pendPool map[string]*fetchRequest, reqTimer metrics.Timer, + taskQueue *prque.Prque, pendPool map[string]*fetchRequest, + reqTimer metrics.Timer, resInMeter metrics.Meter, resDropMeter metrics.Meter, results int, validate func(index int, header *types.Header) error, reconstruct func(index int, result *fetchResult)) (int, error) { // Short circuit if the data was never requested request := pendPool[id] if request == nil { + resDropMeter.Mark(int64(results)) return 0, errNoFetchesPending } - reqTimer.UpdateSince(request.Time) delete(pendPool, id) + reqTimer.UpdateSince(request.Time) + resInMeter.Mark(int64(results)) + // If no data items were retrieved, mark them as unavailable for the origin peer if results == 0 { for _, header := range request.Headers { @@ -883,6 +870,8 @@ func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header, delete(taskPool, hashes[accepted]) accepted++ } + resDropMeter.Mark(int64(results - accepted)) + // Return all failed or missing fetches to the queue for _, header := range request.Headers[accepted:] { taskQueue.Push(header, -int64(header.Number.Uint64())) diff --git a/eth/downloader/queue_test.go b/eth/downloader/queue_test.go index cde5f306a2..f729def671 100644 --- a/eth/downloader/queue_test.go +++ b/eth/downloader/queue_test.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" ) var ( @@ -104,17 +105,22 @@ func TestBasics(t *testing.T) { if !q.Idle() { t.Errorf("new queue should be idle") } - q.Prepare(1, FastSync) + q.Prepare(1, SnapSync) if res := q.Results(false); len(res) != 0 { t.Fatal("new queue should have 0 results") } // Schedule a batch of headers - q.Schedule(chain.headers(), 1) + headers := chain.headers() + hashes := make([]common.Hash, len(headers)) + for i, header := range headers { + hashes[i] = header.Hash() + } + q.Schedule(headers, hashes, 1) if q.Idle() { t.Errorf("queue should not be idle") } - if got, exp := q.PendingBlocks(), chain.Len(); got != exp { + if got, exp := q.PendingBodies(), chain.Len(); got != exp { t.Errorf("wrong pending block count, got %d, exp %d", got, exp) } // Only non-empty receipts get added to task-queue @@ -197,13 +203,19 @@ func TestEmptyBlocks(t *testing.T) { q := newQueue(10, 10) - q.Prepare(1, FastSync) + q.Prepare(1, SnapSync) + // Schedule a batch of headers - q.Schedule(emptyChain.headers(), 1) + headers := emptyChain.headers() + hashes := make([]common.Hash, len(headers)) + for i, header := range headers { + hashes[i] = header.Hash() + } + q.Schedule(headers, hashes, 1) if q.Idle() { t.Errorf("queue should not be idle") } - if got, exp := q.PendingBlocks(), len(emptyChain.blocks); got != exp { + if got, exp := q.PendingBodies(), len(emptyChain.blocks); got != exp { t.Errorf("wrong pending block count, got %d, exp %d", got, exp) } if got, exp := q.PendingReceipts(), 0; got != exp { @@ -272,7 +284,7 @@ func XTestDelivery(t *testing.T) { } q := newQueue(10, 10) var wg sync.WaitGroup - q.Prepare(1, FastSync) + q.Prepare(1, SnapSync) wg.Add(1) go func() { // deliver headers @@ -280,11 +292,15 @@ func XTestDelivery(t *testing.T) { c := 1 for { //fmt.Printf("getting headers from %d\n", c) - hdrs := world.headers(c) - l := len(hdrs) + headers := world.headers(c) + hashes := make([]common.Hash, len(headers)) + for i, header := range headers { + hashes[i] = header.Hash() + } + l := len(headers) //fmt.Printf("scheduling %d headers, first %d last %d\n", - // l, hdrs[0].Number.Uint64(), hdrs[len(hdrs)-1].Number.Uint64()) - q.Schedule(hdrs, uint64(c)) + // l, headers[0].Number.Uint64(), headers[len(headers)-1].Number.Uint64()) + q.Schedule(headers, hashes, uint64(c)) c += l } }() @@ -311,18 +327,31 @@ func XTestDelivery(t *testing.T) { peer := dummyPeer(fmt.Sprintf("peer-%d", i)) f, _, _ := q.ReserveBodies(peer, rand.Intn(30)) if f != nil { - var emptyList []*types.Header - var txs [][]*types.Transaction - var uncles [][]*types.Header + var ( + emptyList []*types.Header + txset [][]*types.Transaction + uncleset [][]*types.Header + ) numToSkip := rand.Intn(len(f.Headers)) for _, hdr := range f.Headers[0 : len(f.Headers)-numToSkip] { - txs = append(txs, world.getTransactions(hdr.Number.Uint64())) - uncles = append(uncles, emptyList) + txset = append(txset, world.getTransactions(hdr.Number.Uint64())) + uncleset = append(uncleset, emptyList) + } + var ( + txsHashes = make([]common.Hash, len(txset)) + uncleHashes = make([]common.Hash, len(uncleset)) + ) + hasher := trie.NewStackTrie(nil) + for i, txs := range txset { + txsHashes[i] = types.DeriveSha(types.Transactions(txs), hasher) + } + for i, uncles := range uncleset { + uncleHashes[i] = types.CalcUncleHash(uncles) } time.Sleep(100 * time.Millisecond) - _, err := q.DeliverBodies(peer.id, txs, uncles) + _, err := q.DeliverBodies(peer.id, txset, txsHashes, uncleset, uncleHashes) if err != nil { - fmt.Printf("delivered %d bodies %v\n", len(txs), err) + fmt.Printf("delivered %d bodies %v\n", len(txset), err) } } else { i++ @@ -341,7 +370,12 @@ func XTestDelivery(t *testing.T) { for _, hdr := range f.Headers { rcs = append(rcs, world.getReceipts(hdr.Number.Uint64())) } - _, err := q.DeliverReceipts(peer.id, rcs) + hasher := trie.NewStackTrie(nil) + hashes := make([]common.Hash, len(rcs)) + for i, receipt := range rcs { + hashes[i] = types.DeriveSha(types.Receipts(receipt), hasher) + } + _, err := q.DeliverReceipts(peer.id, rcs, hashes) if err != nil { fmt.Printf("delivered %d receipts %v\n", len(rcs), err) } diff --git a/eth/downloader/statesync.go b/eth/downloader/statesync.go index 6c53e5577a..501af63ed5 100644 --- a/eth/downloader/statesync.go +++ b/eth/downloader/statesync.go @@ -17,48 +17,12 @@ package downloader import ( - "fmt" "sync" - "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/rawdb" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/trie" - "golang.org/x/crypto/sha3" ) -// stateReq represents a batch of state fetch requests grouped together into -// a single data retrieval network packet. -type stateReq struct { - nItems uint16 // Number of items requested for download (max is 384, so uint16 is sufficient) - trieTasks map[common.Hash]*trieTask // Trie node download tasks to track previous attempts - codeTasks map[common.Hash]*codeTask // Byte code download tasks to track previous attempts - timeout time.Duration // Maximum round trip time for this to complete - timer *time.Timer // Timer to fire when the RTT timeout expires - peer *peerConnection // Peer that we're requesting from - delivered time.Time // Time when the packet was delivered (independent when we process it) - response [][]byte // Response data of the peer (nil for timeouts) - dropped bool // Flag whether the peer dropped off early -} - -// timedOut returns if this request timed out. -func (req *stateReq) timedOut() bool { - return req.response == nil -} - -// stateSyncStats is a collection of progress stats to report during a state trie -// sync to RPC requests as well as to display in user logs. -type stateSyncStats struct { - processed uint64 // Number of state entries processed - duplicate uint64 // Number of state entries downloaded twice - unexpected uint64 // Number of non-requested state entries received - pending uint64 // Number of still pending state entries -} - // syncState starts downloading state with the given root hash. func (d *Downloader) syncState(root common.Hash) *stateSync { // Create the state sync @@ -85,8 +49,6 @@ func (d *Downloader) stateFetcher() { for next := s; next != nil; { next = d.runStateSync(next) } - case <-d.stateCh: - // Ignore state responses while no sync is running. case <-d.quitCh: return } @@ -96,216 +58,44 @@ func (d *Downloader) stateFetcher() { // runStateSync runs a state synchronisation until it completes or another root // hash is requested to be switched over to. func (d *Downloader) runStateSync(s *stateSync) *stateSync { - var ( - active = make(map[string]*stateReq) // Currently in-flight requests - finished []*stateReq // Completed or failed requests - timeout = make(chan *stateReq) // Timed out active requests - ) log.Trace("State sync starting", "root", s.root) - defer func() { - // Cancel active request timers on exit. Also set peers to idle so they're - // available for the next sync. - for _, req := range active { - req.timer.Stop() - req.peer.SetNodeDataIdle(int(req.nItems), time.Now()) - } - }() go s.run() defer s.Cancel() - // Listen for peer departure events to cancel assigned tasks - peerDrop := make(chan *peerConnection, 1024) - peerSub := s.d.peers.SubscribePeerDrops(peerDrop) - defer peerSub.Unsubscribe() - for { - // Enable sending of the first buffered element if there is one. - var ( - deliverReq *stateReq - deliverReqCh chan *stateReq - ) - if len(finished) > 0 { - deliverReq = finished[0] - deliverReqCh = s.deliver - } - select { - // The stateSync lifecycle: case next := <-d.stateSyncStart: - d.spindownStateSync(active, finished, timeout, peerDrop) return next case <-s.done: - d.spindownStateSync(active, finished, timeout, peerDrop) return nil - - // Send the next finished request to the current sync: - case deliverReqCh <- deliverReq: - // Shift out the first request, but also set the emptied slot to nil for GC - copy(finished, finished[1:]) - finished[len(finished)-1] = nil - finished = finished[:len(finished)-1] - - // Handle incoming state packs: - case pack := <-d.stateCh: - // Discard any data not requested (or previously timed out) - req := active[pack.PeerId()] - if req == nil { - log.Debug("Unrequested node data", "peer", pack.PeerId(), "len", pack.Items()) - continue - } - // Finalize the request and queue up for processing - req.timer.Stop() - req.response = pack.(*statePack).states - req.delivered = time.Now() - - finished = append(finished, req) - delete(active, pack.PeerId()) - - // Handle dropped peer connections: - case p := <-peerDrop: - // Skip if no request is currently pending - req := active[p.id] - if req == nil { - continue - } - // Finalize the request and queue up for processing - req.timer.Stop() - req.dropped = true - req.delivered = time.Now() - - finished = append(finished, req) - delete(active, p.id) - - // Handle timed-out requests: - case req := <-timeout: - // If the peer is already requesting something else, ignore the stale timeout. - // This can happen when the timeout and the delivery happens simultaneously, - // causing both pathways to trigger. - if active[req.peer.id] != req { - continue - } - req.delivered = time.Now() - // Move the timed out data back into the download queue - finished = append(finished, req) - delete(active, req.peer.id) - - // Track outgoing state requests: - case req := <-d.trackStateReq: - // If an active request already exists for this peer, we have a problem. In - // theory the trie node schedule must never assign two requests to the same - // peer. In practice however, a peer might receive a request, disconnect and - // immediately reconnect before the previous times out. In this case the first - // request is never honored, alas we must not silently overwrite it, as that - // causes valid requests to go missing and sync to get stuck. - if old := active[req.peer.id]; old != nil { - log.Warn("Busy peer assigned new state fetch", "peer", old.peer.id) - // Move the previous request to the finished set - old.timer.Stop() - old.dropped = true - old.delivered = time.Now() - finished = append(finished, old) - } - // Start a timer to notify the sync loop if the peer stalled. - req.timer = time.AfterFunc(req.timeout, func() { - timeout <- req - }) - active[req.peer.id] = req } } } -// spindownStateSync 'drains' the outstanding requests; some will be delivered and other -// will time out. This is to ensure that when the next stateSync starts working, all peers -// are marked as idle and de facto _are_ idle. -func (d *Downloader) spindownStateSync(active map[string]*stateReq, finished []*stateReq, timeout chan *stateReq, peerDrop chan *peerConnection) { - log.Trace("State sync spinning down", "active", len(active), "finished", len(finished)) - for len(active) > 0 { - var ( - req *stateReq - reason string - ) - select { - // Handle (drop) incoming state packs: - case pack := <-d.stateCh: - req = active[pack.PeerId()] - reason = "delivered" - // Handle dropped peer connections: - case p := <-peerDrop: - req = active[p.id] - reason = "peerdrop" - // Handle timed-out requests: - case req = <-timeout: - reason = "timeout" - } - if req == nil { - continue - } - req.peer.log.Trace("State peer marked idle (spindown)", "req.items", int(req.nItems), "reason", reason) - req.timer.Stop() - delete(active, req.peer.id) - req.peer.SetNodeDataIdle(int(req.nItems), time.Now()) - } - // The 'finished' set contains deliveries that we were going to pass to processing. - // Those are now moot, but we still need to set those peers as idle, which would - // otherwise have been done after processing - for _, req := range finished { - req.peer.SetNodeDataIdle(int(req.nItems), time.Now()) - } -} - // stateSync schedules requests for downloading a particular state trie defined // by a given state root. type stateSync struct { - d *Downloader // Downloader instance to access and manage current peerset - - root common.Hash // State root currently being synced - sched *trie.Sync // State trie sync scheduler defining the tasks - keccak crypto.KeccakState // Keccak256 hasher to verify deliveries with - - trieTasks map[common.Hash]*trieTask // Set of trie node tasks currently queued for retrieval - codeTasks map[common.Hash]*codeTask // Set of byte code tasks currently queued for retrieval + d *Downloader // Downloader instance to access and manage current peerset + root common.Hash // State root currently being synced - numUncommitted int - bytesUncommitted int - - started chan struct{} // Started is signalled once the sync loop starts - - deliver chan *stateReq // Delivery channel multiplexing peer responses - cancel chan struct{} // Channel to signal a termination request - cancelOnce sync.Once // Ensures cancel only ever gets called once - done chan struct{} // Channel to signal termination completion - err error // Any error hit during sync (set before completion) -} - -// trieTask represents a single trie node download task, containing a set of -// peers already attempted retrieval from to detect stalled syncs and abort. -type trieTask struct { - path [][]byte - attempts map[string]struct{} -} - -// codeTask represents a single byte code download task, containing a set of -// peers already attempted retrieval from to detect stalled syncs and abort. -type codeTask struct { - attempts map[string]struct{} + started chan struct{} // Started is signalled once the sync loop starts + cancel chan struct{} // Channel to signal a termination request + cancelOnce sync.Once // Ensures cancel only ever gets called once + done chan struct{} // Channel to signal termination completion + err error // Any error hit during sync (set before completion) } // newStateSync creates a new state trie download scheduler. This method does not // yet start the sync. The user needs to call run to initiate. func newStateSync(d *Downloader, root common.Hash) *stateSync { return &stateSync{ - d: d, - root: root, - sched: state.NewStateSync(root, d.stateDB, d.stateBloom, nil), - keccak: sha3.NewLegacyKeccak256().(crypto.KeccakState), - trieTasks: make(map[common.Hash]*trieTask), - codeTasks: make(map[common.Hash]*codeTask), - deliver: make(chan *stateReq), - cancel: make(chan struct{}), - done: make(chan struct{}), - started: make(chan struct{}), + d: d, + root: root, + cancel: make(chan struct{}), + done: make(chan struct{}), + started: make(chan struct{}), } } @@ -314,11 +104,7 @@ func newStateSync(d *Downloader, root common.Hash) *stateSync { // finish. func (s *stateSync) run() { close(s.started) - if s.d.snapSync { - s.err = s.d.SnapSyncer.Sync(s.root, s.cancel) - } else { - s.err = s.loop() - } + s.err = s.d.SnapSyncer.Sync(s.root, s.cancel) close(s.done) } @@ -335,281 +121,3 @@ func (s *stateSync) Cancel() error { }) return s.Wait() } - -// loop is the main event loop of a state trie sync. It it responsible for the -// assignment of new tasks to peers (including sending it to them) as well as -// for the processing of inbound data. Note, that the loop does not directly -// receive data from peers, rather those are buffered up in the downloader and -// pushed here async. The reason is to decouple processing from data receipt -// and timeouts. -func (s *stateSync) loop() (err error) { - // Listen for new peer events to assign tasks to them - newPeer := make(chan *peerConnection, 1024) - peerSub := s.d.peers.SubscribeNewPeers(newPeer) - defer peerSub.Unsubscribe() - defer func() { - cerr := s.commit(true) - if err == nil { - err = cerr - } - }() - - // Keep assigning new tasks until the sync completes or aborts - for s.sched.Pending() > 0 { - if err = s.commit(false); err != nil { - return err - } - s.assignTasks() - // Tasks assigned, wait for something to happen - select { - case <-newPeer: - // New peer arrived, try to assign it download tasks - - case <-s.cancel: - return errCancelStateFetch - - case <-s.d.cancelCh: - return errCanceled - - case req := <-s.deliver: - // Response, disconnect or timeout triggered, drop the peer if stalling - log.Trace("Received node data response", "peer", req.peer.id, "count", len(req.response), "dropped", req.dropped, "timeout", !req.dropped && req.timedOut()) - if req.nItems <= 2 && !req.dropped && req.timedOut() { - // 2 items are the minimum requested, if even that times out, we've no use of - // this peer at the moment. - log.Warn("Stalling state sync, dropping peer", "peer", req.peer.id) - if s.d.dropPeer == nil { - // The dropPeer method is nil when `--copydb` is used for a local copy. - // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored - req.peer.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", req.peer.id) - } else { - s.d.dropPeer(req.peer.id) - - // If this peer was the master peer, abort sync immediately - s.d.cancelLock.RLock() - master := req.peer.id == s.d.cancelPeer - s.d.cancelLock.RUnlock() - - if master { - s.d.cancel() - return errTimeout - } - } - } - // Process all the received blobs and check for stale delivery - delivered, err := s.process(req) - req.peer.SetNodeDataIdle(delivered, req.delivered) - if err != nil { - log.Warn("Node data write error", "err", err) - return err - } - } - } - return nil -} - -func (s *stateSync) commit(force bool) error { - if !force && s.bytesUncommitted < ethdb.IdealBatchSize { - return nil - } - start := time.Now() - b := s.d.stateDB.NewBatch() - if err := s.sched.Commit(b); err != nil { - return err - } - if err := b.Write(); err != nil { - return fmt.Errorf("DB write error: %v", err) - } - s.updateStats(s.numUncommitted, 0, 0, time.Since(start)) - s.numUncommitted = 0 - s.bytesUncommitted = 0 - return nil -} - -// assignTasks attempts to assign new tasks to all idle peers, either from the -// batch currently being retried, or fetching new data from the trie sync itself. -func (s *stateSync) assignTasks() { - // Iterate over all idle peers and try to assign them state fetches - peers, _ := s.d.peers.NodeDataIdlePeers() - for _, p := range peers { - // Assign a batch of fetches proportional to the estimated latency/bandwidth - cap := p.NodeDataCapacity(s.d.peers.rates.TargetRoundTrip()) - req := &stateReq{peer: p, timeout: s.d.peers.rates.TargetTimeout()} - - nodes, _, codes := s.fillTasks(cap, req) - - // If the peer was assigned tasks to fetch, send the network request - if len(nodes)+len(codes) > 0 { - req.peer.log.Trace("Requesting batch of state data", "nodes", len(nodes), "codes", len(codes), "root", s.root) - select { - case s.d.trackStateReq <- req: - req.peer.FetchNodeData(append(nodes, codes...)) // Unified retrieval under eth/6x - case <-s.cancel: - case <-s.d.cancelCh: - } - } - } -} - -// fillTasks fills the given request object with a maximum of n state download -// tasks to send to the remote peer. -func (s *stateSync) fillTasks(n int, req *stateReq) (nodes []common.Hash, paths []trie.SyncPath, codes []common.Hash) { - // Refill available tasks from the scheduler. - if fill := n - (len(s.trieTasks) + len(s.codeTasks)); fill > 0 { - nodes, paths, codes := s.sched.Missing(fill) - for i, hash := range nodes { - s.trieTasks[hash] = &trieTask{ - path: paths[i], - attempts: make(map[string]struct{}), - } - } - for _, hash := range codes { - s.codeTasks[hash] = &codeTask{ - attempts: make(map[string]struct{}), - } - } - } - // Find tasks that haven't been tried with the request's peer. Prefer code - // over trie nodes as those can be written to disk and forgotten about. - nodes = make([]common.Hash, 0, n) - paths = make([]trie.SyncPath, 0, n) - codes = make([]common.Hash, 0, n) - - req.trieTasks = make(map[common.Hash]*trieTask, n) - req.codeTasks = make(map[common.Hash]*codeTask, n) - - for hash, t := range s.codeTasks { - // Stop when we've gathered enough requests - if len(nodes)+len(codes) == n { - break - } - // Skip any requests we've already tried from this peer - if _, ok := t.attempts[req.peer.id]; ok { - continue - } - // Assign the request to this peer - t.attempts[req.peer.id] = struct{}{} - codes = append(codes, hash) - req.codeTasks[hash] = t - delete(s.codeTasks, hash) - } - for hash, t := range s.trieTasks { - // Stop when we've gathered enough requests - if len(nodes)+len(codes) == n { - break - } - // Skip any requests we've already tried from this peer - if _, ok := t.attempts[req.peer.id]; ok { - continue - } - // Assign the request to this peer - t.attempts[req.peer.id] = struct{}{} - - nodes = append(nodes, hash) - paths = append(paths, t.path) - - req.trieTasks[hash] = t - delete(s.trieTasks, hash) - } - req.nItems = uint16(len(nodes) + len(codes)) - return nodes, paths, codes -} - -// process iterates over a batch of delivered state data, injecting each item -// into a running state sync, re-queuing any items that were requested but not -// delivered. Returns whether the peer actually managed to deliver anything of -// value, and any error that occurred. -func (s *stateSync) process(req *stateReq) (int, error) { - // Collect processing stats and update progress if valid data was received - duplicate, unexpected, successful := 0, 0, 0 - - defer func(start time.Time) { - if duplicate > 0 || unexpected > 0 { - s.updateStats(0, duplicate, unexpected, time.Since(start)) - } - }(time.Now()) - - // Iterate over all the delivered data and inject one-by-one into the trie - for _, blob := range req.response { - hash, err := s.processNodeData(blob) - switch err { - case nil: - s.numUncommitted++ - s.bytesUncommitted += len(blob) - successful++ - case trie.ErrNotRequested: - unexpected++ - case trie.ErrAlreadyProcessed: - duplicate++ - default: - return successful, fmt.Errorf("invalid state node %s: %v", hash.TerminalString(), err) - } - // Delete from both queues (one delivery is enough for the syncer) - delete(req.trieTasks, hash) - delete(req.codeTasks, hash) - } - // Put unfulfilled tasks back into the retry queue - npeers := s.d.peers.Len() - for hash, task := range req.trieTasks { - // If the node did deliver something, missing items may be due to a protocol - // limit or a previous timeout + delayed delivery. Both cases should permit - // the node to retry the missing items (to avoid single-peer stalls). - if len(req.response) > 0 || req.timedOut() { - delete(task.attempts, req.peer.id) - } - // If we've requested the node too many times already, it may be a malicious - // sync where nobody has the right data. Abort. - if len(task.attempts) >= npeers { - return successful, fmt.Errorf("trie node %s failed with all peers (%d tries, %d peers)", hash.TerminalString(), len(task.attempts), npeers) - } - // Missing item, place into the retry queue. - s.trieTasks[hash] = task - } - for hash, task := range req.codeTasks { - // If the node did deliver something, missing items may be due to a protocol - // limit or a previous timeout + delayed delivery. Both cases should permit - // the node to retry the missing items (to avoid single-peer stalls). - if len(req.response) > 0 || req.timedOut() { - delete(task.attempts, req.peer.id) - } - // If we've requested the node too many times already, it may be a malicious - // sync where nobody has the right data. Abort. - if len(task.attempts) >= npeers { - return successful, fmt.Errorf("byte code %s failed with all peers (%d tries, %d peers)", hash.TerminalString(), len(task.attempts), npeers) - } - // Missing item, place into the retry queue. - s.codeTasks[hash] = task - } - return successful, nil -} - -// processNodeData tries to inject a trie node data blob delivered from a remote -// peer into the state trie, returning whether anything useful was written or any -// error occurred. -func (s *stateSync) processNodeData(blob []byte) (common.Hash, error) { - res := trie.SyncResult{Data: blob} - s.keccak.Reset() - s.keccak.Write(blob) - s.keccak.Read(res.Hash[:]) - err := s.sched.Process(res) - return res.Hash, err -} - -// updateStats bumps the various state sync progress counters and displays a log -// message for the user to see. -func (s *stateSync) updateStats(written, duplicate, unexpected int, duration time.Duration) { - s.d.syncStatsLock.Lock() - defer s.d.syncStatsLock.Unlock() - - s.d.syncStatsState.pending = uint64(s.sched.Pending()) - s.d.syncStatsState.processed += uint64(written) - s.d.syncStatsState.duplicate += uint64(duplicate) - s.d.syncStatsState.unexpected += uint64(unexpected) - - if written > 0 || duplicate > 0 || unexpected > 0 { - log.Info("Imported new state entries", "count", written, "elapsed", common.PrettyDuration(duration), "processed", s.d.syncStatsState.processed, "pending", s.d.syncStatsState.pending, "trieretry", len(s.trieTasks), "coderetry", len(s.codeTasks), "duplicate", s.d.syncStatsState.duplicate, "unexpected", s.d.syncStatsState.unexpected) - } - if written > 0 { - rawdb.WriteFastTrieProgress(s.d.stateDB, s.d.syncStatsState.processed) - } -} diff --git a/eth/downloader/testchain_test.go b/eth/downloader/testchain_test.go index b9865f7e03..8b873343ca 100644 --- a/eth/downloader/testchain_test.go +++ b/eth/downloader/testchain_test.go @@ -20,12 +20,14 @@ import ( "fmt" "math/big" "sync" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "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/params" ) @@ -39,73 +41,110 @@ var ( ) // The common prefix of all test chains: -var testChainBase = newTestChain(blockCacheMaxItems+200, testGenesis) +var testChainBase *testChain // Different forks on top of the base chain: var testChainForkLightA, testChainForkLightB, testChainForkHeavy *testChain +var pregenerated bool + func init() { + // Reduce some of the parameters to make the tester faster + fullMaxForkAncestry = 10000 + lightMaxForkAncestry = 10000 + blockCacheMaxItems = 1024 + fsHeaderSafetyNet = 256 + fsHeaderContCheck = 500 * time.Millisecond + + testChainBase = newTestChain(blockCacheMaxItems+200, testGenesis) + var forkLen = int(fullMaxForkAncestry + 50) var wg sync.WaitGroup + + // Generate the test chains to seed the peers with wg.Add(3) go func() { testChainForkLightA = testChainBase.makeFork(forkLen, false, 1); wg.Done() }() go func() { testChainForkLightB = testChainBase.makeFork(forkLen, false, 2); wg.Done() }() go func() { testChainForkHeavy = testChainBase.makeFork(forkLen, true, 3); wg.Done() }() wg.Wait() + + // Generate the test peers used by the tests to avoid overloading during testing. + // These seemingly random chains are used in various downloader tests. We're just + // pre-generating them here. + chains := []*testChain{ + testChainBase, + testChainForkLightA, + testChainForkLightB, + testChainForkHeavy, + testChainBase.shorten(1), + testChainBase.shorten(blockCacheMaxItems - 15), + testChainBase.shorten((blockCacheMaxItems - 15) / 2), + testChainBase.shorten(blockCacheMaxItems - 15 - 5), + testChainBase.shorten(MaxHeaderFetch), + testChainBase.shorten(800), + testChainBase.shorten(800 / 2), + testChainBase.shorten(800 / 3), + testChainBase.shorten(800 / 4), + testChainBase.shorten(800 / 5), + testChainBase.shorten(800 / 6), + testChainBase.shorten(800 / 7), + testChainBase.shorten(800 / 8), + testChainBase.shorten(3*fsHeaderSafetyNet + 256 + fsMinFullBlocks), + testChainBase.shorten(fsMinFullBlocks + 256 - 1), + testChainForkLightA.shorten(len(testChainBase.blocks) + 80), + testChainForkLightB.shorten(len(testChainBase.blocks) + 81), + testChainForkLightA.shorten(len(testChainBase.blocks) + MaxHeaderFetch), + testChainForkLightB.shorten(len(testChainBase.blocks) + MaxHeaderFetch), + testChainForkHeavy.shorten(len(testChainBase.blocks) + 79), + } + wg.Add(len(chains)) + for _, chain := range chains { + go func(blocks []*types.Block) { + newTestBlockchain(blocks) + wg.Done() + }(chain.blocks[1:]) + } + wg.Wait() + + // Mark the chains pregenerated. Generating a new one will lead to a panic. + pregenerated = true } type testChain struct { - genesis *types.Block - chain []common.Hash - headerm map[common.Hash]*types.Header - blockm map[common.Hash]*types.Block - receiptm map[common.Hash][]*types.Receipt - tdm map[common.Hash]*big.Int + blocks []*types.Block } // newTestChain creates a blockchain of the given length. func newTestChain(length int, genesis *types.Block) *testChain { - tc := new(testChain).copy(length) - tc.genesis = genesis - tc.chain = append(tc.chain, genesis.Hash()) - tc.headerm[tc.genesis.Hash()] = tc.genesis.Header() - tc.tdm[tc.genesis.Hash()] = tc.genesis.Difficulty() - tc.blockm[tc.genesis.Hash()] = tc.genesis + tc := &testChain{ + blocks: []*types.Block{genesis}, + } tc.generate(length-1, 0, genesis, false) return tc } // makeFork creates a fork on top of the test chain. func (tc *testChain) makeFork(length int, heavy bool, seed byte) *testChain { - fork := tc.copy(tc.len() + length) - fork.generate(length, seed, tc.headBlock(), heavy) + fork := tc.copy(len(tc.blocks) + length) + fork.generate(length, seed, tc.blocks[len(tc.blocks)-1], heavy) return fork } // shorten creates a copy of the chain with the given length. It panics if the // length is longer than the number of available blocks. func (tc *testChain) shorten(length int) *testChain { - if length > tc.len() { - panic(fmt.Errorf("can't shorten test chain to %d blocks, it's only %d blocks long", length, tc.len())) + if length > len(tc.blocks) { + panic(fmt.Errorf("can't shorten test chain to %d blocks, it's only %d blocks long", length, len(tc.blocks))) } return tc.copy(length) } func (tc *testChain) copy(newlen int) *testChain { - cpy := &testChain{ - genesis: tc.genesis, - headerm: make(map[common.Hash]*types.Header, newlen), - blockm: make(map[common.Hash]*types.Block, newlen), - receiptm: make(map[common.Hash][]*types.Receipt, newlen), - tdm: make(map[common.Hash]*big.Int, newlen), + if newlen > len(tc.blocks) { + newlen = len(tc.blocks) } - for i := 0; i < len(tc.chain) && i < newlen; i++ { - hash := tc.chain[i] - cpy.chain = append(cpy.chain, tc.chain[i]) - cpy.tdm[hash] = tc.tdm[hash] - cpy.blockm[hash] = tc.blockm[hash] - cpy.headerm[hash] = tc.headerm[hash] - cpy.receiptm[hash] = tc.receiptm[hash] + cpy := &testChain{ + blocks: append([]*types.Block{}, tc.blocks[:newlen]...), } return cpy } @@ -115,17 +154,14 @@ func (tc *testChain) copy(newlen int) *testChain { // contains a transaction and every 5th an uncle to allow testing correct block // reassembly. func (tc *testChain) generate(n int, seed byte, parent *types.Block, heavy bool) { - // start := time.Now() - // defer func() { fmt.Printf("test chain generated in %v\n", time.Since(start)) }() - - blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), testDB, n, func(i int, block *core.BlockGen) { + blocks, _ := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), testDB, n, func(i int, block *core.BlockGen) { block.SetCoinbase(common.Address{seed}) // If a heavy chain is requested, delay blocks to raise difficulty if heavy { - block.OffsetTime(-1) + block.OffsetTime(-9) } // Include transactions to the miner to make blocks more interesting. - if parent == tc.genesis && i%22 == 0 { + if parent == tc.blocks[0] && i%22 == 0 { signer := types.MakeSigner(params.TestChainConfig, block.Number()) tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), params.TxGas, block.BaseFee(), nil), signer, testKey) if err != nil { @@ -136,95 +172,56 @@ func (tc *testChain) generate(n int, seed byte, parent *types.Block, heavy bool) // if the block number is a multiple of 5, add a bonus uncle to the block if i > 0 && i%5 == 0 { block.AddUncle(&types.Header{ - ParentHash: block.PrevBlock(i - 1).Hash(), + ParentHash: block.PrevBlock(i - 2).Hash(), Number: big.NewInt(block.Number().Int64() - 1), }) } }) - - // Convert the block-chain into a hash-chain and header/block maps - td := new(big.Int).Set(tc.td(parent.Hash())) - for i, b := range blocks { - td := td.Add(td, b.Difficulty()) - hash := b.Hash() - tc.chain = append(tc.chain, hash) - tc.blockm[hash] = b - tc.headerm[hash] = b.Header() - tc.receiptm[hash] = receipts[i] - tc.tdm[hash] = new(big.Int).Set(td) - } -} - -// len returns the total number of blocks in the chain. -func (tc *testChain) len() int { - return len(tc.chain) -} - -// headBlock returns the head of the chain. -func (tc *testChain) headBlock() *types.Block { - return tc.blockm[tc.chain[len(tc.chain)-1]] + tc.blocks = append(tc.blocks, blocks...) } -// td returns the total difficulty of the given block. -func (tc *testChain) td(hash common.Hash) *big.Int { - return tc.tdm[hash] -} +var ( + testBlockchains = make(map[common.Hash]*testBlockchain) + testBlockchainsLock sync.Mutex +) -// headersByHash returns headers in order from the given hash. -func (tc *testChain) headersByHash(origin common.Hash, amount int, skip int, reverse bool) []*types.Header { - num, _ := tc.hashToNumber(origin) - return tc.headersByNumber(num, amount, skip, reverse) +type testBlockchain struct { + chain *core.BlockChain + gen sync.Once } -// headersByNumber returns headers from the given number. -func (tc *testChain) headersByNumber(origin uint64, amount int, skip int, reverse bool) []*types.Header { - result := make([]*types.Header, 0, amount) - - if !reverse { - for num := origin; num < uint64(len(tc.chain)) && len(result) < amount; num += uint64(skip) + 1 { - if header, ok := tc.headerm[tc.chain[int(num)]]; ok { - result = append(result, header) - } - } - } else { - for num := int64(origin); num >= 0 && len(result) < amount; num -= int64(skip) + 1 { - if header, ok := tc.headerm[tc.chain[int(num)]]; ok { - result = append(result, header) - } - } +// newTestBlockchain creates a blockchain database built by running the given blocks, +// either actually running them, or reusing a previously created one. The returned +// chains are *shared*, so *do not* mutate them. +func newTestBlockchain(blocks []*types.Block) *core.BlockChain { + // Retrieve an existing database, or create a new one + head := testGenesis.Hash() + if len(blocks) > 0 { + head = blocks[len(blocks)-1].Hash() } - return result -} - -// receipts returns the receipts of the given block hashes. -func (tc *testChain) receipts(hashes []common.Hash) [][]*types.Receipt { - results := make([][]*types.Receipt, 0, len(hashes)) - for _, hash := range hashes { - if receipt, ok := tc.receiptm[hash]; ok { - results = append(results, receipt) - } + testBlockchainsLock.Lock() + if _, ok := testBlockchains[head]; !ok { + testBlockchains[head] = new(testBlockchain) } - return results -} + tbc := testBlockchains[head] + testBlockchainsLock.Unlock() -// bodies returns the block bodies of the given block hashes. -func (tc *testChain) bodies(hashes []common.Hash) ([][]*types.Transaction, [][]*types.Header) { - transactions := make([][]*types.Transaction, 0, len(hashes)) - uncles := make([][]*types.Header, 0, len(hashes)) - for _, hash := range hashes { - if block, ok := tc.blockm[hash]; ok { - transactions = append(transactions, block.Transactions()) - uncles = append(uncles, block.Uncles()) + // Ensure that the database is generated + tbc.gen.Do(func() { + if pregenerated { + panic("Requested chain generation outside of init") } - } - return transactions, uncles -} + db := rawdb.NewMemoryDatabase() + core.GenesisBlockForTesting(db, testAddress, big.NewInt(1000000000000000)) -func (tc *testChain) hashToNumber(target common.Hash) (uint64, bool) { - for num, hash := range tc.chain { - if hash == target { - return uint64(num), true + chain, err := core.NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil) + if err != nil { + panic(err) } - } - return 0, false + if n, err := chain.InsertChain(blocks); err != nil { + panic(fmt.Sprintf("block %d: %v", n, err)) + } + tbc.chain = chain + }) + return tbc.chain } diff --git a/eth/downloader/types.go b/eth/downloader/types.go deleted file mode 100644 index ff70bfa0e3..0000000000 --- a/eth/downloader/types.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2015 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 . - -package downloader - -import ( - "fmt" - - "github.com/ethereum/go-ethereum/core/types" -) - -// peerDropFn is a callback type for dropping a peer detected as malicious. -type peerDropFn func(id string) - -// dataPack is a data message returned by a peer for some query. -type dataPack interface { - PeerId() string - Items() int - Stats() string -} - -// headerPack is a batch of block headers returned by a peer. -type headerPack struct { - peerID string - headers []*types.Header -} - -func (p *headerPack) PeerId() string { return p.peerID } -func (p *headerPack) Items() int { return len(p.headers) } -func (p *headerPack) Stats() string { return fmt.Sprintf("%d", len(p.headers)) } - -// bodyPack is a batch of block bodies returned by a peer. -type bodyPack struct { - peerID string - transactions [][]*types.Transaction - uncles [][]*types.Header -} - -func (p *bodyPack) PeerId() string { return p.peerID } -func (p *bodyPack) Items() int { - if len(p.transactions) <= len(p.uncles) { - return len(p.transactions) - } - return len(p.uncles) -} -func (p *bodyPack) Stats() string { return fmt.Sprintf("%d:%d", len(p.transactions), len(p.uncles)) } - -// receiptPack is a batch of receipts returned by a peer. -type receiptPack struct { - peerID string - receipts [][]*types.Receipt -} - -func (p *receiptPack) PeerId() string { return p.peerID } -func (p *receiptPack) Items() int { return len(p.receipts) } -func (p *receiptPack) Stats() string { return fmt.Sprintf("%d", len(p.receipts)) } - -// statePack is a batch of states returned by a peer. -type statePack struct { - peerID string - states [][]byte -} - -func (p *statePack) PeerId() string { return p.peerID } -func (p *statePack) Items() int { return len(p.states) } -func (p *statePack) Stats() string { return fmt.Sprintf("%d", len(p.states)) } diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index de39d7a13a..18f63b8052 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -210,12 +210,14 @@ type Config struct { // No heimdall service WithoutHeimdall bool - // Berlin block override (TODO: remove after the fork) - OverrideBerlin *big.Int `toml:",omitempty"` - OverrideLondon *big.Int `toml:",omitempty"` - // Bor logs flag BorLogs bool + + // Arrow Glacier block override (TODO: remove after the fork) + OverrideArrowGlacier *big.Int `toml:",omitempty"` + + // OverrideTerminalTotalDifficulty (TODO: remove after the fork) + OverrideTerminalTotalDifficulty *big.Int `toml:",omitempty"` } // CreateConsensusEngine creates a consensus engine for the given chain configuration. @@ -225,8 +227,31 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et noverify := ethConfig.Miner.Noverify // If proof-of-authority is requested, set it up + var engine consensus.Engine if chainConfig.Clique != nil { - return clique.New(chainConfig.Clique, db) + engine = clique.New(chainConfig.Clique, db) + } else { + switch config.PowMode { + case ethash.ModeFake: + log.Warn("Ethash used in fake mode") + case ethash.ModeTest: + log.Warn("Ethash used in test mode") + case ethash.ModeShared: + log.Warn("Ethash used in shared mode") + } + engine = ethash.New(ethash.Config{ + PowMode: config.PowMode, + CacheDir: stack.ResolvePath(config.CacheDir), + CachesInMem: config.CachesInMem, + CachesOnDisk: config.CachesOnDisk, + CachesLockMmap: config.CachesLockMmap, + DatasetDir: config.DatasetDir, + DatasetsInMem: config.DatasetsInMem, + DatasetsOnDisk: config.DatasetsOnDisk, + DatasetsLockMmap: config.DatasetsLockMmap, + NotifyFull: config.NotifyFull, + }, notify, noverify) + engine.(*ethash.Ethash).SetThreads(-1) // Disable CPU mining } // If Matic bor consensus is requested, set it up if chainConfig.Bor != nil { @@ -241,7 +266,7 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et case ethash.ModeShared: log.Warn("Ethash used in shared mode") } - engine := ethash.New(ethash.Config{ + engine = ethash.New(ethash.Config{ PowMode: config.PowMode, CacheDir: stack.ResolvePath(config.CacheDir), CachesInMem: config.CachesInMem, @@ -253,6 +278,7 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et DatasetsLockMmap: config.DatasetsLockMmap, NotifyFull: config.NotifyFull, }, notify, noverify) - engine.SetThreads(-1) // Disable CPU mining + // TODO - Check this + // engine.SetThreads(-1) // Disable CPU mining return engine } diff --git a/eth/ethconfig/gen_config.go b/eth/ethconfig/gen_config.go index ed4c928508..70a9649bff 100644 --- a/eth/ethconfig/gen_config.go +++ b/eth/ethconfig/gen_config.go @@ -18,48 +18,49 @@ import ( // MarshalTOML marshals as TOML. func (c Config) MarshalTOML() (interface{}, error) { type Config struct { - Genesis *core.Genesis `toml:",omitempty"` - NetworkId uint64 - SyncMode downloader.SyncMode - EthDiscoveryURLs []string - SnapDiscoveryURLs []string - NoPruning bool - NoPrefetch bool - TxLookupLimit uint64 `toml:",omitempty"` - Whitelist map[uint64]common.Hash `toml:"-"` - LightServ int `toml:",omitempty"` - LightIngress int `toml:",omitempty"` - LightEgress int `toml:",omitempty"` - LightPeers int `toml:",omitempty"` - LightNoPrune bool `toml:",omitempty"` - LightNoSyncServe bool `toml:",omitempty"` - SyncFromCheckpoint bool `toml:",omitempty"` - UltraLightServers []string `toml:",omitempty"` - UltraLightFraction int `toml:",omitempty"` - UltraLightOnlyAnnounce bool `toml:",omitempty"` - SkipBcVersionCheck bool `toml:"-"` - DatabaseHandles int `toml:"-"` - DatabaseCache int - DatabaseFreezer string - TrieCleanCache int - TrieCleanCacheJournal string `toml:",omitempty"` - TrieCleanCacheRejournal time.Duration `toml:",omitempty"` - TrieDirtyCache int - TrieTimeout time.Duration - SnapshotCache int - Preimages bool - Miner miner.Config - Ethash ethash.Config - TxPool core.TxPoolConfig - GPO gasprice.Config - EnablePreimageRecording bool - DocRoot string `toml:"-"` - RPCGasCap uint64 - RPCEVMTimeout time.Duration - RPCTxFeeCap float64 - Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` - CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` - OverrideLondon *big.Int `toml:",omitempty"` + Genesis *core.Genesis `toml:",omitempty"` + NetworkId uint64 + SyncMode downloader.SyncMode + EthDiscoveryURLs []string + SnapDiscoveryURLs []string + NoPruning bool + NoPrefetch bool + TxLookupLimit uint64 `toml:",omitempty"` + Whitelist map[uint64]common.Hash `toml:"-"` + LightServ int `toml:",omitempty"` + LightIngress int `toml:",omitempty"` + LightEgress int `toml:",omitempty"` + LightPeers int `toml:",omitempty"` + LightNoPrune bool `toml:",omitempty"` + LightNoSyncServe bool `toml:",omitempty"` + SyncFromCheckpoint bool `toml:",omitempty"` + UltraLightServers []string `toml:",omitempty"` + UltraLightFraction int `toml:",omitempty"` + UltraLightOnlyAnnounce bool `toml:",omitempty"` + SkipBcVersionCheck bool `toml:"-"` + DatabaseHandles int `toml:"-"` + DatabaseCache int + DatabaseFreezer string + TrieCleanCache int + TrieCleanCacheJournal string `toml:",omitempty"` + TrieCleanCacheRejournal time.Duration `toml:",omitempty"` + TrieDirtyCache int + TrieTimeout time.Duration + SnapshotCache int + Preimages bool + Miner miner.Config + Ethash ethash.Config + TxPool core.TxPoolConfig + GPO gasprice.Config + EnablePreimageRecording bool + DocRoot string `toml:"-"` + RPCGasCap uint64 + RPCEVMTimeout time.Duration + RPCTxFeeCap float64 + Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` + CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` + OverrideArrowGlacier *big.Int `toml:",omitempty"` + OverrideTerminalTotalDifficulty *big.Int `toml:",omitempty"` } var enc Config enc.Genesis = c.Genesis @@ -103,55 +104,57 @@ func (c Config) MarshalTOML() (interface{}, error) { enc.RPCTxFeeCap = c.RPCTxFeeCap enc.Checkpoint = c.Checkpoint enc.CheckpointOracle = c.CheckpointOracle - enc.OverrideLondon = c.OverrideLondon + enc.OverrideArrowGlacier = c.OverrideArrowGlacier + enc.OverrideTerminalTotalDifficulty = c.OverrideTerminalTotalDifficulty return &enc, nil } // UnmarshalTOML unmarshals from TOML. func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { type Config struct { - Genesis *core.Genesis `toml:",omitempty"` - NetworkId *uint64 - SyncMode *downloader.SyncMode - EthDiscoveryURLs []string - SnapDiscoveryURLs []string - NoPruning *bool - NoPrefetch *bool - TxLookupLimit *uint64 `toml:",omitempty"` - Whitelist map[uint64]common.Hash `toml:"-"` - LightServ *int `toml:",omitempty"` - LightIngress *int `toml:",omitempty"` - LightEgress *int `toml:",omitempty"` - LightPeers *int `toml:",omitempty"` - LightNoPrune *bool `toml:",omitempty"` - LightNoSyncServe *bool `toml:",omitempty"` - SyncFromCheckpoint *bool `toml:",omitempty"` - UltraLightServers []string `toml:",omitempty"` - UltraLightFraction *int `toml:",omitempty"` - UltraLightOnlyAnnounce *bool `toml:",omitempty"` - SkipBcVersionCheck *bool `toml:"-"` - DatabaseHandles *int `toml:"-"` - DatabaseCache *int - DatabaseFreezer *string - TrieCleanCache *int - TrieCleanCacheJournal *string `toml:",omitempty"` - TrieCleanCacheRejournal *time.Duration `toml:",omitempty"` - TrieDirtyCache *int - TrieTimeout *time.Duration - SnapshotCache *int - Preimages *bool - Miner *miner.Config - Ethash *ethash.Config - TxPool *core.TxPoolConfig - GPO *gasprice.Config - EnablePreimageRecording *bool - DocRoot *string `toml:"-"` - RPCGasCap *uint64 - RPCEVMTimeout *time.Duration - RPCTxFeeCap *float64 - Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` - CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` - OverrideLondon *big.Int `toml:",omitempty"` + Genesis *core.Genesis `toml:",omitempty"` + NetworkId *uint64 + SyncMode *downloader.SyncMode + EthDiscoveryURLs []string + SnapDiscoveryURLs []string + NoPruning *bool + NoPrefetch *bool + TxLookupLimit *uint64 `toml:",omitempty"` + Whitelist map[uint64]common.Hash `toml:"-"` + LightServ *int `toml:",omitempty"` + LightIngress *int `toml:",omitempty"` + LightEgress *int `toml:",omitempty"` + LightPeers *int `toml:",omitempty"` + LightNoPrune *bool `toml:",omitempty"` + LightNoSyncServe *bool `toml:",omitempty"` + SyncFromCheckpoint *bool `toml:",omitempty"` + UltraLightServers []string `toml:",omitempty"` + UltraLightFraction *int `toml:",omitempty"` + UltraLightOnlyAnnounce *bool `toml:",omitempty"` + SkipBcVersionCheck *bool `toml:"-"` + DatabaseHandles *int `toml:"-"` + DatabaseCache *int + DatabaseFreezer *string + TrieCleanCache *int + TrieCleanCacheJournal *string `toml:",omitempty"` + TrieCleanCacheRejournal *time.Duration `toml:",omitempty"` + TrieDirtyCache *int + TrieTimeout *time.Duration + SnapshotCache *int + Preimages *bool + Miner *miner.Config + Ethash *ethash.Config + TxPool *core.TxPoolConfig + GPO *gasprice.Config + EnablePreimageRecording *bool + DocRoot *string `toml:"-"` + RPCGasCap *uint64 + RPCEVMTimeout *time.Duration + RPCTxFeeCap *float64 + Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` + CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` + OverrideArrowGlacier *big.Int `toml:",omitempty"` + OverrideTerminalTotalDifficulty *big.Int `toml:",omitempty"` } var dec Config if err := unmarshal(&dec); err != nil { @@ -280,8 +283,11 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.CheckpointOracle != nil { c.CheckpointOracle = dec.CheckpointOracle } - if dec.OverrideLondon != nil { - c.OverrideLondon = dec.OverrideLondon + if dec.OverrideArrowGlacier != nil { + c.OverrideArrowGlacier = dec.OverrideArrowGlacier + } + if dec.OverrideTerminalTotalDifficulty != nil { + c.OverrideTerminalTotalDifficulty = dec.OverrideTerminalTotalDifficulty } return nil } diff --git a/eth/fetcher/block_fetcher.go b/eth/fetcher/block_fetcher.go index 45983c97ce..247d0eac67 100644 --- a/eth/fetcher/block_fetcher.go +++ b/eth/fetcher/block_fetcher.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/common/prque" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/trie" @@ -74,10 +75,10 @@ type HeaderRetrievalFn func(common.Hash) *types.Header type blockRetrievalFn func(common.Hash) *types.Block // headerRequesterFn is a callback type for sending a header retrieval request. -type headerRequesterFn func(common.Hash) error +type headerRequesterFn func(common.Hash, chan *eth.Response) (*eth.Request, error) // bodyRequesterFn is a callback type for sending a body retrieval request. -type bodyRequesterFn func([]common.Hash) error +type bodyRequesterFn func([]common.Hash, chan *eth.Response) (*eth.Request, error) // headerVerifierFn is a callback type to verify a block's header for fast propagation. type headerVerifierFn func(header *types.Header) error @@ -391,13 +392,14 @@ func (f *BlockFetcher) loop() { blockAnnounceDOSMeter.Mark(1) break } + if notification.number == 0 { + break + } // If we have a valid block number, check that it's potentially useful - if notification.number > 0 { - if dist := int64(notification.number) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist { - log.Debug("Peer discarded announcement", "peer", notification.origin, "number", notification.number, "hash", notification.hash, "distance", dist) - blockAnnounceDropMeter.Mark(1) - break - } + if dist := int64(notification.number) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist { + log.Debug("Peer discarded announcement", "peer", notification.origin, "number", notification.number, "hash", notification.hash, "distance", dist) + blockAnnounceDropMeter.Mark(1) + break } // All is well, schedule the announce if block's not yet downloading if _, ok := f.fetching[notification.hash]; ok { @@ -460,15 +462,28 @@ func (f *BlockFetcher) loop() { // Create a closure of the fetch and schedule in on a new thread fetchHeader, hashes := f.fetching[hashes[0]].fetchHeader, hashes - go func() { + go func(peer string) { if f.fetchingHook != nil { f.fetchingHook(hashes) } for _, hash := range hashes { headerFetchMeter.Mark(1) - fetchHeader(hash) // Suboptimal, but protocol doesn't allow batch header retrievals + go func(hash common.Hash) { + resCh := make(chan *eth.Response) + + req, err := fetchHeader(hash, resCh) + if err != nil { + return // Legacy code, yolo + } + defer req.Close() + + res := <-resCh + res.Done <- nil + + f.FilterHeaders(peer, *res.Res.(*eth.BlockHeadersPacket), time.Now().Add(res.Time)) + }(hash) } - }() + }(peer) } // Schedule the next fetch if blocks are still pending f.rescheduleFetch(fetchTimer) @@ -496,8 +511,24 @@ func (f *BlockFetcher) loop() { if f.completingHook != nil { f.completingHook(hashes) } + fetchBodies := f.completing[hashes[0]].fetchBodies bodyFetchMeter.Mark(int64(len(hashes))) - go f.completing[hashes[0]].fetchBodies(hashes) + + go func(peer string, hashes []common.Hash) { + resCh := make(chan *eth.Response) + + req, err := fetchBodies(hashes, resCh) + if err != nil { + return // Legacy code, yolo + } + defer req.Close() + + res := <-resCh + res.Done <- nil + + txs, uncles := res.Res.(*eth.BlockBodiesPacket).Unpack() + f.FilterBodies(peer, txs, uncles, time.Now()) + }(peer, hashes) } // Schedule the next fetch if blocks are still pending f.rescheduleComplete(completeTimer) diff --git a/eth/fetcher/block_fetcher_test.go b/eth/fetcher/block_fetcher_test.go index b6d1125b56..628a565042 100644 --- a/eth/fetcher/block_fetcher_test.go +++ b/eth/fetcher/block_fetcher_test.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" ) @@ -60,8 +61,8 @@ func makeChain(n int, seed byte, parent *types.Block) ([]common.Hash, map[common block.AddTx(tx) } // If the block number is a multiple of 5, add a bonus uncle to the block - if i%5 == 0 { - block.AddUncle(&types.Header{ParentHash: block.PrevBlock(i - 1).Hash(), Number: big.NewInt(int64(i - 1))}) + if i > 0 && i%5 == 0 { + block.AddUncle(&types.Header{ParentHash: block.PrevBlock(i - 2).Hash(), Number: big.NewInt(int64(i - 1))}) } }) hashes := make([]common.Hash, n+1) @@ -195,16 +196,26 @@ func (f *fetcherTester) makeHeaderFetcher(peer string, blocks map[common.Hash]*t closure[hash] = block } // Create a function that return a header from the closure - return func(hash common.Hash) error { + return func(hash common.Hash, sink chan *eth.Response) (*eth.Request, error) { // Gather the blocks to return headers := make([]*types.Header, 0, 1) if block, ok := closure[hash]; ok { headers = append(headers, block.Header()) } // Return on a new thread - go f.fetcher.FilterHeaders(peer, headers, time.Now().Add(drift)) - - return nil + req := ð.Request{ + Peer: peer, + } + res := ð.Response{ + Req: req, + Res: (*eth.BlockHeadersPacket)(&headers), + Time: drift, + Done: make(chan error, 1), // Ignore the returned status + } + go func() { + sink <- res + }() + return req, nil } } @@ -215,7 +226,7 @@ func (f *fetcherTester) makeBodyFetcher(peer string, blocks map[common.Hash]*typ closure[hash] = block } // Create a function that returns blocks from the closure - return func(hashes []common.Hash) error { + return func(hashes []common.Hash, sink chan *eth.Response) (*eth.Request, error) { // Gather the block bodies to return transactions := make([][]*types.Transaction, 0, len(hashes)) uncles := make([][]*types.Header, 0, len(hashes)) @@ -227,14 +238,33 @@ func (f *fetcherTester) makeBodyFetcher(peer string, blocks map[common.Hash]*typ } } // Return on a new thread - go f.fetcher.FilterBodies(peer, transactions, uncles, time.Now().Add(drift)) - - return nil + bodies := make([]*eth.BlockBody, len(transactions)) + for i, txs := range transactions { + bodies[i] = ð.BlockBody{ + Transactions: txs, + Uncles: uncles[i], + } + } + req := ð.Request{ + Peer: peer, + } + res := ð.Response{ + Req: req, + Res: (*eth.BlockBodiesPacket)(&bodies), + Time: drift, + Done: make(chan error, 1), // Ignore the returned status + } + go func() { + sink <- res + }() + return req, nil } } // verifyFetchingEvent verifies that one single event arrive on a fetching channel. func verifyFetchingEvent(t *testing.T, fetching chan []common.Hash, arrive bool) { + t.Helper() + if arrive { select { case <-fetching: @@ -252,6 +282,8 @@ func verifyFetchingEvent(t *testing.T, fetching chan []common.Hash, arrive bool) // verifyCompletingEvent verifies that one single event arrive on an completing channel. func verifyCompletingEvent(t *testing.T, completing chan []common.Hash, arrive bool) { + t.Helper() + if arrive { select { case <-completing: @@ -269,6 +301,8 @@ func verifyCompletingEvent(t *testing.T, completing chan []common.Hash, arrive b // verifyImportEvent verifies that one single event arrive on an import channel. func verifyImportEvent(t *testing.T, imported chan interface{}, arrive bool) { + t.Helper() + if arrive { select { case <-imported: @@ -287,6 +321,8 @@ func verifyImportEvent(t *testing.T, imported chan interface{}, arrive bool) { // verifyImportCount verifies that exactly count number of events arrive on an // import hook channel. func verifyImportCount(t *testing.T, imported chan interface{}, count int) { + t.Helper() + for i := 0; i < count; i++ { select { case <-imported: @@ -299,6 +335,8 @@ func verifyImportCount(t *testing.T, imported chan interface{}, count int) { // verifyImportDone verifies that no more events are arriving on an import channel. func verifyImportDone(t *testing.T, imported chan interface{}) { + t.Helper() + select { case <-imported: t.Fatalf("extra block imported") @@ -308,6 +346,8 @@ func verifyImportDone(t *testing.T, imported chan interface{}) { // verifyChainHeight verifies the chain height is as expected. func verifyChainHeight(t *testing.T, fetcher *fetcherTester, height uint64) { + t.Helper() + if fetcher.chainHeight() != height { t.Fatalf("chain height mismatch, got %d, want %d", fetcher.chainHeight(), height) } @@ -368,13 +408,13 @@ func testConcurrentAnnouncements(t *testing.T, light bool) { secondBodyFetcher := tester.makeBodyFetcher("second", blocks, 0) counter := uint32(0) - firstHeaderWrapper := func(hash common.Hash) error { + firstHeaderWrapper := func(hash common.Hash, sink chan *eth.Response) (*eth.Request, error) { atomic.AddUint32(&counter, 1) - return firstHeaderFetcher(hash) + return firstHeaderFetcher(hash, sink) } - secondHeaderWrapper := func(hash common.Hash) error { + secondHeaderWrapper := func(hash common.Hash, sink chan *eth.Response) (*eth.Request, error) { atomic.AddUint32(&counter, 1) - return secondHeaderFetcher(hash) + return secondHeaderFetcher(hash, sink) } // Iteratively announce blocks until all are imported imported := make(chan interface{}) @@ -468,15 +508,20 @@ func testPendingDeduplication(t *testing.T, light bool) { delay := 50 * time.Millisecond counter := uint32(0) - headerWrapper := func(hash common.Hash) error { + headerWrapper := func(hash common.Hash, sink chan *eth.Response) (*eth.Request, error) { atomic.AddUint32(&counter, 1) // Simulate a long running fetch - go func() { - time.Sleep(delay) - headerFetcher(hash) - }() - return nil + resink := make(chan *eth.Response) + req, err := headerFetcher(hash, resink) + if err == nil { + go func() { + res := <-resink + time.Sleep(delay) + sink <- res + }() + } + return req, err } checkNonExist := func() bool { return tester.getBlock(hashes[0]) == nil diff --git a/eth/fetcher/tx_fetcher.go b/eth/fetcher/tx_fetcher.go index 3ba7753916..b10c0db9ee 100644 --- a/eth/fetcher/tx_fetcher.go +++ b/eth/fetcher/tx_fetcher.go @@ -18,6 +18,7 @@ package fetcher import ( "bytes" + "errors" "fmt" mrand "math/rand" "sort" @@ -277,29 +278,27 @@ func (f *TxFetcher) Enqueue(peer string, txs []*types.Transaction, direct bool) ) errs := f.addTxs(txs) for i, err := range errs { - if err != nil { - // Track the transaction hash if the price is too low for us. - // Avoid re-request this transaction when we receive another - // announcement. - if err == core.ErrUnderpriced || err == core.ErrReplaceUnderpriced { - for f.underpriced.Cardinality() >= maxTxUnderpricedSetSize { - f.underpriced.Pop() - } - f.underpriced.Add(txs[i].Hash()) + // Track the transaction hash if the price is too low for us. + // Avoid re-request this transaction when we receive another + // announcement. + if errors.Is(err, core.ErrUnderpriced) || errors.Is(err, core.ErrReplaceUnderpriced) { + for f.underpriced.Cardinality() >= maxTxUnderpricedSetSize { + f.underpriced.Pop() } - // Track a few interesting failure types - switch err { - case nil: // Noop, but need to handle to not count these + f.underpriced.Add(txs[i].Hash()) + } + // Track a few interesting failure types + switch { + case err == nil: // Noop, but need to handle to not count these - case core.ErrAlreadyKnown: - duplicate++ + case errors.Is(err, core.ErrAlreadyKnown): + duplicate++ - case core.ErrUnderpriced, core.ErrReplaceUnderpriced: - underpriced++ + case errors.Is(err, core.ErrUnderpriced) || errors.Is(err, core.ErrReplaceUnderpriced): + underpriced++ - default: - otherreject++ - } + default: + otherreject++ } added = append(added, txs[i].Hash()) } diff --git a/eth/filters/api.go b/eth/filters/api.go index 63e7f98e55..ce454ed265 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -29,7 +29,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" @@ -52,7 +51,6 @@ type PublicFilterAPI struct { backend Backend mux *event.TypeMux quit chan struct{} - chainDb ethdb.Database events *EventSystem filtersMu sync.Mutex filters map[rpc.ID]*filter @@ -66,7 +64,6 @@ type PublicFilterAPI struct { func NewPublicFilterAPI(backend Backend, lightMode bool, timeout time.Duration, borLogs bool) *PublicFilterAPI { api := &PublicFilterAPI{ backend: backend, - chainDb: backend.ChainDb(), events: NewEventSystem(backend, lightMode), filters: make(map[rpc.ID]*filter), timeout: timeout, diff --git a/eth/filters/bench_test.go b/eth/filters/bench_test.go index 020db070e5..9632f4195f 100644 --- a/eth/filters/bench_test.go +++ b/eth/filters/bench_test.go @@ -62,6 +62,7 @@ func BenchmarkBloomBits32k(b *testing.B) { const benchFilterCnt = 2000 func benchmarkBloomBits(b *testing.B, sectionSize uint64) { + b.Skip("test disabled: this tests presume (and modify) an existing datadir.") benchDataDir := node.DefaultDataDir() + "/geth/chaindata" b.Log("Running bloombits benchmark section size:", sectionSize) @@ -155,6 +156,7 @@ func clearBloomBits(db ethdb.Database) { } func BenchmarkNoBloomBits(b *testing.B) { + b.Skip("test disabled: this tests presume (and modify) an existing datadir.") benchDataDir := node.DefaultDataDir() + "/geth/chaindata" b.Log("Running benchmark without bloombits") db, err := rawdb.NewLevelDBDatabase(benchDataDir, 128, 1024, "", false) diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go index fd25013cc6..63a48f762d 100644 --- a/eth/filters/filter_test.go +++ b/eth/filters/filter_test.go @@ -65,15 +65,19 @@ func BenchmarkFilters(b *testing.B) { case 2403: receipt := makeReceipt(addr1) gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(999, common.HexToAddress("0x999"), big.NewInt(999), 999, gen.BaseFee(), nil)) case 1034: receipt := makeReceipt(addr2) gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(999, common.HexToAddress("0x999"), big.NewInt(999), 999, gen.BaseFee(), nil)) case 34: receipt := makeReceipt(addr3) gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(999, common.HexToAddress("0x999"), big.NewInt(999), 999, gen.BaseFee(), nil)) case 99999: receipt := makeReceipt(addr4) gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(999, common.HexToAddress("0x999"), big.NewInt(999), 999, gen.BaseFee(), nil)) } }) diff --git a/eth/gasprice/gasprice.go b/eth/gasprice/gasprice.go index 0fa6c29591..798ffd1841 100644 --- a/eth/gasprice/gasprice.go +++ b/eth/gasprice/gasprice.go @@ -87,8 +87,7 @@ func NewOracle(backend OracleBackend, params Config) *Oracle { if percent < 0 { percent = 0 log.Warn("Sanitizing invalid gasprice oracle sample percentile", "provided", params.Percentile, "updated", percent) - } - if percent > 100 { + } else if percent > 100 { percent = 100 log.Warn("Sanitizing invalid gasprice oracle sample percentile", "provided", params.Percentile, "updated", percent) } @@ -104,6 +103,16 @@ func NewOracle(backend OracleBackend, params Config) *Oracle { } else if ignorePrice.Int64() > 0 { log.Info("Gasprice oracle is ignoring threshold set", "threshold", ignorePrice) } + maxHeaderHistory := params.MaxHeaderHistory + if maxHeaderHistory < 1 { + maxHeaderHistory = 1 + log.Warn("Sanitizing invalid gasprice oracle max header history", "provided", params.MaxHeaderHistory, "updated", maxHeaderHistory) + } + maxBlockHistory := params.MaxBlockHistory + if maxBlockHistory < 1 { + maxBlockHistory = 1 + log.Warn("Sanitizing invalid gasprice oracle max block history", "provided", params.MaxBlockHistory, "updated", maxBlockHistory) + } cache, _ := lru.New(2048) @@ -114,8 +123,8 @@ func NewOracle(backend OracleBackend, params Config) *Oracle { ignorePrice: ignorePrice, checkBlocks: blocks, percentile: percent, - maxHeaderHistory: params.MaxHeaderHistory, - maxBlockHistory: params.MaxBlockHistory, + maxHeaderHistory: maxHeaderHistory, + maxBlockHistory: maxBlockHistory, historyCache: cache, } } diff --git a/eth/gasprice/gasprice_test.go b/eth/gasprice/gasprice_test.go index 1e249ae14b..c0d3c6b603 100644 --- a/eth/gasprice/gasprice_test.go +++ b/eth/gasprice/gasprice_test.go @@ -107,10 +107,13 @@ func newTestBackend(t *testing.T, londonBlock *big.Int, pending bool) *testBacke signer = types.LatestSigner(gspec.Config) ) config.LondonBlock = londonBlock + config.ArrowGlacierBlock = londonBlock engine := ethash.NewFaker() db := rawdb.NewMemoryDatabase() - genesis, _ := gspec.Commit(db) - + genesis, err := gspec.Commit(db) + if err != nil { + t.Fatal(err) + } // Generate testing blocks blocks, _ := core.GenerateChain(gspec.Config, genesis, engine, db, testHead+1, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) @@ -141,7 +144,7 @@ func newTestBackend(t *testing.T, londonBlock *big.Int, pending bool) *testBacke // Construct testing chain diskdb := rawdb.NewMemoryDatabase() gspec.Commit(diskdb) - chain, err := core.NewBlockChain(diskdb, &core.CacheConfig{TrieCleanNoPrefetch: true}, &config, engine, vm.Config{}, nil, nil) + chain, err := core.NewBlockChain(diskdb, &core.CacheConfig{TrieCleanNoPrefetch: true}, gspec.Config, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to create local chain, %v", err) } diff --git a/eth/handler.go b/eth/handler.go index 41d89c5fb0..55ca869c77 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -25,6 +25,8 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/beacon" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/go-ethereum/core/types" @@ -37,7 +39,6 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" ) const ( @@ -79,9 +80,10 @@ type handlerConfig struct { Database ethdb.Database // Database for direct sync insertions Chain *core.BlockChain // Blockchain to serve data from TxPool txPool // Transaction pool to propagate from + Merger *consensus.Merger // The manager for eth1/2 transition Network uint64 // Network identifier to adfvertise - Sync downloader.SyncMode // Whether to fast or full sync - BloomCache uint64 // Megabytes to alloc for fast sync bloom + Sync downloader.SyncMode // Whether to snap or full sync + BloomCache uint64 // Megabytes to alloc for snap sync bloom EventMux *event.TypeMux // Legacy event mux, deprecate for `feed` Checkpoint *params.TrustedCheckpoint // Hard coded checkpoint for sync challenges Whitelist map[uint64]common.Hash // Hard coded whitelist for sync challenged @@ -91,8 +93,7 @@ type handler struct { networkID uint64 forkFilter forkid.Filter // Fork ID filter, constant across the lifetime of the node - fastSync uint32 // Flag whether fast sync is enabled (gets disabled if we already have blocks) - snapSync uint32 // Flag whether fast sync should operate on top of the snap protocol + snapSync uint32 // Flag whether snap sync is enabled (gets disabled if we already have blocks) acceptTxs uint32 // Flag whether we're considered synchronised (enables transaction processing) checkpointNumber uint64 // Block number for the sync progress validator to cross reference @@ -104,10 +105,10 @@ type handler struct { maxPeers int downloader *downloader.Downloader - stateBloom *trie.SyncBloom blockFetcher *fetcher.BlockFetcher txFetcher *fetcher.TxFetcher peers *peerSet + merger *consensus.Merger eventMux *event.TypeMux txsCh chan core.NewTxsEvent @@ -138,33 +139,31 @@ func newHandler(config *handlerConfig) (*handler, error) { txpool: config.TxPool, chain: config.Chain, peers: newPeerSet(), + merger: config.Merger, whitelist: config.Whitelist, quitSync: make(chan struct{}), } if config.Sync == downloader.FullSync { - // The database seems empty as the current block is the genesis. Yet the fast - // block is ahead, so fast sync was enabled for this node at a certain point. + // The database seems empty as the current block is the genesis. Yet the snap + // block is ahead, so snap sync was enabled for this node at a certain point. // The scenarios where this can happen is - // * if the user manually (or via a bad block) rolled back a fast sync node + // * if the user manually (or via a bad block) rolled back a snap sync node // below the sync point. - // * the last fast sync is not finished while user specifies a full sync this + // * the last snap sync is not finished while user specifies a full sync this // time. But we don't have any recent state for full sync. - // In these cases however it's safe to reenable fast sync. + // In these cases however it's safe to reenable snap sync. fullBlock, fastBlock := h.chain.CurrentBlock(), h.chain.CurrentFastBlock() if fullBlock.NumberU64() == 0 && fastBlock.NumberU64() > 0 { - h.fastSync = uint32(1) - log.Warn("Switch sync mode from full sync to fast sync") + h.snapSync = uint32(1) + log.Warn("Switch sync mode from full sync to snap sync") } } else { if h.chain.CurrentBlock().NumberU64() > 0 { - // Print warning log if database is not empty to run fast sync. - log.Warn("Switch sync mode from fast sync to full sync") + // Print warning log if database is not empty to run snap sync. + log.Warn("Switch sync mode from snap sync to full sync") } else { - // If fast sync was requested and our database is empty, grant it - h.fastSync = uint32(1) - if config.Sync == downloader.SnapSync { - h.snapSync = uint32(1) - } + // If snap sync was requested and our database is empty, grant it + h.snapSync = uint32(1) } } // If we have trusted checkpoints, enforce them on the chain @@ -172,26 +171,48 @@ func newHandler(config *handlerConfig) (*handler, error) { h.checkpointNumber = (config.Checkpoint.SectionIndex+1)*params.CHTFrequency - 1 h.checkpointHash = config.Checkpoint.SectionHead } - // Construct the downloader (long sync) and its backing state bloom if fast + // Construct the downloader (long sync) and its backing state bloom if snap // sync is requested. The downloader is responsible for deallocating the state // bloom when it's done. - // Note: we don't enable it if snap-sync is performed, since it's very heavy - // and the heal-portion of the snap sync is much lighter than fast. What we particularly - // want to avoid, is a 90%-finished (but restarted) snap-sync to begin - // indexing the entire trie - if atomic.LoadUint32(&h.fastSync) == 1 && atomic.LoadUint32(&h.snapSync) == 0 { - h.stateBloom = trie.NewSyncBloom(config.BloomCache, config.Database) - } - h.downloader = downloader.New(h.checkpointNumber, config.Database, h.stateBloom, h.eventMux, h.chain, nil, h.removePeer) + h.downloader = downloader.New(h.checkpointNumber, config.Database, h.eventMux, h.chain, nil, h.removePeer) // Construct the fetcher (short sync) validator := func(header *types.Header) error { + // All the block fetcher activities should be disabled + // after the transition. Print the warning log. + if h.merger.PoSFinalized() { + log.Warn("Unexpected validation activity", "hash", header.Hash(), "number", header.Number) + return errors.New("unexpected behavior after transition") + } + // Reject all the PoS style headers in the first place. No matter + // the chain has finished the transition or not, the PoS headers + // should only come from the trusted consensus layer instead of + // p2p network. + if beacon, ok := h.chain.Engine().(*beacon.Beacon); ok { + if beacon.IsPoSHeader(header) { + return errors.New("unexpected post-merge header") + } + } return h.chain.Engine().VerifyHeader(h.chain, header, true) } heighter := func() uint64 { return h.chain.CurrentBlock().NumberU64() } inserter := func(blocks types.Blocks) (int, error) { + // All the block fetcher activities should be disabled + // after the transition. Print the warning log. + if h.merger.PoSFinalized() { + var ctx []interface{} + ctx = append(ctx, "blocks", len(blocks)) + if len(blocks) > 0 { + ctx = append(ctx, "firsthash", blocks[0].Hash()) + ctx = append(ctx, "firstnumber", blocks[0].Number()) + ctx = append(ctx, "lasthash", blocks[len(blocks)-1].Hash()) + ctx = append(ctx, "lastnumber", blocks[len(blocks)-1].Number()) + } + log.Warn("Unexpected insertion activity", ctx...) + return 0, errors.New("unexpected behavior after transition") + } // If sync hasn't reached the checkpoint yet, deny importing weird blocks. // // Ideally we would also compare the head block's timestamp and similarly reject @@ -202,15 +223,38 @@ func newHandler(config *handlerConfig) (*handler, error) { log.Warn("Unsynced yet, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash()) return 0, nil } - // If fast sync is running, deny importing weird blocks. This is a problematic - // clause when starting up a new network, because fast-syncing miners might not + // If snap sync is running, deny importing weird blocks. This is a problematic + // clause when starting up a new network, because snap-syncing miners might not // accept each others' blocks until a restart. Unfortunately we haven't figured // out a way yet where nodes can decide unilaterally whether the network is new // or not. This should be fixed if we figure out a solution. - if atomic.LoadUint32(&h.fastSync) == 1 { + if atomic.LoadUint32(&h.snapSync) == 1 { log.Warn("Fast syncing, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash()) return 0, nil } + if h.merger.TDDReached() { + // The blocks from the p2p network is regarded as untrusted + // after the transition. In theory block gossip should be disabled + // entirely whenever the transition is started. But in order to + // handle the transition boundary reorg in the consensus-layer, + // the legacy blocks are still accepted, but only for the terminal + // pow blocks. Spec: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-3675.md#halt-the-importing-of-pow-blocks + for i, block := range blocks { + ptd := h.chain.GetTd(block.ParentHash(), block.NumberU64()-1) + if ptd == nil { + return 0, nil + } + td := new(big.Int).Add(ptd, block.Difficulty()) + if !h.chain.Config().IsTerminalPoWBlock(ptd, td) { + log.Info("Filtered out non-termimal pow block", "number", block.NumberU64(), "hash", block.Hash()) + return 0, nil + } + if err := h.chain.InsertBlockWithoutSetHead(block); err != nil { + return i, err + } + } + return 0, nil + } n, err := h.chain.InsertChain(blocks) if err == nil { atomic.StoreUint32(&h.acceptTxs, 1) // Mark initial sync done on any fetcher import @@ -308,30 +352,93 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { // after this will be sent via broadcasts. h.syncTransactions(peer) + // Create a notification channel for pending requests if the peer goes down + dead := make(chan struct{}) + defer close(dead) + // If we have a trusted CHT, reject all peers below that (avoid fast sync eclipse) if h.checkpointHash != (common.Hash{}) { // Request the peer's checkpoint header for chain height/weight validation - if err := peer.RequestHeadersByNumber(h.checkpointNumber, 1, 0, false); err != nil { + resCh := make(chan *eth.Response) + if _, err := peer.RequestHeadersByNumber(h.checkpointNumber, 1, 0, false, resCh); err != nil { return err } // Start a timer to disconnect if the peer doesn't reply in time - p.syncDrop = time.AfterFunc(syncChallengeTimeout, func() { - peer.Log().Warn("Checkpoint challenge timed out, dropping", "addr", peer.RemoteAddr(), "type", peer.Name()) - h.removePeer(peer.ID()) - }) - // Make sure it's cleaned up if the peer dies off - defer func() { - if p.syncDrop != nil { - p.syncDrop.Stop() - p.syncDrop = nil + go func() { + timeout := time.NewTimer(syncChallengeTimeout) + defer timeout.Stop() + + select { + case res := <-resCh: + headers := ([]*types.Header)(*res.Res.(*eth.BlockHeadersPacket)) + if len(headers) == 0 { + // If we're doing a snap sync, we must enforce the checkpoint + // block to avoid eclipse attacks. Unsynced nodes are welcome + // to connect after we're done joining the network. + if atomic.LoadUint32(&h.snapSync) == 1 { + peer.Log().Warn("Dropping unsynced node during sync", "addr", peer.RemoteAddr(), "type", peer.Name()) + res.Done <- errors.New("unsynced node cannot serve sync") + return + } + res.Done <- nil + return + } + // Validate the header and either drop the peer or continue + if len(headers) > 1 { + res.Done <- errors.New("too many headers in checkpoint response") + return + } + if headers[0].Hash() != h.checkpointHash { + res.Done <- errors.New("checkpoint hash mismatch") + return + } + res.Done <- nil + + case <-timeout.C: + peer.Log().Warn("Checkpoint challenge timed out, dropping", "addr", peer.RemoteAddr(), "type", peer.Name()) + h.removePeer(peer.ID()) + + case <-dead: + // Peer handler terminated, abort all goroutines } }() } // If we have any explicit whitelist block hashes, request them - for number := range h.whitelist { - if err := peer.RequestHeadersByNumber(number, 1, 0, false); err != nil { + for number, hash := range h.whitelist { + resCh := make(chan *eth.Response) + if _, err := peer.RequestHeadersByNumber(number, 1, 0, false, resCh); err != nil { return err } + go func(number uint64, hash common.Hash) { + timeout := time.NewTimer(syncChallengeTimeout) + defer timeout.Stop() + + select { + case res := <-resCh: + headers := ([]*types.Header)(*res.Res.(*eth.BlockHeadersPacket)) + if len(headers) == 0 { + // Whitelisted blocks are allowed to be missing if the remote + // node is not yet synced + res.Done <- nil + return + } + // Validate the header and either drop the peer or continue + if len(headers) > 1 { + res.Done <- errors.New("too many headers in whitelist response") + return + } + if headers[0].Number.Uint64() != number || headers[0].Hash() != hash { + peer.Log().Info("Whitelist mismatch, dropping peer", "number", number, "hash", headers[0].Hash(), "want", hash) + res.Done <- errors.New("whitelist block mismatch") + return + } + peer.Log().Debug("Whitelist block verified", "number", number, "hash", hash) + + case <-timeout.C: + peer.Log().Warn("Whitelist challenge timed out, dropping", "addr", peer.RemoteAddr(), "type", peer.Name()) + h.removePeer(peer.ID()) + } + }(number, hash) } // Handle incoming messages until the connection is torn down return handler(peer) @@ -432,6 +539,17 @@ func (h *handler) Stop() { // BroadcastBlock will either propagate a block to a subset of its peers, or // will only announce its availability (depending what's requested). func (h *handler) BroadcastBlock(block *types.Block, propagate bool) { + // Disable the block propagation if the chain has already entered the PoS + // stage. The block propagation is delegated to the consensus layer. + if h.merger.PoSFinalized() { + return + } + // Disable the block propagation if it's the post-merge block. + if beacon, ok := h.chain.Engine().(*beacon.Beacon); ok { + if beacon.IsPoSHeader(block.Header()) { + return + } + } hash := block.Hash() peers := h.peers.peersWithoutBlock(hash) diff --git a/eth/handler_eth.go b/eth/handler_eth.go index 3ff9f2245b..bfe95e8c4d 100644 --- a/eth/handler_eth.go +++ b/eth/handler_eth.go @@ -17,7 +17,6 @@ package eth import ( - "errors" "fmt" "math/big" "sync/atomic" @@ -27,18 +26,15 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/protocols/eth" - "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/trie" ) // ethHandler implements the eth.Backend interface to handle the various network // packets that are sent as replies or broadcasts. type ethHandler handler -func (h *ethHandler) Chain() *core.BlockChain { return h.chain } -func (h *ethHandler) StateBloom() *trie.SyncBloom { return h.stateBloom } -func (h *ethHandler) TxPool() eth.TxPool { return h.txpool } +func (h *ethHandler) Chain() *core.BlockChain { return h.chain } +func (h *ethHandler) TxPool() eth.TxPool { return h.txpool } // RunPeer is invoked when a peer joins on the `eth` protocol. func (h *ethHandler) RunPeer(peer *eth.Peer, hand eth.Handler) error { @@ -64,25 +60,6 @@ func (h *ethHandler) AcceptTxs() bool { func (h *ethHandler) Handle(peer *eth.Peer, packet eth.Packet) error { // Consume any broadcasts and announces, forwarding the rest to the downloader switch packet := packet.(type) { - case *eth.BlockHeadersPacket: - return h.handleHeaders(peer, *packet) - - case *eth.BlockBodiesPacket: - txset, uncleset := packet.Unpack() - return h.handleBodies(peer, txset, uncleset) - - case *eth.NodeDataPacket: - if err := h.downloader.DeliverNodeData(peer.ID(), *packet); err != nil { - log.Debug("Failed to deliver node state data", "err", err) - } - return nil - - case *eth.ReceiptsPacket: - if err := h.downloader.DeliverReceipts(peer.ID(), *packet); err != nil { - log.Debug("Failed to deliver receipts", "err", err) - } - return nil - case *eth.NewBlockHashesPacket: hashes, numbers := packet.Unpack() return h.handleBlockAnnounces(peer, hashes, numbers) @@ -104,82 +81,17 @@ func (h *ethHandler) Handle(peer *eth.Peer, packet eth.Packet) error { } } -// handleHeaders is invoked from a peer's message handler when it transmits a batch -// of headers for the local node to process. -func (h *ethHandler) handleHeaders(peer *eth.Peer, headers []*types.Header) error { - p := h.peers.peer(peer.ID()) - if p == nil { - return errors.New("unregistered during callback") - } - // If no headers were received, but we're expencting a checkpoint header, consider it that - if len(headers) == 0 && p.syncDrop != nil { - // Stop the timer either way, decide later to drop or not - p.syncDrop.Stop() - p.syncDrop = nil - - // If we're doing a fast (or snap) sync, we must enforce the checkpoint block to avoid - // eclipse attacks. Unsynced nodes are welcome to connect after we're done - // joining the network - if atomic.LoadUint32(&h.fastSync) == 1 { - peer.Log().Warn("Dropping unsynced node during sync", "addr", peer.RemoteAddr(), "type", peer.Name()) - return errors.New("unsynced node cannot serve sync") - } - } - // Filter out any explicitly requested headers, deliver the rest to the downloader - filter := len(headers) == 1 - if filter { - // If it's a potential sync progress check, validate the content and advertised chain weight - if p.syncDrop != nil && headers[0].Number.Uint64() == h.checkpointNumber { - // Disable the sync drop timer - p.syncDrop.Stop() - p.syncDrop = nil - - // Validate the header and either drop the peer or continue - if headers[0].Hash() != h.checkpointHash { - return errors.New("checkpoint hash mismatch") - } - return nil - } - // Otherwise if it's a whitelisted block, validate against the set - if want, ok := h.whitelist[headers[0].Number.Uint64()]; ok { - if hash := headers[0].Hash(); want != hash { - peer.Log().Info("Whitelist mismatch, dropping peer", "number", headers[0].Number.Uint64(), "hash", hash, "want", want) - return errors.New("whitelist block mismatch") - } - peer.Log().Debug("Whitelist block verified", "number", headers[0].Number.Uint64(), "hash", want) - } - // Irrelevant of the fork checks, send the header to the fetcher just in case - headers = h.blockFetcher.FilterHeaders(peer.ID(), headers, time.Now()) - } - if len(headers) > 0 || !filter { - err := h.downloader.DeliverHeaders(peer.ID(), headers) - if err != nil { - log.Debug("Failed to deliver headers", "err", err) - } - } - return nil -} - -// handleBodies is invoked from a peer's message handler when it transmits a batch -// of block bodies for the local node to process. -func (h *ethHandler) handleBodies(peer *eth.Peer, txs [][]*types.Transaction, uncles [][]*types.Header) error { - // Filter out any explicitly requested bodies, deliver the rest to the downloader - filter := len(txs) > 0 || len(uncles) > 0 - if filter { - txs, uncles = h.blockFetcher.FilterBodies(peer.ID(), txs, uncles, time.Now()) - } - if len(txs) > 0 || len(uncles) > 0 || !filter { - err := h.downloader.DeliverBodies(peer.ID(), txs, uncles) - if err != nil { - log.Debug("Failed to deliver bodies", "err", err) - } - } - return nil -} - // handleBlockAnnounces is invoked from a peer's message handler when it transmits a // batch of block announcements for the local node to process. func (h *ethHandler) handleBlockAnnounces(peer *eth.Peer, hashes []common.Hash, numbers []uint64) error { + // Drop all incoming block announces from the p2p network if + // the chain already entered the pos stage and disconnect the + // remote peer. + if h.merger.PoSFinalized() { + // TODO (MariusVanDerWijden) drop non-updated peers after the merge + return nil + // return errors.New("unexpected block announces") + } // Schedule all the unknown hashes for retrieval var ( unknownHashes = make([]common.Hash, 0, len(hashes)) @@ -200,6 +112,14 @@ func (h *ethHandler) handleBlockAnnounces(peer *eth.Peer, hashes []common.Hash, // handleBlockBroadcast is invoked from a peer's message handler when it transmits a // block broadcast for the local node to process. func (h *ethHandler) handleBlockBroadcast(peer *eth.Peer, block *types.Block, td *big.Int) error { + // Drop all incoming block announces from the p2p network if + // the chain already entered the pos stage and disconnect the + // remote peer. + if h.merger.PoSFinalized() { + // TODO (MariusVanDerWijden) drop non-updated peers after the merge + return nil + // return errors.New("unexpected block announces") + } // Schedule the block for import h.blockFetcher.Enqueue(peer.ID(), block) diff --git a/eth/handler_eth_test.go b/eth/handler_eth_test.go index b8db5039c9..6e1c57cb6c 100644 --- a/eth/handler_eth_test.go +++ b/eth/handler_eth_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/forkid" @@ -37,7 +38,7 @@ import ( "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/go-ethereum/rlp" ) // testEthHandler is a mock event handler to listen for inbound network requests @@ -49,7 +50,6 @@ type testEthHandler struct { } func (h *testEthHandler) Chain() *core.BlockChain { panic("no backing chain") } -func (h *testEthHandler) StateBloom() *trie.SyncBloom { panic("no backing state bloom") } func (h *testEthHandler) TxPool() eth.TxPool { panic("no backing tx pool") } func (h *testEthHandler) AcceptTxs() bool { return true } func (h *testEthHandler) RunPeer(*eth.Peer, eth.Handler) error { panic("not used in tests") } @@ -115,6 +115,7 @@ func testForkIDSplit(t *testing.T, protocol uint) { Database: dbNoFork, Chain: chainNoFork, TxPool: newTestTxPool(), + Merger: consensus.NewMerger(rawdb.NewMemoryDatabase()), Network: 1, Sync: downloader.FullSync, BloomCache: 1, @@ -123,6 +124,7 @@ func testForkIDSplit(t *testing.T, protocol uint) { Database: dbProFork, Chain: chainProFork, TxPool: newTestTxPool(), + Merger: consensus.NewMerger(rawdb.NewMemoryDatabase()), Network: 1, Sync: downloader.FullSync, BloomCache: 1, @@ -351,7 +353,7 @@ func testSendTransactions(t *testing.T, protocol uint) { seen := make(map[common.Hash]struct{}) for len(seen) < len(insert) { switch protocol { - case 65, 66: + case 66: select { case hashes := <-anns: for _, hash := range hashes { @@ -361,7 +363,7 @@ func testSendTransactions(t *testing.T, protocol uint) { seen[hash] = struct{}{} } case <-bcasts: - t.Errorf("initial tx broadcast received on post eth/65") + t.Errorf("initial tx broadcast received on post eth/66") } default: @@ -386,6 +388,7 @@ func testTransactionPropagation(t *testing.T, protocol uint) { // to receive them. We need multiple sinks since a one-to-one peering would // broadcast all transactions without announcement. source := newTestHandler() + source.handler.snapSync = 0 // Avoid requiring snap, otherwise some will be dropped below defer source.close() sinks := make([]*testHandler, 10) @@ -403,7 +406,7 @@ func testTransactionPropagation(t *testing.T, protocol uint) { defer sourcePipe.Close() defer sinkPipe.Close() - sourcePeer := eth.NewPeer(protocol, p2p.NewPeerPipe(enode.ID{byte(i)}, "", nil, sourcePipe), sourcePipe, source.txpool) + sourcePeer := eth.NewPeer(protocol, p2p.NewPeerPipe(enode.ID{byte(i + 1)}, "", nil, sourcePipe), sourcePipe, source.txpool) sinkPeer := eth.NewPeer(protocol, p2p.NewPeerPipe(enode.ID{0}, "", nil, sinkPipe), sinkPipe, sink.txpool) defer sourcePeer.Close() defer sinkPeer.Close() @@ -435,12 +438,13 @@ func testTransactionPropagation(t *testing.T, protocol uint) { // Iterate through all the sinks and ensure they all got the transactions for i := range sinks { - for arrived := 0; arrived < len(txs); { + for arrived, timeout := 0, false; arrived < len(txs) && !timeout; { select { case event := <-txChs[i]: arrived += len(event.Txs) - case <-time.NewTimer(time.Second).C: + case <-time.After(time.Second): t.Errorf("sink %d: transaction propagation timed out: have %d, want %d", i, arrived, len(txs)) + timeout = true } } } @@ -460,23 +464,23 @@ func TestCheckpointChallenge(t *testing.T) { }{ // If checkpointing is not enabled locally, don't challenge and don't drop {downloader.FullSync, false, false, false, false, false}, - {downloader.FastSync, false, false, false, false, false}, + {downloader.SnapSync, false, false, false, false, false}, // If checkpointing is enabled locally and remote response is empty, only drop during fast sync {downloader.FullSync, true, false, true, false, false}, - {downloader.FastSync, true, false, true, false, true}, // Special case, fast sync, unsynced peer + {downloader.SnapSync, true, false, true, false, true}, // Special case, fast sync, unsynced peer // If checkpointing is enabled locally and remote response mismatches, always drop {downloader.FullSync, true, false, false, false, true}, - {downloader.FastSync, true, false, false, false, true}, + {downloader.SnapSync, true, false, false, false, true}, // If checkpointing is enabled locally and remote response matches, never drop {downloader.FullSync, true, false, false, true, false}, - {downloader.FastSync, true, false, false, true, false}, + {downloader.SnapSync, true, false, false, true, false}, // If checkpointing is enabled locally and remote times out, always drop {downloader.FullSync, true, true, false, true, true}, - {downloader.FastSync, true, true, false, true, true}, + {downloader.SnapSync, true, true, false, true, true}, } for _, tt := range tests { t.Run(fmt.Sprintf("sync %v checkpoint %v timeout %v empty %v match %v", tt.syncmode, tt.checkpoint, tt.timeout, tt.empty, tt.match), func(t *testing.T) { @@ -497,10 +501,10 @@ func testCheckpointChallenge(t *testing.T, syncmode downloader.SyncMode, checkpo handler := newTestHandler() defer handler.close() - if syncmode == downloader.FastSync { - atomic.StoreUint32(&handler.handler.fastSync, 1) + if syncmode == downloader.SnapSync { + atomic.StoreUint32(&handler.handler.snapSync, 1) } else { - atomic.StoreUint32(&handler.handler.fastSync, 0) + atomic.StoreUint32(&handler.handler.snapSync, 0) } var response *types.Header if checkpoint { @@ -557,15 +561,17 @@ func testCheckpointChallenge(t *testing.T, syncmode downloader.SyncMode, checkpo // Create a block to reply to the challenge if no timeout is simulated. if !timeout { if empty { - if err := remote.ReplyBlockHeaders(request.RequestId, []*types.Header{}); err != nil { + if err := remote.ReplyBlockHeadersRLP(request.RequestId, []rlp.RawValue{}); err != nil { t.Fatalf("failed to answer challenge: %v", err) } } else if match { - if err := remote.ReplyBlockHeaders(request.RequestId, []*types.Header{response}); err != nil { + responseRlp, _ := rlp.EncodeToBytes(response) + if err := remote.ReplyBlockHeadersRLP(request.RequestId, []rlp.RawValue{responseRlp}); err != nil { t.Fatalf("failed to answer challenge: %v", err) } } else { - if err := remote.ReplyBlockHeaders(request.RequestId, []*types.Header{{Number: response.Number}}); err != nil { + responseRlp, _ := rlp.EncodeToBytes(types.Header{Number: response.Number}) + if err := remote.ReplyBlockHeadersRLP(request.RequestId, []rlp.RawValue{responseRlp}); err != nil { t.Fatalf("failed to answer challenge: %v", err) } } diff --git a/eth/handler_test.go b/eth/handler_test.go index b2f00b7977..d967b6df93 100644 --- a/eth/handler_test.go +++ b/eth/handler_test.go @@ -22,6 +22,7 @@ import ( "sync" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" @@ -149,8 +150,9 @@ func newTestHandlerWithBlocks(blocks int) *testHandler { Database: db, Chain: chain, TxPool: txpool, + Merger: consensus.NewMerger(rawdb.NewMemoryDatabase()), Network: 1, - Sync: downloader.FastSync, + Sync: downloader.SnapSync, BloomCache: 1, }) handler.Start(1000) diff --git a/eth/peer.go b/eth/peer.go index 1cea9c640e..024a6e6193 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -18,8 +18,6 @@ package eth import ( "math/big" - "sync" - "time" "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/eth/protocols/snap" @@ -36,11 +34,8 @@ type ethPeerInfo struct { // ethPeer is a wrapper around eth.Peer to maintain a few extra metadata. type ethPeer struct { *eth.Peer - snapExt *snapPeer // Satellite `snap` connection - - syncDrop *time.Timer // Connection dropper if `eth` sync progress isn't validated in time + snapExt *snapPeer // Satellite `snap` connection snapWait chan struct{} // Notification channel for snap connections - lock sync.RWMutex // Mutex protecting the internal fields } // info gathers and returns some `eth` protocol metadata known about a peer. diff --git a/eth/protocols/eth/dispatcher.go b/eth/protocols/eth/dispatcher.go new file mode 100644 index 0000000000..bf88d400d4 --- /dev/null +++ b/eth/protocols/eth/dispatcher.go @@ -0,0 +1,253 @@ +// Copyright 2021 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 . + +package eth + +import ( + "errors" + "fmt" + "time" + + "github.com/ethereum/go-ethereum/p2p" +) + +var ( + // errDisconnected is returned if a request is attempted to be made to a peer + // that was already closed. + errDisconnected = errors.New("disconnected") + + // errDanglingResponse is returned if a response arrives with a request id + // which does not match to any existing pending requests. + errDanglingResponse = errors.New("response to non-existent request") + + // errMismatchingResponseType is returned if the remote peer sent a different + // packet type as a response to a request than what the local node expected. + errMismatchingResponseType = errors.New("mismatching response type") +) + +// Request is a pending request to allow tracking it and delivering a response +// back to the requester on their chosen channel. +type Request struct { + peer *Peer // Peer to which this request belogs for untracking + id uint64 // Request ID to match up replies to + + sink chan *Response // Channel to deliver the response on + cancel chan struct{} // Channel to cancel requests ahead of time + + code uint64 // Message code of the request packet + want uint64 // Message code of the response packet + data interface{} // Data content of the request packet + + Peer string // Demultiplexer if cross-peer requests are batched together + Sent time.Time // Timestamp when the request was sent +} + +// Close aborts an in-flight request. Although there's no way to notify the +// remote peer about the cancellation, this method notifies the dispatcher to +// discard any late responses. +func (r *Request) Close() error { + if r.peer == nil { // Tests mock out the dispatcher, skip internal cancellation + return nil + } + cancelOp := &cancel{ + id: r.id, + fail: make(chan error), + } + select { + case r.peer.reqCancel <- cancelOp: + if err := <-cancelOp.fail; err != nil { + return err + } + close(r.cancel) + return nil + case <-r.peer.term: + return errDisconnected + } +} + +// request is a wrapper around a client Request that has an error channel to +// signal on if sending the request already failed on a network level. +type request struct { + req *Request + fail chan error +} + +// cancel is a maintenance type on the dispatcher to stop tracking a pending +// request. +type cancel struct { + id uint64 // Request ID to stop tracking + fail chan error +} + +// Response is a reply packet to a previously created request. It is delivered +// on the channel assigned by the requester subsystem and contains the original +// request embedded to allow uniquely matching it caller side. +type Response struct { + id uint64 // Request ID to match up this reply to + recv time.Time // Timestamp when the request was received + code uint64 // Response packet type to cross validate with request + + Req *Request // Original request to cross-reference with + Res interface{} // Remote response for the request query + Meta interface{} // Metadata generated locally on the receiver thread + Time time.Duration // Time it took for the request to be served + Done chan error // Channel to signal message handling to the reader +} + +// response is a wrapper around a remote Response that has an error channel to +// signal on if processing the response failed. +type response struct { + res *Response + fail chan error +} + +// dispatchRequest schedules the request to the dispatcher for tracking and +// network serialization, blocking until it's successfully sent. +// +// The returned Request must either be closed before discarding it, or the reply +// must be waited for and the Response's Done channel signalled. +func (p *Peer) dispatchRequest(req *Request) error { + reqOp := &request{ + req: req, + fail: make(chan error), + } + req.cancel = make(chan struct{}) + req.peer = p + req.Peer = p.id + + select { + case p.reqDispatch <- reqOp: + return <-reqOp.fail + case <-p.term: + return errDisconnected + } +} + +// dispatchRequest fulfils a pending request and delivers it to the requested +// sink. +func (p *Peer) dispatchResponse(res *Response, metadata func() interface{}) error { + resOp := &response{ + res: res, + fail: make(chan error), + } + res.recv = time.Now() + res.Done = make(chan error) + + select { + case p.resDispatch <- resOp: + // Ensure the response is accepted by the dispatcher + if err := <-resOp.fail; err != nil { + return nil + } + // Request was accepted, run any postprocessing step to generate metadata + // on the receiver thread, not the sink thread + if metadata != nil { + res.Meta = metadata() + } + // Deliver the filled out response and wait until it's handled. This + // path is a bit funky as Go's select has no order, so if a response + // arrives to an already cancelled request, there's a 50-50% changes + // of picking on channel or the other. To avoid such cases delivering + // the packet upstream, check for cancellation first and only after + // block on delivery. + select { + case <-res.Req.cancel: + return nil // Request cancelled, silently discard response + default: + // Request not yet cancelled, attempt to deliver it, but do watch + // for fresh cancellations too + select { + case res.Req.sink <- res: + return <-res.Done // Response delivered, return any errors + case <-res.Req.cancel: + return nil // Request cancelled, silently discard response + } + } + + case <-p.term: + return errDisconnected + } +} + +// dispatcher is a loop that accepts requests from higher layer packages, pushes +// it to the network and tracks and dispatches the responses back to the original +// requester. +func (p *Peer) dispatcher() { + pending := make(map[uint64]*Request) + + for { + select { + case reqOp := <-p.reqDispatch: + req := reqOp.req + req.Sent = time.Now() + + requestTracker.Track(p.id, p.version, req.code, req.want, req.id) + err := p2p.Send(p.rw, req.code, req.data) + reqOp.fail <- err + + if err == nil { + pending[req.id] = req + } + + case cancelOp := <-p.reqCancel: + // Retrieve the pendign request to cancel and short circuit if it + // has already been serviced and is not available anymore + req := pending[cancelOp.id] + if req == nil { + cancelOp.fail <- nil + continue + } + // Stop tracking the request + delete(pending, cancelOp.id) + cancelOp.fail <- nil + + case resOp := <-p.resDispatch: + res := resOp.res + res.Req = pending[res.id] + + // Independent if the request exists or not, track this packet + requestTracker.Fulfil(p.id, p.version, res.code, res.id) + + switch { + case res.Req == nil: + // Response arrived with an untracked ID. Since even cancelled + // requests are tracked until fulfilment, a dangling repsponse + // means the remote peer implements the protocol badly. + resOp.fail <- errDanglingResponse + + case res.Req.want != res.code: + // Response arrived, but it's a different packet type than the + // one expected by the requester. Either the local code is bad, + // or the remote peer send junk. In neither cases can we handle + // the packet. + resOp.fail <- fmt.Errorf("%w: have %d, want %d", errMismatchingResponseType, res.code, res.Req.want) + + default: + // All dispatcher checks passed and the response was initialized + // with the matching request. Signal to the delivery routine that + // it can wait for a handler response and dispatch the data. + res.Time = res.recv.Sub(res.Req.Sent) + resOp.fail <- nil + + // Stop tracking the request, the response dispatcher will deliver + delete(pending, res.id) + } + + case <-p.term: + return + } + } +} diff --git a/eth/protocols/eth/handler.go b/eth/protocols/eth/handler.go index 8289300141..81d45d8b8f 100644 --- a/eth/protocols/eth/handler.go +++ b/eth/protocols/eth/handler.go @@ -29,16 +29,12 @@ import ( "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" ) const ( // softResponseLimit is the target maximum size of replies to data retrievals. softResponseLimit = 2 * 1024 * 1024 - // estHeaderSize is the approximate size of an RLP encoded block header. - estHeaderSize = 500 - // maxHeadersServe is the maximum number of block headers to serve. This number // is there to limit the number of disk lookups. maxHeadersServe = 1024 @@ -69,9 +65,6 @@ type Backend interface { // Chain retrieves the blockchain object to serve data. Chain() *core.BlockChain - // StateBloom retrieves the bloom filter - if any - for state trie nodes. - StateBloom() *trie.SyncBloom - // TxPool retrieves the transaction pool object to serve data. TxPool() TxPool @@ -96,7 +89,7 @@ type Backend interface { // TxPool defines the methods needed by the protocol handler to serve transactions. type TxPool interface { - // Get retrieves the the transaction from the local txpool with the given hash. + // Get retrieves the transaction from the local txpool with the given hash. Get(hash common.Hash) *types.Transaction } diff --git a/eth/protocols/eth/handler_test.go b/eth/protocols/eth/handler_test.go index 66f0134096..7d9b378839 100644 --- a/eth/protocols/eth/handler_test.go +++ b/eth/protocols/eth/handler_test.go @@ -34,7 +34,6 @@ import ( "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" ) var ( @@ -91,9 +90,8 @@ func (b *testBackend) close() { b.chain.Stop() } -func (b *testBackend) Chain() *core.BlockChain { return b.chain } -func (b *testBackend) StateBloom() *trie.SyncBloom { return nil } -func (b *testBackend) TxPool() TxPool { return b.txpool } +func (b *testBackend) Chain() *core.BlockChain { return b.chain } +func (b *testBackend) TxPool() TxPool { return b.txpool } func (b *testBackend) RunPeer(peer *Peer, handler Handler) error { // Normally the backend would do peer mainentance and handshakes. All that @@ -138,11 +136,13 @@ func testGetBlockHeaders(t *testing.T, protocol uint) { query *GetBlockHeadersPacket // The query to execute for header retrieval expect []common.Hash // The hashes of the block whose headers are expected }{ - // A single random block should be retrievable by hash and number too + // A single random block should be retrievable by hash { &GetBlockHeadersPacket{Origin: HashOrNumber{Hash: backend.chain.GetBlockByNumber(limit / 2).Hash()}, Amount: 1}, []common.Hash{backend.chain.GetBlockByNumber(limit / 2).Hash()}, - }, { + }, + // A single random block should be retrievable by number + { &GetBlockHeadersPacket{Origin: HashOrNumber{Number: limit / 2}, Amount: 1}, []common.Hash{backend.chain.GetBlockByNumber(limit / 2).Hash()}, }, @@ -182,10 +182,15 @@ func testGetBlockHeaders(t *testing.T, protocol uint) { { &GetBlockHeadersPacket{Origin: HashOrNumber{Number: 0}, Amount: 1}, []common.Hash{backend.chain.GetBlockByNumber(0).Hash()}, - }, { + }, + { &GetBlockHeadersPacket{Origin: HashOrNumber{Number: backend.chain.CurrentBlock().NumberU64()}, Amount: 1}, []common.Hash{backend.chain.CurrentBlock().Hash()}, }, + { // If the peer requests a bit into the future, we deliver what we have + &GetBlockHeadersPacket{Origin: HashOrNumber{Number: backend.chain.CurrentBlock().NumberU64()}, Amount: 10}, + []common.Hash{backend.chain.CurrentBlock().Hash()}, + }, // Ensure protocol limits are honored { &GetBlockHeadersPacket{Origin: HashOrNumber{Number: backend.chain.CurrentBlock().NumberU64() - 1}, Amount: limit + 10, Reverse: true}, @@ -282,7 +287,7 @@ func testGetBlockHeaders(t *testing.T, protocol uint) { RequestId: 456, BlockHeadersPacket: headers, }); err != nil { - t.Errorf("test %d: headers mismatch: %v", i, err) + t.Errorf("test %d by hash: headers mismatch: %v", i, err) } } } diff --git a/eth/protocols/eth/handlers.go b/eth/protocols/eth/handlers.go index e54838cbc5..8fc966e7ae 100644 --- a/eth/protocols/eth/handlers.go +++ b/eth/protocols/eth/handlers.go @@ -21,6 +21,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" @@ -34,11 +35,22 @@ func handleGetBlockHeaders66(backend Backend, msg Decoder, peer *Peer) error { if err := msg.Decode(&query); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - response := answerGetBlockHeadersQuery(backend, query.GetBlockHeadersPacket, peer) - return peer.ReplyBlockHeaders(query.RequestId, response) + response := ServiceGetBlockHeadersQuery(backend.Chain(), query.GetBlockHeadersPacket, peer) + return peer.ReplyBlockHeadersRLP(query.RequestId, response) } -func answerGetBlockHeadersQuery(backend Backend, query *GetBlockHeadersPacket, peer *Peer) []*types.Header { +// ServiceGetBlockHeadersQuery assembles the response to a header query. It is +// exposed to allow external packages to test protocol behavior. +func ServiceGetBlockHeadersQuery(chain *core.BlockChain, query *GetBlockHeadersPacket, peer *Peer) []rlp.RawValue { + if query.Skip == 0 { + // The fast path: when the request is for a contiguous segment of headers. + return serviceContiguousBlockHeaderQuery(chain, query) + } else { + return serviceNonContiguousBlockHeaderQuery(chain, query, peer) + } +} + +func serviceNonContiguousBlockHeaderQuery(chain *core.BlockChain, query *GetBlockHeadersPacket, peer *Peer) []rlp.RawValue { hashMode := query.Origin.Hash != (common.Hash{}) first := true maxNonCanonical := uint64(100) @@ -46,7 +58,7 @@ func answerGetBlockHeadersQuery(backend Backend, query *GetBlockHeadersPacket, p // Gather headers until the fetch or network limits is reached var ( bytes common.StorageSize - headers []*types.Header + headers []rlp.RawValue unknown bool lookups int ) @@ -58,22 +70,25 @@ func answerGetBlockHeadersQuery(backend Backend, query *GetBlockHeadersPacket, p if hashMode { if first { first = false - origin = backend.Chain().GetHeaderByHash(query.Origin.Hash) + origin = chain.GetHeaderByHash(query.Origin.Hash) if origin != nil { query.Origin.Number = origin.Number.Uint64() } } else { - origin = backend.Chain().GetHeader(query.Origin.Hash, query.Origin.Number) + origin = chain.GetHeader(query.Origin.Hash, query.Origin.Number) } } else { - origin = backend.Chain().GetHeaderByNumber(query.Origin.Number) + origin = chain.GetHeaderByNumber(query.Origin.Number) } if origin == nil { break } - headers = append(headers, origin) - bytes += estHeaderSize - + if rlpData, err := rlp.EncodeToBytes(origin); err != nil { + log.Crit("Unable to decode our own headers", "err", err) + } else { + headers = append(headers, rlp.RawValue(rlpData)) + bytes += common.StorageSize(len(rlpData)) + } // Advance to the next header of the query switch { case hashMode && query.Reverse: @@ -82,7 +97,7 @@ func answerGetBlockHeadersQuery(backend Backend, query *GetBlockHeadersPacket, p if ancestor == 0 { unknown = true } else { - query.Origin.Hash, query.Origin.Number = backend.Chain().GetAncestor(query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical) + query.Origin.Hash, query.Origin.Number = chain.GetAncestor(query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical) unknown = (query.Origin.Hash == common.Hash{}) } case hashMode && !query.Reverse: @@ -96,9 +111,9 @@ func answerGetBlockHeadersQuery(backend Backend, query *GetBlockHeadersPacket, p peer.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", query.Skip, "next", next, "attacker", infos) unknown = true } else { - if header := backend.Chain().GetHeaderByNumber(next); header != nil { + if header := chain.GetHeaderByNumber(next); header != nil { nextHash := header.Hash() - expOldHash, _ := backend.Chain().GetAncestor(nextHash, next, query.Skip+1, &maxNonCanonical) + expOldHash, _ := chain.GetAncestor(nextHash, next, query.Skip+1, &maxNonCanonical) if expOldHash == query.Origin.Hash { query.Origin.Hash, query.Origin.Number = nextHash, next } else { @@ -124,17 +139,82 @@ func answerGetBlockHeadersQuery(backend Backend, query *GetBlockHeadersPacket, p return headers } +func serviceContiguousBlockHeaderQuery(chain *core.BlockChain, query *GetBlockHeadersPacket) []rlp.RawValue { + count := query.Amount + if count > maxHeadersServe { + count = maxHeadersServe + } + if query.Origin.Hash == (common.Hash{}) { + // Number mode, just return the canon chain segment. The backend + // delivers in [N, N-1, N-2..] descending order, so we need to + // accommodate for that. + from := query.Origin.Number + if !query.Reverse { + from = from + count - 1 + } + headers := chain.GetHeadersFrom(from, count) + if !query.Reverse { + for i, j := 0, len(headers)-1; i < j; i, j = i+1, j-1 { + headers[i], headers[j] = headers[j], headers[i] + } + } + return headers + } + // Hash mode. + var ( + headers []rlp.RawValue + hash = query.Origin.Hash + header = chain.GetHeaderByHash(hash) + ) + if header != nil { + rlpData, _ := rlp.EncodeToBytes(header) + headers = append(headers, rlpData) + } else { + // We don't even have the origin header + return headers + } + num := header.Number.Uint64() + if !query.Reverse { + // Theoretically, we are tasked to deliver header by hash H, and onwards. + // However, if H is not canon, we will be unable to deliver any descendants of + // H. + if canonHash := chain.GetCanonicalHash(num); canonHash != hash { + // Not canon, we can't deliver descendants + return headers + } + descendants := chain.GetHeadersFrom(num+count-1, count-1) + for i, j := 0, len(descendants)-1; i < j; i, j = i+1, j-1 { + descendants[i], descendants[j] = descendants[j], descendants[i] + } + headers = append(headers, descendants...) + return headers + } + { // Last mode: deliver ancestors of H + for i := uint64(1); header != nil && i < count; i++ { + header = chain.GetHeaderByHash(header.ParentHash) + if header == nil { + break + } + rlpData, _ := rlp.EncodeToBytes(header) + headers = append(headers, rlpData) + } + return headers + } +} + func handleGetBlockBodies66(backend Backend, msg Decoder, peer *Peer) error { // Decode the block body retrieval message var query GetBlockBodiesPacket66 if err := msg.Decode(&query); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - response := answerGetBlockBodiesQuery(backend, query.GetBlockBodiesPacket, peer) + response := ServiceGetBlockBodiesQuery(backend.Chain(), query.GetBlockBodiesPacket) return peer.ReplyBlockBodiesRLP(query.RequestId, response) } -func answerGetBlockBodiesQuery(backend Backend, query GetBlockBodiesPacket, peer *Peer) []rlp.RawValue { +// ServiceGetBlockBodiesQuery assembles the response to a body query. It is +// exposed to allow external packages to test protocol behavior. +func ServiceGetBlockBodiesQuery(chain *core.BlockChain, query GetBlockBodiesPacket) []rlp.RawValue { // Gather blocks until the fetch or network limits is reached var ( bytes int @@ -145,7 +225,7 @@ func answerGetBlockBodiesQuery(backend Backend, query GetBlockBodiesPacket, peer lookups >= 2*maxBodiesServe { break } - if data := backend.Chain().GetBodyRLP(hash); len(data) != 0 { + if data := chain.GetBodyRLP(hash); len(data) != 0 { bodies = append(bodies, data) bytes += len(data) } @@ -159,11 +239,13 @@ func handleGetNodeData66(backend Backend, msg Decoder, peer *Peer) error { if err := msg.Decode(&query); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - response := answerGetNodeDataQuery(backend, query.GetNodeDataPacket, peer) + response := ServiceGetNodeDataQuery(backend.Chain(), query.GetNodeDataPacket) return peer.ReplyNodeData(query.RequestId, response) } -func answerGetNodeDataQuery(backend Backend, query GetNodeDataPacket, peer *Peer) [][]byte { +// ServiceGetNodeDataQuery assembles the response to a node data query. It is +// exposed to allow external packages to test protocol behavior. +func ServiceGetNodeDataQuery(chain *core.BlockChain, query GetNodeDataPacket) [][]byte { // Gather state data until the fetch or network limits is reached var ( bytes int @@ -175,14 +257,10 @@ func answerGetNodeDataQuery(backend Backend, query GetNodeDataPacket, peer *Peer break } // Retrieve the requested state entry - if bloom := backend.StateBloom(); bloom != nil && !bloom.Contains(hash[:]) { - // Only lookup the trie node if there's chance that we actually have it - continue - } - entry, err := backend.Chain().TrieNode(hash) + entry, err := chain.TrieNode(hash) if len(entry) == 0 || err != nil { // Read the contract code with prefix only to save unnecessary lookups. - entry, err = backend.Chain().ContractCodeWithPrefix(hash) + entry, err = chain.ContractCodeWithPrefix(hash) } if err == nil && len(entry) > 0 { nodes = append(nodes, entry) @@ -198,11 +276,13 @@ func handleGetReceipts66(backend Backend, msg Decoder, peer *Peer) error { if err := msg.Decode(&query); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - response := answerGetReceiptsQuery(backend, query.GetReceiptsPacket, peer) + response := ServiceGetReceiptsQuery(backend.Chain(), query.GetReceiptsPacket) return peer.ReplyReceiptsRLP(query.RequestId, response) } -func answerGetReceiptsQuery(backend Backend, query GetReceiptsPacket, peer *Peer) []rlp.RawValue { +// ServiceGetReceiptsQuery assembles the response to a receipt query. It is +// exposed to allow external packages to test protocol behavior. +func ServiceGetReceiptsQuery(chain *core.BlockChain, query GetReceiptsPacket) []rlp.RawValue { // Gather state data until the fetch or network limits is reached var ( bytes int @@ -214,9 +294,9 @@ func answerGetReceiptsQuery(backend Backend, query GetReceiptsPacket, peer *Peer break } // Retrieve the requested block's receipts - results := backend.Chain().GetReceiptsByHash(hash) + results := chain.GetReceiptsByHash(hash) if results == nil { - if header := backend.Chain().GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { + if header := chain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { continue } } @@ -277,9 +357,18 @@ func handleBlockHeaders66(backend Backend, msg Decoder, peer *Peer) error { if err := msg.Decode(res); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - requestTracker.Fulfil(peer.id, peer.version, BlockHeadersMsg, res.RequestId) - - return backend.Handle(peer, &res.BlockHeadersPacket) + metadata := func() interface{} { + hashes := make([]common.Hash, len(res.BlockHeadersPacket)) + for i, header := range res.BlockHeadersPacket { + hashes[i] = header.Hash() + } + return hashes + } + return peer.dispatchResponse(&Response{ + id: res.RequestId, + code: BlockHeadersMsg, + Res: &res.BlockHeadersPacket, + }, metadata) } func handleBlockBodies66(backend Backend, msg Decoder, peer *Peer) error { @@ -288,9 +377,23 @@ func handleBlockBodies66(backend Backend, msg Decoder, peer *Peer) error { if err := msg.Decode(res); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - requestTracker.Fulfil(peer.id, peer.version, BlockBodiesMsg, res.RequestId) - - return backend.Handle(peer, &res.BlockBodiesPacket) + metadata := func() interface{} { + var ( + txsHashes = make([]common.Hash, len(res.BlockBodiesPacket)) + uncleHashes = make([]common.Hash, len(res.BlockBodiesPacket)) + ) + hasher := trie.NewStackTrie(nil) + for i, body := range res.BlockBodiesPacket { + txsHashes[i] = types.DeriveSha(types.Transactions(body.Transactions), hasher) + uncleHashes[i] = types.CalcUncleHash(body.Uncles) + } + return [][]common.Hash{txsHashes, uncleHashes} + } + return peer.dispatchResponse(&Response{ + id: res.RequestId, + code: BlockBodiesMsg, + Res: &res.BlockBodiesPacket, + }, metadata) } func handleNodeData66(backend Backend, msg Decoder, peer *Peer) error { @@ -299,9 +402,11 @@ func handleNodeData66(backend Backend, msg Decoder, peer *Peer) error { if err := msg.Decode(res); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - requestTracker.Fulfil(peer.id, peer.version, NodeDataMsg, res.RequestId) - - return backend.Handle(peer, &res.NodeDataPacket) + return peer.dispatchResponse(&Response{ + id: res.RequestId, + code: NodeDataMsg, + Res: &res.NodeDataPacket, + }, nil) // No post-processing, we're not using this packet anymore } func handleReceipts66(backend Backend, msg Decoder, peer *Peer) error { @@ -310,9 +415,19 @@ func handleReceipts66(backend Backend, msg Decoder, peer *Peer) error { if err := msg.Decode(res); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - requestTracker.Fulfil(peer.id, peer.version, ReceiptsMsg, res.RequestId) - - return backend.Handle(peer, &res.ReceiptsPacket) + metadata := func() interface{} { + hasher := trie.NewStackTrie(nil) + hashes := make([]common.Hash, len(res.ReceiptsPacket)) + for i, receipt := range res.ReceiptsPacket { + hashes[i] = types.DeriveSha(types.Receipts(receipt), hasher) + } + return hashes + } + return peer.dispatchResponse(&Response{ + id: res.RequestId, + code: ReceiptsMsg, + Res: &res.ReceiptsPacket, + }, metadata) } func handleNewPooledTransactionHashes(backend Backend, msg Decoder, peer *Peer) error { diff --git a/eth/protocols/eth/peer.go b/eth/protocols/eth/peer.go index 1b4cfeb3da..4161420f3a 100644 --- a/eth/protocols/eth/peer.go +++ b/eth/protocols/eth/peer.go @@ -84,6 +84,10 @@ type Peer struct { txBroadcast chan []common.Hash // Channel used to queue transaction propagation requests txAnnounce chan []common.Hash // Channel used to queue transaction announcement requests + reqDispatch chan *request // Dispatch channel to send requests and track then until fulfilment + reqCancel chan *cancel // Dispatch channel to cancel pending requests and untrack them + resDispatch chan *response // Dispatch channel to fulfil pending requests and untrack them + term chan struct{} // Termination channel to stop the broadcasters lock sync.RWMutex // Mutex protecting the internal fields } @@ -102,6 +106,9 @@ func NewPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter, txpool TxPool) *Pe queuedBlockAnns: make(chan *types.Block, maxQueuedBlockAnns), txBroadcast: make(chan []common.Hash), txAnnounce: make(chan []common.Hash), + reqDispatch: make(chan *request), + reqCancel: make(chan *cancel), + resDispatch: make(chan *response), txpool: txpool, term: make(chan struct{}), } @@ -109,6 +116,7 @@ func NewPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter, txpool TxPool) *Pe go peer.broadcastBlocks() go peer.broadcastTransactions() go peer.announceTransactions() + go peer.dispatcher() return peer } @@ -289,10 +297,10 @@ func (p *Peer) AsyncSendNewBlock(block *types.Block, td *big.Int) { } // ReplyBlockHeaders is the eth/66 version of SendBlockHeaders. -func (p *Peer) ReplyBlockHeaders(id uint64, headers []*types.Header) error { - return p2p.Send(p.rw, BlockHeadersMsg, BlockHeadersPacket66{ - RequestId: id, - BlockHeadersPacket: headers, +func (p *Peer) ReplyBlockHeadersRLP(id uint64, headers []rlp.RawValue) error { + return p2p.Send(p.rw, BlockHeadersMsg, BlockHeadersRLPPacket66{ + RequestId: id, + BlockHeadersRLPPacket: headers, }) } @@ -323,94 +331,148 @@ func (p *Peer) ReplyReceiptsRLP(id uint64, receipts []rlp.RawValue) error { // RequestOneHeader is a wrapper around the header query functions to fetch a // single header. It is used solely by the fetcher. -func (p *Peer) RequestOneHeader(hash common.Hash) error { +func (p *Peer) RequestOneHeader(hash common.Hash, sink chan *Response) (*Request, error) { p.Log().Debug("Fetching single header", "hash", hash) id := rand.Uint64() - requestTracker.Track(p.id, p.version, GetBlockHeadersMsg, BlockHeadersMsg, id) - return p2p.Send(p.rw, GetBlockHeadersMsg, &GetBlockHeadersPacket66{ - RequestId: id, - GetBlockHeadersPacket: &GetBlockHeadersPacket{ - Origin: HashOrNumber{Hash: hash}, - Amount: uint64(1), - Skip: uint64(0), - Reverse: false, + req := &Request{ + id: id, + sink: sink, + code: GetBlockHeadersMsg, + want: BlockHeadersMsg, + data: &GetBlockHeadersPacket66{ + RequestId: id, + GetBlockHeadersPacket: &GetBlockHeadersPacket{ + Origin: HashOrNumber{Hash: hash}, + Amount: uint64(1), + Skip: uint64(0), + Reverse: false, + }, }, - }) + } + if err := p.dispatchRequest(req); err != nil { + return nil, err + } + return req, nil } // RequestHeadersByHash fetches a batch of blocks' headers corresponding to the // specified header query, based on the hash of an origin block. -func (p *Peer) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error { +func (p *Peer) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool, sink chan *Response) (*Request, error) { p.Log().Debug("Fetching batch of headers", "count", amount, "fromhash", origin, "skip", skip, "reverse", reverse) id := rand.Uint64() - requestTracker.Track(p.id, p.version, GetBlockHeadersMsg, BlockHeadersMsg, id) - return p2p.Send(p.rw, GetBlockHeadersMsg, &GetBlockHeadersPacket66{ - RequestId: id, - GetBlockHeadersPacket: &GetBlockHeadersPacket{ - Origin: HashOrNumber{Hash: origin}, - Amount: uint64(amount), - Skip: uint64(skip), - Reverse: reverse, + req := &Request{ + id: id, + sink: sink, + code: GetBlockHeadersMsg, + want: BlockHeadersMsg, + data: &GetBlockHeadersPacket66{ + RequestId: id, + GetBlockHeadersPacket: &GetBlockHeadersPacket{ + Origin: HashOrNumber{Hash: origin}, + Amount: uint64(amount), + Skip: uint64(skip), + Reverse: reverse, + }, }, - }) + } + if err := p.dispatchRequest(req); err != nil { + return nil, err + } + return req, nil } // RequestHeadersByNumber fetches a batch of blocks' headers corresponding to the // specified header query, based on the number of an origin block. -func (p *Peer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { +func (p *Peer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool, sink chan *Response) (*Request, error) { p.Log().Debug("Fetching batch of headers", "count", amount, "fromnum", origin, "skip", skip, "reverse", reverse) id := rand.Uint64() - requestTracker.Track(p.id, p.version, GetBlockHeadersMsg, BlockHeadersMsg, id) - return p2p.Send(p.rw, GetBlockHeadersMsg, &GetBlockHeadersPacket66{ - RequestId: id, - GetBlockHeadersPacket: &GetBlockHeadersPacket{ - Origin: HashOrNumber{Number: origin}, - Amount: uint64(amount), - Skip: uint64(skip), - Reverse: reverse, + req := &Request{ + id: id, + sink: sink, + code: GetBlockHeadersMsg, + want: BlockHeadersMsg, + data: &GetBlockHeadersPacket66{ + RequestId: id, + GetBlockHeadersPacket: &GetBlockHeadersPacket{ + Origin: HashOrNumber{Number: origin}, + Amount: uint64(amount), + Skip: uint64(skip), + Reverse: reverse, + }, }, - }) + } + if err := p.dispatchRequest(req); err != nil { + return nil, err + } + return req, nil } // RequestBodies fetches a batch of blocks' bodies corresponding to the hashes // specified. -func (p *Peer) RequestBodies(hashes []common.Hash) error { +func (p *Peer) RequestBodies(hashes []common.Hash, sink chan *Response) (*Request, error) { p.Log().Debug("Fetching batch of block bodies", "count", len(hashes)) id := rand.Uint64() - requestTracker.Track(p.id, p.version, GetBlockBodiesMsg, BlockBodiesMsg, id) - return p2p.Send(p.rw, GetBlockBodiesMsg, &GetBlockBodiesPacket66{ - RequestId: id, - GetBlockBodiesPacket: hashes, - }) + req := &Request{ + id: id, + sink: sink, + code: GetBlockBodiesMsg, + want: BlockBodiesMsg, + data: &GetBlockBodiesPacket66{ + RequestId: id, + GetBlockBodiesPacket: hashes, + }, + } + if err := p.dispatchRequest(req); err != nil { + return nil, err + } + return req, nil } // RequestNodeData fetches a batch of arbitrary data from a node's known state // data, corresponding to the specified hashes. -func (p *Peer) RequestNodeData(hashes []common.Hash) error { +func (p *Peer) RequestNodeData(hashes []common.Hash, sink chan *Response) (*Request, error) { p.Log().Debug("Fetching batch of state data", "count", len(hashes)) id := rand.Uint64() - requestTracker.Track(p.id, p.version, GetNodeDataMsg, NodeDataMsg, id) - return p2p.Send(p.rw, GetNodeDataMsg, &GetNodeDataPacket66{ - RequestId: id, - GetNodeDataPacket: hashes, - }) + req := &Request{ + id: id, + sink: sink, + code: GetNodeDataMsg, + want: NodeDataMsg, + data: &GetNodeDataPacket66{ + RequestId: id, + GetNodeDataPacket: hashes, + }, + } + if err := p.dispatchRequest(req); err != nil { + return nil, err + } + return req, nil } // RequestReceipts fetches a batch of transaction receipts from a remote node. -func (p *Peer) RequestReceipts(hashes []common.Hash) error { +func (p *Peer) RequestReceipts(hashes []common.Hash, sink chan *Response) (*Request, error) { p.Log().Debug("Fetching batch of receipts", "count", len(hashes)) id := rand.Uint64() - requestTracker.Track(p.id, p.version, GetReceiptsMsg, ReceiptsMsg, id) - return p2p.Send(p.rw, GetReceiptsMsg, &GetReceiptsPacket66{ - RequestId: id, - GetReceiptsPacket: hashes, - }) + req := &Request{ + id: id, + sink: sink, + code: GetReceiptsMsg, + want: ReceiptsMsg, + data: &GetReceiptsPacket66{ + RequestId: id, + GetReceiptsPacket: hashes, + }, + } + if err := p.dispatchRequest(req); err != nil { + return nil, err + } + return req, nil } // RequestTxs fetches a batch of transactions from a remote node. diff --git a/eth/protocols/eth/protocol.go b/eth/protocols/eth/protocol.go index 3c3da30fa5..a8420ad68c 100644 --- a/eth/protocols/eth/protocol.go +++ b/eth/protocols/eth/protocol.go @@ -175,6 +175,16 @@ type BlockHeadersPacket66 struct { BlockHeadersPacket } +// BlockHeadersRLPPacket represents a block header response, to use when we already +// have the headers rlp encoded. +type BlockHeadersRLPPacket []rlp.RawValue + +// BlockHeadersPacket represents a block header response over eth/66. +type BlockHeadersRLPPacket66 struct { + RequestId uint64 + BlockHeadersRLPPacket +} + // NewBlockPacket is the network packet for the block propagation message. type NewBlockPacket struct { Block *types.Block diff --git a/eth/protocols/snap/handler.go b/eth/protocols/snap/handler.go index c62f9cfca5..0a1ee2637f 100644 --- a/eth/protocols/snap/handler.go +++ b/eth/protocols/snap/handler.go @@ -99,8 +99,8 @@ func MakeProtocols(backend Backend, dnsdisc enode.Iterator) []p2p.Protocol { Version: version, Length: protocolLengths[version], Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - return backend.RunPeer(newPeer(version, p, rw), func(peer *Peer) error { - return handle(backend, peer) + return backend.RunPeer(NewPeer(version, p, rw), func(peer *Peer) error { + return Handle(backend, peer) }) }, NodeInfo: func() interface{} { @@ -116,21 +116,21 @@ func MakeProtocols(backend Backend, dnsdisc enode.Iterator) []p2p.Protocol { return protocols } -// handle is the callback invoked to manage the life cycle of a `snap` peer. +// Handle is the callback invoked to manage the life cycle of a `snap` peer. // When this function terminates, the peer is disconnected. -func handle(backend Backend, peer *Peer) error { +func Handle(backend Backend, peer *Peer) error { for { - if err := handleMessage(backend, peer); err != nil { + if err := HandleMessage(backend, peer); err != nil { peer.Log().Debug("Message handling failed in `snap`", "err", err) return err } } } -// handleMessage is invoked whenever an inbound message is received from a +// HandleMessage is invoked whenever an inbound message is received from a // remote peer on the `snap` protocol. The remote connection is torn down upon // returning any error. -func handleMessage(backend Backend, peer *Peer) error { +func HandleMessage(backend Backend, peer *Peer) error { // Read the next message from the remote peer, and ensure it's fully consumed msg, err := peer.rw.ReadMsg() if err != nil { @@ -161,60 +161,10 @@ func handleMessage(backend Backend, peer *Peer) error { if err := msg.Decode(&req); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - if req.Bytes > softResponseLimit { - req.Bytes = softResponseLimit - } - // Retrieve the requested state and bail out if non existent - tr, err := trie.New(req.Root, backend.Chain().StateCache().TrieDB()) - if err != nil { - return p2p.Send(peer.rw, AccountRangeMsg, &AccountRangePacket{ID: req.ID}) - } - it, err := backend.Chain().Snapshots().AccountIterator(req.Root, req.Origin) - if err != nil { - return p2p.Send(peer.rw, AccountRangeMsg, &AccountRangePacket{ID: req.ID}) - } - // Iterate over the requested range and pile accounts up - var ( - accounts []*AccountData - size uint64 - last common.Hash - ) - for it.Next() && size < req.Bytes { - hash, account := it.Hash(), common.CopyBytes(it.Account()) - - // Track the returned interval for the Merkle proofs - last = hash + // Service the request, potentially returning nothing in case of errors + accounts, proofs := ServiceGetAccountRangeQuery(backend.Chain(), &req) - // Assemble the reply item - size += uint64(common.HashLength + len(account)) - accounts = append(accounts, &AccountData{ - Hash: hash, - Body: account, - }) - // If we've exceeded the request threshold, abort - if bytes.Compare(hash[:], req.Limit[:]) >= 0 { - break - } - } - it.Release() - - // Generate the Merkle proofs for the first and last account - proof := light.NewNodeSet() - if err := tr.Prove(req.Origin[:], 0, proof); err != nil { - log.Warn("Failed to prove account range", "origin", req.Origin, "err", err) - return p2p.Send(peer.rw, AccountRangeMsg, &AccountRangePacket{ID: req.ID}) - } - if last != (common.Hash{}) { - if err := tr.Prove(last[:], 0, proof); err != nil { - log.Warn("Failed to prove account range", "last", last, "err", err) - return p2p.Send(peer.rw, AccountRangeMsg, &AccountRangePacket{ID: req.ID}) - } - } - var proofs [][]byte - for _, blob := range proof.NodeList() { - proofs = append(proofs, blob) - } - // Send back anything accumulated + // Send back anything accumulated (or empty in case of errors) return p2p.Send(peer.rw, AccountRangeMsg, &AccountRangePacket{ ID: req.ID, Accounts: accounts, @@ -243,111 +193,10 @@ func handleMessage(backend Backend, peer *Peer) error { if err := msg.Decode(&req); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - if req.Bytes > softResponseLimit { - req.Bytes = softResponseLimit - } - // TODO(karalabe): Do we want to enforce > 0 accounts and 1 account if origin is set? - // TODO(karalabe): - Logging locally is not ideal as remote faulst annoy the local user - // TODO(karalabe): - Dropping the remote peer is less flexible wrt client bugs (slow is better than non-functional) - - // Calculate the hard limit at which to abort, even if mid storage trie - hardLimit := uint64(float64(req.Bytes) * (1 + stateLookupSlack)) - - // Retrieve storage ranges until the packet limit is reached - var ( - slots [][]*StorageData - proofs [][]byte - size uint64 - ) - for _, account := range req.Accounts { - // If we've exceeded the requested data limit, abort without opening - // a new storage range (that we'd need to prove due to exceeded size) - if size >= req.Bytes { - break - } - // The first account might start from a different origin and end sooner - var origin common.Hash - if len(req.Origin) > 0 { - origin, req.Origin = common.BytesToHash(req.Origin), nil - } - var limit = common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") - if len(req.Limit) > 0 { - limit, req.Limit = common.BytesToHash(req.Limit), nil - } - // Retrieve the requested state and bail out if non existent - it, err := backend.Chain().Snapshots().StorageIterator(req.Root, account, origin) - if err != nil { - return p2p.Send(peer.rw, StorageRangesMsg, &StorageRangesPacket{ID: req.ID}) - } - // Iterate over the requested range and pile slots up - var ( - storage []*StorageData - last common.Hash - abort bool - ) - for it.Next() { - if size >= hardLimit { - abort = true - break - } - hash, slot := it.Hash(), common.CopyBytes(it.Slot()) - - // Track the returned interval for the Merkle proofs - last = hash + // Service the request, potentially returning nothing in case of errors + slots, proofs := ServiceGetStorageRangesQuery(backend.Chain(), &req) - // Assemble the reply item - size += uint64(common.HashLength + len(slot)) - storage = append(storage, &StorageData{ - Hash: hash, - Body: slot, - }) - // If we've exceeded the request threshold, abort - if bytes.Compare(hash[:], limit[:]) >= 0 { - break - } - } - slots = append(slots, storage) - it.Release() - - // Generate the Merkle proofs for the first and last storage slot, but - // only if the response was capped. If the entire storage trie included - // in the response, no need for any proofs. - if origin != (common.Hash{}) || abort { - // Request started at a non-zero hash or was capped prematurely, add - // the endpoint Merkle proofs - accTrie, err := trie.New(req.Root, backend.Chain().StateCache().TrieDB()) - if err != nil { - return p2p.Send(peer.rw, StorageRangesMsg, &StorageRangesPacket{ID: req.ID}) - } - var acc types.StateAccount - if err := rlp.DecodeBytes(accTrie.Get(account[:]), &acc); err != nil { - return p2p.Send(peer.rw, StorageRangesMsg, &StorageRangesPacket{ID: req.ID}) - } - stTrie, err := trie.New(acc.Root, backend.Chain().StateCache().TrieDB()) - if err != nil { - return p2p.Send(peer.rw, StorageRangesMsg, &StorageRangesPacket{ID: req.ID}) - } - proof := light.NewNodeSet() - if err := stTrie.Prove(origin[:], 0, proof); err != nil { - log.Warn("Failed to prove storage range", "origin", req.Origin, "err", err) - return p2p.Send(peer.rw, StorageRangesMsg, &StorageRangesPacket{ID: req.ID}) - } - if last != (common.Hash{}) { - if err := stTrie.Prove(last[:], 0, proof); err != nil { - log.Warn("Failed to prove storage range", "last", last, "err", err) - return p2p.Send(peer.rw, StorageRangesMsg, &StorageRangesPacket{ID: req.ID}) - } - } - for _, blob := range proof.NodeList() { - proofs = append(proofs, blob) - } - // Proof terminates the reply as proofs are only added if a node - // refuses to serve more data (exception when a contract fetch is - // finishing, but that's that). - break - } - } - // Send back anything accumulated + // Send back anything accumulated (or empty in case of errors) return p2p.Send(peer.rw, StorageRangesMsg, &StorageRangesPacket{ ID: req.ID, Slots: slots, @@ -378,31 +227,10 @@ func handleMessage(backend Backend, peer *Peer) error { if err := msg.Decode(&req); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - if req.Bytes > softResponseLimit { - req.Bytes = softResponseLimit - } - if len(req.Hashes) > maxCodeLookups { - req.Hashes = req.Hashes[:maxCodeLookups] - } - // Retrieve bytecodes until the packet size limit is reached - var ( - codes [][]byte - bytes uint64 - ) - for _, hash := range req.Hashes { - if hash == emptyCode { - // Peers should not request the empty code, but if they do, at - // least sent them back a correct response without db lookups - codes = append(codes, []byte{}) - } else if blob, err := backend.Chain().ContractCode(hash); err == nil { - codes = append(codes, blob) - bytes += uint64(len(blob)) - } - if bytes > req.Bytes { - break - } - } - // Send back anything accumulated + // Service the request, potentially returning nothing in case of errors + codes := ServiceGetByteCodesQuery(backend.Chain(), &req) + + // Send back anything accumulated (or empty in case of errors) return p2p.Send(peer.rw, ByteCodesMsg, &ByteCodesPacket{ ID: req.ID, Codes: codes, @@ -424,80 +252,12 @@ func handleMessage(backend Backend, peer *Peer) error { if err := msg.Decode(&req); err != nil { return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) } - if req.Bytes > softResponseLimit { - req.Bytes = softResponseLimit - } - // Make sure we have the state associated with the request - triedb := backend.Chain().StateCache().TrieDB() - - accTrie, err := trie.NewSecure(req.Root, triedb) + // Service the request, potentially returning nothing in case of errors + nodes, err := ServiceGetTrieNodesQuery(backend.Chain(), &req, start) if err != nil { - // We don't have the requested state available, bail out - return p2p.Send(peer.rw, TrieNodesMsg, &TrieNodesPacket{ID: req.ID}) - } - snap := backend.Chain().Snapshots().Snapshot(req.Root) - if snap == nil { - // We don't have the requested state snapshotted yet, bail out. - // In reality we could still serve using the account and storage - // tries only, but let's protect the node a bit while it's doing - // snapshot generation. - return p2p.Send(peer.rw, TrieNodesMsg, &TrieNodesPacket{ID: req.ID}) - } - // Retrieve trie nodes until the packet size limit is reached - var ( - nodes [][]byte - bytes uint64 - loads int // Trie hash expansions to cound database reads - ) - for _, pathset := range req.Paths { - switch len(pathset) { - case 0: - // Ensure we penalize invalid requests - return fmt.Errorf("%w: zero-item pathset requested", errBadRequest) - - case 1: - // If we're only retrieving an account trie node, fetch it directly - blob, resolved, err := accTrie.TryGetNode(pathset[0]) - loads += resolved // always account database reads, even for failures - if err != nil { - break - } - nodes = append(nodes, blob) - bytes += uint64(len(blob)) - - default: - // Storage slots requested, open the storage trie and retrieve from there - account, err := snap.Account(common.BytesToHash(pathset[0])) - loads++ // always account database reads, even for failures - if err != nil || account == nil { - break - } - stTrie, err := trie.NewSecure(common.BytesToHash(account.Root), triedb) - loads++ // always account database reads, even for failures - if err != nil { - break - } - for _, path := range pathset[1:] { - blob, resolved, err := stTrie.TryGetNode(path) - loads += resolved // always account database reads, even for failures - if err != nil { - break - } - nodes = append(nodes, blob) - bytes += uint64(len(blob)) - - // Sanity check limits to avoid DoS on the store trie loads - if bytes > req.Bytes || loads > maxTrieNodeLookups || time.Since(start) > maxTrieNodeTimeSpent { - break - } - } - } - // Abort request processing if we've exceeded our limits - if bytes > req.Bytes || loads > maxTrieNodeLookups || time.Since(start) > maxTrieNodeTimeSpent { - break - } + return err } - // Send back anything accumulated + // Send back anything accumulated (or empty in case of errors) return p2p.Send(peer.rw, TrieNodesMsg, &TrieNodesPacket{ ID: req.ID, Nodes: nodes, @@ -518,6 +278,282 @@ func handleMessage(backend Backend, peer *Peer) error { } } +// ServiceGetAccountRangeQuery assembles the response to an account range query. +// It is exposed to allow external packages to test protocol behavior. +func ServiceGetAccountRangeQuery(chain *core.BlockChain, req *GetAccountRangePacket) ([]*AccountData, [][]byte) { + if req.Bytes > softResponseLimit { + req.Bytes = softResponseLimit + } + // Retrieve the requested state and bail out if non existent + tr, err := trie.New(req.Root, chain.StateCache().TrieDB()) + if err != nil { + return nil, nil + } + it, err := chain.Snapshots().AccountIterator(req.Root, req.Origin) + if err != nil { + return nil, nil + } + // Iterate over the requested range and pile accounts up + var ( + accounts []*AccountData + size uint64 + last common.Hash + ) + for it.Next() && size < req.Bytes { + hash, account := it.Hash(), common.CopyBytes(it.Account()) + + // Track the returned interval for the Merkle proofs + last = hash + + // Assemble the reply item + size += uint64(common.HashLength + len(account)) + accounts = append(accounts, &AccountData{ + Hash: hash, + Body: account, + }) + // If we've exceeded the request threshold, abort + if bytes.Compare(hash[:], req.Limit[:]) >= 0 { + break + } + } + it.Release() + + // Generate the Merkle proofs for the first and last account + proof := light.NewNodeSet() + if err := tr.Prove(req.Origin[:], 0, proof); err != nil { + log.Warn("Failed to prove account range", "origin", req.Origin, "err", err) + return nil, nil + } + if last != (common.Hash{}) { + if err := tr.Prove(last[:], 0, proof); err != nil { + log.Warn("Failed to prove account range", "last", last, "err", err) + return nil, nil + } + } + var proofs [][]byte + for _, blob := range proof.NodeList() { + proofs = append(proofs, blob) + } + return accounts, proofs +} + +func ServiceGetStorageRangesQuery(chain *core.BlockChain, req *GetStorageRangesPacket) ([][]*StorageData, [][]byte) { + if req.Bytes > softResponseLimit { + req.Bytes = softResponseLimit + } + // TODO(karalabe): Do we want to enforce > 0 accounts and 1 account if origin is set? + // TODO(karalabe): - Logging locally is not ideal as remote faulst annoy the local user + // TODO(karalabe): - Dropping the remote peer is less flexible wrt client bugs (slow is better than non-functional) + + // Calculate the hard limit at which to abort, even if mid storage trie + hardLimit := uint64(float64(req.Bytes) * (1 + stateLookupSlack)) + + // Retrieve storage ranges until the packet limit is reached + var ( + slots [][]*StorageData + proofs [][]byte + size uint64 + ) + for _, account := range req.Accounts { + // If we've exceeded the requested data limit, abort without opening + // a new storage range (that we'd need to prove due to exceeded size) + if size >= req.Bytes { + break + } + // The first account might start from a different origin and end sooner + var origin common.Hash + if len(req.Origin) > 0 { + origin, req.Origin = common.BytesToHash(req.Origin), nil + } + var limit = common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") + if len(req.Limit) > 0 { + limit, req.Limit = common.BytesToHash(req.Limit), nil + } + // Retrieve the requested state and bail out if non existent + it, err := chain.Snapshots().StorageIterator(req.Root, account, origin) + if err != nil { + return nil, nil + } + // Iterate over the requested range and pile slots up + var ( + storage []*StorageData + last common.Hash + abort bool + ) + for it.Next() { + if size >= hardLimit { + abort = true + break + } + hash, slot := it.Hash(), common.CopyBytes(it.Slot()) + + // Track the returned interval for the Merkle proofs + last = hash + + // Assemble the reply item + size += uint64(common.HashLength + len(slot)) + storage = append(storage, &StorageData{ + Hash: hash, + Body: slot, + }) + // If we've exceeded the request threshold, abort + if bytes.Compare(hash[:], limit[:]) >= 0 { + break + } + } + slots = append(slots, storage) + it.Release() + + // Generate the Merkle proofs for the first and last storage slot, but + // only if the response was capped. If the entire storage trie included + // in the response, no need for any proofs. + if origin != (common.Hash{}) || abort { + // Request started at a non-zero hash or was capped prematurely, add + // the endpoint Merkle proofs + accTrie, err := trie.New(req.Root, chain.StateCache().TrieDB()) + if err != nil { + return nil, nil + } + var acc types.StateAccount + if err := rlp.DecodeBytes(accTrie.Get(account[:]), &acc); err != nil { + return nil, nil + } + stTrie, err := trie.New(acc.Root, chain.StateCache().TrieDB()) + if err != nil { + return nil, nil + } + proof := light.NewNodeSet() + if err := stTrie.Prove(origin[:], 0, proof); err != nil { + log.Warn("Failed to prove storage range", "origin", req.Origin, "err", err) + return nil, nil + } + if last != (common.Hash{}) { + if err := stTrie.Prove(last[:], 0, proof); err != nil { + log.Warn("Failed to prove storage range", "last", last, "err", err) + return nil, nil + } + } + for _, blob := range proof.NodeList() { + proofs = append(proofs, blob) + } + // Proof terminates the reply as proofs are only added if a node + // refuses to serve more data (exception when a contract fetch is + // finishing, but that's that). + break + } + } + return slots, proofs +} + +// ServiceGetByteCodesQuery assembles the response to a byte codes query. +// It is exposed to allow external packages to test protocol behavior. +func ServiceGetByteCodesQuery(chain *core.BlockChain, req *GetByteCodesPacket) [][]byte { + if req.Bytes > softResponseLimit { + req.Bytes = softResponseLimit + } + if len(req.Hashes) > maxCodeLookups { + req.Hashes = req.Hashes[:maxCodeLookups] + } + // Retrieve bytecodes until the packet size limit is reached + var ( + codes [][]byte + bytes uint64 + ) + for _, hash := range req.Hashes { + if hash == emptyCode { + // Peers should not request the empty code, but if they do, at + // least sent them back a correct response without db lookups + codes = append(codes, []byte{}) + } else if blob, err := chain.ContractCode(hash); err == nil { + codes = append(codes, blob) + bytes += uint64(len(blob)) + } + if bytes > req.Bytes { + break + } + } + return codes +} + +// ServiceGetTrieNodesQuery assembles the response to a trie nodes query. +// It is exposed to allow external packages to test protocol behavior. +func ServiceGetTrieNodesQuery(chain *core.BlockChain, req *GetTrieNodesPacket, start time.Time) ([][]byte, error) { + if req.Bytes > softResponseLimit { + req.Bytes = softResponseLimit + } + // Make sure we have the state associated with the request + triedb := chain.StateCache().TrieDB() + + accTrie, err := trie.NewSecure(req.Root, triedb) + if err != nil { + // We don't have the requested state available, bail out + return nil, nil + } + snap := chain.Snapshots().Snapshot(req.Root) + if snap == nil { + // We don't have the requested state snapshotted yet, bail out. + // In reality we could still serve using the account and storage + // tries only, but let's protect the node a bit while it's doing + // snapshot generation. + return nil, nil + } + // Retrieve trie nodes until the packet size limit is reached + var ( + nodes [][]byte + bytes uint64 + loads int // Trie hash expansions to cound database reads + ) + for _, pathset := range req.Paths { + switch len(pathset) { + case 0: + // Ensure we penalize invalid requests + return nil, fmt.Errorf("%w: zero-item pathset requested", errBadRequest) + + case 1: + // If we're only retrieving an account trie node, fetch it directly + blob, resolved, err := accTrie.TryGetNode(pathset[0]) + loads += resolved // always account database reads, even for failures + if err != nil { + break + } + nodes = append(nodes, blob) + bytes += uint64(len(blob)) + + default: + // Storage slots requested, open the storage trie and retrieve from there + account, err := snap.Account(common.BytesToHash(pathset[0])) + loads++ // always account database reads, even for failures + if err != nil || account == nil { + break + } + stTrie, err := trie.NewSecure(common.BytesToHash(account.Root), triedb) + loads++ // always account database reads, even for failures + if err != nil { + break + } + for _, path := range pathset[1:] { + blob, resolved, err := stTrie.TryGetNode(path) + loads += resolved // always account database reads, even for failures + if err != nil { + break + } + nodes = append(nodes, blob) + bytes += uint64(len(blob)) + + // Sanity check limits to avoid DoS on the store trie loads + if bytes > req.Bytes || loads > maxTrieNodeLookups || time.Since(start) > maxTrieNodeTimeSpent { + break + } + } + } + // Abort request processing if we've exceeded our limits + if bytes > req.Bytes || loads > maxTrieNodeLookups || time.Since(start) > maxTrieNodeTimeSpent { + break + } + } + return nodes, nil +} + // NodeInfo represents a short summary of the `snap` sub-protocol metadata // known about the host peer. type NodeInfo struct{} diff --git a/eth/protocols/snap/peer.go b/eth/protocols/snap/peer.go index cf0ce65bd7..87a62d2f8a 100644 --- a/eth/protocols/snap/peer.go +++ b/eth/protocols/snap/peer.go @@ -33,9 +33,9 @@ type Peer struct { logger log.Logger // Contextual logger with the peer id injected } -// newPeer create a wrapper for a network connection and negotiated protocol +// NewPeer create a wrapper for a network connection and negotiated protocol // version. -func newPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter) *Peer { +func NewPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter) *Peer { id := p.ID().String() return &Peer{ id: id, @@ -46,6 +46,16 @@ func newPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter) *Peer { } } +// NewFakePeer create a fake snap peer without a backing p2p peer, for testing purposes. +func NewFakePeer(version uint, id string, rw p2p.MsgReadWriter) *Peer { + return &Peer{ + id: id, + rw: rw, + version: version, + logger: log.New("peer", id[:8]), + } +} + // ID retrieves the peer's unique identifier. func (p *Peer) ID() string { return p.id diff --git a/eth/protocols/snap/protocol.go b/eth/protocols/snap/protocol.go index 5528e9212e..60a254f396 100644 --- a/eth/protocols/snap/protocol.go +++ b/eth/protocols/snap/protocol.go @@ -27,7 +27,7 @@ import ( // Constants to match up protocol versions and messages const ( - snap1 = 1 + SNAP1 = 1 ) // ProtocolName is the official short name of the `snap` protocol used during @@ -36,11 +36,11 @@ const ProtocolName = "snap" // ProtocolVersions are the supported versions of the `snap` protocol (first // is primary). -var ProtocolVersions = []uint{snap1} +var ProtocolVersions = []uint{SNAP1} // protocolLengths are the number of implemented message corresponding to // different protocol versions. -var protocolLengths = map[uint]uint64{snap1: 8} +var protocolLengths = map[uint]uint64{SNAP1: 8} // maxMessageSize is the maximum cap on the size of a protocol message. const maxMessageSize = 10 * 1024 * 1024 diff --git a/eth/protocols/snap/sync.go b/eth/protocols/snap/sync.go index 9ef9d75711..be8644a5a4 100644 --- a/eth/protocols/snap/sync.go +++ b/eth/protocols/snap/sync.go @@ -325,10 +325,10 @@ type healTask struct { codeTasks map[common.Hash]struct{} // Set of byte code tasks currently queued for retrieval } -// syncProgress is a database entry to allow suspending and resuming a snapshot state +// SyncProgress is a database entry to allow suspending and resuming a snapshot state // sync. Opposed to full and fast sync, there is no way to restart a suspended // snap sync without prior knowledge of the suspension point. -type syncProgress struct { +type SyncProgress struct { Tasks []*accountTask // The suspended account tasks (contract tasks within) // Status report during syncing phase @@ -342,12 +342,15 @@ type syncProgress struct { // Status report during healing phase TrienodeHealSynced uint64 // Number of state trie nodes downloaded TrienodeHealBytes common.StorageSize // Number of state trie bytes persisted to disk - TrienodeHealDups uint64 // Number of state trie nodes already processed - TrienodeHealNops uint64 // Number of state trie nodes not requested BytecodeHealSynced uint64 // Number of bytecodes downloaded BytecodeHealBytes common.StorageSize // Number of bytecodes persisted to disk - BytecodeHealDups uint64 // Number of bytecodes already processed - BytecodeHealNops uint64 // Number of bytecodes not requested +} + +// SyncPending is analogous to SyncProgress, but it's used to report on pending +// ephemeral sync progress that doesn't get persisted into the database. +type SyncPending struct { + TrienodeHeal uint64 // Number of state trie nodes pending + BytecodeHeal uint64 // Number of bytecodes pending } // SyncPeer abstracts out the methods required for a peer to be synced against @@ -543,7 +546,7 @@ func (s *Syncer) Sync(root common.Hash, cancel chan struct{}) error { s.lock.Lock() s.root = root s.healer = &healTask{ - scheduler: state.NewStateSync(root, s.db, nil, s.onHealState), + scheduler: state.NewStateSync(root, s.db, s.onHealState), trieTasks: make(map[common.Hash]trie.SyncPath), codeTasks: make(map[common.Hash]struct{}), } @@ -671,7 +674,7 @@ func (s *Syncer) Sync(root common.Hash, cancel chan struct{}) error { // loadSyncStatus retrieves a previously aborted sync status from the database, // or generates a fresh one if none is available. func (s *Syncer) loadSyncStatus() { - var progress syncProgress + var progress SyncProgress if status := rawdb.ReadSnapshotSyncStatus(s.db); status != nil { if err := json.Unmarshal(status, &progress); err != nil { @@ -775,7 +778,7 @@ func (s *Syncer) saveSyncStatus() { } } // Store the actual progress markers - progress := &syncProgress{ + progress := &SyncProgress{ Tasks: s.tasks, AccountSynced: s.accountSynced, AccountBytes: s.accountBytes, @@ -795,6 +798,31 @@ func (s *Syncer) saveSyncStatus() { rawdb.WriteSnapshotSyncStatus(s.db, status) } +// Progress returns the snap sync status statistics. +func (s *Syncer) Progress() (*SyncProgress, *SyncPending) { + s.lock.Lock() + defer s.lock.Unlock() + + progress := &SyncProgress{ + AccountSynced: s.accountSynced, + AccountBytes: s.accountBytes, + BytecodeSynced: s.bytecodeSynced, + BytecodeBytes: s.bytecodeBytes, + StorageSynced: s.storageSynced, + StorageBytes: s.storageBytes, + TrienodeHealSynced: s.trienodeHealSynced, + TrienodeHealBytes: s.trienodeHealBytes, + BytecodeHealSynced: s.bytecodeHealSynced, + BytecodeHealBytes: s.bytecodeHealBytes, + } + pending := new(SyncPending) + if s.healer != nil { + pending.TrienodeHeal = uint64(len(s.healer.trieTasks)) + pending.BytecodeHeal = uint64(len(s.healer.codeTasks)) + } + return progress, pending +} + // cleanAccountTasks removes account range retrieval tasks that have already been // completed. func (s *Syncer) cleanAccountTasks() { diff --git a/eth/state_accessor.go b/eth/state_accessor.go index ca2002b60d..f01db93a67 100644 --- a/eth/state_accessor.go +++ b/eth/state_accessor.go @@ -30,12 +30,22 @@ import ( "github.com/ethereum/go-ethereum/trie" ) -// stateAtBlock retrieves the state database associated with a certain block. +// StateAtBlock retrieves the state database associated with a certain block. // If no state is locally available for the given block, a number of blocks // are attempted to be reexecuted to generate the desired state. The optional // base layer statedb can be passed then it's regarded as the statedb of the // parent block. -func (eth *Ethereum) stateAtBlock(block *types.Block, reexec uint64, base *state.StateDB, checkLive bool) (statedb *state.StateDB, err error) { +// Parameters: +// - block: The block for which we want the state (== state at the stateRoot of the parent) +// - reexec: The maximum number of blocks to reprocess trying to obtain the desired state +// - base: If the caller is tracing multiple blocks, the caller can provide the parent state +// continuously from the callsite. +// - checklive: if true, then the live 'blockchain' state database is used. If the caller want to +// perform Commit or other 'save-to-disk' changes, this should be set to false to avoid +// storing trash persistently +// - preferDisk: this arg can be used by the caller to signal that even though the 'base' is provided, +// it would be preferrable to start from a fresh state, if we have it on disk. +func (eth *Ethereum) StateAtBlock(block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (statedb *state.StateDB, err error) { var ( current *types.Block database state.Database @@ -50,6 +60,15 @@ func (eth *Ethereum) stateAtBlock(block *types.Block, reexec uint64, base *state } } if base != nil { + if preferDisk { + // Create an ephemeral trie.Database for isolating the live one. Otherwise + // the internal junks created by tracing will be persisted into the disk. + database = state.NewDatabaseWithConfig(eth.chainDb, &trie.Config{Cache: 16}) + if statedb, err = state.New(block.Root(), database, nil); err == nil { + log.Info("Found disk backend for state trie", "root", block.Root(), "number", block.Number()) + return statedb, nil + } + } // The optional base statedb is given, mark the start point as parent block statedb, database, report = base, base.Database(), false current = eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1) @@ -152,7 +171,7 @@ func (eth *Ethereum) stateAtTransaction(block *types.Block, txIndex int, reexec } // Lookup the statedb of parent block from the live database, // otherwise regenerate it on the flight. - statedb, err := eth.stateAtBlock(parent, reexec, nil, true) + statedb, err := eth.StateAtBlock(parent, reexec, nil, true, false) if err != nil { return nil, vm.BlockContext{}, nil, err } diff --git a/eth/sync.go b/eth/sync.go index aaac6bef90..b8ac67d3b2 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -145,7 +145,10 @@ func (cs *chainSyncer) nextSyncOp() *chainSyncOp { if cs.doneCh != nil { return nil // Sync already running. } - + // Disable the td based sync trigger after the transition + if cs.handler.merger.TDDReached() { + return nil + } // Ensure we're at minimum peer count. minPeers := defaultMinSyncPeers if cs.forced { @@ -162,10 +165,7 @@ func (cs *chainSyncer) nextSyncOp() *chainSyncOp { return nil } mode, ourTD := cs.modeAndLocalHead() - if mode == downloader.FastSync && atomic.LoadUint32(&cs.handler.snapSync) == 1 { - // Fast sync via the snap protocol - mode = downloader.SnapSync - } + op := peerToSyncOp(mode, peer) if op.td.Cmp(ourTD) <= 0 { return nil // We're in sync. @@ -179,19 +179,19 @@ func peerToSyncOp(mode downloader.SyncMode, p *eth.Peer) *chainSyncOp { } func (cs *chainSyncer) modeAndLocalHead() (downloader.SyncMode, *big.Int) { - // If we're in fast sync mode, return that directly - if atomic.LoadUint32(&cs.handler.fastSync) == 1 { + // If we're in snap sync mode, return that directly + if atomic.LoadUint32(&cs.handler.snapSync) == 1 { block := cs.handler.chain.CurrentFastBlock() td := cs.handler.chain.GetTd(block.Hash(), block.NumberU64()) - return downloader.FastSync, td + return downloader.SnapSync, td } // We are probably in full sync, but we might have rewound to before the - // fast sync pivot, check if we should reenable + // snap sync pivot, check if we should reenable if pivot := rawdb.ReadLastPivotNumber(cs.handler.database); pivot != nil { if head := cs.handler.chain.CurrentBlock(); head.NumberU64() < *pivot { block := cs.handler.chain.CurrentFastBlock() td := cs.handler.chain.GetTd(block.Hash(), block.NumberU64()) - return downloader.FastSync, td + return downloader.SnapSync, td } } // Nope, we're really full syncing @@ -208,15 +208,15 @@ func (cs *chainSyncer) startSync(op *chainSyncOp) { // doSync synchronizes the local blockchain with a remote peer. func (h *handler) doSync(op *chainSyncOp) error { - if op.mode == downloader.FastSync || op.mode == downloader.SnapSync { - // Before launch the fast sync, we have to ensure user uses the same + if op.mode == downloader.SnapSync { + // Before launch the snap sync, we have to ensure user uses the same // txlookup limit. - // The main concern here is: during the fast sync Geth won't index the + // The main concern here is: during the snap sync Geth won't index the // block(generate tx indices) before the HEAD-limit. But if user changes - // the limit in the next fast sync(e.g. user kill Geth manually and + // the limit in the next snap sync(e.g. user kill Geth manually and // restart) then it will be hard for Geth to figure out the oldest block // has been indexed. So here for the user-experience wise, it's non-optimal - // that user can't change limit during the fast sync. If changed, Geth + // that user can't change limit during the snap sync. If changed, Geth // will just blindly use the original one. limit := h.chain.TxLookupLimit() if stored := rawdb.ReadFastTxLookupLimit(h.database); stored == nil { @@ -226,15 +226,11 @@ func (h *handler) doSync(op *chainSyncOp) error { log.Warn("Update txLookup limit", "provided", limit, "updated", *stored) } } - // Run the sync cycle, and disable fast sync if we're past the pivot block + // Run the sync cycle, and disable snap sync if we're past the pivot block err := h.downloader.Synchronise(op.peer.ID(), op.head, op.td, op.mode) if err != nil { return err } - if atomic.LoadUint32(&h.fastSync) == 1 { - log.Info("Fast sync complete, auto disabling") - atomic.StoreUint32(&h.fastSync, 0) - } if atomic.LoadUint32(&h.snapSync) == 1 { log.Info("Snap sync complete, auto disabling") atomic.StoreUint32(&h.snapSync, 0) diff --git a/eth/sync_test.go b/eth/sync_test.go index e96b9ee81f..929a2a9d18 100644 --- a/eth/sync_test.go +++ b/eth/sync_test.go @@ -23,57 +23,74 @@ import ( "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" ) -// Tests that fast sync is disabled after a successful sync cycle. -func TestFastSyncDisabling66(t *testing.T) { testFastSyncDisabling(t, eth.ETH66) } +// Tests that snap sync is disabled after a successful sync cycle. +func TestSnapSyncDisabling66(t *testing.T) { testSnapSyncDisabling(t, eth.ETH66, snap.SNAP1) } -// Tests that fast sync gets disabled as soon as a real block is successfully +// Tests that snap sync gets disabled as soon as a real block is successfully // imported into the blockchain. -func testFastSyncDisabling(t *testing.T, protocol uint) { +func testSnapSyncDisabling(t *testing.T, ethVer uint, snapVer uint) { t.Parallel() - // Create an empty handler and ensure it's in fast sync mode + // Create an empty handler and ensure it's in snap sync mode empty := newTestHandler() - if atomic.LoadUint32(&empty.handler.fastSync) == 0 { - t.Fatalf("fast sync disabled on pristine blockchain") + if atomic.LoadUint32(&empty.handler.snapSync) == 0 { + t.Fatalf("snap sync disabled on pristine blockchain") } defer empty.close() - // Create a full handler and ensure fast sync ends up disabled + // Create a full handler and ensure snap sync ends up disabled full := newTestHandlerWithBlocks(1024) - if atomic.LoadUint32(&full.handler.fastSync) == 1 { - t.Fatalf("fast sync not disabled on non-empty blockchain") + if atomic.LoadUint32(&full.handler.snapSync) == 1 { + t.Fatalf("snap sync not disabled on non-empty blockchain") } defer full.close() - // Sync up the two handlers - emptyPipe, fullPipe := p2p.MsgPipe() - defer emptyPipe.Close() - defer fullPipe.Close() + // Sync up the two handlers via both `eth` and `snap` + caps := []p2p.Cap{{Name: "eth", Version: ethVer}, {Name: "snap", Version: snapVer}} - emptyPeer := eth.NewPeer(protocol, p2p.NewPeer(enode.ID{1}, "", nil), emptyPipe, empty.txpool) - fullPeer := eth.NewPeer(protocol, p2p.NewPeer(enode.ID{2}, "", nil), fullPipe, full.txpool) - defer emptyPeer.Close() - defer fullPeer.Close() + emptyPipeEth, fullPipeEth := p2p.MsgPipe() + defer emptyPipeEth.Close() + defer fullPipeEth.Close() - go empty.handler.runEthPeer(emptyPeer, func(peer *eth.Peer) error { + emptyPeerEth := eth.NewPeer(ethVer, p2p.NewPeer(enode.ID{1}, "", caps), emptyPipeEth, empty.txpool) + fullPeerEth := eth.NewPeer(ethVer, p2p.NewPeer(enode.ID{2}, "", caps), fullPipeEth, full.txpool) + defer emptyPeerEth.Close() + defer fullPeerEth.Close() + + go empty.handler.runEthPeer(emptyPeerEth, func(peer *eth.Peer) error { return eth.Handle((*ethHandler)(empty.handler), peer) }) - go full.handler.runEthPeer(fullPeer, func(peer *eth.Peer) error { + go full.handler.runEthPeer(fullPeerEth, func(peer *eth.Peer) error { return eth.Handle((*ethHandler)(full.handler), peer) }) + + emptyPipeSnap, fullPipeSnap := p2p.MsgPipe() + defer emptyPipeSnap.Close() + defer fullPipeSnap.Close() + + emptyPeerSnap := snap.NewPeer(snapVer, p2p.NewPeer(enode.ID{1}, "", caps), emptyPipeSnap) + fullPeerSnap := snap.NewPeer(snapVer, p2p.NewPeer(enode.ID{2}, "", caps), fullPipeSnap) + + go empty.handler.runSnapExtension(emptyPeerSnap, func(peer *snap.Peer) error { + return snap.Handle((*snapHandler)(empty.handler), peer) + }) + go full.handler.runSnapExtension(fullPeerSnap, func(peer *snap.Peer) error { + return snap.Handle((*snapHandler)(full.handler), peer) + }) // Wait a bit for the above handlers to start time.Sleep(250 * time.Millisecond) - // Check that fast sync was disabled - op := peerToSyncOp(downloader.FastSync, empty.handler.peers.peerWithHighestTD()) + // Check that snap sync was disabled + op := peerToSyncOp(downloader.SnapSync, empty.handler.peers.peerWithHighestTD()) if err := empty.handler.doSync(op); err != nil { t.Fatal("sync failed:", err) } - if atomic.LoadUint32(&empty.handler.fastSync) == 1 { - t.Fatalf("fast sync not disabled after successful synchronisation") + if atomic.LoadUint32(&empty.handler.snapSync) == 1 { + t.Fatalf("snap sync not disabled after successful synchronisation") } } diff --git a/eth/tracers/api.go b/eth/tracers/api.go index aee3f68280..5f88629a70 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -36,6 +36,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" @@ -53,6 +54,13 @@ const ( // and reexecute to produce missing historical state necessary to run a specific // trace. defaultTraceReexec = uint64(128) + + // defaultTracechainMemLimit is the size of the triedb, at which traceChain + // switches over and tries to use a disk-backed database instead of building + // on top of memory. + // For non-archive nodes, this limit _will_ be overblown, as disk-backed tries + // will only be found every ~15K blocks or so. + defaultTracechainMemLimit = common.StorageSize(500 * 1024 * 1024) ) // Backend interface provides the common API services (that are provided by @@ -67,7 +75,10 @@ type Backend interface { ChainConfig() *params.ChainConfig Engine() consensus.Engine ChainDb() ethdb.Database - StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive bool) (*state.StateDB, error) + // StateAtBlock returns the state corresponding to the stateroot of the block. + // N.B: For executing transactions on block N, the required stateRoot is block N-1, + // so this method should be called with the parent. + StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive, preferDisk bool) (*state.StateDB, error) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (core.Message, vm.BlockContext, *state.StateDB, error) } @@ -155,7 +166,7 @@ func (api *API) blockByNumberAndHash(ctx context.Context, number rpc.BlockNumber // TraceConfig holds extra parameters to trace functions. type TraceConfig struct { - *vm.LogConfig + *logger.Config Tracer *string Timeout *string Reexec *uint64 @@ -164,7 +175,7 @@ type TraceConfig struct { // TraceCallConfig is the config for traceCall API. It holds one more // field to override the state for tracing. type TraceCallConfig struct { - *vm.LogConfig + *logger.Config Tracer *string Timeout *string Reexec *uint64 @@ -173,7 +184,7 @@ type TraceCallConfig struct { // StdTraceConfig holds extra parameters to standard-json trace functions. type StdTraceConfig struct { - vm.LogConfig + logger.Config Reexec *uint64 TxHash common.Hash } @@ -320,6 +331,7 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config } close(results) }() + var preferDisk bool // Feed all the blocks both into the tracer, as well as fast process concurrently for number = start.NumberU64(); number < end.NumberU64(); number++ { // Stop tracing if interruption was requested @@ -349,18 +361,24 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config } // Prepare the statedb for tracing. Don't use the live database for // tracing to avoid persisting state junks into the database. - statedb, err = api.backend.StateAtBlock(localctx, block, reexec, statedb, false) + statedb, err = api.backend.StateAtBlock(localctx, block, reexec, statedb, false, preferDisk) if err != nil { failed = err break } - if statedb.Database().TrieDB() != nil { + if trieDb := statedb.Database().TrieDB(); trieDb != nil { // Hold the reference for tracer, will be released at the final stage - statedb.Database().TrieDB().Reference(block.Root(), common.Hash{}) + trieDb.Reference(block.Root(), common.Hash{}) // Release the parent state because it's already held by the tracer if parent != (common.Hash{}) { - statedb.Database().TrieDB().Dereference(parent) + trieDb.Dereference(parent) + } + // Prefer disk if the trie db memory grows too much + s1, s2 := trieDb.Size() + if !preferDisk && (s1+s2) > defaultTracechainMemLimit { + log.Info("Switching to prefer-disk mode for tracing", "size", s1+s2) + preferDisk = true } } parent = block.Root() @@ -496,7 +514,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config if config != nil && config.Reexec != nil { reexec = *config.Reexec } - statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true) + statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true, false) if err != nil { return nil, err } @@ -557,7 +575,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac if config != nil && config.Reexec != nil { reexec = *config.Reexec } - statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true) + statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true, false) if err != nil { return nil, err } @@ -646,17 +664,17 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block if config != nil && config.Reexec != nil { reexec = *config.Reexec } - statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true) + statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true, false) if err != nil { return nil, err } // Retrieve the tracing configurations, or use default values var ( - logConfig vm.LogConfig + logConfig logger.Config txHash common.Hash ) if config != nil { - logConfig = config.LogConfig + logConfig = config.Config txHash = config.TxHash } logConfig.Debug = true @@ -681,7 +699,7 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block chainConfigCopy := new(params.ChainConfig) *chainConfigCopy = *chainConfig chainConfig = chainConfigCopy - if berlin := config.LogConfig.Overrides.BerlinBlock; berlin != nil { + if berlin := config.Config.Overrides.BerlinBlock; berlin != nil { chainConfig.BerlinBlock = berlin canon = false } @@ -713,7 +731,7 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block writer = bufio.NewWriter(dump) vmConf = vm.Config{ Debug: true, - Tracer: vm.NewJSONLogger(&logConfig, writer), + Tracer: logger.NewJSONLogger(&logConfig, writer), EnablePreimageRecording: true, } } @@ -820,7 +838,7 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc if config != nil && config.Reexec != nil { reexec = *config.Reexec } - statedb, err := api.backend.StateAtBlock(ctx, block, reexec, nil, true) + statedb, err := api.backend.StateAtBlock(ctx, block, reexec, nil, true, false) if err != nil { return nil, err } @@ -840,10 +858,10 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc var traceConfig *TraceConfig if config != nil { traceConfig = &TraceConfig{ - LogConfig: config.LogConfig, - Tracer: config.Tracer, - Timeout: config.Timeout, - Reexec: config.Reexec, + Config: config.Config, + Tracer: config.Tracer, + Timeout: config.Timeout, + Reexec: config.Reexec, } } return api.traceTx(ctx, msg, new(Context), vmctx, statedb, traceConfig) @@ -855,12 +873,14 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Context, vmctx vm.BlockContext, statedb *state.StateDB, config *TraceConfig) (interface{}, error) { // Assemble the structured logger or the JavaScript tracer var ( - tracer vm.Tracer + tracer vm.EVMLogger err error txContext = core.NewEVMTxContext(message) ) switch { - case config != nil && config.Tracer != nil: + case config == nil: + tracer = logger.NewStructLogger(nil) + case config.Tracer != nil: // Define a meaningful timeout of a single transaction trace timeout := defaultTraceTimeout if config.Timeout != nil { @@ -868,25 +888,21 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex return nil, err } } - // Construct the JavaScript tracer to execute with - if tracer, err = New(*config.Tracer, txctx); err != nil { + if t, err := New(*config.Tracer, txctx); err != nil { return nil, err + } else { + deadlineCtx, cancel := context.WithTimeout(ctx, timeout) + go func() { + <-deadlineCtx.Done() + if errors.Is(deadlineCtx.Err(), context.DeadlineExceeded) { + t.Stop(errors.New("execution timeout")) + } + }() + defer cancel() + tracer = t } - // Handle timeouts and RPC cancellations - deadlineCtx, cancel := context.WithTimeout(ctx, timeout) - go func() { - <-deadlineCtx.Done() - if deadlineCtx.Err() == context.DeadlineExceeded { - tracer.(*Tracer).Stop(errors.New("execution timeout")) - } - }() - defer cancel() - - case config == nil: - tracer = vm.NewStructLogger(nil) - default: - tracer = vm.NewStructLogger(config.LogConfig) + tracer = logger.NewStructLogger(config.Config) } // Run the transaction with tracing enabled. vmenv := vm.NewEVM(vmctx, txContext, statedb, api.backend.ChainConfig(), vm.Config{Debug: true, Tracer: tracer, NoBaseFee: true}) @@ -901,7 +917,7 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex // Depending on the tracer type, format and return the output. switch tracer := tracer.(type) { - case *vm.StructLogger: + case *logger.StructLogger: // If the result contains a revert reason, return it. returnVal := fmt.Sprintf("%x", result.Return()) if len(result.Revert()) > 0 { @@ -914,7 +930,7 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex StructLogs: ethapi.FormatLogs(tracer.StructLogs()), }, nil - case *Tracer: + case Tracer: return tracer.GetResult() default: diff --git a/eth/tracers/api_test.go b/eth/tracers/api_test.go index 9afd59d596..a3c0a72494 100644 --- a/eth/tracers/api_test.go +++ b/eth/tracers/api_test.go @@ -138,7 +138,7 @@ func (b *testBackend) ChainDb() ethdb.Database { return b.chaindb } -func (b *testBackend) StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive bool) (*state.StateDB, error) { +func (b *testBackend) StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (*state.StateDB, error) { statedb, err := b.chain.StateAt(block.Root()) if err != nil { return nil, errStateNotFound @@ -306,147 +306,6 @@ func TestTraceCall(t *testing.T) { } } -func TestOverriddenTraceCall(t *testing.T) { - t.Parallel() - - // Initialize test accounts - accounts := newAccounts(3) - genesis := &core.Genesis{Alloc: core.GenesisAlloc{ - accounts[0].addr: {Balance: big.NewInt(params.Ether)}, - accounts[1].addr: {Balance: big.NewInt(params.Ether)}, - accounts[2].addr: {Balance: big.NewInt(params.Ether)}, - }} - genBlocks := 10 - signer := types.HomesteadSigner{} - api := NewAPI(newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) { - // Transfer from account[0] to account[1] - // value: 1000 wei - // fee: 0 wei - tx, _ := types.SignTx(types.NewTransaction(uint64(i), accounts[1].addr, big.NewInt(1000), params.TxGas, b.BaseFee(), nil), signer, accounts[0].key) - b.AddTx(tx) - })) - randomAccounts, tracer := newAccounts(3), "callTracer" - - var testSuite = []struct { - blockNumber rpc.BlockNumber - call ethapi.TransactionArgs - config *TraceCallConfig - expectErr error - expect *callTrace - }{ - // Succcessful call with state overriding - { - blockNumber: rpc.PendingBlockNumber, - call: ethapi.TransactionArgs{ - From: &randomAccounts[0].addr, - To: &randomAccounts[1].addr, - Value: (*hexutil.Big)(big.NewInt(1000)), - }, - config: &TraceCallConfig{ - Tracer: &tracer, - StateOverrides: ðapi.StateOverride{ - randomAccounts[0].addr: ethapi.OverrideAccount{Balance: newRPCBalance(new(big.Int).Mul(big.NewInt(1), big.NewInt(params.Ether)))}, - }, - }, - expectErr: nil, - expect: &callTrace{ - Type: "CALL", - From: randomAccounts[0].addr, - To: randomAccounts[1].addr, - Gas: newRPCUint64(24979000), - GasUsed: newRPCUint64(0), - Value: (*hexutil.Big)(big.NewInt(1000)), - }, - }, - // Invalid call without state overriding - { - blockNumber: rpc.PendingBlockNumber, - call: ethapi.TransactionArgs{ - From: &randomAccounts[0].addr, - To: &randomAccounts[1].addr, - Value: (*hexutil.Big)(big.NewInt(1000)), - }, - config: &TraceCallConfig{ - Tracer: &tracer, - }, - expectErr: core.ErrInsufficientFunds, - expect: nil, - }, - // Successful simple contract call - // - // // SPDX-License-Identifier: GPL-3.0 - // - // pragma solidity >=0.7.0 <0.8.0; - // - // /** - // * @title Storage - // * @dev Store & retrieve value in a variable - // */ - // contract Storage { - // uint256 public number; - // constructor() { - // number = block.number; - // } - // } - { - blockNumber: rpc.PendingBlockNumber, - call: ethapi.TransactionArgs{ - From: &randomAccounts[0].addr, - To: &randomAccounts[2].addr, - Data: newRPCBytes(common.Hex2Bytes("8381f58a")), // call number() - }, - config: &TraceCallConfig{ - Tracer: &tracer, - StateOverrides: ðapi.StateOverride{ - randomAccounts[2].addr: ethapi.OverrideAccount{ - Code: newRPCBytes(common.Hex2Bytes("6080604052348015600f57600080fd5b506004361060285760003560e01c80638381f58a14602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b6000548156fea2646970667358221220eab35ffa6ab2adfe380772a48b8ba78e82a1b820a18fcb6f59aa4efb20a5f60064736f6c63430007040033")), - StateDiff: newStates([]common.Hash{{}}, []common.Hash{common.BigToHash(big.NewInt(123))}), - }, - }, - }, - expectErr: nil, - expect: &callTrace{ - Type: "CALL", - From: randomAccounts[0].addr, - To: randomAccounts[2].addr, - Input: hexutil.Bytes(common.Hex2Bytes("8381f58a")), - Output: hexutil.Bytes(common.BigToHash(big.NewInt(123)).Bytes()), - Gas: newRPCUint64(24978936), - GasUsed: newRPCUint64(2283), - Value: (*hexutil.Big)(big.NewInt(0)), - }, - }, - } - for i, testspec := range testSuite { - result, err := api.TraceCall(context.Background(), testspec.call, rpc.BlockNumberOrHash{BlockNumber: &testspec.blockNumber}, testspec.config) - if testspec.expectErr != nil { - if err == nil { - t.Errorf("test %d: want error %v, have nothing", i, testspec.expectErr) - continue - } - if !errors.Is(err, testspec.expectErr) { - t.Errorf("test %d: error mismatch, want %v, have %v", i, testspec.expectErr, err) - } - } else { - if err != nil { - t.Errorf("test %d: want no error, have %v", i, err) - continue - } - ret := new(callTrace) - if err := json.Unmarshal(result.(json.RawMessage), ret); err != nil { - t.Fatalf("test %d: failed to unmarshal trace result: %v", i, err) - } - if !jsonEqual(ret, testspec.expect) { - // uncomment this for easier debugging - //have, _ := json.MarshalIndent(ret, "", " ") - //want, _ := json.MarshalIndent(testspec.expect, "", " ") - //t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", string(have), string(want)) - t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, testspec.expect) - } - } - } -} - func TestTraceTransaction(t *testing.T) { t.Parallel() @@ -503,90 +362,177 @@ func TestTraceBlock(t *testing.T) { var testSuite = []struct { blockNumber rpc.BlockNumber config *TraceConfig - expect interface{} + want string expectErr error }{ // Trace genesis block, expect error { blockNumber: rpc.BlockNumber(0), - config: nil, - expect: nil, expectErr: errors.New("genesis is not traceable"), }, // Trace head block { blockNumber: rpc.BlockNumber(genBlocks), - config: nil, - expectErr: nil, - expect: []*txTraceResult{ - { - Result: ðapi.ExecutionResult{ - Gas: params.TxGas, - Failed: false, - ReturnValue: "", - StructLogs: []ethapi.StructLogRes{}, - }, - }, - }, + want: `[{"result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}]`, }, // Trace non-existent block { blockNumber: rpc.BlockNumber(genBlocks + 1), - config: nil, expectErr: fmt.Errorf("block #%d not found", genBlocks+1), - expect: nil, }, // Trace latest block { blockNumber: rpc.LatestBlockNumber, - config: nil, - expectErr: nil, - expect: []*txTraceResult{ - { - Result: ðapi.ExecutionResult{ - Gas: params.TxGas, - Failed: false, - ReturnValue: "", - StructLogs: []ethapi.StructLogRes{}, - }, + want: `[{"result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}]`, + }, + // Trace pending block + { + blockNumber: rpc.PendingBlockNumber, + want: `[{"result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}]`, + }, + } + for i, tc := range testSuite { + result, err := api.TraceBlockByNumber(context.Background(), tc.blockNumber, tc.config) + if tc.expectErr != nil { + if err == nil { + t.Errorf("test %d, want error %v", i, tc.expectErr) + continue + } + if !reflect.DeepEqual(err, tc.expectErr) { + t.Errorf("test %d: error mismatch, want %v, get %v", i, tc.expectErr, err) + } + continue + } + if err != nil { + t.Errorf("test %d, want no error, have %v", i, err) + continue + } + have, _ := json.Marshal(result) + want := tc.want + if string(have) != want { + t.Errorf("test %d, result mismatch, have\n%v\n, want\n%v\n", i, string(have), want) + } + } +} + +func TestTracingWithOverrides(t *testing.T) { + t.Parallel() + // Initialize test accounts + accounts := newAccounts(3) + genesis := &core.Genesis{Alloc: core.GenesisAlloc{ + accounts[0].addr: {Balance: big.NewInt(params.Ether)}, + accounts[1].addr: {Balance: big.NewInt(params.Ether)}, + accounts[2].addr: {Balance: big.NewInt(params.Ether)}, + }} + genBlocks := 10 + signer := types.HomesteadSigner{} + api := NewAPI(newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) { + // Transfer from account[0] to account[1] + // value: 1000 wei + // fee: 0 wei + tx, _ := types.SignTx(types.NewTransaction(uint64(i), accounts[1].addr, big.NewInt(1000), params.TxGas, b.BaseFee(), nil), signer, accounts[0].key) + b.AddTx(tx) + })) + randomAccounts := newAccounts(3) + type res struct { + Gas int + Failed bool + returnValue string + } + var testSuite = []struct { + blockNumber rpc.BlockNumber + call ethapi.TransactionArgs + config *TraceCallConfig + expectErr error + want string + }{ + // Call which can only succeed if state is state overridden + { + blockNumber: rpc.PendingBlockNumber, + call: ethapi.TransactionArgs{ + From: &randomAccounts[0].addr, + To: &randomAccounts[1].addr, + Value: (*hexutil.Big)(big.NewInt(1000)), + }, + config: &TraceCallConfig{ + StateOverrides: ðapi.StateOverride{ + randomAccounts[0].addr: ethapi.OverrideAccount{Balance: newRPCBalance(new(big.Int).Mul(big.NewInt(1), big.NewInt(params.Ether)))}, }, }, + want: `{"gas":21000,"failed":false,"returnValue":""}`, }, - // Trace pending block + // Invalid call without state overriding { blockNumber: rpc.PendingBlockNumber, - config: nil, - expectErr: nil, - expect: []*txTraceResult{ - { - Result: ðapi.ExecutionResult{ - Gas: params.TxGas, - Failed: false, - ReturnValue: "", - StructLogs: []ethapi.StructLogRes{}, + call: ethapi.TransactionArgs{ + From: &randomAccounts[0].addr, + To: &randomAccounts[1].addr, + Value: (*hexutil.Big)(big.NewInt(1000)), + }, + config: &TraceCallConfig{}, + expectErr: core.ErrInsufficientFunds, + }, + // Successful simple contract call + // + // // SPDX-License-Identifier: GPL-3.0 + // + // pragma solidity >=0.7.0 <0.8.0; + // + // /** + // * @title Storage + // * @dev Store & retrieve value in a variable + // */ + // contract Storage { + // uint256 public number; + // constructor() { + // number = block.number; + // } + // } + { + blockNumber: rpc.PendingBlockNumber, + call: ethapi.TransactionArgs{ + From: &randomAccounts[0].addr, + To: &randomAccounts[2].addr, + Data: newRPCBytes(common.Hex2Bytes("8381f58a")), // call number() + }, + config: &TraceCallConfig{ + //Tracer: &tracer, + StateOverrides: ðapi.StateOverride{ + randomAccounts[2].addr: ethapi.OverrideAccount{ + Code: newRPCBytes(common.Hex2Bytes("6080604052348015600f57600080fd5b506004361060285760003560e01c80638381f58a14602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b6000548156fea2646970667358221220eab35ffa6ab2adfe380772a48b8ba78e82a1b820a18fcb6f59aa4efb20a5f60064736f6c63430007040033")), + StateDiff: newStates([]common.Hash{{}}, []common.Hash{common.BigToHash(big.NewInt(123))}), }, }, }, + want: `{"gas":23347,"failed":false,"returnValue":"000000000000000000000000000000000000000000000000000000000000007b"}`, }, } - for _, testspec := range testSuite { - result, err := api.TraceBlockByNumber(context.Background(), testspec.blockNumber, testspec.config) - if testspec.expectErr != nil { + for i, tc := range testSuite { + result, err := api.TraceCall(context.Background(), tc.call, rpc.BlockNumberOrHash{BlockNumber: &tc.blockNumber}, tc.config) + if tc.expectErr != nil { if err == nil { - t.Errorf("Expect error %v, get nothing", testspec.expectErr) - continue - } - if !reflect.DeepEqual(err, testspec.expectErr) { - t.Errorf("Error mismatch, want %v, get %v", testspec.expectErr, err) - } - } else { - if err != nil { - t.Errorf("Expect no error, get %v", err) + t.Errorf("test %d: want error %v, have nothing", i, tc.expectErr) continue } - if !reflect.DeepEqual(result, testspec.expect) { - t.Errorf("Result mismatch, want %v, get %v", testspec.expect, result) + if !errors.Is(err, tc.expectErr) { + t.Errorf("test %d: error mismatch, want %v, have %v", i, tc.expectErr, err) } + continue + } + if err != nil { + t.Errorf("test %d: want no error, have %v", i, err) + continue + } + // Turn result into res-struct + var ( + have res + want res + ) + resBytes, _ := json.Marshal(result) + json.Unmarshal(resBytes, &have) + json.Unmarshal([]byte(tc.want), &want) + if !reflect.DeepEqual(have, want) { + t.Errorf("test %d, result mismatch, have\n%v\n, want\n%v\n", i, string(resBytes), want) } } } @@ -617,11 +563,6 @@ func newRPCBalance(balance *big.Int) **hexutil.Big { return &rpcBalance } -func newRPCUint64(number uint64) *hexutil.Uint64 { - rpcUint64 := hexutil.Uint64(number) - return &rpcUint64 -} - func newRPCBytes(bytes []byte) *hexutil.Bytes { rpcBytes := hexutil.Bytes(bytes) return &rpcBytes diff --git a/eth/tracers/internal/tracers/4byte_tracer.js b/eth/tracers/internal/tracers/4byte_tracer.js deleted file mode 100644 index 9ec3209f8b..0000000000 --- a/eth/tracers/internal/tracers/4byte_tracer.js +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2017 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 . - -// 4byteTracer searches for 4byte-identifiers, and collects them for post-processing. -// It collects the methods identifiers along with the size of the supplied data, so -// a reversed signature can be matched against the size of the data. -// -// Example: -// > debug.traceTransaction( "0x214e597e35da083692f5386141e69f47e973b2c56e7a8073b1ea08fd7571e9de", {tracer: "4byteTracer"}) -// { -// 0x27dc297e-128: 1, -// 0x38cc4831-0: 2, -// 0x524f3889-96: 1, -// 0xadf59f99-288: 1, -// 0xc281d19e-0: 1 -// } -{ - // ids aggregates the 4byte ids found. - ids : {}, - - // store save the given indentifier and datasize. - store: function(id, size){ - var key = "" + toHex(id) + "-" + size; - this.ids[key] = this.ids[key] + 1 || 1; - }, - - enter: function(frame) { - // Skip any pre-compile invocations, those are just fancy opcodes - if (isPrecompiled(frame.getTo())) { - return; - } - var input = frame.getInput() - if (input.length >= 4) { - this.store(slice(input, 0, 4), input.length - 4); - } - }, - - exit: function(frameResult) {}, - - // fault is invoked when the actual execution of an opcode fails. - fault: function(log, db) {}, - - // result is invoked when all the opcodes have been iterated over and returns - // the final result of the tracing. - result: function(ctx) { - // Save the outer calldata also - if (ctx.input.length >= 4) { - this.store(slice(ctx.input, 0, 4), ctx.input.length-4) - } - return this.ids; - }, -} diff --git a/eth/tracers/internal/tracetest/calltrace_test.go b/eth/tracers/internal/tracetest/calltrace_test.go new file mode 100644 index 0000000000..7521a98f24 --- /dev/null +++ b/eth/tracers/internal/tracetest/calltrace_test.go @@ -0,0 +1,394 @@ +// Copyright 2021 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 . + +package tracetest + +import ( + "encoding/json" + "io/ioutil" + "math/big" + "path/filepath" + "reflect" + "strings" + "testing" + "unicode" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "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/eth/tracers" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/tests" + + // Force-load native and js pacakges, to trigger registration + _ "github.com/ethereum/go-ethereum/eth/tracers/js" + _ "github.com/ethereum/go-ethereum/eth/tracers/native" +) + +// To generate a new callTracer test, copy paste the makeTest method below into +// a Geth console and call it with a transaction hash you which to export. + +/* +// makeTest generates a callTracer test by running a prestate reassembled and a +// call trace run, assembling all the gathered information into a test case. +var makeTest = function(tx, rewind) { + // Generate the genesis block from the block, transaction and prestate data + var block = eth.getBlock(eth.getTransaction(tx).blockHash); + var genesis = eth.getBlock(block.parentHash); + + delete genesis.gasUsed; + delete genesis.logsBloom; + delete genesis.parentHash; + delete genesis.receiptsRoot; + delete genesis.sha3Uncles; + delete genesis.size; + delete genesis.transactions; + delete genesis.transactionsRoot; + delete genesis.uncles; + + genesis.gasLimit = genesis.gasLimit.toString(); + genesis.number = genesis.number.toString(); + genesis.timestamp = genesis.timestamp.toString(); + + genesis.alloc = debug.traceTransaction(tx, {tracer: "prestateTracer", rewind: rewind}); + for (var key in genesis.alloc) { + genesis.alloc[key].nonce = genesis.alloc[key].nonce.toString(); + } + genesis.config = admin.nodeInfo.protocols.eth.config; + + // Generate the call trace and produce the test input + var result = debug.traceTransaction(tx, {tracer: "callTracer", rewind: rewind}); + delete result.time; + + console.log(JSON.stringify({ + genesis: genesis, + context: { + number: block.number.toString(), + difficulty: block.difficulty, + timestamp: block.timestamp.toString(), + gasLimit: block.gasLimit.toString(), + miner: block.miner, + }, + input: eth.getRawTransaction(tx), + result: result, + }, null, 2)); +} +*/ + +type callContext struct { + Number math.HexOrDecimal64 `json:"number"` + Difficulty *math.HexOrDecimal256 `json:"difficulty"` + Time math.HexOrDecimal64 `json:"timestamp"` + GasLimit math.HexOrDecimal64 `json:"gasLimit"` + Miner common.Address `json:"miner"` +} + +// callTrace is the result of a callTracer run. +type callTrace struct { + Type string `json:"type"` + From common.Address `json:"from"` + To common.Address `json:"to"` + Input hexutil.Bytes `json:"input"` + Output hexutil.Bytes `json:"output"` + Gas *hexutil.Uint64 `json:"gas,omitempty"` + GasUsed *hexutil.Uint64 `json:"gasUsed,omitempty"` + Value *hexutil.Big `json:"value,omitempty"` + Error string `json:"error,omitempty"` + Calls []callTrace `json:"calls,omitempty"` +} + +// callTracerTest defines a single test to check the call tracer against. +type callTracerTest struct { + Genesis *core.Genesis `json:"genesis"` + Context *callContext `json:"context"` + Input string `json:"input"` + Result *callTrace `json:"result"` +} + +// Iterates over all the input-output datasets in the tracer test harness and +// runs the JavaScript tracers against them. +func TestCallTracerLegacy(t *testing.T) { + testCallTracer("callTracerLegacy", "call_tracer_legacy", t) +} + +func TestCallTracerJs(t *testing.T) { + testCallTracer("callTracerJs", "call_tracer", t) +} + +func TestCallTracerNative(t *testing.T) { + testCallTracer("callTracer", "call_tracer", t) +} + +func testCallTracer(tracerName string, dirPath string, t *testing.T) { + files, err := ioutil.ReadDir(filepath.Join("testdata", dirPath)) + if err != nil { + t.Fatalf("failed to retrieve tracer test suite: %v", err) + } + for _, file := range files { + if !strings.HasSuffix(file.Name(), ".json") { + continue + } + file := file // capture range variable + t.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(t *testing.T) { + t.Parallel() + + var ( + test = new(callTracerTest) + tx = new(types.Transaction) + ) + // Call tracer test found, read if from disk + if blob, err := ioutil.ReadFile(filepath.Join("testdata", dirPath, file.Name())); err != nil { + t.Fatalf("failed to read testcase: %v", err) + } else if err := json.Unmarshal(blob, test); err != nil { + t.Fatalf("failed to parse testcase: %v", err) + } + if err := rlp.DecodeBytes(common.FromHex(test.Input), tx); err != nil { + t.Fatalf("failed to parse testcase input: %v", err) + } + // Configure a blockchain with the given prestate + var ( + signer = types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number))) + origin, _ = signer.Sender(tx) + txContext = vm.TxContext{ + Origin: origin, + GasPrice: tx.GasPrice(), + } + context = vm.BlockContext{ + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + Coinbase: test.Context.Miner, + BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)), + Time: new(big.Int).SetUint64(uint64(test.Context.Time)), + Difficulty: (*big.Int)(test.Context.Difficulty), + GasLimit: uint64(test.Context.GasLimit), + } + _, statedb = tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false) + ) + tracer, err := tracers.New(tracerName, new(tracers.Context)) + if err != nil { + t.Fatalf("failed to create call tracer: %v", err) + } + evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Debug: true, Tracer: tracer}) + msg, err := tx.AsMessage(signer, nil) + if err != nil { + t.Fatalf("failed to prepare transaction for tracing: %v", err) + } + st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas())) + if _, err = st.TransitionDb(); err != nil { + t.Fatalf("failed to execute transaction: %v", err) + } + // Retrieve the trace result and compare against the etalon + res, err := tracer.GetResult() + if err != nil { + t.Fatalf("failed to retrieve trace result: %v", err) + } + ret := new(callTrace) + if err := json.Unmarshal(res, ret); err != nil { + t.Fatalf("failed to unmarshal trace result: %v", err) + } + + if !jsonEqual(ret, test.Result) { + // uncomment this for easier debugging + //have, _ := json.MarshalIndent(ret, "", " ") + //want, _ := json.MarshalIndent(test.Result, "", " ") + //t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", string(have), string(want)) + t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result) + } + }) + } +} + +// jsonEqual is similar to reflect.DeepEqual, but does a 'bounce' via json prior to +// comparison +func jsonEqual(x, y interface{}) bool { + xTrace := new(callTrace) + yTrace := new(callTrace) + if xj, err := json.Marshal(x); err == nil { + json.Unmarshal(xj, xTrace) + } else { + return false + } + if yj, err := json.Marshal(y); err == nil { + json.Unmarshal(yj, yTrace) + } else { + return false + } + return reflect.DeepEqual(xTrace, yTrace) +} + +// camel converts a snake cased input string into a camel cased output. +func camel(str string) string { + pieces := strings.Split(str, "_") + for i := 1; i < len(pieces); i++ { + pieces[i] = string(unicode.ToUpper(rune(pieces[i][0]))) + pieces[i][1:] + } + return strings.Join(pieces, "") +} +func BenchmarkTracers(b *testing.B) { + files, err := ioutil.ReadDir(filepath.Join("testdata", "call_tracer")) + if err != nil { + b.Fatalf("failed to retrieve tracer test suite: %v", err) + } + for _, file := range files { + if !strings.HasSuffix(file.Name(), ".json") { + continue + } + file := file // capture range variable + b.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(b *testing.B) { + blob, err := ioutil.ReadFile(filepath.Join("testdata", "call_tracer", file.Name())) + if err != nil { + b.Fatalf("failed to read testcase: %v", err) + } + test := new(callTracerTest) + if err := json.Unmarshal(blob, test); err != nil { + b.Fatalf("failed to parse testcase: %v", err) + } + benchTracer("callTracerNative", test, b) + }) + } +} + +func benchTracer(tracerName string, test *callTracerTest, b *testing.B) { + // Configure a blockchain with the given prestate + tx := new(types.Transaction) + if err := rlp.DecodeBytes(common.FromHex(test.Input), tx); err != nil { + b.Fatalf("failed to parse testcase input: %v", err) + } + signer := types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number))) + msg, err := tx.AsMessage(signer, nil) + if err != nil { + b.Fatalf("failed to prepare transaction for tracing: %v", err) + } + origin, _ := signer.Sender(tx) + txContext := vm.TxContext{ + Origin: origin, + GasPrice: tx.GasPrice(), + } + context := vm.BlockContext{ + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + Coinbase: test.Context.Miner, + BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)), + Time: new(big.Int).SetUint64(uint64(test.Context.Time)), + Difficulty: (*big.Int)(test.Context.Difficulty), + GasLimit: uint64(test.Context.GasLimit), + } + _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + tracer, err := tracers.New(tracerName, new(tracers.Context)) + if err != nil { + b.Fatalf("failed to create call tracer: %v", err) + } + evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Debug: true, Tracer: tracer}) + snap := statedb.Snapshot() + st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas())) + if _, err = st.TransitionDb(); err != nil { + b.Fatalf("failed to execute transaction: %v", err) + } + if _, err = tracer.GetResult(); err != nil { + b.Fatal(err) + } + statedb.RevertToSnapshot(snap) + } +} + +// TestZeroValueToNotExitCall tests the calltracer(s) on the following: +// Tx to A, A calls B with zero value. B does not already exist. +// Expected: that enter/exit is invoked and the inner call is shown in the result +func TestZeroValueToNotExitCall(t *testing.T) { + var to = common.HexToAddress("0x00000000000000000000000000000000deadbeef") + privkey, err := crypto.HexToECDSA("0000000000000000deadbeef00000000000000000000000000000000deadbeef") + if err != nil { + t.Fatalf("err %v", err) + } + signer := types.NewEIP155Signer(big.NewInt(1)) + tx, err := types.SignNewTx(privkey, signer, &types.LegacyTx{ + GasPrice: big.NewInt(0), + Gas: 50000, + To: &to, + }) + if err != nil { + t.Fatalf("err %v", err) + } + origin, _ := signer.Sender(tx) + txContext := vm.TxContext{ + Origin: origin, + GasPrice: big.NewInt(1), + } + context := vm.BlockContext{ + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + Coinbase: common.Address{}, + BlockNumber: new(big.Int).SetUint64(8000000), + Time: new(big.Int).SetUint64(5), + Difficulty: big.NewInt(0x30000), + GasLimit: uint64(6000000), + } + var code = []byte{ + byte(vm.PUSH1), 0x0, byte(vm.DUP1), byte(vm.DUP1), byte(vm.DUP1), // in and outs zero + byte(vm.DUP1), byte(vm.PUSH1), 0xff, byte(vm.GAS), // value=0,address=0xff, gas=GAS + byte(vm.CALL), + } + var alloc = core.GenesisAlloc{ + to: core.GenesisAccount{ + Nonce: 1, + Code: code, + }, + origin: core.GenesisAccount{ + Nonce: 0, + Balance: big.NewInt(500000000000000), + }, + } + _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), alloc, false) + // Create the tracer, the EVM environment and run it + tracer, err := tracers.New("callTracer", nil) + if err != nil { + t.Fatalf("failed to create call tracer: %v", err) + } + evm := vm.NewEVM(context, txContext, statedb, params.MainnetChainConfig, vm.Config{Debug: true, Tracer: tracer}) + msg, err := tx.AsMessage(signer, nil) + if err != nil { + t.Fatalf("failed to prepare transaction for tracing: %v", err) + } + st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas())) + if _, err = st.TransitionDb(); err != nil { + t.Fatalf("failed to execute transaction: %v", err) + } + // Retrieve the trace result and compare against the etalon + res, err := tracer.GetResult() + if err != nil { + t.Fatalf("failed to retrieve trace result: %v", err) + } + have := new(callTrace) + if err := json.Unmarshal(res, have); err != nil { + t.Fatalf("failed to unmarshal trace result: %v", err) + } + wantStr := `{"type":"CALL","from":"0x682a80a6f560eec50d54e63cbeda1c324c5f8d1b","to":"0x00000000000000000000000000000000deadbeef","value":"0x0","gas":"0x7148","gasUsed":"0x2d0","input":"0x","output":"0x","calls":[{"type":"CALL","from":"0x00000000000000000000000000000000deadbeef","to":"0x00000000000000000000000000000000000000ff","value":"0x0","gas":"0x6cbf","gasUsed":"0x0","input":"0x","output":"0x"}]}` + want := new(callTrace) + json.Unmarshal([]byte(wantStr), want) + if !jsonEqual(have, want) { + t.Error("have != want") + } +} diff --git a/eth/tracers/testdata/call_tracer/create.json b/eth/tracers/internal/tracetest/testdata/call_tracer/create.json similarity index 100% rename from eth/tracers/testdata/call_tracer/create.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/create.json diff --git a/eth/tracers/testdata/call_tracer/deep_calls.json b/eth/tracers/internal/tracetest/testdata/call_tracer/deep_calls.json similarity index 100% rename from eth/tracers/testdata/call_tracer/deep_calls.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/deep_calls.json diff --git a/eth/tracers/testdata/call_tracer/delegatecall.json b/eth/tracers/internal/tracetest/testdata/call_tracer/delegatecall.json similarity index 100% rename from eth/tracers/testdata/call_tracer/delegatecall.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/delegatecall.json diff --git a/eth/tracers/testdata/call_tracer/inner_create_oog_outer_throw.json b/eth/tracers/internal/tracetest/testdata/call_tracer/inner_create_oog_outer_throw.json similarity index 100% rename from eth/tracers/testdata/call_tracer/inner_create_oog_outer_throw.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/inner_create_oog_outer_throw.json diff --git a/eth/tracers/testdata/call_tracer/inner_instafail.json b/eth/tracers/internal/tracetest/testdata/call_tracer/inner_instafail.json similarity index 100% rename from eth/tracers/testdata/call_tracer/inner_instafail.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/inner_instafail.json diff --git a/eth/tracers/testdata/call_tracer/inner_throw_outer_revert.json b/eth/tracers/internal/tracetest/testdata/call_tracer/inner_throw_outer_revert.json similarity index 99% rename from eth/tracers/testdata/call_tracer/inner_throw_outer_revert.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/inner_throw_outer_revert.json index 7627c8c23d..ec2ceb426f 100644 --- a/eth/tracers/testdata/call_tracer/inner_throw_outer_revert.json +++ b/eth/tracers/internal/tracetest/testdata/call_tracer/inner_throw_outer_revert.json @@ -59,7 +59,7 @@ "result": { "calls": [ { - "error": "invalid opcode: opcode 0xfe not defined", + "error": "invalid opcode: INVALID", "from": "0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76", "gas": "0x75fe3", "gasUsed": "0x75fe3", diff --git a/eth/tracers/testdata/call_tracer/oog.json b/eth/tracers/internal/tracetest/testdata/call_tracer/oog.json similarity index 100% rename from eth/tracers/testdata/call_tracer/oog.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/oog.json diff --git a/eth/tracers/testdata/call_tracer/revert.json b/eth/tracers/internal/tracetest/testdata/call_tracer/revert.json similarity index 100% rename from eth/tracers/testdata/call_tracer/revert.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/revert.json diff --git a/eth/tracers/testdata/call_tracer/revert_reason.json b/eth/tracers/internal/tracetest/testdata/call_tracer/revert_reason.json similarity index 100% rename from eth/tracers/testdata/call_tracer/revert_reason.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/revert_reason.json diff --git a/eth/tracers/testdata/call_tracer/selfdestruct.json b/eth/tracers/internal/tracetest/testdata/call_tracer/selfdestruct.json similarity index 100% rename from eth/tracers/testdata/call_tracer/selfdestruct.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/selfdestruct.json diff --git a/eth/tracers/testdata/call_tracer/simple.json b/eth/tracers/internal/tracetest/testdata/call_tracer/simple.json similarity index 100% rename from eth/tracers/testdata/call_tracer/simple.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/simple.json diff --git a/eth/tracers/testdata/call_tracer/throw.json b/eth/tracers/internal/tracetest/testdata/call_tracer/throw.json similarity index 100% rename from eth/tracers/testdata/call_tracer/throw.json rename to eth/tracers/internal/tracetest/testdata/call_tracer/throw.json diff --git a/eth/tracers/testdata/call_tracer_legacy/create.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/create.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/create.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/create.json diff --git a/eth/tracers/testdata/call_tracer_legacy/deep_calls.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/deep_calls.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/deep_calls.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/deep_calls.json diff --git a/eth/tracers/testdata/call_tracer_legacy/delegatecall.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/delegatecall.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/delegatecall.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/delegatecall.json diff --git a/eth/tracers/testdata/call_tracer_legacy/inner_create_oog_outer_throw.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_create_oog_outer_throw.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/inner_create_oog_outer_throw.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_create_oog_outer_throw.json diff --git a/eth/tracers/testdata/call_tracer_legacy/inner_instafail.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_instafail.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/inner_instafail.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_instafail.json diff --git a/eth/tracers/testdata/call_tracer_legacy/inner_throw_outer_revert.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_throw_outer_revert.json similarity index 99% rename from eth/tracers/testdata/call_tracer_legacy/inner_throw_outer_revert.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_throw_outer_revert.json index 7627c8c23d..ec2ceb426f 100644 --- a/eth/tracers/testdata/call_tracer_legacy/inner_throw_outer_revert.json +++ b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/inner_throw_outer_revert.json @@ -59,7 +59,7 @@ "result": { "calls": [ { - "error": "invalid opcode: opcode 0xfe not defined", + "error": "invalid opcode: INVALID", "from": "0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76", "gas": "0x75fe3", "gasUsed": "0x75fe3", diff --git a/eth/tracers/testdata/call_tracer_legacy/oog.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/oog.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/oog.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/oog.json diff --git a/eth/tracers/testdata/call_tracer_legacy/revert.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/revert.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/revert.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/revert.json diff --git a/eth/tracers/testdata/call_tracer_legacy/revert_reason.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/revert_reason.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/revert_reason.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/revert_reason.json diff --git a/eth/tracers/testdata/call_tracer_legacy/selfdestruct.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/selfdestruct.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/selfdestruct.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/selfdestruct.json diff --git a/eth/tracers/testdata/call_tracer_legacy/simple.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/simple.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/simple.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/simple.json diff --git a/eth/tracers/testdata/call_tracer_legacy/throw.json b/eth/tracers/internal/tracetest/testdata/call_tracer_legacy/throw.json similarity index 100% rename from eth/tracers/testdata/call_tracer_legacy/throw.json rename to eth/tracers/internal/tracetest/testdata/call_tracer_legacy/throw.json diff --git a/eth/tracers/tracer.go b/eth/tracers/js/bigint.go similarity index 50% rename from eth/tracers/tracer.go rename to eth/tracers/js/bigint.go index ed56004533..9aeb330420 100644 --- a/eth/tracers/tracer.go +++ b/eth/tracers/js/bigint.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2021 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 @@ -14,856 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package tracers - -import ( - "encoding/json" - "errors" - "fmt" - "math/big" - "sync/atomic" - "time" - "unsafe" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "gopkg.in/olebedev/go-duktape.v3" -) +package js // bigIntegerJS is the minified version of https://github.com/peterolson/BigInteger.js. const bigIntegerJS = `var bigInt=function(undefined){"use strict";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),LOG_MAX_INT=Math.log(MAX_INT);function Integer(v,radix){if(typeof v==="undefined")return Integer[0];if(typeof radix!=="undefined")return+radix===10?parseValue(v):parseBase(v,radix);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i=base?1:0;r[i]=sum-carry*base}while(i0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value==="number"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;ib_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);var a=self.value,b=n.value;var quotient;if(b===0)throw new Error("Cannot divide by zero");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(absb.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);var value=n.value;if(value===0)return false;if(value===1)return true;if(value===2)return this.isEven();return this.mod(n).equals(Integer[0])};SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(25))return true}BigInteger.prototype.isPrime=function(){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs(),nPrev=n.prev();var a=[2,3,5,7,11,13,17,19],b=nPrev,d,t,i,x;while(b.isEven())b=b.divide(2);for(i=0;i-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return(typeof n==="number"||typeof n==="string")&&+Math.abs(n)<=BASE||n instanceof BigInteger&&n.value.length<=1}BigInteger.prototype.shiftLeft=function(n){if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftRight(-n);var result=this;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(n){var remQuo;if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v==="number"?v|LOBMASK_I:v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=Math.min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b){a=parseValue(a);b=parseValue(b);var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(Math.random()*range));var length=range.value.length-1;var result=[],restricted=true;for(var i=length;i>=0;i--){var top=restricted?range.value[i]:BASE;var digit=truncate(Math.random()*top);result.unshift(digit);if(digit=absBase){if(c==="1"&&absBase===1)continue;throw new Error(c+" is not a valid digit in base "+base+".")}else if(c.charCodeAt(0)-87>=absBase){throw new Error(c+" is not a valid digit in base "+base+".")}}}if(2<=base&&base<=36){if(length<=LOG_MAX_INT/Math.log(base)){var result=parseInt(text,base);if(isNaN(result)){throw new Error(c+" is not a valid digit in base "+base+".")}return new SmallInteger(parseInt(text,base))}}base=parseValue(base);var digits=[];var isNegative=text[0]==="-";for(i=isNegative?1:0;i");digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+" is not a valid character")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit){var v=digit.value;if(typeof v==="number")v=[v];if(v.length===1&&v[0]<=35){return"0123456789abcdefghijklmnopqrstuvwxyz".charAt(v[0])}return"<"+v+">"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return"0";throw new Error("Cannot convert nonzero numbers to base 0.")}if(base.equals(-1)){if(n.isZero())return"0";if(n.isNegative())return new Array(1-n).join("10");return"1"+new Array(+n).join("01")}var minusSign="";if(n.isNegative()&&base.isPositive()){minusSign="-";n=n.abs()}if(base.equals(1)){if(n.isZero())return"0";return minusSign+new Array(+n+1).join(1)}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(stringify(digit))}out.push(stringify(left));return minusSign+out.reverse().join("")}BigInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!==10)return toBase(this,radix);var v=this.value,l=v.length,str=String(v[--l]),zeros="0000000",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?"-":"";return sign+str};SmallInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!=10)return toBase(this,radix);return String(this.value)};BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return+this.toString()};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return new SmallInteger(x);throw"Invalid integer: "+v}var sign=v[0]==="-";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error("Invalid integer: "+split.join("e"));if(split.length===2){var exp=split[1];if(exp[0]==="+")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error("Invalid integer: "+exp+" is not a valid exponent.");var text=split[0];var decimalPlace=text.indexOf(".");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error("Cannot include negative exponent part for integers");text+=new Array(exp+1).join("0");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error("Invalid integer: "+v);var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+" is not an integer.");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v==="number"){return parseNumberValue(v)}if(typeof v==="string"){return parseStringValue(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=new SmallInteger(i);if(i>0)Integer[-i]=new SmallInteger(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!=="undefined"&&module.hasOwnProperty("exports")){module.exports=bigInt}if(typeof define==="function"&&define.amd){define("big-integer",[],function(){return bigInt})}; bigInt` - -// makeSlice convert an unsafe memory pointer with the given type into a Go byte -// slice. -// -// Note, the returned slice uses the same memory area as the input arguments. -// If those are duktape stack items, popping them off **will** make the slice -// contents change. -func makeSlice(ptr unsafe.Pointer, size uint) []byte { - var sl = struct { - addr uintptr - len int - cap int - }{uintptr(ptr), int(size), int(size)} - - return *(*[]byte)(unsafe.Pointer(&sl)) -} - -// popSlice pops a buffer off the JavaScript stack and returns it as a slice. -func popSlice(ctx *duktape.Context) []byte { - blob := common.CopyBytes(makeSlice(ctx.GetBuffer(-1))) - ctx.Pop() - return blob -} - -// pushBigInt create a JavaScript BigInteger in the VM. -func pushBigInt(n *big.Int, ctx *duktape.Context) { - ctx.GetGlobalString("bigInt") - ctx.PushString(n.String()) - ctx.Call(1) -} - -// opWrapper provides a JavaScript wrapper around OpCode. -type opWrapper struct { - op vm.OpCode -} - -// pushObject assembles a JSVM object wrapping a swappable opcode and pushes it -// onto the VM stack. -func (ow *opWrapper) pushObject(vm *duktape.Context) { - obj := vm.PushObject() - - vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(int(ow.op)); return 1 }) - vm.PutPropString(obj, "toNumber") - - vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushString(ow.op.String()); return 1 }) - vm.PutPropString(obj, "toString") - - vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushBoolean(ow.op.IsPush()); return 1 }) - vm.PutPropString(obj, "isPush") -} - -// memoryWrapper provides a JavaScript wrapper around vm.Memory. -type memoryWrapper struct { - memory *vm.Memory -} - -// slice returns the requested range of memory as a byte slice. -func (mw *memoryWrapper) slice(begin, end int64) []byte { - if end == begin { - return []byte{} - } - if end < begin || begin < 0 { - // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go - // runtime goes belly up https://github.com/golang/go/issues/15639. - log.Warn("Tracer accessed out of bound memory", "offset", begin, "end", end) - return nil - } - if mw.memory.Len() < int(end) { - // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go - // runtime goes belly up https://github.com/golang/go/issues/15639. - log.Warn("Tracer accessed out of bound memory", "available", mw.memory.Len(), "offset", begin, "size", end-begin) - return nil - } - return mw.memory.GetCopy(begin, end-begin) -} - -// getUint returns the 32 bytes at the specified address interpreted as a uint. -func (mw *memoryWrapper) getUint(addr int64) *big.Int { - if mw.memory.Len() < int(addr)+32 || addr < 0 { - // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go - // runtime goes belly up https://github.com/golang/go/issues/15639. - log.Warn("Tracer accessed out of bound memory", "available", mw.memory.Len(), "offset", addr, "size", 32) - return new(big.Int) - } - return new(big.Int).SetBytes(mw.memory.GetPtr(addr, 32)) -} - -// pushObject assembles a JSVM object wrapping a swappable memory and pushes it -// onto the VM stack. -func (mw *memoryWrapper) pushObject(vm *duktape.Context) { - obj := vm.PushObject() - - // Generate the `slice` method which takes two ints and returns a buffer - vm.PushGoFunction(func(ctx *duktape.Context) int { - blob := mw.slice(int64(ctx.GetInt(-2)), int64(ctx.GetInt(-1))) - ctx.Pop2() - - ptr := ctx.PushFixedBuffer(len(blob)) - copy(makeSlice(ptr, uint(len(blob))), blob) - return 1 - }) - vm.PutPropString(obj, "slice") - - // Generate the `getUint` method which takes an int and returns a bigint - vm.PushGoFunction(func(ctx *duktape.Context) int { - offset := int64(ctx.GetInt(-1)) - ctx.Pop() - - pushBigInt(mw.getUint(offset), ctx) - return 1 - }) - vm.PutPropString(obj, "getUint") -} - -// stackWrapper provides a JavaScript wrapper around vm.Stack. -type stackWrapper struct { - stack *vm.Stack -} - -// peek returns the nth-from-the-top element of the stack. -func (sw *stackWrapper) peek(idx int) *big.Int { - if len(sw.stack.Data()) <= idx || idx < 0 { - // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go - // runtime goes belly up https://github.com/golang/go/issues/15639. - log.Warn("Tracer accessed out of bound stack", "size", len(sw.stack.Data()), "index", idx) - return new(big.Int) - } - return sw.stack.Back(idx).ToBig() -} - -// pushObject assembles a JSVM object wrapping a swappable stack and pushes it -// onto the VM stack. -func (sw *stackWrapper) pushObject(vm *duktape.Context) { - obj := vm.PushObject() - - vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(len(sw.stack.Data())); return 1 }) - vm.PutPropString(obj, "length") - - // Generate the `peek` method which takes an int and returns a bigint - vm.PushGoFunction(func(ctx *duktape.Context) int { - offset := ctx.GetInt(-1) - ctx.Pop() - - pushBigInt(sw.peek(offset), ctx) - return 1 - }) - vm.PutPropString(obj, "peek") -} - -// dbWrapper provides a JavaScript wrapper around vm.Database. -type dbWrapper struct { - db vm.StateDB -} - -// pushObject assembles a JSVM object wrapping a swappable database and pushes it -// onto the VM stack. -func (dw *dbWrapper) pushObject(vm *duktape.Context) { - obj := vm.PushObject() - - // Push the wrapper for statedb.GetBalance - vm.PushGoFunction(func(ctx *duktape.Context) int { - pushBigInt(dw.db.GetBalance(common.BytesToAddress(popSlice(ctx))), ctx) - return 1 - }) - vm.PutPropString(obj, "getBalance") - - // Push the wrapper for statedb.GetNonce - vm.PushGoFunction(func(ctx *duktape.Context) int { - ctx.PushInt(int(dw.db.GetNonce(common.BytesToAddress(popSlice(ctx))))) - return 1 - }) - vm.PutPropString(obj, "getNonce") - - // Push the wrapper for statedb.GetCode - vm.PushGoFunction(func(ctx *duktape.Context) int { - code := dw.db.GetCode(common.BytesToAddress(popSlice(ctx))) - - ptr := ctx.PushFixedBuffer(len(code)) - copy(makeSlice(ptr, uint(len(code))), code) - return 1 - }) - vm.PutPropString(obj, "getCode") - - // Push the wrapper for statedb.GetState - vm.PushGoFunction(func(ctx *duktape.Context) int { - hash := popSlice(ctx) - addr := popSlice(ctx) - - state := dw.db.GetState(common.BytesToAddress(addr), common.BytesToHash(hash)) - - ptr := ctx.PushFixedBuffer(len(state)) - copy(makeSlice(ptr, uint(len(state))), state[:]) - return 1 - }) - vm.PutPropString(obj, "getState") - - // Push the wrapper for statedb.Exists - vm.PushGoFunction(func(ctx *duktape.Context) int { - ctx.PushBoolean(dw.db.Exist(common.BytesToAddress(popSlice(ctx)))) - return 1 - }) - vm.PutPropString(obj, "exists") -} - -// contractWrapper provides a JavaScript wrapper around vm.Contract -type contractWrapper struct { - contract *vm.Contract -} - -// pushObject assembles a JSVM object wrapping a swappable contract and pushes it -// onto the VM stack. -func (cw *contractWrapper) pushObject(vm *duktape.Context) { - obj := vm.PushObject() - - // Push the wrapper for contract.Caller - vm.PushGoFunction(func(ctx *duktape.Context) int { - ptr := ctx.PushFixedBuffer(20) - copy(makeSlice(ptr, 20), cw.contract.Caller().Bytes()) - return 1 - }) - vm.PutPropString(obj, "getCaller") - - // Push the wrapper for contract.Address - vm.PushGoFunction(func(ctx *duktape.Context) int { - ptr := ctx.PushFixedBuffer(20) - copy(makeSlice(ptr, 20), cw.contract.Address().Bytes()) - return 1 - }) - vm.PutPropString(obj, "getAddress") - - // Push the wrapper for contract.Value - vm.PushGoFunction(func(ctx *duktape.Context) int { - pushBigInt(cw.contract.Value(), ctx) - return 1 - }) - vm.PutPropString(obj, "getValue") - - // Push the wrapper for contract.Input - vm.PushGoFunction(func(ctx *duktape.Context) int { - blob := cw.contract.Input - - ptr := ctx.PushFixedBuffer(len(blob)) - copy(makeSlice(ptr, uint(len(blob))), blob) - return 1 - }) - vm.PutPropString(obj, "getInput") -} - -type frame struct { - typ *string - from *common.Address - to *common.Address - input []byte - gas *uint - value *big.Int -} - -func newFrame() *frame { - return &frame{ - typ: new(string), - from: new(common.Address), - to: new(common.Address), - gas: new(uint), - } -} - -func (f *frame) pushObject(vm *duktape.Context) { - obj := vm.PushObject() - - vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *f.typ); return 1 }) - vm.PutPropString(obj, "getType") - - vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *f.from); return 1 }) - vm.PutPropString(obj, "getFrom") - - vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *f.to); return 1 }) - vm.PutPropString(obj, "getTo") - - vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, f.input); return 1 }) - vm.PutPropString(obj, "getInput") - - vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *f.gas); return 1 }) - vm.PutPropString(obj, "getGas") - - vm.PushGoFunction(func(ctx *duktape.Context) int { - if f.value != nil { - pushValue(ctx, f.value) - } else { - ctx.PushUndefined() - } - return 1 - }) - vm.PutPropString(obj, "getValue") -} - -type frameResult struct { - gasUsed *uint - output []byte - errorValue *string -} - -func newFrameResult() *frameResult { - return &frameResult{ - gasUsed: new(uint), - } -} - -func (r *frameResult) pushObject(vm *duktape.Context) { - obj := vm.PushObject() - - vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *r.gasUsed); return 1 }) - vm.PutPropString(obj, "getGasUsed") - - vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, r.output); return 1 }) - vm.PutPropString(obj, "getOutput") - - vm.PushGoFunction(func(ctx *duktape.Context) int { - if r.errorValue != nil { - pushValue(ctx, *r.errorValue) - } else { - ctx.PushUndefined() - } - return 1 - }) - vm.PutPropString(obj, "getError") -} - -// Tracer provides an implementation of Tracer that evaluates a Javascript -// function for each VM execution step. -type Tracer struct { - vm *duktape.Context // Javascript VM instance - - tracerObject int // Stack index of the tracer JavaScript object - stateObject int // Stack index of the global state to pull arguments from - - opWrapper *opWrapper // Wrapper around the VM opcode - stackWrapper *stackWrapper // Wrapper around the VM stack - memoryWrapper *memoryWrapper // Wrapper around the VM memory - contractWrapper *contractWrapper // Wrapper around the contract object - dbWrapper *dbWrapper // Wrapper around the VM environment - - pcValue *uint // Swappable pc value wrapped by a log accessor - gasValue *uint // Swappable gas value wrapped by a log accessor - costValue *uint // Swappable cost value wrapped by a log accessor - depthValue *uint // Swappable depth value wrapped by a log accessor - errorValue *string // Swappable error value wrapped by a log accessor - refundValue *uint // Swappable refund value wrapped by a log accessor - - frame *frame // Represents entry into call frame. Fields are swappable - frameResult *frameResult // Represents exit from a call frame. Fields are swappable - - ctx map[string]interface{} // Transaction context gathered throughout execution - err error // Error, if one has occurred - - interrupt uint32 // Atomic flag to signal execution interruption - reason error // Textual reason for the interruption - - activePrecompiles []common.Address // Updated on CaptureStart based on given rules - traceSteps bool // When true, will invoke step() on each opcode - traceCallFrames bool // When true, will invoke enter() and exit() js funcs -} - -// Context contains some contextual infos for a transaction execution that is not -// available from within the EVM object. -type Context struct { - BlockHash common.Hash // Hash of the block the tx is contained within (zero if dangling tx or call) - TxIndex int // Index of the transaction within a block (zero if dangling tx or call) - TxHash common.Hash // Hash of the transaction being traced (zero if dangling call) -} - -// New instantiates a new tracer instance. code specifies a Javascript snippet, -// which must evaluate to an expression returning an object with 'step', 'fault' -// and 'result' functions. -func New(code string, ctx *Context) (*Tracer, error) { - // Resolve any tracers by name and assemble the tracer object - if tracer, ok := tracer(code); ok { - code = tracer - } - tracer := &Tracer{ - vm: duktape.New(), - ctx: make(map[string]interface{}), - opWrapper: new(opWrapper), - stackWrapper: new(stackWrapper), - memoryWrapper: new(memoryWrapper), - contractWrapper: new(contractWrapper), - dbWrapper: new(dbWrapper), - pcValue: new(uint), - gasValue: new(uint), - costValue: new(uint), - depthValue: new(uint), - refundValue: new(uint), - frame: newFrame(), - frameResult: newFrameResult(), - } - if ctx.BlockHash != (common.Hash{}) { - tracer.ctx["blockHash"] = ctx.BlockHash - - if ctx.TxHash != (common.Hash{}) { - tracer.ctx["txIndex"] = ctx.TxIndex - tracer.ctx["txHash"] = ctx.TxHash - } - } - // Set up builtins for this environment - tracer.vm.PushGlobalGoFunction("toHex", func(ctx *duktape.Context) int { - ctx.PushString(hexutil.Encode(popSlice(ctx))) - return 1 - }) - tracer.vm.PushGlobalGoFunction("toWord", func(ctx *duktape.Context) int { - var word common.Hash - if ptr, size := ctx.GetBuffer(-1); ptr != nil { - word = common.BytesToHash(makeSlice(ptr, size)) - } else { - word = common.HexToHash(ctx.GetString(-1)) - } - ctx.Pop() - copy(makeSlice(ctx.PushFixedBuffer(32), 32), word[:]) - return 1 - }) - tracer.vm.PushGlobalGoFunction("toAddress", func(ctx *duktape.Context) int { - var addr common.Address - if ptr, size := ctx.GetBuffer(-1); ptr != nil { - addr = common.BytesToAddress(makeSlice(ptr, size)) - } else { - addr = common.HexToAddress(ctx.GetString(-1)) - } - ctx.Pop() - copy(makeSlice(ctx.PushFixedBuffer(20), 20), addr[:]) - return 1 - }) - tracer.vm.PushGlobalGoFunction("toContract", func(ctx *duktape.Context) int { - var from common.Address - if ptr, size := ctx.GetBuffer(-2); ptr != nil { - from = common.BytesToAddress(makeSlice(ptr, size)) - } else { - from = common.HexToAddress(ctx.GetString(-2)) - } - nonce := uint64(ctx.GetInt(-1)) - ctx.Pop2() - - contract := crypto.CreateAddress(from, nonce) - copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) - return 1 - }) - tracer.vm.PushGlobalGoFunction("toContract2", func(ctx *duktape.Context) int { - var from common.Address - if ptr, size := ctx.GetBuffer(-3); ptr != nil { - from = common.BytesToAddress(makeSlice(ptr, size)) - } else { - from = common.HexToAddress(ctx.GetString(-3)) - } - // Retrieve salt hex string from js stack - salt := common.HexToHash(ctx.GetString(-2)) - // Retrieve code slice from js stack - var code []byte - if ptr, size := ctx.GetBuffer(-1); ptr != nil { - code = common.CopyBytes(makeSlice(ptr, size)) - } else { - code = common.FromHex(ctx.GetString(-1)) - } - codeHash := crypto.Keccak256(code) - ctx.Pop3() - contract := crypto.CreateAddress2(from, salt, codeHash) - copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) - return 1 - }) - tracer.vm.PushGlobalGoFunction("isPrecompiled", func(ctx *duktape.Context) int { - addr := common.BytesToAddress(popSlice(ctx)) - for _, p := range tracer.activePrecompiles { - if p == addr { - ctx.PushBoolean(true) - return 1 - } - } - ctx.PushBoolean(false) - return 1 - }) - tracer.vm.PushGlobalGoFunction("slice", func(ctx *duktape.Context) int { - start, end := ctx.GetInt(-2), ctx.GetInt(-1) - ctx.Pop2() - - blob := popSlice(ctx) - size := end - start - - if start < 0 || start > end || end > len(blob) { - // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go - // runtime goes belly up https://github.com/golang/go/issues/15639. - log.Warn("Tracer accessed out of bound memory", "available", len(blob), "offset", start, "size", size) - ctx.PushFixedBuffer(0) - return 1 - } - copy(makeSlice(ctx.PushFixedBuffer(size), uint(size)), blob[start:end]) - return 1 - }) - // Push the JavaScript tracer as object #0 onto the JSVM stack and validate it - if err := tracer.vm.PevalString("(" + code + ")"); err != nil { - log.Warn("Failed to compile tracer", "err", err) - return nil, err - } - tracer.tracerObject = 0 // yeah, nice, eval can't return the index itself - - hasStep := tracer.vm.GetPropString(tracer.tracerObject, "step") - tracer.vm.Pop() - - if !tracer.vm.GetPropString(tracer.tracerObject, "fault") { - return nil, fmt.Errorf("trace object must expose a function fault()") - } - tracer.vm.Pop() - - if !tracer.vm.GetPropString(tracer.tracerObject, "result") { - return nil, fmt.Errorf("trace object must expose a function result()") - } - tracer.vm.Pop() - - hasEnter := tracer.vm.GetPropString(tracer.tracerObject, "enter") - tracer.vm.Pop() - hasExit := tracer.vm.GetPropString(tracer.tracerObject, "exit") - tracer.vm.Pop() - - if hasEnter != hasExit { - return nil, fmt.Errorf("trace object must expose either both or none of enter() and exit()") - } - if !hasStep { - // If there's no step function, the enter and exit must be present - if !hasEnter { - return nil, fmt.Errorf("trace object must expose either step() or both enter() and exit()") - } - } - tracer.traceCallFrames = hasEnter - tracer.traceSteps = hasStep - - // Tracer is valid, inject the big int library to access large numbers - tracer.vm.EvalString(bigIntegerJS) - tracer.vm.PutGlobalString("bigInt") - - // Push the global environment state as object #1 into the JSVM stack - tracer.stateObject = tracer.vm.PushObject() - - logObject := tracer.vm.PushObject() - - tracer.opWrapper.pushObject(tracer.vm) - tracer.vm.PutPropString(logObject, "op") - - tracer.stackWrapper.pushObject(tracer.vm) - tracer.vm.PutPropString(logObject, "stack") - - tracer.memoryWrapper.pushObject(tracer.vm) - tracer.vm.PutPropString(logObject, "memory") - - tracer.contractWrapper.pushObject(tracer.vm) - tracer.vm.PutPropString(logObject, "contract") - - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.pcValue); return 1 }) - tracer.vm.PutPropString(logObject, "getPC") - - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.gasValue); return 1 }) - tracer.vm.PutPropString(logObject, "getGas") - - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.costValue); return 1 }) - tracer.vm.PutPropString(logObject, "getCost") - - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.depthValue); return 1 }) - tracer.vm.PutPropString(logObject, "getDepth") - - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.refundValue); return 1 }) - tracer.vm.PutPropString(logObject, "getRefund") - - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { - if tracer.errorValue != nil { - ctx.PushString(*tracer.errorValue) - } else { - ctx.PushUndefined() - } - return 1 - }) - tracer.vm.PutPropString(logObject, "getError") - - tracer.vm.PutPropString(tracer.stateObject, "log") - - tracer.frame.pushObject(tracer.vm) - tracer.vm.PutPropString(tracer.stateObject, "frame") - - tracer.frameResult.pushObject(tracer.vm) - tracer.vm.PutPropString(tracer.stateObject, "frameResult") - - tracer.dbWrapper.pushObject(tracer.vm) - tracer.vm.PutPropString(tracer.stateObject, "db") - - return tracer, nil -} - -// Stop terminates execution of the tracer at the first opportune moment. -func (jst *Tracer) Stop(err error) { - jst.reason = err - atomic.StoreUint32(&jst.interrupt, 1) -} - -// call executes a method on a JS object, catching any errors, formatting and -// returning them as error objects. -func (jst *Tracer) call(noret bool, method string, args ...string) (json.RawMessage, error) { - // Execute the JavaScript call and return any error - jst.vm.PushString(method) - for _, arg := range args { - jst.vm.GetPropString(jst.stateObject, arg) - } - code := jst.vm.PcallProp(jst.tracerObject, len(args)) - defer jst.vm.Pop() - - if code != 0 { - err := jst.vm.SafeToString(-1) - return nil, errors.New(err) - } - // No error occurred, extract return value and return - if noret { - return nil, nil - } - // Push a JSON marshaller onto the stack. We can't marshal from the out- - // side because duktape can crash on large nestings and we can't catch - // C++ exceptions ourselves from Go. TODO(karalabe): Yuck, why wrap?! - jst.vm.PushString("(JSON.stringify)") - jst.vm.Eval() - - jst.vm.Swap(-1, -2) - if code = jst.vm.Pcall(1); code != 0 { - err := jst.vm.SafeToString(-1) - return nil, errors.New(err) - } - return json.RawMessage(jst.vm.SafeToString(-1)), nil -} - -func wrapError(context string, err error) error { - return fmt.Errorf("%v in server-side tracer function '%v'", err, context) -} - -// CaptureStart implements the Tracer interface to initialize the tracing operation. -func (jst *Tracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { - jst.ctx["type"] = "CALL" - if create { - jst.ctx["type"] = "CREATE" - } - jst.ctx["from"] = from - jst.ctx["to"] = to - jst.ctx["input"] = input - jst.ctx["gas"] = gas - jst.ctx["gasPrice"] = env.TxContext.GasPrice - jst.ctx["value"] = value - - // Initialize the context - jst.ctx["block"] = env.Context.BlockNumber.Uint64() - jst.dbWrapper.db = env.StateDB - // Update list of precompiles based on current block - rules := env.ChainConfig().Rules(env.Context.BlockNumber) - jst.activePrecompiles = vm.ActivePrecompiles(rules) - - // Compute intrinsic gas - isHomestead := env.ChainConfig().IsHomestead(env.Context.BlockNumber) - isIstanbul := env.ChainConfig().IsIstanbul(env.Context.BlockNumber) - intrinsicGas, err := core.IntrinsicGas(input, nil, jst.ctx["type"] == "CREATE", isHomestead, isIstanbul) - if err != nil { - return - } - jst.ctx["intrinsicGas"] = intrinsicGas -} - -// CaptureState implements the Tracer interface to trace a single step of VM execution. -func (jst *Tracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { - if !jst.traceSteps { - return - } - if jst.err != nil { - return - } - // If tracing was interrupted, set the error and stop - if atomic.LoadUint32(&jst.interrupt) > 0 { - jst.err = jst.reason - env.Cancel() - return - } - jst.opWrapper.op = op - jst.stackWrapper.stack = scope.Stack - jst.memoryWrapper.memory = scope.Memory - jst.contractWrapper.contract = scope.Contract - - *jst.pcValue = uint(pc) - *jst.gasValue = uint(gas) - *jst.costValue = uint(cost) - *jst.depthValue = uint(depth) - *jst.refundValue = uint(env.StateDB.GetRefund()) - - jst.errorValue = nil - if err != nil { - jst.errorValue = new(string) - *jst.errorValue = err.Error() - } - - if _, err := jst.call(true, "step", "log", "db"); err != nil { - jst.err = wrapError("step", err) - } -} - -// CaptureFault implements the Tracer interface to trace an execution fault -func (jst *Tracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { - if jst.err != nil { - return - } - // Apart from the error, everything matches the previous invocation - jst.errorValue = new(string) - *jst.errorValue = err.Error() - - if _, err := jst.call(true, "fault", "log", "db"); err != nil { - jst.err = wrapError("fault", err) - } -} - -// CaptureEnd is called after the call finishes to finalize the tracing. -func (jst *Tracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) { - jst.ctx["output"] = output - jst.ctx["time"] = t.String() - jst.ctx["gasUsed"] = gasUsed - - if err != nil { - jst.ctx["error"] = err.Error() - } -} - -// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). -func (jst *Tracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { - if !jst.traceCallFrames { - return - } - if jst.err != nil { - return - } - // If tracing was interrupted, set the error and stop - if atomic.LoadUint32(&jst.interrupt) > 0 { - jst.err = jst.reason - return - } - - *jst.frame.typ = typ.String() - *jst.frame.from = from - *jst.frame.to = to - jst.frame.input = common.CopyBytes(input) - *jst.frame.gas = uint(gas) - jst.frame.value = nil - if value != nil { - jst.frame.value = new(big.Int).SetBytes(value.Bytes()) - } - - if _, err := jst.call(true, "enter", "frame"); err != nil { - jst.err = wrapError("enter", err) - } -} - -// CaptureExit is called when EVM exits a scope, even if the scope didn't -// execute any code. -func (jst *Tracer) CaptureExit(output []byte, gasUsed uint64, err error) { - if !jst.traceCallFrames { - return - } - // If tracing was interrupted, set the error and stop - if atomic.LoadUint32(&jst.interrupt) > 0 { - jst.err = jst.reason - return - } - - jst.frameResult.output = common.CopyBytes(output) - *jst.frameResult.gasUsed = uint(gasUsed) - jst.frameResult.errorValue = nil - if err != nil { - jst.frameResult.errorValue = new(string) - *jst.frameResult.errorValue = err.Error() - } - - if _, err := jst.call(true, "exit", "frameResult"); err != nil { - jst.err = wrapError("exit", err) - } -} - -// GetResult calls the Javascript 'result' function and returns its value, or any accumulated error -func (jst *Tracer) GetResult() (json.RawMessage, error) { - // Transform the context into a JavaScript object and inject into the state - obj := jst.vm.PushObject() - - for key, val := range jst.ctx { - jst.addToObj(obj, key, val) - } - jst.vm.PutPropString(jst.stateObject, "ctx") - - // Finalize the trace and return the results - result, err := jst.call(false, "result", "ctx", "db") - if err != nil { - jst.err = wrapError("result", err) - } - // Clean up the JavaScript environment - jst.vm.DestroyHeap() - jst.vm.Destroy() - - return result, jst.err -} - -// addToObj pushes a field to a JS object. -func (jst *Tracer) addToObj(obj int, key string, val interface{}) { - pushValue(jst.vm, val) - jst.vm.PutPropString(obj, key) -} - -func pushValue(ctx *duktape.Context, val interface{}) { - switch val := val.(type) { - case uint64: - ctx.PushUint(uint(val)) - case string: - ctx.PushString(val) - case []byte: - ptr := ctx.PushFixedBuffer(len(val)) - copy(makeSlice(ptr, uint(len(val))), val) - case common.Address: - ptr := ctx.PushFixedBuffer(20) - copy(makeSlice(ptr, 20), val[:]) - case *big.Int: - pushBigInt(val, ctx) - case int: - ctx.PushInt(val) - case uint: - ctx.PushUint(val) - case common.Hash: - ptr := ctx.PushFixedBuffer(32) - copy(makeSlice(ptr, 32), val[:]) - default: - panic(fmt.Sprintf("unsupported type: %T", val)) - } -} diff --git a/eth/tracers/internal/tracers/4byte_tracer_legacy.js b/eth/tracers/js/internal/tracers/4byte_tracer_legacy.js similarity index 100% rename from eth/tracers/internal/tracers/4byte_tracer_legacy.js rename to eth/tracers/js/internal/tracers/4byte_tracer_legacy.js diff --git a/eth/tracers/internal/tracers/assets.go b/eth/tracers/js/internal/tracers/assets.go similarity index 74% rename from eth/tracers/internal/tracers/assets.go rename to eth/tracers/js/internal/tracers/assets.go index 185967bdb6..a2bb69dee4 100644 --- a/eth/tracers/internal/tracers/assets.go +++ b/eth/tracers/js/internal/tracers/assets.go @@ -1,11 +1,10 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: -// 4byte_tracer.js (2.224kB) // 4byte_tracer_legacy.js (2.933kB) // bigram_tracer.js (1.712kB) -// call_tracer.js (3.497kB) +// call_tracer_js.js (3.497kB) // call_tracer_legacy.js (8.956kB) -// evmdis_tracer.js (4.195kB) +// evmdis_tracer.js (4.215kB) // noop_tracer.js (1.271kB) // opcount_tracer.js (1.372kB) // prestate_tracer.js (4.287kB) @@ -79,26 +78,6 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var __4byte_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x55\x5b\x6f\x22\x39\x13\x7d\x86\x5f\x71\xc4\x13\x68\x9a\x4b\x73\x09\x97\xf9\x32\x12\xdf\x28\x99\x41\xca\x66\x22\x42\x34\x8a\x56\xfb\x60\xda\xd5\xdd\xde\x18\xbb\x65\xbb\xb9\x6c\x26\xff\x7d\x65\x37\xe4\x36\xbb\xda\x79\x02\xec\xaa\x73\xaa\x4e\x1d\x17\xdd\x2e\x3e\xeb\xe2\x60\x44\x96\x3b\xf4\x7b\xf1\x18\xab\x9c\x90\xe9\x36\xb9\x9c\x0c\x95\x1b\xcc\x4b\x97\x6b\x63\xeb\xdd\x2e\x56\xb9\xb0\x48\x85\x24\x08\x8b\x82\x19\x07\x9d\xc2\xbd\x8b\x97\x62\x6d\x98\x39\x74\xea\xdd\x6e\x95\xf3\x8f\xd7\x1e\x21\x35\x44\xb0\x3a\x75\x3b\x66\x68\x86\x83\x2e\x91\x30\x05\x43\x5c\x58\x67\xc4\xba\x74\x04\xe1\xc0\x14\xef\x6a\x83\x8d\xe6\x22\x3d\x78\x48\xe1\x50\x2a\x4e\x26\x50\x3b\x32\x1b\x7b\xaa\xe3\xcb\xf5\x1d\xae\xc8\x5a\x32\xf8\x42\x8a\x0c\x93\xb8\x29\xd7\x52\x24\xb8\x12\x09\x29\x4b\x60\x16\x85\x3f\xb1\x39\x71\xac\x03\x9c\x4f\xbc\xf4\xa5\xdc\x1e\x4b\xc1\xa5\x2e\x15\x67\x4e\x68\x15\x81\x84\xaf\x1c\x5b\x32\x56\x68\x85\xc1\x89\xea\x08\x18\x41\x1b\x0f\xd2\x64\xce\x37\x60\xa0\x0b\x9f\xd7\x02\x53\x07\x48\xe6\x5e\x52\x7f\x41\x90\x97\xbe\x39\x84\x0a\x34\xb9\x2e\x08\x2e\x67\xce\x77\xbd\x13\x52\x62\x4d\x28\x2d\xa5\xa5\x8c\x3c\xda\xba\x74\xf8\xbe\x58\x7d\xfd\x76\xb7\xc2\xfc\xfa\x1e\xdf\xe7\xcb\xe5\xfc\x7a\x75\xff\x11\x3b\xe1\x72\x5d\x3a\xd0\x96\x2a\x28\xb1\x29\xa4\x20\x8e\x1d\x33\x86\x29\x77\x80\x4e\x3d\xc2\x6f\x17\xcb\xcf\x5f\xe7\xd7\xab\xf9\xff\x17\x57\x8b\xd5\x3d\xb4\xc1\xe5\x62\x75\x7d\x71\x7b\x8b\xcb\x6f\x4b\xcc\x71\x33\x5f\xae\x16\x9f\xef\xae\xe6\x4b\xdc\xdc\x2d\x6f\xbe\xdd\x5e\x74\x70\x4b\xbe\x2a\xf2\xf9\xff\xad\x79\x1a\xa6\x67\x08\x9c\x1c\x13\xd2\x9e\x94\xb8\xd7\x25\x6c\xae\x4b\xc9\x91\xb3\x2d\xc1\x50\x42\x62\x4b\x1c\x0c\x89\x2e\x0e\xbf\x3c\x54\x8f\xc5\xa4\x56\x59\xe8\xf9\x5f\x0d\x89\x45\x0a\xa5\x5d\x04\x4b\x84\xff\xe5\xce\x15\xb3\x6e\x77\xb7\xdb\x75\x32\x55\x76\xb4\xc9\xba\xb2\x82\xb3\xdd\x4f\x9d\xba\xc7\x1c\xae\x0f\x8e\x56\x86\x25\x64\x60\x89\x99\x24\x27\x1b\x9a\x09\x17\x6d\xc1\x49\x39\x91\x0a\x32\x36\xf2\x26\x45\xa2\xa5\xa4\xc4\x59\x5f\xc1\x26\x04\x16\xda\xba\x76\x61\x74\x42\xd6\x0a\x95\xf9\xc6\xb1\x70\x6f\x02\xb1\x21\x97\x6b\x6e\xf1\x0a\xee\x7d\x37\x56\xfc\x45\x27\x35\x6c\x59\x54\x63\xe4\xcc\xb1\x08\x56\x87\xee\x61\xc8\xdb\x8c\x38\xac\xc8\x14\x73\xa5\xa1\xf0\x96\xd6\x84\x0d\x73\x89\x37\x3b\xcb\x98\x50\xd6\xfd\x04\xe8\x71\x4e\x13\xb9\xd8\xb3\x4d\x21\x69\xe6\xbf\x03\x9f\xc0\x69\x5d\x66\x1d\xe7\x25\x58\x19\xa6\x2c\x4b\xbc\xb9\x9b\x68\xf4\xf6\xfd\x78\x48\xa3\xe9\x98\x06\x23\xce\x7a\x93\xc1\xd9\xb4\x9f\x8e\x06\x93\xb3\x78\x18\xd3\xd9\x34\x1d\x8e\x69\x3a\x1e\xac\xfb\xc9\xe8\x8c\xc6\x6c\xd2\x1b\x0f\xd6\x31\xb1\xde\x24\xe5\xe3\xd1\x38\xa6\x29\xa7\x46\x84\xc7\x00\x6c\x66\x68\xbc\x52\xba\xf1\xd4\xaa\xd8\x1f\xab\x0f\xa0\xb7\xef\x8f\x79\xd2\x9f\x8e\xa9\x1d\xf7\x27\x33\xc4\xd1\xcb\xcd\x60\x92\x24\xc3\xc9\x20\x6e\xf7\x66\xe8\xbf\x3a\x1f\xf5\x87\xe9\x60\x32\x99\xb6\xa7\x67\x6f\x13\x18\x4f\x47\xd3\x74\x3a\x6d\xf7\x27\xef\xa0\x92\xfe\x24\xe6\xf1\x94\x3c\x54\x5c\x1d\x3f\xd5\x1f\xeb\x35\xbf\x70\xb8\x05\xcb\x32\x43\x19\x73\x54\x4d\x2d\x54\x1c\x2e\x52\xbf\x2c\x3a\xf5\x9a\xff\x3e\xc3\xe3\x53\x54\x0f\x39\xd6\x79\xc7\x5b\xef\xeb\x60\x48\xe1\x9f\xa1\x50\xcf\x43\x0e\x8e\xf1\xda\xfb\x59\x74\xea\xb5\x10\x3f\x43\x5a\xaa\x4a\x63\xc1\xa3\x30\xa6\xd6\x63\xbd\x56\xdb\x32\x83\x07\x3a\xe0\x1c\x8d\x06\x3e\xc0\xe9\xaf\xb4\x6f\x0a\xde\xc2\x07\x34\xda\xfe\xc4\x47\x7e\xac\xd7\x6a\x2e\x17\xb6\x23\xb8\xfd\xfd\x81\x0e\x7f\xe0\x1c\x6f\x7f\x7f\x40\x8c\x1f\x3f\x10\x7f\xac\xd7\x42\x99\xa4\x9c\x97\xff\x99\x33\x35\x6c\x43\x2d\x78\xc6\x6e\x17\xb7\x0f\xa2\x08\x6b\xac\x30\xd4\x4e\xf4\xa6\x08\x8b\x5f\x6d\x75\x12\x56\xa3\x8d\xe0\x72\xed\x57\xaa\x21\xfc\x59\x5a\x87\x94\xa9\xe4\x00\x5d\x24\x9a\x93\xad\xd7\x6a\x22\x45\x53\xd8\x1b\x43\xc7\x64\x5e\x11\x74\x32\x72\x2b\xdd\x6c\xb5\x2a\xa6\x9a\x21\x57\x1a\xe5\xab\x7f\x3a\xb6\x2a\x54\x51\x3a\x9c\xe3\x39\x7c\xe1\x0f\x9a\xad\x13\xa6\xff\xd5\x91\xa4\x32\x97\xe3\xd3\x39\x86\x47\xa0\xd0\x6c\xd0\xb1\x69\xfd\x5b\xae\x02\x23\xf4\x22\x0c\x5b\x11\xde\xa4\xb5\x31\x6c\x1d\x29\x2b\x29\xf6\xc2\xbd\x57\x62\x49\xb6\x94\xae\xf5\x32\xd3\x94\x95\xd2\xf9\x45\xed\x55\x78\xf0\xab\x34\x3f\xee\x56\x96\xb8\x92\x49\xd0\x9e\x92\xd2\x03\xf8\xc7\xc5\xd4\x51\x0b\xa4\xd5\xd6\xab\x85\xfc\x57\x2c\x52\x67\x11\xf8\xfa\x15\x83\x09\x94\x3f\x51\x30\x29\x03\xcd\x51\xdb\x6a\x5d\xae\xc9\x3b\xca\x91\x61\xfe\xff\x42\x6f\x8f\x9e\xaa\xe4\xb4\x01\xce\xe7\xa4\x42\x31\x79\x02\x3e\xbe\x79\xff\xf0\xc2\x3e\xaa\x55\xe7\xaf\x6a\x4a\xdc\xfe\xc5\x01\x27\xf7\xea\xd2\xff\x91\x25\x4c\x4a\xef\x58\x30\x69\xf5\x71\x16\x89\xdb\x77\x7e\x79\x1e\xcf\xc1\xcf\x33\x79\x9f\xde\x1e\xb6\x8e\x3e\xa8\xda\x78\x36\x70\x65\xd9\xa7\xfa\xdf\x01\x00\x00\xff\xff\xf6\xa8\xa1\xb9\xb0\x08\x00\x00") - -func _4byte_tracerJsBytes() ([]byte, error) { - return bindataRead( - __4byte_tracerJs, - "4byte_tracer.js", - ) -} - -func _4byte_tracerJs() (*asset, error) { - bytes, err := _4byte_tracerJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "4byte_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0xa8, 0x46, 0xa2, 0x3a, 0x2b, 0xaa, 0xb9, 0xb9, 0xba, 0xe2, 0x22, 0x10, 0xe, 0xe7, 0x4c, 0x24, 0xfc, 0x4c, 0x85, 0xeb, 0x96, 0x48, 0xe8, 0x7f, 0xc8, 0xe0, 0xd0, 0xd, 0x26, 0xa1, 0xb2}} - return a, nil -} - var __4byte_tracer_legacyJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x56\x5b\x6f\xdb\x4a\x0e\x7e\xb6\x7f\x05\xd7\x2f\xb5\x51\x59\x8e\x2f\x89\x2f\xd9\x16\xf0\xe6\xa4\x6d\x80\x9c\x24\x88\xdd\x3d\x28\x16\xfb\x30\x9e\xa1\xac\xd9\xc8\x33\xc2\x0c\xe5\x4b\x73\xf2\xdf\x17\x1c\x49\x89\x93\xd3\x62\xbb\x4f\x96\x47\xc3\x8f\x1f\xc9\x8f\xa4\x7a\x3d\xb8\xb0\xf9\xc1\xe9\x75\x4a\x30\x38\xe9\x8f\x61\x99\x22\xac\x6d\x17\x29\x45\x87\xc5\x06\xe6\x05\xa5\xd6\xf9\x66\xaf\x07\xcb\x54\x7b\x48\x74\x86\xa0\x3d\xe4\xc2\x11\xd8\x04\xe8\xcd\xfd\x4c\xaf\x9c\x70\x87\xb8\xd9\xeb\x95\x36\x3f\x7c\xcd\x08\x89\x43\x04\x6f\x13\xda\x09\x87\x33\x38\xd8\x02\xa4\x30\xe0\x50\x69\x4f\x4e\xaf\x0a\x42\xd0\x04\xc2\xa8\x9e\x75\xb0\xb1\x4a\x27\x07\x86\xd4\x04\x85\x51\xe8\x82\x6b\x42\xb7\xf1\x35\x8f\xcf\x37\x5f\xe1\x1a\xbd\x47\x07\x9f\xd1\xa0\x13\x19\xdc\x15\xab\x4c\x4b\xb8\xd6\x12\x8d\x47\x10\x1e\x72\x3e\xf1\x29\x2a\x58\x05\x38\x36\xfc\xc4\x54\x16\x15\x15\xf8\x64\x0b\xa3\x04\x69\x6b\x22\x40\xcd\xcc\x61\x8b\xce\x6b\x6b\x60\x58\xbb\xaa\x00\x23\xb0\x8e\x41\xda\x82\x38\x00\x07\x36\x67\xbb\x0e\x08\x73\x80\x4c\xd0\x8b\xe9\x2f\x24\xe4\x25\x6e\x05\xda\x04\x37\xa9\xcd\x11\x28\x15\xc4\x51\xef\x74\x96\xc1\x0a\xa1\xf0\x98\x14\x59\xc4\x68\xab\x82\xe0\x8f\xab\xe5\x97\xdb\xaf\x4b\x98\xdf\x7c\x83\x3f\xe6\xf7\xf7\xf3\x9b\xe5\xb7\x73\xd8\x69\x4a\x6d\x41\x80\x5b\x2c\xa1\xf4\x26\xcf\x34\x2a\xd8\x09\xe7\x84\xa1\x03\xd8\x84\x11\x7e\xbf\xbc\xbf\xf8\x32\xbf\x59\xce\xff\x71\x75\x7d\xb5\xfc\x06\xd6\xc1\xa7\xab\xe5\xcd\xe5\x62\x01\x9f\x6e\xef\x61\x0e\x77\xf3\xfb\xe5\xd5\xc5\xd7\xeb\xf9\x3d\xdc\x7d\xbd\xbf\xbb\x5d\x5c\xc6\xb0\x40\x66\x85\x6c\xff\xbf\x73\x9e\x84\xea\x39\x04\x85\x24\x74\xe6\xeb\x4c\x7c\xb3\x05\xf8\xd4\x16\x99\x82\x54\x6c\x11\x1c\x4a\xd4\x5b\x54\x20\x40\xda\xfc\xf0\xcb\x45\x65\x2c\x91\x59\xb3\x0e\x31\xff\x54\x90\x70\x95\x80\xb1\x14\x81\x47\x84\xbf\xa7\x44\xf9\xac\xd7\xdb\xed\x76\xf1\xda\x14\xb1\x75\xeb\x5e\x56\xc2\xf9\xde\xc7\xb8\xc9\x98\xa3\xd5\x81\x70\xe9\x84\x44\x07\x1e\x85\x93\x29\xfa\x10\x4c\x78\xd1\xd5\x0a\x0d\xe9\x44\xa3\xf3\x11\x8b\x14\xa4\xcd\x32\x94\xe4\x99\xc1\x26\x5c\xcc\xad\xa7\x6e\xee\xac\x44\xef\xb5\x59\x73\xe0\x70\x45\xaf\x2e\xc2\x06\x29\xb5\xca\xc3\x11\xdc\xdb\x68\xbc\xfe\x8e\x75\x36\x7c\x91\x97\x65\x54\x82\x44\x04\xde\x86\xe8\xc1\x21\xcb\x0c\x15\x78\xbd\x36\x82\x0a\x87\xa1\x97\x56\x08\x1b\x41\x92\xc5\x2e\xd6\x42\x1b\x4f\x7f\x01\x64\x9c\xba\x22\x97\x7b\xb1\xc9\x33\x9c\xf1\x33\xc0\x47\x50\xb8\x2a\xd6\x31\x71\x0a\x96\x4e\x18\x2f\x24\x8b\xbb\x0d\xad\x93\xfd\xa0\x3f\xc2\xd3\xe9\x18\x87\xa7\x4a\x9c\x4c\x86\x67\xd3\x41\x72\x3a\x9c\x9c\xf5\x47\x7d\x3c\x9b\x26\xa3\x31\x4e\xc7\xc3\xd5\x40\x9e\x9e\xe1\x58\x4c\x4e\xc6\xc3\x55\x1f\xc5\xc9\x24\x51\xe3\xd3\x71\x1f\xa7\x0a\x5b\x11\x3c\x06\x60\x37\x83\xd6\x51\xa6\x5b\x4f\x9d\xd2\xfb\x63\xf9\x03\x70\xb2\x1f\x8c\x95\x1c\x4c\xc7\xd8\xed\x0f\x26\x33\xe8\x47\x2f\x6f\x86\x13\x29\x47\x93\x61\xbf\x7b\x32\x83\xc1\xd1\xf9\xe9\x60\x94\x0c\x27\x93\x69\x77\x7a\xf6\xda\x40\xa8\xe4\x74\x9a\x4c\xa7\xdd\xc1\xe4\x0d\x94\x1c\x4c\xfa\xaa\x3f\x45\x86\xea\x97\xc7\x4f\xcd\xc7\x66\x83\x07\x8e\xf2\x20\xd6\x6b\x87\x6b\x41\x58\x56\x2d\x30\x0e\x2f\x12\x1e\x16\x71\xb3\xc1\xcf\x33\x78\x7c\x8a\x9a\xc1\x46\x8a\x2c\x5b\x1e\x72\x56\x35\x15\xce\x78\x78\x97\x88\xcc\xe3\xbb\xa0\x0b\x63\x4d\x97\x2f\x78\x1e\x1f\x01\x2f\x47\x7c\xe8\x6a\xa3\x70\x1f\x2e\xf0\x51\xa2\x9d\x27\x1e\xb3\x62\x13\x10\x45\xc2\xd3\xe4\xdd\x56\x64\x05\xbe\x8b\x40\xc7\x18\xc3\x06\x37\x5c\x54\xe1\x28\x6e\x36\x6a\x97\x33\x48\x0a\x53\x56\xca\xe6\x9e\x5c\xe7\xb1\xd9\x68\xf8\x9d\x26\x99\x1e\x1d\x48\xe1\x11\x5a\x17\xf3\xeb\xeb\xd6\x0c\x5e\xfe\x5c\xdc\xfe\x76\xd9\x9a\x35\x1b\x0d\x76\xb9\x16\x2c\x6d\xa5\x5c\x04\x5b\x91\x45\xa5\xbb\xea\xc7\x7f\x0f\x0f\xb6\xa0\xfa\xd7\x7f\x67\xb3\x32\x5e\x18\x9e\x43\xaf\x07\x9e\x84\x7c\x80\x9c\x1c\x90\x2d\xcd\x9a\xcf\xae\x7f\xbb\xbc\xbe\xfc\x3c\x5f\x5e\xbe\xa2\xb0\x58\xce\x97\x57\x17\xe5\xd1\x5f\x49\xfc\x1f\xfe\x07\x3f\xf3\xdf\x68\x3c\x35\x9f\x6f\x85\x9a\x9c\x37\x1b\x75\xd5\x3c\xf1\x9c\xf2\x3c\x8d\xc2\x18\xd1\x3c\x3c\xb9\x2c\x55\x6b\x86\x3e\xe7\x8e\xe1\x0e\x8a\x9b\x8d\x70\xff\x28\xdf\x5a\x45\xa1\xb9\x42\x86\xb7\xc2\xc1\x03\x1e\xe0\x03\xb4\x5a\xf0\x1e\xc8\x7e\xc1\x7d\x5b\xab\x0e\xbc\x87\x56\x97\x4f\xf8\xe6\x79\xb3\xd1\xa0\x54\xfb\x58\x2b\xff\xaf\x07\x3c\xfc\x1b\x3e\xc0\xeb\xff\xef\xa1\x0f\x7f\xfe\x09\xfd\x57\x34\x31\xe7\x85\xa1\xcd\xd6\x3e\xa0\x0a\x92\xe1\x01\x70\x00\x9b\x4b\xab\xaa\x8d\xc1\x11\xfc\xf3\x77\xc0\x3d\xca\x82\xd0\x07\xba\x98\x1f\xb1\xcd\xec\x3a\x02\xb5\xea\x00\xb3\xed\xf5\x60\xf1\xa0\xf3\xb0\xb8\x4a\x14\x5f\xc2\xf0\x46\x34\x96\x40\x1b\x42\x67\x44\x16\xa4\xed\xab\xf8\x24\xd5\x7c\x6b\xf5\x31\x6a\x6c\xf3\x98\xec\x82\x9c\x36\xeb\x76\xa7\xc3\x31\xea\x04\xda\x7f\x93\x54\xfa\xaa\xd2\x7f\x5e\x15\xe3\xd8\x75\xee\xb0\x2b\xed\x26\x0f\x5f\x19\x66\x6b\x65\xd8\xc3\x3e\x02\x4a\x2d\xef\x6f\x87\xf0\x9f\xc2\x13\x24\xc2\xc8\x67\xa2\x15\xbe\xf6\x77\x0e\x2b\x63\xd5\x26\x3b\x57\xca\xa1\xf7\x81\x51\x50\x42\xcc\x6d\xd6\xee\x77\x5e\xc8\xf5\xcf\x3a\x9d\xce\xcf\x48\x7d\x16\x61\xf7\xbf\x0a\xbc\x5e\x62\x55\xfc\xda\x2c\xbe\xc3\x07\x78\xe3\x41\x12\x57\xad\x13\x87\x5e\xbd\x4d\xda\xcf\x19\x08\xd7\x3f\x7e\x80\x51\xe5\xb2\x84\xb8\x4d\x92\x1f\x61\xbc\xb1\x2f\x65\x12\x14\x17\x22\x62\xd1\xbb\x43\xec\x79\x6d\xb5\x03\x48\x54\x61\xbd\x87\x51\x27\x0a\xd4\xba\xa3\x4e\x15\x4f\x2d\x9d\x44\x14\x19\x1d\x6b\x67\x97\x56\xdf\x07\x42\x52\x21\xb2\x4a\x2e\xfc\xad\x63\x13\x10\xa6\x56\x54\x52\x6e\xee\x46\xb0\xff\xa1\x86\xa0\x76\xe1\xd0\xff\xc8\x07\x27\x8f\xfd\xd4\xe2\x0a\x3b\x7f\x85\xdc\x60\x84\x4e\xf0\x47\x8f\xdd\x56\x2d\x56\x0d\xcd\x00\x57\xce\x42\xce\x7f\x05\x5c\x2d\x2e\xde\x1e\x61\xa9\x36\xca\xf3\x23\x52\x92\xf6\x2f\xa2\xae\x9b\xd9\x16\x3c\x3f\xb9\x86\xdc\xc0\x20\x32\x6f\xab\xaa\x48\xda\xc7\xda\xe4\x05\xc5\x19\x9a\x35\xa5\xc7\x15\x3a\x4a\x7a\x99\xe9\xe7\xcb\x11\x9c\x44\x21\xd1\x6f\xcd\xbb\xa3\xce\xeb\x29\x53\xf7\x73\xd9\xc1\x4f\xcd\xff\x06\x00\x00\xff\xff\x8e\xc8\x27\x72\x75\x0b\x00\x00") func _4byte_tracer_legacyJsBytes() ([]byte, error) { @@ -139,22 +118,22 @@ func bigram_tracerJs() (*asset, error) { return a, nil } -var _call_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x5f\x6f\xdb\x38\x0c\x7f\x8e\x3f\x05\xaf\x0f\x4b\x82\x65\x71\xbb\x03\xf6\xd0\x2d\x03\x72\x45\xbb\x05\xe8\xb5\x45\x9a\xde\x50\x14\x7d\x50\x6c\xda\xd6\xa6\x48\x86\x44\x37\xcd\x6d\xfd\xee\x07\x4a\x76\x6a\x67\x59\x6f\x2f\x06\x2c\x92\x3f\xfe\xfb\x51\x54\x1c\xc3\x89\x29\x37\x56\xe6\x05\xc1\xdb\xc3\xb7\x47\xb0\x28\x10\x72\xf3\x06\xa9\x40\x8b\xd5\x0a\xa6\x15\x15\xc6\xba\x28\x8e\x61\x51\x48\x07\x99\x54\x08\xd2\x41\x29\x2c\x81\xc9\x80\x76\xf4\x95\x5c\x5a\x61\x37\xe3\x28\x8e\x83\xcd\x5e\x31\x23\x64\x16\x11\x9c\xc9\x68\x2d\x2c\x1e\xc3\xc6\x54\x90\x08\x0d\x16\x53\xe9\xc8\xca\x65\x45\x08\x92\x40\xe8\x34\x36\x16\x56\x26\x95\xd9\x86\x21\x25\x41\xa5\x53\xb4\xde\x35\xa1\x5d\xb9\x26\x8e\x4f\x17\x37\x70\x8e\xce\xa1\x85\x4f\xa8\xd1\x0a\x05\x57\xd5\x52\xc9\x04\xce\x65\x82\xda\x21\x08\x07\x25\x9f\xb8\x02\x53\x58\x7a\x38\x36\x3c\xe3\x50\xae\xeb\x50\xe0\xcc\x54\x3a\x15\x24\x8d\x1e\x01\x4a\x8e\x1c\x1e\xd0\x3a\x69\x34\xfc\xd9\xb8\xaa\x01\x47\x60\x2c\x83\x0c\x04\x71\x02\x16\x4c\xc9\x76\x43\x10\x7a\x03\x4a\xd0\xb3\xe9\x6f\x14\xe4\x39\xef\x14\xa4\xf6\x6e\x0a\x53\x22\x50\x21\x88\xb3\x5e\x4b\xa5\x60\x89\x50\x39\xcc\x2a\x35\x62\xb4\x65\x45\xf0\x65\xb6\xf8\x7c\x79\xb3\x80\xe9\xc5\x2d\x7c\x99\xce\xe7\xd3\x8b\xc5\xed\x7b\x58\x4b\x2a\x4c\x45\x80\x0f\x18\xa0\xe4\xaa\x54\x12\x53\x58\x0b\x6b\x85\xa6\x0d\x98\x8c\x11\xfe\x3e\x9d\x9f\x7c\x9e\x5e\x2c\xa6\x7f\xcd\xce\x67\x8b\x5b\x30\x16\xce\x66\x8b\x8b\xd3\xeb\x6b\x38\xbb\x9c\xc3\x14\xae\xa6\xf3\xc5\xec\xe4\xe6\x7c\x3a\x87\xab\x9b\xf9\xd5\xe5\xf5\xe9\x18\xae\x91\xa3\x42\xb6\xff\xff\x9a\x67\xbe\x7b\x16\x21\x45\x12\x52\xb9\xa6\x12\xb7\xa6\x02\x57\x98\x4a\xa5\x50\x88\x07\x04\x8b\x09\xca\x07\x4c\x41\x40\x62\xca\xcd\x6f\x37\x95\xb1\x84\x32\x3a\xf7\x39\xff\x92\x90\x30\xcb\x40\x1b\x1a\x81\x43\x84\x0f\x05\x51\x79\x1c\xc7\xeb\xf5\x7a\x9c\xeb\x6a\x6c\x6c\x1e\xab\x00\xe7\xe2\x8f\xe3\x28\x62\xd0\x44\x28\x75\x66\xc5\x0a\x17\x56\x24\x68\xb9\xee\xce\xc3\x6b\x5c\x7b\x21\x64\x2c\x05\xb2\x22\x91\x3a\x87\x15\x52\x61\x52\x07\x64\xc0\x62\x69\x2c\xd5\x9d\x02\xa9\x33\x63\x57\x9e\x51\x3e\xd8\x25\x37\x46\x6a\x42\xab\x85\x82\x15\x3a\x27\x72\xf4\x2c\x16\x0c\xa6\x9d\x48\xc8\x53\xe6\x7b\xd4\x63\x3f\x8e\x44\xf2\xed\x18\xee\xbe\x3f\xdd\x8f\xa2\x5e\x26\x2a\x45\xc7\x90\x55\xda\x6b\x0d\x94\xc9\x47\x90\x2e\x87\xf0\xfd\x69\x14\xf5\x2c\xba\xae\x38\xa1\xc7\x5a\x1c\xf5\x7a\x71\x0c\x57\x16\x4b\x66\xb9\xa9\x98\x9d\xb5\x73\x1f\x62\xd4\xeb\x3d\x08\x0b\x01\x01\x26\xde\xa0\x47\x9b\x12\x8f\x01\x00\x12\x7a\x1c\xf3\xcf\x88\x4f\x33\x6b\x56\xfe\x94\xcc\x67\x7c\x64\x1f\x63\x3e\x1a\x7a\x21\x19\x2f\x6a\x0b\xc9\x04\xd1\x83\x50\x95\x87\xeb\x1f\x3e\xf6\xe1\xb5\x07\xf5\x67\x63\x32\xd7\x64\xa5\xce\x07\x47\xef\x82\x6a\x2e\x5c\x80\xa9\x55\x97\x32\x9f\x69\xf2\x68\xb9\x70\xc3\xbd\x06\x37\x0e\xd3\xe3\xfd\x06\x2c\xda\x63\x24\x75\x59\xd1\x71\x27\x56\x7f\x14\xa4\xa6\xa2\x20\x7e\x96\x86\x23\x2f\x7e\x8a\x7a\x3d\x99\xc1\x80\x0a\xe9\xc6\xdb\x3e\xdd\x1d\xde\x87\x1f\xf8\x63\x32\xf1\x37\x55\x26\x35\xa6\xa1\xfe\x75\x7b\x6a\x85\x09\xfc\xc2\xf4\x45\x70\xb4\xd6\xd8\x97\xc0\x83\xc2\x3e\x70\x2f\x61\x70\x40\xe5\x10\x18\x9f\x73\xfa\x6d\xc4\xad\x72\x2b\xc0\x8e\x4a\x07\x03\x5e\xbd\xda\x23\x3e\xc0\x47\x4c\x2a\xa6\x26\x58\x7c\x40\x4b\x98\x1e\xc0\x8f\x1f\x35\xed\xea\xfa\xc2\x64\x32\x39\x38\x7c\x3c\x18\xd6\x71\xa4\xa8\x90\xb0\xab\xe3\x63\x88\x38\x46\xaa\xac\x0e\xd9\x66\x52\x0b\x25\xff\xc5\xda\xed\x30\xea\xf1\x4c\x20\x8f\x5a\x6b\x24\xfc\xd8\x06\x64\x26\xbc\x1f\xe5\x0e\xdd\xbd\xc2\x38\x47\x5a\x6c\x4a\x1c\x0c\x5b\x94\x0f\x44\xd8\xca\xcf\xac\x59\x0d\x86\xcf\xb4\xdf\x11\x2f\x4c\x23\xac\x79\xb6\x23\x9f\xf1\x69\xa3\xe2\x09\xdf\xe5\xee\x56\xf1\x93\x70\x83\x61\x8b\xbe\xfd\xa3\x77\xfd\x0e\x07\xb7\x9a\xff\xf0\x34\x0d\x86\x3b\xdd\xf4\xb9\x71\x9e\x61\xda\x26\xbf\x70\x53\x1b\x77\xe7\xa4\xf6\xd2\x65\xd3\xb8\xac\x5c\x31\xe0\xdf\xa6\xc6\x8f\x92\x76\x4b\x3c\x0f\x4d\xd8\x16\x5a\xa1\xfe\x89\x96\x63\x85\x3a\xa7\xa2\x4e\x83\x35\x3e\xc2\x51\xdd\xf5\x56\x73\x76\xbd\x9b\x72\x30\xdc\xe6\x54\x8f\x37\x4c\xf6\x95\x2f\x04\x51\x17\x91\xd5\x7e\x2e\x64\xe3\xab\xa1\xf9\x8e\xdd\x29\x1f\x07\x77\x1c\x63\xad\xb5\x67\x5a\x42\x34\x0d\x83\xdb\xcd\x7e\x06\xbb\xf4\xd2\xc1\xd0\xc3\xd5\x73\xd8\x32\x6e\x42\x68\xa6\x2c\xb8\xf4\x22\xa6\xa6\x77\xdb\x3f\x99\x9f\x4e\x17\xa7\x7d\x9e\x9a\xbd\x92\xb7\xfd\x26\xa0\x66\x70\x82\x9a\xf1\x67\x4f\x51\xf3\xe1\x6a\xbf\x99\xc0\x51\x93\xd9\xce\x85\xa1\x50\xbf\x39\x6a\x2e\xb3\xbd\xf9\xbe\x68\x00\x77\xf7\x5b\x4f\x2f\x28\x76\x98\xc4\xda\xcc\xa6\x38\x86\x66\x94\xf9\x5d\x60\x51\x10\x3a\x7e\x18\x30\x1b\xcc\xf2\x2b\x26\xbc\x5c\x79\xe9\xf2\x3e\xf6\xaa\x90\xa2\x93\x16\x53\xc8\x24\xaa\x14\x0c\xbf\x10\xf9\xe9\xf1\xd5\x19\xed\x01\x1d\x5a\xc9\x88\x7e\x0f\x8f\xc3\x6b\x56\x32\xa8\x96\x09\xd2\x06\x32\x14\x54\x59\xe4\xf5\x5d\x0a\xe7\x60\x85\x42\x4b\x9d\x67\x95\x52\x1b\x30\x36\x45\x06\x0f\xf7\x8a\xf3\x80\x64\x78\xc1\x5b\x07\xeb\xc2\x40\x6a\x74\xbf\x5e\xea\xa5\x45\x7e\xaf\x8d\xe0\x6b\xe5\x88\x5f\x75\xa5\x12\x1b\x90\x34\x8e\x7a\x4d\x52\xed\xfd\xcc\x99\x6f\x47\xc4\x19\xbe\x10\x7f\x5e\xbe\x4d\x9b\xbb\xdb\xd7\x1f\xf3\x5f\x77\xef\xd6\xdd\xee\x6e\xdc\xe7\xe9\xef\xae\xd7\x66\x82\xba\x3b\xb4\x3d\x57\xdd\x45\xe9\x25\xfe\xaf\xbb\x22\x5b\xdc\xf7\x02\xcf\xe0\xad\x81\xff\x0b\x51\xca\x55\x3b\x27\xb9\x0a\xf1\x78\x2e\x6c\xd5\xfd\x5f\x73\xbf\x71\x17\x07\x5c\x9c\x6f\xb8\xe1\x87\x71\xa8\x51\xcd\x41\xe6\x6d\x38\xb8\xfb\x86\x9b\xfb\xfd\x3c\xad\xa7\xa0\xa5\xd7\x30\xb3\xb9\x3f\x83\xe8\x85\xc5\xbd\x0d\x42\x4e\x0e\xdf\x83\xfc\xd0\x36\xa8\xef\xb0\xf7\x20\x5f\xbf\x6e\x5c\xb6\xe5\x77\xf2\xbe\xb9\xc2\xb6\x0b\x6a\x47\x3e\x6c\x07\x54\x6f\xb4\xa0\x12\xf5\x9e\xa2\xa7\xe8\xbf\x00\x00\x00\xff\xff\x2a\xac\x9f\xff\xa9\x0d\x00\x00") +var _call_tracer_jsJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x5f\x6f\xdb\x38\x0c\x7f\x8e\x3f\x05\xaf\x0f\x4b\x82\x65\x71\xbb\x03\xf6\xd0\x2d\x03\x72\x45\xbb\x05\xe8\xb5\x45\x9a\xde\x50\x14\x7d\x50\x6c\xda\xd6\xa6\x48\x86\x44\x37\xcd\x6d\xfd\xee\x07\x4a\x76\x6a\x67\x59\x6f\x2f\x06\x2c\x92\x3f\xfe\xfb\x51\x54\x1c\xc3\x89\x29\x37\x56\xe6\x05\xc1\xdb\xc3\xb7\x47\xb0\x28\x10\x72\xf3\x06\xa9\x40\x8b\xd5\x0a\xa6\x15\x15\xc6\xba\x28\x8e\x61\x51\x48\x07\x99\x54\x08\xd2\x41\x29\x2c\x81\xc9\x80\x76\xf4\x95\x5c\x5a\x61\x37\xe3\x28\x8e\x83\xcd\x5e\x31\x23\x64\x16\x11\x9c\xc9\x68\x2d\x2c\x1e\xc3\xc6\x54\x90\x08\x0d\x16\x53\xe9\xc8\xca\x65\x45\x08\x92\x40\xe8\x34\x36\x16\x56\x26\x95\xd9\x86\x21\x25\x41\xa5\x53\xb4\xde\x35\xa1\x5d\xb9\x26\x8e\x4f\x17\x37\x70\x8e\xce\xa1\x85\x4f\xa8\xd1\x0a\x05\x57\xd5\x52\xc9\x04\xce\x65\x82\xda\x21\x08\x07\x25\x9f\xb8\x02\x53\x58\x7a\x38\x36\x3c\xe3\x50\xae\xeb\x50\xe0\xcc\x54\x3a\x15\x24\x8d\x1e\x01\x4a\x8e\x1c\x1e\xd0\x3a\x69\x34\xfc\xd9\xb8\xaa\x01\x47\x60\x2c\x83\x0c\x04\x71\x02\x16\x4c\xc9\x76\x43\x10\x7a\x03\x4a\xd0\xb3\xe9\x6f\x14\xe4\x39\xef\x14\xa4\xf6\x6e\x0a\x53\x22\x50\x21\x88\xb3\x5e\x4b\xa5\x60\x89\x50\x39\xcc\x2a\x35\x62\xb4\x65\x45\xf0\x65\xb6\xf8\x7c\x79\xb3\x80\xe9\xc5\x2d\x7c\x99\xce\xe7\xd3\x8b\xc5\xed\x7b\x58\x4b\x2a\x4c\x45\x80\x0f\x18\xa0\xe4\xaa\x54\x12\x53\x58\x0b\x6b\x85\xa6\x0d\x98\x8c\x11\xfe\x3e\x9d\x9f\x7c\x9e\x5e\x2c\xa6\x7f\xcd\xce\x67\x8b\x5b\x30\x16\xce\x66\x8b\x8b\xd3\xeb\x6b\x38\xbb\x9c\xc3\x14\xae\xa6\xf3\xc5\xec\xe4\xe6\x7c\x3a\x87\xab\x9b\xf9\xd5\xe5\xf5\xe9\x18\xae\x91\xa3\x42\xb6\xff\xff\x9a\x67\xbe\x7b\x16\x21\x45\x12\x52\xb9\xa6\x12\xb7\xa6\x02\x57\x98\x4a\xa5\x50\x88\x07\x04\x8b\x09\xca\x07\x4c\x41\x40\x62\xca\xcd\x6f\x37\x95\xb1\x84\x32\x3a\xf7\x39\xff\x92\x90\x30\xcb\x40\x1b\x1a\x81\x43\x84\x0f\x05\x51\x79\x1c\xc7\xeb\xf5\x7a\x9c\xeb\x6a\x6c\x6c\x1e\xab\x00\xe7\xe2\x8f\xe3\x28\x62\xd0\x44\x28\x75\x66\xc5\x0a\x17\x56\x24\x68\xb9\xee\xce\xc3\x6b\x5c\x7b\x21\x64\x2c\x05\xb2\x22\x91\x3a\x87\x15\x52\x61\x52\x07\x64\xc0\x62\x69\x2c\xd5\x9d\x02\xa9\x33\x63\x57\x9e\x51\x3e\xd8\x25\x37\x46\x6a\x42\xab\x85\x82\x15\x3a\x27\x72\xf4\x2c\x16\x0c\xa6\x9d\x48\xc8\x53\xe6\x7b\xd4\x63\x3f\x8e\x44\xf2\xed\x18\xee\xbe\x3f\xdd\x8f\xa2\x5e\x26\x2a\x45\xc7\x90\x55\xda\x6b\x0d\x94\xc9\x47\x90\x2e\x87\xf0\xfd\x69\x14\xf5\x2c\xba\xae\x38\xa1\xc7\x5a\x1c\xf5\x7a\x71\x0c\x57\x16\x4b\x66\xb9\xa9\x98\x9d\xb5\x73\x1f\x62\xd4\xeb\x3d\x08\x0b\x01\x01\x26\xde\xa0\x47\x9b\x12\x8f\x01\x00\x12\x7a\x1c\xf3\xcf\x88\x4f\x33\x6b\x56\xfe\x94\xcc\x67\x7c\x64\x1f\x63\x3e\x1a\x7a\x21\x19\x2f\x6a\x0b\xc9\x04\xd1\x83\x50\x95\x87\xeb\x1f\x3e\xf6\xe1\xb5\x07\xf5\x67\x63\x32\xd7\x64\xa5\xce\x07\x47\xef\x82\x6a\x2e\x5c\x80\xa9\x55\x97\x32\x9f\x69\xf2\x68\xb9\x70\xc3\xbd\x06\x37\x0e\xd3\xe3\xfd\x06\x2c\xda\x63\x24\x75\x59\xd1\x71\x27\x56\x7f\x14\xa4\xa6\xa2\x20\x7e\x96\x86\x23\x2f\x7e\x8a\x7a\x3d\x99\xc1\x80\x0a\xe9\xc6\xdb\x3e\xdd\x1d\xde\x87\x1f\xf8\x63\x32\xf1\x37\x55\x26\x35\xa6\xa1\xfe\x75\x7b\x6a\x85\x09\xfc\xc2\xf4\x45\x70\xb4\xd6\xd8\x97\xc0\x83\xc2\x3e\x70\x2f\x61\x70\x40\xe5\x10\x18\x9f\x73\xfa\x6d\xc4\xad\x72\x2b\xc0\x8e\x4a\x07\x03\x5e\xbd\xda\x23\x3e\xc0\x47\x4c\x2a\xa6\x26\x58\x7c\x40\x4b\x98\x1e\xc0\x8f\x1f\x35\xed\xea\xfa\xc2\x64\x32\x39\x38\x7c\x3c\x18\xd6\x71\xa4\xa8\x90\xb0\xab\xe3\x63\x88\x38\x46\xaa\xac\x0e\xd9\x66\x52\x0b\x25\xff\xc5\xda\xed\x30\xea\xf1\x4c\x20\x8f\x5a\x6b\x24\xfc\xd8\x06\x64\x26\xbc\x1f\xe5\x0e\xdd\xbd\xc2\x38\x47\x5a\x6c\x4a\x1c\x0c\x5b\x94\x0f\x44\xd8\xca\xcf\xac\x59\x0d\x86\xcf\xb4\xdf\x11\x2f\x4c\x23\xac\x79\xb6\x23\x9f\xf1\x69\xa3\xe2\x09\xdf\xe5\xee\x56\xf1\x93\x70\x83\x61\x8b\xbe\xfd\xa3\x77\xfd\x0e\x07\xb7\x9a\xff\xf0\x34\x0d\x86\x3b\xdd\xf4\xb9\x71\x9e\x61\xda\x26\xbf\x70\x53\x1b\x77\xe7\xa4\xf6\xd2\x65\xd3\xb8\xac\x5c\x31\xe0\xdf\xa6\xc6\x8f\x92\x76\x4b\x3c\x0f\x4d\xd8\x16\x5a\xa1\xfe\x89\x96\x63\x85\x3a\xa7\xa2\x4e\x83\x35\x3e\xc2\x51\xdd\xf5\x56\x73\x76\xbd\x9b\x72\x30\xdc\xe6\x54\x8f\x37\x4c\xf6\x95\x2f\x04\x51\x17\x91\xd5\x7e\x2e\x64\xe3\xab\xa1\xf9\x8e\xdd\x29\x1f\x07\x77\x1c\x63\xad\xb5\x67\x5a\x42\x34\x0d\x83\xdb\xcd\x7e\x06\xbb\xf4\xd2\xc1\xd0\xc3\xd5\x73\xd8\x32\x6e\x42\x68\xa6\x2c\xb8\xf4\x22\xa6\xa6\x77\xdb\x3f\x99\x9f\x4e\x17\xa7\x7d\x9e\x9a\xbd\x92\xb7\xfd\x26\xa0\x66\x70\x82\x9a\xf1\x67\x4f\x51\xf3\xe1\x6a\xbf\x99\xc0\x51\x93\xd9\xce\x85\xa1\x50\xbf\x39\x6a\x2e\xb3\xbd\xf9\xbe\x68\x00\x77\xf7\x5b\x4f\x2f\x28\x76\x98\xc4\xda\xcc\xa6\x38\x86\x66\x94\xf9\x5d\x60\x51\x10\x3a\x7e\x18\x30\x1b\xcc\xf2\x2b\x26\xbc\x5c\x79\xe9\xf2\x3e\xf6\xaa\x90\xa2\x93\x16\x53\xc8\x24\xaa\x14\x0c\xbf\x10\xf9\xe9\xf1\xd5\x19\xed\x01\x1d\x5a\xc9\x88\x7e\x0f\x8f\xc3\x6b\x56\x32\xa8\x96\x09\xd2\x06\x32\x14\x54\x59\xe4\xf5\x5d\x0a\xe7\x60\x85\x42\x4b\x9d\x67\x95\x52\x1b\x30\x36\x45\x06\x0f\xf7\x8a\xf3\x80\x64\x78\xc1\x5b\x07\xeb\xc2\x40\x6a\x74\xbf\x5e\xea\xa5\x45\x7e\xaf\x8d\xe0\x6b\xe5\x88\x5f\x75\xa5\x12\x1b\x90\x34\x8e\x7a\x4d\x52\xed\xfd\xcc\x99\x6f\x47\xc4\x19\xbe\x10\x7f\x5e\xbe\x4d\x9b\xbb\xdb\xd7\x1f\xf3\x5f\x77\xef\xd6\xdd\xee\x6e\xdc\xe7\xe9\xef\xae\xd7\x66\x82\xba\x3b\xb4\x3d\x57\xdd\x45\xe9\x25\xfe\xaf\xbb\x22\x5b\xdc\xf7\x02\xcf\xe0\xad\x81\xff\x0b\x51\xca\x55\x3b\x27\xb9\x0a\xf1\x78\x2e\x6c\xd5\xfd\x5f\x73\xbf\x71\x17\x07\x5c\x9c\x6f\xb8\xe1\x87\x71\xa8\x51\xcd\x41\xe6\x6d\x38\xb8\xfb\x86\x9b\xfb\xfd\x3c\xad\xa7\xa0\xa5\xd7\x30\xb3\xb9\x3f\x83\xe8\x85\xc5\xbd\x0d\x42\x4e\x0e\xdf\x83\xfc\xd0\x36\xa8\xef\xb0\xf7\x20\x5f\xbf\x6e\x5c\xb6\xe5\x77\xf2\xbe\xb9\xc2\xb6\x0b\x6a\x47\x3e\x6c\x07\x54\x6f\xb4\xa0\x12\xf5\x9e\xa2\xa7\xe8\xbf\x00\x00\x00\xff\xff\x2a\xac\x9f\xff\xa9\x0d\x00\x00") -func call_tracerJsBytes() ([]byte, error) { +func call_tracer_jsJsBytes() ([]byte, error) { return bindataRead( - _call_tracerJs, - "call_tracer.js", + _call_tracer_jsJs, + "call_tracer_js.js", ) } -func call_tracerJs() (*asset, error) { - bytes, err := call_tracerJsBytes() +func call_tracer_jsJs() (*asset, error) { + bytes, err := call_tracer_jsJsBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "call_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + info := bindataFileInfo{name: "call_tracer_js.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x42, 0x13, 0x7a, 0x14, 0xbf, 0xa7, 0x49, 0x4f, 0xb4, 0x4f, 0x45, 0x1, 0xbc, 0x9e, 0xd1, 0x8e, 0xc7, 0xee, 0x61, 0xfa, 0x82, 0x52, 0xa4, 0x78, 0xfe, 0xff, 0xb1, 0x68, 0x1d, 0xcc, 0x1d, 0x8e}} return a, nil } @@ -179,7 +158,7 @@ func call_tracer_legacyJs() (*asset, error) { return a, nil } -var _evmdis_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\xdf\x6f\xda\xca\x12\x7e\x86\xbf\x62\x94\x27\x50\x29\x60\x63\x08\x38\x27\x47\xe2\xa6\xf4\x1c\xae\xd2\x24\x02\x72\x8f\x2a\x94\x87\x05\xc6\xb0\xaa\xf1\x5a\xbb\x6b\x72\xb8\x55\xfe\xf7\xab\xd9\x59\x03\xf9\x75\xdb\x4a\xa7\x0f\x3b\xb5\x77\xbe\x6f\xbe\x9d\x19\xcf\x92\x56\x0b\xae\x54\xbe\xd7\x72\xbd\xb1\x10\xb6\x83\x73\x98\x6d\x10\xd6\xea\x23\xda\x0d\x6a\x2c\xb6\x30\x2c\xec\x46\x69\x53\x6d\xb5\x60\xb6\x91\x06\x12\x99\x22\x48\x03\xb9\xd0\x16\x54\x02\xf6\x85\x7f\x2a\x17\x5a\xe8\x7d\xb3\xda\x6a\x31\xe6\xcd\x6d\x62\x48\x34\x22\x18\x95\xd8\x47\xa1\x31\x86\xbd\x2a\x60\x29\x32\xd0\xb8\x92\xc6\x6a\xb9\x28\x2c\x82\xb4\x20\xb2\x55\x4b\x69\xd8\xaa\x95\x4c\xf6\x44\x29\x2d\x14\xd9\x0a\xb5\x0b\x6d\x51\x6f\x4d\xa9\xe3\x8f\x9b\x7b\xb8\x46\x63\x50\xc3\x1f\x98\xa1\x16\x29\xdc\x15\x8b\x54\x2e\xe1\x5a\x2e\x31\x33\x08\xc2\x40\x4e\x6f\xcc\x06\x57\xb0\x70\x74\x04\xfc\x4c\x52\xa6\x5e\x0a\x7c\x56\x45\xb6\x12\x56\xaa\xac\x01\x28\x49\x39\xec\x50\x1b\xa9\x32\xe8\x94\xa1\x3c\x61\x03\x94\x26\x92\x9a\xb0\x74\x00\x0d\x2a\x27\x5c\x1d\x44\xb6\x87\x54\xd8\x23\xf4\x27\x12\x72\x3c\xf7\x0a\x64\xe6\xc2\x6c\x54\x8e\x60\x37\xc2\xd2\xa9\x1f\x65\x9a\xc2\x02\xa1\x30\x98\x14\x69\x83\xd8\x16\x85\x85\xbf\xc6\xb3\x3f\x6f\xef\x67\x30\xbc\xf9\x0a\x7f\x0d\x27\x93\xe1\xcd\xec\xeb\x05\x3c\x4a\xbb\x51\x85\x05\xdc\x21\x53\xc9\x6d\x9e\x4a\x5c\xc1\xa3\xd0\x5a\x64\x76\x0f\x2a\x21\x86\x2f\xa3\xc9\xd5\x9f\xc3\x9b\xd9\xf0\x5f\xe3\xeb\xf1\xec\x2b\x28\x0d\x9f\xc7\xb3\x9b\xd1\x74\x0a\x9f\x6f\x27\x30\x84\xbb\xe1\x64\x36\xbe\xba\xbf\x1e\x4e\xe0\xee\x7e\x72\x77\x3b\x1d\x35\x61\x8a\xa4\x0a\x09\xff\xe3\x9c\x27\xae\x7a\x1a\x61\x85\x56\xc8\xd4\x94\x99\xf8\xaa\x0a\x30\x1b\x55\xa4\x2b\xd8\x88\x1d\x82\xc6\x25\xca\x1d\xae\x40\xc0\x52\xe5\xfb\x9f\x2e\x2a\x71\x89\x54\x65\x6b\x77\xe6\x77\x1b\x12\xc6\x09\x64\xca\x36\xc0\x20\xc2\x6f\x1b\x6b\xf3\xb8\xd5\x7a\x7c\x7c\x6c\xae\xb3\xa2\xa9\xf4\xba\x95\x32\x9d\x69\xfd\xde\xac\x12\x27\xee\xb6\x2b\x69\x66\x5a\x2c\x51\x83\x46\x5b\xe8\xcc\x80\x29\x92\x44\x2e\x25\x66\x16\x64\x96\x28\xbd\x75\x7d\x02\x89\x56\x5b\x10\x60\xc9\x19\xac\x82\x1c\x35\x6d\x7a\x8e\x8f\xc6\xee\x53\xa7\x73\x25\x8d\x30\x06\xb7\x8b\x74\xdf\xac\x7e\xaf\x56\x8c\x15\xcb\x6f\x31\xcc\xbf\xab\xdc\xc4\x30\x7f\x78\x7a\x68\x54\xab\x95\x2c\x2f\xcc\x06\x4d\x0c\xdf\xdb\x31\xb4\x1b\x10\xc4\x10\x34\x20\x74\x6b\xc7\xad\x91\x5b\xbb\x6e\xed\xb9\xf5\xdc\xad\x7d\xb7\x0e\xdc\x1a\xb4\xd9\x30\x3a\x60\xb7\x80\xfd\x02\x76\x0c\xd8\x33\x64\xcf\xd0\xc7\xe1\x40\x21\x47\x0a\x39\x54\xc8\xb1\x42\x66\xe9\xb0\x4b\xc4\x2c\x11\xb3\x74\x99\xa5\xcb\x2c\x5d\x76\xe9\x32\x4b\xd7\x0b\xee\xba\xf3\x74\x99\xa5\x7b\xce\x4f\xcc\xd2\x65\x96\x1e\x1f\xb9\xc7\x80\x9e\x3f\x22\x03\x7a\x2c\xbe\xc7\x80\x1e\x03\xfa\x0c\xe8\x73\xd8\x7e\xc8\x4f\x1d\x36\xcc\xd2\xe7\xb0\xfd\x1e\x1b\x0e\xdb\x67\x96\x3e\xb3\x0c\x58\xfc\x20\x70\x7b\x03\x8e\x37\xe0\x78\x03\x9f\xd5\x32\xad\x3e\xaf\x6d\x9f\xd8\x76\xe8\x6d\xc7\xdb\xc8\xdb\xae\xb7\x3e\xf3\x6d\x9f\xfa\xb6\xcf\x7d\xdb\xf3\x1d\xea\xe4\xf9\x02\xcf\x17\x78\xbe\xc0\xf3\x05\x9e\xaf\xac\x64\x59\xca\xb2\x96\xbe\x98\x81\xaf\x66\xe0\xcb\x19\xf8\x7a\x06\xbe\xa0\x81\xaf\x68\xe0\x4b\x1a\xf8\x9a\x06\xa1\xe7\x0b\xfb\x31\x84\x64\x07\x31\x74\x1a\x10\x74\xda\x31\x44\x64\x83\x18\xba\x64\xc3\x18\x7a\x64\x3b\x31\x9c\x93\x8d\x62\xe8\x93\xed\xc6\x30\x20\x4b\x7c\xd4\xb5\x1d\x22\x24\xc6\x0e\x29\x24\xca\x0e\x49\x24\xce\x88\x34\x12\x69\x44\x22\x89\x35\x22\x95\x44\x1b\x91\x4c\xe2\x8d\x22\xd6\x11\x75\x59\x47\xd4\x63\x1d\xd1\x39\xeb\xa0\xee\x73\x80\x01\xeb\xa0\xfe\x23\x1d\xd4\x80\xa4\xc3\x75\x20\xe9\x70\x3d\x48\x3a\x5c\x17\x12\x25\xf5\xa1\xd3\xe1\x3a\x91\x48\xa9\x17\x9d\x0e\xd7\x8d\x44\xeb\xfa\x91\x78\x7d\x47\x06\xbd\xc0\xdb\xd0\xdb\x8e\xb7\x91\xb3\x61\xe4\xbf\xa2\xc8\x7f\x46\x91\xff\x8e\xa2\x8e\xdf\xf7\x7e\xee\x23\x78\xa2\xef\xbc\xd5\x02\x8d\xa6\x48\x2d\x4d\x7f\x99\xed\xd4\x37\x9a\xcf\x1b\xcc\x40\xa4\xa9\x1b\x64\x2a\x5f\xaa\x15\x1a\x1e\x90\x0b\xc4\x0c\xa4\x45\x2d\xe8\x86\x50\x3b\xd4\x74\x39\x96\xa3\xc9\xd1\x11\x26\x91\x99\x48\x4b\x62\x3f\x44\x69\x30\xc9\x6c\xdd\xac\x56\xf8\x7d\x0c\x49\x91\x2d\x69\x74\xd5\xea\xf0\xdd\x53\x80\xdd\x48\xd3\x74\x23\x69\xde\x7e\x68\xaa\xdc\x5c\x40\xa9\x33\x11\x6f\xc9\x24\x6a\xb1\xb4\x85\x48\x01\xff\xc6\x65\xe1\x66\xa1\x4a\x40\x64\x5e\x39\x24\x3c\xf1\x2b\x0e\x7f\x12\x35\x55\xeb\x06\xac\x16\x14\xbc\x0c\x61\x2c\xe6\xa7\x11\xe8\xde\xc0\x1d\xea\x7d\xc9\xe5\xee\x41\x0a\xf9\x9f\x2f\x3e\x1c\x12\x35\xe1\xde\x64\xae\x56\x2a\x3b\xa1\x21\xd1\x62\x8b\x70\x79\x7a\xba\xe3\x7f\x9b\x29\x66\x6b\xbb\x81\x8f\x10\x3c\x5c\x54\x3d\x02\xb5\x56\x1a\x2e\x21\x55\xeb\xe6\x1a\xed\x88\x1e\x6b\xf5\x8b\x6a\xa5\x22\x13\xa8\xb9\x5d\xa6\xaf\x38\xee\xf9\x99\x7b\x75\xf6\x00\x97\x0c\x25\xcf\x27\xc0\xd4\x20\x10\xc0\xd3\x7c\xc2\xdc\x6e\x6a\x75\xb8\x3c\x95\xe2\xe3\x7b\x3a\x95\xd3\xa5\x02\x97\xfc\x54\x51\x79\x0c\xf4\x8f\x08\x54\xde\xb4\xea\xa6\xd8\x2e\x50\xd7\xea\x0d\xb7\xbd\x22\x42\x88\xe1\x39\x3f\xef\x95\x65\x9e\x3f\xb8\xe7\x27\x92\xe4\xd4\x3b\xc5\x54\xdb\xf2\xe4\xbf\x43\xdb\x47\x77\x67\xcf\x35\xee\x54\x0e\x97\x70\x70\x9c\xbf\x82\x70\xb2\x08\x91\x28\x5d\x23\x94\x84\x4b\x68\x5f\x80\x84\xdf\xf8\x6c\xfe\x06\x9b\x33\x5b\x53\xe5\x0f\x17\x20\x3f\x7c\xa8\x3b\x50\xc5\xbf\x65\x8d\x4d\x72\x75\x39\xe2\x84\xe4\x88\xdf\x6a\xb2\xde\xb4\x6a\x6a\xb5\xcc\xd6\xb5\xa0\x57\x77\xb9\xaf\x3c\xd1\x62\x1e\xa5\x5d\xb2\xbf\x4b\x89\x77\xaa\xfb\x33\x2c\x85\x41\x38\xbb\x1a\x5e\x5f\x9f\xc5\x70\x7c\xb8\xba\xfd\x34\x3a\x8b\x0f\x87\x94\x99\xb1\xf4\xfb\x95\x4b\x7c\x12\xb7\x53\x6f\xee\x44\x5a\xe0\x6d\xc2\xf5\x3e\xb8\xcb\xff\xe2\x6b\xef\xe8\x95\x37\x17\x70\x7e\xb6\x16\xc6\xb5\xc3\x0b\x40\xfb\x5d\x80\x55\x6f\xf9\x07\xcf\xd3\xf0\x1c\xe2\x98\xde\x42\x85\x27\xa8\x17\x18\x99\xe5\x85\x3d\x60\xb6\xb8\x55\x7a\xdf\x34\xf4\xcb\xa7\xe6\x73\xd2\x38\x24\xe7\x83\x3f\xf7\x0b\x8a\x63\xaf\x67\x45\x9a\x3e\xdf\xe3\x39\xf2\xce\xa6\xca\x39\x27\x73\xdf\x3b\x27\x1f\x81\x6b\x01\xf6\xf3\xd1\x16\x1a\xc5\xb7\x8b\x63\x45\x3f\x8d\xae\x47\x7f\x0c\x67\xa3\x67\x95\x9d\xce\x86\xb3\xf1\x15\xbf\xfa\x71\x6d\xc3\x5f\xaa\xed\xeb\x4e\x38\x9e\xc3\x1d\x03\x5e\xb5\xe0\xdb\x2d\xf0\xcb\x3d\xf0\x4b\x4d\x70\x2c\xe8\x3f\x51\xd1\xff\x5f\xd2\x7f\xba\xa6\x93\xd1\xec\x7e\x72\x73\x52\x3a\xfa\x7b\xe5\x27\xbe\x19\xef\xfa\x76\xdd\x82\x57\xee\x3c\xbe\xfc\x15\xf7\x46\xe3\xab\xc2\x36\x5c\xe8\x0f\x25\xeb\x3b\x7a\xa7\xb3\xdb\xbb\x63\xef\xdd\x8f\xaf\xc6\x87\xa1\xf2\xa3\x18\xed\x06\xb4\xdf\x61\xfd\xf7\xfd\x97\xbb\x4f\xa3\xe9\xcc\x33\x95\x99\xcd\x97\x87\xcf\x74\x8d\xf6\xee\xaa\x76\x32\x03\x65\x52\xce\x3f\x69\xee\x28\xcd\xe5\xf4\x3b\xa0\x53\xcc\x0e\xf0\x67\x37\x07\x7c\x84\xf6\xdf\x5d\x3c\x72\x1d\x87\xfb\xcb\x82\xf9\x1b\xcc\x11\x1f\xeb\xfa\xec\x22\x3d\x9e\xee\xf9\x1d\xc4\xf8\x6a\xe5\xa9\xfa\x54\xfd\x5f\x00\x00\x00\xff\xff\xdf\x2f\xd9\xfa\x63\x10\x00\x00") +var _evmdis_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x97\x6f\x6f\xda\x48\x13\xc0\x5f\xc3\xa7\x18\xe5\x15\xa8\x14\xb0\x31\x04\x9c\xcb\x49\x3c\x29\xe9\xe5\x51\x9a\x44\x40\xee\x54\xa1\xbc\x58\x60\x0c\xab\x1a\xaf\xb5\xbb\x26\xc7\x53\xe5\xbb\x3f\x9a\x9d\x35\x90\x7f\xd7\x56\xba\xbe\xf0\xd4\xde\x99\xdf\xfc\xdd\x5d\xd2\x6a\xc1\x85\xca\x77\x5a\xae\xd6\x16\xc2\x76\x70\x0a\xd3\x35\xc2\x4a\x7d\x44\xbb\x46\x8d\xc5\x06\x86\x85\x5d\x2b\x6d\xaa\xad\x16\x4c\xd7\xd2\x40\x22\x53\x04\x69\x20\x17\xda\x82\x4a\xc0\xbe\xd0\x4f\xe5\x5c\x0b\xbd\x6b\x56\x5b\x2d\xb6\x79\x73\x99\x08\x89\x46\x04\xa3\x12\xfb\x28\x34\xc6\xb0\x53\x05\x2c\x44\x06\x1a\x97\xd2\x58\x2d\xe7\x85\x45\x90\x16\x44\xb6\x6c\x29\x0d\x1b\xb5\x94\xc9\x8e\x90\xd2\x42\x91\x2d\x51\x3b\xd7\x16\xf5\xc6\x94\x71\x7c\xbe\xb9\x87\x6b\x34\x06\x35\x7c\xc6\x0c\xb5\x48\xe1\xae\x98\xa7\x72\x01\xd7\x72\x81\x99\x41\x10\x06\x72\xfa\x62\xd6\xb8\x84\xb9\xc3\x91\xe1\x25\x85\x32\xf1\xa1\xc0\xa5\x2a\xb2\xa5\xb0\x52\x65\x0d\x40\x49\x91\xc3\x16\xb5\x91\x2a\x83\x4e\xe9\xca\x03\x1b\xa0\x34\x41\x6a\xc2\x52\x02\x1a\x54\x4e\x76\x75\x10\xd9\x0e\x52\x61\x0f\xa6\x3f\x51\x90\x43\xde\x4b\x90\x99\x73\xb3\x56\x39\x82\x5d\x0b\x4b\x59\x3f\xca\x34\x85\x39\x42\x61\x30\x29\xd2\x06\xd1\xe6\x85\x85\xbf\xae\xa6\x7f\xdc\xde\x4f\x61\x78\xf3\x15\xfe\x1a\x8e\xc7\xc3\x9b\xe9\xd7\x33\x78\x94\x76\xad\x0a\x0b\xb8\x45\x46\xc9\x4d\x9e\x4a\x5c\xc2\xa3\xd0\x5a\x64\x76\x07\x2a\x21\xc2\x97\xd1\xf8\xe2\x8f\xe1\xcd\x74\xf8\x9f\xab\xeb\xab\xe9\x57\x50\x1a\x2e\xaf\xa6\x37\xa3\xc9\x04\x2e\x6f\xc7\x30\x84\xbb\xe1\x78\x7a\x75\x71\x7f\x3d\x1c\xc3\xdd\xfd\xf8\xee\x76\x32\x6a\xc2\x04\x29\x2a\x24\xfb\x1f\xd7\x3c\x71\xdd\xd3\x08\x4b\xb4\x42\xa6\xa6\xac\xc4\x57\x55\x80\x59\xab\x22\x5d\xc2\x5a\x6c\x11\x34\x2e\x50\x6e\x71\x09\x02\x16\x2a\xdf\xfd\x74\x53\x89\x25\x52\x95\xad\x5c\xce\xef\x0e\x24\x5c\x25\x90\x29\xdb\x00\x83\x08\xbf\xad\xad\xcd\xe3\x56\xeb\xf1\xf1\xb1\xb9\xca\x8a\xa6\xd2\xab\x56\xca\x38\xd3\xfa\xbd\x59\x25\x26\x6e\x37\x4b\x69\xa6\x5a\x2c\x50\x83\x46\x5b\xe8\xcc\x80\x29\x92\x44\x2e\x24\x66\x16\x64\x96\x28\xbd\x71\x73\x02\x89\x56\x1b\x10\x60\x49\x19\xac\x82\x1c\x35\x2d\x7a\xc6\x47\x63\x77\xa9\x8b\x73\x29\x8d\x30\x06\x37\xf3\x74\xd7\xac\x7e\xaf\x56\x8c\x15\x8b\x6f\x31\xcc\xbe\xab\xdc\xc4\x30\x7b\x78\x7a\x68\x54\xab\x95\x2c\x2f\xcc\x1a\x4d\x0c\xdf\xdb\x31\xb4\x1b\x10\xc4\x10\x34\x20\x74\xcf\x8e\x7b\x46\xee\xd9\x75\xcf\x9e\x7b\x9e\xba\x67\xdf\x3d\x07\xee\x19\xb4\x59\xb0\x75\xc0\x6a\x01\xeb\x05\xac\x18\xb0\x66\xc8\x9a\xa1\xf7\xc3\x8e\x42\xf6\x14\xb2\xab\x90\x7d\x85\x4c\xe9\xb0\x4a\xc4\x94\x88\x29\x5d\xa6\x74\x99\xd2\x65\x95\x2e\x53\xba\x3e\xe0\xae\xcb\xa7\xcb\x94\xee\x29\xbf\x31\xa5\xcb\x94\x1e\xa7\xdc\x63\x83\x9e\x4f\x91\x0d\x7a\x1c\x7c\x8f\x0d\x7a\x6c\xd0\x67\x83\x3e\xbb\xed\x87\xfc\xd6\x61\xc1\x94\x3e\xbb\xed\xf7\x58\xb0\xdb\x3e\x53\xfa\x4c\x19\x70\xf0\x83\xc0\xad\x0d\xd8\xdf\x80\xfd\x0d\x7c\x55\xcb\xb2\xfa\xba\xb6\x7d\x61\xdb\xa1\x97\x1d\x2f\x23\x2f\xbb\x5e\xfa\xca\xb7\x7d\xe9\xdb\xbe\xf6\x6d\xcf\xdb\xf7\xc9\xf3\x02\xcf\x0b\x3c\x2f\xf0\xbc\xc0\xf3\xca\x4e\x96\xad\x2c\x7b\xe9\x9b\x19\xf8\x6e\x06\xbe\x9d\x81\xef\x67\xe0\x1b\x1a\xf8\x8e\x06\xbe\xa5\x81\xef\x69\x10\x7a\x5e\xd8\x8f\x21\x24\x39\x88\xa1\xd3\x80\xa0\xd3\x8e\x21\x22\x19\xc4\xd0\x25\x19\xc6\xd0\x23\xd9\x89\xe1\x94\x64\x14\x43\x9f\x64\x37\x86\x01\x49\xe2\xd1\xd4\x76\x08\x48\xc4\x0e\x45\x48\xc8\x0e\x85\x48\xcc\x88\x62\x24\x68\x44\x41\x12\x35\xa2\x28\x09\x1b\x51\x98\xc4\x8d\x22\x8e\x23\xea\x72\x1c\x51\x8f\xe3\x88\x4e\x39\x0e\x9a\x3e\x67\x30\xe0\x38\x68\xfe\x28\x0e\x1a\x40\x8a\xc3\x4d\x20\xc5\xe1\x66\x90\xe2\x70\x53\x48\x48\x9a\x43\x17\x87\x9b\x44\x82\xd2\x2c\xba\x38\xdc\x34\x12\xd6\xcd\x23\x71\xfd\x44\x06\xbd\xc0\xcb\xd0\xcb\x8e\x97\x91\x93\x61\xe4\x77\x51\xe4\xb7\x51\xe4\xf7\x51\xd4\xf1\xeb\x5e\xcf\x6d\x82\x27\xda\xe7\xad\x16\x68\x34\x45\x6a\xe9\xf4\x97\xd9\x56\x7d\xa3\xf3\x79\x8d\x19\x88\x34\x75\x07\x99\xca\x17\x6a\x89\x86\x0f\xc8\x39\x62\x06\xd2\xa2\x16\x74\x43\xa8\x2d\x6a\xba\x1c\xcb\xa3\xc9\xe1\xc8\x26\x91\x99\x48\x4b\xb0\x3f\x44\xe9\x60\x92\xd9\xaa\x59\xad\xf0\xf7\x18\x92\x22\x5b\xd0\xd1\x55\xab\xc3\x77\x8f\x00\xbb\x96\xa6\xe9\x8e\xa4\x59\xfb\xa1\xa9\x72\x73\x06\x65\x9c\x89\x78\x2b\x4c\x42\x8b\x85\x2d\x44\x0a\xf8\x37\x2e\x0a\x77\x16\xaa\x04\x44\xe6\x23\x87\x84\x4f\xfc\x8a\xb3\x3f\xf2\x9a\xaa\x55\x03\x96\x73\x72\x5e\xba\x30\x16\xf3\x63\x0f\x74\x6f\xe0\x16\xf5\xae\x64\xb9\x7b\x90\x5c\xfe\xf9\xc5\xbb\x43\x42\x93\xdd\x9b\xe4\x6a\xa5\xb2\x15\x1a\x12\x2d\x36\x08\xe7\xc7\xd9\x1d\xfe\xdb\x4c\x31\x5b\xd9\x35\x7c\x84\xe0\xe1\xac\xea\x2d\x50\x6b\xa5\xe1\x1c\x52\xb5\x6a\xae\xd0\x8e\xe8\xb5\x56\x3f\xab\x56\x2a\x32\x81\x9a\x5b\x65\x7c\xc5\xb1\x67\x27\xee\xd3\xc9\x03\x9c\xb3\x29\x69\x3e\x01\xa6\x06\x81\x0c\x3c\xe6\x13\xe6\x76\x5d\xab\xc3\xf9\x71\x28\xde\xbf\xc7\xa9\x9c\x2e\x15\x38\xe7\xb7\x8a\xca\x63\xa0\x7f\x04\x50\x79\xd3\xaa\x9b\x62\x33\x47\x5d\xab\x37\xdc\xf2\x92\x80\x10\xc3\x73\x3e\xaf\x95\x6d\x9e\x3d\xb8\xf7\x27\x0a\xc9\x45\xef\x22\xa6\xde\x96\x99\xff\x0e\x6d\xef\xdd\xe5\x9e\x6b\xdc\xaa\x1c\xce\x61\xaf\x38\x7b\x65\xc2\xc5\x22\x8b\x44\xe9\x1a\x59\x49\x38\x87\xf6\x19\x48\xf8\x8d\x73\xf3\x37\xd8\x8c\x69\x4d\x95\x3f\x9c\x81\xfc\xf0\xa1\xee\x8c\x2a\xfe\x2b\xc7\xd8\x24\x55\x57\x23\x2e\x48\x8e\xf8\xad\x26\xeb\x4d\xab\x26\x56\xcb\x6c\x55\x0b\x7a\x75\x57\xfb\xca\x13\x3d\xcc\xa3\xb4\x0b\xd6\x77\x25\xf1\x4a\x75\x9f\xc3\x42\x18\x84\x93\x8b\xe1\xf5\xf5\x49\x0c\x87\x97\x8b\xdb\x4f\xa3\x93\x78\x9f\xa4\xcc\x8c\xa5\xdf\xaf\xdc\xe2\x23\xbf\x9d\x7a\x73\x2b\xd2\x02\x6f\x13\xee\xf7\x5e\x5d\xfe\x0f\x5f\x6b\x47\xaf\xb4\xb9\x81\xb3\x93\x95\x30\x6e\x1c\x5e\x18\xb4\xdf\x35\xb0\xea\x2d\xfd\xe0\x79\x19\x9e\x9b\x38\xd2\x5b\x56\xe1\x91\xd5\x0b\x1b\x99\xe5\x85\xdd\xdb\x6c\x70\xa3\xf4\xae\x69\xe8\x97\x4f\xcd\xd7\xa4\xb1\x2f\xce\x07\x9f\xf7\x0b\xc4\x61\xd6\xb3\x22\x4d\x9f\xaf\xf1\x39\xf2\xce\xa2\xca\xb9\x26\x33\x3f\x3b\x47\x9b\xc0\x8d\x00\xeb\x79\x6f\x73\x8d\xe2\xdb\xd9\xa1\xa3\x9f\x46\xd7\xa3\xcf\xc3\xe9\xe8\x59\x67\x27\xd3\xe1\xf4\xea\x82\x3f\xfd\xb8\xb7\xe1\x2f\xf5\xf6\xf5\x24\x1c\xf2\x70\x69\xc0\xab\x11\x7c\x7b\x04\x7e\x79\x06\x7e\x69\x08\x0e\x0d\xfd\x37\x3a\xfa\xcf\x2d\xfd\xb7\x7b\x3a\x1e\x4d\xef\xc7\x37\xfb\x6e\x8e\x47\x7f\x8e\xc6\xd3\xa3\x4e\xd2\x9f\x2f\x3f\xb1\x85\xbc\xea\xdb\x6d\x0c\x5e\xa9\xf3\x69\xe6\x6f\xbc\x37\xf6\x81\x2a\x6c\xc3\xb9\xfe\x50\x52\xdf\x09\x7f\x32\xbd\xbd\x3b\x8c\xe2\xe8\xfa\xf2\xd3\x68\x32\x1d\xdf\x5f\x94\x29\xfc\xc8\x51\xbb\x01\xed\x77\xd0\xff\xbd\xff\x72\x47\x34\x4f\x2a\xab\x9d\x2f\xf6\x5b\x77\x85\xf6\xee\xa2\x76\x74\x2e\xca\xa4\x3c\x13\xa5\xb9\xa3\xd2\x97\x27\xe2\xde\x3a\xc5\x6c\x6f\xfe\xec\x36\x81\x8f\xd0\xfe\xbb\x8b\x07\xd6\xe1\xc0\x7f\xd9\x44\x7f\xab\x39\xf0\xa1\xd7\xcf\x2e\xd7\x43\x76\xcf\xef\x25\xb6\xaf\x56\x9e\xaa\x4f\xd5\xff\x07\x00\x00\xff\xff\xa5\x5b\x87\x4a\x77\x10\x00\x00") func evmdis_tracerJsBytes() ([]byte, error) { return bindataRead( @@ -195,7 +174,7 @@ func evmdis_tracerJs() (*asset, error) { } info := bindataFileInfo{name: "evmdis_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb5, 0xc8, 0x73, 0x8e, 0xfb, 0x1f, 0x84, 0x7d, 0x37, 0xd9, 0x26, 0x24, 0x37, 0xb8, 0x65, 0xb1, 0xed, 0xa0, 0x76, 0x9a, 0xf0, 0x8e, 0x3a, 0x9b, 0x20, 0x93, 0x27, 0x26, 0x2e, 0xc9, 0x9b, 0xde}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x13, 0xeb, 0xca, 0x1f, 0x5f, 0xd3, 0x29, 0x81, 0xbb, 0xd8, 0xc8, 0x4a, 0x3a, 0x38, 0x10, 0xe2, 0xe7, 0xa4, 0xcd, 0xde, 0x78, 0x85, 0xc2, 0xed, 0xee, 0xb, 0xd6, 0xdb, 0x5e, 0x44, 0x28, 0x16}} return a, nil } @@ -390,10 +369,9 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "4byte_tracer.js": _4byte_tracerJs, "4byte_tracer_legacy.js": _4byte_tracer_legacyJs, "bigram_tracer.js": bigram_tracerJs, - "call_tracer.js": call_tracerJs, + "call_tracer_js.js": call_tracer_jsJs, "call_tracer_legacy.js": call_tracer_legacyJs, "evmdis_tracer.js": evmdis_tracerJs, "noop_tracer.js": noop_tracerJs, @@ -447,10 +425,9 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "4byte_tracer.js": {_4byte_tracerJs, map[string]*bintree{}}, "4byte_tracer_legacy.js": {_4byte_tracer_legacyJs, map[string]*bintree{}}, "bigram_tracer.js": {bigram_tracerJs, map[string]*bintree{}}, - "call_tracer.js": {call_tracerJs, map[string]*bintree{}}, + "call_tracer_js.js": {call_tracer_jsJs, map[string]*bintree{}}, "call_tracer_legacy.js": {call_tracer_legacyJs, map[string]*bintree{}}, "evmdis_tracer.js": {evmdis_tracerJs, map[string]*bintree{}}, "noop_tracer.js": {noop_tracerJs, map[string]*bintree{}}, diff --git a/eth/tracers/internal/tracers/bigram_tracer.js b/eth/tracers/js/internal/tracers/bigram_tracer.js similarity index 100% rename from eth/tracers/internal/tracers/bigram_tracer.js rename to eth/tracers/js/internal/tracers/bigram_tracer.js diff --git a/eth/tracers/internal/tracers/call_tracer.js b/eth/tracers/js/internal/tracers/call_tracer_js.js similarity index 100% rename from eth/tracers/internal/tracers/call_tracer.js rename to eth/tracers/js/internal/tracers/call_tracer_js.js diff --git a/eth/tracers/internal/tracers/call_tracer_legacy.js b/eth/tracers/js/internal/tracers/call_tracer_legacy.js similarity index 100% rename from eth/tracers/internal/tracers/call_tracer_legacy.js rename to eth/tracers/js/internal/tracers/call_tracer_legacy.js diff --git a/eth/tracers/internal/tracers/evmdis_tracer.js b/eth/tracers/js/internal/tracers/evmdis_tracer.js similarity index 98% rename from eth/tracers/internal/tracers/evmdis_tracer.js rename to eth/tracers/js/internal/tracers/evmdis_tracer.js index bb19777aba..c841c57f14 100644 --- a/eth/tracers/internal/tracers/evmdis_tracer.js +++ b/eth/tracers/js/internal/tracers/evmdis_tracer.js @@ -71,12 +71,12 @@ opinfo["ops"] = []; this.stack.push(opinfo); break; - case "RETURN": + case "RETURN": case "REVERT": var out = log.stack.peek(0).valueOf(); var outsize = log.stack.peek(1).valueOf(); frame.return = log.memory.slice(out, out + outsize); break; - case "STOP": case "SUICIDE": + case "STOP": case "SELFDESTRUCT": frame.return = log.memory.slice(0, 0); break; case "JUMPDEST": diff --git a/eth/tracers/internal/tracers/noop_tracer.js b/eth/tracers/js/internal/tracers/noop_tracer.js similarity index 100% rename from eth/tracers/internal/tracers/noop_tracer.js rename to eth/tracers/js/internal/tracers/noop_tracer.js diff --git a/eth/tracers/internal/tracers/opcount_tracer.js b/eth/tracers/js/internal/tracers/opcount_tracer.js similarity index 100% rename from eth/tracers/internal/tracers/opcount_tracer.js rename to eth/tracers/js/internal/tracers/opcount_tracer.js diff --git a/eth/tracers/internal/tracers/prestate_tracer.js b/eth/tracers/js/internal/tracers/prestate_tracer.js similarity index 100% rename from eth/tracers/internal/tracers/prestate_tracer.js rename to eth/tracers/js/internal/tracers/prestate_tracer.js diff --git a/eth/tracers/internal/tracers/tracers.go b/eth/tracers/js/internal/tracers/tracers.go similarity index 100% rename from eth/tracers/internal/tracers/tracers.go rename to eth/tracers/js/internal/tracers/tracers.go diff --git a/eth/tracers/internal/tracers/trigram_tracer.js b/eth/tracers/js/internal/tracers/trigram_tracer.js similarity index 100% rename from eth/tracers/internal/tracers/trigram_tracer.js rename to eth/tracers/js/internal/tracers/trigram_tracer.js diff --git a/eth/tracers/internal/tracers/unigram_tracer.js b/eth/tracers/js/internal/tracers/unigram_tracer.js similarity index 100% rename from eth/tracers/internal/tracers/unigram_tracer.js rename to eth/tracers/js/internal/tracers/unigram_tracer.js diff --git a/eth/tracers/js/tracer.go b/eth/tracers/js/tracer.go new file mode 100644 index 0000000000..b8e035e6f3 --- /dev/null +++ b/eth/tracers/js/tracer.go @@ -0,0 +1,880 @@ +// Copyright 2017 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 . + +// package js is a collection of tracers written in javascript. +package js + +import ( + "encoding/json" + "errors" + "fmt" + "math/big" + "strings" + "sync/atomic" + "time" + "unicode" + "unsafe" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + tracers2 "github.com/ethereum/go-ethereum/eth/tracers" + "github.com/ethereum/go-ethereum/eth/tracers/js/internal/tracers" + "github.com/ethereum/go-ethereum/log" + "gopkg.in/olebedev/go-duktape.v3" +) + +// camel converts a snake cased input string into a camel cased output. +func camel(str string) string { + pieces := strings.Split(str, "_") + for i := 1; i < len(pieces); i++ { + pieces[i] = string(unicode.ToUpper(rune(pieces[i][0]))) + pieces[i][1:] + } + return strings.Join(pieces, "") +} + +var assetTracers = make(map[string]string) + +// init retrieves the JavaScript transaction tracers included in go-ethereum. +func init() { + for _, file := range tracers.AssetNames() { + name := camel(strings.TrimSuffix(file, ".js")) + assetTracers[name] = string(tracers.MustAsset(file)) + } + tracers2.RegisterLookup(true, newJsTracer) +} + +// makeSlice convert an unsafe memory pointer with the given type into a Go byte +// slice. +// +// Note, the returned slice uses the same memory area as the input arguments. +// If those are duktape stack items, popping them off **will** make the slice +// contents change. +func makeSlice(ptr unsafe.Pointer, size uint) []byte { + var sl = struct { + addr uintptr + len int + cap int + }{uintptr(ptr), int(size), int(size)} + + return *(*[]byte)(unsafe.Pointer(&sl)) +} + +// popSlice pops a buffer off the JavaScript stack and returns it as a slice. +func popSlice(ctx *duktape.Context) []byte { + blob := common.CopyBytes(makeSlice(ctx.GetBuffer(-1))) + ctx.Pop() + return blob +} + +// pushBigInt create a JavaScript BigInteger in the VM. +func pushBigInt(n *big.Int, ctx *duktape.Context) { + ctx.GetGlobalString("bigInt") + ctx.PushString(n.String()) + ctx.Call(1) +} + +// opWrapper provides a JavaScript wrapper around OpCode. +type opWrapper struct { + op vm.OpCode +} + +// pushObject assembles a JSVM object wrapping a swappable opcode and pushes it +// onto the VM stack. +func (ow *opWrapper) pushObject(vm *duktape.Context) { + obj := vm.PushObject() + + vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(int(ow.op)); return 1 }) + vm.PutPropString(obj, "toNumber") + + vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushString(ow.op.String()); return 1 }) + vm.PutPropString(obj, "toString") + + vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushBoolean(ow.op.IsPush()); return 1 }) + vm.PutPropString(obj, "isPush") +} + +// memoryWrapper provides a JavaScript wrapper around vm.Memory. +type memoryWrapper struct { + memory *vm.Memory +} + +// slice returns the requested range of memory as a byte slice. +func (mw *memoryWrapper) slice(begin, end int64) []byte { + if end == begin { + return []byte{} + } + if end < begin || begin < 0 { + // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go + // runtime goes belly up https://github.com/golang/go/issues/15639. + log.Warn("Tracer accessed out of bound memory", "offset", begin, "end", end) + return nil + } + if mw.memory.Len() < int(end) { + // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go + // runtime goes belly up https://github.com/golang/go/issues/15639. + log.Warn("Tracer accessed out of bound memory", "available", mw.memory.Len(), "offset", begin, "size", end-begin) + return nil + } + return mw.memory.GetCopy(begin, end-begin) +} + +// getUint returns the 32 bytes at the specified address interpreted as a uint. +func (mw *memoryWrapper) getUint(addr int64) *big.Int { + if mw.memory.Len() < int(addr)+32 || addr < 0 { + // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go + // runtime goes belly up https://github.com/golang/go/issues/15639. + log.Warn("Tracer accessed out of bound memory", "available", mw.memory.Len(), "offset", addr, "size", 32) + return new(big.Int) + } + return new(big.Int).SetBytes(mw.memory.GetPtr(addr, 32)) +} + +// pushObject assembles a JSVM object wrapping a swappable memory and pushes it +// onto the VM stack. +func (mw *memoryWrapper) pushObject(vm *duktape.Context) { + obj := vm.PushObject() + + // Generate the `slice` method which takes two ints and returns a buffer + vm.PushGoFunction(func(ctx *duktape.Context) int { + blob := mw.slice(int64(ctx.GetInt(-2)), int64(ctx.GetInt(-1))) + ctx.Pop2() + + ptr := ctx.PushFixedBuffer(len(blob)) + copy(makeSlice(ptr, uint(len(blob))), blob) + return 1 + }) + vm.PutPropString(obj, "slice") + + // Generate the `getUint` method which takes an int and returns a bigint + vm.PushGoFunction(func(ctx *duktape.Context) int { + offset := int64(ctx.GetInt(-1)) + ctx.Pop() + + pushBigInt(mw.getUint(offset), ctx) + return 1 + }) + vm.PutPropString(obj, "getUint") +} + +// stackWrapper provides a JavaScript wrapper around vm.Stack. +type stackWrapper struct { + stack *vm.Stack +} + +// peek returns the nth-from-the-top element of the stack. +func (sw *stackWrapper) peek(idx int) *big.Int { + if len(sw.stack.Data()) <= idx || idx < 0 { + // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go + // runtime goes belly up https://github.com/golang/go/issues/15639. + log.Warn("Tracer accessed out of bound stack", "size", len(sw.stack.Data()), "index", idx) + return new(big.Int) + } + return sw.stack.Back(idx).ToBig() +} + +// pushObject assembles a JSVM object wrapping a swappable stack and pushes it +// onto the VM stack. +func (sw *stackWrapper) pushObject(vm *duktape.Context) { + obj := vm.PushObject() + + vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(len(sw.stack.Data())); return 1 }) + vm.PutPropString(obj, "length") + + // Generate the `peek` method which takes an int and returns a bigint + vm.PushGoFunction(func(ctx *duktape.Context) int { + offset := ctx.GetInt(-1) + ctx.Pop() + + pushBigInt(sw.peek(offset), ctx) + return 1 + }) + vm.PutPropString(obj, "peek") +} + +// dbWrapper provides a JavaScript wrapper around vm.Database. +type dbWrapper struct { + db vm.StateDB +} + +// pushObject assembles a JSVM object wrapping a swappable database and pushes it +// onto the VM stack. +func (dw *dbWrapper) pushObject(vm *duktape.Context) { + obj := vm.PushObject() + + // Push the wrapper for statedb.GetBalance + vm.PushGoFunction(func(ctx *duktape.Context) int { + pushBigInt(dw.db.GetBalance(common.BytesToAddress(popSlice(ctx))), ctx) + return 1 + }) + vm.PutPropString(obj, "getBalance") + + // Push the wrapper for statedb.GetNonce + vm.PushGoFunction(func(ctx *duktape.Context) int { + ctx.PushInt(int(dw.db.GetNonce(common.BytesToAddress(popSlice(ctx))))) + return 1 + }) + vm.PutPropString(obj, "getNonce") + + // Push the wrapper for statedb.GetCode + vm.PushGoFunction(func(ctx *duktape.Context) int { + code := dw.db.GetCode(common.BytesToAddress(popSlice(ctx))) + + ptr := ctx.PushFixedBuffer(len(code)) + copy(makeSlice(ptr, uint(len(code))), code) + return 1 + }) + vm.PutPropString(obj, "getCode") + + // Push the wrapper for statedb.GetState + vm.PushGoFunction(func(ctx *duktape.Context) int { + hash := popSlice(ctx) + addr := popSlice(ctx) + + state := dw.db.GetState(common.BytesToAddress(addr), common.BytesToHash(hash)) + + ptr := ctx.PushFixedBuffer(len(state)) + copy(makeSlice(ptr, uint(len(state))), state[:]) + return 1 + }) + vm.PutPropString(obj, "getState") + + // Push the wrapper for statedb.Exists + vm.PushGoFunction(func(ctx *duktape.Context) int { + ctx.PushBoolean(dw.db.Exist(common.BytesToAddress(popSlice(ctx)))) + return 1 + }) + vm.PutPropString(obj, "exists") +} + +// contractWrapper provides a JavaScript wrapper around vm.Contract +type contractWrapper struct { + contract *vm.Contract +} + +// pushObject assembles a JSVM object wrapping a swappable contract and pushes it +// onto the VM stack. +func (cw *contractWrapper) pushObject(vm *duktape.Context) { + obj := vm.PushObject() + + // Push the wrapper for contract.Caller + vm.PushGoFunction(func(ctx *duktape.Context) int { + ptr := ctx.PushFixedBuffer(20) + copy(makeSlice(ptr, 20), cw.contract.Caller().Bytes()) + return 1 + }) + vm.PutPropString(obj, "getCaller") + + // Push the wrapper for contract.Address + vm.PushGoFunction(func(ctx *duktape.Context) int { + ptr := ctx.PushFixedBuffer(20) + copy(makeSlice(ptr, 20), cw.contract.Address().Bytes()) + return 1 + }) + vm.PutPropString(obj, "getAddress") + + // Push the wrapper for contract.Value + vm.PushGoFunction(func(ctx *duktape.Context) int { + pushBigInt(cw.contract.Value(), ctx) + return 1 + }) + vm.PutPropString(obj, "getValue") + + // Push the wrapper for contract.Input + vm.PushGoFunction(func(ctx *duktape.Context) int { + blob := cw.contract.Input + + ptr := ctx.PushFixedBuffer(len(blob)) + copy(makeSlice(ptr, uint(len(blob))), blob) + return 1 + }) + vm.PutPropString(obj, "getInput") +} + +type frame struct { + typ *string + from *common.Address + to *common.Address + input []byte + gas *uint + value *big.Int +} + +func newFrame() *frame { + return &frame{ + typ: new(string), + from: new(common.Address), + to: new(common.Address), + gas: new(uint), + } +} + +func (f *frame) pushObject(vm *duktape.Context) { + obj := vm.PushObject() + + vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *f.typ); return 1 }) + vm.PutPropString(obj, "getType") + + vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *f.from); return 1 }) + vm.PutPropString(obj, "getFrom") + + vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *f.to); return 1 }) + vm.PutPropString(obj, "getTo") + + vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, f.input); return 1 }) + vm.PutPropString(obj, "getInput") + + vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *f.gas); return 1 }) + vm.PutPropString(obj, "getGas") + + vm.PushGoFunction(func(ctx *duktape.Context) int { + if f.value != nil { + pushValue(ctx, f.value) + } else { + ctx.PushUndefined() + } + return 1 + }) + vm.PutPropString(obj, "getValue") +} + +type frameResult struct { + gasUsed *uint + output []byte + errorValue *string +} + +func newFrameResult() *frameResult { + return &frameResult{ + gasUsed: new(uint), + } +} + +func (r *frameResult) pushObject(vm *duktape.Context) { + obj := vm.PushObject() + + vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, *r.gasUsed); return 1 }) + vm.PutPropString(obj, "getGasUsed") + + vm.PushGoFunction(func(ctx *duktape.Context) int { pushValue(ctx, r.output); return 1 }) + vm.PutPropString(obj, "getOutput") + + vm.PushGoFunction(func(ctx *duktape.Context) int { + if r.errorValue != nil { + pushValue(ctx, *r.errorValue) + } else { + ctx.PushUndefined() + } + return 1 + }) + vm.PutPropString(obj, "getError") +} + +// jsTracer provides an implementation of Tracer that evaluates a Javascript +// function for each VM execution step. +type jsTracer struct { + vm *duktape.Context // Javascript VM instance + env *vm.EVM // EVM instance executing the code being traced + + tracerObject int // Stack index of the tracer JavaScript object + stateObject int // Stack index of the global state to pull arguments from + + opWrapper *opWrapper // Wrapper around the VM opcode + stackWrapper *stackWrapper // Wrapper around the VM stack + memoryWrapper *memoryWrapper // Wrapper around the VM memory + contractWrapper *contractWrapper // Wrapper around the contract object + dbWrapper *dbWrapper // Wrapper around the VM environment + + pcValue *uint // Swappable pc value wrapped by a log accessor + gasValue *uint // Swappable gas value wrapped by a log accessor + costValue *uint // Swappable cost value wrapped by a log accessor + depthValue *uint // Swappable depth value wrapped by a log accessor + errorValue *string // Swappable error value wrapped by a log accessor + refundValue *uint // Swappable refund value wrapped by a log accessor + + frame *frame // Represents entry into call frame. Fields are swappable + frameResult *frameResult // Represents exit from a call frame. Fields are swappable + + ctx map[string]interface{} // Transaction context gathered throughout execution + err error // Error, if one has occurred + + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption + + activePrecompiles []common.Address // Updated on CaptureStart based on given rules + traceSteps bool // When true, will invoke step() on each opcode + traceCallFrames bool // When true, will invoke enter() and exit() js funcs +} + +// New instantiates a new tracer instance. code specifies a Javascript snippet, +// which must evaluate to an expression returning an object with 'step', 'fault' +// and 'result' functions. +func newJsTracer(code string, ctx *tracers2.Context) (tracers2.Tracer, error) { + if c, ok := assetTracers[code]; ok { + code = c + } + if ctx == nil { + ctx = new(tracers2.Context) + } + tracer := &jsTracer{ + vm: duktape.New(), + ctx: make(map[string]interface{}), + opWrapper: new(opWrapper), + stackWrapper: new(stackWrapper), + memoryWrapper: new(memoryWrapper), + contractWrapper: new(contractWrapper), + dbWrapper: new(dbWrapper), + pcValue: new(uint), + gasValue: new(uint), + costValue: new(uint), + depthValue: new(uint), + refundValue: new(uint), + frame: newFrame(), + frameResult: newFrameResult(), + } + if ctx.BlockHash != (common.Hash{}) { + tracer.ctx["blockHash"] = ctx.BlockHash + + if ctx.TxHash != (common.Hash{}) { + tracer.ctx["txIndex"] = ctx.TxIndex + tracer.ctx["txHash"] = ctx.TxHash + } + } + // Set up builtins for this environment + tracer.vm.PushGlobalGoFunction("toHex", func(ctx *duktape.Context) int { + ctx.PushString(hexutil.Encode(popSlice(ctx))) + return 1 + }) + tracer.vm.PushGlobalGoFunction("toWord", func(ctx *duktape.Context) int { + var word common.Hash + if ptr, size := ctx.GetBuffer(-1); ptr != nil { + word = common.BytesToHash(makeSlice(ptr, size)) + } else { + word = common.HexToHash(ctx.GetString(-1)) + } + ctx.Pop() + copy(makeSlice(ctx.PushFixedBuffer(32), 32), word[:]) + return 1 + }) + tracer.vm.PushGlobalGoFunction("toAddress", func(ctx *duktape.Context) int { + var addr common.Address + if ptr, size := ctx.GetBuffer(-1); ptr != nil { + addr = common.BytesToAddress(makeSlice(ptr, size)) + } else { + addr = common.HexToAddress(ctx.GetString(-1)) + } + ctx.Pop() + copy(makeSlice(ctx.PushFixedBuffer(20), 20), addr[:]) + return 1 + }) + tracer.vm.PushGlobalGoFunction("toContract", func(ctx *duktape.Context) int { + var from common.Address + if ptr, size := ctx.GetBuffer(-2); ptr != nil { + from = common.BytesToAddress(makeSlice(ptr, size)) + } else { + from = common.HexToAddress(ctx.GetString(-2)) + } + nonce := uint64(ctx.GetInt(-1)) + ctx.Pop2() + + contract := crypto.CreateAddress(from, nonce) + copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) + return 1 + }) + tracer.vm.PushGlobalGoFunction("toContract2", func(ctx *duktape.Context) int { + var from common.Address + if ptr, size := ctx.GetBuffer(-3); ptr != nil { + from = common.BytesToAddress(makeSlice(ptr, size)) + } else { + from = common.HexToAddress(ctx.GetString(-3)) + } + // Retrieve salt hex string from js stack + salt := common.HexToHash(ctx.GetString(-2)) + // Retrieve code slice from js stack + var code []byte + if ptr, size := ctx.GetBuffer(-1); ptr != nil { + code = common.CopyBytes(makeSlice(ptr, size)) + } else { + code = common.FromHex(ctx.GetString(-1)) + } + codeHash := crypto.Keccak256(code) + ctx.Pop3() + contract := crypto.CreateAddress2(from, salt, codeHash) + copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) + return 1 + }) + tracer.vm.PushGlobalGoFunction("isPrecompiled", func(ctx *duktape.Context) int { + addr := common.BytesToAddress(popSlice(ctx)) + for _, p := range tracer.activePrecompiles { + if p == addr { + ctx.PushBoolean(true) + return 1 + } + } + ctx.PushBoolean(false) + return 1 + }) + tracer.vm.PushGlobalGoFunction("slice", func(ctx *duktape.Context) int { + start, end := ctx.GetInt(-2), ctx.GetInt(-1) + ctx.Pop2() + + blob := popSlice(ctx) + size := end - start + + if start < 0 || start > end || end > len(blob) { + // TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go + // runtime goes belly up https://github.com/golang/go/issues/15639. + log.Warn("Tracer accessed out of bound memory", "available", len(blob), "offset", start, "size", size) + ctx.PushFixedBuffer(0) + return 1 + } + copy(makeSlice(ctx.PushFixedBuffer(size), uint(size)), blob[start:end]) + return 1 + }) + // Push the JavaScript tracer as object #0 onto the JSVM stack and validate it + if err := tracer.vm.PevalString("(" + code + ")"); err != nil { + log.Warn("Failed to compile tracer", "err", err) + return nil, err + } + tracer.tracerObject = 0 // yeah, nice, eval can't return the index itself + + hasStep := tracer.vm.GetPropString(tracer.tracerObject, "step") + tracer.vm.Pop() + + if !tracer.vm.GetPropString(tracer.tracerObject, "fault") { + return nil, fmt.Errorf("trace object must expose a function fault()") + } + tracer.vm.Pop() + + if !tracer.vm.GetPropString(tracer.tracerObject, "result") { + return nil, fmt.Errorf("trace object must expose a function result()") + } + tracer.vm.Pop() + + hasEnter := tracer.vm.GetPropString(tracer.tracerObject, "enter") + tracer.vm.Pop() + hasExit := tracer.vm.GetPropString(tracer.tracerObject, "exit") + tracer.vm.Pop() + if hasEnter != hasExit { + return nil, fmt.Errorf("trace object must expose either both or none of enter() and exit()") + } + tracer.traceCallFrames = hasEnter && hasExit + tracer.traceSteps = hasStep + + // Tracer is valid, inject the big int library to access large numbers + tracer.vm.EvalString(bigIntegerJS) + tracer.vm.PutGlobalString("bigInt") + + // Push the global environment state as object #1 into the JSVM stack + tracer.stateObject = tracer.vm.PushObject() + + logObject := tracer.vm.PushObject() + + tracer.opWrapper.pushObject(tracer.vm) + tracer.vm.PutPropString(logObject, "op") + + tracer.stackWrapper.pushObject(tracer.vm) + tracer.vm.PutPropString(logObject, "stack") + + tracer.memoryWrapper.pushObject(tracer.vm) + tracer.vm.PutPropString(logObject, "memory") + + tracer.contractWrapper.pushObject(tracer.vm) + tracer.vm.PutPropString(logObject, "contract") + + tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.pcValue); return 1 }) + tracer.vm.PutPropString(logObject, "getPC") + + tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.gasValue); return 1 }) + tracer.vm.PutPropString(logObject, "getGas") + + tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.costValue); return 1 }) + tracer.vm.PutPropString(logObject, "getCost") + + tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.depthValue); return 1 }) + tracer.vm.PutPropString(logObject, "getDepth") + + tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.refundValue); return 1 }) + tracer.vm.PutPropString(logObject, "getRefund") + + tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { + if tracer.errorValue != nil { + ctx.PushString(*tracer.errorValue) + } else { + ctx.PushUndefined() + } + return 1 + }) + tracer.vm.PutPropString(logObject, "getError") + + tracer.vm.PutPropString(tracer.stateObject, "log") + + tracer.frame.pushObject(tracer.vm) + tracer.vm.PutPropString(tracer.stateObject, "frame") + + tracer.frameResult.pushObject(tracer.vm) + tracer.vm.PutPropString(tracer.stateObject, "frameResult") + + tracer.dbWrapper.pushObject(tracer.vm) + tracer.vm.PutPropString(tracer.stateObject, "db") + + return tracer, nil +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (jst *jsTracer) Stop(err error) { + jst.reason = err + atomic.StoreUint32(&jst.interrupt, 1) +} + +// call executes a method on a JS object, catching any errors, formatting and +// returning them as error objects. +func (jst *jsTracer) call(noret bool, method string, args ...string) (json.RawMessage, error) { + // Execute the JavaScript call and return any error + jst.vm.PushString(method) + for _, arg := range args { + jst.vm.GetPropString(jst.stateObject, arg) + } + code := jst.vm.PcallProp(jst.tracerObject, len(args)) + defer jst.vm.Pop() + + if code != 0 { + err := jst.vm.SafeToString(-1) + return nil, errors.New(err) + } + // No error occurred, extract return value and return + if noret { + return nil, nil + } + // Push a JSON marshaller onto the stack. We can't marshal from the out- + // side because duktape can crash on large nestings and we can't catch + // C++ exceptions ourselves from Go. TODO(karalabe): Yuck, why wrap?! + jst.vm.PushString("(JSON.stringify)") + jst.vm.Eval() + + jst.vm.Swap(-1, -2) + if code = jst.vm.Pcall(1); code != 0 { + err := jst.vm.SafeToString(-1) + return nil, errors.New(err) + } + return json.RawMessage(jst.vm.SafeToString(-1)), nil +} + +func wrapError(context string, err error) error { + return fmt.Errorf("%v in server-side tracer function '%v'", err, context) +} + +// CaptureStart implements the Tracer interface to initialize the tracing operation. +func (jst *jsTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + jst.env = env + jst.ctx["type"] = "CALL" + if create { + jst.ctx["type"] = "CREATE" + } + jst.ctx["from"] = from + jst.ctx["to"] = to + jst.ctx["input"] = input + jst.ctx["gas"] = gas + jst.ctx["gasPrice"] = env.TxContext.GasPrice + jst.ctx["value"] = value + + // Initialize the context + jst.ctx["block"] = env.Context.BlockNumber.Uint64() + jst.dbWrapper.db = env.StateDB + // Update list of precompiles based on current block + rules := env.ChainConfig().Rules(env.Context.BlockNumber) + jst.activePrecompiles = vm.ActivePrecompiles(rules) + + // Compute intrinsic gas + isHomestead := env.ChainConfig().IsHomestead(env.Context.BlockNumber) + isIstanbul := env.ChainConfig().IsIstanbul(env.Context.BlockNumber) + intrinsicGas, err := core.IntrinsicGas(input, nil, jst.ctx["type"] == "CREATE", isHomestead, isIstanbul) + if err != nil { + return + } + jst.ctx["intrinsicGas"] = intrinsicGas +} + +// CaptureState implements the Tracer interface to trace a single step of VM execution. +func (jst *jsTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + if !jst.traceSteps { + return + } + if jst.err != nil { + return + } + // If tracing was interrupted, set the error and stop + if atomic.LoadUint32(&jst.interrupt) > 0 { + jst.err = jst.reason + jst.env.Cancel() + return + } + jst.opWrapper.op = op + jst.stackWrapper.stack = scope.Stack + jst.memoryWrapper.memory = scope.Memory + jst.contractWrapper.contract = scope.Contract + + *jst.pcValue = uint(pc) + *jst.gasValue = uint(gas) + *jst.costValue = uint(cost) + *jst.depthValue = uint(depth) + *jst.refundValue = uint(jst.env.StateDB.GetRefund()) + + jst.errorValue = nil + if err != nil { + jst.errorValue = new(string) + *jst.errorValue = err.Error() + } + + if _, err := jst.call(true, "step", "log", "db"); err != nil { + jst.err = wrapError("step", err) + } +} + +// CaptureFault implements the Tracer interface to trace an execution fault +func (jst *jsTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { + if jst.err != nil { + return + } + // Apart from the error, everything matches the previous invocation + jst.errorValue = new(string) + *jst.errorValue = err.Error() + + if _, err := jst.call(true, "fault", "log", "db"); err != nil { + jst.err = wrapError("fault", err) + } +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (jst *jsTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) { + jst.ctx["output"] = output + jst.ctx["time"] = t.String() + jst.ctx["gasUsed"] = gasUsed + + if err != nil { + jst.ctx["error"] = err.Error() + } +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (jst *jsTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + if !jst.traceCallFrames { + return + } + if jst.err != nil { + return + } + // If tracing was interrupted, set the error and stop + if atomic.LoadUint32(&jst.interrupt) > 0 { + jst.err = jst.reason + return + } + + *jst.frame.typ = typ.String() + *jst.frame.from = from + *jst.frame.to = to + jst.frame.input = common.CopyBytes(input) + *jst.frame.gas = uint(gas) + jst.frame.value = nil + if value != nil { + jst.frame.value = new(big.Int).SetBytes(value.Bytes()) + } + + if _, err := jst.call(true, "enter", "frame"); err != nil { + jst.err = wrapError("enter", err) + } +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (jst *jsTracer) CaptureExit(output []byte, gasUsed uint64, err error) { + if !jst.traceCallFrames { + return + } + // If tracing was interrupted, set the error and stop + if atomic.LoadUint32(&jst.interrupt) > 0 { + jst.err = jst.reason + return + } + + jst.frameResult.output = common.CopyBytes(output) + *jst.frameResult.gasUsed = uint(gasUsed) + jst.frameResult.errorValue = nil + if err != nil { + jst.frameResult.errorValue = new(string) + *jst.frameResult.errorValue = err.Error() + } + + if _, err := jst.call(true, "exit", "frameResult"); err != nil { + jst.err = wrapError("exit", err) + } +} + +// GetResult calls the Javascript 'result' function and returns its value, or any accumulated error +func (jst *jsTracer) GetResult() (json.RawMessage, error) { + // Transform the context into a JavaScript object and inject into the state + obj := jst.vm.PushObject() + + for key, val := range jst.ctx { + jst.addToObj(obj, key, val) + } + jst.vm.PutPropString(jst.stateObject, "ctx") + + // Finalize the trace and return the results + result, err := jst.call(false, "result", "ctx", "db") + if err != nil { + jst.err = wrapError("result", err) + } + // Clean up the JavaScript environment + jst.vm.DestroyHeap() + jst.vm.Destroy() + + return result, jst.err +} + +// addToObj pushes a field to a JS object. +func (jst *jsTracer) addToObj(obj int, key string, val interface{}) { + pushValue(jst.vm, val) + jst.vm.PutPropString(obj, key) +} + +func pushValue(ctx *duktape.Context, val interface{}) { + switch val := val.(type) { + case uint64: + ctx.PushUint(uint(val)) + case string: + ctx.PushString(val) + case []byte: + ptr := ctx.PushFixedBuffer(len(val)) + copy(makeSlice(ptr, uint(len(val))), val) + case common.Address: + ptr := ctx.PushFixedBuffer(20) + copy(makeSlice(ptr, 20), val[:]) + case *big.Int: + pushBigInt(val, ctx) + case int: + ctx.PushInt(val) + case uint: + ctx.PushUint(val) + case common.Hash: + ptr := ctx.PushFixedBuffer(32) + copy(makeSlice(ptr, 32), val[:]) + default: + panic(fmt.Sprintf("unsupported type: %T", val)) + } +} diff --git a/eth/tracers/tracer_test.go b/eth/tracers/js/tracer_test.go similarity index 75% rename from eth/tracers/tracer_test.go rename to eth/tracers/js/tracer_test.go index 63b09bdc6f..cf0a4aa828 100644 --- a/eth/tracers/tracer_test.go +++ b/eth/tracers/js/tracer_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package tracers +package js import ( "encoding/json" @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/params" ) @@ -58,13 +59,13 @@ func testCtx() *vmContext { return &vmContext{blockCtx: vm.BlockContext{BlockNumber: big.NewInt(1)}, txCtx: vm.TxContext{GasPrice: big.NewInt(100000)}} } -func runTrace(tracer *Tracer, vmctx *vmContext, chaincfg *params.ChainConfig) (json.RawMessage, error) { - env := vm.NewEVM(vmctx.blockCtx, vmctx.txCtx, &dummyStatedb{}, chaincfg, vm.Config{Debug: true, Tracer: tracer}) +func runTrace(tracer tracers.Tracer, vmctx *vmContext, chaincfg *params.ChainConfig) (json.RawMessage, error) { var ( + env = vm.NewEVM(vmctx.blockCtx, vmctx.txCtx, &dummyStatedb{}, chaincfg, vm.Config{Debug: true, Tracer: tracer}) startGas uint64 = 10000 value = big.NewInt(0) + contract = vm.NewContract(account{}, account{}, value, startGas) ) - contract := vm.NewContract(account{}, account{}, value, startGas) contract.Code = []byte{byte(vm.PUSH1), 0x1, byte(vm.PUSH1), 0x1, 0x0} tracer.CaptureStart(env, contract.Caller(), contract.Address(), false, []byte{}, startGas, value) @@ -79,14 +80,11 @@ func runTrace(tracer *Tracer, vmctx *vmContext, chaincfg *params.ChainConfig) (j func TestTracer(t *testing.T) { execTracer := func(code string) ([]byte, string) { t.Helper() - tracer, err := New(code, new(Context)) + tracer, err := newJsTracer(code, nil) if err != nil { t.Fatal(err) } - ret, err := runTrace(tracer, &vmContext{ - blockCtx: vm.BlockContext{BlockNumber: big.NewInt(1)}, - txCtx: vm.TxContext{GasPrice: big.NewInt(100000)}, - }, params.TestChainConfig) + ret, err := runTrace(tracer, testCtx(), params.TestChainConfig) if err != nil { return nil, err.Error() // Stringify to allow comparison without nil checks } @@ -131,9 +129,8 @@ func TestTracer(t *testing.T) { func TestHalt(t *testing.T) { t.Skip("duktape doesn't support abortion") - timeout := errors.New("stahp") - tracer, err := New("{step: function() { while(1); }, result: function() { return null; }}", new(Context)) + tracer, err := newJsTracer("{step: function() { while(1); }, result: function() { return null; }, fault: function(){}}", nil) if err != nil { t.Fatal(err) } @@ -147,18 +144,19 @@ func TestHalt(t *testing.T) { } func TestHaltBetweenSteps(t *testing.T) { - tracer, err := New("{step: function() {}, fault: function() {}, result: function() { return null; }}", new(Context)) + tracer, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }}", nil) if err != nil { t.Fatal(err) } - env := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1)}, vm.TxContext{}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) + env := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1)}, vm.TxContext{GasPrice: big.NewInt(1)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) scope := &vm.ScopeContext{ Contract: vm.NewContract(&account{}, &account{}, big.NewInt(0), 0), } - tracer.CaptureState(env, 0, 0, 0, 0, scope, nil, 0, nil) + tracer.CaptureStart(env, common.Address{}, common.Address{}, false, []byte{}, 0, big.NewInt(0)) + tracer.CaptureState(0, 0, 0, 0, scope, nil, 0, nil) timeout := errors.New("stahp") tracer.Stop(timeout) - tracer.CaptureState(env, 0, 0, 0, 0, scope, nil, 0, nil) + tracer.CaptureState(0, 0, 0, 0, scope, nil, 0, nil) if _, err := tracer.GetResult(); err.Error() != timeout.Error() { t.Errorf("Expected timeout error, got %v", err) @@ -168,24 +166,16 @@ func TestHaltBetweenSteps(t *testing.T) { // TestNoStepExec tests a regular value transfer (no exec), and accessing the statedb // in 'result' func TestNoStepExec(t *testing.T) { - runEmptyTrace := func(tracer *Tracer, vmctx *vmContext) (json.RawMessage, error) { - env := vm.NewEVM(vmctx.blockCtx, vmctx.txCtx, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) - startGas := uint64(10000) - contract := vm.NewContract(account{}, account{}, big.NewInt(0), startGas) - tracer.CaptureStart(env, contract.Caller(), contract.Address(), false, []byte{}, startGas, big.NewInt(0)) - tracer.CaptureEnd(nil, startGas-contract.Gas, 1, nil) - return tracer.GetResult() - } execTracer := func(code string) []byte { t.Helper() - tracer, err := New(code, new(Context)) + tracer, err := newJsTracer(code, nil) if err != nil { t.Fatal(err) } - ret, err := runEmptyTrace(tracer, &vmContext{ - blockCtx: vm.BlockContext{BlockNumber: big.NewInt(1)}, - txCtx: vm.TxContext{GasPrice: big.NewInt(100000)}, - }) + env := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1)}, vm.TxContext{GasPrice: big.NewInt(100)}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) + tracer.CaptureStart(env, common.Address{}, common.Address{}, false, []byte{}, 1000, big.NewInt(0)) + tracer.CaptureEnd(nil, 0, 1, nil) + ret, err := tracer.GetResult() if err != nil { t.Fatal(err) } @@ -212,7 +202,7 @@ func TestIsPrecompile(t *testing.T) { chaincfg.IstanbulBlock = big.NewInt(200) chaincfg.BerlinBlock = big.NewInt(300) txCtx := vm.TxContext{GasPrice: big.NewInt(100000)} - tracer, err := New("{addr: toAddress('0000000000000000000000000000000000000009'), res: null, step: function() { this.res = isPrecompiled(this.addr); }, fault: function() {}, result: function() { return this.res; }}", new(Context)) + tracer, err := newJsTracer("{addr: toAddress('0000000000000000000000000000000000000009'), res: null, step: function() { this.res = isPrecompiled(this.addr); }, fault: function() {}, result: function() { return this.res; }}", nil) if err != nil { t.Fatal(err) } @@ -226,7 +216,7 @@ func TestIsPrecompile(t *testing.T) { t.Errorf("Tracer should not consider blake2f as precompile in byzantium") } - tracer, _ = New("{addr: toAddress('0000000000000000000000000000000000000009'), res: null, step: function() { this.res = isPrecompiled(this.addr); }, fault: function() {}, result: function() { return this.res; }}", new(Context)) + tracer, _ = newJsTracer("{addr: toAddress('0000000000000000000000000000000000000009'), res: null, step: function() { this.res = isPrecompiled(this.addr); }, fault: function() {}, result: function() { return this.res; }}", nil) blockCtx = vm.BlockContext{BlockNumber: big.NewInt(250)} res, err = runTrace(tracer, &vmContext{blockCtx, txCtx}, chaincfg) if err != nil { @@ -239,23 +229,20 @@ func TestIsPrecompile(t *testing.T) { func TestEnterExit(t *testing.T) { // test that either both or none of enter() and exit() are defined - if _, err := New("{step: function() {}, fault: function() {}, result: function() { return null; }, enter: function() {}}", new(Context)); err == nil { + if _, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }, enter: function() {}}", new(tracers.Context)); err == nil { t.Fatal("tracer creation should've failed without exit() definition") } - if _, err := New("{step: function() {}, fault: function() {}, result: function() { return null; }, enter: function() {}, exit: function() {}}", new(Context)); err != nil { + if _, err := newJsTracer("{step: function() {}, fault: function() {}, result: function() { return null; }, enter: function() {}, exit: function() {}}", new(tracers.Context)); err != nil { t.Fatal(err) } - // test that the enter and exit method are correctly invoked and the values passed - tracer, err := New("{enters: 0, exits: 0, enterGas: 0, gasUsed: 0, step: function() {}, fault: function() {}, result: function() { return {enters: this.enters, exits: this.exits, enterGas: this.enterGas, gasUsed: this.gasUsed} }, enter: function(frame) { this.enters++; this.enterGas = frame.getGas(); }, exit: function(res) { this.exits++; this.gasUsed = res.getGasUsed(); }}", new(Context)) + tracer, err := newJsTracer("{enters: 0, exits: 0, enterGas: 0, gasUsed: 0, step: function() {}, fault: function() {}, result: function() { return {enters: this.enters, exits: this.exits, enterGas: this.enterGas, gasUsed: this.gasUsed} }, enter: function(frame) { this.enters++; this.enterGas = frame.getGas(); }, exit: function(res) { this.exits++; this.gasUsed = res.getGasUsed(); }}", new(tracers.Context)) if err != nil { t.Fatal(err) } - scope := &vm.ScopeContext{ Contract: vm.NewContract(&account{}, &account{}, big.NewInt(0), 0), } - tracer.CaptureEnter(vm.CALL, scope.Contract.Caller(), scope.Contract.Address(), []byte{}, 1000, new(big.Int)) tracer.CaptureExit([]byte{}, 400, nil) diff --git a/core/vm/access_list_tracer.go b/eth/tracers/logger/access_list_tracer.go similarity index 81% rename from core/vm/access_list_tracer.go rename to eth/tracers/logger/access_list_tracer.go index 11b4e29426..181fc47acb 100644 --- a/core/vm/access_list_tracer.go +++ b/eth/tracers/logger/access_list_tracer.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package vm +package logger import ( "math/big" @@ -22,6 +22,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" ) // accessList is an accumulator for the set of accounts and storage slots an EVM @@ -137,36 +138,38 @@ func NewAccessListTracer(acl types.AccessList, from, to common.Address, precompi } } -func (a *AccessListTracer) CaptureStart(env *EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { +func (a *AccessListTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { } // CaptureState captures all opcodes that touch storage or addresses and adds them to the accesslist. -func (a *AccessListTracer) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) { +func (a *AccessListTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { stack := scope.Stack - if (op == SLOAD || op == SSTORE) && stack.len() >= 1 { - slot := common.Hash(stack.data[stack.len()-1].Bytes32()) + stackData := stack.Data() + stackLen := len(stackData) + if (op == vm.SLOAD || op == vm.SSTORE) && stackLen >= 1 { + slot := common.Hash(stackData[stackLen-1].Bytes32()) a.list.addSlot(scope.Contract.Address(), slot) } - if (op == EXTCODECOPY || op == EXTCODEHASH || op == EXTCODESIZE || op == BALANCE || op == SELFDESTRUCT) && stack.len() >= 1 { - addr := common.Address(stack.data[stack.len()-1].Bytes20()) + if (op == vm.EXTCODECOPY || op == vm.EXTCODEHASH || op == vm.EXTCODESIZE || op == vm.BALANCE || op == vm.SELFDESTRUCT) && stackLen >= 1 { + addr := common.Address(stackData[stackLen-1].Bytes20()) if _, ok := a.excl[addr]; !ok { a.list.addAddress(addr) } } - if (op == DELEGATECALL || op == CALL || op == STATICCALL || op == CALLCODE) && stack.len() >= 5 { - addr := common.Address(stack.data[stack.len()-2].Bytes20()) + if (op == vm.DELEGATECALL || op == vm.CALL || op == vm.STATICCALL || op == vm.CALLCODE) && stackLen >= 5 { + addr := common.Address(stackData[stackLen-2].Bytes20()) if _, ok := a.excl[addr]; !ok { a.list.addAddress(addr) } } } -func (*AccessListTracer) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) { +func (*AccessListTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { } func (*AccessListTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {} -func (*AccessListTracer) CaptureEnter(typ OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +func (*AccessListTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { } func (*AccessListTracer) CaptureExit(output []byte, gasUsed uint64, err error) {} diff --git a/core/vm/gen_structlog.go b/eth/tracers/logger/gen_structlog.go similarity index 94% rename from core/vm/gen_structlog.go rename to eth/tracers/logger/gen_structlog.go index 365f3b7914..9e71b555cb 100644 --- a/core/vm/gen_structlog.go +++ b/eth/tracers/logger/gen_structlog.go @@ -1,6 +1,6 @@ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. -package vm +package logger import ( "encoding/json" @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/vm" "github.com/holiman/uint256" ) @@ -17,7 +18,7 @@ var _ = (*structLogMarshaling)(nil) func (s StructLog) MarshalJSON() ([]byte, error) { type StructLog struct { Pc uint64 `json:"pc"` - Op OpCode `json:"op"` + Op vm.OpCode `json:"op"` Gas math.HexOrDecimal64 `json:"gas"` GasCost math.HexOrDecimal64 `json:"gasCost"` Memory hexutil.Bytes `json:"memory"` @@ -53,7 +54,7 @@ func (s StructLog) MarshalJSON() ([]byte, error) { func (s *StructLog) UnmarshalJSON(input []byte) error { type StructLog struct { Pc *uint64 `json:"pc"` - Op *OpCode `json:"op"` + Op *vm.OpCode `json:"op"` Gas *math.HexOrDecimal64 `json:"gas"` GasCost *math.HexOrDecimal64 `json:"gasCost"` Memory *hexutil.Bytes `json:"memory"` diff --git a/eth/tracers/logger/logger.go b/eth/tracers/logger/logger.go new file mode 100644 index 0000000000..8461935822 --- /dev/null +++ b/eth/tracers/logger/logger.go @@ -0,0 +1,349 @@ +// Copyright 2015 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 . + +package logger + +import ( + "encoding/hex" + "fmt" + "io" + "math/big" + "strings" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" + "github.com/holiman/uint256" +) + +// Storage represents a contract's storage. +type Storage map[common.Hash]common.Hash + +// Copy duplicates the current storage. +func (s Storage) Copy() Storage { + cpy := make(Storage) + for key, value := range s { + cpy[key] = value + } + return cpy +} + +// Config are the configuration options for structured logger the EVM +type Config struct { + EnableMemory bool // enable memory capture + DisableStack bool // disable stack capture + DisableStorage bool // disable storage capture + EnableReturnData bool // enable return data capture + Debug bool // print output during capture end + Limit int // maximum length of output, but zero means unlimited + // Chain overrides, can be used to execute a trace using future fork rules + Overrides *params.ChainConfig `json:"overrides,omitempty"` +} + +//go:generate gencodec -type StructLog -field-override structLogMarshaling -out gen_structlog.go + +// StructLog is emitted to the EVM each cycle and lists information about the current internal state +// prior to the execution of the statement. +type StructLog struct { + Pc uint64 `json:"pc"` + Op vm.OpCode `json:"op"` + Gas uint64 `json:"gas"` + GasCost uint64 `json:"gasCost"` + Memory []byte `json:"memory"` + MemorySize int `json:"memSize"` + Stack []uint256.Int `json:"stack"` + ReturnData []byte `json:"returnData"` + Storage map[common.Hash]common.Hash `json:"-"` + Depth int `json:"depth"` + RefundCounter uint64 `json:"refund"` + Err error `json:"-"` +} + +// overrides for gencodec +type structLogMarshaling struct { + Gas math.HexOrDecimal64 + GasCost math.HexOrDecimal64 + Memory hexutil.Bytes + ReturnData hexutil.Bytes + OpName string `json:"opName"` // adds call to OpName() in MarshalJSON + ErrorString string `json:"error"` // adds call to ErrorString() in MarshalJSON +} + +// OpName formats the operand name in a human-readable format. +func (s *StructLog) OpName() string { + return s.Op.String() +} + +// ErrorString formats the log's error as a string. +func (s *StructLog) ErrorString() string { + if s.Err != nil { + return s.Err.Error() + } + return "" +} + +// StructLogger is an EVM state logger and implements EVMLogger. +// +// StructLogger can capture state based on the given Log configuration and also keeps +// a track record of modified storage which is used in reporting snapshots of the +// contract their storage. +type StructLogger struct { + cfg Config + env *vm.EVM + + storage map[common.Address]Storage + logs []StructLog + output []byte + err error +} + +// NewStructLogger returns a new logger +func NewStructLogger(cfg *Config) *StructLogger { + logger := &StructLogger{ + storage: make(map[common.Address]Storage), + } + if cfg != nil { + logger.cfg = *cfg + } + return logger +} + +// Reset clears the data held by the logger. +func (l *StructLogger) Reset() { + l.storage = make(map[common.Address]Storage) + l.output = make([]byte, 0) + l.logs = l.logs[:0] + l.err = nil +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (l *StructLogger) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + l.env = env +} + +// CaptureState logs a new structured log message and pushes it out to the environment +// +// CaptureState also tracks SLOAD/SSTORE ops to track storage change. +func (l *StructLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + memory := scope.Memory + stack := scope.Stack + contract := scope.Contract + // check if already accumulated the specified number of logs + if l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) { + return + } + // Copy a snapshot of the current memory state to a new buffer + var mem []byte + if l.cfg.EnableMemory { + mem = make([]byte, len(memory.Data())) + copy(mem, memory.Data()) + } + // Copy a snapshot of the current stack state to a new buffer + var stck []uint256.Int + if !l.cfg.DisableStack { + stck = make([]uint256.Int, len(stack.Data())) + for i, item := range stack.Data() { + stck[i] = item + } + } + stackData := stack.Data() + stackLen := len(stackData) + // Copy a snapshot of the current storage to a new container + var storage Storage + if !l.cfg.DisableStorage && (op == vm.SLOAD || op == vm.SSTORE) { + // initialise new changed values storage container for this contract + // if not present. + if l.storage[contract.Address()] == nil { + l.storage[contract.Address()] = make(Storage) + } + // capture SLOAD opcodes and record the read entry in the local storage + if op == vm.SLOAD && stackLen >= 1 { + var ( + address = common.Hash(stackData[stackLen-1].Bytes32()) + value = l.env.StateDB.GetState(contract.Address(), address) + ) + l.storage[contract.Address()][address] = value + storage = l.storage[contract.Address()].Copy() + } else if op == vm.SSTORE && stackLen >= 2 { + // capture SSTORE opcodes and record the written entry in the local storage. + var ( + value = common.Hash(stackData[stackLen-2].Bytes32()) + address = common.Hash(stackData[stackLen-1].Bytes32()) + ) + l.storage[contract.Address()][address] = value + storage = l.storage[contract.Address()].Copy() + } + } + var rdata []byte + if l.cfg.EnableReturnData { + rdata = make([]byte, len(rData)) + copy(rdata, rData) + } + // create a new snapshot of the EVM. + log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, rdata, storage, depth, l.env.StateDB.GetRefund(), err} + l.logs = append(l.logs, log) +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault +// while running an opcode. +func (l *StructLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) { + l.output = output + l.err = err + if l.cfg.Debug { + fmt.Printf("0x%x\n", output) + if err != nil { + fmt.Printf(" error: %v\n", err) + } + } +} + +func (l *StructLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +func (l *StructLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} + +// StructLogs returns the captured log entries. +func (l *StructLogger) StructLogs() []StructLog { return l.logs } + +// Error returns the VM error captured by the trace. +func (l *StructLogger) Error() error { return l.err } + +// Output returns the VM return value captured by the trace. +func (l *StructLogger) Output() []byte { return l.output } + +// WriteTrace writes a formatted trace to the given writer +func WriteTrace(writer io.Writer, logs []StructLog) { + for _, log := range logs { + fmt.Fprintf(writer, "%-16spc=%08d gas=%v cost=%v", log.Op, log.Pc, log.Gas, log.GasCost) + if log.Err != nil { + fmt.Fprintf(writer, " ERROR: %v", log.Err) + } + fmt.Fprintln(writer) + + if len(log.Stack) > 0 { + fmt.Fprintln(writer, "Stack:") + for i := len(log.Stack) - 1; i >= 0; i-- { + fmt.Fprintf(writer, "%08d %s\n", len(log.Stack)-i-1, log.Stack[i].Hex()) + } + } + if len(log.Memory) > 0 { + fmt.Fprintln(writer, "Memory:") + fmt.Fprint(writer, hex.Dump(log.Memory)) + } + if len(log.Storage) > 0 { + fmt.Fprintln(writer, "Storage:") + for h, item := range log.Storage { + fmt.Fprintf(writer, "%x: %x\n", h, item) + } + } + if len(log.ReturnData) > 0 { + fmt.Fprintln(writer, "ReturnData:") + fmt.Fprint(writer, hex.Dump(log.ReturnData)) + } + fmt.Fprintln(writer) + } +} + +// WriteLogs writes vm logs in a readable format to the given writer +func WriteLogs(writer io.Writer, logs []*types.Log) { + for _, log := range logs { + fmt.Fprintf(writer, "LOG%d: %x bn=%d txi=%x\n", len(log.Topics), log.Address, log.BlockNumber, log.TxIndex) + + for i, topic := range log.Topics { + fmt.Fprintf(writer, "%08d %x\n", i, topic) + } + + fmt.Fprint(writer, hex.Dump(log.Data)) + fmt.Fprintln(writer) + } +} + +type mdLogger struct { + out io.Writer + cfg *Config + env *vm.EVM +} + +// NewMarkdownLogger creates a logger which outputs information in a format adapted +// for human readability, and is also a valid markdown table +func NewMarkdownLogger(cfg *Config, writer io.Writer) *mdLogger { + l := &mdLogger{out: writer, cfg: cfg} + if l.cfg == nil { + l.cfg = &Config{} + } + return l +} + +func (t *mdLogger) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + if !create { + fmt.Fprintf(t.out, "From: `%v`\nTo: `%v`\nData: `0x%x`\nGas: `%d`\nValue `%v` wei\n", + from.String(), to.String(), + input, gas, value) + } else { + fmt.Fprintf(t.out, "From: `%v`\nCreate at: `%v`\nData: `0x%x`\nGas: `%d`\nValue `%v` wei\n", + from.String(), to.String(), + input, gas, value) + } + + fmt.Fprintf(t.out, ` +| Pc | Op | Cost | Stack | RStack | Refund | +|-------|-------------|------|-----------|-----------|---------| +`) +} + +// CaptureState also tracks SLOAD/SSTORE ops to track storage change. +func (t *mdLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + stack := scope.Stack + fmt.Fprintf(t.out, "| %4d | %10v | %3d |", pc, op, cost) + + if !t.cfg.DisableStack { + // format stack + var a []string + for _, elem := range stack.Data() { + a = append(a, elem.Hex()) + } + b := fmt.Sprintf("[%v]", strings.Join(a, ",")) + fmt.Fprintf(t.out, "%10v |", b) + } + fmt.Fprintf(t.out, "%10v |", t.env.StateDB.GetRefund()) + fmt.Fprintln(t.out, "") + if err != nil { + fmt.Fprintf(t.out, "Error: %v\n", err) + } +} + +func (t *mdLogger) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { + fmt.Fprintf(t.out, "\nError: at pc=%d, op=%v: %v\n", pc, op, err) +} + +func (t *mdLogger) CaptureEnd(output []byte, gasUsed uint64, tm time.Duration, err error) { + fmt.Fprintf(t.out, "\nOutput: `0x%x`\nConsumed gas: `%d`\nError: `%v`\n", + output, gasUsed, err) +} + +func (t *mdLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +func (t *mdLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} diff --git a/core/vm/logger_json.go b/eth/tracers/logger/logger_json.go similarity index 69% rename from core/vm/logger_json.go rename to eth/tracers/logger/logger_json.go index 479a00c0ac..4a7abacba2 100644 --- a/core/vm/logger_json.go +++ b/eth/tracers/logger/logger_json.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package vm +package logger import ( "encoding/json" @@ -24,30 +24,36 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/vm" ) type JSONLogger struct { encoder *json.Encoder - cfg *LogConfig + cfg *Config + env *vm.EVM } // NewJSONLogger creates a new EVM tracer that prints execution steps as JSON objects // into the provided stream. -func NewJSONLogger(cfg *LogConfig, writer io.Writer) *JSONLogger { - l := &JSONLogger{json.NewEncoder(writer), cfg} +func NewJSONLogger(cfg *Config, writer io.Writer) *JSONLogger { + l := &JSONLogger{encoder: json.NewEncoder(writer), cfg: cfg} if l.cfg == nil { - l.cfg = &LogConfig{} + l.cfg = &Config{} } return l } -func (l *JSONLogger) CaptureStart(env *EVM, from, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { +func (l *JSONLogger) CaptureStart(env *vm.EVM, from, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + l.env = env } -func (l *JSONLogger) CaptureFault(*EVM, uint64, OpCode, uint64, uint64, *ScopeContext, int, error) {} +func (l *JSONLogger) CaptureFault(pc uint64, op vm.OpCode, gas uint64, cost uint64, scope *vm.ScopeContext, depth int, err error) { + // TODO: Add rData to this interface as well + l.CaptureState(pc, op, gas, cost, scope, nil, depth, err) +} // CaptureState outputs state information on the logger. -func (l *JSONLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) { +func (l *JSONLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { memory := scope.Memory stack := scope.Stack @@ -58,14 +64,14 @@ func (l *JSONLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint GasCost: cost, MemorySize: memory.Len(), Depth: depth, - RefundCounter: env.StateDB.GetRefund(), + RefundCounter: l.env.StateDB.GetRefund(), Err: err, } if l.cfg.EnableMemory { log.Memory = memory.Data() } if !l.cfg.DisableStack { - log.Stack = stack.data + log.Stack = stack.Data() } if l.cfg.EnableReturnData { log.ReturnData = rData @@ -88,7 +94,7 @@ func (l *JSONLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, errMsg}) } -func (l *JSONLogger) CaptureEnter(typ OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +func (l *JSONLogger) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { } func (l *JSONLogger) CaptureExit(output []byte, gasUsed uint64, err error) {} diff --git a/core/vm/logger_test.go b/eth/tracers/logger/logger_test.go similarity index 72% rename from core/vm/logger_test.go rename to eth/tracers/logger/logger_test.go index 730d8374bb..205ee31120 100644 --- a/core/vm/logger_test.go +++ b/eth/tracers/logger/logger_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package vm +package logger import ( "math/big" @@ -22,8 +22,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" - "github.com/holiman/uint256" ) type dummyContractRef struct { @@ -46,23 +46,23 @@ type dummyStatedb struct { state.StateDB } -func (*dummyStatedb) GetRefund() uint64 { return 1337 } +func (*dummyStatedb) GetRefund() uint64 { return 1337 } +func (*dummyStatedb) GetState(_ common.Address, _ common.Hash) common.Hash { return common.Hash{} } +func (*dummyStatedb) SetState(_ common.Address, _ common.Hash, _ common.Hash) {} func TestStoreCapture(t *testing.T) { var ( - env = NewEVM(BlockContext{}, TxContext{}, &dummyStatedb{}, params.TestChainConfig, Config{}) logger = NewStructLogger(nil) - contract = NewContract(&dummyContractRef{}, &dummyContractRef{}, new(big.Int), 0) - scope = &ScopeContext{ - Memory: NewMemory(), - Stack: newstack(), - Contract: contract, - } + env = vm.NewEVM(vm.BlockContext{}, vm.TxContext{}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: logger}) + contract = vm.NewContract(&dummyContractRef{}, &dummyContractRef{}, new(big.Int), 100000) ) - scope.Stack.push(uint256.NewInt(1)) - scope.Stack.push(new(uint256.Int)) + contract.Code = []byte{byte(vm.PUSH1), 0x1, byte(vm.PUSH1), 0x0, byte(vm.SSTORE)} var index common.Hash - logger.CaptureState(env, 0, SSTORE, 0, 0, scope, nil, 0, nil) + logger.CaptureStart(env, common.Address{}, contract.Address(), false, nil, 0, nil) + _, err := env.Interpreter().Run(contract, []byte{}, false) + if err != nil { + t.Fatal(err) + } if len(logger.storage[contract.Address()]) == 0 { t.Fatalf("expected exactly 1 changed value on address %x, got %d", contract.Address(), len(logger.storage[contract.Address()])) diff --git a/eth/tracers/native/4byte.go b/eth/tracers/native/4byte.go new file mode 100644 index 0000000000..e60e82de47 --- /dev/null +++ b/eth/tracers/native/4byte.go @@ -0,0 +1,148 @@ +// Copyright 2021 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 . + +package native + +import ( + "encoding/json" + "math/big" + "strconv" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers" +) + +func init() { + register("4byteTracer", newFourByteTracer) +} + +// fourByteTracer searches for 4byte-identifiers, and collects them for post-processing. +// It collects the methods identifiers along with the size of the supplied data, so +// a reversed signature can be matched against the size of the data. +// +// Example: +// > debug.traceTransaction( "0x214e597e35da083692f5386141e69f47e973b2c56e7a8073b1ea08fd7571e9de", {tracer: "4byteTracer"}) +// { +// 0x27dc297e-128: 1, +// 0x38cc4831-0: 2, +// 0x524f3889-96: 1, +// 0xadf59f99-288: 1, +// 0xc281d19e-0: 1 +// } +type fourByteTracer struct { + env *vm.EVM + ids map[string]int // ids aggregates the 4byte ids found + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption + activePrecompiles []common.Address // Updated on CaptureStart based on given rules +} + +// newFourByteTracer returns a native go tracer which collects +// 4 byte-identifiers of a tx, and implements vm.EVMLogger. +func newFourByteTracer() tracers.Tracer { + t := &fourByteTracer{ + ids: make(map[string]int), + } + return t +} + +// isPrecompiled returns whether the addr is a precompile. Logic borrowed from newJsTracer in eth/tracers/js/tracer.go +func (t *fourByteTracer) isPrecompiled(addr common.Address) bool { + for _, p := range t.activePrecompiles { + if p == addr { + return true + } + } + return false +} + +// store saves the given identifier and datasize. +func (t *fourByteTracer) store(id []byte, size int) { + key := bytesToHex(id) + "-" + strconv.Itoa(size) + t.ids[key] += 1 +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *fourByteTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + + // Update list of precompiles based on current block + rules := env.ChainConfig().Rules(env.Context.BlockNumber) + t.activePrecompiles = vm.ActivePrecompiles(rules) + + // Save the outer calldata also + if len(input) >= 4 { + t.store(input[0:4], len(input)-4) + } +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *fourByteTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *fourByteTracer) CaptureEnter(op vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + // Skip if tracing was interrupted + if atomic.LoadUint32(&t.interrupt) > 0 { + t.env.Cancel() + return + } + if len(input) < 4 { + return + } + // primarily we want to avoid CREATE/CREATE2/SELFDESTRUCT + if op != vm.DELEGATECALL && op != vm.STATICCALL && + op != vm.CALL && op != vm.CALLCODE { + return + } + // Skip any pre-compile invocations, those are just fancy opcodes + if t.isPrecompiled(to) { + return + } + t.store(input[0:4], len(input)-4) +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *fourByteTracer) CaptureExit(output []byte, gasUsed uint64, err error) { +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *fourByteTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *fourByteTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { +} + +// GetResult returns the json-encoded nested list of call traces, and any +// error arising from the encoding or forceful termination (via `Stop`). +func (t *fourByteTracer) GetResult() (json.RawMessage, error) { + res, err := json.Marshal(t.ids) + if err != nil { + return nil, err + } + return res, t.reason +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *fourByteTracer) Stop(err error) { + t.reason = err + atomic.StoreUint32(&t.interrupt, 1) +} diff --git a/eth/tracers/native/call.go b/eth/tracers/native/call.go new file mode 100644 index 0000000000..16ea75aa4a --- /dev/null +++ b/eth/tracers/native/call.go @@ -0,0 +1,182 @@ +// Copyright 2021 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 . + +package native + +import ( + "encoding/json" + "errors" + "math/big" + "strconv" + "strings" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers" +) + +func init() { + register("callTracer", newCallTracer) +} + +type callFrame struct { + Type string `json:"type"` + From string `json:"from"` + To string `json:"to,omitempty"` + Value string `json:"value,omitempty"` + Gas string `json:"gas"` + GasUsed string `json:"gasUsed"` + Input string `json:"input"` + Output string `json:"output,omitempty"` + Error string `json:"error,omitempty"` + Calls []callFrame `json:"calls,omitempty"` +} + +type callTracer struct { + env *vm.EVM + callstack []callFrame + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption +} + +// newCallTracer returns a native go tracer which tracks +// call frames of a tx, and implements vm.EVMLogger. +func newCallTracer() tracers.Tracer { + // First callframe contains tx context info + // and is populated on start and end. + t := &callTracer{callstack: make([]callFrame, 1)} + return t +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *callTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + t.callstack[0] = callFrame{ + Type: "CALL", + From: addrToHex(from), + To: addrToHex(to), + Input: bytesToHex(input), + Gas: uintToHex(gas), + Value: bigToHex(value), + } + if create { + t.callstack[0].Type = "CREATE" + } +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *callTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { + t.callstack[0].GasUsed = uintToHex(gasUsed) + if err != nil { + t.callstack[0].Error = err.Error() + if err.Error() == "execution reverted" && len(output) > 0 { + t.callstack[0].Output = bytesToHex(output) + } + } else { + t.callstack[0].Output = bytesToHex(output) + } +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *callTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *callTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, _ *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *callTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + // Skip if tracing was interrupted + if atomic.LoadUint32(&t.interrupt) > 0 { + t.env.Cancel() + return + } + + call := callFrame{ + Type: typ.String(), + From: addrToHex(from), + To: addrToHex(to), + Input: bytesToHex(input), + Gas: uintToHex(gas), + Value: bigToHex(value), + } + t.callstack = append(t.callstack, call) +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *callTracer) CaptureExit(output []byte, gasUsed uint64, err error) { + size := len(t.callstack) + if size <= 1 { + return + } + // pop call + call := t.callstack[size-1] + t.callstack = t.callstack[:size-1] + size -= 1 + + call.GasUsed = uintToHex(gasUsed) + if err == nil { + call.Output = bytesToHex(output) + } else { + call.Error = err.Error() + if call.Type == "CREATE" || call.Type == "CREATE2" { + call.To = "" + } + } + t.callstack[size-1].Calls = append(t.callstack[size-1].Calls, call) +} + +// GetResult returns the json-encoded nested list of call traces, and any +// error arising from the encoding or forceful termination (via `Stop`). +func (t *callTracer) GetResult() (json.RawMessage, error) { + if len(t.callstack) != 1 { + return nil, errors.New("incorrect number of top-level calls") + } + res, err := json.Marshal(t.callstack[0]) + if err != nil { + return nil, err + } + return json.RawMessage(res), t.reason +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *callTracer) Stop(err error) { + t.reason = err + atomic.StoreUint32(&t.interrupt, 1) +} + +func bytesToHex(s []byte) string { + return "0x" + common.Bytes2Hex(s) +} + +func bigToHex(n *big.Int) string { + if n == nil { + return "" + } + return "0x" + n.Text(16) +} + +func uintToHex(n uint64) string { + return "0x" + strconv.FormatUint(n, 16) +} + +func addrToHex(a common.Address) string { + return strings.ToLower(a.Hex()) +} diff --git a/eth/tracers/native/noop.go b/eth/tracers/native/noop.go new file mode 100644 index 0000000000..ee110ef7df --- /dev/null +++ b/eth/tracers/native/noop.go @@ -0,0 +1,74 @@ +// Copyright 2021 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 . + +package native + +import ( + "encoding/json" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers" +) + +func init() { + register("noopTracerNative", newNoopTracer) +} + +// noopTracer is a go implementation of the Tracer interface which +// performs no action. It's mostly useful for testing purposes. +type noopTracer struct{} + +// newNoopTracer returns a new noop tracer. +func newNoopTracer() tracers.Tracer { + return &noopTracer{} +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *noopTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *noopTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *noopTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *noopTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, _ *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *noopTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *noopTracer) CaptureExit(output []byte, gasUsed uint64, err error) { +} + +// GetResult returns an empty json object. +func (t *noopTracer) GetResult() (json.RawMessage, error) { + return json.RawMessage(`{}`), nil +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *noopTracer) Stop(err error) { +} diff --git a/eth/tracers/native/tracer.go b/eth/tracers/native/tracer.go new file mode 100644 index 0000000000..3158654f33 --- /dev/null +++ b/eth/tracers/native/tracer.go @@ -0,0 +1,79 @@ +// Copyright 2021 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 . + +/* +Package native is a collection of tracers written in go. + +In order to add a native tracer and have it compiled into the binary, a new +file needs to be added to this folder, containing an implementation of the +`eth.tracers.Tracer` interface. + +Aside from implementing the tracer, it also needs to register itself, using the +`register` method -- and this needs to be done in the package initialization. + +Example: + +```golang +func init() { + register("noopTracerNative", newNoopTracer) +} +``` +*/ +package native + +import ( + "errors" + + "github.com/ethereum/go-ethereum/eth/tracers" +) + +// init registers itself this packages as a lookup for tracers. +func init() { + tracers.RegisterLookup(false, lookup) +} + +/* +ctors is a map of package-local tracer constructors. + +We cannot be certain about the order of init-functions within a package, +The go spec (https://golang.org/ref/spec#Package_initialization) says + +> To ensure reproducible initialization behavior, build systems +> are encouraged to present multiple files belonging to the same +> package in lexical file name order to a compiler. + +Hence, we cannot make the map in init, but must make it upon first use. +*/ +var ctors map[string]func() tracers.Tracer + +// register is used by native tracers to register their presence. +func register(name string, ctor func() tracers.Tracer) { + if ctors == nil { + ctors = make(map[string]func() tracers.Tracer) + } + ctors[name] = ctor +} + +// lookup returns a tracer, if one can be matched to the given name. +func lookup(name string, ctx *tracers.Context) (tracers.Tracer, error) { + if ctors == nil { + ctors = make(map[string]func() tracers.Tracer) + } + if ctor, ok := ctors[name]; ok { + return ctor(), nil + } + return nil, errors.New("no tracer found") +} diff --git a/eth/tracers/tracers.go b/eth/tracers/tracers.go index 4e1ef23ad2..e7073e7d2e 100644 --- a/eth/tracers/tracers.go +++ b/eth/tracers/tracers.go @@ -14,40 +14,59 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package tracers is a collection of JavaScript transaction tracers. +// Package tracers is a manager for transaction tracing engines. package tracers import ( - "strings" - "unicode" + "encoding/json" + "errors" - "github.com/ethereum/go-ethereum/eth/tracers/internal/tracers" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" ) -// all contains all the built in JavaScript tracers by name. -var all = make(map[string]string) +// Context contains some contextual infos for a transaction execution that is not +// available from within the EVM object. +type Context struct { + BlockHash common.Hash // Hash of the block the tx is contained within (zero if dangling tx or call) + TxIndex int // Index of the transaction within a block (zero if dangling tx or call) + TxHash common.Hash // Hash of the transaction being traced (zero if dangling call) +} -// camel converts a snake cased input string into a camel cased output. -func camel(str string) string { - pieces := strings.Split(str, "_") - for i := 1; i < len(pieces); i++ { - pieces[i] = string(unicode.ToUpper(rune(pieces[i][0]))) + pieces[i][1:] - } - return strings.Join(pieces, "") +// Tracer interface extends vm.EVMLogger and additionally +// allows collecting the tracing result. +type Tracer interface { + vm.EVMLogger + GetResult() (json.RawMessage, error) + // Stop terminates execution of the tracer at the first opportune moment. + Stop(err error) } -// init retrieves the JavaScript transaction tracers included in go-ethereum. -func init() { - for _, file := range tracers.AssetNames() { - name := camel(strings.TrimSuffix(file, ".js")) - all[name] = string(tracers.MustAsset(file)) +type lookupFunc func(string, *Context) (Tracer, error) + +var ( + lookups []lookupFunc +) + +// RegisterLookup registers a method as a lookup for tracers, meaning that +// users can invoke a named tracer through that lookup. If 'wildcard' is true, +// then the lookup will be placed last. This is typically meant for interpreted +// engines (js) which can evaluate dynamic user-supplied code. +func RegisterLookup(wildcard bool, lookup lookupFunc) { + if wildcard { + lookups = append(lookups, lookup) + } else { + lookups = append([]lookupFunc{lookup}, lookups...) } } -// tracer retrieves a specific JavaScript tracer by name. -func tracer(name string) (string, bool) { - if tracer, ok := all[name]; ok { - return tracer, true +// New returns a new instance of a tracer, by iterating through the +// registered lookups. +func New(code string, ctx *Context) (Tracer, error) { + for _, lookup := range lookups { + if tracer, err := lookup(code, ctx); err == nil { + return tracer, nil + } } - return "", false + return nil, errors.New("tracer not found") } diff --git a/eth/tracers/tracers_test.go b/eth/tracers/tracers_test.go index fb817fbc56..ce9289dd75 100644 --- a/eth/tracers/tracers_test.go +++ b/eth/tracers/tracers_test.go @@ -17,79 +17,21 @@ package tracers import ( - "crypto/ecdsa" - "crypto/rand" - "encoding/json" - "io/ioutil" "math/big" - "path/filepath" - "reflect" - "strings" "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "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/eth/tracers/logger" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/tests" ) -// To generate a new callTracer test, copy paste the makeTest method below into -// a Geth console and call it with a transaction hash you which to export. - -/* -// makeTest generates a callTracer test by running a prestate reassembled and a -// call trace run, assembling all the gathered information into a test case. -var makeTest = function(tx, rewind) { - // Generate the genesis block from the block, transaction and prestate data - var block = eth.getBlock(eth.getTransaction(tx).blockHash); - var genesis = eth.getBlock(block.parentHash); - - delete genesis.gasUsed; - delete genesis.logsBloom; - delete genesis.parentHash; - delete genesis.receiptsRoot; - delete genesis.sha3Uncles; - delete genesis.size; - delete genesis.transactions; - delete genesis.transactionsRoot; - delete genesis.uncles; - - genesis.gasLimit = genesis.gasLimit.toString(); - genesis.number = genesis.number.toString(); - genesis.timestamp = genesis.timestamp.toString(); - - genesis.alloc = debug.traceTransaction(tx, {tracer: "prestateTracer", rewind: rewind}); - for (var key in genesis.alloc) { - genesis.alloc[key].nonce = genesis.alloc[key].nonce.toString(); - } - genesis.config = admin.nodeInfo.protocols.eth.config; - - // Generate the call trace and produce the test input - var result = debug.traceTransaction(tx, {tracer: "callTracer", rewind: rewind}); - delete result.time; - - console.log(JSON.stringify({ - genesis: genesis, - context: { - number: block.number.toString(), - difficulty: block.difficulty, - timestamp: block.timestamp.toString(), - gasLimit: block.gasLimit.toString(), - miner: block.miner, - }, - input: eth.getRawTransaction(tx), - result: result, - }, null, 2)); -} -*/ - // callTrace is the result of a callTracer run. type callTrace struct { Type string `json:"type"` @@ -104,211 +46,6 @@ type callTrace struct { Calls []callTrace `json:"calls,omitempty"` } -type callContext struct { - Number math.HexOrDecimal64 `json:"number"` - Difficulty *math.HexOrDecimal256 `json:"difficulty"` - Time math.HexOrDecimal64 `json:"timestamp"` - GasLimit math.HexOrDecimal64 `json:"gasLimit"` - Miner common.Address `json:"miner"` -} - -// callTracerTest defines a single test to check the call tracer against. -type callTracerTest struct { - Genesis *core.Genesis `json:"genesis"` - Context *callContext `json:"context"` - Input string `json:"input"` - Result *callTrace `json:"result"` -} - -func TestPrestateTracerCreate2(t *testing.T) { - unsignedTx := types.NewTransaction(1, common.HexToAddress("0x00000000000000000000000000000000deadbeef"), - new(big.Int), 5000000, big.NewInt(1), []byte{}) - - privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand.Reader) - if err != nil { - t.Fatalf("err %v", err) - } - signer := types.NewEIP155Signer(big.NewInt(1)) - tx, err := types.SignTx(unsignedTx, signer, privateKeyECDSA) - if err != nil { - t.Fatalf("err %v", err) - } - /** - This comes from one of the test-vectors on the Skinny Create2 - EIP - - address 0x00000000000000000000000000000000deadbeef - salt 0x00000000000000000000000000000000000000000000000000000000cafebabe - init_code 0xdeadbeef - gas (assuming no mem expansion): 32006 - result: 0x60f3f640a8508fC6a86d45DF051962668E1e8AC7 - */ - origin, _ := signer.Sender(tx) - txContext := vm.TxContext{ - Origin: origin, - GasPrice: big.NewInt(1), - } - context := vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, - Coinbase: common.Address{}, - BlockNumber: new(big.Int).SetUint64(8000000), - Time: new(big.Int).SetUint64(5), - Difficulty: big.NewInt(0x30000), - GasLimit: uint64(6000000), - } - alloc := core.GenesisAlloc{} - - // The code pushes 'deadbeef' into memory, then the other params, and calls CREATE2, then returns - // the address - alloc[common.HexToAddress("0x00000000000000000000000000000000deadbeef")] = core.GenesisAccount{ - Nonce: 1, - Code: hexutil.MustDecode("0x63deadbeef60005263cafebabe6004601c6000F560005260206000F3"), - Balance: big.NewInt(1), - } - alloc[origin] = core.GenesisAccount{ - Nonce: 1, - Code: []byte{}, - Balance: big.NewInt(500000000000000), - } - _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), alloc, false) - - // Create the tracer, the EVM environment and run it - tracer, err := New("prestateTracer", new(Context)) - if err != nil { - t.Fatalf("failed to create call tracer: %v", err) - } - evm := vm.NewEVM(context, txContext, statedb, params.MainnetChainConfig, vm.Config{Debug: true, Tracer: tracer}) - - msg, err := tx.AsMessage(signer, nil) - if err != nil { - t.Fatalf("failed to prepare transaction for tracing: %v", err) - } - st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas())) - if _, err = st.TransitionDb(); err != nil { - t.Fatalf("failed to execute transaction: %v", err) - } - // Retrieve the trace result and compare against the etalon - res, err := tracer.GetResult() - if err != nil { - t.Fatalf("failed to retrieve trace result: %v", err) - } - ret := make(map[string]interface{}) - if err := json.Unmarshal(res, &ret); err != nil { - t.Fatalf("failed to unmarshal trace result: %v", err) - } - if _, has := ret["0x60f3f640a8508fc6a86d45df051962668e1e8ac7"]; !has { - t.Fatalf("Expected 0x60f3f640a8508fc6a86d45df051962668e1e8ac7 in result") - } -} - -// Iterates over all the input-output datasets in the tracer test harness and -// runs the JavaScript tracers against them. -func TestCallTracerLegacy(t *testing.T) { - testCallTracer("callTracerLegacy", "call_tracer_legacy", t) -} - -func testCallTracer(tracer string, dirPath string, t *testing.T) { - files, err := ioutil.ReadDir(filepath.Join("testdata", dirPath)) - if err != nil { - t.Fatalf("failed to retrieve tracer test suite: %v", err) - } - for _, file := range files { - if !strings.HasSuffix(file.Name(), ".json") { - continue - } - file := file // capture range variable - t.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(t *testing.T) { - t.Parallel() - - // Call tracer test found, read if from disk - blob, err := ioutil.ReadFile(filepath.Join("testdata", dirPath, file.Name())) - if err != nil { - t.Fatalf("failed to read testcase: %v", err) - } - test := new(callTracerTest) - if err := json.Unmarshal(blob, test); err != nil { - t.Fatalf("failed to parse testcase: %v", err) - } - // Configure a blockchain with the given prestate - tx := new(types.Transaction) - if err := rlp.DecodeBytes(common.FromHex(test.Input), tx); err != nil { - t.Fatalf("failed to parse testcase input: %v", err) - } - signer := types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number))) - origin, _ := signer.Sender(tx) - txContext := vm.TxContext{ - Origin: origin, - GasPrice: tx.GasPrice(), - } - context := vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, - Coinbase: test.Context.Miner, - BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)), - Time: new(big.Int).SetUint64(uint64(test.Context.Time)), - Difficulty: (*big.Int)(test.Context.Difficulty), - GasLimit: uint64(test.Context.GasLimit), - } - _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false) - - // Create the tracer, the EVM environment and run it - tracer, err := New(tracer, new(Context)) - if err != nil { - t.Fatalf("failed to create call tracer: %v", err) - } - evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Debug: true, Tracer: tracer}) - - msg, err := tx.AsMessage(signer, nil) - if err != nil { - t.Fatalf("failed to prepare transaction for tracing: %v", err) - } - st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas())) - if _, err = st.TransitionDb(); err != nil { - t.Fatalf("failed to execute transaction: %v", err) - } - // Retrieve the trace result and compare against the etalon - res, err := tracer.GetResult() - if err != nil { - t.Fatalf("failed to retrieve trace result: %v", err) - } - ret := new(callTrace) - if err := json.Unmarshal(res, ret); err != nil { - t.Fatalf("failed to unmarshal trace result: %v", err) - } - - if !jsonEqual(ret, test.Result) { - // uncomment this for easier debugging - //have, _ := json.MarshalIndent(ret, "", " ") - //want, _ := json.MarshalIndent(test.Result, "", " ") - //t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", string(have), string(want)) - t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result) - } - }) - } -} - -func TestCallTracer(t *testing.T) { - testCallTracer("callTracer", "call_tracer", t) -} - -// jsonEqual is similar to reflect.DeepEqual, but does a 'bounce' via json prior to -// comparison -func jsonEqual(x, y interface{}) bool { - xTrace := new(callTrace) - yTrace := new(callTrace) - if xj, err := json.Marshal(x); err == nil { - json.Unmarshal(xj, xTrace) - } else { - return false - } - if yj, err := json.Marshal(y); err == nil { - json.Unmarshal(yj, yTrace) - } else { - return false - } - return reflect.DeepEqual(xTrace, yTrace) -} - func BenchmarkTransactionTrace(b *testing.B) { key, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") from := crypto.PubkeyToAddress(key.PublicKey) @@ -337,6 +74,7 @@ func BenchmarkTransactionTrace(b *testing.B) { Time: new(big.Int).SetUint64(uint64(5)), Difficulty: big.NewInt(0xffffffff), GasLimit: gas, + BaseFee: big.NewInt(8), } alloc := core.GenesisAlloc{} // The code pushes 'deadbeef' into memory, then the other params, and calls CREATE2, then returns @@ -358,7 +96,7 @@ func BenchmarkTransactionTrace(b *testing.B) { } _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), alloc, false) // Create the tracer, the EVM environment and run it - tracer := vm.NewStructLogger(&vm.LogConfig{ + tracer := logger.NewStructLogger(&logger.Config{ Debug: false, //DisableStorage: true, //EnableMemory: false, @@ -386,73 +124,3 @@ func BenchmarkTransactionTrace(b *testing.B) { tracer.Reset() } } - -func BenchmarkTracers(b *testing.B) { - files, err := ioutil.ReadDir(filepath.Join("testdata", "call_tracer")) - if err != nil { - b.Fatalf("failed to retrieve tracer test suite: %v", err) - } - for _, file := range files { - if !strings.HasSuffix(file.Name(), ".json") { - continue - } - file := file // capture range variable - b.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(b *testing.B) { - blob, err := ioutil.ReadFile(filepath.Join("testdata", "call_tracer", file.Name())) - if err != nil { - b.Fatalf("failed to read testcase: %v", err) - } - test := new(callTracerTest) - if err := json.Unmarshal(blob, test); err != nil { - b.Fatalf("failed to parse testcase: %v", err) - } - benchTracer("callTracer", test, b) - }) - } -} - -func benchTracer(tracerName string, test *callTracerTest, b *testing.B) { - // Configure a blockchain with the given prestate - tx := new(types.Transaction) - if err := rlp.DecodeBytes(common.FromHex(test.Input), tx); err != nil { - b.Fatalf("failed to parse testcase input: %v", err) - } - signer := types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number))) - msg, err := tx.AsMessage(signer, nil) - if err != nil { - b.Fatalf("failed to prepare transaction for tracing: %v", err) - } - origin, _ := signer.Sender(tx) - txContext := vm.TxContext{ - Origin: origin, - GasPrice: tx.GasPrice(), - } - context := vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, - Coinbase: test.Context.Miner, - BlockNumber: new(big.Int).SetUint64(uint64(test.Context.Number)), - Time: new(big.Int).SetUint64(uint64(test.Context.Time)), - Difficulty: (*big.Int)(test.Context.Difficulty), - GasLimit: uint64(test.Context.GasLimit), - } - _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false) - - // Create the tracer, the EVM environment and run it - tracer, err := New(tracerName, new(Context)) - if err != nil { - b.Fatalf("failed to create call tracer: %v", err) - } - evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Debug: true, Tracer: tracer}) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - snap := statedb.Snapshot() - st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas())) - if _, err = st.TransitionDb(); err != nil { - b.Fatalf("failed to execute transaction: %v", err) - } - statedb.RevertToSnapshot(snap) - } -} diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index 8d904a7725..c6fa6b4c85 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -60,7 +60,7 @@ func (ec *Client) Close() { // Blockchain Access -// ChainId retrieves the current chain ID for transaction replay protection. +// ChainID retrieves the current chain ID for transaction replay protection. func (ec *Client) ChainID(ctx context.Context) (*big.Int, error) { var result hexutil.Big err := ec.c.CallContext(ctx, &result, "eth_chainId") @@ -242,6 +242,8 @@ func (ec *Client) TransactionSender(ctx context.Context, tx *types.Transaction, if err == nil { return sender, nil } + + // It was not found in cache, ask the server. var meta struct { Hash common.Hash From common.Address @@ -293,14 +295,6 @@ func (ec *Client) TransactionReceipt(ctx context.Context, txHash common.Hash) (* return r, err } -type rpcProgress struct { - StartingBlock hexutil.Uint64 - CurrentBlock hexutil.Uint64 - HighestBlock hexutil.Uint64 - PulledStates hexutil.Uint64 - KnownStates hexutil.Uint64 -} - // SyncProgress retrieves the current progress of the sync algorithm. If there's // no sync currently running, it returns nil. func (ec *Client) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) { @@ -313,17 +307,11 @@ func (ec *Client) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, err if err := json.Unmarshal(raw, &syncing); err == nil { return nil, nil // Not syncing (always false) } - var progress *rpcProgress - if err := json.Unmarshal(raw, &progress); err != nil { + var p *rpcProgress + if err := json.Unmarshal(raw, &p); err != nil { return nil, err } - return ðereum.SyncProgress{ - StartingBlock: uint64(progress.StartingBlock), - CurrentBlock: uint64(progress.CurrentBlock), - HighestBlock: uint64(progress.HighestBlock), - PulledStates: uint64(progress.PulledStates), - KnownStates: uint64(progress.KnownStates), - }, nil + return p.toSyncProgress(), nil } // SubscribeNewHead subscribes to notifications about the current blockchain head @@ -563,3 +551,51 @@ func toCallArg(msg ethereum.CallMsg) interface{} { } return arg } + +// rpcProgress is a copy of SyncProgress with hex-encoded fields. +type rpcProgress struct { + StartingBlock hexutil.Uint64 + CurrentBlock hexutil.Uint64 + HighestBlock hexutil.Uint64 + + PulledStates hexutil.Uint64 + KnownStates hexutil.Uint64 + + SyncedAccounts hexutil.Uint64 + SyncedAccountBytes hexutil.Uint64 + SyncedBytecodes hexutil.Uint64 + SyncedBytecodeBytes hexutil.Uint64 + SyncedStorage hexutil.Uint64 + SyncedStorageBytes hexutil.Uint64 + HealedTrienodes hexutil.Uint64 + HealedTrienodeBytes hexutil.Uint64 + HealedBytecodes hexutil.Uint64 + HealedBytecodeBytes hexutil.Uint64 + HealingTrienodes hexutil.Uint64 + HealingBytecode hexutil.Uint64 +} + +func (p *rpcProgress) toSyncProgress() *ethereum.SyncProgress { + if p == nil { + return nil + } + return ðereum.SyncProgress{ + StartingBlock: uint64(p.StartingBlock), + CurrentBlock: uint64(p.CurrentBlock), + HighestBlock: uint64(p.HighestBlock), + PulledStates: uint64(p.PulledStates), + KnownStates: uint64(p.KnownStates), + SyncedAccounts: uint64(p.SyncedAccounts), + SyncedAccountBytes: uint64(p.SyncedAccountBytes), + SyncedBytecodes: uint64(p.SyncedBytecodes), + SyncedBytecodeBytes: uint64(p.SyncedBytecodeBytes), + SyncedStorage: uint64(p.SyncedStorage), + SyncedStorageBytes: uint64(p.SyncedStorageBytes), + HealedTrienodes: uint64(p.HealedTrienodes), + HealedTrienodeBytes: uint64(p.HealedTrienodeBytes), + HealedBytecodes: uint64(p.HealedBytecodes), + HealedBytecodeBytes: uint64(p.HealedBytecodeBytes), + HealingTrienodes: uint64(p.HealingTrienodes), + HealingBytecode: uint64(p.HealingBytecode), + } +} diff --git a/ethclient/ethclient_test.go b/ethclient/ethclient_test.go index a958c1e32a..d56febc91d 100644 --- a/ethclient/ethclient_test.go +++ b/ethclient/ethclient_test.go @@ -187,9 +187,34 @@ var ( testBalance = big.NewInt(2e15) ) +var genesis = &core.Genesis{ + Config: params.AllEthashProtocolChanges, + Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, + ExtraData: []byte("test genesis"), + Timestamp: 9000, + BaseFee: big.NewInt(params.InitialBaseFee), +} + +var testTx1 = types.MustSignNewTx(testKey, types.LatestSigner(genesis.Config), &types.LegacyTx{ + Nonce: 0, + Value: big.NewInt(12), + GasPrice: big.NewInt(params.InitialBaseFee), + Gas: params.TxGas, + To: &common.Address{2}, +}) + +var testTx2 = types.MustSignNewTx(testKey, types.LatestSigner(genesis.Config), &types.LegacyTx{ + Nonce: 1, + Value: big.NewInt(8), + GasPrice: big.NewInt(params.InitialBaseFee), + Gas: params.TxGas, + To: &common.Address{2}, +}) + func newTestBackend(t *testing.T) (*node.Node, []*types.Block) { // Generate test chain. - genesis, blocks := generateTestChain() + blocks := generateTestChain() + // Create node n, err := node.New(&node.Config{}) if err != nil { @@ -212,25 +237,22 @@ func newTestBackend(t *testing.T) (*node.Node, []*types.Block) { return n, blocks } -func generateTestChain() (*core.Genesis, []*types.Block) { +func generateTestChain() []*types.Block { db := rawdb.NewMemoryDatabase() - config := params.AllEthashProtocolChanges - genesis := &core.Genesis{ - Config: config, - Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, - ExtraData: []byte("test genesis"), - Timestamp: 9000, - BaseFee: big.NewInt(params.InitialBaseFee), - } generate := func(i int, g *core.BlockGen) { g.OffsetTime(5) g.SetExtra([]byte("test")) + if i == 1 { + // Test transactions are included in block #2. + g.AddTx(testTx1) + g.AddTx(testTx2) + } } gblock := genesis.ToBlock(db) engine := ethash.NewFaker() - blocks, _ := core.GenerateChain(config, gblock, engine, db, 1, generate) + blocks, _ := core.GenerateChain(genesis.Config, gblock, engine, db, 2, generate) blocks = append([]*types.Block{gblock}, blocks...) - return genesis, blocks + return blocks } func TestEthClient(t *testing.T) { @@ -242,30 +264,33 @@ func TestEthClient(t *testing.T) { tests := map[string]struct { test func(t *testing.T) }{ - "TestHeader": { + "Header": { func(t *testing.T) { testHeader(t, chain, client) }, }, - "TestBalanceAt": { + "BalanceAt": { func(t *testing.T) { testBalanceAt(t, client) }, }, - "TestTxInBlockInterrupted": { + "TxInBlockInterrupted": { func(t *testing.T) { testTransactionInBlockInterrupted(t, client) }, }, - "TestChainID": { + "ChainID": { func(t *testing.T) { testChainID(t, client) }, }, - "TestGetBlock": { + "GetBlock": { func(t *testing.T) { testGetBlock(t, client) }, }, - "TestStatusFunctions": { + "StatusFunctions": { func(t *testing.T) { testStatusFunctions(t, client) }, }, - "TestCallContract": { + "CallContract": { func(t *testing.T) { testCallContract(t, client) }, }, - "TestAtFunctions": { + "AtFunctions": { func(t *testing.T) { testAtFunctions(t, client) }, }, + "TransactionSender": { + func(t *testing.T) { testTransactionSender(t, client) }, + }, } t.Parallel() @@ -321,6 +346,11 @@ func testBalanceAt(t *testing.T, client *rpc.Client) { want *big.Int wantErr error }{ + "valid_account_genesis": { + account: testAddr, + block: big.NewInt(0), + want: testBalance, + }, "valid_account": { account: testAddr, block: big.NewInt(1), @@ -358,23 +388,25 @@ func testBalanceAt(t *testing.T, client *rpc.Client) { func testTransactionInBlockInterrupted(t *testing.T, client *rpc.Client) { ec := NewClient(client) - // Get current block by number + // Get current block by number. block, err := ec.BlockByNumber(context.Background(), nil) if err != nil { t.Fatalf("unexpected error: %v", err) } - // Test tx in block interupted + + // Test tx in block interupted. ctx, cancel := context.WithCancel(context.Background()) cancel() - tx, err := ec.TransactionInBlock(ctx, block.Hash(), 1) + tx, err := ec.TransactionInBlock(ctx, block.Hash(), 0) if tx != nil { t.Fatal("transaction should be nil") } if err == nil || err == ethereum.NotFound { t.Fatal("error should not be nil/notfound") } - // Test tx in block not found - if _, err := ec.TransactionInBlock(context.Background(), block.Hash(), 1); err != ethereum.NotFound { + + // Test tx in block not found. + if _, err := ec.TransactionInBlock(context.Background(), block.Hash(), 20); err != ethereum.NotFound { t.Fatal("error should be ethereum.NotFound") } } @@ -392,12 +424,13 @@ func testChainID(t *testing.T, client *rpc.Client) { func testGetBlock(t *testing.T, client *rpc.Client) { ec := NewClient(client) + // Get current block number blockNumber, err := ec.BlockNumber(context.Background()) if err != nil { t.Fatalf("unexpected error: %v", err) } - if blockNumber != 1 { + if blockNumber != 2 { t.Fatalf("BlockNumber returned wrong number: %d", blockNumber) } // Get current block by number @@ -445,6 +478,7 @@ func testStatusFunctions(t *testing.T, client *rpc.Client) { if progress != nil { t.Fatalf("unexpected progress: %v", progress) } + // NetworkID networkID, err := ec.NetworkID(context.Background()) if err != nil { @@ -453,20 +487,22 @@ func testStatusFunctions(t *testing.T, client *rpc.Client) { if networkID.Cmp(big.NewInt(0)) != 0 { t.Fatalf("unexpected networkID: %v", networkID) } - // SuggestGasPrice (should suggest 1 Gwei) + + // SuggestGasPrice gasPrice, err := ec.SuggestGasPrice(context.Background()) if err != nil { t.Fatalf("unexpected error: %v", err) } - if gasPrice.Cmp(big.NewInt(1875000000)) != 0 { // 1 gwei tip + 0.875 basefee after a 1 gwei fee empty block + if gasPrice.Cmp(big.NewInt(1000000000)) != 0 { t.Fatalf("unexpected gas price: %v", gasPrice) } - // SuggestGasTipCap (should suggest 1 Gwei) + + // SuggestGasTipCap gasTipCap, err := ec.SuggestGasTipCap(context.Background()) if err != nil { t.Fatalf("unexpected error: %v", err) } - if gasTipCap.Cmp(big.NewInt(1000000000)) != 0 { + if gasTipCap.Cmp(big.NewInt(234375000)) != 0 { t.Fatalf("unexpected gas tip cap: %v", gasTipCap) } } @@ -500,9 +536,11 @@ func testCallContract(t *testing.T, client *rpc.Client) { func testAtFunctions(t *testing.T, client *rpc.Client) { ec := NewClient(client) + // send a transaction for some interesting pending status sendTransaction(ec) time.Sleep(100 * time.Millisecond) + // Check pending transaction count pending, err := ec.PendingTransactionCount(context.Background()) if err != nil { @@ -561,23 +599,66 @@ func testAtFunctions(t *testing.T, client *rpc.Client) { } } +func testTransactionSender(t *testing.T, client *rpc.Client) { + ec := NewClient(client) + ctx := context.Background() + + // Retrieve testTx1 via RPC. + block2, err := ec.HeaderByNumber(ctx, big.NewInt(2)) + if err != nil { + t.Fatal("can't get block 1:", err) + } + tx1, err := ec.TransactionInBlock(ctx, block2.Hash(), 0) + if err != nil { + t.Fatal("can't get tx:", err) + } + if tx1.Hash() != testTx1.Hash() { + t.Fatalf("wrong tx hash %v, want %v", tx1.Hash(), testTx1.Hash()) + } + + // The sender address is cached in tx1, so no additional RPC should be required in + // TransactionSender. Ensure the server is not asked by canceling the context here. + canceledCtx, cancel := context.WithCancel(context.Background()) + cancel() + sender1, err := ec.TransactionSender(canceledCtx, tx1, block2.Hash(), 0) + if err != nil { + t.Fatal(err) + } + if sender1 != testAddr { + t.Fatal("wrong sender:", sender1) + } + + // Now try to get the sender of testTx2, which was not fetched through RPC. + // TransactionSender should query the server here. + sender2, err := ec.TransactionSender(ctx, testTx2, block2.Hash(), 1) + if err != nil { + t.Fatal(err) + } + if sender2 != testAddr { + t.Fatal("wrong sender:", sender2) + } +} + func sendTransaction(ec *Client) error { - // Retrieve chainID chainID, err := ec.ChainID(context.Background()) if err != nil { return err } - // Create transaction - tx := types.NewTransaction(0, common.Address{1}, big.NewInt(1), 22000, big.NewInt(params.InitialBaseFee), nil) - signer := types.LatestSignerForChainID(chainID) - signature, err := crypto.Sign(signer.Hash(tx).Bytes(), testKey) + nonce, err := ec.PendingNonceAt(context.Background(), testAddr) if err != nil { return err } - signedTx, err := tx.WithSignature(signer, signature) + + signer := types.LatestSignerForChainID(chainID) + tx, err := types.SignNewTx(testKey, signer, &types.LegacyTx{ + Nonce: nonce, + To: &common.Address{2}, + Value: big.NewInt(1), + Gas: 22000, + GasPrice: big.NewInt(params.InitialBaseFee), + }) if err != nil { return err } - // Send transaction - return ec.SendTransaction(context.Background(), signedTx) + return ec.SendTransaction(context.Background(), tx) } diff --git a/ethclient/signer.go b/ethclient/signer.go index 9de020b352..f827d4eb56 100644 --- a/ethclient/signer.go +++ b/ethclient/signer.go @@ -45,7 +45,7 @@ func (s *senderFromServer) Equal(other types.Signer) bool { } func (s *senderFromServer) Sender(tx *types.Transaction) (common.Address, error) { - if s.blockhash == (common.Hash{}) { + if s.addr == (common.Address{}) { return common.Address{}, errNotCached } return s.addr, nil diff --git a/ethdb/database.go b/ethdb/database.go index 3c6500d1dc..0a5729c6c1 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -76,12 +76,12 @@ type AncientReader interface { // Ancient retrieves an ancient binary blob from the append-only immutable files. Ancient(kind string, number uint64) ([]byte, error) - // ReadAncients retrieves multiple items in sequence, starting from the index 'start'. + // AncientRange retrieves multiple items in sequence, starting from the index 'start'. // It will return // - at most 'count' items, // - at least 1 item (even if exceeding the maxBytes), but will otherwise // return as many items as fit into maxBytes. - ReadAncients(kind string, start, count, maxBytes uint64) ([][]byte, error) + AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) // Ancients returns the ancient item numbers in the ancient store. Ancients() (uint64, error) @@ -90,6 +90,15 @@ type AncientReader interface { AncientSize(kind string) (uint64, error) } +// AncientBatchReader is the interface for 'batched' or 'atomic' reading. +type AncientBatchReader interface { + AncientReader + + // ReadAncients runs the given read operation while ensuring that no writes take place + // on the underlying freezer. + ReadAncients(fn func(AncientReader) error) (err error) +} + // AncientWriter contains the methods required to write to immutable ancient data. type AncientWriter interface { // ModifyAncients runs a write operation on the ancient store. @@ -117,7 +126,7 @@ type AncientWriteOp interface { // immutable ancient data. type Reader interface { KeyValueReader - AncientReader + AncientBatchReader } // Writer contains the methods required to write data to both key-value as well as @@ -130,7 +139,7 @@ type Writer interface { // AncientStore contains all the methods required to allow handling different // ancient data stores backing immutable chain data store. type AncientStore interface { - AncientReader + AncientBatchReader AncientWriter io.Closer } diff --git a/ethdb/leveldb/leveldb.go b/ethdb/leveldb/leveldb.go index 9ff1a2ce1d..9a782dedbe 100644 --- a/ethdb/leveldb/leveldb.go +++ b/ethdb/leveldb/leveldb.go @@ -455,7 +455,7 @@ type batch struct { // Put inserts the given value into the batch for later committing. func (b *batch) Put(key, value []byte) error { b.b.Put(key, value) - b.size += len(value) + b.size += len(key) + len(value) return nil } diff --git a/ethdb/memorydb/memorydb.go b/ethdb/memorydb/memorydb.go index fedc9e326c..78181e860c 100644 --- a/ethdb/memorydb/memorydb.go +++ b/ethdb/memorydb/memorydb.go @@ -204,7 +204,7 @@ type batch struct { // Put inserts the given value into the batch for later committing. func (b *batch) Put(key, value []byte) error { b.writes = append(b.writes, keyvalue{common.CopyBytes(key), common.CopyBytes(value), false}) - b.size += len(value) + b.size += len(key) + len(value) return nil } diff --git a/graphql/graphql.go b/graphql/graphql.go index af6b7dc317..16e0eb654d 100644 --- a/graphql/graphql.go +++ b/graphql/graphql.go @@ -372,6 +372,9 @@ func (t *Transaction) Status(ctx context.Context) (*Long, error) { if err != nil || receipt == nil { return nil, err } + if len(receipt.PostState) != 0 { + return nil, nil + } ret := Long(receipt.Status) return &ret, nil } @@ -596,21 +599,18 @@ func (b *Block) BaseFeePerGas(ctx context.Context) (*hexutil.Big, error) { } func (b *Block) Parent(ctx context.Context) (*Block, error) { - // If the block header hasn't been fetched, and we'll need it, fetch it. - if b.numberOrHash == nil && b.header == nil { - if _, err := b.resolveHeader(ctx); err != nil { - return nil, err - } + if _, err := b.resolveHeader(ctx); err != nil { + return nil, err } - if b.header != nil && b.header.Number.Uint64() > 0 { - num := rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(b.header.Number.Uint64() - 1)) - return &Block{ - backend: b.backend, - numberOrHash: &num, - hash: b.header.ParentHash, - }, nil + if b.header == nil || b.header.Number.Uint64() < 1 { + return nil, nil } - return nil, nil + num := rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(b.header.Number.Uint64() - 1)) + return &Block{ + backend: b.backend, + numberOrHash: &num, + hash: b.header.ParentHash, + }, nil } func (b *Block) Difficulty(ctx context.Context) (hexutil.Big, error) { @@ -1110,10 +1110,21 @@ func (r *Resolver) Blocks(ctx context.Context, args struct { ret := make([]*Block, 0, to-from+1) for i := from; i <= to; i++ { numberOrHash := rpc.BlockNumberOrHashWithNumber(i) - ret = append(ret, &Block{ + block := &Block{ backend: r.backend, numberOrHash: &numberOrHash, - }) + } + // Resolve the header to check for existence. + // Note we don't resolve block directly here since it will require an + // additional network request for light client. + h, err := block.resolveHeader(ctx) + if err != nil { + return nil, err + } else if h == nil { + // Blocks after must be non-existent too, break. + break + } + ret = append(ret, block) } return ret, nil } @@ -1220,32 +1231,66 @@ type SyncState struct { func (s *SyncState) StartingBlock() hexutil.Uint64 { return hexutil.Uint64(s.progress.StartingBlock) } - func (s *SyncState) CurrentBlock() hexutil.Uint64 { return hexutil.Uint64(s.progress.CurrentBlock) } - func (s *SyncState) HighestBlock() hexutil.Uint64 { return hexutil.Uint64(s.progress.HighestBlock) } - -func (s *SyncState) PulledStates() *hexutil.Uint64 { - ret := hexutil.Uint64(s.progress.PulledStates) - return &ret +func (s *SyncState) SyncedAccounts() hexutil.Uint64 { + return hexutil.Uint64(s.progress.SyncedAccounts) } - -func (s *SyncState) KnownStates() *hexutil.Uint64 { - ret := hexutil.Uint64(s.progress.KnownStates) - return &ret +func (s *SyncState) SyncedAccountBytes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.SyncedAccountBytes) +} +func (s *SyncState) SyncedBytecodes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.SyncedBytecodes) +} +func (s *SyncState) SyncedBytecodeBytes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.SyncedBytecodeBytes) +} +func (s *SyncState) SyncedStorage() hexutil.Uint64 { + return hexutil.Uint64(s.progress.SyncedStorage) +} +func (s *SyncState) SyncedStorageBytes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.SyncedStorageBytes) +} +func (s *SyncState) HealedTrienodes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.HealedTrienodes) +} +func (s *SyncState) HealedTrienodeBytes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.HealedTrienodeBytes) +} +func (s *SyncState) HealedBytecodes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.HealedBytecodes) +} +func (s *SyncState) HealedBytecodeBytes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.HealedBytecodeBytes) +} +func (s *SyncState) HealingTrienodes() hexutil.Uint64 { + return hexutil.Uint64(s.progress.HealingTrienodes) +} +func (s *SyncState) HealingBytecode() hexutil.Uint64 { + return hexutil.Uint64(s.progress.HealingBytecode) } // Syncing returns false in case the node is currently not syncing with the network. It can be up to date or has not // yet received the latest block headers from its pears. In case it is synchronizing: -// - startingBlock: block number this node started to synchronise from -// - currentBlock: block number this node is currently importing -// - highestBlock: block number of the highest block header this node has received from peers -// - pulledStates: number of state entries processed until now -// - knownStates: number of known state entries that still need to be pulled +// - startingBlock: block number this node started to synchronise from +// - currentBlock: block number this node is currently importing +// - highestBlock: block number of the highest block header this node has received from peers +// - syncedAccounts: number of accounts downloaded +// - syncedAccountBytes: number of account trie bytes persisted to disk +// - syncedBytecodes: number of bytecodes downloaded +// - syncedBytecodeBytes: number of bytecode bytes downloaded +// - syncedStorage: number of storage slots downloaded +// - syncedStorageBytes: number of storage trie bytes persisted to disk +// - healedTrienodes: number of state trie nodes downloaded +// - healedTrienodeBytes: number of state trie bytes persisted to disk +// - healedBytecodes: number of bytecodes downloaded +// - healedBytecodeBytes: number of bytecodes persisted to disk +// - healingTrienodes: number of state trie nodes pending +// - healingBytecode: number of bytecodes pending func (r *Resolver) Syncing() (*SyncState, error) { progress := r.backend.SyncProgress() diff --git a/graphql/schema.go b/graphql/schema.go index dfd094a420..86060cd238 100644 --- a/graphql/schema.go +++ b/graphql/schema.go @@ -297,12 +297,6 @@ const schema string = ` currentBlock: Long! # HighestBlock is the latest known block number. highestBlock: Long! - # PulledStates is the number of state entries fetched so far, or null - # if this is not known or not relevant. - pulledStates: Long - # KnownStates is the number of states the node knows of so far, or null - # if this is not known or not relevant. - knownStates: Long } # Pending represents the current pending state. diff --git a/interfaces.go b/interfaces.go index 87c5ca0b7d..94a2492ae1 100644 --- a/interfaces.go +++ b/interfaces.go @@ -101,8 +101,27 @@ type SyncProgress struct { StartingBlock uint64 // Block number where sync began CurrentBlock uint64 // Current block number where sync is at HighestBlock uint64 // Highest alleged block number in the chain - PulledStates uint64 // Number of state trie entries already downloaded - KnownStates uint64 // Total number of state trie entries known about + + // "fast sync" fields. These used to be sent by geth, but are no longer used + // since version v1.10. + PulledStates uint64 // Number of state trie entries already downloaded + KnownStates uint64 // Total number of state trie entries known about + + // "snap sync" fields. + SyncedAccounts uint64 // Number of accounts downloaded + SyncedAccountBytes uint64 // Number of account trie bytes persisted to disk + SyncedBytecodes uint64 // Number of bytecodes downloaded + SyncedBytecodeBytes uint64 // Number of bytecode bytes downloaded + SyncedStorage uint64 // Number of storage slots downloaded + SyncedStorageBytes uint64 // Number of storage trie bytes persisted to disk + + HealedTrienodes uint64 // Number of state trie nodes downloaded + HealedTrienodeBytes uint64 // Number of state trie bytes persisted to disk + HealedBytecodes uint64 // Number of bytecodes downloaded + HealedBytecodeBytes uint64 // Number of bytecodes persisted to disk + + HealingTrienodes uint64 // Number of state trie nodes pending + HealingBytecode uint64 // Number of bytecodes pending } // ChainSyncReader wraps access to the node's current sync status. If there's no diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 999e2256cc..c50fcd7741 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -41,6 +41,7 @@ import ( "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/eth/tracers/logger" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" @@ -131,11 +132,21 @@ func (s *PublicEthereumAPI) Syncing() (interface{}, error) { } // Otherwise gather the block sync stats return map[string]interface{}{ - "startingBlock": hexutil.Uint64(progress.StartingBlock), - "currentBlock": hexutil.Uint64(progress.CurrentBlock), - "highestBlock": hexutil.Uint64(progress.HighestBlock), - "pulledStates": hexutil.Uint64(progress.PulledStates), - "knownStates": hexutil.Uint64(progress.KnownStates), + "startingBlock": hexutil.Uint64(progress.StartingBlock), + "currentBlock": hexutil.Uint64(progress.CurrentBlock), + "highestBlock": hexutil.Uint64(progress.HighestBlock), + "syncedAccounts": hexutil.Uint64(progress.SyncedAccounts), + "syncedAccountBytes": hexutil.Uint64(progress.SyncedAccountBytes), + "syncedBytecodes": hexutil.Uint64(progress.SyncedBytecodes), + "syncedBytecodeBytes": hexutil.Uint64(progress.SyncedBytecodeBytes), + "syncedStorage": hexutil.Uint64(progress.SyncedStorage), + "syncedStorageBytes": hexutil.Uint64(progress.SyncedStorageBytes), + "healedTrienodes": hexutil.Uint64(progress.HealedTrienodes), + "healedTrienodeBytes": hexutil.Uint64(progress.HealedTrienodeBytes), + "healedBytecodes": hexutil.Uint64(progress.HealedBytecodes), + "healedBytecodeBytes": hexutil.Uint64(progress.HealedBytecodeBytes), + "healingTrienodes": hexutil.Uint64(progress.HealingTrienodes), + "healingBytecode": hexutil.Uint64(progress.HealingBytecode), }, nil } @@ -1226,7 +1237,7 @@ type StructLogRes struct { } // FormatLogs formats EVM returned structured logs for json output -func FormatLogs(logs []vm.StructLog) []StructLogRes { +func FormatLogs(logs []logger.StructLog) []StructLogRes { formatted := make([]StructLogRes, len(logs)) for index, trace := range logs { formatted[index] = StructLogRes{ @@ -1422,10 +1433,12 @@ func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber // newRPCPendingTransaction returns a pending transaction that will serialize to the RPC representation func newRPCPendingTransaction(tx *types.Transaction, current *types.Header, config *params.ChainConfig) *RPCTransaction { var baseFee *big.Int + blockNumber := uint64(0) if current != nil { baseFee = misc.CalcBaseFee(config, current) + blockNumber = current.Number.Uint64() } - return newRPCTransaction(tx, common.Hash{}, 0, 0, baseFee, config) + return newRPCTransaction(tx, common.Hash{}, blockNumber, 0, baseFee, config) } // newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation. @@ -1511,9 +1524,9 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH precompiles := vm.ActivePrecompiles(b.ChainConfig().Rules(header.Number)) // Create an initial tracer - prevTracer := vm.NewAccessListTracer(nil, args.from(), to, precompiles) + prevTracer := logger.NewAccessListTracer(nil, args.from(), to, precompiles) if args.AccessList != nil { - prevTracer = vm.NewAccessListTracer(*args.AccessList, args.from(), to, precompiles) + prevTracer = logger.NewAccessListTracer(*args.AccessList, args.from(), to, precompiles) } for { // Retrieve the current access list to expand @@ -1539,7 +1552,7 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH } // Apply the transaction with the access list tracer - tracer := vm.NewAccessListTracer(accessList, args.from(), to, precompiles) + tracer := logger.NewAccessListTracer(accessList, args.from(), to, precompiles) config := vm.Config{Tracer: tracer, Debug: true, NoBaseFee: true} vmenv, _, err := b.GetEVM(ctx, msg, statedb, header, &config) if err != nil { diff --git a/internal/jsre/deps/bindata.go b/internal/jsre/deps/bindata.go index 6f079c2ba5..3e7d3a1367 100644 --- a/internal/jsre/deps/bindata.go +++ b/internal/jsre/deps/bindata.go @@ -1,7 +1,7 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: // bignumber.js (17.273kB) -// web3.js (401.764kB) +// web3.js (402.466kB) package deps @@ -90,7 +90,7 @@ func bignumberJs() (*asset, error) { return a, nil } -var _web3Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x7b\x13\x39\xd2\x38\x0e\xbf\xcf\xa7\x50\xfc\xdc\x0f\xb6\x89\xb1\x73\x60\x18\xc6\x99\x0c\x1b\x02\x33\x64\x6f\x20\x5c\x40\x76\x76\xef\x6c\x96\xab\xed\x96\xed\x1e\xda\xdd\xfe\x75\xb7\x73\x18\x92\xef\xfe\xbf\x54\x3a\x95\x0e\x7d\x70\x12\xe6\xb4\xc9\x0b\x70\x4b\xa5\x53\xa9\x54\x2a\x95\x4a\x55\x19\xfd\x7f\xcb\x28\xa3\x7b\x9d\xc9\x32\x19\x17\x51\x9a\x10\xda\x29\x7a\x49\x2f\xeb\x7e\x51\x29\x79\x27\xed\x2d\xbb\x5f\xa2\x49\x67\x3d\x39\x49\x4f\xf9\xaf\x02\x7e\x9d\x05\x19\x09\xf6\x8a\xcb\x05\x4d\x27\x44\xd6\xb5\xd7\x92\x45\x5b\x0f\x1e\x88\xc4\x5d\x56\x66\xf9\xe0\x41\xd0\xcd\x68\xb1\xcc\x12\x12\x74\xd2\xde\xfa\x66\x97\xa5\x47\x32\x2d\x12\x69\xac\xd6\xc9\x5e\x42\xcf\xc9\xcb\x2c\x4b\xb3\x4e\xeb\x20\x48\x92\xb4\x20\x93\x28\x09\xc9\x3c\x0d\x97\x31\x25\xed\xd6\x46\xba\xd1\x6a\xb7\xba\xbb\xc5\x2c\x4b\xcf\xc9\xa4\x3f\x4e\x43\xba\xd7\x7a\x73\xf4\xe2\xf8\xf5\xcb\x4f\x6f\x8f\x3e\x7e\xfa\xf1\xe8\xf8\xed\x8b\x56\x6f\x72\xcd\xea\x8b\xf7\x58\xdf\xf7\xbe\xd0\x8b\x45\x9a\x15\xf9\xf0\xcb\xf5\xf5\x2e\x1b\xc3\xc9\xe6\x69\x7f\x1c\xc4\x71\x27\xee\x8b\xac\x9e\xec\x7d\x87\xf2\x01\x26\x7b\x00\xb8\x75\x7a\x42\x4f\x77\x45\x57\xf3\x4e\xf2\x2c\x19\xd2\xee\x75\x2f\xee\xe9\x92\xb4\xc7\x71\x77\x2d\xa0\x58\x93\x32\x13\x7a\x11\x35\xc2\xd5\x24\xcd\x3a\x0c\x3a\xdd\xdb\xdc\x4d\xbf\xcf\xfa\x31\x4d\xa6\xc5\x6c\x37\xdd\xd8\xe8\xe6\x9d\x8c\x21\x5e\x75\xe3\xba\xdb\xf9\xb2\x35\x3c\x51\x5d\x16\x55\xf4\x38\x96\x7a\xa2\xed\xee\x97\x35\x9e\x20\x3b\xb3\x77\xb2\x46\xc8\x97\x35\x42\x08\x69\x8d\xd3\x24\x2f\x82\xa4\x68\x0d\x49\x91\x2d\x69\x8f\xa7\x46\xc9\x62\x59\xe4\xad\x21\x39\x81\x6f\x09\x0d\x79\x49\x30\xa7\xad\x21\x69\x7d\x4a\xcf\x13\x9a\xb5\x7a\x3a\x87\x8d\x8e\xe5\x04\x61\x98\xd1\x3c\x6f\x89\x9c\x6b\xf8\xff\x54\x54\x2d\x8b\xc3\xff\x22\x2d\x5d\x16\xf5\xed\xa5\x9f\x50\x11\xa3\xbd\xd1\x65\x41\xf3\x9d\x6d\x7f\x7b\x12\x48\x61\x7a\x8d\x90\xeb\xde\x9d\x20\xe0\x46\xfd\x51\xc3\x41\xd8\x6b\x86\x80\x95\x51\xfd\x47\x1d\xfa\x38\x4d\x0a\x9a\x14\xb7\x1e\xfc\x9f\x72\xde\xd9\x8c\xfd\x61\xa6\x7d\x12\xc4\xf9\x6f\x37\xf4\x8c\xe6\x34\x3b\xf3\xad\xfa\x3f\xfa\xa4\xe5\xcb\xd1\x7b\x3a\x8d\xf2\x22\x0b\xfe\x0b\x26\xaf\x57\x55\x07\x3d\x3f\xba\x15\xdf\x2f\xb2\x20\xc9\x27\x5e\xd6\xf7\x67\xc1\x41\x66\x91\xc2\xea\x48\xc8\x69\xf1\xa1\x9a\xa4\xee\x0c\x17\x76\xd3\xbf\x49\xa3\x5f\x79\x02\x82\x26\x88\xaf\xaa\x60\x91\x45\xf3\x20\xbb\xf4\xf6\x23\x4d\xe3\xda\xc9\xdb\x17\x6d\xfd\x79\x51\x68\xee\xc1\x95\xd5\x94\x21\xe1\xa0\x74\x1b\xff\x23\x21\xc1\xdb\xfb\x30\xca\xd3\xf3\xe4\x16\x3d\x0f\x92\x34\xb9\x9c\xa7\xcb\x7c\x85\xae\x47\x49\x48\x2f\x68\x68\xec\x5d\x77\x36\xb1\xba\x72\xd4\x1d\xb3\xf6\xf3\x28\xb9\x0d\xe3\xde\x5f\x02\x26\x5e\x26\x21\x0d\x5b\x16\x9a\xe8\x19\x23\x84\xbf\x00\x8e\x46\x51\x18\x36\xc3\xd1\xcd\xea\x3f\x0b\xe2\xa5\xb7\xfb\xcb\x28\x29\xb6\xbf\x79\x52\x3d\x05\x6f\xe9\xf9\xf3\xe8\x77\x44\xfe\xad\xd6\xdc\xc1\x2c\x48\xa6\xbf\x27\xe9\xdc\x09\xe5\x94\xd4\x8d\xa4\xfa\x4a\xaa\xf1\x62\xe6\x1d\xdf\x8d\x6a\x11\xb4\x76\xba\xb6\x76\xdd\xfb\x72\x7d\xda\xdb\xfe\xdd\x0e\xfd\x7f\xa1\x33\xef\xef\x24\x3b\x4e\x96\x49\x78\x63\x52\xb9\xf5\xc6\x75\x7f\xec\xfd\x73\x1f\x7b\xef\x0f\x7d\x7f\xe4\x33\x87\x77\xf0\xe2\xbc\xf0\x47\x93\x36\xbf\xee\x66\xae\xf7\xaa\x9d\x3b\xdb\xab\x56\x9d\xf7\x49\x96\xce\x6f\x39\xed\x45\x7a\xcb\xa3\xe6\xed\x04\xbe\xdf\x77\xdd\xfc\x11\xf0\x17\x25\x61\x94\xd1\x71\x71\xe8\xdd\x33\x57\xe8\xc9\xed\x26\x22\x1a\x07\x8b\x8f\xbf\xeb\x64\xf8\x31\xd9\xec\xb4\x4b\x17\x69\x1e\x55\x1d\xd4\x17\xc1\x65\x30\x8a\xa9\x29\x14\xfc\x2e\x5c\xa9\x8c\xe6\xee\xe4\xf8\x75\x3b\x1a\xd8\x97\xe3\x7d\x61\xe2\xf3\xb7\x3f\xc9\xdc\x09\x92\x4a\xea\x6e\x46\x67\xbf\x03\xfa\xff\xb0\x58\xbf\x8b\xf3\xe3\x8d\xf9\xe4\xd7\xc6\xba\xcd\xf4\xee\xd1\xde\x10\xed\xb7\xde\xb8\xbe\xf6\xcc\x1e\x7a\xb6\xb4\x2a\x39\xee\x71\x13\x39\x0e\x8c\x37\xc8\x9e\xb4\x70\xe8\xb4\xfb\x83\x49\x9a\xcd\x83\xa2\xa0\x59\xde\xee\xee\x02\xc0\x87\x34\x8e\xc2\xa8\xb8\xfc\x78\xb9\xa0\x26\x2c\x6b\x9f\x41\xad\x0d\x1e\x3e\x5c\x23\x0f\x0d\x48\xa1\x73\x27\x51\x4e\x02\xb2\xc8\xd2\x94\x01\x93\x62\x16\x14\x24\xa3\x0b\x76\xc8\x4a\x8a\x9c\x88\xb9\x23\x2c\x93\xd5\x70\x58\x90\x79\x50\x8c\x67\x34\x1f\xb2\x4f\x91\x8d\x7e\x9e\x9c\xe2\x8f\xc7\xc6\xd7\xa9\x99\xb9\x63\x7d\x9f\x9e\x3c\x39\x3d\x39\xed\x91\x7e\xbf\xbf\x46\x1e\x0e\x9c\xb1\xc9\x1e\xef\x11\x65\x4d\xd3\xe9\x8a\x29\x2e\x66\x51\xde\xff\x04\x0b\xe3\x47\x89\x20\x06\xd8\xe7\xe8\x3a\x64\x19\x87\x49\xb1\x8b\x80\xf9\xbe\xed\x83\x3e\x82\x1c\xd1\xdc\xee\xda\xf5\xee\xda\x9a\xa7\x1f\xfd\x45\x96\x16\x1c\x6b\x7b\x24\xa1\xe7\x46\x5f\x3b\x5f\xae\xbb\xbb\xd5\xa5\xfa\x20\xbd\x64\xcb\x71\x91\xb2\xc6\x3d\xb0\x75\xed\xf6\xa3\x5c\xcc\xb9\x46\x08\x23\x47\x89\x14\x61\xd7\xb2\xbe\xce\x12\xfb\x30\x6f\x9d\x81\xc0\x76\xe7\xdf\x27\x9d\x93\xcd\x47\xdf\x9d\x3e\xec\xfe\xfb\xb4\xfb\x6c\xd0\xe5\xe3\x34\x0f\x0e\xa5\xdd\xba\xee\x7d\x69\x61\x52\x6c\x0d\xbf\xeb\xb5\x38\xbd\xb5\x86\x5b\x8f\xaf\x4f\x7b\xdf\xfc\xce\xe4\xfd\x3c\x4d\xe3\x1a\xda\x1e\x31\x90\x12\xc2\x66\x79\xf2\x7f\x4e\xa5\xf0\xeb\xb1\xfe\x79\x8a\x92\x77\xf0\x47\x1d\x19\x43\xcf\x6e\x4a\xc3\xac\xf0\x2a\x44\xcc\xe1\x6d\x0a\x66\xa9\x2b\x92\xaf\x59\xa4\x82\x76\x79\x8b\x55\x65\x6f\x42\xb5\xff\x61\xa8\x35\x69\xf6\xe1\xff\x34\x22\x5a\xd1\x9f\x7a\x8a\x7d\xf2\x7b\x53\x2c\xdb\xc3\x14\xc9\x16\x7e\x9a\x2d\x66\x94\xc0\x66\x07\x84\xdb\xf7\x51\x2e\xcb\x55\x3f\x04\x5d\xc2\xcf\xc7\xe8\xf7\x29\xce\xd8\x31\xbe\x4c\xfa\x25\x62\x6b\x55\x3f\x9f\x1a\xf5\x88\xa2\x1e\x2a\x87\x4e\xde\x98\xcc\x59\xe9\x95\xe8\x9c\x17\x70\x08\x9d\x25\xaf\x4a\xe9\x66\x99\x2a\x52\xe7\x8d\x56\x96\xbe\x19\xb1\xb3\x4a\x38\xa9\x7f\xd9\xea\x5d\x77\x6f\x46\xf8\xa2\x77\xf5\x94\xff\x6d\x13\xca\x1f\x3c\x84\x0e\x7f\x9c\x45\x39\x99\x44\x31\x65\x94\xba\x08\xb2\x82\xa4\x13\x72\x4e\x47\x3b\xfd\x5f\xf2\xfe\x1a\x80\x88\x2f\x06\x30\xc9\x28\x25\x79\x3a\x29\xce\x83\x8c\x0e\xc9\x65\xba\x24\xe3\x20\x21\x19\x0d\xa3\xbc\xc8\xa2\xd1\xb2\xa0\x24\x2a\x48\x90\x84\x83\x34\x23\xf3\x34\x8c\x26\x97\x50\x47\x54\x90\x65\x12\xd2\x0c\x08\xbe\xa0\xd9\x3c\x67\xed\xb0\x8f\x9f\xde\x1e\x93\xd7\x34\xcf\x69\x46\x7e\xa2\x09\xcd\x82\x98\xbc\x5b\x8e\xe2\x68\x4c\x5e\x47\x63\x9a\xe4\x94\x04\x39\x59\xb0\x94\x7c\x46\x43\x32\xba\x14\x54\x44\xc9\x8f\xac\x33\x1f\x44\x67\xc8\x8f\xe9\x32\x09\x03\x36\xe6\x1e\xa1\x51\x31\xa3\x19\x39\xa3\x59\xce\x66\x68\x47\xb6\x25\x6a\xec\x91\x34\x83\x5a\x3a\x41\xc1\xc6\x90\x91\x74\xc1\x0a\x76\x49\x90\x5c\x92\x38\x28\x74\x59\x17\x05\x7a\xa4\x21\x89\x12\xa8\x76\x96\xca\x95\x1d\x15\xe4\x3c\x8a\x63\x32\xa2\x64\x99\xd3\xc9\x32\xe6\x82\xe3\x68\x59\x90\x9f\x0f\x3f\xbe\x3a\x3a\xfe\x48\xf6\xdf\xfe\x8b\xfc\xbc\xff\xfe\xfd\xfe\xdb\x8f\xff\xda\x25\xe7\x51\x31\x4b\x97\x05\x61\x12\x25\xd4\x15\xcd\x17\x71\x44\x43\x72\x1e\x64\x59\x90\x14\x97\x24\x9d\x40\x15\x6f\x5e\xbe\x3f\x78\xb5\xff\xf6\xe3\xfe\xf3\xc3\xd7\x87\x1f\xff\x45\xd2\x8c\xfc\x78\xf8\xf1\xed\xcb\x0f\x1f\xc8\x8f\x47\xef\xc9\x3e\x79\xb7\xff\xfe\xe3\xe1\xc1\xf1\xeb\xfd\xf7\xe4\xdd\xf1\xfb\x77\x47\x1f\x5e\xf6\x09\xf9\x40\x59\xc7\x28\xd4\x50\x8f\xe8\x09\xcc\x59\x46\x49\x48\x8b\x20\x8a\xe5\xfc\xff\x2b\x5d\x92\x7c\x96\x2e\xe3\x90\xcc\x82\x33\x4a\x32\x3a\xa6\xd1\x19\x0d\x49\x40\xc6\xe9\xe2\xb2\xf1\x44\x42\x65\x41\x9c\x26\x53\x18\xb6\xa2\x32\x42\x0e\x27\x24\x49\x8b\x1e\xc9\x29\x25\xdf\xcf\x8a\x62\x31\x1c\x0c\xce\xcf\xcf\xfb\xd3\x64\xd9\x4f\xb3\xe9\x20\xe6\x15\xe4\x83\x1f\xfa\x6b\x0f\x07\x92\xd9\xfe\x0d\xc8\x76\x9c\x86\x34\xeb\xff\x02\x2c\xf2\x6f\xc1\xb2\x98\xa5\x19\x79\x13\x64\xf4\x33\xf9\xdf\xb4\xa0\xe7\xd1\xf8\x57\xf2\xfd\x9c\x7d\xff\x8d\x16\xb3\x90\x9e\xf5\xc7\xe9\xfc\x07\x00\x0e\x83\x82\x92\xed\xcd\xad\x6f\x80\xe1\xd5\x6f\x05\x15\x02\x2c\x2a\x23\xe4\x31\xdf\xde\x21\x24\x05\x04\xcc\x76\x41\x1f\xe4\x61\x52\x98\x80\x51\x52\xf8\xe0\x8e\x1d\xc0\x65\x09\xe4\x8b\xcb\x24\x98\x47\x63\xc9\xc6\x51\x89\x90\xe7\x00\x8f\xf2\x95\xfc\x50\x64\x51\x32\x35\xcb\xe4\x90\xe6\x83\x7e\x4f\x03\x6b\x8c\x19\x0d\xbc\x63\x3c\x76\x41\x97\x65\xb0\x9e\x6e\xab\xfe\x02\x70\x94\x8b\x01\x1a\x9c\x39\x47\x55\xf4\x60\x87\x15\x7c\x5a\x5a\x88\xa3\xfc\xbe\xaa\x02\xb6\x11\x0e\x7c\x75\xa5\x4e\x8f\xa4\x04\x7a\x3f\xcb\x82\x4b\x0e\xce\x99\xb8\x25\x0a\x1c\x30\xfa\x44\x12\x80\x58\x49\x9c\x43\x84\xa4\x48\x09\x4d\x18\x0d\x0f\x42\xca\xfe\x53\xad\x30\x66\x1c\x70\x36\xc9\xb8\x92\x90\x6b\xcd\x8d\x99\xd7\x8d\x47\xcc\xc0\x72\x73\x67\x86\x24\xb2\x07\x35\xe4\x46\x17\x81\xf7\xcf\x69\x31\x4b\x43\x4f\xb7\xb8\x72\x3d\xcd\xe6\x84\x4b\x2e\xa9\x31\x23\x6b\x84\xaf\x41\x51\xfc\x93\x98\x19\x91\x45\xfe\x06\xbd\x27\x5f\x38\xf1\x5c\x2b\xb1\xfc\x6f\x1c\xf3\x39\xf9\x82\x2b\xbb\x86\x2c\x78\xab\x90\x93\x2f\xf0\xae\xe1\x9a\x88\xcf\x88\xf1\x06\x2e\x11\x31\x32\x84\xbe\xb0\x9d\x88\xb1\x7b\x40\x88\x81\x0c\xb4\x53\xe3\x2e\x39\x38\x92\x28\x62\xd8\xcc\x4d\xf1\x0e\x61\xad\x3f\x89\xe2\x82\x66\x1d\x54\xb6\x8b\x74\x10\x82\x8a\x0a\x21\x14\x48\x22\x00\x9d\x42\xf7\x64\xf3\x74\x97\xf3\xcf\x68\x42\x3a\xeb\xb8\x11\x5c\x07\x7f\xa0\xc1\x9f\x72\xb4\xa3\xe4\x2c\x88\xa3\x50\xd3\x00\xab\x71\x7d\x48\xda\x64\x83\xe0\xca\xd7\xb0\xac\x81\x6b\x36\x29\xb0\x84\xd2\xc8\x22\x0e\xa2\x84\xd3\x97\x35\x8d\x1c\xe0\x9d\xc8\x29\x9f\x45\x91\x7e\x34\xfa\x85\x8e\x8b\x6b\xab\x42\x39\xc9\xba\x1c\xaf\x36\xb4\xe0\xca\xa7\x0e\x75\xc3\x99\xb9\x1e\x2f\x6f\x09\x5c\x30\x69\xa8\x58\xde\x39\x61\xc0\xa7\x3d\x72\x02\xe0\xa7\xdd\x66\xa8\x89\xa3\x1c\x24\x20\xbe\xf8\xca\xb1\x93\x63\x34\x00\x0b\xe0\xd8\xf1\xa5\x2f\x74\x81\x32\xc4\x38\xcd\x36\xc2\x4d\xee\x2e\x7d\x81\x9d\xbc\x8c\xbe\x73\x49\xe0\x53\x5a\xe0\x15\x98\x0b\xce\x21\x48\x96\x15\x13\x7d\x63\x25\x8c\x1a\xfa\xf3\x60\xd1\x29\xe3\xb1\xa0\x95\xf3\xac\x11\x83\x77\xf2\x9a\x3b\xbc\xa7\x27\x50\xe4\x94\xb3\x67\xf9\xa5\x56\x11\xea\x8f\xd8\xa7\x8e\x26\x93\x9c\x16\x4e\xa7\x32\x1a\x2e\xc7\x14\xf5\x2b\x18\x8f\x7b\xa4\xa6\x73\x80\x9d\x22\x28\xa2\xf1\xbb\x20\x2b\x5e\xc3\x4b\x22\xab\xe6\xbe\x9d\xdf\xf1\xf4\x53\xd6\x95\x31\xa6\x44\xc3\x0f\x6e\x95\x6f\x82\x62\xd6\x9f\xc4\x69\x9a\x75\x3a\x4e\x8b\x1b\x64\x67\xab\x4b\x06\x64\x67\xbb\x4b\x1e\x92\x9d\x6d\x31\x68\x84\xbe\x60\x3c\x26\x1b\xa4\xa3\x36\x1d\x03\xeb\x25\x28\x24\xcf\xd0\xde\x45\xc8\xce\x36\x19\x1a\x09\x25\x9d\x95\xa8\xef\x91\x4d\x8c\xfd\x8c\xe6\xcb\xb8\x90\xd4\xc3\x67\xf0\xcd\x32\x2e\xa2\x9f\xa3\x62\xc6\xe7\x44\x52\xa0\xd1\xb7\x9e\xa2\xa3\x9e\x39\x83\xb2\x72\x31\x42\x5e\xbf\x79\xe2\xf3\x93\xbe\xd5\xaa\x6f\x0d\x34\xec\x01\x5a\x23\x6a\x78\xad\xd6\xae\x5e\x38\x34\x9e\x88\x11\x8b\xce\x8a\x5d\x21\xcd\x5e\x06\xe3\x59\xc7\x66\x4c\x11\xa6\x2d\xc6\xf5\x4b\xe7\x4b\xcf\xd5\x69\x17\x17\xe2\x08\x81\xae\x6c\xb8\xda\xce\x8e\xd9\x7d\xb9\x8e\x10\x11\xaa\xb5\xcb\xa8\x98\xc6\x13\x01\x62\xcf\x11\x74\xc0\xed\x92\xc4\x13\x7c\xd8\x93\x85\x9b\x30\x97\xe2\xc6\x1e\xa1\xe2\x19\x1e\x19\x90\x6d\x0d\x7a\x4d\x68\x9c\x53\x6b\x78\x83\x01\x09\xd3\xa4\x5d\x90\x20\x0c\x89\x28\x55\xa4\x66\x95\x7d\x12\x15\xed\x9c\x04\x71\x46\x83\xf0\x92\x8c\xd3\x65\x52\xd0\xb0\x04\x4b\x5f\x69\x9c\xd7\x7a\x11\x0e\x06\xe4\xe3\xd1\x8b\xa3\x21\x99\x44\xd3\x65\x46\x09\x3b\xb0\x25\x34\x67\x27\x40\x76\x4a\xbb\xcc\x4d\x66\xf5\x5b\x10\xc9\x1f\x67\x92\xcd\xc9\xa0\x18\x81\x12\x2b\x25\xcb\x5c\xa1\x35\xa3\x93\x00\xd4\x31\xe7\xb3\x34\xa6\xbc\x87\x51\x32\x5d\xaf\x61\x04\x15\x3c\xc0\xe6\xfc\x62\xd0\x3d\x92\x3a\x2b\xdf\x58\xe4\x72\x4e\x6a\x45\x7d\xcf\x16\xd7\x71\x55\x63\x88\x80\x78\xc3\xe4\x3c\xd0\x64\x9d\xd3\xc2\x99\x53\x4e\x56\x6f\x83\x39\xb5\xf7\x21\x9d\x83\xe5\x4c\xb7\xac\x67\xf3\xa9\xde\xcf\x74\xc5\x9e\x3a\x15\x5f\x14\x18\xd4\x52\xad\xfc\xab\x18\xb6\xac\x64\x91\xd1\xb3\x28\x5d\xe6\xaa\x43\xdb\xbb\x0c\x25\x51\x42\xa2\xa4\x70\x4a\xd4\xe1\x1f\xf5\xd7\xd7\x20\xfb\x9b\xa4\x19\x81\x47\xc2\x11\xd9\x23\x5b\xbb\x24\x22\xdf\xcb\x01\xc8\xf7\xc2\x24\xda\xd8\x28\x2b\xce\xfe\xac\x3e\x6f\xec\x91\x8d\x8e\xc4\x41\x44\x1e\x91\xad\x53\x26\xe1\x93\xab\x2b\xb2\xb9\x5b\x5a\x49\x05\x2b\x17\xf4\xb0\x41\x22\xf2\xb0\x6c\xe6\x36\xec\x5e\x30\xe1\xa0\x8c\xed\xcb\xbf\x6b\x27\xd5\x4c\xb9\xee\x76\xba\xd6\x14\x0e\x06\x64\x12\x65\x79\x41\x68\x4c\xe7\x34\x29\xd8\xf9\x8a\xa3\xa9\x47\xf2\xcf\xd1\x82\x44\xc5\x2a\x53\x6e\x60\x7f\xd3\x87\x7d\x86\xbf\xca\x19\x80\xa7\xf3\x61\x18\xb1\x46\x82\x58\x2d\x72\x81\x4f\x87\xff\xb8\xf8\xf6\xf3\x45\x4d\x3a\x25\x0c\xe2\x24\x22\x1b\x64\xeb\x54\xf2\x09\xb2\x41\x9c\x6e\x78\xd0\x5e\x8b\x60\x8b\xf9\x79\x20\xc5\x56\xe9\xa1\x7d\x4e\x15\x37\x66\x3d\x7f\x68\xa6\xc2\x84\x2d\x13\x53\xb7\x5c\xfc\x35\x94\x49\xca\x18\xd2\x66\x15\x43\x22\x8d\x68\xba\x96\xa3\x0c\x06\x64\x1c\xc4\xe3\x65\x1c\x14\x54\x0a\x3e\xec\xc8\x27\xfa\x42\xa2\x82\xce\x6f\xc1\x8e\x18\x2b\x3a\xf9\x13\x31\xa5\xae\x0d\x7b\xbd\xd2\xbe\x72\xcb\x09\xf9\xfd\x18\x0c\x66\x2e\x5f\x9d\xb7\x10\x47\x5b\x24\xfa\x51\xa3\x0d\x11\xba\x48\x71\x33\x99\x56\x68\x8c\x38\x64\x63\x8d\x91\x4c\x57\xb7\x9a\x4a\x25\xe2\xd7\x25\x95\xeb\x41\x50\xc3\x1e\xf1\x0f\xea\xf7\xe9\x88\x50\x31\xad\x23\xe2\xd0\x20\xdb\x34\x41\x4b\xa5\x92\xa8\x04\x21\x65\x3a\xa2\x72\x84\x88\x12\x70\xc2\x80\xd6\x34\x62\xaa\x35\x44\x78\x88\xbe\xd3\xb1\x81\x9b\xd5\x15\x44\xb2\x14\xa7\x62\x0c\xcf\x89\x38\xf7\x9e\xc2\xad\xe3\xfe\x1d\x6b\x94\xf8\x90\x3b\x30\x32\xb9\xbe\xb4\x5a\xc4\xd0\x8b\xc8\x1a\xb5\x86\xa9\x4a\xe5\xa0\x47\x55\xab\x67\xc0\x18\xe5\x1c\x88\x95\xb9\xeb\x91\x36\x51\x47\xa9\x93\xa8\x4f\x0e\x16\x5d\x2b\x65\x92\x83\x01\xc9\x97\x73\x7e\x43\xe7\xd9\xa5\x84\x88\xa8\xe0\x45\x75\x27\xd1\x29\xe3\x8a\xea\x0b\xb6\x24\x1f\xff\x91\xcd\x9b\x88\x90\xd2\xa6\x83\x82\xc1\x80\x64\x74\x9e\x9e\xc1\x35\x26\x19\x2f\xb3\x8c\xc9\xa7\x4a\x38\x4d\x21\x59\x74\x33\xca\xa1\xe7\x9e\xde\xe6\xab\x68\xfc\x24\x32\x1b\x6b\xfe\x8c\x91\x91\x47\x4e\xfd\x8d\x29\xed\x83\xb5\x0e\x4b\xae\x75\xbc\xa7\x56\xc9\xe3\x3c\x54\x56\x58\x57\x0e\x92\xac\xd8\x0e\x86\x2f\x49\xcc\xfb\x0b\xde\x5b\xd6\xd6\x58\xdc\x32\x61\x53\x0b\xe8\x7d\x87\xdb\xab\xda\x26\x18\xe2\x5a\xb4\xd3\xed\x79\xb3\x9f\xa7\x69\x5c\x96\xc7\x84\x90\x92\xac\xe3\x8a\x3c\x7c\xb9\x59\xda\x6c\x55\x26\xe7\xc2\x65\xb9\xef\x69\x50\xda\xe3\x63\x9e\xb9\xc6\x08\xc2\xb5\xdf\x00\xd4\x29\x9b\x0d\x69\x38\x3b\x7c\xdc\x6b\xf1\xbb\xdf\xd6\xf0\x1b\xf8\xc9\xfa\xd6\x1a\x3e\x61\xbf\xf1\x75\x6c\x6b\xf8\xb4\xe7\xb3\xf5\x88\x92\xa2\x35\xdc\xda\x64\x3f\x33\x1a\xc4\xad\xe1\xd6\x36\xfb\xcd\x6f\x65\x5b\xc3\xad\x1d\xf6\xb5\xe4\x50\xd0\xc0\x52\x80\x3d\xb9\x3e\xed\x3d\xfd\x2d\xed\xa2\x6a\xae\xa1\x6f\x66\x4d\x84\x2b\x59\xc5\xa8\xc8\x2c\x67\xdb\x16\xe1\xdc\x15\x4d\x8c\xfc\x45\x2b\x2c\x8d\xcc\x9e\x34\xa9\xeb\x16\x76\x47\x25\xc6\x46\x8d\x1a\x45\x57\xe2\xde\xe9\x92\x6c\x27\x5b\xd2\x06\x26\x4c\xd6\xb0\xeb\x2d\x99\xbe\xbb\xb7\x64\xba\xb7\x64\xfa\x6f\xb1\x64\xd2\x0b\xe1\xae\xcc\x99\x9e\x47\xd3\xb7\xcb\xf9\x08\x58\xa1\xe2\xce\xa3\x68\x9a\x40\x62\xff\x17\xc5\xc9\x97\x45\x14\x9b\xf6\x35\xfd\x01\xa4\xf1\x7f\x25\xd8\xd8\x0b\x32\x4e\x93\x49\xe4\x18\x03\xc9\x93\x19\xda\x15\xe0\xec\x02\xdb\x82\x1c\x38\xe7\xd5\x39\x01\x7e\x4f\xe0\xc1\x06\x3b\x67\x31\xbe\xa5\xad\x64\x61\x29\xb0\xb9\x01\xe5\xcc\x43\x86\x63\x0e\x19\xe5\x24\xa1\xd3\xa0\x88\xce\x68\x4f\x72\x22\xb8\x38\x2a\xce\xd3\x76\x4e\xc6\xe9\x7c\x21\xa5\x55\x28\xc5\xe6\x56\x95\x9c\xc4\x69\x50\x44\xc9\x94\x2c\xd2\x28\x29\x7a\xfc\x3a\x94\x91\x7d\x98\x9e\x27\xd6\x99\xce\x54\x93\xb8\xc7\xb7\x2b\x8e\xe5\x2b\x85\xef\x6b\x39\x16\xb6\x94\x12\x4a\x43\x38\x45\x8f\xf4\x1c\x87\x7e\x63\x18\x40\xda\xb5\xb2\xf3\x31\xdb\x35\x18\x30\xd4\x2f\xb9\xb0\x6a\xb7\xcf\xe7\xa2\x33\xee\xbf\xfc\xf8\xea\xd3\xf3\xc3\x9f\xde\x1e\xbf\x79\xfe\xf2\xfd\xa7\xf7\x47\xc7\x6f\x5f\x1c\xbe\xfd\xe9\xd3\x9b\xa3\x17\x2f\xd1\x19\x4e\x69\xe2\x60\x26\xfb\x8b\x20\x7c\x4d\x27\x45\x87\x7f\x15\xe9\xc7\xf3\x34\x3f\x50\x58\x14\x6d\xf6\x8b\x54\x88\x4b\x5b\x4f\xba\x3d\xf2\xe4\xb1\x79\xc3\x83\x77\x4b\x18\x4e\x87\x37\x62\x1a\x60\x98\x13\x2f\x0f\xbf\x25\x38\x7f\xae\xce\xc6\xe6\xa1\x79\x55\x1c\xba\x52\x87\x81\x45\x0f\x42\x8a\xf4\x15\xbd\x90\xe3\xce\x97\xa3\xbc\xc8\x3a\xdb\x08\x7f\xb1\x75\xb5\xcf\x8b\x4b\x2d\xf7\x06\x79\xb2\xd3\x25\x03\x8c\x22\x1b\xdd\xef\xa3\xe9\xac\x10\xc5\x7a\x24\x26\x0f\xbf\x32\x3e\xc5\x0e\x7c\xa7\x68\x2d\x95\xe9\x6e\x8d\x5d\x79\x3c\x33\xd1\xaa\xb4\x73\xbf\xdb\x0c\x58\x6a\x53\xde\x58\xb7\xcf\xd7\xfc\x06\xa9\x9f\xa0\x3a\x4e\xc7\x25\xf9\xf2\x15\xf1\x41\xe6\xdf\x76\xee\x94\x71\x67\xf3\x59\x9b\x64\xe9\xfc\xb8\x98\x3c\xbd\x9f\x38\xcf\xc4\x89\x77\x46\x65\x8c\x4c\xbc\x42\x92\x93\xc6\xbe\x69\x90\xac\xce\xc8\xec\x27\x47\xe5\x73\xd6\xde\xbc\xdd\x5f\x9b\x6c\x88\xea\xc9\x33\x42\xda\x5b\x6d\x32\x24\xed\xcd\xf6\xed\x79\x54\x1d\x26\xd9\x89\x95\x95\xfa\x07\x83\xcb\x09\x13\x8c\xe7\xcb\xb8\x88\xb8\x50\x39\xba\x24\xdb\xff\x99\x33\xf1\x5c\xd9\xd0\x05\xac\xe6\x82\x4e\x69\x56\xb1\x95\xbc\x17\xb5\xd6\xed\xdf\xab\xce\x88\xb0\x65\x2e\x99\x11\x81\x26\x8b\xfa\x18\xd6\x54\x8b\x6a\x73\x8d\xe6\x34\xb7\xb2\xb6\xbb\xfd\x45\x7a\xde\xd9\xda\x7e\xda\xed\x9a\x28\x3d\x98\xd1\xf1\x67\x12\x4d\x0c\x9c\x22\xb1\xc8\x42\x44\x1e\x4d\x13\x1a\x1e\xe6\x6f\x75\xb6\xa3\x88\x56\x75\xcc\xe8\x85\xe8\xb1\x89\x0c\x49\xb4\x70\xe8\x83\xb6\x0b\x53\x12\x4b\xd9\x91\xe5\x3c\x62\x62\x78\x10\xe7\xda\x6a\xd9\x6e\xbd\x16\x5f\x3e\x0c\x49\x76\xb3\xd9\x23\x5b\xdd\x1e\xd9\x7a\x82\xe4\x91\xed\xae\x91\xdb\x25\x7b\x7b\x7b\x8c\x64\xbd\x54\x98\x31\xf6\xf1\x28\x88\xa1\x53\x84\xab\x0e\xf4\x85\x07\x17\x35\x5d\x22\xe2\x8a\x04\x5b\x08\x34\xc8\xc3\xb1\x83\x65\x38\xd3\x82\x61\x45\xbb\x4a\x38\x84\x65\x11\x4d\x09\x97\xd3\x2d\x7a\x53\x5d\x30\xf0\x67\x18\xc5\x32\x60\x3e\x8f\x7b\xbc\x37\x48\x97\xd9\xe9\x92\xab\x2b\xd2\xda\x6c\x09\x1d\xf1\x60\x40\xc6\x8a\x8a\x98\xf0\x2c\x27\x52\xb5\xce\x81\x60\x96\x95\x98\xed\x4a\xd8\xf2\xf2\xd6\x9a\x64\x31\xb1\x1e\xfd\xa3\x67\x72\xf9\x7c\xce\xa3\x64\x69\x2f\x81\xf6\xe4\x96\x7f\x6d\xa8\x5b\x56\xbe\xa5\xee\xc6\x1a\x74\xe8\x06\xe4\xb3\xac\xa6\x9f\xe3\x4a\x02\xf2\x91\x0e\x5d\x89\x76\x44\xf3\x2e\xd5\x1c\xdf\x05\xd9\x7c\x1d\x94\x09\x7e\x5f\x86\x32\x87\x71\xd7\xa2\x0c\x30\x86\xe4\x61\x13\x45\xa2\x39\x17\x45\x0e\x27\xf7\x99\x9b\x5b\x2b\x51\xc0\xf4\xc3\xe8\x2c\x0a\x69\xf8\xfc\xb2\x82\x81\xdf\x84\x9a\x6a\x70\x73\x7c\xd7\xc8\x59\x96\x62\xe7\x78\x65\xf4\x1c\xdf\x06\x3f\xee\x15\x2c\xaf\x5a\xa1\xa8\x4c\xdc\xd2\xaf\xa5\x1b\xe3\x45\x6e\x6b\xe6\x5c\x94\xe2\x48\x34\xed\xa2\xc8\x11\xce\x7c\x18\xf2\x2c\x2f\xd8\xac\x6e\x29\xad\x6d\xb5\xc9\x33\xbe\x2f\x0b\xb7\x18\xab\x61\xb3\xf4\xd8\x88\x1e\xe5\x56\x6c\x7c\x31\x9d\x68\xc4\x31\xf1\xa1\xe2\x60\xe3\xc8\x1d\x49\x30\xa7\xfc\x75\x0f\xfb\x65\xc9\x5f\x02\x86\xd5\xa9\x6a\xf0\x60\xde\x39\x81\x42\x1b\x3d\x82\x35\xe5\xac\x90\x78\x5f\x4d\xf6\x48\xd9\x33\xdd\x87\xdd\x01\x3a\xcf\xe4\xd1\xaf\x82\x27\xe6\x70\x45\x25\xca\x9f\x6c\x9d\x9a\x72\x70\x7b\xf3\x82\xc9\xcb\xee\xe4\xf6\xf3\x38\x1a\x53\x26\x96\x6c\x93\x87\x50\xdd\x8a\x74\x5e\x33\x33\xf8\x08\x7e\x67\x13\xb4\x2a\xfa\x4b\xf5\x00\xce\x26\xa3\xce\x87\x16\x1f\xe0\x88\x13\x37\x60\x36\xe6\x9e\x3c\xee\x8a\x3d\xbc\x48\x05\x7c\x97\x3c\x94\x47\x4a\xdf\x0c\x58\x15\x71\xd1\xf0\xc9\xe3\x9e\x68\x7f\xb5\x29\xa8\x38\x92\xf3\xe1\x7b\xce\xe4\x77\x8a\xfd\x20\x1f\x47\x51\x15\xfe\x3d\x67\xf9\xdf\x10\xf3\x52\xa5\x03\xaa\x81\x66\xf8\x5f\x6d\x02\xb4\x6f\x9a\xb2\x19\xd8\xd7\xde\x6b\x4a\xa6\xa0\x94\xb7\x97\xa0\x5c\x55\xe8\x62\xdb\xe7\xbd\x66\x05\x69\xca\xc0\x5d\x6b\xf3\xa2\x45\x36\x88\x38\xe0\x00\xda\xf9\x6f\x65\x53\xf0\x78\xb3\x47\x70\x52\x99\xc3\x80\x2f\xd2\xee\x03\x1d\x34\x87\xd6\x77\xcf\x86\x81\x15\x3b\x74\x52\x1c\x38\xbc\xc0\x87\x65\x19\x4e\x29\x8e\xcc\xa1\x9b\xe4\xf6\x23\x4d\xe3\xa1\x9d\xe0\x40\x31\x09\x64\x68\x27\x60\x28\x25\x96\x0d\xed\x04\x17\xea\xd8\x01\x3b\xf6\xc2\xe1\x46\x75\x8a\xa7\x3e\x17\xf0\xd8\x0f\x89\x07\xab\x53\x3c\x70\x18\xdb\x28\xc9\x85\xf4\x4d\x8f\x9b\xe3\x96\x33\x27\x08\xa7\xb9\xb0\x82\xea\x87\xde\x75\x77\x2d\xef\x74\xcd\x9b\xa1\xd6\x70\xeb\x69\xaf\x65\xde\x28\xb5\x86\xdb\x60\xbe\x00\x0b\xa3\x35\xdc\xda\xea\xb5\xf0\xbd\x54\x6b\x68\x7e\x5e\x9f\xf6\xb6\x36\x7f\x67\x7f\x2e\x87\xdc\x30\xbe\xc2\x01\x51\x94\x14\x65\xfe\x87\xc4\xd5\x55\x94\x14\xdc\x35\x0b\xfb\xf1\x58\xfd\x3a\xd5\x89\x3b\xe8\xb7\xe5\xb9\x25\x4a\x0a\xee\xb7\x25\x4a\x8a\x27\x8f\x15\xd8\x53\x5d\xd1\xf6\x37\x4f\x4a\xea\x62\xf0\x35\x7e\x8c\xec\xa3\xe1\x57\x74\xc5\x05\xe0\xb6\x0d\xc2\x61\x52\xac\x68\x76\x61\x94\xa8\xb0\xb6\x80\xe6\x2a\x4a\xde\xc8\xb6\x22\x4a\x0a\x29\x2a\x3e\xbb\x91\x3f\x17\xde\xab\x7a\x1b\x88\xad\x46\x21\xec\xee\x8d\x20\xee\x8d\x20\xfe\xbc\x46\x10\x44\x5b\x41\x70\x51\xe9\x8e\x0c\x20\x1a\xd8\x35\xd8\xac\x9e\xdb\x2d\xa4\x60\x8d\xae\xdd\x76\xf4\x3d\x12\xea\xf9\x8c\x26\xea\xb1\x62\x8f\x1b\x7e\x33\x01\x5c\x79\x6f\x90\x92\xe5\xc0\x6b\x18\x61\xe9\xbe\xed\xb7\x89\xc0\x49\xa5\xfc\xc8\xff\xbf\xba\x22\xed\x36\xe2\xb3\xa9\x7c\xb6\xc0\x7f\xec\xa2\x77\x86\x51\x22\x5a\x6f\xec\xee\x63\x4a\x0b\x6c\xef\x0b\xd6\xe3\xed\x5c\xbe\x02\x05\x5e\xc2\x2a\x31\x4c\xdd\xb5\x7c\xcf\x2d\x5d\x4d\x29\x5a\xaa\x99\x74\xad\xb8\x32\xd2\x91\x7d\xec\x1a\xd6\xec\x80\x1e\x6c\xcd\x6e\x37\x52\x69\x87\x06\x26\xfe\xc6\xb1\x03\xdf\x3d\x36\x46\xc6\x38\xa3\x8c\x98\xe4\x7a\x30\x7d\xb2\x70\x72\x0f\xa3\xc9\x84\x82\x35\x32\x47\xb9\x75\x2e\x39\x57\x8f\x42\xf0\x71\x44\xa2\x44\xcc\x92\x34\x5c\x4e\xbc\x87\x10\xf3\xe8\xc2\xb6\x43\x5f\x3f\x82\x05\xe7\x30\xaa\x17\xe5\xa8\x3c\xf7\x3f\x98\x35\xe9\xae\xf4\x4a\x4f\x13\xa4\x22\xd5\x55\x30\x9a\xce\x47\x51\xe2\xba\xb7\x29\xd2\x29\x65\xdc\x9d\xd5\x40\xa7\x7d\xbe\xa8\x82\xc5\x82\x26\xb0\x96\x82\x84\x3f\x80\xb0\xb0\x2b\x6a\xab\xbb\x84\x11\x8c\x69\x16\x8d\x19\x7b\x92\xbd\xaa\x2f\x2c\x6e\x4f\xd3\x89\x80\x85\x7d\xa8\x12\xb5\x72\x78\x75\x7a\xbf\x2a\xb4\x2a\xbd\x05\xbf\x32\xd9\x25\xf5\xd8\x1d\x07\x71\x2c\xf0\x2b\xef\x70\xf8\x88\x66\x81\x5e\xba\x79\xf4\xab\xf0\x2c\x08\x77\x75\xb3\x20\xef\xb1\xff\x25\xa1\x81\xef\x5f\xcf\xa5\x1d\xc6\xb7\x32\x04\xf5\xeb\x4c\x2b\x51\xe3\x77\xcd\xe4\x5b\xb8\x62\x55\xac\xef\xed\x81\x74\x31\x89\x12\xeb\xa1\x52\x1d\x12\xb4\xcb\x22\x51\x95\xb8\x5e\xb6\x95\x06\x3c\x77\x3f\x7f\x5e\x7e\xf4\xe7\x1a\x5f\x57\x43\xd3\x60\x99\x19\xb5\x57\x0d\x7a\x1d\x46\xad\xdf\xff\x77\xc9\x33\xd2\x6e\x93\x61\x33\x6b\x2c\x84\x32\xaf\x4d\xd6\x0a\x78\x63\xbc\x9f\x2b\x27\x94\xcc\xe8\x7b\xeb\xa5\xf5\x17\x7e\x9c\xc9\xbd\x47\x5e\x09\x07\x98\xe1\x07\x73\x4c\x64\x40\xe2\x95\x58\xd4\x8d\x79\x51\x08\x4e\x95\x6c\xfc\xf9\x9c\x33\xa9\xe5\xb5\x4b\xf8\x95\x1f\x29\xa1\x3b\x31\x61\x9d\xd5\x51\x67\x6c\x6b\x25\xb8\x43\x9b\x92\x1f\x79\x32\x21\x90\x37\xf0\x0d\xb0\x48\xe7\x8b\xe2\x12\xab\x04\x1b\x6c\xa2\xb5\xab\xd0\xa4\x47\xc4\x9e\x86\x20\x7d\xac\x80\x1b\xe9\x6e\xaa\xd4\xd1\x94\x17\x13\x95\x03\x11\x55\xd6\x8d\xc1\xb8\x58\xd9\xf0\x88\x05\x37\x19\x87\x7e\x89\x57\xee\x1c\xea\x75\x94\x17\xce\xb3\xbf\x13\x63\x34\xa7\x1e\x8f\x50\x95\xa3\xd7\x35\xbb\xdb\x8b\x7a\x14\x24\xaf\xe9\x97\x8b\x90\x9b\xb5\x8a\x47\x70\x4a\x15\x59\xa4\x05\x7a\xe8\xca\x0b\x4b\xe1\x88\x3b\x1d\x22\xc6\xc3\x3e\xf5\x7e\x50\x80\x9a\x6f\x8a\x8c\xbd\x4d\xad\x47\xbe\x7d\x95\x2c\x48\xfb\xf6\xcb\xf6\x14\x62\x36\x4f\xf6\x70\x8f\x35\x2c\x1e\xc6\xc6\x9e\xab\xe8\x17\x4f\xb5\xdc\xe7\x59\x1c\x52\x8b\x40\x9d\x14\x3f\xb9\x55\x4f\xe6\x06\x03\x39\xdd\xf4\x8c\x66\x97\xc5\x0c\x1c\x91\xa0\x7a\x30\x76\x5c\xaf\x53\xd2\x1c\xcd\xc1\x8f\xf1\x4c\xd7\x7f\x43\xa1\x1c\x2f\xdd\x69\x13\xae\xd2\xf9\xba\x47\xda\x6d\xa9\x7c\xaf\x50\x52\xbc\xe3\xb3\x64\xe9\xf4\x94\xfa\xee\xfa\xb4\xb7\xd5\x28\xd0\xde\x57\xd4\xc9\xc1\x6d\x74\xb5\x52\x2e\x63\x20\x25\x5a\x39\x69\x63\xc6\xfe\xe7\xaa\x32\xf8\xf5\x58\xff\x3c\x45\xc9\x3b\xf8\xc3\xd2\xcd\xb1\x34\xae\x9c\x63\xbf\xa4\x76\x8e\xfd\x7e\x8a\xaa\x43\xfa\x39\xa7\xc6\x06\x1a\x3a\xe7\xee\x7d\x15\x15\x1d\x2b\xbc\x8a\x8e\x8e\xc3\xdb\x4a\x3a\x96\xba\xa2\x96\xce\x2c\x52\xa1\xa6\xe3\x2d\x56\x95\xbd\x89\xa2\x8e\xe1\xb6\x44\x51\xd7\xcc\x4b\xbe\xe8\x56\x03\x45\x5d\xa3\x50\x5e\x5f\xeb\x65\x9d\xe7\xf6\x6f\x15\xf2\xe0\xc5\x57\x21\x10\x59\xc2\x26\x11\x9e\xbe\x22\x91\xd8\x85\x2a\xc8\x44\xb6\x5b\x5d\xfe\x46\x3a\x5d\x2e\x49\x35\x79\x30\xe7\x69\xef\x6e\x9f\xca\xa9\x51\x36\xa0\xbb\xbb\x0f\x3d\x52\xf9\x78\xc7\xc3\x87\x91\x7f\xdb\x28\x6f\xee\xd8\x76\x4c\xb3\x22\x88\x12\xbf\x73\x5b\x07\x91\xfc\x36\xa9\x86\xa8\x39\x50\xdf\x4c\xaf\x26\x6b\x51\xc4\xca\xa8\x75\x05\x51\xd0\x6c\xce\x8e\xfc\xd1\x04\x6a\x36\xfb\x1d\x0a\x97\xb5\x64\x1a\x9d\xd1\x44\x9a\xb4\x98\x47\xea\x32\x5f\xb9\x96\xfd\x0b\x3f\x66\x6b\x73\x5b\xc0\x32\xaf\xdc\x69\xd7\x6f\x7c\x8b\x21\x9a\x2f\x11\xee\x99\xb6\x55\x78\x85\xe3\xf4\x8c\x66\xd9\x79\x16\x15\x05\x05\x73\x2f\xde\xab\x16\xd9\x80\xde\x37\xc6\xdd\x39\x68\xd9\x73\xfc\x8a\x1f\xac\x20\xf4\x51\x34\x4a\x04\x0a\x0b\xd7\xe9\xb0\xfd\xd0\xbe\x11\x32\x5d\xad\xa4\xd5\x9c\xd6\xda\x96\xe0\xcd\xe3\x3f\xc0\x8f\xc1\xc1\x00\x54\xe1\xc1\x9c\xad\x0a\x70\x79\x28\xb4\x59\x6c\xbc\x8c\x13\x50\x7e\xc7\x10\x47\x9f\x29\x09\x48\x1e\x25\xd3\x98\x2a\x27\x5c\x00\xd9\x37\xec\xa1\x81\x82\xb9\x8f\x19\xee\x93\x83\xb7\x76\x75\x45\x4e\xda\x27\x5b\xa7\xed\xd3\xae\x12\x06\x6b\x7c\x00\x88\xee\x99\x78\x67\x5f\xd8\xaf\x61\x89\xe8\xce\x6d\xa0\x38\x2a\xc0\x56\x61\xab\x47\x1e\x81\x31\xf6\x26\xf4\x65\x0b\x7b\xa1\xd1\x1d\x72\x04\x59\xe9\xa5\xa1\x27\xfd\x3a\x94\x9d\x16\xa4\x37\x87\x87\x12\x50\x37\x30\x18\x90\x20\x8e\xc9\x28\xc8\xa3\x31\x77\x7e\x00\x2f\x05\x76\xb6\x85\x02\x27\x4e\xd9\xc9\x58\xf6\xa6\x47\x76\xb6\xeb\x8c\x4e\xcc\x85\x2d\x38\x9a\x3c\x81\x4b\x5d\x24\xa1\x53\x10\x20\x21\x22\xd4\xc9\x69\x8b\xec\xfd\x00\xeb\x53\xa7\x3d\xe6\x89\x95\xca\xb4\x7d\x59\xdb\xaa\x1c\x60\x46\x4b\x7b\x56\xb1\xda\x71\xab\xa5\x34\xab\x7d\x7e\x19\xde\x60\x1c\xa2\xdb\xb5\xb6\x51\x54\xe4\xc1\x03\x82\xbf\x4f\xd0\x6f\xe4\xff\xed\x54\xee\xba\x2a\x2c\xc6\x60\x7a\xa3\xb9\x11\xcb\xb7\x6a\x6a\xe4\x2c\x98\x73\x23\x26\xcc\x9c\x1a\xe4\x6e\xed\x96\x33\x63\xf5\xab\x62\x62\x50\x9b\x5f\x7b\x5e\xee\x72\x62\x4c\xbf\x27\x9a\x91\xa2\x99\x80\xb3\x51\x0b\x6c\x11\xb6\x39\xd2\xf9\x21\xa9\x25\x8c\x15\xb6\xc4\x54\x6c\x3d\x56\x80\xdb\xa7\x27\x3b\x02\x54\xa6\x71\x10\x05\xb1\x75\x6a\x25\xe8\x6f\x77\x77\x00\xac\xde\x60\x7b\xc0\x63\x11\x43\xac\xdf\x13\x50\x63\x77\x34\x91\xd1\x84\x74\x50\x16\xe2\x90\x36\x3f\xbe\xe1\xc4\x02\xc3\xf6\xbd\x86\xd8\xaa\x98\x72\xb1\x49\xc8\x53\xb5\x6f\x9e\x61\xde\x7c\x53\xdd\x52\xc1\xf7\x9c\x09\x17\x9f\x2d\x63\xde\x8d\x8a\x4e\xcc\xca\xf1\x74\x6b\xd7\x6b\x8d\xe6\x59\x65\xf0\xa1\x88\xfc\xd2\xf9\x35\x5c\x28\x96\xee\xf6\xc2\x55\x51\x1c\xe4\x05\x39\x39\x65\xc2\x04\xaf\xf7\x46\xd3\xbe\xee\x9f\x77\x35\x07\x20\x67\x11\xc7\xc1\x12\x1c\x68\xf4\x33\x28\xf8\x54\x34\xd0\x84\x48\x2a\x8c\x63\xd1\x11\x46\x71\x60\xfb\xa6\x89\x8c\x2e\x49\x48\x27\xc1\x32\x06\x45\x68\xbe\x64\x72\xaa\xda\x98\x5b\xc2\x47\x4d\x4f\xc4\x78\xb4\x67\xd1\x38\x46\xdd\x80\x01\xeb\x1d\x71\x45\x51\xb8\xe1\xe9\xad\xd4\xa8\x5e\x3a\x6a\x97\x3a\x62\xb4\x44\x72\x7b\x8d\x00\xc5\x0b\x52\x3e\x69\x31\x8a\xef\x91\x16\x5b\x04\xec\xbf\xd3\xd6\xa9\xa6\x76\x01\x81\xd2\xa0\x50\xb2\x8c\xed\x67\x0f\x68\x36\x1b\xa1\xcd\xf6\x2e\x67\xf5\xb7\x66\x21\xb8\x1e\xaa\x9c\x95\xc0\xf7\x06\xe1\x29\x8f\xcf\x7a\x0e\x37\xbc\x6c\x38\xc6\x78\xd9\xbf\xb0\xea\x2d\x22\x16\xdc\xaa\xf3\xef\x13\x7e\x1a\xff\xf7\x69\xb7\x5e\x44\x10\xca\x5b\xe5\xea\xa1\xfc\xde\xc1\x8a\x61\x21\xa1\x9b\xb3\x0e\xf9\xf0\xd4\xbd\xcb\xb2\x70\xe6\xb9\xb4\x10\xf7\xe8\xf6\xc6\xe0\x75\x46\x6d\xde\xca\x08\x3f\xa8\xd2\x03\xaa\xcd\x16\x6a\x5c\xc1\x2a\xfb\x6f\x6c\x4c\xbc\x4b\x4a\xff\xfc\x5e\x51\x5d\xa7\xb2\x34\x9e\x60\x67\xb2\x82\x95\x39\x85\xd4\xb3\xe4\x93\x53\x9f\x07\xf1\xfe\x62\x99\xcf\x3a\x8e\x5b\x52\xf9\x4c\x5b\xfa\x18\x75\x6b\x66\x63\x71\x1d\xae\x9f\xf9\xbc\x7f\xe2\x96\x90\x13\xcf\xce\x59\x8f\x60\xe7\xb2\x96\x6f\xd2\x5b\x79\xf4\x15\x13\x88\x3d\xf9\xde\x7a\xfe\xa0\xeb\x8e\xd4\x21\x10\xff\xdb\xcf\x9f\xcf\x1d\x6b\x8d\x1b\xd6\xd2\x89\x60\xb3\x09\x7e\x52\x2b\xe6\x63\xe5\xd9\x58\x73\xee\x08\x2d\xdd\x91\xb1\x24\x91\x3b\xdb\x26\x0e\x41\xf9\xfd\xe8\x24\x4b\xe7\x5e\x73\x03\x0e\xe5\xe3\x2d\x23\xfb\xc1\x8e\x65\x20\x64\x58\x06\xad\xf0\x60\x4a\x32\x35\xde\x72\x03\x16\x25\x06\x82\x59\x94\xe1\x4c\xb3\x86\x55\x7d\x15\x5e\x05\x7b\x13\xbe\xb1\xe4\x82\xae\x78\xe2\x03\xdd\x93\x82\x8e\x40\xd7\x43\xb2\x0d\xc6\x0f\x5d\xe9\xce\x59\x20\xaf\x6c\x11\x55\xd6\x89\x9b\x77\x2a\xf6\xad\x28\x28\xf0\xa1\xe0\x77\xec\xb8\xf4\x06\xd9\xe1\x1e\xef\xf9\x6e\x9b\x33\x90\x9c\x04\x93\x82\x66\x6a\x91\xe0\xfe\xde\x68\xad\xfa\xcb\xf8\x1c\x77\x6b\xce\x51\xe2\xb0\x9b\x54\x62\x4f\xc4\x8d\x79\x5b\x56\x3f\x76\xea\x51\xea\x43\xda\x0e\x78\x53\xc9\x68\x1a\x72\x1a\xf2\xb0\xba\x6f\x0c\x76\x63\xaf\x1a\xa6\x11\xa3\x32\xbd\xcd\xa2\x69\xdf\x20\xd1\xdd\x72\xad\x3f\xc4\x1e\x82\xff\x1a\x52\xbf\x34\x48\x6d\xf8\xf7\x87\x22\xfe\x7b\xda\x47\x7f\xbf\x0b\xed\x13\x2f\xe9\xe3\xe8\x8c\x37\x25\x7d\x3b\x86\xd8\x8a\x9b\x8a\x43\xac\x76\xfd\xcd\x76\x16\xb3\x17\xab\xd4\x2f\xe6\xcf\x4b\x6f\xb1\x43\x5f\xfe\xf5\x57\xbe\x84\x17\xe2\xd6\xcf\x35\x52\xad\xeb\x7e\x87\x6c\x91\x0d\xb3\x77\x5d\xee\x90\x89\x87\x11\xf3\x4c\x3d\x77\x3f\x6c\x5d\xba\x19\x0f\xb6\x2b\x9c\xd9\x1b\xb8\xb6\x2c\xbe\x0c\x2e\xb6\xb6\xe2\xd8\xf0\x9c\xab\x95\xb5\xdd\x35\xd5\xaa\xde\x8b\x44\xab\xeb\xb5\x17\xbc\xe5\x57\xbb\xea\x4d\xdc\xf5\x69\x6f\xeb\xf7\x8e\xbb\x7f\x5c\xff\xec\x6d\x59\xf1\xee\x4d\x78\x22\x81\xff\xb9\xad\xcb\x52\x3f\x7d\x5b\xa2\xb7\x6f\x4b\xfc\x60\x6d\xe9\x79\xfd\xb6\x54\xcf\xdf\x96\xe8\xfd\xdb\x12\x3d\x80\x5b\x9a\x2f\xe0\x9c\x1a\x1b\x58\xd8\x38\xfe\x51\xbe\xe2\x23\xb8\x63\xef\x2b\xb8\xe3\xd5\x9f\xc1\x1d\x37\x7d\x07\x77\xec\x3e\x84\x3b\xbe\x83\x97\x70\xcb\x5b\x3f\x85\x3b\x6e\xfc\x16\xee\xf7\x0e\xea\x7f\xdc\xc0\xe2\x6c\x59\x65\x72\x26\x5d\xab\xf0\x1f\x82\x38\x91\xd5\xd9\x12\x9b\x9d\x2d\x0d\x2b\xb1\xa5\xcf\xf0\x6c\xa9\x2d\xcf\x96\xd8\xf4\x6c\x89\x6d\xcf\x96\x96\xf1\x99\xa7\xde\x26\x8b\xe3\x37\xb5\x3f\x3b\xf6\x1b\xa0\x1d\xdf\xc0\x02\xed\xb8\xb1\x09\xda\xb1\xc7\x06\xcd\x2e\x7d\xb3\x35\x52\x61\x86\xd6\x74\x91\x34\x37\x44\xfb\xb6\xc9\x2a\x69\x2f\x73\x0a\x8a\xd9\x71\xd1\xe6\xd1\xf8\xa6\x29\xa1\xc9\x19\x09\x53\x0a\xd6\x0a\xf0\x3a\x30\x48\x42\x70\x60\x4b\xfe\xf9\xe6\xf5\xab\xa2\x58\xbc\xa7\xff\x6f\x49\xf3\x62\x0d\x04\xb3\xcb\x05\x4d\x27\x56\x0e\xf7\x63\xa3\xde\x6f\xb4\x25\x5e\x44\xc3\x7d\x1b\x9a\x7c\xb9\xde\x5d\x33\x22\x45\x96\x42\x9a\x09\x20\xa9\xff\x92\xcf\xd8\xee\x13\x4d\x93\x34\xa3\xc3\x38\x4a\xe8\xda\x35\xb7\x58\x65\x78\x68\xe4\xea\xfe\xfe\xe5\xec\xfd\xcb\xd9\x3f\xf1\xcb\x59\xfe\x6a\x56\xd8\xb0\x19\xcf\x66\xf9\x86\x43\x6e\xf6\x7a\x56\xec\x7d\xc7\x45\x14\x43\x9d\x5c\x9f\x09\x6b\x87\x3f\x4f\x72\xc0\xa2\xe2\x52\xb1\x44\x5d\x64\x1c\x07\x79\x4e\x4e\xa0\xc8\xa9\xe8\x26\xcf\xd0\x4c\x98\x57\xb5\x36\x80\x7b\x23\x58\xa5\x42\xb9\xca\x38\x08\xa9\xf0\x64\xdd\xdc\xc9\x39\x40\xb2\x9a\x8e\xdf\x1e\x7e\xfc\xc0\xce\xd6\x30\x09\xed\x73\x1a\xb5\x39\x69\xb6\x3f\xa3\xdf\x6f\xd0\xef\x9f\xd0\xef\xfc\xd7\x60\x94\xca\x8f\x49\x94\x24\xf4\x52\x7d\xd1\x79\x91\xc2\x53\x46\x99\xb2\x88\xc6\x66\x42\x12\x24\x66\xc2\x3c\x1a\x67\x76\x4a\x1c\x47\x4e\x21\x03\xde\x00\x95\x1f\x46\x91\x69\x16\x24\xa1\x1a\x8a\x91\xf5\x93\xf1\xf5\xd1\xf8\x7a\x67\x7c\xbd\x34\xbe\xfe\xcf\xf8\xfa\x97\xf1\xf5\xd6\xf8\x7a\x61\x7c\xfd\xc3\xf8\x3a\xe6\x5f\x6b\xa7\xe5\xae\x6b\xd8\x1c\xbd\xdb\x7f\xc1\xa6\x78\x48\x76\xb6\x7b\x2a\xf1\xc3\xe1\x4f\x6f\xf7\x3f\x1e\xbf\x7f\xf9\xe9\xf5\xcb\xb7\x3f\x7d\x7c\x35\x24\x8f\x75\x26\xcc\xea\x50\xff\xd4\x39\x25\x94\x33\x24\x5f\x88\x95\xa0\x9d\xa8\x43\xc6\xa7\x17\x47\x3f\xbf\x25\xd7\xba\xa6\x77\x47\xaf\x5f\x33\xe8\x8f\x87\x6f\x5e\x1e\x1d\x7f\x1c\x92\xad\xcd\xcd\xcd\x81\xe8\xa1\xb8\xf1\x7e\x1e\xa7\xe3\xcf\x43\xd2\x66\xac\x33\x2f\xda\x46\xde\xfe\x18\xe2\x18\x0f\xf5\xdb\x46\xfe\x00\x83\xed\xe7\x75\xbe\x4f\xee\xe3\x60\xdc\x6f\x64\x7f\xf5\x8d\x6c\x4d\xb9\x80\xc8\x67\xc1\xce\x5d\x79\x80\x38\xc8\x2e\x17\x45\xfa\xf7\x0f\x78\x73\x18\x43\xda\x23\x1d\xfe\x82\x35\xe8\x05\x18\xb0\x9c\xb6\x37\xb4\x93\xeb\xbe\x01\x28\x2e\xc7\x0f\x54\x45\x12\x79\xf0\x40\xe6\xf6\xa5\xbf\x08\x2e\x26\xcf\xe8\x45\xdb\x7e\x45\x67\x78\xfe\xfa\x81\x6c\xb3\xd2\xb6\xeb\xe3\x6d\xe9\x2e\xd2\x2c\x4e\xe4\x65\xb8\xba\xe0\xb7\x9c\xb3\x13\xeb\xb5\x1d\x07\x95\x38\x62\x9d\xeb\xbf\xa2\x17\x7d\xd0\x5e\x0a\xcf\xbd\x3e\x1b\x23\x86\x15\x39\x6c\xdd\x3a\x3f\xd1\x71\xf5\xdb\x90\x6c\x7f\xf3\x84\x97\x44\x8f\x93\xe5\x9b\x33\xc6\xf2\x14\x8e\x5b\xc3\x6f\xbe\xeb\xb5\x4c\x94\xb7\x86\x4f\x37\xaf\x4f\x7b\xdb\x8d\x7c\x3e\xdd\xf3\xbd\x7b\xbe\xf7\xe7\xe5\x7b\x9a\xed\xf1\x77\xfe\x77\xc0\xf7\x2c\xd9\x7d\x75\xd1\xdd\x23\xb9\xcb\x82\x3e\xc1\x7d\xa5\x50\x43\x36\xaf\xed\x0f\x04\xbb\xd7\xb1\x88\x26\x4f\x31\x00\xfb\x56\x22\xfc\x32\x89\x8a\x37\xc1\x42\x89\x8b\x6d\x29\x51\x0f\x39\x0f\x6a\x6f\x4a\x59\x93\x49\xed\x43\xcd\x16\xdb\x5b\x86\x9c\x3f\x44\x19\x9b\x9b\xaa\xd0\xff\x56\xe4\x8d\x82\xd1\x28\x98\x52\xd5\x12\xce\x43\xc2\xff\xd0\xce\x9b\x7b\xea\x44\xd9\x6f\xaa\xb3\xe3\xf4\x8c\xc6\xc1\x58\x36\x6b\x67\xeb\x33\xc6\xd0\x97\x3d\xf5\x57\x8e\x20\x7e\xaa\x85\xc8\x67\x41\x92\xa4\x89\x31\x6e\x13\x42\x9f\x6b\x86\x15\x10\x35\xad\xc0\xc9\x6a\xe8\x81\xc0\xa8\xd4\xe7\xa5\x61\x35\x50\x5d\x4d\xe2\xec\x36\xf4\x02\x19\x95\xa9\xf3\x98\x3d\x36\x0f\xa0\x7f\x88\x26\xa0\x41\xae\x1e\x38\x04\xfa\xd9\x84\xf5\x81\xe2\xb9\x86\x53\x5f\x65\xc5\xb8\xbf\x8d\xea\xc6\xd5\x37\x2d\x80\xca\x14\x2b\x94\x61\xc5\xfc\xc6\x56\xda\x11\xc3\x22\x08\x85\x29\x29\x98\x7a\x5e\x2c\xe8\x98\x6d\x5e\xca\x3c\x1f\x1b\x5d\x09\xef\x29\x3e\xcb\x29\x5d\xc5\x88\x32\xb8\x50\x84\xe3\xb2\x6c\xb0\xc6\xb3\x20\x0b\xc6\x05\xcd\x72\xa9\xe2\x87\x7b\x79\x51\x1a\xed\x23\xde\x36\xa2\x69\xd2\x43\xb6\xd0\x64\x73\xcd\xef\xf6\x23\x9a\xce\x0a\x22\x3d\xd2\x5a\xde\x7d\xc5\x18\x0c\x69\x93\x83\xf4\xa0\x77\x79\x0f\xda\xf1\xf8\x18\xe2\x16\x22\x00\x03\x11\x69\xe1\xb5\xaa\xba\x21\xde\xea\xf6\x7f\x49\xa3\x04\x82\x35\x90\x67\x50\x07\x19\x92\xd6\x66\xab\x4b\x36\x04\x70\x89\xe1\xdb\x8d\xe7\x02\xa2\xf5\xfc\xd9\x27\x03\x06\xb1\xe2\x6c\x88\x1e\x6e\x70\x8f\xcb\x37\x9d\x97\x32\x43\x44\xd3\x11\x0d\x6c\x9d\x60\x86\x08\x91\x3c\x5c\x1f\xd3\xd6\xbc\x70\x6f\xcd\x15\xb3\x12\x25\xac\x12\x3f\xb2\xb0\x3f\x6a\x8f\xa3\x24\xd6\xb8\x36\x3b\xe4\x1e\x48\x8e\xf9\xd6\xae\x44\xfa\x19\x0f\xf6\x3c\x18\x90\x1f\xa3\x24\x24\xfc\x71\x97\xe8\xa8\x0a\xd6\xcc\x24\x8a\x56\x4b\xdf\xe4\x83\xed\x4b\x0f\xe2\x47\xcd\xe8\x85\x34\x61\x56\x67\x2e\x96\xc6\x4f\x3d\xec\xc4\x51\x7e\x56\x62\xd5\x6c\xe3\x77\x2f\x60\x5c\x23\x6c\x6a\x76\x49\xb4\xb1\xb7\x8d\xc1\x65\x20\x64\x6c\xdb\xa1\x9b\xea\x44\xac\x1d\x11\xfa\x42\xb5\x30\x21\x1d\x5e\x64\x6f\x8f\x6c\x76\x8d\x53\xda\x28\xa3\xc1\x67\x0d\xca\x46\xb9\xb1\x47\xc4\xab\x72\x36\x83\x07\xb3\x20\x3b\x48\x43\x0a\x35\x78\x0f\x61\x6c\xb2\xa5\x39\x4e\x5e\x64\xcd\x28\x84\x4f\xda\x4a\x24\xb2\xcf\x8a\xfc\x76\x34\x02\xcd\xfd\xf7\x10\xc9\x4d\x66\x3e\x2f\xca\x5e\xa7\x9b\x93\xed\xf1\x31\xdf\x59\x64\x74\x12\x5d\xf0\x08\x5a\x9b\x17\x5d\x36\x0b\xc0\x35\xfc\xee\xed\x45\xa8\xb7\xf2\xd9\xf7\xda\x2e\xc3\x11\x34\x88\x81\x9b\x57\x06\x13\xf0\x85\xf8\x34\x7c\xed\x0b\xb7\xeb\xa2\x1b\x98\x2a\x18\xc5\x0b\xcc\xf3\xd9\x87\xe5\x20\xcc\xb6\xf9\x72\x90\x33\xc2\x5a\xd2\xd4\x31\x49\x33\xdb\x84\x2e\x2f\xb2\xb2\x70\xf8\x68\x46\x19\xd4\x58\xcc\xcd\x7e\xd1\x89\x6e\xb6\xd2\xc1\x3a\x51\x44\x06\x37\xbc\xb6\x69\x10\xd6\xdf\x8d\x3d\x92\xc8\x7d\xe1\x7b\xb2\x4d\x9e\xb1\x93\x0d\xd9\x20\x6c\x3f\x48\x7c\x34\x21\x5c\xc8\xcf\xe8\xc5\x5d\x92\x86\x15\x73\xc0\xa6\x8d\x1a\xd6\xf0\x9b\x11\x87\xc3\x33\x10\x75\xfc\x36\x14\xf0\xbb\x4d\xab\xe5\xb1\x74\xb2\x8c\x63\x85\x86\x01\x3d\xa3\x49\xc1\x1f\x0a\x00\xcb\xff\x25\x4f\x13\x12\x8c\x22\x9b\xc7\x4b\xb7\x89\x1f\xd3\x1f\x97\x71\x6c\xbf\xa1\x94\x8f\x09\x58\xe9\x47\xbc\xb4\xfb\x18\x8a\x37\xec\xb4\xab\x19\xbb\xdb\x86\x21\x48\xb1\xca\xb1\xea\x94\x7d\xf7\xc1\x84\x22\x4a\x42\x7a\x71\x34\xe9\xb4\x3b\xed\x2e\xf8\x86\x7c\xb4\xe5\x79\x0e\xa9\xe0\x1d\x3b\xc1\xe2\x72\x41\x45\x73\x00\x04\x54\x64\xfa\x33\xeb\x44\xdd\x2f\x32\x7e\x70\x9f\xc1\xef\x92\x6b\x21\x8a\x99\x96\x7f\xaa\x15\xb2\x41\xda\x1d\x36\x73\xaa\xf6\x0d\xd2\xee\xb6\x1b\xad\xbd\x30\xca\x17\x71\x70\xc9\xe7\x05\x7c\x8c\x26\x05\x93\x6d\x15\x36\xec\x37\x6b\x17\x90\xfd\x82\x17\xab\x7a\xe1\xca\x6a\x33\x27\xdf\xbf\xbc\x8c\x1e\xb0\x2d\xcd\xa2\x18\x3a\xed\xcb\x60\x8b\x97\x1d\x61\x56\xd7\x25\x8f\x7e\x50\x89\x6a\x5a\xdd\xbe\x55\x3e\x7c\x56\x36\x9b\xce\xcc\x1a\x68\x16\x60\x7c\xb2\xc9\x33\xfb\x4d\xab\x78\x0f\xc6\xd6\x8c\x76\x36\x32\x18\xe8\x81\xa6\x67\x34\x8b\xd3\x20\xa4\xa1\x52\x04\x7b\xd6\x04\x1e\xc0\x47\x4d\x24\x65\x6f\x1a\x07\xe4\xe3\xd1\x8b\xa3\x21\x99\x07\x9f\x41\x35\x1c\x25\x67\xcb\x38\xa1\x59\x30\x8a\xe9\x5d\x0e\x50\x9f\x06\xec\xd7\xbb\x5b\xe4\x11\x41\xd9\xdd\x6e\x3f\xa3\x8b\x38\x18\xd3\x4e\x9b\xb4\xc1\xa9\x1b\x3b\x2d\xb4\xcc\x08\x91\x69\x72\x46\xb3\x22\xd7\xf1\x36\x41\xee\x0b\xe9\x38\x9a\x07\xb1\xcd\x64\xa3\xc4\xcf\xec\x8b\xf4\x05\x2f\xe0\x52\x5e\x65\xec\x4c\xd3\xad\x21\x17\xf0\x44\x4d\xb5\xd1\x1f\x8b\xd4\x0d\x8e\xa9\xc2\xcf\x34\x19\x63\xad\x6c\xcb\x78\xe2\x5d\x8d\x0b\xd5\x55\x1d\x99\x35\x91\x5a\x52\x77\x7c\x9e\xb8\xdc\x42\x7d\x6a\xee\x28\xc6\x61\x9f\x03\xc4\x34\xcf\x3f\xce\x82\xa4\xb3\x09\x4e\x64\x1f\x71\xab\x73\x61\xbd\x2f\x08\x6b\xab\x0b\xb1\x5b\x51\x8e\x81\xc5\xfd\x25\xb8\x69\x16\xa8\x0c\x92\x4b\xe1\x78\x47\xb8\x23\x4d\xca\xd1\xda\x17\x78\xdd\x4f\x42\xae\xfe\xe7\x34\x14\x4d\x2e\x73\xe1\x48\x3d\x27\x23\x3a\x49\x33\xda\x77\xe8\xea\x95\x38\x3a\x54\xe3\xfe\x4a\xec\x41\x35\xa4\xf5\x0a\xf6\x79\x03\xf9\x6a\xfd\x3e\x14\xa6\x62\xf3\xe0\x82\x87\xad\xbc\x88\x8a\xcb\x21\x79\x0a\x2a\x6c\xb9\xeb\x44\xb9\x70\x69\x0c\x45\xbb\xf6\x26\x83\x26\xb9\xb3\xc1\x20\x76\x8d\xa2\x78\x3a\xab\x0b\x5b\x65\x85\x21\xdd\x19\xa3\x1d\x76\x0a\xe1\x48\x6b\x7b\xab\x80\xf8\x4a\x7f\xff\x70\xf4\xb6\xaf\xb0\xcc\xdb\xd3\x0e\x2c\xc1\x75\x6c\x4e\x02\x3b\x94\x67\x8f\x2c\x82\x3c\x67\xbc\xab\x98\x65\xe9\x72\x3a\x33\x57\x80\x1a\x88\xa0\x35\xa8\xd5\xbd\x9c\xd4\x5c\xed\x11\x9c\x96\x3c\x32\x6f\xe9\x88\x25\x80\x78\xdb\x61\x56\x57\x53\xdb\x99\xb4\x1f\x45\x15\x90\xce\x7a\x94\xff\x18\x25\x51\x41\x2d\xa4\x5b\xdd\x00\x09\x11\x75\xc2\x94\xb2\xdc\x8e\xa2\x75\xf1\x5e\x6c\x2a\x7c\x1d\xb0\xf3\x52\x02\xdc\x9f\xfc\x4c\x6d\x41\x6a\x4a\x0b\x08\x57\x7c\x34\x39\x4e\x22\xaf\xb6\x0b\xca\x16\x33\x2a\x7e\xa8\x05\x47\x8a\xb4\xa7\xb4\x53\xca\x21\xba\x37\x6a\xa3\xea\x87\xaa\xa6\xc3\x3b\xd3\x85\x22\xe0\xb6\x2b\x27\x34\xcb\xd2\x4c\xba\xa4\xe1\x3d\xce\x49\x92\x16\x64\x9c\x66\x19\x1d\x17\xc3\x73\xb5\x6e\xcc\x5e\x1b\x0b\x88\x15\x94\x24\xb0\xe4\x99\xf0\xdf\x33\xf8\xaf\x5f\xa4\xaf\xd3\x73\x9a\x1d\x04\x39\xed\x00\x73\xe1\xfa\x5e\xcd\xc7\x18\xd4\x3f\xc4\x2d\xb3\xb8\xba\x39\x61\xff\x9f\xea\xa3\x38\x02\xc1\x7e\xbf\x31\xe1\x71\x4f\x64\x09\x3d\x27\x2f\xd9\xa8\x3a\x6d\xb8\xea\x85\x8e\x80\xad\xea\xbf\xdb\x05\xa1\x17\x51\x5e\xe4\x3d\xb2\x88\x69\x90\x83\x58\x0c\x23\x4f\x13\x85\xaa\x49\x1a\xc7\xe9\x79\x94\x4c\xa1\x64\xce\xb8\xa0\xb5\x8c\x44\x0f\x7b\xe0\x5f\xa1\xa7\x9f\x7d\x54\x44\x89\x55\xbd\x07\xef\x57\xa6\x57\xe1\xe0\x33\x85\x45\xc8\x19\x3e\x5c\x46\x47\x60\x4f\xab\x98\x2c\x27\x01\xc6\x6a\xc1\x57\x05\x9f\x78\x8e\x5a\x41\x59\xef\xd2\x3c\x8f\x46\x31\x9f\x42\x70\xa1\x21\x8c\xfa\x3e\x1c\x32\xf9\x32\x2b\xf8\x4f\x26\x52\x4b\x6c\xbd\x9c\x4c\xa2\xe9\xa5\xf8\x38\x92\xa4\xf4\x88\x7c\x66\xcd\xf3\x3f\x7d\x5d\x05\x9f\xe2\x66\x8b\x83\xcd\x35\x98\xba\x5c\xe2\x9f\xf2\x2a\x8a\xc3\x4d\x35\x9c\xba\xff\xe1\x9f\xe2\xc2\x48\xe7\xf1\x02\x8f\x1e\xa9\x85\xa9\xef\x71\x78\x81\x5f\x83\x51\x6a\xe4\x79\x4a\xc8\x7b\x18\x3e\x00\xb8\xbe\xc1\x79\xbc\x04\xea\x05\x2a\xcc\x3f\x05\x16\x10\x08\xb1\x20\xd0\x07\x5c\xa6\x08\x84\x50\x8d\xc3\x29\xfa\x5d\xc8\xdf\xb6\x48\xc1\xf9\x82\x75\xf2\xbd\x52\x72\x3a\x27\x87\x71\x90\xb0\x93\x41\xa0\x58\xb3\x48\x17\xba\xb2\x34\x23\x01\x79\xf5\xf2\x9f\x70\x08\x97\xd2\xda\x9d\x31\x14\xb5\xcf\xca\xa3\xdd\xcf\x33\x2a\xfd\xec\x05\xe8\x2a\x57\x44\x41\x41\xc1\x02\xd8\x7a\x0a\x72\x72\x4e\xd9\x02\xd1\x0e\x56\xe4\x30\xd6\x90\x34\xf4\x33\x35\x8e\xe4\x72\x9c\x98\xa5\x70\x51\x87\xd5\x2c\x99\x04\x16\x8a\x78\x09\x1c\x35\xd6\xe4\x54\x9c\x3b\x59\xf2\x10\xde\x86\x45\x05\xe4\x99\xd1\xc8\x10\x7f\x21\xc9\xaa\x76\xf9\x06\x1c\xc7\x9e\x15\x7c\x4e\xa3\xfb\x05\xfb\xdf\xb2\xc4\x8b\xb4\x6a\x81\xa3\xf3\xc2\x6f\xb6\xd4\xd9\x6a\xfb\x1d\x17\x3b\x20\xe4\x6e\x96\x7a\x11\xcd\x69\xfe\x7b\x2c\xf3\x44\x28\x17\xd9\xe2\x56\xaa\xaa\x9c\x1f\xf3\xd9\x16\x4d\x94\x29\x8b\x43\x0d\xaa\x23\x8d\x68\x42\x53\x81\xbc\x3a\x64\x53\xaf\x49\xc1\xac\x4d\x39\xb9\xd2\x15\x68\x00\x85\x7e\x6c\x7b\x63\x4d\x42\xcd\xf1\xe7\x1b\x26\x03\xc2\xaa\x97\xe5\xc5\x8f\xab\x2b\xb2\xb9\xeb\x3d\xdb\x88\x7a\x9d\xb3\x09\x4f\x37\x0e\x44\x02\xe5\xb2\x27\x0f\x1e\x10\xf1\xdb\x27\xf3\xb3\x26\xed\x5c\x7c\xc0\xf0\xb9\x40\x33\x44\x31\x51\x58\xa9\x44\x36\x2f\xda\xbd\x76\x1b\xdf\xb7\x58\x8e\xd2\x7c\xa5\x31\x9d\x94\x8a\x74\x89\x0c\x1d\xeb\xa1\x14\x45\x27\x1c\x4c\x06\xf1\x50\x27\x31\x61\x35\x09\xb0\xc5\x79\xda\xce\xc9\x58\x85\x74\x71\x48\xcb\x8c\xf8\xd2\x84\xbe\x4a\xa8\x06\x9d\x91\xcd\x3a\x4d\x7d\x97\x41\x32\x0c\x7c\x84\x28\xcb\xb7\x5e\xe1\xc5\x77\x07\x39\xad\x53\x05\xb0\x46\xa2\x76\xea\x5a\x93\x5b\xfe\xb5\x60\x96\xfb\x8b\x78\x99\xeb\x2e\x88\x6f\xaf\x77\x43\x05\x64\x2a\x92\x66\x74\xfc\x39\x97\xa7\x26\xce\x22\xe5\x2d\x67\x2e\xde\xca\xc5\x97\xe0\xc6\xd7\x1b\x8c\x98\x93\xfc\xd8\x1b\x88\xd8\x0c\x29\x8c\x1a\x60\xeb\x3f\x40\x05\xb0\x63\x3b\x08\xae\x24\xa6\xce\xaa\xdc\x98\x39\x51\xde\xd2\xa0\x0d\xfe\xb3\x79\x71\xb2\xf9\xe8\xbb\xe0\xd1\xe4\xf4\xcb\xe3\xcd\xeb\xff\x19\x44\xfd\x82\xe6\x85\x02\x5f\x61\xf0\x15\x63\xfe\x4a\xa3\x6d\x30\x4e\x50\x00\x0c\xfe\xd3\xd9\xbc\xe8\x3e\xab\x1c\x28\xa6\xc0\xc1\x40\x07\xcb\xe2\xe1\xb0\xa0\x7b\xdc\x85\xb0\xb0\x3a\x9c\xc3\x43\x5e\xb6\x21\xa3\x61\x9b\x14\x2c\x3c\x01\x12\xd3\x57\x85\xb7\x33\x66\x5f\x18\xa3\x43\x60\xfb\x8f\x7e\xf4\x82\x59\x5d\x86\xd8\x5d\xed\x1c\xbc\x1d\xe7\x73\xf6\xef\x38\x58\xe4\x20\x3c\x88\xdf\x3d\xec\x9e\xd1\xee\x2d\xf7\x3a\x8f\x3a\x6b\x54\x7e\xa4\xf6\x76\x8e\x19\x1a\x8c\x67\x64\x1c\xe4\x4e\x35\x51\xce\xa9\x64\x39\x17\xb3\x83\x48\x89\xaf\xb1\xe6\x04\xc5\xdb\xca\x97\xf3\x39\x0d\x4b\x69\xcb\x6a\xee\xae\x69\xcc\xaa\xbe\x8a\xd6\x06\x03\x3e\x20\x0b\x39\x81\x2a\x29\x7e\x39\x1b\x90\xd6\x86\x08\x88\x57\x41\x0e\xae\x68\x66\xc1\x8e\x6c\xc4\xd4\xa4\x48\x59\xc7\xe7\xee\xe5\xf1\x26\xdc\x50\x12\x8b\x3c\xc0\x75\x77\x31\x23\x31\x85\xc7\xd4\x28\xfe\xde\x62\x41\x33\xd6\x5b\x39\x0f\x09\xc4\x2e\x9c\x46\x3c\xbc\x5d\x90\xd3\x79\xb0\x60\xf3\xb1\x65\xe8\xf9\x3a\xca\x7e\x01\x75\x1a\x9c\xb2\x6d\x3d\xe9\x92\x1f\xc8\xb7\x6c\x37\x17\x59\x27\xd1\x69\xbf\x48\x8f\x59\x43\x42\x13\xb4\xbe\xb7\x87\x32\x81\xe2\xab\x2b\xfc\x7e\xcf\x53\x23\xd6\x2d\x59\x35\x96\x78\x0a\x47\x6b\x52\x73\x7c\x83\xef\xeb\xe8\x0b\x8a\x4c\xdf\x88\x83\x9e\x24\xc7\x12\x5a\x2c\xd2\x3b\xa5\x45\xa9\xbc\x56\xfb\xf2\x0a\xa4\x88\x54\xc6\x8a\xfc\xec\x47\xd7\xa2\x9d\x76\x5b\xd0\x92\x4b\xa7\x06\x82\x6f\x44\xb5\x08\x68\xec\xf4\x9e\x55\x54\x41\xc7\xb2\x17\xe8\xd6\xdd\xa6\x69\x60\x79\x33\x6d\xf9\xc7\xa8\xf4\x3b\x76\xee\x99\x70\xff\xf9\xf2\x22\x4e\x91\xb8\x41\xc1\x75\x04\x6c\x92\x90\xdd\xff\x8d\xbd\x52\xea\x46\xf4\x65\xb3\xd2\xda\x9a\x2a\x69\xd3\x2a\x69\x4a\x9e\x5a\xd2\x34\x18\x69\x91\x32\x89\x32\x0a\xc9\xf6\x26\x77\x19\xf4\x48\xdc\x0f\xf2\x36\xf9\xf3\x84\xcd\x0b\xc2\x6d\x3b\x5c\xdb\xae\x5a\x52\xf6\x5f\xf6\x0b\xe7\x03\x98\x6f\x2b\xfb\xad\x66\xf4\x6b\x49\x33\xde\x6d\x4f\xfa\xd4\x95\xf8\x40\x32\x3c\xdf\x6b\xab\xb6\x59\x4f\x45\xe2\xee\xcb\x57\x9f\x09\x21\x23\x2f\xc2\x8d\x92\xaa\x51\x3f\xa6\xea\x91\xc7\x9b\xfe\x4b\x02\xe9\x87\x58\x1e\xa6\x73\x2d\xe5\xd6\xc7\xd8\xf4\x9e\x24\x7d\x37\x5f\x46\xdc\x4d\xbe\x93\xf9\xce\x80\xa4\xc3\xbb\x61\x89\x85\xb2\x6f\x49\x5e\x04\xc9\x98\x71\x11\x5d\xf8\xea\x4a\x21\x4d\x14\x86\xc7\x6b\xf0\xcb\xf0\x9b\xe1\x4d\xe5\xa6\x11\xc0\x8b\x54\x95\xed\xa6\x88\x92\xe7\xe1\x3a\x2c\x7d\x70\x6c\x8b\x1a\xa2\xc8\x13\x21\xc9\x8b\x1f\xc1\x5a\x45\xcf\x60\x34\xbc\x6f\xed\xbb\x43\x0f\xef\x4b\x63\xdc\xc8\x1e\xd7\x63\xe7\x47\x6d\x43\xb2\x2a\x7e\x64\xd1\x1b\x61\x48\x96\x68\x37\x1c\x11\xeb\x53\x51\x3f\x1c\xde\xf5\x1b\x0c\xe6\x48\xf4\xad\xe1\x62\x60\xf2\x45\xb2\x8c\x63\x08\x92\xd0\x71\x57\x08\xd8\x6d\x83\x0a\xc3\x33\x76\x71\x5d\xdb\x70\xe4\x23\xde\xd9\x06\xec\x80\x03\xde\x84\x19\xf0\xa4\x1b\x4d\xa4\xe8\x5e\xd3\xd1\x80\x07\xc0\xfa\xb1\x38\x01\x35\x1a\x8e\xc4\x0d\x8a\xd1\x90\xa5\x41\xc1\xca\x31\xd8\x07\x12\xbe\x8f\x82\x89\x5c\x2a\xa9\xce\x1c\xc4\xdf\x73\x73\x5d\x69\x03\x84\xca\x31\xb0\x62\xf6\xa3\x01\xe5\x39\x29\xbb\x74\xf7\xa9\xf5\x75\xb8\x98\xe4\xaf\x70\xb5\x2d\xeb\x35\x19\x43\xd4\xa7\x0e\xf5\xec\x6d\xf8\x38\xba\xca\xa8\x03\x31\xee\x97\x6c\x02\xe9\x72\x4e\x46\x71\x3a\xfe\x4c\x66\x34\x08\x69\xc6\x3e\xd2\xb9\x6d\xb4\x11\xe5\xcf\x59\xb2\x4f\x68\x98\xd1\x0b\xe5\x16\x1d\xca\x92\x49\x14\x17\xb6\x32\xd3\x43\xb0\x00\x6b\x78\x1f\x66\x29\x95\xe7\xfc\x6f\xb6\xb6\xf5\x41\x9f\x83\xd7\xe0\xa5\xfc\x98\xce\xeb\xc2\x55\xf9\x4e\xe9\x2e\x94\x2f\xe0\xb0\x3e\x69\xaf\xb9\xfd\xb8\xc1\xcc\xc4\x29\x13\xf3\x16\xd1\xd8\x9d\x87\x8f\x2c\xb9\x6e\x1e\x0a\x05\x54\x31\x01\x50\x93\x31\x01\x50\xac\x72\x02\x9e\x3c\xd6\xf8\xe7\xd0\x37\xc6\x3f\x54\x85\x6b\xf2\xa1\xdf\x01\xba\x11\xf6\x4b\xfc\x8e\x08\x91\x6f\x28\x7f\xf4\x64\x2a\xbc\xf9\x19\xaa\x5f\x3c\x1d\x04\xc3\x21\xff\x4f\xa6\x08\x03\x92\xa1\xfe\xc9\x73\x90\x71\xc9\x10\x7f\xc8\x72\xc7\xc5\xe4\xe9\x50\xfc\x2f\xd3\xc0\x5c\x65\x28\x7f\xe8\x7a\x38\xac\xfc\xa5\xd3\x05\xbc\xfa\x29\xea\x71\x6d\x6e\x87\xbe\x44\x0e\xed\x9a\x72\x0e\x3d\x69\x06\xac\xb4\x9a\x1c\xda\x09\x72\x1c\x3f\x53\x18\xc5\xcf\x14\x8d\x01\xd2\xc4\x0f\x09\xa7\xa4\xc5\x21\xfe\x90\xb9\xa6\xca\x7a\xe8\xa4\x28\xac\x71\x41\x7d\xa8\x7f\xf2\x1c\x24\x1d\x0f\xf1\x87\xcc\x35\x4e\x22\x43\x3b\x41\x42\xa1\x7c\x2b\xc7\x3a\xba\x0f\xdd\x24\xd9\x43\x07\xd2\x49\x92\x75\x4a\x61\x6c\x88\x7e\xe3\xfe\x26\xd3\xa1\xfa\x25\xd3\xf9\x9e\x3a\x54\xbf\xd4\xe8\xf9\x7a\x1f\xea\x9f\x6a\x4c\x6c\x97\x1c\xca\x1f\x32\x95\x6d\x58\x43\xf1\xbf\xaa\x83\xf1\xbb\xa1\xfc\x21\x53\x81\x6d\x0c\xe5\x8f\x1e\x2c\x30\xee\x9f\x4e\x3c\xea\x6e\x0d\xb7\xbe\xeb\x55\xba\xb7\xe9\xb5\x96\xc5\xe4\x69\x6b\xf8\xf4\x9b\xeb\xd3\xde\xf6\x56\x13\x87\x0f\xe6\x12\xde\xe3\x0b\xb8\x25\xfc\x1c\xb4\x86\xa4\xb5\xd9\xdf\xde\xec\x6f\xb5\xd6\xae\xa5\x27\xb8\xed\x46\x81\x8a\xef\x1d\x49\xdc\x3b\x92\xf8\x2b\x38\x92\x10\xb5\xac\xb9\xae\xe0\xfe\x4e\x27\x93\x8c\x5e\x92\x9f\xa3\x78\xfc\x99\x92\xef\x7f\xa1\x93\x89\xed\x4d\xa2\xa1\xc3\x38\x00\x8b\x82\x84\x1c\x31\x89\x3b\x00\xa8\x28\x48\x5c\xb0\x1f\x83\x11\x03\xfb\x47\x3a\xa5\x71\x5e\xd0\x38\xa6\x19\xf9\x7e\x02\x89\x2e\xf0\x4f\xc1\x19\xf9\x39\x4d\x43\xf2\xfd\xb4\xd4\xcb\xc5\x63\xed\xdd\x47\xb8\x82\x7c\x13\x24\xc1\xd4\x74\x3d\xd1\x1f\x30\x2c\x0c\x32\x0e\x30\xe7\x00\xd2\xc5\xc4\xe1\x08\x0e\x47\x36\x70\x34\x0a\x12\x09\xf2\x12\xac\xf8\x6d\x08\x2e\x79\xe5\x03\x5a\xcc\x24\xe0\x8b\xe7\x15\x70\xe1\x48\xb9\x9b\x9d\x55\xd5\x97\xcf\x54\x7d\x6f\xc1\x31\x79\x19\x60\x42\x0b\x09\xf8\x8e\x66\x39\xbc\xa4\x2a\x87\x5e\x08\x10\xd5\x89\xf3\x20\x9b\x57\x75\x83\xe5\x2b\x60\x5a\x14\x10\xb4\xc9\x85\xcf\x45\x96\x04\x95\x5c\xc5\x80\x94\xec\x82\x9d\xa8\xb4\x6f\x8f\x28\xb6\x2a\x44\x51\xe5\xcb\x5d\x84\x70\x20\xe9\x8c\x49\xbc\xdb\xa0\x49\xe8\xe9\x1b\xcf\x90\x60\xcf\xe1\xc4\xe4\x42\x8d\x58\xba\xc2\x64\x96\x2e\x68\x56\x5c\x7a\xe0\x16\x22\x4b\x82\xbe\x2a\x8a\xc5\xbb\x2c\x3d\x8b\x42\x2f\xb9\xb1\x85\xba\x10\xd9\x8a\xd8\x16\xe3\x8a\x12\xd1\x62\x6c\x17\x68\xe6\xd0\x70\x6d\x4d\xc9\xea\x3f\xd3\xd1\x0e\xe9\xc8\x6a\x4c\xa7\xbc\x99\xbd\x42\x12\x7a\x6e\x2d\x1b\x5d\x12\xf9\xe7\x15\x91\x56\x51\xcf\x25\x14\x02\xa2\xfc\xa9\x0b\x3d\x67\xcb\x05\xfc\xf4\xe3\x2a\xc2\x91\xc8\x7c\xf1\xdc\xc9\xcb\x67\xb2\xe4\x87\x99\x5b\x32\x81\x35\xc0\x72\xdf\xd2\xc2\xc9\x5d\x68\xc2\x67\x20\x72\x1d\x38\x70\xa3\x5f\x7f\x95\x6d\x30\xba\x76\xfb\xa0\x09\x1c\x80\xc4\x67\x07\xc3\x68\xca\xd6\x47\x8d\x60\x11\x0d\xd5\x66\x28\xfe\xe7\x47\x0e\xdc\x49\x81\xad\xdc\x28\x8a\xc9\x67\x68\x7c\xf5\x14\x0c\xa2\x97\x21\xfe\x70\x9a\xf8\xa4\xd6\x00\xff\xe1\x0c\x50\x00\x74\x74\xfb\x82\x9c\x23\x9a\x0f\xd1\xef\x0e\x37\xe6\xb9\xee\xee\x32\x89\x69\x30\x00\x0f\xbc\x39\x25\x7a\x0c\x29\xdf\x89\xc1\x25\xd0\x1a\x23\x37\xcf\xf8\xea\xc6\x56\x3a\x2e\x26\x34\xca\x3a\x65\x38\x4d\x8a\x29\x0f\x87\x0c\xae\xa7\x71\x5c\x78\x65\xd2\xf6\xf4\x25\xa3\x3c\x56\x84\xee\xc5\x67\x4a\x17\x87\xf9\x87\xcb\x64\x1c\x25\xd3\xca\xae\x40\x59\x0b\xbe\x19\x05\x7a\x3a\x82\xf9\xc2\x73\x6d\xbf\x62\x41\xc9\x57\x30\xdc\x9b\x14\x7c\x79\x60\xe4\x8b\x59\x09\x05\xdf\x1e\x38\xf1\xec\x5a\x82\xb1\x4f\x07\x0a\xbf\xc0\xe5\x80\x2a\xc5\x0b\x6b\xd4\x29\x13\x3c\x6d\xeb\xe7\x54\xb2\x79\x91\xe2\xad\xd5\x86\x46\x69\x9e\xba\x31\x2e\x65\xed\x55\x38\xe5\x16\x8e\x12\xf2\x67\xea\x1f\x19\x86\x12\xdf\x0e\x1c\x36\x6c\xe1\x90\x2a\xc5\x03\xeb\xde\x0a\xcb\x32\x07\xf6\x6d\xa1\xd3\xe7\xb2\xb2\x4e\x8e\xa7\xdd\xc3\xe7\xfb\x6f\x51\x63\xec\xd3\x81\xd2\xde\x69\x38\x98\xf8\xf6\xc1\x49\xc7\x29\x0a\x10\x12\xd8\x2e\x66\x2f\x7c\xbe\xf5\xe3\x87\xdc\xfc\x52\xc8\x74\xae\x68\x5e\xd7\xc1\x9d\xb4\x0d\x59\x76\x7d\x1a\x46\x19\xa8\x8a\xc7\xc1\x02\x1e\x5f\xa0\x0b\x4c\xcf\x8c\x1e\x1e\xec\xbf\x33\xd6\x3e\x2b\x87\x2d\xe4\x22\x2e\x4a\xb2\xe5\xcb\xa4\x4a\x9e\x6f\xbc\xf5\x64\x10\x7d\xd1\x8c\x5c\xd9\xe0\x4f\x46\xf1\xdf\xaa\x80\xa3\x27\x8a\x77\xc3\x5e\x27\xc4\x91\x8e\x79\xe7\x9c\x80\x0e\xa6\x2d\xf7\xa4\x24\x0d\x69\xbb\x67\x40\x4c\xc1\x2e\x64\x48\xda\x4c\xe8\xf8\x34\x8e\x23\x9a\x14\xff\xe0\xe0\x6d\x7d\x27\xdd\xed\xdd\xa4\x35\x5a\x9c\xa7\xd9\xe7\xb2\x06\x13\x5a\x7c\x12\xa0\x16\x88\x19\x2f\x60\x68\xaf\xf2\x5b\x76\x8b\x0a\x85\x76\x59\xbf\x68\x31\xfb\x04\x73\x3d\x4e\xe3\x7f\xfc\x0e\xfd\x3b\x9f\x45\xf9\x42\xb9\x46\x76\xba\x97\xcf\x66\xb7\x46\x1b\xfc\x3c\xf5\xee\x25\x51\x7e\x90\x26\x09\x77\xd9\x84\x96\x5b\xd7\xa0\xbd\x8e\x77\xbb\x7c\xf0\xc0\xbb\x8d\xe2\x2a\x3b\x5d\xff\x0e\xc6\x9d\x14\x48\x99\xbc\x94\xe6\xc1\x38\x14\x02\x27\x08\x89\xc6\xab\xb7\x65\x75\x4b\x67\xa2\xf8\x84\xc0\x55\x4e\xc6\xc1\xa2\x35\xdc\xde\x64\x49\xf8\x48\xd2\x1a\x6e\x6f\xb1\x34\x7d\x1c\x68\x0d\xb7\x1f\xab\x14\x2e\x3a\xb5\x86\xdb\x4f\x55\x12\x16\xee\x5b\xc3\x9d\x6d\x95\xc1\x56\x78\x6b\xb8\xb3\xa3\x13\xb4\x50\xdf\x1a\xee\xe8\x4a\xf5\xb1\xb0\x35\xdc\xf9\xd6\x49\xa6\xc5\xac\x35\xdc\x79\xea\xa4\x27\xb4\x68\x0d\x77\xbe\x73\xd2\xa5\x20\xdc\x1a\x3e\xde\x74\x32\xf3\xd9\xac\x35\x7c\xbc\xe5\xa6\x33\x59\xb8\x35\x7c\xac\xbb\x2f\xcf\x38\xad\xe1\xe3\x6f\x54\xa2\x79\x70\x6e\x0d\x1f\x3f\x51\x59\x52\x6a\x69\x0d\x1f\x7f\x5b\xad\xdb\xbb\x3e\xed\x6d\xef\xdc\x6b\xde\xee\x35\x6f\xff\x2d\x9a\xb7\x20\x8e\xc1\xbf\xc4\xed\xdc\xb8\x22\x05\x97\xa3\x0a\xf1\xe9\x42\x64\x94\x98\x97\x67\xdc\xa2\x1f\xe9\x18\xa0\x37\x12\x4e\xc7\x8c\xa9\x0b\x8e\xe4\xea\x69\xbc\x8a\x9a\x1f\xe1\x72\xd7\xaa\x0c\xd2\x24\xc4\x39\x0f\x7d\x64\x82\x48\x56\x24\x32\x95\x73\xd7\xfd\x38\x36\x86\x62\x0a\x46\xe6\xd1\xaa\x07\x37\xf5\x3d\x62\x99\x96\x95\x28\x3d\xcc\x04\x7c\x44\xfe\x85\x5f\xce\xb3\xff\x70\xb2\x63\x2e\xc9\x37\x21\xa7\x87\xd5\x51\xbe\x2d\xa9\x55\xba\x03\xdf\x53\xbf\xae\xae\x20\xfc\x0d\xb1\xdd\x3e\xb0\x44\x48\x3d\x69\x33\x29\x14\xc2\x0a\xb4\x7b\xa4\x5d\xa4\xfc\xe7\x69\x9f\xa3\x19\x85\x3b\x9c\x78\x6e\x43\x45\x33\x27\x93\x53\x30\x70\x51\xf6\xa1\xe2\x86\xb4\xeb\x89\x99\x6d\x55\xc3\xfa\xc3\x8a\xef\x21\xe2\xe1\x1e\x74\xa0\x23\xfc\xbc\xa4\x63\xe0\xe9\x06\xa5\xcd\x82\x7e\xb7\x05\xae\x28\x34\x5e\x0d\x3c\x9b\x8f\xbb\xb0\x73\x8a\x2a\x8c\x7b\x82\x16\x87\x41\x11\xc8\x11\xb0\xdf\x7d\xf6\x0f\xd9\x43\xbf\xaf\xae\xc0\x28\x56\x01\xc0\x55\x72\x2e\x41\xc4\xd7\xd5\x95\x0e\xbe\x09\xda\x46\xd6\xb4\xbc\x23\x47\x80\x27\x9b\xa7\xfd\x9c\x31\x04\xe5\x61\x9d\x41\xcf\x85\x80\xa3\x29\xcc\x9d\xae\x5f\x3c\xd3\x85\x5b\xd9\x13\xa6\xb6\x42\xba\x73\x2f\x6d\x3b\xbf\xa8\xe7\xe9\xdd\x93\xcd\x53\xf4\xf0\x6a\x1d\xda\xef\x92\x2f\xf0\xd4\x21\x48\x92\xb4\x20\x93\x28\x09\x79\xbf\xa2\x64\xca\x1b\x7a\xa6\x9a\x1f\xa7\x49\x9e\xc6\xb4\x7f\x1e\x64\x49\xa7\x8d\x4b\x70\x67\x39\x8c\x15\xc7\xe9\xb4\x8d\x4c\x5f\x45\x8f\x19\x2a\x1c\x87\x4b\x54\xb0\x21\x1c\x98\x0b\xe6\xae\xe3\x5b\x9d\x3d\xde\xad\x9e\x49\x10\xe6\x11\x0a\x6a\x94\xbe\x0e\x61\x8a\x1b\x2c\xc7\x0b\x3a\x66\x12\x80\x67\x3d\xf6\xc0\x21\xd3\x28\x18\x7f\x56\x21\x44\xc1\x13\x81\x38\xec\xca\xeb\xd6\x4e\x90\x4d\x97\xf0\x12\xe4\x44\xfd\x42\xce\x78\x4c\x2b\x74\x59\x23\x84\x7e\xae\x2c\x86\xdd\xc6\x75\x1c\x08\x36\xf1\x5b\xa6\x1b\x0b\xcd\x36\x92\x65\x1c\x3b\xe8\x4e\x25\xa5\x09\xe7\x77\xfa\x00\x2c\x21\x26\x28\xc8\x1a\xd7\xcc\x02\x26\xfb\xa3\xc8\x54\x1a\x22\xf1\x9b\x73\xf6\x4e\xda\x83\x83\x52\xbb\xe7\x65\xac\x3d\xc9\xde\xd9\x61\xab\xd3\xed\xe9\x86\x10\x86\xeb\x67\x2a\x28\x8a\x60\x3c\xfb\x98\x1e\x48\x3f\x58\x78\xca\xa4\x73\x2c\x7c\xe6\xd6\x53\xcb\xc7\xcd\x3f\x9d\xe1\xc8\xa2\xfd\x20\x8e\xd5\x7e\x22\x80\x4b\xce\x14\x4e\x37\xd5\x01\xc3\x73\xc2\xf0\x1e\x31\x80\x54\x5b\xc3\x6d\x90\xee\xf9\xaa\x6f\x0d\xb7\x41\x76\xc7\x21\xdb\x76\x00\xd8\xda\x08\x5b\xc3\xc7\x3b\x4c\x64\x7e\x7c\x2f\x32\xdf\x8b\xcc\x7f\x6d\x91\x19\x45\x7b\x81\xb3\xf7\x5d\x85\x7b\xf9\x7b\x9e\x26\xd9\x62\x6c\xca\x9b\xbf\xf0\x44\x75\x75\x98\x65\xa9\x2d\x02\xf3\x34\x25\x89\xba\x2a\x0a\x36\x58\x43\xc8\x74\x64\x4c\x40\xc7\xa7\x52\x49\x53\x64\xe4\x22\xae\x77\x8d\x9f\xc0\x20\x0c\xa5\x4b\x47\xc6\x8e\x45\x61\xf0\x92\x0d\x5d\x13\x09\x96\x45\x60\x10\x86\x1e\x1b\x5b\x22\xc6\xcf\x0b\x15\xda\xba\x75\xb0\x06\xe3\xc4\xac\x38\x0c\x7d\x32\xb7\x6f\xe0\x39\x0f\x0a\x2e\x21\x6a\x47\x24\x99\x76\x55\xff\x05\x8c\xb7\x6b\xbe\xfd\xdc\x74\x2e\xa0\xf0\x6b\x74\xd3\x9d\x02\x7d\x4f\x94\x84\x5c\xcd\x24\x61\x7b\xa8\x6e\x9a\x65\x3d\x21\x89\xe6\xae\x4c\xcc\xc9\x87\xff\x12\xc2\xa2\x06\x10\xf8\xc1\x1e\x26\x15\x2a\x7b\x04\x5e\xb7\x97\x3c\x60\x13\x55\x9e\x00\xcc\x29\x3e\x1e\x94\x0a\xec\xbc\x48\x49\xb5\x4c\xac\x91\xfd\x11\x95\xf6\x1d\xd9\xc7\x2e\xb0\x2e\x16\x51\x3f\xca\xff\x11\xc4\x51\xf8\x9e\xe6\x8b\x34\xc9\xa9\x68\xca\x79\x7c\xe7\x8c\xc1\xdf\x5e\x87\xaf\xb1\xfe\x61\x72\xe6\xad\x75\xd7\xa9\xf4\xda\xed\x5f\x69\xe5\xdc\x65\x93\x33\x58\xbe\xe7\x82\x6b\x08\x5f\x86\x68\xbc\x2f\xfa\x00\x4e\x23\x70\x82\x13\xc4\x5e\x4f\x85\x3a\xdf\x10\xbf\x28\x01\x94\xa5\xf5\x93\x7c\xf0\xad\xe1\x36\xe8\xd1\xc4\x8a\x6c\x0d\x77\xc0\xea\xad\x51\x90\xef\xfb\x0d\xff\x7e\xc3\xff\xf3\x6e\xf8\x7a\xbf\x57\x62\xf9\x1d\xa9\xc8\x1a\xea\xaa\xd8\x89\x27\xb3\xc0\x72\x21\xeb\x0f\x20\x73\x55\x75\x9a\x84\x43\xef\xa6\xb0\x1e\x4c\x3e\x88\x12\xd0\xfb\xe8\x10\x82\xc0\x94\xc6\xd0\x88\x38\xee\xdb\x3f\xb9\x7a\x09\x3f\x32\x83\x6d\xde\x7e\xa7\xcc\xe1\x0e\x34\xd8\x3b\x09\xa5\xe4\x02\x30\xf6\xbd\x26\xd2\x95\xb3\x99\xea\x6d\x40\x38\xfb\xf5\x57\x6d\x3e\xf5\x1c\x45\x3d\x51\xce\xba\xd5\x09\x46\x91\x47\x0d\x82\xdc\x3e\x13\xcb\xcf\x32\x8f\xef\xbd\xb7\x47\xda\xa8\x4f\x6d\xf2\xe0\x81\xe1\xc7\x19\x9d\x9b\x79\xb3\x86\xb3\xff\xeb\xae\xb5\x0d\x57\x35\xe8\xf1\x0c\x4d\x3a\x90\x58\xb2\x5d\x43\x1e\x77\x18\xed\xd9\x19\xac\x8a\x18\x58\xee\x69\x1a\x68\x4f\x1c\xde\x39\x42\x39\xa8\x42\x23\xd2\xf2\x48\xed\x55\x03\xe9\x51\xc5\xf3\x12\x9e\xa2\xf8\xd1\xda\xfb\xb2\x29\x08\x43\x49\xc3\xb9\x3e\x86\x63\xda\x90\x69\xd7\xaa\xa6\x52\x7a\xe2\xa4\xe2\xaf\xb2\xf2\x64\xaf\x8f\xeb\x37\x27\x14\xf4\x0a\x71\x95\xd9\xc7\x9a\x2a\xa5\xfd\x51\xfd\xf9\x44\x8b\x99\x54\x37\xeb\x4e\x9a\x7e\x2f\x6a\x55\xa9\x13\x47\xcd\xa1\x11\xa0\x55\xa5\x0d\xe6\x95\x73\x8b\x46\x93\xca\xf9\xcd\xdd\xcd\xa8\x5d\x5f\xbd\xa2\x46\x32\xbc\xbb\x98\x5b\xce\x7b\x2d\xb5\xb2\xe0\xac\x42\xdb\xa8\x78\xac\x39\x79\xae\xde\x8a\x77\xac\x74\x3a\xf7\xe3\xb8\x72\xba\x00\x48\x5c\xf4\xac\x4c\x60\x5c\x15\x5a\xd3\xc1\xd5\xa9\xcd\x78\x14\xe8\x2a\xd5\xca\xa8\xad\x8a\xdc\x94\x9b\x1c\xb0\xfd\x93\x93\x3e\xa5\x45\x2e\x8c\x57\xe2\x4b\x12\xd2\x45\x9c\x5e\xd2\x50\x9a\x08\xc2\xf3\xc1\xf1\x2c\x88\x12\xfb\xb9\x1a\xd4\xf6\x63\x9a\xc9\x1e\x79\x7c\x0f\xc8\x03\xab\x8f\x24\xe5\xba\xbc\x56\xaa\xc5\x35\xc3\x43\xee\xb1\xbc\xdc\xd0\xcf\xda\x4a\x5a\xc4\x06\x0f\xb2\x25\xa4\xb0\xd4\xe4\x0b\xf1\x9a\x21\x90\x8c\xa3\xe6\xfd\x11\x82\x94\xef\xc9\x87\x65\x90\x3f\x18\x90\xf3\x20\xe2\xea\x72\x10\xb9\x16\x85\x56\xc1\xca\x9b\x32\x73\xde\xc5\x52\x50\xf1\xa2\x75\xc7\x68\xd7\x74\xbc\xbc\x4e\xe1\x69\xb2\xd1\xbe\xbd\x2b\x41\x7f\x37\x36\x76\xcd\x63\xd3\x60\x40\xf2\x22\x5d\x70\x5d\x6d\x94\x4c\x49\x30\x61\x5d\xf9\x66\x93\xcf\x55\x4e\x3a\x45\x34\xa7\xe9\xb2\xe8\x3a\x47\x47\x8e\x80\x1f\xc8\x37\x9b\xde\xc3\x22\xef\x7d\x9f\xd5\xfe\xb3\xa8\x5c\x87\x54\xe8\x92\x2f\xd7\x9e\x33\x9d\x8d\x40\xfe\x60\xcf\x7b\x0e\x55\x33\xe2\x3d\x6d\xea\x93\x9f\xf6\x0b\xac\x18\x13\xdc\x97\x04\x7c\x65\x8c\x19\x61\x83\x8f\xe0\x11\x93\x98\x97\x49\x68\x63\xa0\xed\x3b\x7c\xd2\x18\x39\x14\xc1\x7f\x8e\x37\xe2\x1b\xb7\xca\x96\x1f\xae\x59\xf9\x13\x71\xb1\x66\x50\xcd\x94\x16\x1f\x75\x53\xef\x39\xa9\x69\x8e\x82\xba\xf1\x2a\xc8\x67\x98\xa8\x7a\x92\x30\xbb\xfe\x23\x7c\x34\xe9\x08\x00\x3f\xb5\x79\x0b\x79\x3b\x08\x11\x8c\x44\x5d\xfd\xb1\xb9\x00\xcd\x1e\x41\x98\x23\x7f\x77\xe4\x5f\x99\xf3\xf6\x27\xca\x79\x7b\xd9\x5f\x34\xe9\x98\x14\x77\x75\x45\xd6\xa1\xc5\xca\x62\x44\xb1\x6e\x0f\x6d\xe2\xbf\x9b\x2c\x01\xfc\xd7\x70\x39\xd8\x43\x4a\x43\x14\x21\x7a\xa7\x72\x66\xe4\xdf\x60\xa0\xee\xf9\xe2\x74\x8a\xa8\x16\x8e\x15\x92\x8d\xaf\xb7\xbb\x35\xcd\x13\x43\x54\x53\x1c\xb5\x64\xaa\x1b\x54\x36\x18\x10\xbe\x59\x49\x71\x21\x48\x42\x22\x6e\x46\x48\x30\x0d\xa2\x44\xac\x9c\x73\x2a\x02\xfc\xd5\xfc\xf9\x65\x4f\x7b\x03\xac\xa9\xc1\x96\x75\x9c\xed\xbf\x66\x48\x63\xee\x96\x4d\x5c\x0a\xb2\x2d\x81\xed\x8e\x39\x1d\xa7\x49\x48\x18\xc3\xad\xad\x04\x91\x6e\x3d\xb1\x12\x83\x23\x82\x2e\xac\x69\x87\xbd\x5e\x8c\xee\xb8\x43\xd8\x75\x3b\x12\x25\xc4\x89\x16\x71\xca\xbc\x48\x33\x1a\x2a\x37\xee\x5c\x02\x01\x8d\xcf\x34\xc8\x49\x30\x67\x1b\x52\xdf\xcb\xaf\xed\xbf\x52\xfe\x6d\xff\x79\xbc\xcb\xdf\x45\x17\xab\x7b\x78\x5d\x9a\x5b\xc6\x31\xdc\x12\x36\x24\xd2\x4e\x36\x3d\x50\xa0\x2b\x06\x49\xe8\x3f\x06\xec\x98\x7d\xa9\x7c\x69\x58\x52\x9c\x05\x56\x73\x68\xb0\x2b\xc5\x07\x06\x38\x55\x05\xa3\xc8\xb8\x5c\xe0\x2f\x8a\xa8\x3c\xbe\x43\x5a\x30\x8a\xc8\x1e\x83\x94\x72\xd6\x43\xae\x09\xad\x1f\x93\x3e\x21\x25\x24\x40\xa2\xa9\x28\x2e\x6b\x91\x63\x4b\xe8\xb9\x4a\x92\x63\x4a\x2e\xaf\x31\x31\x58\xba\x91\x2d\x69\x53\x10\xc4\xdd\x15\x8b\x6e\x57\x14\xb5\xe5\x60\x43\xb2\x10\xbe\x4e\xa4\xa2\x38\x74\x4a\xfb\x24\x65\x01\xa1\xa4\x65\x7d\xfc\x93\x49\xaa\x2d\x3d\xf1\x50\x68\xa0\x27\x82\xa1\xd4\x77\xfd\x42\x2a\xb6\xe8\x6f\x65\x0d\xec\x4f\xfd\xe0\xd2\xb5\x3a\x45\x62\xfa\xeb\x48\x3a\xe8\xa9\xd9\xc7\x1c\x6c\x30\xe0\xa1\x15\xb5\x95\x85\x51\xa9\xb6\x95\xf8\x72\xbd\xcb\x80\x25\x96\xd6\xcd\xb6\x05\x62\x50\xc5\x70\xc6\xcd\xe0\x2d\x0e\x10\x32\x7e\x94\x10\x47\x63\x0a\x57\x0d\xda\x5e\xc3\x8a\xfe\xe7\xb3\x1d\x01\xfb\x8f\x72\x8b\x11\xe2\x58\x8d\xe4\xfd\x45\xba\x30\x1c\xcc\x99\xdd\x8b\x83\xbc\x10\x90\x4e\xd5\xfe\xee\x70\x42\xea\xb0\x82\xe0\xbc\x68\x5d\xbd\x38\x81\x38\xb4\x90\x6e\xf7\x49\xa3\xb0\xa6\x4b\xac\x21\x01\xdc\xe7\x41\x49\x7e\x20\x9b\x76\x6d\x62\xa6\x25\xed\xef\xcb\xb5\x5c\xaf\x05\x90\x7f\xb7\x52\x09\x22\x34\x59\xcc\x52\xaa\xd3\x94\xa9\x1d\x1e\xd6\xba\xd9\xe5\xfe\x22\xb8\x0c\x46\x31\xf5\x75\xcf\x3d\x0e\x70\xfb\xa9\x9c\x26\xa1\x0e\x48\x95\xa4\xc9\x23\x51\x09\x46\x87\xbd\x4d\x5c\x97\x4d\x3d\xf8\xf6\x63\x9c\xd1\xaf\x82\xed\xc8\xa5\xd2\x83\x11\xa3\x5a\xe5\x04\x81\xed\xdb\xc6\x1e\xaf\x68\xd7\x9c\xc4\xd2\x1b\x41\x7c\xa2\x35\x74\x00\x52\xee\x83\x58\x08\xa6\x96\x20\xa4\xe4\x3c\xc8\x95\x40\xb9\x66\xe2\x8a\x2f\x6d\xb8\x7a\x45\x47\x18\x6d\x98\x65\xdd\xbf\xce\x82\x7c\xe6\x43\x3a\xeb\x35\xcd\xb2\xb2\x9b\x48\x7c\xe5\xe8\xbb\x57\xac\x92\x78\x98\x38\x1a\x86\xfc\xda\x0b\x71\x5d\xd6\x13\x7f\x5b\x25\xc7\x2e\xb2\x07\x65\x4a\x84\xaf\x52\x09\x71\x12\x65\x79\x51\x2e\x20\xae\x28\xe3\x95\x68\x40\x7c\x6a\x0f\xdf\xf5\xab\xf1\x55\xe7\xf8\x12\x02\x6d\xf2\x81\xd7\xcd\xb3\xd5\x58\x53\x94\xd7\xa2\x7a\x95\xa1\xfb\x79\x9a\xd2\xc9\x73\x20\xa1\x2b\x13\xd8\x95\x9b\x20\x3b\xdf\xbe\xe0\x76\xa5\x90\x24\x3e\x0d\x03\xb4\x1b\x0b\x5e\xb6\xd6\xac\x4e\x3b\xeb\xd9\xd4\x45\x4d\xd7\xa6\x0c\x34\x51\xf5\x0f\xd6\x06\x03\x6b\x07\x36\x2e\x70\xb4\xcb\x63\xa4\xbe\xb4\x2a\xef\xf0\x7d\x79\x30\x30\x7c\xe9\x96\x86\x9d\x1e\x8f\xc1\x2d\x6e\xca\xe3\x34\x45\xc9\xb4\x42\x36\x33\xd5\xd8\xe6\xc8\xf9\x24\x5e\xbb\x9c\x08\x8b\x43\x55\xa2\x10\xf9\x82\xa4\xae\xa6\x12\xd1\x84\x24\xa9\xae\x81\xb1\xb7\x45\x90\xe7\x34\xec\xb1\x2a\xb4\xeb\x3b\x06\x91\xa3\x25\x6d\xf2\x32\x45\x78\x30\x03\x16\x3a\x0d\x73\x48\x9f\xef\x54\xd3\x66\x95\xac\x2c\x43\x69\x4b\x79\xad\xad\x2c\x66\xc8\xb5\x24\xc4\xaa\x81\x08\x61\xd2\xa8\x40\x75\xa9\x27\x0b\x8c\xe8\x38\x58\xe6\x94\x9d\xc4\xc3\x34\x69\x17\xe4\x3c\x48\xc0\x28\x29\x5f\xa4\x51\xcc\xaf\xc3\x93\x82\x66\x93\x60\xac\xbc\x63\x37\x38\x8a\x37\x39\x6e\xdb\xfb\x54\x3d\x43\x24\x8e\x7f\x5d\xb5\xa8\xd1\xe2\xfc\x89\x16\xdc\x5d\x33\xdb\x20\x7b\xe4\x7c\x16\x8d\x67\x60\x35\xc0\xd6\x77\x91\x8a\x7d\x8c\x2c\xe2\x65\x5e\x7f\xf7\x2a\x18\x41\xcd\x04\x6b\xee\xe1\xb7\x64\xaa\x91\x61\x57\x17\x54\x55\xb1\x7a\x01\xf2\x36\xc2\x63\xb9\xe0\x88\xac\x95\x6f\x24\xc8\x54\x09\x31\xe6\x53\x87\x3e\xb7\x48\x6f\xce\x7d\x3d\xc7\x1e\xef\x79\xb7\xc1\xfd\x79\x19\x6f\x72\x4e\xc3\xde\x63\x70\xc9\x53\x16\xdf\x81\xd8\xdd\xfe\xb4\x61\x38\xc7\x9f\xfb\x7a\x85\x78\x4e\xd3\x5e\xbb\x25\x8b\x6e\x77\x95\xfd\xb3\x69\x2c\xd1\x1a\x7e\x5b\x66\x02\xad\x4c\x1a\x5a\xc3\xed\x1d\xd7\x26\x5a\x8c\xbc\x35\xdc\xd9\xba\x3e\xed\x6d\x3f\xb9\xb7\x7d\xba\xb7\x7d\xfa\x6b\xdb\x3e\x21\x63\x67\x61\x03\x79\x07\xd6\xce\x25\x7e\x2c\x85\x75\x25\x7f\x98\x75\x34\x91\x97\xce\xfb\xd9\x34\x1f\x96\xa8\x6e\x90\x90\x27\x8e\xb0\xa2\x12\x1c\xfb\x4e\x6e\x27\x8c\x7d\xca\x4a\x09\xb6\x71\x02\x3e\xdf\xf3\xf5\xe1\xfd\xbb\x03\xce\xdc\x6f\xd3\x01\x1e\x70\x09\x58\x2d\x85\x17\x8c\x45\x4a\xde\xbf\x3b\x10\x17\x05\xfe\x0e\x88\xf7\xe8\xe0\x45\x51\xb7\x3c\x4b\x73\x7c\xfd\xe5\x36\x7e\x70\xf4\xf6\xed\xcb\x83\x8f\x87\x47\x6f\xc9\xcb\xf7\xef\x8f\xde\x0f\xc9\x81\xd2\xff\x8e\x79\x95\xfc\x48\x1f\x52\xd2\xde\x20\xac\x3e\xb2\xd1\xee\xfb\xfb\xa0\x5d\xde\x34\x1d\xbb\x7a\x68\xcf\xb5\x08\x05\x5b\x3d\x11\xaf\xcc\xdf\x84\xb4\xa4\x1d\x12\xdb\x2a\x18\x0d\x13\xde\xa5\xd1\x3c\x0f\xa6\x94\xec\x91\xf5\x75\xf1\xd4\x90\x6d\xeb\xe2\x77\x9f\x87\x8c\x75\x52\xfa\xb2\xd8\x33\xe2\x4d\x1e\x12\x35\x5d\x7f\xff\x70\xf4\x16\x66\x25\x53\x5d\xf2\x84\x59\x15\x7d\x73\x1e\x93\x69\x1c\x88\xaa\xcd\xd1\xea\xd9\xfc\xc8\xef\xab\xf1\x78\xe7\x79\xd3\x29\xfd\x78\xf8\xe6\xe5\xd1\xf1\xc7\x21\x11\xb7\xde\x8c\xb8\x58\x27\xe7\x39\xd9\x20\x6d\xf6\x5f\x30\x9e\x31\x8e\xd1\x36\x62\xda\x08\x3f\x92\xdf\xde\xef\x56\xf7\xbb\xd5\x5f\x7b\xb7\x42\x9b\x15\x3c\xbb\xfc\xa3\x9a\xe9\x36\x7f\xcd\xde\xe8\x11\xfd\x1d\xbe\x65\x97\x4e\x87\xd8\xfa\x57\x87\x33\x1c\x93\x29\x37\x8e\x21\xe2\x91\x2d\xb4\xa5\x0f\x0b\xb6\x15\xf2\xd7\x7e\x08\xbf\x90\xb6\xbc\x48\x93\x8e\xf3\x79\xec\x0a\x52\xf1\x1e\x39\x4f\x93\x6e\xcd\x1b\x7a\x94\x99\xa4\xc9\xe5\x3c\x5d\xaa\x16\x55\x42\xc9\xe9\x4d\x22\x6d\x4a\x25\xae\x68\xc8\xe5\x01\x88\x62\xe0\x84\x6b\x12\x69\xea\x78\xf6\x3c\x4d\xe3\x6b\x08\xaf\x1a\x82\x0f\x72\xbe\x49\x50\x0e\x19\xa2\xd9\x81\x07\x22\x34\x34\x3c\xa6\xcb\x13\x1f\x44\x23\x60\x8b\x52\xd4\x3e\x58\x33\xa6\x09\xbb\xdf\x62\x10\xa6\xe7\x28\x5e\xaf\x1d\x81\x01\x21\xdf\xbd\x13\x89\x3c\xa2\x42\xd4\x17\x35\xc1\x05\x87\xf8\x5d\x62\xef\xea\x2f\xaf\x0d\x96\x4b\xaf\x88\x31\xb6\x39\x7d\x86\xdc\x07\x38\xb8\x31\xb2\x70\x1d\x6a\xf7\xe0\xde\x70\x41\xde\x0a\xca\x51\x87\xaa\xab\xf2\x12\xc4\x29\xd1\xf5\x50\xde\xd1\xf4\xda\x7c\x74\xb0\x42\x3d\x43\x2b\x84\x43\xf3\x8a\x71\xe1\xa2\xd5\xf4\xb0\xd2\x88\xa4\x2b\xf5\x1b\x0d\x27\x8f\xa6\x49\x50\x2c\x33\x7b\x38\x38\xbd\x6c\x3c\x18\xa6\x7c\x3c\x0a\xaa\x6a\x40\xe0\xc1\xa0\x79\xff\xc5\x13\x07\x49\xde\x82\x23\x05\x49\xa8\x54\x4b\x45\x0a\x41\x89\x27\x51\x12\xc4\x7e\xb3\x67\x5e\x87\xcf\xa8\x14\xaf\x6b\x2b\x4b\x54\x6f\x20\x45\xe6\xd1\x33\x9a\x5d\x16\x33\xae\xb2\x9e\x8f\x22\x60\x19\x29\x8f\x12\x0d\x7d\x13\x71\x16\x2a\xb1\xe5\xf1\x0d\x22\xba\xe3\xb8\xb6\x53\x8b\x5b\xfd\x42\xaf\x00\xef\x3d\x88\x68\x7f\x1d\xca\x41\x47\x9d\x6b\x11\xa9\xd7\x5c\xb7\x76\x1e\xb7\x9f\xa2\x72\xfe\xb2\x55\x38\x17\xe4\x8e\x3a\x25\xb5\x77\xba\xae\x4a\x53\xcc\xd3\x47\xd9\xb1\xdb\xb2\x74\x14\xc3\xa2\x92\x9f\x83\xe7\x65\x11\x4c\x5b\x94\x3f\x89\x20\xc6\x94\x65\x0d\x20\x80\xf0\xfc\x31\xba\xd1\xc9\xc9\x32\x8e\x4b\x9e\xb8\x68\xcd\x22\x71\x6f\xff\x4d\x85\x30\xd4\x57\x16\x9a\x11\x32\xad\xd1\x9c\x55\x5c\xf7\x0b\xec\x3b\x8f\x63\x3a\x7c\xfb\xea\x91\x33\xfb\xea\xbc\x6b\x07\xd7\x5b\xa9\x36\xe8\x7b\x0d\xc5\x99\x44\x32\x4e\x93\x71\x50\x74\x8c\xd9\xef\x96\x3b\xb2\x29\xe5\x7a\xc2\x8b\x4d\x39\xd7\xb3\x77\x5b\x5a\xc6\xe1\x42\x7e\xf7\xe0\xf2\x30\xc1\x15\x84\xe5\x10\x9c\x10\x78\x2d\xa1\x6a\xf6\xc1\x03\xd0\x37\x98\xbd\xa8\xde\xa6\xcb\xbd\xef\x00\x0e\xee\xd0\xfd\x4e\x90\x4d\xad\xd5\xa5\xc5\xc7\x67\x46\xc9\x21\xfe\x12\xae\x79\xb6\x90\x2b\x14\x31\x3e\x71\xff\xa2\xea\xb5\x9f\x6a\xf1\xc9\x24\x5f\x94\x94\x86\xeb\xdb\xee\xee\xb2\x95\xf9\x4b\x1a\x25\x9d\x56\xcb\xad\x5c\xbd\x8a\xe3\xe4\xc6\xf1\x84\xaf\x37\x40\x36\xec\xb0\x65\xde\xed\xe1\x1e\xe1\xab\x9a\x24\x2d\x0e\x8d\xbe\x2a\x14\x7a\x1c\x0e\x69\xe0\x86\x6d\xc3\xb3\x85\x6e\xcf\x6a\x05\xb7\xaf\x36\x12\xc4\xb5\xd3\x65\xb1\x58\x16\xaf\xd3\xa9\x66\xd7\xc2\x19\x0f\x5a\x2d\xd2\xfb\x0f\x77\x34\x83\xc4\x32\x13\x4c\x73\x6b\x18\x93\xed\x07\x8a\xc3\xf0\x5b\x2e\x83\x9f\x66\x34\x5c\x8e\x29\x9a\xab\x60\x3c\xee\x11\xe1\x8b\x12\xf3\x93\x60\x3c\x3e\x11\xc9\x9c\x27\x32\xa4\x88\x6f\x49\xe5\xcf\xcc\x29\xeb\xe7\xb3\x68\x52\x74\xba\x64\xe8\x60\x54\x66\x39\x4a\xab\x60\x3c\x96\x5a\x2a\x6e\xed\xcd\x49\x9b\xc6\xb4\xa0\x72\x1c\xda\x4b\x92\x99\xce\xa9\xea\x06\x2c\x03\xdd\x5f\x89\x87\x25\x62\x69\xb3\xad\x9e\x8b\x71\xa5\x9e\x15\xee\x4a\x2e\x32\x1a\xae\x16\x7e\x3c\x9e\x1b\x6c\xe9\xe7\x8f\xee\x92\x69\xbb\xde\x25\x53\x55\xf1\xad\x72\x23\x3b\xb3\x02\x62\x48\x80\x86\xf3\x07\x5b\xec\xb0\xfd\x3e\x39\x02\xe5\x1f\xca\x01\x54\x29\x2d\x63\xdb\xff\x06\xaf\x1a\xad\x67\x6d\xde\x27\x8d\x95\xd4\xf8\xb5\xbc\x4d\x31\x50\xf3\xe4\x5a\xc6\x01\xa5\x81\x21\xb4\x74\x82\x00\x4e\x0d\xea\xf5\x01\x60\x07\x56\x9a\x28\xbc\xa0\x27\x8a\xdd\xf3\xb6\x4f\x4b\x07\x60\x58\x4d\x78\xef\x84\x0d\x5c\x22\x97\x58\x55\x57\xc2\x75\x8e\xb2\x6e\xe8\x1b\xeb\x69\x13\x05\xfc\x6d\x9d\x5d\x0e\xfc\xba\xc9\x37\x9c\x06\x3d\xfa\xbf\xea\x48\x22\x38\x88\xc8\xda\x60\x40\x3e\x1e\xbd\x38\x1a\x92\x8c\x72\x8b\xac\x1e\xc9\x53\x61\x3a\xa3\xae\xb8\xb4\x31\x4e\xc0\x35\x5d\x7d\x56\x2e\x2a\xda\x39\x49\xe8\x98\xe6\x79\x90\x5d\xb2\xc5\x02\x21\xb0\x73\x46\x6e\x6d\x70\x58\x0c\xee\xa2\xc9\x79\x9a\x7d\xe6\x52\xde\x7c\x19\x17\xd1\x22\x46\xa1\x1c\xcc\xe0\x29\x7e\xff\x46\x83\x87\xc4\x6b\xcc\xfd\x8d\xb4\xe5\xe6\x75\x98\x66\x0c\xb2\x79\xc3\x88\x54\x37\x46\x43\xbe\x71\x98\x27\x13\x55\xaa\x2f\x71\xe4\xf3\x60\xb3\xce\x3a\x77\xe2\xc2\x9e\xfa\xce\x0f\x65\xb0\x16\x3b\x25\x8e\x81\xa3\xd9\x4f\xe1\xd0\xc9\x57\x53\x8d\x1d\xa4\xb7\x9e\xd2\x23\x94\xae\x5f\x10\xbc\x3d\x26\x07\xc0\x73\xe4\xe6\x39\x3e\x6c\xf0\x1c\xc5\xf4\x84\x49\x8f\xd9\x45\x8f\xe9\xa7\x28\x96\xd3\xc2\x0a\x15\xe3\x73\x72\x55\x79\x10\xab\x9e\xee\x88\x56\x8c\x57\xc3\x78\x86\x5c\x46\x2f\x44\x47\x39\xb9\x5c\x79\xd8\xaa\xe0\x1d\x0c\x9c\x20\xc3\x51\x7a\xd1\x37\xd8\x91\xfe\xd8\x25\x12\x40\x72\x21\xf8\x7f\x57\xa6\x2a\x96\xc3\x7f\xa8\x74\xc4\x68\xe4\x4f\x53\x8e\xa4\x17\xe2\x7d\xb7\xcb\xcd\x39\x1a\xb4\x6b\xa2\x12\xfe\x5c\xc2\x91\x5b\xc3\x1d\x70\x61\x84\xbd\x86\x33\xc6\xfc\xdd\xfd\xcd\xe8\xfd\xcd\xe8\x5f\xfb\x66\x54\x5c\x8b\x8a\x37\xbf\xff\x15\x01\xf6\xee\xd4\x65\x38\x1c\x02\x1e\x92\x83\x34\x39\xa3\x8c\x15\x05\x22\xe6\x31\x9c\x83\xe1\x2c\x00\x81\x8b\x65\x24\x17\x46\xc0\x41\x9c\xa7\x24\x88\xe3\xf4\x3c\xe7\xf1\xd9\x41\x51\x97\xf7\xd7\x58\x45\x52\xf0\x7f\x13\x5d\xd0\xf0\x9a\x67\xad\xb9\xf7\x1a\x6b\xe2\x46\xb5\x48\xed\x28\xc7\x42\x65\xa9\x0e\x9c\x1d\x53\x25\x4a\xae\xae\x64\x84\x74\x9d\xd1\x56\x3a\xd4\x76\xd7\x56\x06\xf0\xb3\x9c\x10\x91\xb8\x62\x96\xf7\xa1\x23\xf5\x8b\x46\x43\x5c\x0f\x71\x34\x01\x55\x73\x17\x6a\xdf\x74\xea\x04\x48\xc1\xf7\xf1\x93\x56\xe3\xce\x48\x46\x51\x52\xed\xc0\x91\x8b\x89\x9a\x8c\xd3\xca\xcb\x1f\xdb\x12\x36\x55\xfa\x7d\x71\xd8\xea\xb1\x49\x38\xa3\x59\x34\x01\xc7\x1e\x19\x1d\x07\x8c\xe3\xa0\x48\x35\x0f\x1e\x90\x38\xf8\xf5\x92\xc4\x69\x10\x92\xf0\x32\x09\xe6\xd1\x98\xa4\x09\xcd\xa1\x35\x31\x21\xba\x21\x11\xcd\x3a\x55\x7a\x02\x80\x92\x06\xf6\xb2\x71\x07\x8a\xcd\xd6\x94\x16\x47\xea\x90\xec\x71\xe1\xcc\x26\x46\x0b\xac\x75\xfe\x01\xb0\x32\x41\x4c\x89\x3c\x26\x97\xdf\x7a\x18\x9a\xfe\xd2\xab\x17\x9e\x9d\x9f\x47\x10\xb0\x04\xf5\x8a\x80\x0e\x22\xa7\xfc\x04\x3d\x74\x9e\x56\x71\xe1\x7d\x99\x51\xa1\x5e\xec\xc1\x05\xde\x98\xaf\x0e\x7e\x38\x9e\xd1\x0b\x9f\xda\x40\x6b\x4d\xad\x04\xcb\x15\x65\x83\x22\x86\xe6\x53\xc4\xd5\x2e\x55\xca\x5b\x0a\x7f\x19\x85\xfb\x99\x88\x4f\xce\xaa\x12\x8b\xac\x4b\x86\x72\xbd\x09\x30\x57\x56\xf2\x5d\x13\x78\xde\xd7\x41\x37\x87\x56\xb7\x7b\x0e\x1c\x5b\x02\x1a\x8a\x7d\xb9\x30\x45\x8a\xeb\x71\xf3\x03\x19\x96\x59\x02\x05\x38\x28\xb3\xdd\x1a\xdc\x5f\x0d\x57\xba\xd6\xea\xab\x72\x5d\x5f\xef\x6e\x52\xa3\x28\x65\xea\xa7\xd0\x41\x87\x53\x60\x3e\x63\x14\xe8\x41\xb8\x45\xea\x52\x55\xb3\x1f\x86\xfc\x59\x84\x52\xa2\x05\x49\x48\x72\x5a\xe4\x64\xb9\x80\x0c\x71\x1a\x01\x96\x11\x15\x34\x63\x7b\x47\x7a\x26\x84\x2d\xe1\xc7\xb4\xbf\xb6\x86\x9e\x46\xbc\x4e\xa7\xf9\x7e\xf1\xa1\x08\xb2\x62\xcd\xd6\x34\xe6\x34\x9e\xa8\xc4\x89\xfb\x80\x59\xb0\x70\xb3\x16\x23\x50\x18\x8d\x27\x8e\x13\x1f\xf9\xca\x6e\x4a\x0b\xae\xcf\x62\x85\xad\xa7\x76\xa0\x5f\xd0\xc3\xcc\xa1\x7b\x44\x9e\x3c\x2d\x9e\xc1\x5a\xe9\xfb\x18\x07\x64\x4c\x69\xd1\xb1\x1e\xfd\x08\x4b\x46\xe7\x94\x33\x18\x88\x17\x34\xf0\x4c\x94\xf5\x51\xa0\x0d\xcc\x26\xe1\xa2\x5b\x26\x4a\xb3\x23\x70\x85\xd1\xef\xf7\xc9\x2f\x4b\xee\x09\x98\xb5\xc9\x78\xaf\x73\x5e\x2e\x79\x19\x59\xf1\x2a\xf2\xda\x7e\x02\x6b\xad\x74\x35\x0c\xff\x19\x93\x67\x7a\x0f\xa6\xdc\x90\xb3\xee\x9d\x26\x7f\xbc\x63\x9a\x7d\x1a\xfd\xab\x77\xc4\xfa\xf5\x48\x77\x91\xc6\x31\x27\x1f\x3f\xd9\x0a\xda\xd4\x60\x36\x5d\x2a\x95\x08\xa8\x6d\x93\x37\xca\x0c\xd7\x20\x96\xb4\x84\x5c\xc4\x8c\xa6\xce\x9c\x4a\x23\x0b\x46\x7a\x72\xac\xbe\x49\xf0\x3d\x9b\xf2\xd1\x44\xda\xf8\x24\xdf\x94\x3a\x6e\x46\x19\xda\x4c\x19\x86\xa6\x95\xd7\xcf\xac\x04\x5d\xc9\x50\x16\x72\x49\xe7\x56\xe8\xb9\x1d\x91\x96\xea\x03\xa0\x4f\xb6\x37\x6a\xc6\x78\xde\xa5\x71\xcc\xf8\x8c\xee\x09\xa7\xc1\x21\x2f\xc2\xce\x69\x74\x4e\x93\x02\x8e\x9c\x7d\x46\x71\x30\x34\xbd\x97\x2c\x84\xa1\xfd\x09\xc7\x14\x90\xe3\x61\x78\xda\x93\x57\x54\x46\x72\x4f\x13\xa3\xc8\xc1\x7e\x8c\xb8\x82\x18\xe8\x97\x6d\xd6\x32\x6c\xa1\x43\xe2\x96\x4c\xd6\x23\x4e\x7c\x0f\xb9\xdc\x3c\xb7\x03\x3d\x71\x9a\x3a\xc8\x28\x8c\x09\xec\xb5\x0f\x3c\x2f\x1d\x81\xd9\x71\x0d\x36\xba\x70\x35\xf0\x81\x34\x7c\xab\xa8\xca\x4a\x75\x5d\xa5\xca\x1e\xbf\x52\xcd\xec\x0c\xb2\x25\x20\xa5\x2e\xe3\x4b\xad\x31\xb5\xb0\xa9\xc5\x60\x4b\xf4\x45\xd0\x0e\x1a\xcc\x04\x04\x29\x67\xde\x7d\x32\xa6\x56\x88\xb0\xac\x51\x19\x62\xcb\x3d\x28\xcb\xd7\x6c\xcf\xc9\xc2\xd7\x4e\xea\x77\x69\xbf\xfb\x09\x3d\x17\xb7\x4e\x18\x07\xd8\x59\x18\x67\x92\x51\x68\xf8\xc6\xf3\x33\xc7\x9a\x65\xdf\x19\x8f\x3c\x62\xee\x78\x54\xcb\x07\x89\xe0\xc8\xe2\x5c\x58\x41\xbd\x96\x47\x52\x97\xbd\x54\x94\xf5\x77\xa3\x5a\xef\x6c\x2c\x6d\x46\x04\xa1\xeb\x08\x10\xfb\x6a\xc8\x28\x5c\x32\xb0\x33\xc7\x82\x26\x21\x18\xb8\xa9\x49\x0e\x72\x50\xb4\x24\x39\xa3\x50\xe5\x0c\x46\x57\x94\x4e\x00\x98\x15\x62\x52\x4f\x97\x2b\x57\x54\xeb\xcb\x24\xc8\xf3\x68\x9a\xd0\xb0\xef\xf6\xd1\xa6\x28\x1f\x4f\xf6\xcd\x8e\x92\xb1\xc6\xa3\x9a\x09\xf2\x36\x83\x4d\xc6\xd0\x48\xb4\x3d\x31\x89\xb1\x74\x18\xc4\x19\x0d\xc2\x4b\xfd\x60\x5d\x0b\x8a\xf9\xed\x29\xcd\x14\x64\xa5\xf4\x5a\x37\xae\x68\xd2\xb1\x5a\x53\x4e\xe0\x36\x5d\x97\x5c\x7a\x65\x72\x2e\xee\xf3\x0b\xc9\xa4\xe8\x22\x15\x63\x8b\xe6\x73\x1a\x46\x41\x41\xe3\x4b\xbb\x59\x41\xee\xe3\xa6\xb4\x6d\x4a\x27\x50\x7d\xa7\xc4\xd5\x84\xcf\x6d\x15\xd6\x64\x73\x96\xcf\xb6\x1f\x3e\x18\x74\x97\x7b\xee\x84\xe9\xb0\x37\x73\x93\xb7\x71\xc3\x3e\xd4\x0f\xa9\x8e\x31\x98\x23\x1e\x8d\x35\x4f\xe2\xba\xd4\x1d\x08\xc2\x35\xba\x13\xbe\x6e\x3a\x10\xbc\xef\xd6\x8f\xc7\x91\x1c\xd2\x85\x14\x1c\xcc\x81\xd4\xf0\x77\x78\x5a\x3e\x4f\xcf\xa4\x4a\x93\x04\xf9\x65\x32\x56\x87\x1f\x9f\x60\xe4\xe3\xdb\xcb\x04\xde\x4e\x1b\x08\x40\x32\x86\x85\x2d\x87\x77\x61\x43\xf8\x55\x6a\x36\x04\x7f\x07\xa3\x53\x2b\x66\xbb\xcf\x7b\x82\x23\x53\x78\x4d\x4e\x54\x49\x5b\x28\xb7\x76\xd4\x12\x3b\xca\xc1\x80\x1c\x4e\x34\x67\x8c\x72\xf5\xae\xef\x92\x0a\xff\x2b\x24\x2a\x88\x76\xd3\xa5\xcb\x9d\xcf\x28\x18\x63\x88\xd1\x77\x09\x67\xaa\x39\x89\x0a\x93\xad\x7a\x37\x6a\x87\xd8\xd5\x32\xf3\xed\x1e\x3e\xf4\x8b\x1a\xed\x09\xc5\xfb\x31\x84\x48\xf1\xf0\xb7\xaf\xe8\xa0\xc7\x92\xc7\x33\x6a\x5b\xef\xc5\xe9\xb4\xac\x5d\x62\x31\xa6\x8a\xb3\x05\xd4\x32\x64\x7b\x42\x89\x3f\x3e\x7f\xc4\x12\x13\xc4\x39\x00\xd8\x03\x6b\x4e\x47\x8e\x9f\x29\x21\x88\x1f\xbe\xe0\x09\x43\x41\x63\x9d\x6e\x9f\xef\xc8\xe3\x40\x7a\x2c\x04\xbf\x2a\x34\x24\x6c\x75\xcf\xb2\x34\x49\x97\xb9\x72\x5f\x28\x0c\x03\xd8\x6e\x6f\xbb\x22\xe2\xd5\x08\x61\xb7\xed\x35\xaf\x05\xa7\x12\xa9\xb6\xd2\x6b\x42\x40\xae\x0d\x1d\xab\xa1\x7e\x0e\x6f\x31\x6f\xd7\x35\xfc\xd8\xb9\x22\xe5\xb8\x75\x82\xbf\x55\x5c\x90\x5e\x9f\xf6\x76\x36\x9b\x5c\x81\xb6\x97\x39\xd7\x8b\x8f\x8b\xf6\xda\xfd\x85\xe8\xfd\x85\xe8\x9f\xf8\x42\x54\x3f\x15\x45\x2a\xeb\x9b\xbc\x17\x15\xc0\x2b\xdc\x64\xfa\x82\xbf\x35\x7e\x62\x9a\x4c\xa2\xa9\x17\x8e\x67\x49\xc0\xc3\x51\x60\x05\x75\x89\x46\x41\xe2\x09\xd4\x02\xda\x64\x1e\x69\x8a\xdb\x48\xf3\xcb\xcc\x51\x34\x15\x1e\x0c\x2c\x2b\x46\x0e\xf4\x3c\x9a\x5a\x4a\x7d\x6c\xcd\xc8\x35\xce\x57\x1c\xe2\x4a\xc1\x5e\x9b\x5e\xab\x74\x3a\xb6\xc4\x05\x3d\x63\x49\x1b\x86\x54\xc4\x7b\xe7\x7d\x86\x56\xa4\xaa\xac\x04\xdb\x55\x4a\xa0\x28\x7f\x97\x51\x71\x0d\x8a\x6e\x27\x8c\xba\x47\x3a\xdd\x6a\x60\x84\x4b\xb0\x83\x84\x70\x7f\x4f\xae\xae\xdc\x3c\x71\x36\xf5\x67\xd2\x20\x8b\x23\x56\x14\x75\x2d\x59\x2c\x8b\x17\x74\x12\x2c\x63\xef\xc5\x49\x5d\x1f\xd9\x8e\x6c\xb7\xa3\xae\x7c\xbd\xe1\x5b\x18\xc9\xf4\x43\xd4\xa2\xc7\xf7\x54\xf9\x3d\x0e\xee\x82\x35\x8a\xdf\xa2\xfb\xf6\x8b\x2e\x2e\xa0\xb0\x5a\x4a\xe6\xd8\x68\xd4\x53\x21\xca\xf6\xe0\x41\xd2\xd6\x2b\x7a\xe1\x19\xb9\x58\x55\x7c\xb0\x39\x32\x8a\x4c\x27\x24\x30\x7c\x03\x82\xe3\x49\x65\x47\xa0\xec\x02\xd8\xba\x7b\xf5\xf2\x9f\xd6\x72\x83\x3a\x98\x5c\xec\x5d\x68\x52\x97\x6f\xf8\xd8\x75\x0c\xdf\xe5\x15\xb9\xd4\xf6\xbb\x75\x7a\x23\x7f\x7f\x31\x2e\x8f\xe1\xfa\x0f\x5d\xc1\xc2\xe7\xd5\x95\x45\x43\xfb\x63\x88\xbb\x80\x1c\x9f\x61\x78\x8f\xc7\x2d\x59\x2d\xf4\x49\xb8\xa1\xf2\x5f\x3d\x9a\x72\x10\xae\xba\x48\x45\xc0\xe8\xa8\x20\xf3\x68\x3a\xe3\x82\xa3\xf2\x5e\x2c\x94\x54\x4e\xcb\x45\x5a\xdb\x6e\x91\x9a\xad\x9e\xb4\xe7\xc1\xc5\x8f\x94\xbe\xa3\xd9\x4f\x41\xde\xee\x11\xf6\xfd\x2e\x8b\xd2\x2c\x2a\x2e\x8d\xf4\x69\x90\xbf\xcb\xa2\x31\x15\xbf\xd9\x7f\x30\xcd\xec\x47\x92\x26\x63\xea\x7b\xc5\xf8\x99\x5e\x56\xbc\x63\xfc\x4c\x2f\x9b\xbe\x64\x84\x9a\x1c\x5c\xf3\x1a\xf6\x90\xdd\xc5\x0b\x3a\x8e\xe6\x41\xdc\xc1\x00\xee\x4b\x32\xf3\xb2\xf5\x6b\x13\x3b\xf2\xb9\x79\xd7\x34\xef\xab\xfa\xee\x49\xff\xa6\xd4\x7d\x4f\xd7\x7f\x44\xba\x16\x42\x91\x43\xd8\x70\xff\x2a\x83\x09\x09\xaa\xf6\x8a\x4a\x8d\xe9\xf9\xc2\x14\x8f\x44\xfa\x9a\x21\x13\xd5\x52\x70\x71\xd1\xfd\xa2\x34\x83\x17\x7d\xbc\x9d\xae\xcb\xd3\xb9\xd6\x88\x99\x00\xca\x43\x46\x2a\xf1\x67\x02\xa8\x37\x20\x2c\x1d\xe1\x02\x5e\x9b\xf9\xab\x77\xa0\xbc\x6d\xd8\x50\x52\xf9\x77\xd1\x07\x92\xf2\x17\x82\x2c\x0d\x39\x0d\x72\x3f\xdc\x34\xc8\x0d\x28\x20\x5f\x04\xaa\x45\x45\x94\x6f\x0c\x15\xaf\x0d\x93\x50\x35\x55\xdb\x60\x25\xf5\x63\x18\xc3\xcf\xa7\x6a\xc9\x59\x75\xd5\x2d\xba\xe0\xe5\x2d\x3b\xb0\x46\x0f\x8a\x8b\xbe\x34\xfc\xf3\x56\x80\x9f\x19\x4b\x2d\xc4\xc5\xca\xcb\x46\x86\xe8\xb9\xc9\xf2\x11\xd1\x82\x2a\x57\x91\x0a\x5e\xb5\xca\x52\xb2\x2b\xb6\x5c\xd6\xe0\xa8\x43\x3a\xca\x50\xcd\xda\xf2\x41\xb9\xf4\xe9\x81\xd2\xa4\x27\x33\x1b\x2c\xb5\x52\xd0\xf2\x26\x4b\x16\x9d\x0a\x86\xb3\x9c\x2f\xe3\xa0\x88\xce\xe8\x4f\x41\x7e\x9c\xc3\x9b\xbe\xb2\xaa\x1c\x58\xab\xae\x69\x6d\x0d\x53\xa3\x1c\x1a\x3b\x9d\x4c\xe8\x58\xd4\xcc\x57\x6e\xc9\x72\x28\x2f\xe0\xa3\xe7\x52\x68\x7b\x51\x9a\xd6\x22\xb2\x58\x9c\x4e\x6d\xe3\x4b\x9d\x81\x22\x0a\x39\xda\x41\x50\xf1\x79\x75\x83\x9e\x07\xca\x0c\xb6\x4e\x11\x28\x5a\x6a\xb4\x0e\x81\xc8\x9a\xaf\x3c\x38\x38\x55\x2e\x36\xa8\xb0\xc1\x52\x33\x6b\xc2\x26\x46\x50\x83\xf6\xd9\x4d\x94\x73\x26\xf0\x52\x28\xf4\x0f\xf8\x68\xd8\x1f\x05\x39\xad\xe5\x8d\x3e\x50\x1f\x19\x78\xe0\x0c\x02\xe0\xf9\xd3\x20\x7f\x1d\xcd\xa3\xc2\x43\xbf\x26\x80\x28\xab\x12\x4b\x88\xde\xc8\x37\xca\xe4\xd1\xaf\xbe\xdd\x4e\x67\x1a\xd0\x45\x34\xa7\x79\x11\xcc\x17\xa5\x45\x14\x84\x5e\x58\x3c\x23\x29\x63\x5b\x46\x76\x59\xb5\x4a\xa7\x82\x3a\x13\x46\x93\x49\x34\x5e\xc6\xf0\xae\xa7\x0c\xd3\x1a\xc8\x1c\x48\x5a\x04\xf1\x8b\x26\x15\x58\x90\x58\x6a\x36\x57\xaa\x00\xd7\x3c\xce\x5c\xaf\x6e\xb6\x2b\x6b\x46\x05\x9d\x77\xed\x17\x7d\x8e\x59\x25\x40\xb9\x17\xd8\xc6\xaa\xf6\x49\x6d\xbc\x60\xdd\xf2\x1e\x71\x9d\x4c\x83\xc5\x1d\xa7\x53\xef\x2a\xc6\x1c\xc5\xb7\x86\xe3\x74\xaa\xd5\x6f\xee\x42\x86\x7a\x8d\xc5\x8c\x2b\xc4\x4b\x19\x5d\x7b\x44\x13\xf6\x65\x6c\x6a\x6a\x9c\x56\x86\x87\xc6\xec\xa2\xbb\xb8\x4e\x67\xd7\x32\x2a\x6e\xb0\xfd\x79\x2b\x31\x9a\x88\xd3\xa9\xa7\x6a\x99\x5a\x52\xa5\x2a\x64\x9e\x2e\xe0\x2a\xa7\xfe\xc4\x7c\x3e\x8b\x72\xc6\x8d\x17\x69\x5e\xdc\xe0\xc8\xfc\x2e\xcd\xab\xa5\x22\x37\x06\x53\x25\xd7\x76\x2b\xc5\x13\xcd\x3a\xa9\xcc\x42\x07\x03\xe8\x74\x7f\x11\x5c\xc2\xbb\x8a\x3d\x43\x4d\x86\xb3\x04\x92\x21\xa9\x28\x62\xef\x79\x4d\x66\x62\xd8\xf3\x34\xfb\xfc\x31\x7d\x97\xa5\x67\xb4\xbc\x0c\x02\xc2\x65\x17\x42\xe2\x2d\x2f\x28\x21\x50\x68\x81\x09\x8e\x3c\x65\x58\x52\x73\xd6\xc2\x3b\xc9\xdd\xac\x60\x9e\x82\xd2\xc9\x9e\xf1\xf5\x8c\x9c\xa0\xcf\x53\x32\x54\x66\x0c\xd7\xba\x55\xae\x83\xe7\xea\xf8\x38\x4e\xcf\xe1\x59\x89\xd4\x6b\x54\x55\x5f\xfd\x0c\x82\xc7\x4e\x64\xc4\x44\xd2\x24\xbe\xe4\x01\x21\x0a\xe3\x75\x86\x7c\x21\xc1\x5f\x42\xf8\x1e\xf6\xc8\x67\x12\x64\x68\x3f\xda\xc1\x0f\x24\xec\xa3\x35\xeb\x63\x23\xde\xa5\xee\x83\x80\xfe\x85\x95\xaa\x97\x9b\xd5\x51\xba\x9f\xac\xcd\x7b\x85\x6a\xc2\x16\x74\x0d\xf8\xa5\x17\x8b\x28\xbb\xf4\xac\x78\x94\x8b\xc9\x2d\xe7\xee\x63\xbc\xd0\x2c\xaf\x6c\x09\x58\xa0\x9e\x05\x00\x94\xed\x93\x25\x2c\x88\xee\xae\x6f\x55\xbe\x0f\xce\x25\xc9\x88\x14\x2f\x18\xaa\x7e\x3f\x1f\x47\x91\xbd\x7c\x65\x19\xbc\xdb\xfe\x3d\x17\x88\x53\x70\x48\x9a\xd3\xeb\x50\x35\x00\xfe\x94\x21\x0a\x9a\x8f\x39\x0c\x06\xab\xac\x08\x58\x9b\x78\x35\x96\x2e\x46\xbd\xdc\x6e\xb1\x92\xac\x6b\x00\x8e\xa2\x66\xf4\xaf\x98\xaa\xad\x91\xf3\x85\x4b\xc1\x66\x3e\x11\xbf\xc6\x4b\xe8\x39\xdc\xe8\x75\xcc\x60\xda\x70\xd5\x31\x0a\x92\x7e\x94\xff\x23\x88\xa3\xb0\x03\xb1\x2e\x44\xca\x8b\x28\xa3\xe3\xa2\xe3\xbb\xe7\x10\x2e\xc5\x00\x50\xd4\xd8\xe9\x3a\x97\x28\x58\xd0\xd1\x31\x88\x64\x0f\x3c\xd5\x1a\x5e\xeb\x3c\x15\x35\xa8\x42\xf4\xcc\xac\x89\xab\x27\x6c\x1b\x12\xe1\x57\x5c\xc2\xb6\x65\x50\x70\xbd\xd0\x3f\x5c\x26\xe3\x28\xf1\x4b\x2b\xc2\x91\x37\xba\x79\x5a\x37\x93\x88\xeb\xd7\xc8\x10\xcf\xc0\x0b\x12\x18\x21\x46\xc9\x14\x0e\x38\xde\xe3\xad\x0b\x66\xfa\x92\x12\x6e\x9d\x6a\x2a\xc0\x50\x66\xf9\x59\x34\x9d\xd1\xbc\xae\x3c\x86\x42\xb4\x23\x72\x3f\x27\xe9\x79\xf2\xa1\x08\x0a\xea\xf3\x2b\x88\x72\xcb\x1b\xc0\x55\xec\xda\x35\x2c\x96\x71\x4c\xc3\xba\x2a\x30\x54\xc9\x51\x57\xbb\x97\x2a\x89\x20\x50\x77\x81\x3a\xac\x85\xe8\xe9\x7a\x2a\x2a\xa8\x29\x69\xdc\xad\x0d\x3d\x69\x08\xd6\x77\x36\x18\x96\x67\xa1\x92\x36\x2f\x19\xfa\x93\x51\x09\x63\xe7\x1b\x7a\xd2\x38\x6c\xd9\xf5\xfb\xb0\x34\x07\x97\xf3\x0f\xa8\x3c\xaf\xa4\xac\xad\x93\xf3\x54\x61\x83\x18\xbd\x37\x54\x0e\x43\x6f\x2a\x86\xc7\xa7\x9a\xa1\x27\x0d\xc3\x5a\x68\xf4\x24\x62\x68\x9b\x0b\x0d\x4b\xd2\x39\xf7\x32\x6c\xb6\xf8\x05\x53\x6b\xb8\xf5\xb4\xcc\x13\x11\x63\xe1\xad\xe1\xce\xce\xf5\x69\x6f\x67\xeb\xde\x8b\xc5\xbd\xd1\xd6\x7f\x8d\xd1\x96\xa0\xf4\xbb\x08\x47\xb3\x9a\xef\xfe\x86\x96\x5a\x3c\x5a\x8e\x69\x82\xc5\xd3\xbe\x42\x10\x80\xe6\x6e\xfb\x83\x38\x1e\x58\x91\x2d\xe1\x3d\xae\x1d\x16\xc7\x75\xe6\x2f\x8d\xca\xdd\x08\x60\x15\x4e\xfc\x7d\x21\xc0\x3e\xf1\xcd\x4d\x38\x99\xc7\xc1\x6f\x57\x77\x00\xaf\x2b\x15\xbb\x03\xae\x95\x27\xdd\xae\x5a\x88\x9b\x17\xc0\xb1\x0e\xea\x94\xdf\x18\x46\x06\xc7\x15\x20\xe2\x13\x43\xdc\x49\x00\x02\xb6\x3f\xd8\x93\x61\xb8\xaa\x04\xbb\x00\xfd\x84\x0b\x9f\x2c\xb2\x69\x8e\x65\xdd\x1b\x84\x7c\x96\x32\xbe\x0e\x8f\x07\x7e\x20\x80\xd7\xf3\x47\x47\xd9\x34\xe7\x51\x06\xd6\x85\xf0\xd6\xac\xc3\x58\x18\xab\xec\x34\xee\xde\x0f\x0e\x29\xc9\x1c\x1c\xec\x4f\xbc\x6e\x74\x07\xe7\x1f\x9b\xed\xbb\xa0\x42\x4c\xec\x68\x3c\x34\x44\x44\x55\x48\x3f\x1c\x85\xd8\x17\xb7\x2a\xca\xc9\x38\xcd\x32\xd7\xa5\x24\x9c\x80\x82\x82\xee\x67\xd3\xdc\x17\xe5\x4f\xc7\x19\x7f\x48\xfe\x06\x27\xa8\x9c\x7c\x81\xf3\xd3\x35\x6b\x2f\x2a\xc4\x9b\x0e\xc3\xeb\xa4\x67\xaa\x70\x3b\xa5\x73\xa4\x0f\xb9\x1c\x0a\x50\xe4\xd8\x82\x04\x1a\xf1\xec\x8c\xcf\x1f\x02\x80\x42\xc8\x70\xe7\x02\x9b\x27\x38\x11\xd4\xd1\xbb\xd8\x56\x1b\xc0\xd3\xbf\x2c\xb8\xcc\xd7\x8c\xb9\x5b\xef\x38\xc1\x1f\x83\xae\x72\x49\xce\xce\xc5\x8e\x8a\xde\xba\x31\x10\xe0\xdc\xbd\x70\x25\xbc\xbe\x94\x30\xca\x58\x05\xac\x57\xb4\x70\x56\x97\xd8\x91\x84\xb8\xbe\xb7\x57\x46\xc8\xe6\xcb\x25\x76\xf6\x15\xf1\xd7\x2a\xa2\xa4\x75\x1c\x87\x02\x55\x2e\x78\xa5\x52\x06\x6c\x94\x30\xa9\x18\x41\x24\xd2\x77\x1c\xcc\x43\x5e\xce\xa6\xa1\x5d\x6f\x97\xb8\xe3\x0d\x62\xd5\xaa\x36\xd9\xaa\xa4\x3c\xd5\x7e\x25\xd9\x19\x61\x47\x57\x67\x18\xab\xf2\x0b\x33\x5a\x68\x49\x38\xd2\x6b\xcd\xcd\xf1\xf2\xe9\x78\x62\x83\x16\xa9\xdf\xf3\xbf\x11\x3b\x74\x8f\x94\x78\xf5\xf7\x39\x87\x17\xef\x56\xd0\x70\x8d\xa0\xa4\x15\xb6\x4f\x25\x51\x6b\x24\xea\x6f\x16\x9d\xc3\x5b\xbc\x72\xde\x6f\x14\xa3\x43\xb8\x17\xdf\xec\x91\xa7\x52\x1b\x54\xd1\xc4\x32\x59\x04\xe3\xcf\x47\x5c\x0f\x6d\x58\x01\x42\x92\xa1\x1b\x32\x93\x74\x17\x4c\x37\x4b\xb2\x2a\xfe\x43\x91\xde\x1e\xd9\x26\xcf\x64\xa2\xf4\x80\x4e\xe4\x39\x50\xbb\x04\x50\x7e\xcb\xcb\x1c\xa0\x63\x21\xa7\x27\x8a\x9b\x33\x2a\x74\x29\xd8\x7d\xb3\x8a\x7d\x77\xb2\x79\x4a\x86\x3e\x27\xdd\x07\x10\xfb\x39\x40\xe1\xb6\x25\xb2\xec\x80\xde\x41\x1c\xe3\xc5\xdd\xef\xf7\xe5\xfa\x3e\xb0\xcb\x5a\x9b\x8f\xe3\x1e\xe7\x90\x6f\x77\x10\xd6\x57\x82\xb2\xdd\x28\x50\x35\xf4\xcc\xb8\xfd\x32\x99\xfb\x82\x83\xb7\x87\xf2\xd0\x15\x18\xaf\xc3\x82\x24\x34\x7d\xa8\x48\x30\x1e\xf8\x9a\x9f\x8c\x58\x1d\x3c\x68\x20\x03\x17\x68\xf3\xd2\xae\x98\x55\x88\xdb\x5b\x47\xb5\xd0\xab\xb2\xd8\xc8\xab\x04\x3e\xf6\xef\x9b\x52\x06\xb3\xac\x25\xd5\x1e\x03\x07\x19\x2d\xff\x09\x97\xc9\x86\x58\x88\xd9\x0f\xb8\x7d\x36\xa5\x2f\x5c\x04\x8b\x3f\x76\x31\xad\xd0\xe7\xae\x9a\x25\x97\x96\x70\xfa\x5a\x7e\xdd\xf7\x14\x57\xeb\x68\x15\xe3\xa3\xc5\x8c\x23\x41\x54\xdd\x33\xba\xe6\x3e\xbc\x83\x52\x78\x09\x77\x8c\xf5\x80\x9c\x8d\x3b\x4f\x65\x9b\x34\xd8\x73\x1d\xdc\xb8\x3c\x00\xb9\xb7\x91\x2f\x2a\x0c\x27\x08\x3d\x6e\x5c\xb1\x6b\x3a\x15\xe6\x9d\xa6\xa1\xe3\x40\xbd\xc8\x2e\xad\x77\x83\x08\x14\x9e\x0a\x96\x8f\x97\x18\x6f\x1b\xc7\xf0\xb8\xbc\xe3\xb8\xa8\xe1\x14\xbf\x47\xa8\xd7\x39\x8e\xdd\x79\xd9\x3a\x92\x64\x2a\x37\x8a\x26\xe7\x4a\x7b\xdb\x30\x8b\xd4\xee\x0a\x56\x0b\x7f\xaa\xa5\x56\xbb\x66\x24\x49\x09\x40\x61\x8e\xf9\x03\xd9\x84\x43\x8d\x71\xd6\x74\xa5\x43\x1c\x31\x34\x48\xf8\x3b\xed\x24\x14\xbe\x1c\x21\xe4\x6b\xf2\x48\x1e\x54\x9d\xd8\xb7\x35\xcb\xd5\x88\xf7\xc6\xd6\x8d\x35\x0f\x1d\xf3\x16\x4f\x54\x57\x0b\xde\xdc\xd1\x3e\xcd\x8b\x68\x1e\x14\xf4\xa7\x00\x14\x88\x75\x54\x85\xc0\xeb\x28\x0a\xd7\x7c\x17\xd4\xf4\xf5\xa9\xa3\xd9\x0c\xa1\x71\xd5\xcd\x8e\x07\xb4\x6c\x66\xde\xcb\x66\xa8\x0c\x1d\x06\x21\x50\xa4\x2e\x50\xc8\x07\x78\x2a\xa6\xb4\x78\x61\x87\xf6\x91\x3b\xab\x5d\x4d\xdd\x5c\x89\xba\xee\x78\x9e\x1a\x21\x5e\xde\xe8\x8a\x95\x59\x11\xa9\xdf\x2b\x35\xdf\x22\x00\x21\x2e\x2a\xf1\x8c\xc8\xbe\x12\x61\xbf\x6d\x34\x42\x55\xff\x8d\x02\x12\xaa\x42\xab\x0e\xf2\x6b\x46\x27\xd4\x3a\x1a\x36\xc0\x6c\x31\x96\x6e\xaf\x72\x7e\x6a\xae\x63\x44\x02\xba\xdc\x2a\xa5\x62\x5c\xa2\xec\x1f\x9b\x2b\x11\x23\x4a\x8b\x04\xc3\x62\x8a\x11\x6c\x04\xcf\x89\xeb\x27\xce\xd2\xb8\x3e\x03\xe7\xb3\x9f\x58\x8f\xdb\x64\xc8\x3f\xac\x9d\xa4\xdd\x73\x84\x97\xa1\xf6\xcf\xa6\xf2\x94\x67\x39\x31\x9c\x53\x9d\xc5\x3b\x2e\xfd\x96\x72\x06\x59\x4b\x0c\x32\xac\x4a\xd9\xf6\xa3\x02\x16\x55\x6f\x3d\x9e\xd8\x42\x78\x82\x0b\x43\xd0\x59\x37\xb1\xa3\xad\x71\x60\x9b\x2f\xb0\x0c\x25\x7d\x73\xe8\xb4\xb2\xad\xc2\x42\x67\x3f\x58\x2c\xe2\x4b\xe1\x29\xa8\x11\x61\x75\x6d\x33\x36\xbe\x05\x58\xcd\xb0\xc4\x1b\xd5\x5d\x33\x0f\x22\xfe\x8e\x66\x3c\x3a\x04\xcf\xad\x63\xef\x78\x26\xec\x6b\x85\xdf\x91\xe9\x7a\xc5\x63\x57\x49\xa5\xe0\xe2\xb0\xa9\x31\x5c\x06\xe8\x4a\xcd\xde\xc9\x2f\x2b\x6e\x8a\x48\x7c\x24\x3a\xa9\xb4\x98\xde\xad\xa5\x8b\x1f\xf6\xf9\xa7\x8c\x3d\x24\xcb\x02\x81\x47\xd9\x78\x19\x07\xd9\xfa\xfa\xfa\x7a\x75\xc4\x21\x49\x41\xbb\x77\x12\x73\x88\x6b\x7f\x5b\xc3\xed\x27\x7e\x07\x2e\xdb\xf7\xb7\xff\xf7\xb7\xff\x7f\xed\xdb\x7f\x71\xf5\xcf\x60\x65\x4c\x28\x7f\x24\x8b\xdf\x2d\x46\x85\xcf\xb2\xa0\xda\x10\x60\x6d\x30\x80\x98\x57\x41\xc6\x48\x99\xed\x60\xcb\xdc\x1c\x22\x23\xb8\x30\x9a\x4c\x68\x46\x93\x82\xd0\xe4\x2c\x87\x42\xa3\x2c\x3d\xcf\x69\xb6\x86\x1c\x7a\x9e\x47\x49\x98\x9e\x83\xc6\x02\x45\x7a\x20\x0f\x1e\x88\x9c\xfe\x3f\xdf\xbc\x7e\x55\x14\x0b\xe1\x2b\x96\x73\x4d\x33\x8d\xec\xf9\x61\x81\xf5\x89\x40\x05\xd1\x34\x49\x19\x23\x88\xa3\x84\xb2\x9e\x24\x69\x48\xd7\x90\x77\x30\xa7\x46\x35\xf0\x8b\x79\xcc\x46\x26\x36\xb6\x76\xb7\x69\x23\xd7\x1c\x93\xff\x7c\xf5\x7e\xdb\xa8\x6e\x96\x6d\xb7\xbb\xa5\xa5\xa4\xe4\xc0\x5a\x78\x27\x91\xe9\x9a\x44\x80\xfc\xc4\x44\x7b\x70\x8f\xc9\x9d\x69\xb3\x5e\x2a\x03\x08\xa3\x3c\xde\xf2\x67\x69\x5e\xf4\x48\x11\xcd\x69\xba\x2c\x7a\xac\xc2\xac\x07\x4a\xe6\xf3\x34\x13\x8f\xd1\x60\x33\x61\x70\x64\x8f\xc0\x7f\x57\x57\xa4\x2d\x88\x3d\x4e\xc7\x41\xcc\x12\x87\x4f\xbf\x79\xfc\x0d\x04\x96\xe5\x7b\x0f\xaf\x90\xed\x84\xe2\xd7\xd5\x15\xd9\x54\xd9\xac\x19\xb2\x07\xad\xa9\x34\xd9\x28\xd9\x53\xed\xd7\x0a\x4f\x8b\x8c\x2e\x20\x52\x1b\x3d\xb7\xa6\xcc\x92\x9d\x04\xe0\x7b\x74\x96\x11\x92\xd3\xf3\x34\x8d\x69\x90\x5c\xc3\x1d\x2b\xdb\x9f\xa5\x04\xa3\xb1\x2c\xdc\x32\xa2\x03\x9f\xd9\x96\xe1\xfb\x07\x63\x1a\xc9\x5d\x66\x07\xcc\x8b\x40\x56\x3d\x47\x35\xbf\x41\xe1\x84\xc4\x78\x18\xdc\x00\xea\x6c\x42\xb4\x78\x05\x43\x7e\xf5\x7e\x5b\xc7\x75\xe5\x92\x16\xc2\x3c\x9a\x08\x06\x63\x38\xbf\xb3\x2a\x32\xc6\xc3\xab\x04\x79\x58\xd6\x9a\x2e\x68\xd2\x69\xbf\x3b\xfa\xf0\x51\x86\xa2\xe4\x84\xc3\x3b\xb7\xbb\x86\x3c\xe9\xc1\xdc\x3e\x78\x60\x4e\xaa\x71\xe8\x5b\x82\x41\x4d\xfb\x79\x90\x47\x63\xd2\x26\x1b\xd0\x85\xe7\x4b\xc6\x1e\x50\x15\x1b\xa4\x3d\x54\x57\x85\xaa\x9e\x7e\x91\x8a\x47\x6b\xed\x51\x90\xd3\x27\x8f\xdb\xd6\xf8\xb5\x1f\xe9\x57\x34\x08\x69\xd6\x69\xef\x03\x5f\x8d\x7e\x0d\xf8\x69\x0b\xda\xe7\x23\xac\x28\xc4\xe4\x63\x9a\x14\x8f\xd8\x41\xbb\xdd\x23\x6d\x26\xf9\x47\x63\xa8\x62\xf0\x4b\x2e\xd5\x8e\xea\xc6\x4a\x4c\x59\x0d\xb9\xf2\x88\x23\x97\xc9\x18\x1d\xaa\x6d\x4d\xb2\xef\xe2\x79\x81\xae\xaf\xfd\xb1\xa5\xab\x48\x2f\xb7\x63\x0d\x4a\x5d\x9a\x4d\x72\x92\x66\x4c\x5a\x15\xc1\x8a\x81\x1e\xb5\x76\x5f\x63\x2e\x09\x3b\xf0\x20\x82\x47\x91\x89\x26\x97\xaa\x7e\x81\x64\xa9\xc8\xc7\x6e\xa2\x7d\xd6\x00\x07\x69\x92\x50\xf1\x6c\x41\x52\x98\xa6\x44\xe3\x72\x51\xb6\x2e\x03\x36\x7c\xa4\x17\x85\xd3\x41\x01\x8b\x5e\x6b\x08\xeb\x78\xb3\x5b\x55\x5d\x7a\x2f\xea\xef\xf8\x1a\xc4\xab\xa4\x79\xec\x60\xa0\x81\xa0\x86\x08\xf6\x15\xc7\xa9\xa0\x04\x91\xf5\xa3\x13\xad\x83\x14\x59\x34\x9d\xd2\x8c\x87\x18\x62\xb3\x0f\x62\x8b\xf2\x17\xca\x70\x50\x47\x30\xd0\x03\x1f\xd5\x98\x91\x82\x9b\xd0\x0f\x18\xaf\xec\x1a\xdc\x24\x01\xdf\xce\x79\x11\x14\x74\x3c\x0b\x92\xa9\x5f\x81\xc0\xcd\xfb\x25\xe2\x83\xf0\x12\x0c\xeb\xe1\x46\xf8\x31\xe3\x30\x36\xcb\x5b\x37\x23\xfd\x36\xa0\x18\x0d\x28\x6f\x95\x50\x08\x29\xfb\x32\xab\x86\xa2\xe0\x4c\xe6\xbd\xb5\x52\x37\x56\x2b\xd2\x16\xc1\x57\x5b\xf6\xc5\x96\xd1\x32\x3b\x0b\x5e\x5b\x28\xd6\x1b\x81\x8b\x59\xb3\xb2\xbc\xaf\x97\xde\x47\x5e\xaa\x83\x37\x0f\xb1\x90\xef\x96\x03\xd8\x5d\xa8\x62\x02\x62\xa5\xe1\x75\xa5\x2f\xcb\xe3\x4b\x46\xef\xfc\x6d\x29\x2c\x2e\x46\xd5\x25\x6b\x2b\xca\x45\xfd\xd4\x64\xa6\x4a\x08\x90\x0a\x4e\x5b\x18\x60\xe7\x87\xa4\x5d\x90\x49\x10\xc5\x34\xec\x93\x23\x76\x4e\x3b\x8f\xd8\xd9\x23\x80\xa8\x60\xe5\xab\x09\xb5\xe9\x99\x0b\x8d\x4f\xa5\xcf\x50\xd1\x27\xa2\x70\x48\xbe\x53\x7f\x52\xdf\xc7\x76\x9f\x6c\x31\x1e\x92\xf6\x76\x7f\x53\x29\x0f\xa5\xfe\xb1\x9d\xd0\xe2\x53\x1c\xe5\x05\x4d\xa2\x64\xaa\xb2\x95\xf6\xf0\xd4\x30\xe8\x92\x0a\xae\x8c\x87\x38\x73\xc9\x57\x5a\x15\xb2\x41\xea\x49\x70\xd4\x05\x78\xe8\x52\x55\x60\x9c\xf6\x99\x98\xdb\x1a\x3e\x65\xbf\x0c\xf9\xb9\x35\xdc\xfa\x96\x9d\xfc\x77\xee\x4f\xfe\xf7\x27\xff\xbf\xf8\xc9\x5f\x1b\xfe\xc3\xa3\xc5\x3b\x32\xfa\x57\x86\x9c\xf8\x54\x39\x8a\xa6\xdc\x06\xb7\xff\x0b\x3f\xa1\xf3\x7b\x90\xf0\x35\x9d\x98\x1b\x82\x8a\xf5\x78\x89\x1e\xce\x19\x1b\x27\x87\xe0\xec\xe2\x7c\xc6\x7a\xdf\x31\x0d\xb4\xbe\xe7\x85\xc9\x43\xb2\xed\xbe\xbc\x03\x8b\x3f\x26\xc5\x9b\xef\x0f\x89\xff\x45\x9c\x60\xee\xef\xc4\xa9\x2e\x48\xc8\xe1\xf3\xfd\xb7\x62\x92\x43\xf2\xdd\xb7\x64\x9c\xce\x17\x4b\x11\x67\x65\x74\x49\xe6\xe9\x59\x94\x4c\x51\x34\xb1\xc7\x64\x3c\x0b\x32\xd8\x0b\xf8\xcd\x6c\xc8\x4d\xa9\xa4\xb9\xba\x84\x8e\x29\x7f\xb4\x50\xa4\xac\x41\x8e\xab\x9c\x74\xf6\xc9\x1e\xd9\xda\xec\x91\xe7\xec\xff\xad\x1e\xe9\xf7\xfb\x3d\xf2\x7f\x64\x8f\xec\x7c\xd3\x65\x87\x1d\x92\x2f\xe8\x38\x9a\x44\x7c\x21\x1d\x7e\x38\xda\xda\x79\xb2\xf5\xc4\x36\x31\x8b\xf2\x14\xd2\xc5\x38\x5c\xaf\xb2\xd7\xfc\x4d\x2c\xeb\x08\x1b\xa0\x79\xb5\x86\x6f\x96\x85\x24\x15\x4a\x30\xe1\xda\xc0\xac\xdf\x98\x50\x56\x31\x9e\x47\x36\xa2\xf6\x7e\xbb\xcf\xd0\x72\x90\x86\x74\xbf\xe8\x6c\x22\xad\x35\x1b\x5b\xfb\xff\x9c\x6c\xce\x00\xf9\xbb\x5d\x20\xd6\x22\x3d\x5e\x2c\x68\x76\x10\xe4\x5a\x95\x8d\xb2\xf3\xe5\x28\x2f\xb2\xce\xe3\xae\x7c\x91\x2b\x12\x36\x7b\x8f\xad\x1b\x33\x9e\xbb\x88\xa3\xa2\xd3\x6e\x77\xcd\xc7\xca\x49\xd7\xb4\xae\x1a\xa7\x21\x1b\x5c\xe2\xeb\xbc\x94\x0f\x01\xe6\x87\x3d\xb2\xcf\x04\x42\xf8\xf8\x7e\x8f\xfc\x5f\xd7\x89\x01\xe0\x99\x59\x31\xb1\x06\xa4\x72\x2a\x1b\x52\xf2\x88\xec\x93\x0d\xb2\xb5\x89\xec\x8c\x7c\x7e\xf1\x65\xec\x51\xdb\x86\xe9\xba\xdb\xff\x25\x8d\x12\x36\x4c\xdb\x52\x71\xbc\x04\x8f\xbb\x30\xc5\x6f\x8e\x5e\x30\xc2\xde\xda\x94\x4c\x49\x58\xf8\x01\xe5\x7b\x28\xee\xdb\xcd\x27\x8f\x6d\x82\x9b\xa7\xe1\x77\xdf\x6e\x6d\x96\x11\x9a\x49\x5f\xda\x8f\x31\xa7\x26\x51\xb8\x92\x8a\x32\x3a\x0f\xa2\x84\xeb\x8e\x58\x9e\xbe\x7b\x14\xce\x5d\x4c\xf6\x20\x80\xb5\xdd\xf2\x76\xd7\x72\x5b\x03\xcc\x4a\x82\x29\x8b\xd7\xef\x0c\x13\x39\xdd\x24\xc8\xda\x87\x49\xc1\x3d\xe2\xf4\xc8\xd6\x66\x97\xfc\xff\x19\xd6\x36\x9c\x5a\xb8\x53\x1c\x61\x7e\xee\x7b\x81\xab\xea\x52\x25\x75\x7d\xc6\x3c\xd5\xbf\x43\xe2\x26\xe8\xb0\x0e\x84\xc1\x3f\x5c\xa8\x43\x82\x78\xeb\x20\xd8\xa7\x9c\x2f\xff\xe4\x0c\xb0\xb7\x6b\xff\x24\x08\x4b\x68\xbd\xe4\xdc\xae\x3a\x51\x66\xeb\xfa\x49\x21\x08\xd1\x72\x2e\x5f\xe7\x58\x44\xc5\x60\xf6\x55\x8e\xd3\xf7\x00\x65\x49\x31\x9a\x0d\xe1\x5a\xb1\x35\xac\x15\x63\x39\x7d\x54\x63\x9d\xcf\x80\x20\x7f\x2e\x7d\x06\xa0\x97\x0a\x22\x1a\x28\xd9\x7a\x82\x58\xd8\x28\xc8\xe9\xce\x13\xb2\x07\x65\xb4\x7a\x68\xe7\x89\x61\x02\x10\x86\x94\x6b\x16\x61\x0f\xec\xf0\x42\x3d\xb2\xf5\x8d\x29\x09\xab\x7e\x3e\x1f\x05\x49\x87\x17\x33\x99\x9f\xb5\x98\x85\x5b\x12\xb4\x70\x9f\xb3\xa1\x17\xa9\xb1\x7b\xb1\xe9\x23\xe0\x5a\x35\xbb\x94\x2b\x9a\x2b\x93\xc0\x5e\xf7\x1d\x8f\x05\x91\xa4\x85\x10\xca\xbe\x8f\x7e\x68\x4d\x41\x22\xe1\xee\x6e\x26\x1a\xa9\xf9\x2c\xe0\xd2\x1a\xec\x6f\x17\xe3\x78\x99\x47\x67\x2a\x74\x65\x34\x8a\xe2\xa8\x50\x02\xce\x28\x48\x3e\x0f\x46\x59\x90\x8c\x67\x24\xa7\xd9\x59\x34\x96\x1b\x60\xc0\x3d\xbd\xb6\xbe\x1f\x44\x3f\xf4\x6d\x1a\x52\x61\x24\x72\xb9\x0b\x4d\x68\xc6\xb6\xa1\x20\x9e\xa6\x59\x54\xcc\xe6\x24\xa4\xf9\x38\x8b\x46\x9c\x2d\x09\xf9\x87\x26\xfd\xf3\xe8\x73\xb4\xa0\x61\x14\x80\x10\xc4\xbe\x06\x87\x49\x41\xb3\x24\xe0\x4f\x27\x3e\x3d\x0f\x92\xcf\x9f\x84\x9b\xd9\x4f\x7c\x5e\xff\x7f\x3f\x89\x91\x26\xd3\x4f\x6c\x88\x9f\xe0\x2d\xd1\xa7\x30\x9a\x46\xce\x53\x0e\x39\x35\x3e\x8a\x1c\xc9\x3d\x55\xce\x80\xf4\x19\x53\xa4\x9e\x6d\xb6\x01\xad\x3e\xb7\x57\xe4\xc8\x62\x8b\x62\x46\x0f\xf8\x3e\xd5\xfe\xe7\xcb\xf6\xee\x9a\x97\x67\x0a\x1e\xdb\xb1\x76\xee\x0e\xae\x60\x83\xb4\x37\x41\x54\x82\x56\xb0\xb9\x0b\x43\xc7\x0b\x86\x0d\xb2\x47\x3a\x5c\x9c\xea\x7c\xf7\x94\x3c\xd2\x4d\x74\xe5\xb3\x81\x47\xdb\xd6\x7e\xab\xbc\x6e\x98\x4d\xa1\x3a\x45\x83\x35\x6a\x2b\xc1\x44\x10\xae\x80\xb0\x79\x00\xf1\x28\xc9\x8b\xa8\x58\x16\xd2\x59\x72\x14\xd2\xa4\x60\x9b\x96\xed\x78\x9f\xd7\x72\x98\x84\x51\x46\x4d\x03\x06\xf3\x8d\x4d\xde\x93\xb2\xac\x7a\x64\x03\xaf\xa6\x5a\xa8\xa5\x16\x34\xd5\xd2\x6d\xb5\x56\xe1\x45\x66\x4f\xbc\x0e\x94\xcd\x23\xb0\xc9\x19\xda\x2f\x3f\xbe\x62\xf3\x20\x5f\xb7\x60\x0c\xa0\x54\xd5\xb7\xae\xc5\xaf\xd3\x2a\x7e\x2d\x9f\xd2\x71\xe4\x8a\xe8\xdc\x51\xce\x5f\xca\x61\x3e\xee\xc8\x9d\xe0\x41\xa5\x54\xde\x54\x7b\x91\x47\xf1\x21\x15\x1e\xfc\x39\x1d\x6f\x49\x09\x9d\x87\xc8\x3f\x4b\xa5\x9c\x10\x61\x3f\x2f\x11\x27\x2b\x2c\xfc\x69\x27\x2f\xb5\xba\x72\x85\x05\xe8\x7a\xe9\xeb\x41\x3c\x66\x1d\x95\xc1\x3b\xaa\x1e\x49\x3d\x5a\x1b\x18\x1b\xd6\xd6\xb8\xa3\xb4\x28\x61\xf0\x9f\x7f\xbe\x3c\xd9\x7c\xf4\xdd\xe9\x97\xed\xeb\xce\xcb\x8f\xaf\xd8\xef\xfd\x47\xff\x77\xfa\x65\x6b\xe7\xfa\x4a\x7d\xec\x6c\xf6\x76\xb6\xae\xbb\xff\x33\xe8\x17\xa0\x04\x55\x1b\xb8\xf1\x2e\xaf\x8c\x31\x20\x70\xfe\x3c\x6f\x6b\x45\x84\x89\x27\x98\x70\xfa\xf7\xa2\xed\x85\x5e\x82\x77\x83\xb7\x17\xee\x4a\xb2\x10\xa7\x07\x85\x1f\xf7\xec\x3c\x86\x38\xff\xfe\xbc\x6f\x6e\x38\xec\x09\x89\x92\x92\x81\x1b\xdc\xe7\x6e\x86\xee\x65\x23\x8d\x06\xbf\xbd\xd9\xc8\x6a\x93\x8b\x94\x6c\xa4\xf9\x72\xce\x00\x8f\x73\x71\x7c\x98\xa7\xe1\xa3\xef\xbe\x7d\xb4\xb5\xa9\xb2\xe1\x8c\x0b\xbd\x1b\xa7\x31\xe9\x1c\x7e\x38\x1a\x1c\xbe\x3c\x20\xec\xdc\x30\xdc\xde\xdc\xdc\xe9\xda\x3c\x19\x55\xeb\x9e\x42\x51\xae\x33\x70\x99\xd7\x70\xd8\xe2\x4c\xb8\xdd\x23\xdb\xcd\x6c\x55\x31\x53\x35\xb6\x14\x42\xa7\x7d\xf2\xcf\xf7\x2f\x7f\x72\x1c\x09\xaa\x02\xfe\xd1\x94\xd6\xe8\x4e\x2a\x82\xac\x1b\x9e\x26\x80\x0e\x78\x99\x73\x86\xfc\x6d\x8f\x3c\xee\x92\x21\x69\xb7\x1b\x8d\x7b\x1c\x47\xf0\x90\x4c\x75\x10\x94\x4f\x51\x62\x8f\x8f\x61\xe1\xa7\xfd\x7f\x1c\xfd\xf8\xaf\xa3\xf7\xff\x6b\xcf\x2a\xd4\x51\x32\xa7\x76\xfd\xde\xc9\xe5\x40\xb7\x1e\xfb\xd6\xd6\xea\x23\x17\xab\xc9\x7f\x2e\x71\x0f\x1e\xee\xd0\x9c\x0a\x9c\xe1\x05\x9e\x73\x08\xbe\x77\x12\x83\xf3\x39\x20\x33\x0e\x1d\xee\x80\x1f\xa3\x43\x6c\xe9\x51\x46\x9e\x3f\xd4\x29\xc5\x38\xa1\xf2\x33\x8a\x79\x9e\xd9\x7a\xd2\xed\x91\xed\x4d\xe5\xe2\xcc\x90\xf2\x24\x7a\xad\x41\xca\xc2\xcd\x16\x68\x89\x57\xaa\x43\xc8\xe2\x4a\x7d\xac\x57\x6c\x0d\xcd\xcf\xeb\xd3\xde\xce\xe3\x7b\x35\xfe\xbd\x1a\xff\x2f\xae\xc6\x17\x2a\xfc\xc5\xb8\xda\x7e\xef\x16\x16\x77\x2d\x1d\xa2\xb0\xb5\xbb\x52\x68\xb5\x1a\x3b\x3d\xae\x67\x5a\x8c\xbd\x96\x60\x8b\xa0\x98\xf5\x48\x42\x0d\xeb\xef\x4f\xa0\xb9\x70\x1e\x9e\xca\xab\x6a\x1c\xdc\x59\x7a\x2d\x10\xf6\x3a\x60\xe3\xc3\xfe\xe3\xa9\x3a\x6b\xac\x6e\x78\x81\x2b\x16\x32\xa1\xf3\x85\x41\x0f\x75\x79\xe5\x8a\xd2\x2a\xd6\x4f\x93\x4e\x1b\x46\xd5\xc6\xc1\x50\xbb\x86\xfd\x74\x9e\x32\x26\xc6\xdf\x12\x1e\xbe\x3b\x20\xfa\x5e\x99\xbf\x30\x6c\xf7\x08\x45\xac\xf7\x13\x67\x83\xe2\xc2\xbb\x63\x3b\xc3\xf4\xf6\x20\x09\x71\xfb\xa8\xf9\xd2\xca\xc8\x9a\x7a\x63\xf0\xfa\xf0\xc3\xc7\x97\x6f\x61\x05\x1d\x1c\xbd\x7d\xfb\xf2\xe0\xe3\xe1\xd1\x5b\xf2\xfe\xe5\x87\x77\x47\x6f\x3f\xbc\xfc\x50\xda\x6a\x18\x14\x01\x6e\x96\x7d\xe3\xcd\x69\xf0\x50\x98\x11\xce\x83\x8b\x71\x3a\x5f\xc4\xf4\x22\x2a\x2e\x87\xe4\x09\x50\x96\xd5\x43\xd0\x85\x2a\x3b\x04\x56\x95\xde\x6f\xba\x9e\xc8\x35\xc2\xe6\xe0\x8b\x19\xc8\x1a\x0e\x7e\xa1\x6d\x3b\x21\xba\xc3\x03\x7c\x03\x7f\x09\xc9\xf9\x2c\x1a\xcf\xc8\x3c\x28\xc6\x33\x21\xbe\xf2\x4d\x88\x31\xb4\xd0\x28\xe7\x89\x5a\x00\x4d\xfb\x23\x5d\xc3\x75\x94\xd3\x5b\xb0\x40\xf0\xc7\xa1\x8d\x26\x9d\x4f\x7e\x42\x3e\x81\xb7\x71\x51\x78\xea\xba\x43\x57\x85\xd9\x58\x05\xd8\xae\x03\x65\xc7\x0c\x2f\x8d\xa5\x0b\xd5\x88\xbe\xdb\x15\x5d\x3b\x58\x9c\x44\x19\x35\x3c\x02\xd8\xe8\x2a\x1b\x0f\x1b\x8a\xa7\xf5\x0a\x70\x1d\xd8\x17\x9b\xb6\xe8\xbf\x90\xc6\xb4\xa0\x55\x35\xd8\x83\xb1\x71\x83\x5f\x61\xff\xcc\x76\x2d\x20\x44\x41\x10\xbc\x3e\x50\xee\x70\x5b\xa9\x84\x3b\xcb\x21\x29\x77\xb5\x1c\x15\xfd\xb5\x35\x29\x0c\x9a\x24\xbc\x66\xab\x3d\xe0\x45\x26\x13\xfe\x34\xcf\x43\xe2\x91\x59\x18\x7b\x56\xc5\xab\xca\x66\x83\x3d\x4b\x5e\xfb\x07\xf7\x6c\xae\x1d\xf4\xca\x25\xfe\xe2\xe5\xa3\x83\x57\xc7\x6f\xff\xf7\xe5\x7b\x55\x4f\x48\xc7\xb3\x65\xf2\x99\x86\xe2\x55\x09\x7f\x31\x2a\xfe\xfa\x19\x5d\xc4\xc1\x98\x76\x06\xff\xbe\x3e\xf9\x77\xf2\xef\xec\xf4\xd9\xbf\xbf\x0c\xa6\xbd\xf6\xf5\xd5\xa3\x47\x57\x5f\xda\x5d\x70\x2d\xfc\xc5\x0b\xff\xef\x53\x59\xe2\x44\x94\x39\x65\x85\x4e\x64\xa9\xd3\x13\x7f\x39\xbb\x94\x51\xa8\xa4\x8c\x6e\x0b\xb5\xa4\x1a\x42\x65\xc4\x35\x1f\xcb\x6e\x4b\x4e\x6a\x60\xc0\x5d\xb3\x80\x78\xc4\x5f\x06\x03\xb8\x03\xa5\xc2\x1d\x06\x78\xda\x80\x0a\xd6\x1c\xd2\x67\x79\x07\x2c\xcb\x5c\xb9\xc2\xef\x8c\x05\x43\x36\x08\x7f\xff\x6a\x88\xea\xea\xce\xda\xe2\x64\xae\x53\x03\x9f\x2d\x18\xf4\x1d\x95\x12\xd6\x34\xdc\x98\x66\xcd\x5d\x7c\xba\x33\x7b\x76\x67\xc4\xd0\xc1\xe7\xae\xb2\xa0\x06\xd7\x77\xc9\x98\xc6\xe0\x50\x5f\x3e\xe2\x34\xca\x8c\x63\x1a\x64\xd2\x84\xcb\x6a\x45\x24\x5b\x0b\xda\x0f\x04\xbe\x1a\x0a\x59\x91\x6f\x8f\x33\xcb\xdb\x7b\x1d\xfe\xab\xb4\xab\x14\x38\xc3\xf0\xd7\x3d\xb2\xb5\xb9\xb9\x49\x1e\xf2\xcb\x19\xcf\x5d\xab\xd7\xf1\x03\xbc\xdb\x03\xec\x48\x7c\x31\x0e\x92\x53\x41\x2f\x3c\x16\x8b\x78\xd7\xb7\x3a\xaa\xdc\x19\xb3\x48\x04\xc2\xfd\x08\xcb\x4a\xa7\xc3\x9c\x45\xf0\x80\xf0\xa6\xdd\x9e\xa5\xad\xc7\xe0\xc2\xf9\x0f\xe3\x91\x3f\x89\x2d\x34\x08\xc3\x1c\x47\x0a\x17\x56\x0e\xae\x34\xc6\xd5\xc3\xbd\x35\xbe\xe1\xca\x83\x81\x38\x6b\x47\xdc\x5d\xbd\xe0\x7a\xb0\x1b\xcb\x5b\x21\x95\x7a\x18\xf2\x52\x41\x96\x45\x67\x14\x33\xdc\x20\x54\xb3\x27\xdb\xab\xe0\xb0\x1e\x68\xc3\x5b\xbd\xdf\xa6\x14\xc9\x14\xf2\xb5\x7a\x14\x92\xab\x2b\xf9\x75\xb2\x79\xaa\xb6\x4c\xb8\xc2\xe6\x7d\xd3\xd0\x22\xc1\x2c\xc1\x13\xb1\x44\xe7\xdd\xbc\xc8\x9e\xea\x4d\x95\xc4\xcb\x40\xfb\xaa\x61\x59\xb7\xdc\xd5\xe4\x3a\xc2\x2b\x95\x9c\xcf\xa8\xf4\x3b\x10\x72\xb1\x1c\x4e\x5f\xa0\x71\x67\xfb\x7b\x88\xd0\x2c\x88\xb8\x02\xb5\xae\x7d\xa7\x3a\xda\x4f\xd2\xac\xc3\xf0\xf2\x99\x5e\xf2\x93\xa2\x6f\x00\xa6\x13\x98\x8e\x1f\xa8\x3f\x0b\xf2\xa3\xf3\xe4\x1d\x04\x5a\x2a\x2e\x21\x76\xa1\xc5\x05\x4a\xd0\xf3\x99\x5e\x9e\x96\xdb\x76\xb6\xd3\x84\x1c\xbe\x3b\x68\xdb\x41\xfc\x85\x6c\x51\x51\xa7\x63\x66\xa1\x97\xc9\x01\xf6\x41\x28\xdc\x8d\x13\x74\xdc\x88\x72\x92\x17\x11\x0f\x46\x12\x85\x88\xa8\xb1\x59\x68\x29\xc2\xfd\x76\x9c\x9d\xf2\xd3\x92\x94\x03\xd8\xee\x91\x51\xd1\x8f\x1e\xa7\x02\xb3\x57\xd3\x34\xa1\x42\xf3\xd4\x59\xff\x64\x8b\xfd\xe7\x59\x54\x80\xbf\x14\x8b\x1b\x21\x10\xeb\x08\xf5\xc9\x3d\x43\x49\x17\x83\xeb\x65\xb5\x0b\x05\x92\x77\xe8\x55\x2f\x08\xd6\x30\xfd\x58\xf5\xd2\x0f\xe8\xe9\x0a\x31\x36\xd9\x5d\x83\x73\xaf\x80\x22\x89\xa6\x7a\x2c\x11\xcf\x11\xaa\xf6\xac\x29\x7b\x19\xa2\x67\xbf\xbe\x51\x55\x58\x3c\xdf\x4c\x6c\x50\x54\x8d\xa5\x06\x73\x28\xb5\xfb\x28\xb1\xfe\x7c\xfb\xa4\x65\x76\x27\xb4\x89\xd6\x19\xc5\x71\xc7\xf3\xaf\x74\x09\x56\xd6\xfa\xb5\x59\xab\xbd\x61\xb3\xdb\x8d\x76\x8b\xe4\xd8\x30\xbb\x8f\xed\xb4\x35\x1f\x84\x17\x5b\x69\x41\xf2\xe5\x62\x91\x66\x05\xe8\xd6\xf8\x4d\xed\xbb\x03\xa2\xb4\x2a\x6d\xc3\x11\x64\x39\x61\x36\x7e\xa9\x70\x93\xc5\x58\x4f\x65\x2b\x51\x98\xf7\x58\x0f\x34\x55\x69\x41\x8f\x1c\xea\xda\xbb\x69\xa9\xb7\x1b\x57\x8f\xab\x31\xe8\x38\x69\x2f\x79\xa5\x7d\x7d\xda\xdb\xf9\xe6\x5e\xa5\x7b\xaf\xd2\xfd\xaf\x50\xe9\x8a\x87\x15\xb7\x7a\x8e\xbd\x1f\x64\x69\x42\xfe\x77\x39\x0f\xce\xa2\x9c\x7c\x1f\xb0\xcf\xbf\x7d\xe6\x9f\xfd\x39\xf5\xaa\x7b\x07\x03\x72\x98\x44\x45\x14\xc4\xd1\xaf\x94\xfc\x9d\xf7\x82\x11\x6a\x40\x72\xb0\xc4\x92\x06\x37\x30\x50\xb6\x54\x0d\x27\xe7\x7d\xd0\xea\xca\x62\x32\x8a\x88\x08\x40\x75\x18\x0e\xc9\x66\xdd\xcd\x1b\xb7\xf6\x60\xc3\xb7\xdd\xea\x7a\xcd\x4c\xbc\xee\x74\xf5\x2b\x34\x19\xeb\x6a\x22\x11\x0a\x2d\x69\x83\x1e\x8f\x13\x5e\xfe\x3a\xa5\x87\x54\x3d\x13\x59\x8d\xcc\x92\xbe\x77\xbd\x6e\x88\xd0\x08\x58\x7b\x4e\xef\x07\x6b\x02\x3d\x25\xae\x78\x79\x5b\x3d\xd1\x98\xe1\x34\x95\x67\x75\xcb\x54\xcb\xb2\x49\xc7\x98\x47\x99\xed\xae\xb7\x51\xd4\xa9\x20\x3c\x63\x67\x54\x39\x3b\xe4\xf0\x05\xe4\xc8\xde\xa9\x49\xdb\xd8\x28\xf3\x33\xe4\x7f\xfd\xc3\xdf\x0a\x39\xd5\xe8\x6c\xf9\x3c\x48\x8c\x54\xa5\xcb\x77\x41\xfc\x7f\x76\x60\x92\x2f\x84\x9a\x1b\x5e\x48\x1c\xa8\xc3\xa3\x34\x20\xf2\x9b\xea\x28\x65\x5d\x5d\xe4\x33\xcf\xcb\x6c\xab\x01\xbf\x79\x86\x44\x83\xd5\x9e\x15\x10\x99\x27\x5a\x97\xa1\xdc\xa7\x0f\xd2\x39\x0b\xa0\x67\xaa\xed\x3e\x3d\xa3\xd9\x65\x47\x7a\x43\xfe\x10\x25\xd3\x98\xbe\xe1\x08\xef\x92\x21\xf1\x66\xe8\x9a\xc4\xb4\xaa\x8e\xf8\xc1\xc5\x04\xaa\x83\x96\x12\xde\x25\xdd\x20\x0b\x22\x99\xc6\x29\xd2\xb0\x2d\x12\x19\x72\x7e\xf6\xf6\xf6\x38\xd5\x60\x20\xe1\x76\x41\xc2\xb2\x33\x37\x03\xe3\xd7\xba\x6d\x5f\x75\x42\x86\xb5\x7c\x4a\x0e\x06\x3c\x34\x9f\x4a\x12\x5e\xd9\x31\x73\x91\xeb\xb1\x91\x3f\x79\xce\x88\x46\xf0\x1e\xad\x86\x1d\x3d\x67\x40\xe5\x2e\xbe\x45\xc7\x2d\xfe\xc2\xeb\xca\x39\x53\x15\x55\x49\x01\x27\xec\x82\xf2\x48\x2c\x8a\x8e\xe4\x3d\x5d\x32\x89\x68\x1c\x5a\xa6\x07\xa2\x15\xa3\xa7\x16\xcf\xc1\x1d\xb4\x18\x0f\xef\x9a\x45\x86\x32\xd9\x8a\xfa\x20\xc9\xc2\x75\x84\xe5\xb0\x37\x09\xdb\x97\xac\x4d\x7e\x0b\x16\x67\xea\xe1\x1d\x59\x51\xd4\x27\xe4\x44\x26\x06\x3e\xb9\x17\x03\xef\xc5\xc0\xbf\xb6\x18\xa8\xdf\xe7\xf1\x45\x73\x57\x2f\xf4\xee\xe6\xee\x9e\x81\xbc\x91\xea\xc6\x52\x63\x65\x38\x27\x8a\x48\x2d\xd2\x0a\x99\x7d\xa2\x53\xa4\x70\xb9\x26\x73\xd9\xa7\x71\x71\x0f\x3c\x4f\xe7\x6b\xc9\x60\x13\x81\x81\x4f\x7e\x1c\x94\x50\x1b\x42\xe3\x0c\x54\x82\x7b\x7a\xf6\x15\xb1\x72\x0c\xa5\x2b\x68\x0c\xde\x04\x49\x30\xa5\xfa\x75\x3e\x63\x59\x1c\x15\x86\x2a\x40\xba\xf0\xd0\xe0\x68\xbf\x9f\x1b\x18\x72\x2a\xce\xe6\x35\xf6\xef\x21\x65\x1c\x26\x4a\x4c\xff\x9e\x96\xf8\x37\x0a\x72\xee\x73\xa1\x2c\x12\xc5\x94\x82\x97\x4a\xcf\x26\x65\x7a\x9a\xb7\x1d\x8b\xca\x36\xcd\xf6\x80\xc4\x1c\x44\x88\x36\x4a\x63\x4d\x18\xee\x44\x51\xf8\x1c\x45\x1c\xca\x8e\x4f\xfa\x32\xcc\x99\x60\xa3\x52\xea\xdc\x1c\x73\x67\x9c\xfa\x92\x42\x84\xe6\x10\xdb\xae\x1a\x67\x9f\xbc\x61\xac\x3c\xa2\xb9\x08\x22\x0d\xf8\x70\xbc\x50\x1a\x9e\x3d\x1b\xe3\x4d\x0e\xea\xea\xed\x32\x8e\xb5\x63\x8c\x1e\x93\x22\xe9\x45\x04\xd7\x66\x3e\xdc\xfd\x31\xe3\x0f\xdd\x59\xd8\x1d\xb2\xf6\xb5\xe2\xee\x38\x98\x6c\x14\x6d\xc7\x0e\x70\xa2\x42\xc9\x98\x07\x31\x52\x13\x3e\xe6\xfd\xbb\x03\x11\x61\xa2\x3a\x76\x8c\x46\x9b\x70\xf5\xca\x09\x0f\x90\xae\x4e\x9c\x36\x9a\x38\xe8\x21\x83\x74\xb1\x64\x10\x9d\x4a\xf2\xa0\x03\xd5\x52\x89\x8d\x75\x0f\x77\x2d\xa1\x20\xdf\xe3\x46\x4f\x69\x4b\x86\x54\x4e\x17\x7b\x04\x82\x64\x57\x85\x90\x22\xcf\xf4\x6f\x4e\xdd\x50\xe4\x94\xb1\x03\xf4\x59\xe3\x59\xdf\xc1\x3a\xe7\xf7\x2a\x7a\x2d\xc6\xbc\x8b\x78\xee\x80\xb7\xfa\xac\x68\xba\x23\x2e\xc1\xbd\x27\x46\x8a\x19\x2c\x17\xa3\xd0\xde\xac\xc0\xd9\x0c\x1c\x7b\x9e\x79\x01\x54\x55\xde\xd8\x24\x02\x17\xbe\x90\x45\xf2\xfd\x94\xa4\xc3\x15\x22\x17\x05\x72\xdd\x36\x42\x42\xb3\x18\x44\xd8\x1d\xab\xd8\x47\x6c\x2f\xc9\x2b\x3b\x5f\x16\xf2\x04\x00\xa3\x65\x80\x01\x21\xcf\x08\x30\xa4\x8e\x29\x7e\x2d\x88\x54\x67\x80\x66\xa9\x44\x99\x51\xe5\x56\x19\xab\x38\x1c\x54\x49\x17\xb9\x1c\x9f\xa6\xb4\x35\xfa\x05\xa3\x8b\x65\xc8\xa1\x8d\x96\x51\x1c\x02\xc2\xc4\xa0\x58\xa6\xe3\xdf\x16\x18\xfe\xc7\xa3\x17\x47\xeb\xeb\xeb\x20\xde\xb7\x73\xb2\x9c\xc6\x97\x7d\x11\x45\x8c\x1d\x08\x96\x39\xdb\x13\x0b\xd5\x4a\x82\x5c\xca\xb2\xdf\xd2\xae\x46\xdd\x90\x30\xc6\x01\x19\xea\xbd\xf5\x96\x11\xe9\x69\xf4\xcb\x09\xcb\x3e\xd9\x3c\x3d\x65\x62\x17\xfe\xbc\xba\x52\x76\x9b\x36\x28\xff\xb1\x05\x65\xd8\x58\x76\xfd\x57\x45\x56\xed\x00\x49\x10\x17\x76\xd0\xab\x10\x55\x76\x8b\xaa\x2e\xd5\xb5\xd1\x29\x0f\x81\x92\xf8\x9f\x65\x11\xc7\xcf\xb7\x90\xdf\xf5\x69\x78\x15\x3f\xd0\xc4\x8a\x60\xe1\x0b\x55\x60\x9c\xd5\xa1\x2d\x53\xa2\xd4\x17\x53\xfa\x7e\xc6\x88\xc5\xa2\xcc\xeb\x3c\xa6\x79\x76\xc3\x1c\x5e\xb4\x83\x99\x99\x32\x8a\xb4\x0c\x68\xbc\xe1\x54\xcc\xee\x1a\xd5\x94\x0f\xc1\xbe\x86\x12\xa4\xc2\xb2\x9a\x7a\x7a\x96\x61\xae\x68\x52\xef\xce\x51\x72\xc8\x65\x46\xe1\x86\xf4\xfd\xbb\x03\xe5\x81\x89\x9b\xb2\x8c\x83\x44\x09\x9b\x51\x22\x94\x2e\x7e\x5f\x4f\x99\xeb\xeb\xb1\xdf\xef\x5f\xe3\xf8\x6e\xb6\x2f\x3d\xad\xc9\x94\x45\x3d\x9c\xb4\xce\xa7\x7d\xa9\xbb\xf9\x55\x88\x50\xd2\x80\xe9\x93\x1e\xcf\x5a\x19\xa2\x45\xc9\x12\xc5\xce\x1b\x69\x03\xd3\xf4\xfa\xef\xdb\x7b\xbd\xcf\xbd\xde\xe7\xaf\xad\xf7\x11\x4a\x9f\x70\x74\x8b\x9b\x3f\x9f\xde\x47\x69\x6b\xb0\xe2\x87\x33\x27\xa5\xd1\x79\xf1\xdc\xe0\x23\x6c\x18\xa6\xcb\x0f\x47\x53\x01\x23\xb5\x92\x77\x2b\x02\x85\xad\x69\x79\x29\xef\x78\x6c\xfa\xc5\x05\x17\xf9\x42\x2c\xe9\xca\x92\x83\x3a\xac\x66\xb4\xb3\x08\x20\x47\xed\xd2\xf1\x75\xd0\xd2\x37\xeb\x5d\xbe\x3c\x60\xd1\x62\x59\xa8\xc7\x6b\x09\x3d\x17\xd8\xec\xe8\xed\x92\x09\x1d\x43\xd2\x56\x70\x56\x1c\x8d\x21\x69\x87\xa3\x4f\xbe\x5c\x29\x26\xee\xa8\x3e\xa9\x46\xa7\xb4\x59\xa3\x0a\xce\xdb\xa8\x2f\x57\x36\xba\xed\x36\xba\x58\x16\xaf\xe8\x45\xfd\x30\x5f\xd1\x8b\xb2\x31\x9a\x59\xd5\x03\xac\x6f\x8b\x03\x95\x0d\xcd\xdf\x96\x35\x2e\xb1\x19\x9d\x68\x38\x39\x11\x3d\x8d\xe4\x9e\x18\x7a\x4f\x74\x0b\x80\x4f\x4b\x76\xae\x17\xcf\xf5\xae\xc5\x69\xa7\x35\xdc\x81\x2d\xea\xe9\xfd\x16\x75\xbf\x45\xfd\xb5\xb7\x28\x7d\x35\x41\x8b\xd9\x8d\xee\x25\x04\xf0\xdd\xbe\x4a\x2c\x89\xfe\xef\x0b\xff\xef\xbb\x04\xf1\xdf\x83\xd4\x6c\x9b\x0c\x44\x9a\x23\x5b\x40\x0b\x91\x2c\xc1\xc6\x65\xed\x8d\xd3\x64\x12\x4d\x25\x18\x0a\x85\x83\xa1\x65\x64\x15\x09\x76\x2e\x9e\xad\x19\x17\x34\x22\x51\xc2\xfc\xc8\x43\x81\x5b\xc8\x80\x44\x09\x72\x98\x7f\xb8\x4c\xc6\x7c\x8b\xc1\x50\x39\x4f\x95\x60\x8c\x15\x67\xd4\x06\x12\xa9\xaa\x2e\xee\xa0\x08\x43\x44\xa3\x20\x91\xd9\xdc\xeb\xa1\xd3\x1f\x99\xac\x84\x10\xf0\x99\xd6\xe4\xce\x40\xe9\xbc\xc5\x1b\x41\x50\x02\x6e\x9e\x76\xc9\x83\x07\x44\xfc\xee\x83\x4e\xf0\x68\xd2\x69\x6f\x5e\xb4\xb9\xeb\x92\xcd\x2e\x79\x46\x5a\xb4\x98\xb1\xdd\x03\x02\x93\x3e\xbf\x7c\x15\xe4\xb3\x16\x19\xda\xc9\x5c\xa3\xdb\xd2\x52\x02\x8a\xff\xf4\x63\x96\xce\x9f\xff\x06\x3d\x6d\x8b\x2e\xa1\xb0\x42\xcf\x2f\xa1\x61\xd6\xe9\xfd\x24\x3c\x64\xe5\x54\x34\x2f\x2f\x24\x1f\x87\x82\xd5\xe3\x59\x26\xe3\x98\xfe\x46\x03\x38\x66\x6d\xd5\x74\x1d\xc3\x94\x76\x5a\xce\x0f\x1a\xe7\x41\xba\x4c\x1a\x5d\x33\xdd\xc1\x38\xbc\x6d\x73\x12\xc2\x43\x29\x01\xe3\xa3\x72\xa6\xe0\x37\xec\xff\xb1\x6a\x10\x4d\x86\x33\x09\x18\xc0\xe8\xb3\xea\xde\xcb\x62\x76\xd7\x07\x84\xc6\x87\x83\x3b\x3a\x1b\x40\x00\xe0\xf2\xb3\x01\x57\x7d\x70\x2e\x1e\x51\x6f\x8f\x16\xb8\x33\x8b\x9a\x7e\x2c\x6e\xd0\x05\x74\xc7\xcd\xb9\x2b\xf7\x7f\x41\xb0\x87\xee\xc3\xe7\xfb\x6f\xad\x60\x64\x82\xa7\x72\xad\x0c\x7f\x40\x2b\x74\x33\xd7\x6b\x6b\xbc\x77\x7d\x6e\x19\xa5\xde\xd2\xbc\x2c\x66\x5a\x1b\xd4\x23\x6d\x1c\xba\xb9\xdd\x13\xc3\x9c\xd2\x62\x58\xa2\xf3\x94\xbe\x4a\xfb\xb8\xa0\x18\x49\x4f\xe8\xe9\x8c\xc2\x67\x41\x6c\x44\x19\xeb\x5b\x81\xb3\xcf\x82\xd8\x71\x46\xa2\xd2\xae\xd7\x00\x3d\x2b\x0d\x45\xf8\xf9\xbb\xc9\x60\x44\xd1\x9b\x0c\x47\x14\x6d\x38\xa0\x26\x67\x51\xc6\x5d\x82\x18\x2c\x37\x6b\x4f\x4e\x02\xd0\x3d\x3d\x49\x36\xe5\xe4\xab\x23\x14\xb2\xe6\x34\xae\xf0\x86\xe4\x44\x0b\x54\xfc\x7a\x4f\xb8\xd1\xfc\x51\xdf\xe6\xd9\x10\x38\xf2\x39\xe7\x27\x0a\x18\x85\x8e\xb4\xee\xb1\x86\xb8\x1a\x9e\xa7\x7c\xd6\x28\xa0\x92\x63\x73\x9a\x05\x53\xba\x5f\x34\x39\x39\x0b\xd0\x52\x1c\xf9\x20\xd4\xa1\xb6\x02\x4b\x7c\xdd\x71\x8e\x5d\xa4\x70\xb2\x5c\x05\x2d\xde\x81\x09\xe7\x8e\x35\x63\x62\x50\xa5\xc3\xb1\x32\x7f\xfb\xf9\xf6\x0e\x4c\xae\xfa\x3a\x7a\xe6\xec\xc8\x1a\x9a\x12\x19\x6f\x37\x2c\x5f\x6f\x7b\xce\x12\xd7\xf6\xaf\x6c\xf1\x92\xeb\xd5\xe8\x97\x35\x51\x4d\xbb\xb0\xff\xd6\x63\x02\xc0\x1c\x4c\x28\x89\xee\x6b\x60\x02\x91\xf2\x2d\x06\xdd\x5b\x2b\xa1\xec\xf9\x22\x8a\xf9\xe1\xad\x96\xbc\x05\x68\x05\x8d\xbb\x10\x12\x0f\x9b\xe5\xf4\x67\xcb\x6b\x0d\xe9\xd1\x2e\xe6\x74\xab\x4a\x64\x75\x3b\xb8\x75\xcb\x89\xaa\x9a\x1b\x39\x85\x2f\xe8\x38\x9a\x07\x71\x39\x2a\xb4\x14\xd8\x10\x09\xba\x40\x09\x51\xfe\x71\x07\x6c\x0a\x4f\x35\x83\x2d\x8f\x95\x5c\x72\x04\x03\xf9\xba\x72\xd0\xf5\x2b\x08\x55\x58\xcd\x3c\x3e\x7a\x4e\xa8\x2b\x8d\x49\x95\x72\x06\x57\x76\xf8\xfd\x23\x71\x9a\x9b\xe0\xe9\x3d\x1d\xd3\x68\xd1\x80\xcc\xdd\x32\x4d\x08\xc0\x05\xbd\x2d\x05\x88\x1a\x1b\x0f\xb0\xe1\x2a\xae\xe5\x62\x9e\xc1\xd9\x80\x4d\x28\x80\x8b\x45\x77\x24\x20\xd6\x2e\x6f\x76\x40\x7a\x1f\x9c\x37\x5f\xe2\x6e\x01\x3f\x22\x2a\xe1\x9a\x70\x36\x86\x07\x8f\x2c\xe4\x86\x96\xae\xeb\x6d\xa3\xae\xde\xbc\x9f\xf6\x4c\xf9\xd6\x98\x6f\x1c\xd1\x34\x59\x61\x1c\x26\x74\xc9\x38\x4a\x81\xbe\xf2\x38\x1a\x74\xbe\xbc\xc7\x77\x2e\x6b\x97\x10\x8e\x30\xee\xaa\xea\x28\x04\xfe\xf7\x76\xd4\xca\xb9\x49\x47\xd9\x5e\x70\x67\x27\x02\x33\x42\x7a\xd5\x98\x10\xa4\x7f\x68\x7e\x80\x9b\x50\x8c\x31\xc2\x5b\x71\xa5\x31\x97\x4f\x65\x5c\xf3\xba\x69\xe3\xd0\x7d\x19\xec\xbc\x64\x0a\xcd\x3a\x7d\x63\x2d\xed\xc8\xeb\xd7\xaf\x1b\xf6\x21\x2e\xa5\x20\x55\xd3\x4a\x2d\x7f\xa0\xd9\x82\xd6\x6e\x4f\x0a\x03\x1c\xba\x1a\x01\x0e\x4c\x45\x2f\xf2\xe5\x68\x1e\x15\x3f\xa7\x59\x9d\x94\xa4\x01\x4b\x56\xba\x2f\xbf\xfa\xea\xbb\x41\xab\x02\xaa\x74\x2b\x2e\x69\xcf\x3a\xe2\x38\xd7\xdf\x5a\xf1\xd3\xc3\x69\x4a\xd1\x61\xa4\x1e\xa4\xa1\x09\x06\x4b\xd8\x48\x01\xd9\xdf\x2a\x24\x0e\x60\x6e\x49\x5b\x7c\x70\x21\xf4\x51\xc2\xc8\x43\x05\xcb\xd2\x95\x60\x5a\x06\x20\x64\xa7\xb2\x6c\xab\x51\xd3\xa0\x17\x31\x12\x9d\xe8\x8a\x01\x28\xcf\xdc\xaf\xcc\x42\xa5\x25\x50\xf3\xe6\x8a\x76\x32\x5e\xbf\x7e\xed\x02\x73\xea\x47\x55\x2a\xc2\x34\x06\xcd\x12\xe0\x5b\x58\x38\xf0\x98\x6c\x4a\xd9\x5d\xe5\xa3\x59\xd3\x11\x23\x5d\xa5\x75\x35\x4d\x47\xd5\xc2\x8d\x92\x51\x90\x63\x45\x85\xe8\x00\x30\x4a\xb1\x6e\x05\x8c\x02\xb9\xee\xf6\x56\x68\x63\x1e\x25\xa6\x75\x8b\xd3\x82\x80\xb8\x61\xfd\xb3\x20\x9f\x65\x41\x51\x39\x86\x12\x98\x46\x3b\xc3\xea\x3d\x92\xb7\xb3\x15\x1d\xf2\x83\xd4\x9f\x33\xc4\x75\xb0\x79\xb8\x58\xbd\x87\xd3\x20\x7f\x97\x45\xe3\x4a\x9c\x95\xc0\xdc\x58\x09\xbc\x7a\x2f\x45\xd8\xa1\xbc\xaa\x97\x0a\xe6\x86\x6d\x8c\xd0\x15\x5a\x45\x33\xe5\x60\x5f\x89\x86\x64\x4c\x86\x7f\x70\x5b\x9b\xaa\xbe\xd9\xa0\xa8\x45\xcc\x42\x8c\x6b\x97\xfe\x58\xdb\x31\xa0\x2b\xcd\x51\x64\xbc\x58\x08\xc6\x45\x9a\x49\xf1\x47\x5a\x3e\x80\x19\x71\x8f\x30\x58\xc3\x96\x58\x40\xfb\x1a\x9b\x48\x4b\x07\xe7\x29\x6a\x0f\x3d\xb7\xe3\x50\x07\x19\x05\x4b\x25\x78\x3c\x76\x60\x99\xd3\xa3\x38\x45\xdc\x7a\x42\xd7\xc3\x50\x21\xc3\xcd\x5b\x37\x76\x3d\x69\x8e\xd1\xa7\xc5\xac\xd3\xed\xb9\x24\xfb\x3a\x9d\x22\xd9\xb8\x59\x97\x7c\x03\xd5\x86\x18\xd5\x2e\xf4\x25\xf6\x3b\xa2\x40\x7f\x1a\xa7\xa3\x20\xee\x33\xa4\xf6\x03\x37\x59\xc4\x3c\xf3\x35\x19\x8d\x83\xc5\xdb\x9b\x36\xcb\x0a\x3b\x8d\xf2\xc4\xaa\x26\x91\x55\x8a\x6e\xd0\x7e\xfa\x80\x63\x4a\xc9\x02\x1d\xff\xf4\xd4\x79\xa3\x7a\x59\xcc\xb4\x3d\x9f\x65\x98\xd3\x1a\x6e\x3d\xed\xb5\x1c\x03\x21\x61\xa0\xae\x2d\x73\x5a\xc3\xed\x6f\x20\x81\xcf\x69\x6b\xb8\xfd\x1d\xff\x54\xb4\xd0\x1a\xee\xf0\x22\xd1\x28\x48\x5a\xc3\x9d\x9d\x9e\x69\x3e\xf8\xff\xb1\xf7\xee\xfb\x6d\xdb\xcc\xa2\xe8\xdf\xc9\x53\xa0\xdd\xe7\x6b\xa4\x98\xb6\x75\xb7\xa3\xc4\x5d\xcb\x91\xed\xd8\x2b\x71\xec\x6d\x3b\x6d\xbf\xed\x9f\xeb\x1f\x25\x42\x16\x1b\x89\xd4\x22\x29\x5f\xd2\x78\xbf\xcf\x79\x8e\xf3\x62\xe7\x87\xc1\x85\xb8\x52\x94\x2f\x69\xda\x65\x7f\x6b\xa5\x22\x09\x0c\x06\xc0\x60\x30\x18\xcc\x05\x1e\xd9\x20\xfd\xd8\x6d\xb5\xe0\x99\x9b\x11\xfd\xd8\x6d\x51\xf0\x8c\xb3\xff\xd8\x6d\x51\xb4\xf8\x65\xef\x8f\xdd\x16\x69\x90\x1b\x01\xfd\xd8\x6d\x35\x6f\xcf\xbc\xe6\xab\x27\x7b\xc4\x27\x7b\xc4\x7f\xb6\x3d\xa2\xcb\x18\xf1\xde\x36\xf3\xe5\xcd\x04\x4b\xd8\x00\x42\xb9\x8f\x38\x7b\x4c\x13\x7b\x78\x3b\xdf\x64\x25\x37\xae\xbf\x8b\xcd\x4a\x09\x93\xfa\xd5\xd5\xd5\x3c\x26\x8d\x2d\xce\x0d\x4b\xd8\x48\x58\x3c\x80\xc3\xd9\x08\xf9\xd3\x50\xc2\xfd\x91\x0e\x24\x66\x32\x7a\x4d\xe0\x51\x33\xd6\xdf\x55\xb8\xc2\x38\xd1\x75\xe3\x46\x2b\xae\x42\x0b\x08\x7c\xb2\xf8\x65\x6c\x6a\x1f\x71\x66\xd9\xd4\xd4\xcd\x4b\xde\x5d\x6e\xcf\xbc\x56\xed\x69\xb7\x78\xda\x2d\xfe\xd9\xbb\xc5\x77\x6a\xbd\xfe\x70\x86\xe6\x25\xed\xe0\x73\x53\xce\x43\x9c\xa4\x71\xe4\x8f\x9f\xec\x39\x1f\xdb\x9e\xf3\xb6\x9c\x85\x5f\x84\xaf\x72\xb3\xc1\x22\xfd\x70\x5e\xd0\x54\x11\x4f\xd9\xac\x9e\x5b\x0b\xdd\xe3\x86\x32\x9c\x90\x8d\xe0\xc8\xbf\x7a\x8f\xe7\xdd\x5c\xc8\x45\x5f\x78\xcf\x9f\x3d\xd3\x71\x33\x0a\x14\x78\xa6\x95\xbf\x89\x33\xdb\x11\x1f\x24\xc3\xbd\x67\xcf\x4a\xde\x4d\x97\xbe\x82\xc3\x83\x23\x3c\x88\x2f\x69\x70\xa8\xa2\x3b\x2b\x5e\xce\x8a\xab\xfa\xb5\x60\x40\x66\xd1\x38\x1e\x7c\x2e\x47\x29\x4a\xd9\x02\x62\x71\x95\x2b\x63\xf0\x58\x6e\xdc\x9c\xa3\xf7\xc0\x37\xdf\xf9\xdc\xcf\xbd\xfe\x5e\xe4\x9a\xd3\x76\x6d\xec\xec\x52\xf9\xf9\x29\x37\x3b\xc5\x73\xb3\xc8\x5d\xa6\x3e\x37\x1a\xf2\x36\xc9\x9a\x35\x2c\x35\x22\x2d\xde\xfc\xad\x42\x41\xd2\xed\x09\xa7\x6a\xd7\x6d\x87\xf3\x52\x44\x02\x27\xcb\xbb\x8f\x77\x3e\xd8\x9c\xa3\x16\xce\xa7\x43\x2e\xec\x10\xcb\x4d\xb9\x9c\x6f\xb7\xb9\x70\x6e\x51\x11\x69\x5a\x21\x5d\x4e\xaf\x3f\xc9\xe9\x4f\x72\xfa\x3f\x5b\x4e\x67\x42\x7a\x3a\x72\x68\x75\xe6\x88\xdf\x38\xc1\xb3\x09\x01\xfd\xf3\x1c\x25\xd0\x20\x4e\xf0\x4a\x18\xab\x72\xfa\x5a\xe9\xc0\x09\x25\x1d\x2d\xe7\xf9\x6b\x42\xa1\xe3\xd1\xe8\xd1\xb5\x43\xdf\x8f\x3c\x4e\xb8\xe3\xf1\x48\xb9\xdd\xc0\x57\x2c\xe8\xf4\xce\xb7\xb8\xd0\x49\x47\xf3\x2f\x74\xd2\x11\x5c\xe8\x50\xc1\x65\x91\x7b\x9b\x22\x39\xdf\xbd\x39\x19\xe2\x81\xb4\x35\x5d\x5a\x6f\xea\x98\x88\x90\x8e\x46\xe7\xf6\x02\xaa\x51\x08\xb2\xe8\xb2\x8a\x1a\x0d\xa3\x61\xec\x6e\xd1\xf2\xf5\x7e\xcd\xa5\x38\xdb\xf7\xaf\x19\x11\x1c\x87\x5f\xf4\xcb\x61\xa9\xed\x79\x45\x55\xab\x9f\xbb\x20\x12\x46\x87\xf1\xaf\xc5\x08\xd8\x8a\xdc\xaf\xe1\x89\x9f\x7c\x3e\x49\x66\x69\x86\x83\x43\x6c\x5c\x06\x4b\xcd\x17\x17\xbc\x1f\x12\x11\x26\x32\xdd\xa1\x1f\x16\xb4\xef\x2c\x73\x3f\x0a\xf0\x83\xe0\x30\x09\x2f\xfd\x0c\xd3\x23\xa1\xa3\xf5\xa2\x62\xf7\xeb\x3b\x4d\xfa\x35\xb7\xfb\x45\xc5\xee\x87\xc0\xc8\x4f\xe7\xb6\xee\x2c\x73\xbf\xa6\x2f\x70\x46\x37\xf4\xc2\xb1\x2f\x28\x75\xff\xe6\x4b\xcc\x7d\x51\xb1\x7b\xd3\xfd\xf1\xcd\xa4\xb0\x71\x57\x91\x7b\x53\xfd\xbc\x86\x5d\x45\xee\x3b\xe4\x44\x8e\xcb\x30\x05\xbd\x93\xc4\x93\x43\x3f\x4d\xaf\xe2\x24\x28\x1a\xff\x92\x75\xee\xbd\x0e\xe6\x8d\x89\xab\xc8\xbd\xc9\x70\x5e\xc3\xae\x22\x0f\xc1\x7a\xe6\xb5\x5d\x50\xca\xde\xbc\x78\x58\x5d\x45\xe9\xac\x0f\x37\x6f\x34\xa5\xf1\x2c\xca\x9f\x27\x61\x9a\x86\xd1\xc5\xf3\xd2\xd8\x4e\xe3\x54\xbf\xba\x92\xb0\xb4\x7c\xb5\xe8\x29\x50\xb1\xde\x11\xcd\xbf\xe5\x3a\x1e\x8d\xa4\x04\x62\x9a\xed\x85\x72\x8a\xd6\x2c\x23\x5a\x8d\xa7\x33\xf4\xd3\x19\xfa\x9f\x7d\x86\xce\xef\xba\xfa\x5f\xbe\x68\x77\x5d\x9b\x63\x7c\x8d\xde\xe2\x04\x5f\xa4\x5f\xfc\xf4\x4b\x88\xde\xf8\x63\x7c\xfd\x9f\x49\x36\x4c\x57\x46\x33\xf5\x38\xdc\x61\xd1\x4c\x8f\xf0\x10\x27\x38\x1a\xe0\x2e\x22\xed\xa7\xdd\xd5\xd5\x8b\x30\x1b\xcd\xfa\x2b\x83\x78\xb2\xca\x4f\xdd\xab\x17\xf1\xb2\xf8\xdd\x1f\xc7\xfd\xd5\xf4\xca\x4f\x26\xab\x61\x94\xe1\x24\xf2\xc7\xab\xa4\x4b\xf8\x3a\xe3\xff\x5d\xb9\x88\xff\xd7\x87\x66\xf3\x91\xaf\xc6\xf2\xfb\xae\x63\x82\xcd\x3f\xfc\x70\x0d\x3f\xfe\x16\x97\x5d\xd4\xf2\x15\x67\x57\x71\xf2\xf9\x08\x43\xa8\xda\x22\x45\xb9\x5e\xdc\xd4\x96\xf7\xbf\x7c\x39\x2f\x28\x75\x1f\xdf\xbc\x9b\x68\xb0\x1d\xf9\xfd\x31\x9e\x87\xa5\x54\xd2\x8e\xa0\xbd\xc0\x7d\x70\xbb\xf2\xa7\x25\x71\xcb\x4b\x3a\x70\xb3\x16\xb8\x07\x6e\x41\x7c\x15\xb1\x28\xc4\x45\x88\xf1\x62\x76\xac\x2c\x5f\xcb\xbb\x9b\x3a\x10\x9b\x4d\x4b\xa0\x45\x0b\xd9\x91\x32\xbe\xdd\x1b\xa5\x04\x67\x49\x88\x2f\xe7\x45\x80\xe0\xc5\xec\x68\x59\xbe\xde\x87\xb4\x32\xb2\xdb\xcd\x21\x2a\x52\xc6\x41\x4e\xda\xa7\x7b\x0f\xd1\x05\x2e\xe1\xce\x6c\xc7\x45\xfd\x70\x8f\x31\xa1\xd9\x1b\xe6\xc4\x48\xb5\xe3\xa0\x7e\xb8\xf7\x68\xb0\x84\x2d\xc5\xc8\xd0\x42\x76\x7c\x8c\x6f\x1c\xa5\x56\x29\x94\x0a\x6e\x75\x0d\x15\xa7\xce\x96\xa5\xdb\xbf\x9c\x1f\x4a\x2f\x73\x46\x94\xbf\xe4\x7c\x40\xba\x71\x9c\xaa\xcf\x9c\xfa\x25\x40\x84\x04\xf3\xc7\x0b\x2c\x5d\x4c\x4e\x67\xd2\x83\x24\x8b\x3f\xea\x35\xe3\x28\xbc\x74\xfa\xc6\x90\x39\x81\xef\xce\x33\x64\x31\x6c\x8b\x52\x56\x81\x0d\xdf\x1d\xc7\x2b\xcb\xf9\x8a\x08\x4b\xb6\x60\xb7\xd6\x7b\xc9\xe6\xd3\x99\xea\xe9\x4c\xf5\xcf\x3e\x53\xb1\x03\x15\xbf\x20\xfa\xb6\x51\xda\xef\x62\x58\xcd\xbd\xa3\xfc\x69\xc8\x85\x71\x9a\xe2\x2f\x1b\x15\x59\xa0\xd1\xeb\xb2\xc2\xa8\x94\xbc\x74\x76\x33\x25\xf2\x01\x8b\x40\xf9\xfa\xb9\xc4\xc0\xc3\x6c\x30\xaa\x90\xef\x7a\x6e\x91\x81\x9f\x62\xf4\x82\x50\x7c\x9a\xbd\xe8\x2a\x9f\x60\xb2\x92\x8b\x74\x25\x1d\x85\xc3\xac\xa2\x25\x14\x41\x46\x72\xc0\x9a\x59\x80\xb1\x64\x70\x5f\x8b\xf0\x15\x8d\x40\x45\x2f\x64\x5f\x5b\xd0\x98\xe2\x28\x08\xa3\x8b\x47\xc7\xe3\x90\xb6\x23\xdb\x10\xd9\x90\x62\xa1\x03\x4d\x6c\x34\x70\x46\x65\x9a\x60\xe5\x56\x92\x0e\x44\xa9\xf9\x96\x84\x0c\x9a\x2e\x23\x28\xa4\x60\x91\x9d\x2c\x52\x75\x14\x46\x69\xe6\x8f\xc7\xa5\x5a\xd6\x4a\xdb\x7d\xdd\xdd\x85\x0a\xf0\xb8\xc0\xd9\x87\xf8\xa2\x44\x40\x31\x52\xca\xe9\x63\x4f\x5b\xd4\x8a\x14\xb4\x3a\x8d\xe7\xc6\xe1\x20\x45\xe6\xb4\xd7\x1b\xf9\xd1\x05\x2e\xd1\xa4\x4d\xf8\xa0\x20\x64\x93\x2c\x65\xf4\x14\x41\x88\x74\x4c\x6a\x24\x1e\x8f\x65\x79\x60\x61\x7e\x93\x8e\x46\x2b\xc0\x1a\x0d\x76\x93\x8e\x4c\x76\xe3\x16\x9f\xe6\xdc\xd2\x18\x64\x80\x8c\x5b\x1a\xc5\x92\xe0\x41\xd5\xf4\x6e\x62\x44\x36\x4d\xfd\xe3\x21\x62\x92\x2e\x32\xae\x29\x68\xb3\x0c\x07\xbd\xe8\xfd\x9a\xd7\xc8\xf8\x01\xda\x96\x49\xcf\x90\x44\x29\x0e\x38\x1b\x75\xc9\x3f\x14\x58\x3a\x1a\x75\xc9\x3f\x54\x78\xb5\x25\x64\x68\xb5\x9e\x44\xd2\x27\x91\xf4\x1f\x2e\x92\xe6\x7a\x7e\xee\x63\xfd\x40\xd9\xa2\xa9\x7f\xf8\x11\xbe\x20\xf3\xec\x27\x9b\xfd\xd0\x91\x97\x20\x5d\x7d\xa7\x16\x85\x44\xff\x5c\x3d\x1f\x0e\xfc\xa9\x0c\xc4\x05\x63\xaf\xb7\x79\x68\x42\x90\x30\x61\x8e\xe8\xcc\x7a\x19\x6d\xa0\x17\xb5\xeb\x41\x27\x78\x15\x34\x06\x41\xab\xf5\xca\x5f\x6b\xb7\x06\xad\x57\xad\x46\xa7\x85\xeb\xeb\xb5\x57\x83\x76\x0d\x37\x5b\x41\xa7\xd5\xee\x34\xfa\x2f\x72\x5c\x6c\x60\xfc\xba\x5f\xaf\xd7\xfb\x83\xda\x5a\x6b\xf0\x6a\x30\xf4\xd7\xd6\xeb\xc3\xda\xa0\xb9\x8e\x3b\xcd\x7e\xd0\xae\x0f\x5e\xd5\xfb\xeb\xfe\xb0\x56\x7b\xe1\xe6\x4d\x14\xc7\xae\x24\xe9\xfa\xfd\xb0\x6b\x19\xc4\x9c\x13\x32\x37\xf8\xae\xb5\x7f\x74\xa7\xa7\x85\x09\xda\x06\x64\x7d\x5c\x2d\x70\xcd\xee\x52\xa8\x0a\xc7\x2c\x9e\xc5\x1f\xbb\x75\xef\xc7\x39\xf3\xf4\x63\xb7\x41\x98\x6d\xfb\x89\xd9\x3e\x31\xdb\x7f\x36\xb3\xcd\x79\x2d\x57\x7e\x69\xcc\xb6\xc8\x30\x79\x98\xc4\x5f\xf0\xc4\x8f\x56\x02\xfc\xf3\xb7\x4a\xe7\xaf\x5f\x90\xde\x27\x5d\x3f\x55\x24\x4a\xdf\xe9\x0b\x25\x23\x81\x56\x22\xd5\x4b\xdc\x25\xf7\xfe\xe2\x19\xfe\x0b\xb2\xf5\xf3\xb1\x78\xfc\x7c\xfd\x65\x73\x7c\xdf\x3b\xc5\xb7\xa5\x4b\x05\x49\xbe\x6d\xa1\x5b\xb4\x11\xfe\x0f\xdb\x5b\x5a\x17\xd2\x6d\x7f\x27\xe9\xb5\x9d\xfd\x7e\xa0\x04\xdb\x3f\x6c\x50\xc2\xd1\x5e\x91\x0d\x65\x18\x46\x38\xb8\x4f\x06\x6e\x9e\x39\x36\x8b\x11\x4b\x5b\x9d\xa7\xb3\x86\x74\xdc\xe2\xb0\x2d\x12\xb2\xae\xa0\x7d\xb2\xb1\x85\x38\x65\x94\x04\xc3\xa4\x8d\xa5\x96\x03\x7b\x6e\x36\x7d\x3e\xae\x3b\x6c\xa4\xbe\x7e\x9c\x8d\xc7\xb7\x92\xb1\x7b\x38\x44\xf8\x3a\x4c\xa1\xb8\x75\xc8\xb5\x16\x0b\x73\xca\xf3\x0c\x36\xbc\x35\x9a\xc3\x46\xce\xbb\xbf\x8c\xea\x67\x55\x47\x9a\xf9\x95\x69\x3c\xad\x54\x21\x6f\x35\xbb\xf7\x22\xfc\x1f\xd6\x13\x8c\xd6\x0f\xb2\x70\xa3\x0e\x37\xb5\x6f\xc8\x31\xcb\x62\x3b\x29\xaa\x76\x10\x2e\x62\x64\xaf\x78\x2f\x9c\xd4\x58\x3e\x7d\x37\xd4\x11\xa2\x24\xe2\x09\x4a\xf2\x74\xde\xef\x70\x56\x91\x4e\xe7\x38\x9a\x4d\x70\xe2\xf7\xc7\xb8\x8b\xb2\x64\x86\x4d\xd5\x9f\x3f\xc1\x69\x61\xaa\x6e\x29\x9f\x37\x14\x06\xe5\x2d\x92\x72\x78\xa7\x73\x92\x78\xa7\x5a\x16\xef\xd4\x91\xc6\x5b\x2f\xf2\x5a\xd1\x88\x89\xe6\xeb\x3c\x7b\x3f\xed\x84\x3d\xbb\x4b\xdc\xff\xc3\x83\xf2\x1e\x1d\x32\xd6\x17\x02\xdf\x4f\x6f\xa2\xc1\x3b\xd8\x6f\x88\xc8\x0b\x5d\xa8\x9e\x29\x39\xd1\x37\x59\x91\x8a\xe4\xa6\xa1\x55\x53\x26\x09\x40\xa8\x2c\x03\x6e\x97\xd1\x12\xe0\xb0\x32\x18\xf9\xc9\x66\x56\xa9\x55\x57\xb2\xf8\xd3\x74\x8a\x93\x9e\x9f\xe2\x4a\x95\x7f\x86\xac\xca\x95\x7a\xd5\xb9\xf1\xf0\x99\x75\x67\x1e\xcd\x37\xee\x3c\x8d\x2a\x8f\x88\xc6\x6b\x5c\x90\x0e\x99\x2b\x46\x08\x28\x4a\x82\x6d\xf1\xd6\x96\x62\x5b\x55\xf4\xf0\xcc\xf6\xa2\x0a\xdd\xee\x25\x8d\x4d\x9e\x8a\xbb\xa8\x83\x7c\xd4\x17\xeb\x65\x7e\xd7\xef\x0e\x02\x86\x72\x33\x27\x6b\x87\x68\xda\xf3\x05\x7b\x55\x32\x3d\xba\x9a\x12\xdd\x3e\xd8\x66\x52\xf4\x5b\x35\x7b\xf9\x05\xce\x16\x4c\x5e\x7e\x81\x5d\xdb\xc9\xf7\x9d\xbb\xdc\x42\x1c\xe5\xb3\x97\xeb\x66\x73\x5d\x59\x1e\x35\x95\xe4\xa7\x67\xaa\x7a\x9d\x4c\x13\xab\xa2\x6d\x56\x25\x13\xa1\xcb\x53\xf6\x58\xe9\xd0\xf9\x00\x49\x07\x73\x2d\x66\x0f\x39\x62\x77\x9e\x8e\xd8\x4f\x47\xec\x7f\xf6\x11\x5b\xd2\x67\x32\x0e\x31\x61\x2c\x5d\x3d\x69\xff\x17\x1e\x0e\x13\x7c\x83\x7e\x0d\xc7\x83\xcf\x18\xbd\xf9\x03\x0f\x87\xae\x68\x3d\x0b\x85\xf6\xd9\xf7\x13\x72\x84\x3f\xf0\xa3\x01\xf6\xa1\xac\x2d\xa8\xcf\x1d\xe2\x00\xb1\x2a\xef\xfc\x4b\xf4\x6b\x1c\x07\xe8\xcd\x85\xf3\x90\xdf\xca\x0f\xf9\xff\xc5\xb8\xa9\xe2\x3c\xcc\x58\x6c\x51\x4a\x5b\x4b\xa0\x3a\x3d\x0b\xad\x2d\x05\x2d\x4e\x92\x58\x0b\x1e\xb4\x4a\xdf\x51\x1b\x04\xba\xed\xec\x65\x2f\x52\xb2\x31\x4e\xe3\x28\x0d\xfb\x63\x4a\x60\x53\x1f\x9c\x48\xd0\x84\xdd\xf9\x90\xbd\x68\x9a\xc4\x97\x61\x80\x93\x54\xd4\xf2\xc7\x69\x6c\x56\x8d\xc7\x63\x52\x95\x50\x1b\xb7\x1e\x47\x51\x1c\xd0\xaf\x61\x34\x88\x27\x32\x64\x02\x8c\xe5\x14\xa0\x57\xae\x59\x38\xc1\x64\xb1\x85\x29\xaa\xa3\x14\x0f\xe2\x28\x80\xdd\x31\x8c\x2e\xc6\x38\x8b\x23\x18\x4e\xd2\xbd\x82\x83\x3e\x47\x55\x39\xee\xf3\x97\x68\x43\x74\x45\xd2\x33\x90\xb6\x41\x03\x7c\x2b\xbd\xe4\xb8\xc8\x5a\x07\xe7\xe1\x8f\x48\x28\xa3\x24\x8e\xe2\x59\x3a\xbe\x81\x30\x18\x8e\x7d\x98\x7c\xb2\x9c\x47\x50\xe0\x67\xbe\xf3\x84\xac\xf6\x56\x51\x79\x44\x81\xd2\x79\x02\x46\x3e\xa9\xfd\xa0\xf4\x5e\x49\x6e\x18\x47\x69\x4c\xb6\x2e\x42\x14\x15\x4a\x1a\x2b\x7b\xd1\xa5\x3f\x0e\x83\x43\x56\xbe\x22\xcb\x3c\xdc\x0b\x1b\x06\x43\x92\xf0\xd5\x3d\x9e\x91\xf9\x4a\x16\x1f\xd2\x77\x80\xd2\x0a\xed\xbd\x07\xdd\x64\xc6\x16\xd2\xf9\x85\x9d\xca\x37\xd4\xb9\xa2\xc2\x2c\x03\xcd\xaf\xca\xa1\x53\xbc\x91\x30\xfd\x85\xa0\x7b\x44\xa9\x10\x0b\x41\x4d\xea\x66\x36\x4a\xe2\x2b\xa4\x76\x4f\x2f\xaf\x74\x87\x75\x93\x7e\x5a\x29\x75\xf2\xf7\x17\x9a\x7d\x90\x66\x0b\x49\x40\x3f\x97\x0a\xe9\x67\x3e\x31\x00\x70\x83\x22\xa4\xe0\xb9\xa5\x68\x83\xa7\xce\x94\x64\xe3\x22\xea\x78\x18\x42\x30\xe7\x9e\xca\xfd\x0c\x64\x09\x79\x9e\x74\x0a\x27\x89\x2e\xe2\x5b\x7a\x53\xd5\xcd\x6d\xc8\x9f\x02\x67\x11\x1a\x9b\x3f\x64\x46\x6d\xb9\x7d\x43\xc8\x65\xd9\x5e\x15\x12\xd4\x83\x73\xba\x8f\x0d\x36\x6a\x2c\x3a\x19\x90\x02\x6f\xc9\x77\x8b\x92\x89\xd6\x7b\x08\xc2\x84\x16\xbe\x33\xc2\x04\x9c\x64\xea\xe4\x4c\xe6\x6e\xa4\x98\x3e\x00\x2d\xaa\x34\xc8\xf5\x6c\x30\x1b\x15\xde\xca\xbd\x48\x2f\x9d\x47\x7b\x4a\x87\x04\xd1\xa1\x39\xdb\x1f\xce\xc4\xbe\x4a\xa4\x4d\x7e\x26\x64\x22\x9f\x41\x71\x19\x9f\x2a\xbb\x6a\xae\x90\x96\x44\x5d\x75\xd7\x77\x6e\xf7\xf3\x76\xee\x8c\x1c\xa9\x98\xe0\xa2\x23\x4a\xbe\x1d\x8a\x4f\x73\x39\x36\x8d\xfd\x7f\x0b\xd0\xf6\x82\xb9\x4b\xc6\xf2\x55\x98\x25\x71\x4c\xb2\x38\x88\xd1\x60\x8c\xfd\x68\x36\x45\x11\xc0\x27\x03\x2c\x8e\xed\x45\x43\x25\x61\x6f\x59\x79\x14\x49\x39\x20\x8a\x68\x5c\x1d\x4b\x22\x1c\x9d\xd2\xd2\x67\x44\x48\x22\xd5\xbb\x88\x02\x09\x83\xae\x01\xa8\x6b\x03\xd9\xcd\x7f\xde\xf2\x9c\xd8\xab\xab\xfa\xe8\x2b\x0c\x80\x09\x60\xea\x6e\xce\x10\xaa\x88\x15\x3e\x67\x72\xe3\xa9\x10\x4a\x89\x08\xca\xcc\x68\xe1\x74\x73\x11\x92\x23\x5d\xa8\xeb\x8e\x49\x1d\xcb\x9c\x1b\x73\x5b\x38\xf2\x02\x84\x4a\xa4\x50\x97\x77\x88\x5a\x96\x59\x06\xf9\xb5\x34\x3c\x39\xfe\x6c\x74\x2a\x4c\xa3\xfa\x19\xdf\xa4\x95\xbc\x6e\x95\x6b\x79\x21\x59\x3c\xfa\xe9\x27\xe4\x1a\x43\x42\x4c\xc9\x09\x7d\x5f\x51\x0a\xbd\x56\xc7\x59\x17\x80\x0b\xc6\x3b\xdf\x7d\x12\x4c\x78\x01\x91\xff\xf9\xb0\x4f\xf0\x60\xe4\x47\x61\x3a\xe1\xc7\xd0\x62\xe6\x00\x00\x8a\x87\x97\xb6\x21\x0f\xec\x67\x8c\xa7\x22\x7f\x00\xef\xec\xea\xcb\x3f\xd2\x51\x18\x91\x86\xae\x07\xf1\x64\x3a\xc6\xd7\x61\x76\xd3\x6d\xc3\x91\x8c\x14\x20\x04\x51\x21\x9b\xc3\x67\x7c\x43\x35\x05\x62\x34\xa5\xf1\x5a\x5d\x45\x09\x9e\xc4\x97\x18\xf9\xe3\x31\xf4\x2a\xf5\x10\xbe\x1e\xe0\x69\x06\x62\x3f\x7b\x25\x97\xcf\x46\xf8\x06\x45\x98\x8e\x48\x1f\xb3\xfa\x01\xe9\xf1\xcc\x1f\x8f\x6f\x50\xff\x06\x86\x8c\x0c\x0f\x4b\x05\x00\x34\xf3\x2b\xd9\x90\xc2\xe8\xa2\x52\x95\xf6\x81\xca\x0f\x4a\xef\xd0\xd7\xaf\x04\xdf\x95\x30\x0a\xf0\xf5\xc1\xb0\x02\x6e\x8a\x84\xd8\xce\x5f\x54\x61\xf2\x97\xeb\xfa\x06\x21\x51\xd8\x67\x7c\x73\xb6\x22\x56\xa2\x6e\x0e\x6d\x52\x24\x29\x6f\x98\x26\xff\x8d\xc9\x13\x4e\x99\x64\xde\x07\xd4\x36\x17\xc5\x51\x19\x9e\x40\x4d\x6a\x8b\x68\x92\x59\x0c\x9b\x2a\x50\x07\x15\xa2\x0e\x01\x67\xe9\x4c\x8a\x33\xa5\xf7\x04\xb0\xa4\x8a\xf4\xd0\x60\x65\xfb\x64\xf7\xfc\xf0\xe0\xc3\x87\xbd\x8f\xef\xce\x4f\xf6\xf6\xb7\x0f\x3e\x9d\xc8\xc7\xa3\x32\x33\x60\x0a\x55\x8a\xc4\xf4\x28\x47\x47\x53\x26\x23\x78\x6d\xf9\x99\x8f\x36\xd0\xe9\xd9\x6b\xf5\xfd\x1e\xb8\x1b\xf3\xd7\xe5\x96\xaa\x00\xb8\x32\x9d\xa5\xa3\x8a\x4e\xf7\x4c\xc4\x53\x4a\xef\x05\x29\x2d\xfc\x19\xdf\x54\x8d\x31\xc8\x01\x2e\x30\x78\xa5\xc4\x4d\x01\x99\x35\xca\x97\xd4\xc4\x9f\x2a\x4c\x32\x04\xb2\x05\x86\x02\x24\x46\x48\x53\x1d\xa6\x7d\x7f\x2a\xa9\x2e\x24\xbd\xb6\xea\x29\x4e\x05\x57\xe0\x1a\xd5\x3f\xf5\x31\xd8\xf7\xa7\xa7\x50\x2d\x84\x2d\x9e\x8f\xcc\x29\x14\x3f\x93\x3c\xd2\x45\xe3\x8a\xdf\x3c\x5a\x58\x66\x8e\x55\xa9\x59\x09\x6f\x72\x72\xb0\x75\xd0\xe5\x44\x86\xc6\xf1\xc5\x7f\xe8\x52\x75\xec\x90\xab\xef\x2b\x49\x97\x50\x16\xa4\xd6\xa3\x23\xfb\xb6\x32\xf1\xa7\x15\x97\xb1\x02\xff\x03\xfb\xc5\x20\x1f\x65\x32\xf6\xec\xa8\x17\x06\xb2\xe3\x8d\xa0\x88\xcf\x18\xa5\xb3\x04\xf4\xc4\x9c\x59\x85\x29\x4a\xb3\x90\xd0\x03\xe5\xe4\x38\x40\xfe\x10\x1c\x84\x92\x24\xbc\xf4\xc7\xda\x5e\xab\xc0\x24\x03\x02\x6e\xff\x74\x69\x84\xc1\x99\x8e\x62\xde\xa5\x95\x41\x6e\x0f\xa0\xd6\x11\x5f\x9c\x0e\x33\x5c\x77\x22\x7f\xba\x45\x78\xcc\xf4\xcc\x96\x1a\x43\x7f\x9c\x62\xf9\x96\x8d\xb9\x3d\xcd\x1d\x53\x91\xce\x9f\xb5\x89\xee\x00\x83\xcc\x0b\xcc\xb8\xb4\x68\x1d\x87\xff\xd7\xc6\x78\xfe\x00\x35\x4b\x8c\x63\x79\xc5\x00\x52\x28\x4c\xea\x25\x54\x54\x47\x49\x5b\xec\xee\x61\x52\x71\x71\xeb\x19\x90\x7c\xc9\xe9\xca\xb8\x74\xa4\x07\xd5\x50\x6f\xbc\xb4\xd4\x4b\x66\xea\x0a\xa6\x90\xfe\xb1\xdb\x80\xd0\x3e\x4c\x19\xfe\x63\xb7\x09\x6e\xa8\x6b\x65\xee\xc8\x58\xcc\x4d\x9c\x65\x61\x74\x61\xf7\xec\x05\xc6\x14\x48\x99\x6b\xd1\x86\xf0\x59\x7b\x6d\x94\xc8\x23\x3d\x0b\xfb\x20\x57\xd0\x22\xd6\x28\xeb\x37\x41\x79\xfd\xe9\x5a\xef\xe9\x5a\xef\x1f\x7e\xad\xc7\x22\xfa\xb2\x53\xcb\x5d\xa2\xfa\xce\x33\x87\x75\xe4\xbe\xd0\x52\x5f\x2c\x62\x38\xcb\x97\x74\x9d\x1d\x0e\x36\x83\x20\x85\xa1\x13\xbb\x9b\x1f\x81\x5a\x2a\x45\x33\x2a\x7e\x31\xa7\x37\x8f\x08\x5f\x61\x06\x91\xf2\x10\x24\x05\xa0\x9b\x2a\xdd\xed\x9f\x3f\x97\xcf\x07\xec\x7c\xf6\x5c\x57\x12\x91\x6d\xf3\x39\xbb\xb6\x92\xca\x49\xbc\x8a\xc6\xe9\xe1\xae\x74\xa4\x5c\x1c\x31\x87\x2b\x85\xa3\x31\xb9\x89\x8c\xbd\x45\xd5\xe8\x12\x8a\xe8\xbe\xcd\x7b\x9a\x5a\x36\x0b\x9b\x3d\x0e\xff\x53\xf7\x2d\x7d\x7b\x72\xe9\x2e\x85\x85\x20\x0f\x44\x04\x28\xff\xf4\x13\xe0\x4e\x15\x53\x61\x74\x01\xdc\xb8\xaa\x40\xe4\xd7\x17\xf3\x52\x9a\x52\x88\xb2\x97\xf2\x5d\x3b\x29\xa4\xa1\xb1\x9f\x42\x33\xc7\x19\x99\xec\x1f\x36\x36\x8c\x81\xe6\x7f\xc6\x8b\xd5\x55\x9a\xb9\x5d\x21\x29\x58\x6a\x59\x32\x23\x32\x5b\x92\x66\x28\x8d\xa9\x9d\xe3\x74\x0a\xac\x1b\xce\xce\x7e\x74\x93\x91\x03\xbf\x87\xfa\x78\x48\x18\x00\x5d\xe2\xfc\x0a\x15\x46\x83\x2a\x19\xb5\xbf\x70\x58\xf9\xc1\x82\xf5\x4f\x3f\x21\xdb\xc8\x57\x8d\xfa\xc8\xbc\x6e\x20\xa8\x5a\xdc\xa3\x9d\x9d\x8d\x29\xdf\x8c\xf0\x75\x86\x7a\x87\x9f\xd0\xe0\x66\x30\xc6\x9e\xe8\x26\x0c\xbb\xd8\x6c\xa0\x27\xd0\x65\x66\xb3\x34\x4d\xe2\x01\xe1\x59\x29\x1d\x1d\xa3\x15\xe9\x18\x2c\x96\x89\x6d\x2e\x2c\x1d\x61\xa4\xa1\x97\xba\xf5\x50\xad\x4c\xff\x2c\xc3\x4a\x49\xc1\x25\x9a\x49\xc6\x60\xcf\x05\x00\xdd\x8c\x4d\xd2\xc5\x56\x4c\x3b\x28\x47\xba\x5f\xdd\x12\xea\xd6\xcb\x85\xf0\xbd\xc0\xcb\xd9\x04\x7b\x2f\xeb\x90\xa8\xce\x00\x38\x0b\x59\x27\xdc\x4e\x72\xcf\x9a\x96\xd3\x99\x6b\xb3\xd8\x64\x5e\x93\xff\x90\xac\x6b\xda\x23\x72\xb4\xa4\x9c\x5a\xa2\x5c\x78\x69\x49\x2a\x27\xd6\xab\x74\xd2\x87\x0f\x7e\x10\x08\xdb\x2e\x29\xef\xa7\xf8\xae\x4f\x8f\x74\x70\x90\x58\x2c\x37\xde\x82\xf7\x92\xad\x38\x15\xe8\xc4\x48\xc8\x96\xbe\x79\xbb\x85\x16\x8b\xe1\x30\x7f\xa5\x6a\xa5\x72\x16\x04\x5a\x05\x0d\xf9\x52\x48\xc8\xb3\xe8\x96\x68\x0d\x02\x13\x2a\xe7\x8a\x34\x07\xd5\x82\xd1\xb6\x4a\xb5\x02\x21\xb7\x01\x1b\x91\xd5\xd5\x6c\x17\x44\xf6\x7d\xca\x51\xfa\x24\xfb\xfe\xd3\x65\xdf\xdc\xa4\x8d\x27\xec\x7d\x28\x1f\xdd\xbd\xbe\x1f\xa9\xd2\x6e\xd8\xf7\x85\xeb\x2d\xbe\xa6\xea\xea\x22\xd7\xdd\xe3\x89\x9f\x64\xdb\xac\x60\xee\x76\xeb\xbc\x1a\x03\xb5\x12\x34\xcb\xfb\xa2\xe9\xbc\xa5\xd7\xe2\x12\xec\x38\x4b\xc2\xe8\xe2\x16\x5c\x5b\x6c\xef\x89\xb4\xdc\xf7\x23\xf9\xd3\x2f\xfe\x78\x86\x6f\xd1\x25\xf9\x0f\xbb\x0e\x21\x90\x87\x38\xc1\x73\x6e\x48\x3d\xd5\xbc\x00\x82\xd4\x30\x9c\x54\xb1\x38\x1b\x79\x80\x11\x91\xd6\x3d\xda\x92\xb9\x85\x81\xda\x8d\x8e\x32\x64\x9b\xee\xfb\x51\x25\x8b\xab\x4c\x55\x04\x3a\x1c\xf2\x99\xab\x7c\x2a\x16\x2b\x22\x52\x0f\xd2\x44\x54\x5e\x84\x54\x7d\x43\x21\x32\x3f\xdd\x17\xa6\xfe\x98\x41\xdc\x0a\x13\x22\x8b\xd9\x1c\x62\x78\x8f\x4e\x62\xe6\xd9\x2b\x77\x07\xaa\x33\xe8\x95\xaa\xd9\x35\xde\x9e\x90\x63\xa0\x1b\x36\x49\x17\x5c\x24\x84\xa7\x34\xce\x46\x72\x4a\xf0\x4a\x15\x1a\x61\xd8\x46\x69\x16\x66\x33\x2a\x70\x99\xe6\x5f\x01\x9e\xc6\x69\x98\xc9\x58\x32\xb8\x02\x3d\x00\x33\x18\x87\x38\xca\x74\x4b\x8c\xd2\x0d\x1b\x26\x16\x3c\xd5\xb8\x39\x82\x8b\x62\x64\x8e\x1f\x57\xc1\x17\x5e\x25\x0b\xd2\x1b\xce\xa2\x00\x6c\x22\x07\x38\xc9\xfc\x50\x4c\xbf\x63\xf9\x88\x89\x5d\x6c\x1d\x3d\xfa\x12\x12\x78\xdd\x61\x2d\xb1\x91\x27\xb3\xa9\x65\xfc\x92\x64\x5b\xe1\xbd\x9e\xc5\xb9\x44\x4b\x40\x77\x69\x03\x12\x6d\x8e\x67\xb8\x4b\xff\xc3\xc5\x5c\x2d\xd9\xbb\x73\x56\xd8\xe4\xe7\x93\x02\x71\xed\xc3\x01\xe2\x9c\x10\x71\x0e\x89\x2a\x93\x59\x9a\xc1\x56\x87\x27\x38\xca\x04\xdd\xf4\x6f\x32\x9c\x36\x1b\x55\x26\x8c\xff\x50\xd5\x26\x92\x95\x7b\xf0\xe9\x23\x93\xa0\x4d\x20\xaf\x4f\x49\x15\xcd\xa2\xf0\xbf\x67\x18\x85\x01\x8e\xb2\x70\x18\xaa\xac\xb8\xd4\x64\xf3\xe1\x29\x31\xc5\xd0\xa4\x9d\x6d\xfa\xb0\xed\x48\x9b\xd0\x6b\x9d\x0a\xf8\x20\x57\xfc\x7e\x58\x5d\xf1\x33\xc2\x59\x57\xf8\x00\x73\xd0\x7f\xde\x97\x0a\x0c\x61\x95\x0f\xa3\x35\x0a\x82\xb9\x21\xfe\xd8\x6d\x12\xd9\x95\x67\xee\xbf\x3d\xf3\xda\xa5\x72\x25\x33\xf5\x6e\xbb\x54\xc2\xb6\xd7\xb2\x16\x3e\x26\x02\xc6\xd0\x1f\x64\x71\x72\xe3\x51\x8d\x32\x19\xd8\x67\x84\x4f\x13\x59\x3f\x1e\x22\xd1\x9b\x8d\x0d\xf4\x23\x8d\xc8\xf4\x23\x94\x79\xb6\xba\x8a\x7a\xf1\x64\x12\x47\xff\x75\xfc\xfc\xd9\x33\xa3\xf3\xf9\x2f\xd6\x00\xc7\xa9\xf2\x23\x19\x86\x04\xff\x58\xf5\x90\xf4\x0a\x47\x83\xe5\xbe\x9f\xe2\x4e\x4b\xfb\x30\x09\xda\x7a\xd1\xcb\xe9\xe7\x60\xa8\xbd\x1c\x84\xd3\x11\x4e\x96\x29\xe4\xea\xeb\xe7\xcf\x6e\x9f\x3f\xc3\xe3\x14\x23\xa9\x33\x54\x63\x4e\xfb\xc2\x87\xe1\x47\xf4\xd3\x4f\xec\xc3\x8a\x3f\x09\x44\xdf\x36\xf7\xb7\x9e\x3f\x7b\x46\x3f\x54\x4e\x39\xce\x1e\x52\x51\x85\x67\x82\x21\xfd\x40\x11\x83\xdf\x32\x3e\x67\x62\x94\x65\xc4\x58\x43\x34\x1c\x06\xaa\xf4\x93\xf8\x2a\xc5\x49\xf5\xf9\xb3\x67\x62\xc4\xe2\x38\x5b\xe9\x25\x37\xd3\x2c\xfe\xaf\x63\x5a\xf5\x16\x8e\x4f\xf2\xfe\x23\xbe\xa3\x3f\x9f\x3f\x7f\x56\x51\xcf\x63\xcf\x10\x55\x89\x1c\x8f\xe2\x24\x1b\xcc\xb2\x94\xbe\x21\xcb\xa6\x87\x36\x10\xaf\xfb\x5a\x7a\x7d\x3e\x0e\xfb\xe4\xd3\xca\x38\xec\x4b\xef\x41\x1b\xd6\x83\x4e\x91\xaf\xa4\xd4\x8a\xf4\x4e\x81\xe0\x8f\x2f\x62\x00\x41\x7e\xbc\x7e\x2e\xb0\xf8\x10\xc7\x9f\x67\x53\x94\xf9\xfd\x31\x96\x30\x39\x7e\x7b\xf0\x1b\x3b\xf4\x89\x77\x7b\x1f\x7f\x39\xb7\xbd\x3f\xfe\xf4\xf6\x7c\x7f\xef\xb7\xf3\x9a\xeb\x43\xdd\xf5\xa1\xe1\xfa\xd0\xb4\xb6\xed\x6a\x47\xfe\x68\xb4\x25\x7f\x34\xda\x93\x3f\xf2\x36\xc5\xd0\xf4\xe2\xc9\x94\x9c\x14\xc7\xe6\x10\xd9\xa6\x54\xab\x15\xc4\xb3\x3e\x11\xfb\x49\xad\xbc\x00\xb0\x58\x19\x0b\x24\x9b\x2a\x84\x10\x4e\x10\x85\xe8\x0d\x6a\xb4\x3b\xaf\x51\xb8\xb4\xa4\x80\x17\x42\x22\x7a\x83\xea\x8d\x75\xe3\x1b\xf9\x0b\x4e\xc3\x33\xb4\x41\x60\xbc\x41\xf5\xd7\xea\x77\x7a\x97\x5a\x50\xab\x42\xab\x55\xd1\xef\xa8\x76\x5d\xaf\xf7\xf5\xfa\xf9\xe3\xed\x73\xa5\xd7\xbf\xfa\xe3\xcf\xe8\xdd\x4e\xa5\xf1\xfb\x7a\x55\xed\xed\x35\x0d\x91\xa8\xbe\x0b\xb5\x97\x0b\x8d\x80\x34\xc8\x69\x3f\xbe\x56\x3f\x82\xa5\x01\x69\xf3\x3a\x44\xbf\xa3\xca\x75\xde\x21\xf6\xbb\x21\xfd\x6e\x4a\xbf\x5b\x55\xad\xb3\x00\xa5\x92\x5e\xa3\x9f\x7f\xfe\x19\xad\x43\xc9\xf4\x1a\xfd\x84\x6a\xd7\xc3\x21\x1d\xa0\x4e\x53\xab\x42\x56\xc7\xe9\x35\x19\xc8\xf4\x5a\xfb\xc4\x17\xcf\x69\x0a\xdf\xaf\x5f\x3f\x77\x76\x6a\x32\x1b\x67\xe1\x74\x1c\x0e\x40\x4d\x60\x76\xef\x9a\x90\x71\x70\x7a\x7d\xf6\xda\xf2\xad\x45\xbf\x35\xac\x1f\xd7\xe9\xc7\xd6\x59\x41\xeb\xe9\xac\x8f\x40\xc0\xf1\xd0\x24\xbc\x46\x83\x78\x3c\x9b\x44\xa9\x42\xfd\x32\x4c\x22\x29\x54\x02\xe8\xd5\x4b\x42\x33\xb5\x3a\x1f\x29\xf6\x58\xab\xd7\x6a\xfa\xd0\x8a\x95\x4c\x07\xab\x92\xc1\xc4\xb4\xaa\xe8\x2b\xf9\x4d\xc7\xdb\x51\xa5\x2e\x57\xa9\x77\xa4\x2a\xf5\x8e\xab\x4e\x43\xae\xb3\x5e\x45\x79\x9d\x86\x31\xeb\x82\x1b\xd0\x3a\x59\xc1\x48\x85\xd1\xa5\x3c\x5a\xe4\xb1\xf4\x88\x5d\xaf\x4b\xe3\xc3\xc8\xb3\xc5\x5e\xd5\xf8\x8b\x86\x32\xa4\x85\x23\xaa\xf0\x47\x46\x63\x65\x86\x55\x61\x9d\x4a\xbd\x39\x63\xab\xb0\x55\xa5\xe2\x9c\x01\x56\x58\x2e\xab\x58\x34\xca\x70\x5b\x00\x8a\x60\x9c\x98\x9c\xf0\x87\x6b\x2b\x13\x64\x0c\x60\x63\x01\x0e\x08\x55\x1a\xe8\x77\x14\x9c\x92\xff\x5d\xaf\xa3\xdf\xd1\x75\xe3\xec\x4c\x5f\x48\x50\x36\x44\xbf\x6f\x40\xc1\xeb\xd0\x28\xa0\x30\x49\xf8\x79\x0b\x87\x5a\xb1\xaf\x1c\x26\x78\x40\x3b\x17\xa0\xa3\x41\x1c\xb1\x0d\x26\xdf\x95\x8e\x7a\x07\x1f\xc9\x1e\x51\xbb\xae\xd5\x3c\x54\xbb\xae\xd5\xe1\xdf\x06\xfc\xdb\x82\x7f\xd7\x3d\xa0\x05\xf2\x6f\x03\xfe\x6d\xc1\xbf\xeb\xf0\x6f\xbd\x4f\xfe\x6d\x76\xf2\xcd\xec\xe5\x4b\x86\xd4\x4b\xb4\xb9\x7d\x4c\x03\xb2\x23\x2a\x0e\x21\x22\x10\x24\x61\x36\x9a\xac\xf0\x32\xab\x39\x2a\xa4\xf4\x06\x13\x1f\x56\xe8\x83\x24\x61\xac\xe0\xeb\x8c\x86\x0f\x10\x5d\x3e\x0f\xe2\x23\x9c\xe2\xac\x8b\x1c\x5b\x24\x1b\x84\xe3\xcf\xe1\x94\x99\xfe\xc6\x43\x14\x1d\xc5\x70\x1c\x1b\xf9\x29\xea\x63\x1c\x81\x7b\x00\xbb\xe0\xf2\xa3\x00\x6c\xf8\x82\x30\x40\x51\x9c\x31\x3b\x4c\x93\x14\x68\x36\x17\x0e\x89\xdb\x8b\x9e\x7f\xc6\x37\x87\x49\x18\x27\x47\xd4\x04\x78\x63\x23\x7f\x6f\x25\x1d\x6e\x17\xa6\xcd\xa9\xd9\x01\x55\x7c\xe3\x7f\xdc\xe2\x70\xc3\xde\x7c\xfe\xd6\xc2\x9f\x3f\xe3\x9b\x5f\xe3\x04\xac\x18\x3f\xe3\x9b\x95\x2b\xf2\xdb\x5e\xec\x38\xfc\x82\x59\xa9\x34\xbc\x78\x4b\x18\x10\x5a\x45\xad\xa2\x65\x24\x1c\x01\x12\x18\x20\x13\x2c\x1f\x39\x8e\x63\xfe\xcc\x1b\x5c\x42\x9d\x52\x2d\x90\xfe\xa7\x83\x11\x26\xc7\x0f\x44\x44\x68\x4b\x1f\xd2\xa3\xf8\x8a\xc0\xae\xf0\x66\x96\xc8\x2e\xfd\xb2\xb0\x0f\x32\x5c\xfb\xb0\xf0\x46\xa5\x71\x96\xde\x9d\xea\x4b\x35\xb7\x11\x25\xe8\x50\xd1\x83\xfe\x7c\xc3\x30\x64\xcf\x16\x29\x04\x31\xb2\x13\xe5\xe9\x20\x59\xcb\x91\x3f\x09\x95\x53\xa8\x73\x46\x47\x16\x66\x9c\xbd\xb1\xb0\x1a\x37\xc3\x42\xd2\x7e\x62\x00\x87\x70\x3a\xfa\x50\xca\x68\xff\xc0\x10\xff\x97\x40\xdc\x89\x39\x9b\x85\xa3\x38\x43\x84\x24\xdd\x85\x32\x79\x0f\x50\xb7\x80\x42\xc8\xc7\xb3\x7e\x19\xc8\x20\x3e\x71\x98\x67\xd2\xde\x06\x1f\xf2\x9d\x8a\xc9\x68\x67\xd2\x2e\x26\x97\x58\x57\x0a\x00\xa6\x0c\x32\x7b\x3d\x07\xdb\xfd\xf0\x1a\xd8\x76\x11\xb6\xbf\x6f\x00\x13\x3f\x65\x83\xbc\x9a\x53\xc7\x57\x54\x63\xa8\x5b\x26\x1b\xe5\x13\x0e\xa4\xc5\xd6\xdd\xcf\xa8\x43\xf8\x99\x36\x61\x68\x63\x03\xb5\xe6\x4d\xda\x77\x37\xb4\xf6\x3e\x3b\x46\xdc\xb5\x66\x0c\x5a\x67\x43\x72\x86\x7e\x27\xb2\x84\xb9\x88\xe6\x72\x73\x59\xa6\x2b\x66\x33\x61\x74\xf9\xde\xc2\x69\x8c\xd7\x6e\x66\x43\x8a\xe6\xfc\x46\x3c\xe5\x2c\x87\xbf\x72\x70\x1d\x99\x61\x31\x3e\xba\x2c\xea\xd8\x88\x17\x8e\x8c\xbc\x99\x7f\x15\x10\x8d\x93\x9d\x3c\x2c\x67\x6a\x59\xc1\xcd\x43\xfc\x0d\x6a\x81\x27\x0b\x7d\x28\xa2\x7d\x75\x2e\x4e\x39\x04\x26\x69\x2e\xd8\x91\x02\x60\xaa\xd0\xad\xae\x21\x42\x8a\xaa\x70\xed\x58\x4a\x67\xe8\x77\xf7\xe2\x74\xfc\xa9\xc2\xb7\x7d\x05\xea\x08\x34\x4f\xd5\xa5\x68\x9f\x03\xa7\x24\xeb\x49\xd3\x83\xa3\x41\x72\x33\xa5\xa6\xb1\xb2\x9c\xb7\xef\xa1\x78\x38\x4c\x71\x66\xcc\x0c\x5d\x23\x41\xdc\x13\xf5\xf2\xc2\x9e\xb9\x57\x7b\xf9\x09\x31\xff\x59\xcf\x7f\x36\xf2\x9f\x4d\x0f\x58\x8c\x7c\xca\x50\x70\x0d\xf0\xa2\xb8\x12\xae\x79\xe5\x4f\x51\x23\x0a\x40\xf6\x6c\x65\x23\x87\x10\x43\xe8\x7b\xff\x94\x82\x21\xf2\x8b\x3e\xa4\xca\x37\xb5\x6c\xb3\xa0\x6c\xd3\x7a\x24\x2a\x33\x84\x2a\xad\x7a\x2a\x81\xaa\x8f\x75\xf5\xb1\xa1\x3e\x36\x3d\xa1\xb0\x30\x36\xef\xd5\x55\xb4\x47\x4e\xbe\xdf\xc5\x18\xd9\x27\x5d\x19\x26\xeb\xac\x7b\xe8\x7e\xe4\x66\x23\x1a\x76\x20\x28\x2d\x59\x5b\x06\xf6\x1d\x66\xc1\x42\xe1\x46\x92\x8a\xea\x04\x53\x8b\x8e\xab\x26\x0d\xd6\x19\xbc\xfe\x5d\x61\xb6\x35\x9b\x06\x28\xad\xeb\xd3\xa1\xd5\x32\xe6\x07\x6a\x35\xd4\x5a\x0d\xbd\x96\x55\xdb\x94\x36\xf5\xe9\xd4\x6a\x35\x6d\x6a\xa8\xf7\xda\xd9\xc1\x7e\xf4\x97\xb7\x40\xdb\x89\xe1\xc8\x72\xc6\x11\xfb\x2f\x1d\xd5\x0d\x54\x7f\xcd\x7e\xbe\xe1\x33\xc4\x5e\x38\xf6\x5d\x98\xe3\x70\x98\x01\xa5\x7b\x0e\x45\x59\xe1\xc4\x71\xd4\x33\x32\x79\x92\xba\xa6\x26\x24\xaf\xdf\x25\x45\x57\x25\xad\x1b\x72\xd7\xef\x92\x52\xab\x92\x36\x74\xa9\xeb\x77\x49\x7f\x95\x36\xa5\xd7\xc6\x36\xbc\xb4\x64\xdb\x00\x00\xb9\xba\x8a\x5c\xdd\x81\x5c\x63\x0e\x72\xcd\x42\xe4\x6a\x77\x44\xae\xa1\x22\xd7\x70\x20\xd7\x9c\x83\x5c\xad\x10\xb9\xfa\x1d\x91\x6b\xaa\xc8\x35\x1d\xc8\xd5\xe6\x20\x57\x2f\x44\xae\x31\x17\x39\x2b\xe9\x7e\x9a\x82\x11\x51\x9a\xf9\x19\x36\x0b\x00\x3b\xc9\x6a\x96\x8e\x01\xcb\xc8\x74\x3d\x1a\x7c\x21\x73\x91\x35\x6c\x5f\xc8\x40\x64\xba\x76\xdc\xaa\x44\xb1\xae\xa7\x39\xbc\x0f\x96\x4f\x85\x9e\x3c\xa4\xb5\xa3\x9f\x5a\x2c\xcb\x47\x3f\xb6\x98\x2b\x48\x39\xb7\xe4\x4b\xa8\x5a\x8e\x12\xc4\xfa\xe1\xd8\xd5\xdd\xd8\x99\xeb\xc7\xc0\xce\x58\x42\x2a\x76\xb5\xbb\x60\xd7\x90\xb0\x6b\xb8\xb1\x33\x17\x90\x81\x9d\xb1\x86\x54\xec\xea\x77\xc1\xae\x29\x61\xd7\x74\x63\x67\xae\x20\x03\x3b\x63\x11\xa9\xd8\x35\xe6\x63\x67\x52\x2b\xe6\x91\xad\xed\x72\x09\xdd\x86\x2d\xeb\x48\x17\x72\x8c\xe5\xa4\x6e\xae\x96\x55\x65\x88\x3e\x4d\x97\xec\xc3\x8e\xc2\x5d\xd4\x68\x77\x56\x9b\x0d\xa6\x81\xae\xda\x54\xc1\x5c\x62\x11\x02\x52\xca\x3c\x87\x99\x6a\xf8\x45\xca\x12\x3e\x21\xc8\xe1\x3d\xf4\x07\x58\xe8\x88\x05\x90\xff\xc4\xd7\xfe\x64\x2a\x4e\xca\xf9\x07\x3e\xa7\x14\x56\x86\xaf\x33\xe9\x76\x7b\x65\x73\xfb\x78\x85\x9d\x23\x2a\x13\x6e\x92\xfe\x19\xdf\x78\x68\x30\xbc\x10\xd2\x7c\x0e\x65\x3a\xf6\x09\x12\xd7\x19\xd2\xa1\x30\x09\xbf\x92\xb7\x63\x03\xc4\x74\xda\x3d\x8b\x12\xfb\x9c\x86\x4d\xdd\xc5\xe3\x29\x4e\x2a\x9b\xdb\xf4\x5a\x9f\xea\xec\x9f\x3f\x63\x36\x2b\x72\x93\xaf\x9f\x3f\x87\x10\xb8\x60\x40\xa2\x58\x15\x74\xdb\x0d\x8f\xdb\x25\x74\xdb\x60\x3b\x22\x59\x26\x74\xdb\x2d\x2f\x37\x49\xe8\xb6\xc1\x87\x71\x12\xb4\x7f\xec\x76\xea\xb7\x67\x5e\xbb\x71\x2f\x6b\x91\x6f\x69\x26\xf2\x68\xc6\x1c\xdf\xd0\x2c\x83\xae\x84\x97\x88\x19\x50\x90\xe6\xd1\x20\x9e\x4c\xe3\x08\x62\xae\x93\x6f\xab\xcf\x9f\x89\x79\x1f\x87\xfd\x15\x56\xf4\xeb\x57\xd9\x00\x40\x78\x7d\x3e\xb0\x71\x87\x9f\xe2\xdc\xaa\xc3\x4f\xb1\xf4\xed\xd7\x38\x09\xc0\x2f\x5d\x14\x10\x6f\x64\x08\xb3\x21\x18\xfc\x01\xad\x6f\xf2\x5b\x9e\x1c\xa6\xf5\xb3\x82\x19\x06\xd7\xaa\x1e\x59\xa8\xd2\xfb\x4f\xd9\x70\x1d\xa0\xe0\x68\xb0\x42\x1e\x34\xac\x3b\x2d\xf1\x95\x3e\x16\x19\xa2\x88\x2f\xdb\x97\xd3\xf7\x5b\x3b\xf9\x65\x13\x7d\xb6\xde\x60\xf5\x53\x6a\x9f\x47\x96\x15\xbf\xc5\xca\xf0\x64\x3a\xf6\x33\x1b\x83\x12\x51\xa6\xff\x8c\x58\x44\x1e\xae\x41\x05\xaf\x02\xc1\xeb\x40\xef\x17\x7e\xc1\x2b\x3c\xc2\x64\x17\xb5\x50\xa5\xde\x58\x47\xfd\x30\x4b\xab\x45\x00\xc3\x4b\x0b\xbc\xbd\x5f\xee\x0a\xee\x7c\xfb\x63\xef\xfc\xb7\x9d\x83\xa3\xfd\xf3\xfd\x83\xad\x6d\xb4\x09\xb1\x0d\x32\x3f\xca\x50\x82\xa7\x09\x4e\x71\x94\x85\xd1\x05\x57\xc4\x10\x32\x9c\xc4\x41\xde\x77\x2b\xcc\xad\xed\x52\x30\x19\x3b\x35\x60\x4a\x97\x82\x9a\xc9\x91\x78\xb4\x53\x94\xe5\x92\x30\x9f\x4d\x8a\x6e\x0f\xfc\xbe\x67\x09\x18\x3c\x88\x24\x1f\x72\x11\xa5\xb8\xd4\x3b\x41\xf7\x64\x0e\xd0\xc9\x08\x93\x51\xcf\x62\x34\x63\x7e\x02\x84\x05\x20\x52\x18\x40\x2b\x20\x57\xf3\x87\xc1\xf0\xa2\x0b\xa4\xcb\x71\xad\xca\x3b\xaa\x81\x2d\x6c\x17\x29\x85\xcd\xc8\x2f\x8c\x5c\x93\x61\x43\x9f\xda\x63\x4a\xb8\x13\xd2\x23\xc8\x7f\xc6\x37\x2b\xd6\xb2\xdc\x35\x74\x30\xbc\x40\x95\x03\x68\xc5\x1f\x57\xa1\xce\xc0\x36\x78\x25\xc7\x40\x6d\x8b\x07\x12\xa5\x13\x7a\x4b\x48\x84\xf7\x8e\x10\xca\xa0\xa8\x4f\xe4\x5c\x11\x0e\xdc\xdf\x55\x29\xc1\x2c\x80\x14\x69\x41\xde\xe3\xf9\xd5\xf3\x0a\xdd\xa6\xb7\xe9\x30\xc7\x49\x85\x5d\x9e\xc1\x10\x7a\xe8\x4f\x14\x5e\x76\x51\x78\x99\xf3\xc6\x5b\xc5\xf4\x40\x99\x6f\x15\x52\x57\x89\x0b\xc5\x24\x07\x5d\x03\x20\x67\x0e\xa1\xf5\xd9\x8d\xb3\xba\x56\x2d\xb2\x87\x2e\xa1\x95\xa4\x27\xc7\x42\x7c\xa2\xa7\x87\xa5\xa7\x2d\xfc\x50\xf4\x24\x20\xdd\x8f\x9e\x54\x3e\x7d\x07\x7a\xda\x8b\xc2\x2c\xf4\xc7\xe1\x17\x9c\x22\x1f\x45\xf8\x6a\x7c\xc3\x30\x0c\xd8\x70\xcc\xa7\x25\xbe\x6b\x5c\x0f\xe3\x64\xb2\x1f\x07\x18\x6d\x53\x67\x35\x88\xd3\x9c\x73\xba\x38\x91\xe9\x14\xac\xab\xc1\xcf\x8f\x53\xad\xd8\x64\xec\x64\xf8\xdd\x91\xec\x83\x91\x55\xc5\xfc\x60\xe3\x14\x77\x24\xb8\x30\x0a\x15\x0b\x1b\x31\x4d\x12\xb9\x58\x54\xd4\x9b\xd3\x29\xa1\x05\x18\x2d\x9e\x6e\x3a\xb5\x5c\x33\x90\x21\xde\x10\x3f\xf9\xa6\x48\x69\xd0\x3c\x15\x67\x44\x72\xa6\x86\xf5\x71\x32\xa1\xd3\xee\xdb\x74\x37\x94\xbe\x73\x92\xda\xc8\xc9\xeb\xb5\xad\x24\xb5\xa3\x01\x5b\x19\xeb\x59\x3c\xa4\x84\x4e\x3d\x00\x6c\xfd\x00\xfb\xa2\x4a\xe9\x85\x03\x36\x3a\x2a\x1f\x86\x60\x0e\xa9\x68\x09\xb4\x67\xf7\x24\x1f\xb6\x04\x4d\xdc\x94\x19\x4e\xca\x18\x51\x51\xa3\xa2\xc0\xcf\x7c\xd4\x07\xd9\x4b\x2d\xe1\x90\xc7\x00\x34\x4d\x75\xc1\xdd\x9d\x75\xc0\x87\x38\x81\xb9\x1c\xc4\xd1\x20\xc1\x19\x5e\x66\xc3\x31\x8e\x2f\x14\xa6\x2c\xdd\x4b\x1d\x2d\x36\xd6\x10\x50\x03\x30\xa7\xfe\x2d\x8c\xa7\xe0\x40\x62\x29\x38\x58\x60\xd3\xfb\x9a\x32\x57\x18\x02\x94\x29\x3b\x09\x6f\xe0\x6d\xb0\x06\x24\xf0\x25\x76\x2e\x89\x3f\x09\x58\x34\x6a\x16\x8b\x46\x10\x46\x17\x0f\xc0\x4d\xf2\xce\x6f\x70\xf2\x60\xf0\x2b\x2f\x48\x9b\x2f\x54\x32\x29\x53\xef\x8a\x63\xee\xa4\x30\x56\xb2\xab\x85\x79\xa5\x43\xe7\xe0\x1e\x38\x0a\x6c\xb3\xef\xc3\x17\xb9\xba\x8d\xa6\x68\x7b\xc8\xbf\xf4\xc3\xb1\xdf\x1f\x63\x6a\x86\x98\xba\xb7\xc5\x73\xde\x99\xd2\x54\xb5\x13\x46\x6c\xe3\x2b\xdc\xa7\x18\x5c\x75\x9f\xf9\x18\x67\xcc\x3d\x9a\x46\x4d\xa3\x90\xf2\x5d\x03\x85\x29\xc2\xc3\x21\x1e\x64\xe1\x25\x1e\xdf\x20\x1f\x05\x38\xcd\x92\x19\x3c\x7b\x28\xc1\x7e\xb0\x1c\x47\x03\x5c\x6a\x9f\x29\x4b\xbd\x80\xc6\x63\xd1\x30\x05\xfe\xd8\x94\xcc\x47\xb2\x52\x9e\x88\x45\x95\x45\xa9\x5f\x54\x9c\x4f\xfe\xbc\x68\x79\xfa\xdf\xc9\xe7\x62\x06\x85\xd4\x12\xe1\xb0\x10\x00\x2a\x5c\x2d\x4a\x51\xcb\x45\xc9\x02\x0c\x19\x02\x22\x11\x54\xd9\x82\xc3\x01\x0b\x98\xc9\x39\xf5\x8e\x34\x21\xd6\xc5\x67\xd6\x9e\xab\x6c\xae\x37\xd6\x57\x9b\x0d\xf9\x13\x55\x89\xd8\xbe\x68\x72\x50\x17\xd5\x95\xaf\xaa\xfc\xdb\x45\x8d\x32\x67\xa7\xd4\xaa\xca\xf6\xe7\x2b\xb2\x91\x73\x6d\xf2\x53\x0b\x1b\xe9\x93\x11\x96\x84\x02\x96\x69\xcb\x47\x23\xd0\x1a\x13\x21\xb3\xc4\x52\xe4\x22\xec\x66\xc4\xf1\x81\x08\x03\x7c\x59\x13\xa1\x89\xad\x6b\x4b\x87\xbe\xc1\x61\x89\x59\x7b\x9b\x2a\x4f\x4d\x47\x6e\xc8\xb6\xce\x55\xa6\xd4\xeb\x3a\xfd\xa6\xc8\x9f\xf8\x94\xe2\x31\x1e\x64\xb4\xe1\xe3\x2c\xf1\x33\x7c\x71\x53\x71\x99\x6b\x4b\xda\x67\x10\x17\x37\xd0\x0b\xca\x4a\x5f\x38\xcd\xc3\xd8\x6c\x1c\xfa\x69\x4a\xd8\xc4\x5b\x3f\xc5\x81\xe2\x31\x27\xff\x15\x1b\x87\x31\x50\xc7\x38\x81\x03\x17\xd9\xd5\xdc\x90\x8a\x17\xb9\x9e\xdc\x8f\xdd\x67\x14\xd8\xa8\xbb\x90\x62\xe4\x24\x33\x36\xf3\x86\xa5\xc8\x6e\x34\x8f\x02\x66\x9f\x07\x71\x71\x43\x51\xf4\x90\xfb\x02\x47\x1f\x03\xcf\x61\xe9\xc9\xc8\xbe\x6b\xf4\x5f\xbb\xcf\xb9\x17\xda\xea\x4d\x91\x87\x0a\x6f\x8c\x74\xcc\x2d\x13\xaa\xb3\x6d\x99\x4b\x56\xaa\x4c\xc3\x6b\xbf\x7a\x53\x75\xd8\x69\x96\x60\x7f\x72\x27\x55\x36\xc8\x50\x4c\xf9\x2c\xdb\xe0\x37\x1b\xcb\xfd\x90\x1a\x6c\xab\x27\x1a\x2a\x9d\x40\x1c\x6b\x49\x33\x5d\x47\x95\x66\x43\x55\x4c\x4b\x0a\xdf\x63\xc0\x4f\x53\xfb\xea\x2f\x0b\x3c\x42\x76\x2c\x7b\xad\x6d\x87\xe5\x22\xe2\xd4\x4f\xe0\xb8\x65\x13\x10\xcd\xed\x0d\x8e\x37\xb9\x75\x15\x17\x1a\x7f\xf8\xe1\xc5\x70\x3c\x4b\x47\x2f\xca\x6d\x73\x14\x8a\x6b\xa3\x13\xc3\xdc\x45\xf5\xa2\x79\x85\x73\x2d\xa4\x35\x9d\xca\xb7\xa5\xb2\xf2\xfc\x7c\x42\xcf\xbe\xbd\x15\xf6\xe3\xcf\xdb\xf9\x14\xa2\x78\xec\x40\x3d\x83\x4a\xa4\x36\xa4\xdb\x4d\x76\xd0\x36\x9c\x83\xd9\x7b\x59\xe9\x5d\xa4\xa0\x97\x55\x94\x13\x9e\x9d\x2b\x97\xaf\x17\xde\x4d\x37\xd5\x1e\x59\x15\x82\x7a\x6a\x99\x5c\xc1\x0f\x54\xfd\x0d\xf6\x43\x3e\x53\x7c\xbb\x03\x3d\x6c\xef\x6d\xcf\x50\x45\x73\x8e\x12\x5e\x52\xaf\x9d\xbb\x68\x9e\x73\x18\x85\xba\x42\x51\x97\x2b\x9a\xa4\x7a\x77\xd2\x38\x8b\xe9\xcc\x0f\x48\xff\x33\xa7\x33\xd7\x04\x2f\x38\x9d\x56\xc5\x6f\xc9\xe9\x14\x75\xef\x31\x9d\x45\x0a\xdf\x72\x57\x07\xdf\x74\x3a\xef\x3d\x5d\x05\x4b\x60\xce\x7c\xe9\x7a\xd3\x82\x49\xa2\x9b\x89\xd0\xf3\x0e\x6c\x62\x1d\xb3\xba\xbe\x44\x1b\x28\xbc\x94\x67\xab\x68\x8b\x60\x3b\x26\x0d\x2c\xdd\x1b\xf9\x61\x04\x39\x4f\x5c\x77\xad\x6f\xc1\x6e\xe0\x9c\x77\x1e\x6d\xb8\x83\x0f\xe8\x2a\x36\x65\x07\x21\x75\x0d\x62\x90\x86\x26\x6f\x4c\xdb\x25\xc4\x9d\xe8\xeb\x22\x8e\xf2\xb6\xc7\xb7\x03\xed\x24\x24\x35\xa1\xcc\x1d\xe9\xd5\xdb\x9e\x65\xef\x31\xc1\xd3\x26\x0e\x45\xfc\xcf\x8c\xab\x31\x28\x95\xfa\x19\x33\xea\x5e\xd1\xeb\x18\x30\x34\x9a\xa5\xd2\x91\xd0\x8a\x30\x61\x29\xe6\x32\x12\x52\x39\x21\xb2\xde\x90\x30\xbb\x2c\x02\x84\xfd\xbc\x1a\x61\x16\x7a\x9f\xe2\x07\x91\x3c\xd3\x12\xc8\x99\x0b\xc3\x5e\x90\xfc\xc1\x54\x32\x51\x87\x7a\x03\x40\x7e\x3c\xe8\x82\x70\x6d\xd0\x65\x59\x79\x32\x50\xae\x02\x34\xcc\xe4\x55\x28\x4e\x5b\x68\xab\x03\x2c\xd2\x6f\x48\xe4\x85\xe4\x30\x9c\xcd\x85\x58\xa1\xc9\x11\xaf\x1c\xe6\xac\xbf\x1d\x1c\xc1\x79\x99\x11\x9d\x59\xe6\x3a\x4e\xa0\x5f\xb9\xa2\xdb\x43\x4a\xbf\xbc\xbc\x59\x9b\xd0\xcf\xf0\x90\x7d\x5d\x2a\xfa\xe8\x5a\x31\x3b\xc2\x13\x0c\x52\x38\xec\xae\x94\x04\xd8\x55\x14\x9c\xf6\xc1\xa1\x1d\x5e\x9b\xd5\xb9\x04\x8b\x2f\x79\xdc\x79\xca\x4c\x69\x42\x79\x8e\xb7\x30\x05\x74\x76\x40\xf6\xdc\x99\xbb\x6e\x03\x5c\x62\xdd\x8a\x7d\xea\x69\xdd\x3e\xad\x5b\x74\xf7\x75\x7b\x9f\xd5\x01\x16\xc2\xa3\x30\x5d\x78\x6d\x58\x31\x61\x14\x0d\x5c\xe4\xb7\x83\x23\x27\x07\x90\x3d\xc8\x0c\x0e\x70\x5f\xb6\x63\xc5\xec\x24\x1f\x9a\x3e\x1e\xc4\x13\xb6\x74\x08\x5b\x08\xe3\x59\x5a\x9e\x79\x88\xc1\x2a\xcb\x1e\x04\x29\xf1\x6e\x54\x9c\xb8\x2f\xe4\x01\x05\x22\x12\x97\x96\x6c\x1e\xfe\xa3\x38\x4e\x31\x9a\x84\xd7\x44\x16\xb2\xf4\x0f\x3c\x41\x4d\x21\x0d\xc9\x84\xc8\xa4\x30\x17\xd9\xc5\x97\x20\x9d\x92\x93\x4e\x3a\xeb\xa7\xf8\xbf\x67\x38\xca\xac\x2a\x06\xa4\x8a\x76\x52\x5a\x0f\x75\x14\x9d\xaa\x41\x19\x25\x6d\x56\xe6\xab\xfa\xc9\xce\x66\xc3\xca\x16\x23\x29\x5f\x6d\xd6\x48\x49\xe4\x0f\x26\x30\xb7\x1e\x0f\xcf\xd0\xef\x1b\xb4\xde\x69\x58\x18\xba\x24\xff\xcd\x4d\xa0\xdf\xf6\x58\x79\x25\xa0\x89\x24\xda\x1e\xfa\x41\x40\x26\x70\x8e\x02\x64\x0a\x69\xae\x7a\x2b\xf4\xbf\x76\xf5\xc7\xe1\xfb\xde\x31\xfa\x5f\xed\xd5\x35\x34\x65\x40\x53\xa6\xcb\xb3\xc1\x3c\xfc\x3c\x48\xd7\x40\x4e\x9e\xfa\xc1\x0a\x7f\x2a\x90\x8d\x0f\x7d\x7e\xfd\x3c\x4b\x79\xec\x7c\x11\x08\x85\x99\x2b\x43\xe0\x64\x81\xc7\x42\xf6\x57\x00\x59\xbe\x7d\x26\x68\x59\x2b\xd9\xf5\x78\x2c\x04\x94\x74\x1f\x09\x80\x52\x11\xcd\x92\x0c\x0a\xc4\xb3\x7c\xe4\x63\xb3\x38\x7c\x89\x71\x25\xbf\xf2\xeb\x35\x4f\x8b\x9b\xa5\x5c\x30\xfb\x81\x7e\xb9\x76\x67\x06\x22\xaa\xd1\x58\x27\x1b\xd2\x78\xb9\x62\x86\xcc\xa2\x4c\xd0\x0e\xf8\x15\x99\x50\x23\x46\xb0\x06\x50\xfa\x62\x99\xe6\x9c\x16\x11\x56\xfe\xa5\x15\xb0\x35\x4b\xef\x85\x78\xbb\x66\xe8\x05\x9a\xea\x0d\xbe\x12\x7a\x81\x08\x28\x0a\x16\xb9\xaf\x8b\xf1\x9e\x39\xb8\x18\xef\xc1\xad\x45\x79\x3b\x17\xb3\x42\xa4\xd2\xe2\xf0\x05\x39\xfb\x51\xdb\x44\x21\x5a\x72\xb9\xe5\xcb\xd0\x69\x9c\x7b\xe9\x4d\x81\xf4\xaa\x61\x87\x36\x72\xdb\x77\x7e\xf8\x97\x41\x7b\x2a\x4a\x36\x33\x84\xcd\x20\xb0\x0f\x02\xcc\xf5\x20\x8e\x06\x7e\xc6\x61\x96\xd6\xc0\x7c\x8a\xa6\x82\xa1\xc0\x92\x1d\xf9\x01\x0d\x64\xc4\x16\xea\xb7\xe1\x32\xb3\x48\xe7\x33\xdf\x84\x23\x40\xb3\x25\xae\xdc\xa1\x9c\xce\x12\x6c\x7c\xe0\x1d\xce\x94\xcc\xc5\xd2\x22\x86\x18\xb0\x68\xec\xa7\x19\x3c\xcf\x5f\xd3\xb9\x78\x7d\x5a\x51\x97\xf3\x32\xaa\x57\xa9\x8b\xd9\x19\x73\x06\xb3\x79\x12\x53\xc1\xc1\x4d\x31\x39\xb8\x0d\x7d\x0d\x4a\x9b\x29\xdd\x36\x17\xd4\xf3\xff\x15\x17\x41\x36\x17\x05\xfb\xcd\x82\xed\x56\xa1\xe8\x1e\xe8\xe1\x8c\xfe\xf7\xe3\x00\xdf\x52\xf5\xe0\x89\x38\xad\xd1\x4b\x11\x38\x49\x48\xdd\xe9\xbd\xed\xb9\xa0\xb0\xb9\xba\x15\xf4\x45\x60\xe9\xc2\x86\x09\x11\x48\xde\x41\xe0\xe0\x47\xc0\x06\x40\x32\x9c\xd4\x08\x9c\x60\x0a\x98\x79\xda\xa9\x8e\xb6\x6d\x34\x71\xab\x78\x23\x2c\x60\x18\x48\x27\x5a\xfd\xd8\x93\xac\x0f\x8b\x6d\x00\x0b\x02\x9c\xa9\xf6\xa1\x16\x3f\x4e\x90\x9b\xc9\x08\x28\x6a\x51\xa4\x2a\x76\xc9\xf7\x09\xd8\x7e\x3a\xf0\xcf\x27\xd6\x3c\x0c\x18\xb6\xa4\x5c\xd2\x56\x8d\x4b\x9c\x27\x06\x02\x15\xb6\x44\xd0\x68\xc0\xa9\x5c\xbb\x9b\xb1\x4b\xfb\xab\x2f\x8b\x9b\x57\xad\x57\xaa\xe8\xe5\xea\xc2\x18\x08\x55\x8b\xe3\x2c\xf3\x1e\xe3\x29\xf2\x33\x34\xc6\x84\x0b\xc6\x11\x5f\x01\x2c\xcd\x07\xb5\x04\x85\xfd\x1a\x18\xae\xc9\xb7\x90\x38\xdf\x4c\xc2\x88\x1a\x89\xb2\x43\xbc\x11\x2e\x51\x7d\x64\x95\xe8\xf4\x49\xf8\x53\x42\x9a\x80\xfd\x31\x3d\xf2\x86\x97\xe8\xa7\x9f\xac\xfa\x78\x3d\x50\xc7\xe1\x9d\x74\x19\x39\x26\xaa\x32\xc5\x79\x3e\xd7\x9b\x2d\x7b\x25\xed\x16\x49\x73\x91\x44\x18\x4a\xb3\x57\x16\x82\xe6\xcd\x3d\x2c\x21\xaf\xae\x92\x83\x0c\xcd\xf7\xe5\x12\xb9\x40\x5e\x67\xa6\x5f\x20\x81\xc3\xef\xb9\x3a\x08\x7e\x15\x4f\x6d\x04\x5d\xa7\xe4\x3b\x5d\xc6\x3f\xde\xb2\x7a\x5c\xbc\xad\xed\x81\xe4\x37\x67\x06\xa8\x7c\x64\x6b\x6f\x9e\xe5\xdf\x3d\x2d\x15\xc0\xf4\x8e\xc9\x1e\x76\x33\x14\x34\x88\xc7\x63\x4c\xe9\x3f\x1e\x72\xd1\x00\x44\x4d\x0c\xc9\xf4\x8a\x44\x0f\x49\x14\x95\x9c\xbc\xc9\x36\x9a\xf8\x57\xd2\x2b\xab\x5f\xa2\xdd\xf5\x83\x3a\xa0\x0b\x21\xa5\x4c\xed\xfc\xe2\x11\x52\x3c\x30\x2e\x48\xeb\x93\xf5\x69\x98\xe3\xba\x00\xa5\xfe\x98\x62\x0f\x3f\x00\x18\xa8\x24\x7d\x1a\x7e\x14\x27\xe1\x25\x95\x55\x38\xc7\xb0\x02\xe4\x57\xa9\xb9\x9c\x2f\x59\x0e\x9a\xb1\x56\xcb\xc9\x35\x77\xe9\x59\xb1\x7c\x33\x18\xe1\xc9\xdd\xe0\xda\x05\x4e\xa6\x32\x07\x8b\xe9\xa1\x04\xcf\x0a\x82\x26\x65\xbc\xcd\x93\x36\xd2\x53\x0c\x15\xb1\xf8\x5b\x5d\x0c\x1b\xc4\xd1\x25\x4e\x32\x45\x86\xa5\xe9\xee\xb8\x31\x25\x58\x7c\x52\xeb\x3f\xb7\xdb\xea\x21\xad\xa2\x3a\xaf\x8a\x97\x25\xed\x61\xe6\xbb\x58\xa9\xa8\xcd\x3f\xd6\x09\xef\x26\x19\x1f\xcd\x4e\xd4\x8f\x44\x16\xab\x69\x9c\xa6\x61\x7f\x8c\xdd\x2b\xd6\xd2\xd4\x62\xce\x4d\xf9\x40\x99\xf6\xa0\xf4\x1b\x3f\x81\xff\x69\x40\x41\x42\x7d\x4e\x56\x70\x57\xfa\x9d\x3b\x3c\x59\x2b\x7d\xc6\x37\x5d\xd5\x2f\xca\x5a\x4c\xf3\x94\xb2\x17\x22\xcb\xb8\x0b\xff\xce\x29\x28\x56\x65\xd7\x74\xe7\xb2\xd7\x60\x22\xbc\x6e\x99\x60\x2f\x2c\xe4\x7a\xf5\xe8\xfc\xbe\x77\xbc\x66\xaf\x20\xb1\xf0\x96\xbd\x84\x58\x38\x12\x50\xfa\x6e\xe5\x60\x8a\xa3\xe3\xe3\x0f\x46\xb5\xf2\xce\x64\xf2\xf4\xdb\x05\xaf\x49\x78\xbd\x17\xa9\xe5\x4a\x9b\x1e\xd1\x55\x9c\x2e\xb6\x8c\x91\x73\xdd\x98\xac\x44\xf3\x0d\x74\x70\x13\x72\xa8\x73\x03\xe7\x06\xb6\xdc\x2b\x03\x76\x05\xf8\x1d\x0e\x43\x7d\x8d\x17\xc0\x81\x2c\x60\x29\x4d\x01\x06\xe9\xe3\x70\xee\x45\x99\x63\x1c\xc5\xf4\x8d\xc6\x00\x59\xd2\x7e\x5c\xc4\x3d\xca\x2e\x69\x8a\xbc\xb8\xa6\x63\x6b\x7b\x09\xbd\x78\x61\xf7\xad\xb0\x96\x5f\xc9\x62\x9a\x6f\xc8\xe5\xca\x31\xa7\x96\x83\x54\x9d\x84\xc9\x2b\xca\xc4\x29\xc6\xc6\x65\x55\x95\x97\x40\x5f\xbf\x52\x72\xcd\xeb\xac\xf0\x49\xbc\xe1\xc7\x5e\x43\x47\x63\x95\x93\x28\x95\xcd\xbb\xd7\xa0\xed\xc0\xd5\x86\xf8\x69\xbf\xdd\x60\x3d\xb7\x11\xa7\x0d\x34\x2b\x2e\x72\x19\xc3\xee\xa5\x0e\x62\xf1\x75\x87\x58\x75\xbe\x7b\xc9\x45\xbc\x99\xe5\x41\x3c\x99\xfa\x19\x6c\x2f\x65\x97\xa1\xbc\x2d\x68\x9b\x98\x24\xfe\x94\xdd\x13\x6d\xcb\xef\x2e\xc8\x3d\x94\xe1\x60\x4c\xdb\x3e\xe6\xe4\xed\x20\x64\x89\xba\x5c\xbc\x51\xa1\x6f\x51\xbc\x34\xf7\x9d\xa3\x96\x91\x23\x2d\x29\x4b\x30\xff\x62\x0b\xd4\x48\xc4\x5d\xad\x02\x79\x67\x3b\xc6\x42\x7f\xcd\x43\x2c\x29\xee\x54\xb5\x5c\x49\xd1\x6a\x0c\xed\xfd\x69\xed\xba\xdd\xec\xd4\x3b\x83\x35\x48\x6c\xd0\x69\x77\x5a\xed\x61\x7b\x78\x56\xe5\xaa\x78\x00\xcd\x1f\xf2\x7e\x38\xce\x91\x25\x50\x70\x8e\x85\xe3\xf0\x25\xea\xe6\x8c\x8c\x86\xb5\x59\x7c\xcf\x2b\x5a\x63\xb2\xbf\xd2\xa2\xc2\x23\x5f\x27\x39\x9d\xde\x79\xc9\xa8\x31\x1b\xf8\x82\xbe\xc3\x1a\x7e\xd8\x00\x0e\xa6\x30\xaa\x2d\xbd\xa9\x9f\xa4\xb8\xa2\x2c\xd4\x82\x8b\xc9\x24\x55\x14\x3f\x79\x35\xab\x57\x02\x29\x8e\x68\x0c\xaf\x39\x8b\x8e\x12\x86\x81\x4c\x91\x7a\xb5\x08\x22\xbf\x8c\x93\x0e\xc3\x2c\x29\x84\x01\xee\x04\xa7\x19\xb5\x6d\xf0\xc7\x96\x05\xaa\xc1\x3c\xad\x9d\xa1\x8d\x0d\x94\xaf\x3d\xf4\xd3\x4f\x7a\xbb\xa7\x75\x56\x86\xaf\x49\x97\x0a\x6a\xfb\x9a\x5e\x60\x98\x2d\x23\x95\xc3\x18\x8b\x5f\x6b\x91\x99\xf2\x34\x3c\xd4\xaa\x16\x58\xd7\xc5\x97\xec\x88\x0e\x57\x41\x39\x0c\xb3\xbc\x01\x7f\x0a\x0d\xd4\xf4\x5b\x6b\xa3\xb8\x72\xab\x53\xef\x94\x63\x14\xd6\xa3\x91\xe3\x18\xe4\x49\xa7\x13\x55\x34\x2f\xbc\x2b\xe2\x8b\xf0\x2a\xf1\xa7\x53\x90\x23\xfd\x8c\x35\x2f\xab\x4c\x90\x4f\x76\xfa\x54\xf2\x4a\x2b\x5c\xbd\x8a\xab\x8f\xe1\xca\x96\x3b\xfc\xd8\x3e\x95\x75\x20\xb9\xf3\x65\x8f\x10\x7a\xb8\x8c\x5f\x24\xd5\x73\x1d\x81\xdc\x5b\xd6\x59\xea\x10\x1a\x05\x94\x6a\xc4\x01\x23\xbf\xd8\xb1\x1c\x9c\x8a\x42\x44\xe9\xde\x8b\x80\x50\xd7\x10\xd5\xa4\x89\x2d\x0c\x2a\xc5\xae\x1d\xc8\xbc\x31\x6f\xba\xfb\x78\xa8\xe6\xca\x27\xcb\x51\xa7\xc0\xfb\x9c\x35\x4d\x6d\x50\xd8\xef\xdc\xef\xfc\x6f\x12\xc3\xc5\xbe\x85\x6d\xfe\xb5\x1b\x18\x59\x96\x76\x8d\x8a\xb9\xac\x84\x7f\xa5\xa9\x8d\x50\x5c\x2d\x1d\xa7\xb0\xc7\x6b\x30\x0f\x52\xa3\xab\x13\xbe\x69\xe3\x9e\x58\x6d\x0e\x69\xa0\x40\xd9\x61\x71\x8e\x75\x7b\xb1\xde\x2d\x84\xce\x42\xd1\x73\xb6\x6d\xf6\xeb\x52\x74\x83\x38\x77\x3e\xb1\x05\x40\xb3\xfa\xac\x1a\x62\x49\xee\x99\x21\x02\x24\xb0\xce\xde\x45\x32\xe9\x41\xff\x72\x98\x70\x05\x6c\x40\x61\xf6\x46\x84\xe3\x0a\xc7\x5c\xd7\x7e\x54\x7e\x3b\x2d\xda\xb4\x95\xfd\xd5\x2c\xc8\x55\x8b\x96\x4f\x84\xac\x44\xdf\x56\xc2\x4b\x4b\x11\x49\x47\xc8\xe8\xc5\x2c\x43\xb5\x82\x39\x20\xb8\x10\x35\x8b\x09\x7d\x60\x5e\x92\xbd\xb2\x14\x96\x74\x81\xba\x85\xb5\xa5\xb4\xa4\x17\x24\xa4\x37\xb4\x1c\xd7\x6e\x4b\x1f\x5b\xd8\x3d\x74\x2a\x26\x4e\x28\xbe\xe4\x6b\x19\xf4\x68\xdb\x93\x4c\x00\x62\x87\xd2\x2e\x9a\xa4\x47\xc8\xed\xfd\x77\xdc\xa7\xb4\x00\x2d\x22\xd2\xf1\x37\xd8\x9b\xf2\xa8\xca\xf3\xd9\x34\xf7\x9e\xb7\xb0\x69\x4e\x76\x2c\x8c\x82\xe4\x51\x7f\x67\x96\xfd\xd0\x28\xea\xfb\xd2\x03\x6e\x29\xce\xd8\x05\x8e\x08\x03\xdf\x60\x57\x61\x1a\x07\x49\xb5\x20\x2f\x26\x0d\xb0\xbc\x53\xb0\xdb\x6f\x38\xbf\xca\xc8\xe7\xdc\xc4\xd6\x1c\xe3\x14\xe6\x86\x21\x4f\x9e\xb2\x89\x29\x51\x17\xe9\xb0\xe4\x7b\x93\xc4\x64\x14\x85\x8f\x75\x9b\x10\x4d\x2c\xac\x8d\xb1\xb2\x35\x7d\xac\xd4\xfb\x17\xd0\x31\xf9\x69\x3a\x9b\xe0\x40\xbd\x4f\xf4\xc7\x09\xf6\x83\x1b\x69\xbf\x53\x0e\x64\xb3\x88\xa6\xad\x2c\x11\xd1\x6c\x31\xb6\x67\xe7\x5f\x0b\x1d\x9a\x08\xe3\x02\x13\xf5\x24\xc5\x0b\xf3\x7a\xb7\xbe\x68\x16\x2d\x0a\xeb\x2f\x94\xb8\x0d\x92\xa7\x2a\xa4\x03\x4e\x05\x48\x10\xbf\x9d\x07\x9c\x1b\x3a\x25\x79\xf5\xb0\xca\xb6\x54\xde\x2c\x76\x8d\xbc\x08\xe7\x84\xb0\xe1\x36\x21\x94\x3d\x99\x4b\x55\xbf\xd8\x40\x85\xda\x51\x06\xad\x40\x29\x6a\x68\x26\xac\x37\x24\xef\xed\x26\x12\xf3\xae\x4c\x3e\x07\x43\xb8\x2f\xa1\xff\x2d\xbe\x2c\x99\x67\x85\x61\x5e\x98\xbc\xa7\xd0\x49\x2b\xe5\xee\x49\xb6\x08\x78\xb8\xd3\x27\x8d\x91\xb5\xbc\xf7\x0b\x57\x18\x4c\x59\xbc\xa0\xf2\xea\x58\x5e\x83\x59\x5e\xb0\x07\x90\x53\x48\x33\x00\xb8\xd8\x2b\x24\x0f\x54\x8e\xa9\x6d\x45\x18\x31\x4b\x5e\x66\x07\xc0\x4c\x66\x2e\x70\x04\xc6\xbc\xc5\xd0\x44\x94\x72\x07\x30\x1a\x3a\xbb\x18\x96\xa9\x33\x00\x15\x96\x24\x24\x6d\xa2\x4e\x0b\x4c\x8e\xe1\x03\xb7\x9f\xdd\x1b\xa2\x78\x12\x12\x19\xc1\x43\x3e\xfd\x74\x15\x8e\xc7\xa8\x8f\x45\x83\x01\x4a\xfc\x28\x88\x27\xe3\x9b\x07\x3a\xdc\x53\xab\x09\x36\x4c\x1e\xda\xfb\xc5\x83\x29\x25\x8d\x7f\x03\x2e\x44\x27\x39\x30\x59\x90\x44\x8d\x2b\xf8\x1a\x0f\x66\x19\xae\xbc\xe0\xd1\xa8\x5e\x78\x2c\x71\x87\xc7\xcc\xb7\x1c\x62\xd1\x03\x41\xf7\xd0\x0b\x32\x1c\xe4\xff\x5f\xb8\xcf\xcc\x14\x8c\xcc\xdd\x38\x35\x7b\x9c\x44\x3d\x46\x5d\x54\xb1\x69\x37\xea\xa7\xd3\xcc\x66\xd9\xa1\xa8\xfe\xc1\x79\x95\x64\x28\x91\x29\x9c\x4a\xa7\xb5\x6a\xa4\x35\xb7\xb8\xd5\xd1\xa5\x2d\xad\x6b\x53\x5a\xa1\xf1\x66\x69\xe2\x81\x5c\x81\x2b\x62\xdc\xe5\x69\x90\xd9\x42\xba\xad\xae\xb0\x44\xde\xd2\x78\x00\xfe\xd6\x80\xb5\x84\x36\xb3\x62\x0c\xc0\x6e\xda\x50\x93\x8b\x64\xd0\x4c\x41\xce\x93\xc9\xf2\x31\x47\x2f\x4d\x7d\xb6\x92\x1a\x3a\x4f\xe1\x6c\x77\x96\x3a\x62\xa2\xd4\x82\x87\xf1\xfc\x48\x2d\xa4\xe8\xbb\x69\xb5\x6d\x9a\x01\x45\xc5\x1d\x30\xbe\xcc\x59\x9e\xc6\x92\x3d\x01\xcb\x21\x7e\xdd\x5d\x1f\x6e\x89\x12\x27\x14\xe2\xf6\x6f\x36\x0d\xd7\x23\xea\xc7\xdf\x6f\xed\xdc\x22\xb2\x7d\x72\x0b\x4a\xdb\x2e\x9c\x4b\x79\x9c\xd9\x16\x6f\x71\x0b\x69\xc5\x2d\x1d\x76\x3b\x3f\x7c\x0e\x86\x5d\x69\x7b\x96\x28\x64\x41\xf5\x38\x73\xa9\x5a\x64\x5f\xfe\x3e\xf4\xe5\x85\xd2\xc1\x77\xa0\x8e\xf8\x9b\xa8\xcd\x2d\x8b\xaf\x94\x26\xf9\x05\x1f\x6a\x57\x58\xd9\xc7\x6f\xd8\x43\x7f\x3e\xb2\x06\x3b\xdf\x8e\xbe\x91\xc2\x41\xdb\x5d\xe3\xcc\xa5\xdc\xb5\xc9\x2e\x04\x3c\x11\x5b\xb8\xb8\x22\x61\x4f\x87\x57\xc8\x18\xec\x99\x6e\x7b\x2e\xef\x4e\x2a\xc6\xd2\xbe\x19\x5d\x5a\x81\x2d\x56\xc1\x60\xc5\x1a\x92\xc0\xa9\x98\x57\xf4\x25\xee\xeb\x0c\x39\x00\x84\x31\x3f\x6a\xfb\x92\x1e\xdf\x40\x63\x3f\xbc\xa6\xc9\x40\xa0\x82\x75\x48\xa5\xb3\x35\x35\xcc\x54\xa0\xbb\xf4\x26\xd6\x13\xdf\x3d\xf4\xc1\x7f\x01\x3f\x7e\x60\x05\xf1\xf7\xce\x98\xbf\x47\x3d\xb1\x8d\x19\x2e\xaa\x28\xbe\x17\x63\x7c\x70\x14\x4d\x45\xf1\x43\x31\xee\x92\x7a\xe2\x6f\xce\xbb\xbf\xb9\xb2\xf8\xdb\x6f\x15\x9e\x62\xdb\xe3\x38\xa1\x3d\xdc\xde\x51\x4a\x1f\xee\xbe\xbf\xb0\x6d\x1d\xf2\xf8\x96\xdc\x3d\x8a\x14\xe4\xb9\x2a\x4f\x64\xba\x94\x53\x5a\xb2\xfc\x95\xb7\x67\x5e\xbb\xf9\xbd\x26\xa5\x7c\xf0\x1c\x94\x8b\xe6\x9e\x54\x72\x4e\x1a\x88\x99\xe9\x27\xb5\xb4\x93\xbc\xa2\x23\xf1\x24\xe8\x47\x73\xe0\xe2\xa7\x9a\x7c\x72\xdf\xcf\x46\x1e\xb2\xa4\xa0\xcc\x8f\xd7\x1f\xe2\x81\x3f\x46\xd3\x78\x7c\x33\x0c\xc7\x28\x1e\x22\xba\x69\xb1\x53\xbc\xe5\xc8\xcb\x62\xdb\x6f\xa8\x05\xb5\x86\x15\xc6\x24\x5e\xef\x90\xf7\xb7\xaf\xcd\xd8\x41\x92\xad\x65\xff\x0f\x83\xa9\x81\x8d\xe0\xac\x4f\x66\x50\x27\xe2\x9d\x95\x69\x12\x67\x31\xf9\x84\x36\xc8\xe9\x43\x2f\xc0\xea\xa1\x0d\x14\xe1\x2b\x82\x40\x31\x84\x68\x36\x1e\x3b\x16\x8a\xc0\x20\x5f\x26\x52\xbc\x23\x5b\x24\x4f\x3e\x27\xc5\x4a\x6e\xa7\x62\xfb\x43\xd8\x4f\xfc\xe4\x66\x9e\x8e\x5c\xca\x0f\xea\x04\x05\xd9\x42\x99\xd6\x93\x08\x17\xbc\xcb\xfe\x18\x85\xd1\x08\x27\xa1\x12\xc0\x55\x89\xe8\xa0\xe7\x19\x35\x23\x8c\x9a\xd3\x59\x22\xec\x1f\x8f\x31\x0c\xee\x71\xc2\xcf\x60\xe4\x67\x1c\x21\x16\xca\x83\x8a\x41\xc6\xa9\x12\xa1\xa2\x38\x80\x5c\xee\x8a\x2f\x71\x92\x84\x01\x4e\xd1\x21\x55\x88\x84\x38\xa5\x0c\x7c\x7a\x83\xc2\x88\x65\x33\xce\x11\x28\xd1\x82\x9e\xab\xe1\x64\x51\x00\x86\xcc\xe5\x28\xb7\x48\xd4\x40\x32\x51\xfb\x37\x27\x94\x84\x15\xe9\xa6\xc0\x24\x51\xf6\x17\x0b\xf1\x38\xe8\xa2\x17\x90\x29\xeb\x85\x6e\x38\x62\x6f\x93\xfc\x4d\x70\x36\x8a\x83\x42\x1f\x79\xa9\xb4\x1e\x23\xdf\xe6\x78\x86\x90\x19\xce\x90\xa2\xaf\x18\x64\xf3\x79\x75\x06\x31\x9c\xfa\x57\x91\xf9\x45\x62\x24\x44\x58\xc8\xd3\xea\xb9\xcc\x89\x37\x67\x17\x13\x1c\x59\x4c\x87\xc9\x8e\x52\x8c\x05\xca\x99\x0f\x3b\x77\xe5\xe5\xad\xe9\x1f\xac\x08\x30\x33\x29\xee\xfa\x15\x0a\xc7\xd2\xc4\x8e\xd3\x0f\xbc\xc9\x91\x9f\x1e\x5c\x45\x8c\xec\x6f\x2a\x2f\x48\xcd\x17\x55\xe1\xf3\x44\x1e\x61\x13\xe4\xe5\xc9\x8b\xb9\xfd\xa0\xb5\x0a\xa7\xdb\x52\xeb\xff\x49\x67\x53\x22\x6a\x45\x61\xb6\xe2\x13\xe1\x94\x6d\x7d\x7e\x72\x31\x23\xa3\x6b\x1d\x0f\x64\xc9\xa0\x50\x30\x4e\xb9\xc7\x6d\xf2\x22\x45\x39\x47\x0f\xa9\x52\x98\x4f\x3a\x5d\xa5\x26\x04\xb9\x83\xca\x7e\xe0\xd8\x76\x10\x57\x8c\x0f\x71\x82\xa3\x01\x69\x00\xc6\x79\xaa\xaf\x57\x63\x18\x98\x5c\x6c\x03\xe8\xdc\x67\x90\x2d\x35\x86\x8d\xa9\x6e\xc3\x4a\x49\x65\xa6\x49\x55\xde\xb3\x88\x8e\x03\x4c\x20\x5d\xb5\x66\x08\xd4\x4d\x3e\x1f\x79\x06\x9b\x4a\x55\x5c\xc3\x11\x51\x1a\x42\xca\x01\x90\x4a\xf5\xef\xcc\x2b\x79\xc4\x72\xb4\xc1\xd8\x26\xbf\xb3\x98\xcb\x8b\x68\xb9\x62\x8e\x67\x36\x02\x4b\x2e\x8f\x93\x6d\xae\x5c\x1e\x41\x5d\x5a\x23\xfc\x9d\xba\x4e\x9c\x54\xc3\x8b\xdf\x85\x6c\x8a\xdc\xd5\x1d\x73\x85\x0e\x18\x33\x63\x49\x02\x80\xa4\xc0\x84\x3e\x08\x50\x1a\x4f\x30\x4d\x3d\x85\xae\x46\x38\x42\x37\xf1\x2c\x11\x66\xf6\x3e\x11\x67\x29\xf0\x07\x8e\x9d\x7b\xdf\x5d\x50\x77\x74\x2e\xda\xcb\x10\x65\x00\x2b\x2b\xe6\xc8\x88\xa1\xbf\xe3\x76\x37\x17\x8d\x52\x73\xda\x8b\xa7\x44\xd8\x99\xe6\x72\x0f\x93\x77\xee\x21\x4e\x49\xc0\x40\xc3\xa4\xc8\x54\x13\xd0\x44\x3e\xf0\x94\xb2\xd5\x49\xf7\xcf\xb2\xf2\xcb\x1d\xc7\x1d\x1a\x51\x2e\xb1\x45\xff\xac\x6b\x5c\x44\x3c\xe4\x97\x6d\x1f\xfd\x09\x18\x4d\xcc\xa9\x87\xd8\x56\x9d\x17\xd3\x37\x6b\x19\x60\xb5\x70\x8b\x25\xd3\x79\x2a\x17\x3f\x43\x1b\x52\xfb\xea\xa7\x05\x52\x17\x39\x36\xd9\x6d\x74\x15\x47\x2f\x32\x2a\x3f\x73\x77\x47\x29\x78\xe1\x38\x8e\xa7\xc8\xef\xc7\x97\x96\x6d\xb0\xb8\xcb\x2f\x38\xb4\x17\xee\x0e\x03\x17\x15\xad\xca\xfd\x14\x6f\x4b\xe4\xd5\x2a\xb5\x78\xc4\xe1\x04\x7a\x0a\xf6\x2f\x8b\xac\x1b\xdb\xc6\x37\x18\xc7\x11\x7e\x04\x8e\x07\x70\xd1\x46\xbe\x87\xc0\x8b\x12\x3b\x19\x29\x36\x77\x23\x93\x73\x91\xa8\xc2\x11\xe7\xa7\x56\x7b\x32\xfb\x19\xd9\x7a\xbb\x1f\x21\x1f\x3c\x6f\xb5\x58\x84\x85\x91\x85\x8c\x38\xef\xc5\x20\x6c\xe1\x69\x84\xf1\x83\x1a\x0e\x31\x0d\x2f\xa2\x70\x18\x0e\xfc\x28\x63\x01\x25\x43\xda\x7b\x00\x49\xdb\xb1\x1d\x93\x7f\x95\x3c\x88\xe9\x59\x59\x7e\xf3\x00\x61\x63\xcc\xe6\x75\xb2\x70\x84\xc1\x97\x4d\xaf\xe6\x8c\x35\xb2\x9a\x85\x89\x91\xd2\x6e\x30\xe6\x0e\x1a\x7e\xb0\x54\x2f\xb2\x7f\xb6\xb2\xb1\x1b\xb6\x30\x0e\xed\x7f\x79\x00\xa7\xb5\xeb\x5a\xad\x56\xaf\x35\x6a\x4d\x0f\xd5\xae\x6b\xad\x5a\xbb\xd6\xa9\xad\x9d\x3d\x1a\x60\x0f\x75\x4a\x87\x5e\x61\xe1\xeb\xf8\x8c\x18\x2b\xf6\x8a\x39\x04\xc3\x72\xe5\x0f\xf4\xbf\x5f\xbf\x42\xcc\x5e\x4d\xd4\x18\xa2\x8a\x98\xde\x1f\x36\x2c\x8a\x42\xf9\x0f\xa0\x4a\x46\x43\xfc\x67\x69\x63\x52\x1d\x00\x25\x8f\x31\x8e\x2e\xb2\x11\x35\x3d\x72\x72\x91\xf2\x31\x63\xf2\x85\xb2\x58\xa4\x98\xed\x68\x10\x07\x84\xde\x31\xfd\xa1\x93\x3b\xbc\x2e\x8e\xfd\x29\x08\x00\x47\x83\x95\x5d\x7c\xed\x6e\x73\x5e\x00\x99\x52\xab\x7d\xe1\xe0\x2e\x39\xb1\x96\x88\xec\x62\x89\x6b\x30\x2f\xac\x8b\xa5\x8a\x32\x24\x9f\xb2\xe1\xfa\x42\xd1\x5c\xd8\x54\x38\x63\xb9\xf0\xa9\xfa\xfa\x15\xed\xe2\xeb\xc2\xf0\x2d\x73\x08\x68\xe0\x67\x38\x62\x7b\xbe\x4a\x41\x0e\xe6\xef\x26\x24\xe9\x1e\x36\x1f\xf0\x13\xc6\x0d\x25\xca\x84\x34\xbf\x8b\xde\xeb\x96\xc5\xa5\x0c\x6d\x08\xec\xea\x3c\x7e\x86\x78\xd3\x70\xa7\x34\x83\x92\x3a\x53\xa2\x81\x9d\x17\x0b\x47\x42\x06\xf6\x57\x83\x61\x59\x7c\x15\xb3\x91\x2f\x42\x1d\xe4\x24\xe6\x2e\x1d\xa6\xc7\x39\x8f\x51\x78\x8e\x03\xf8\xb1\xca\x92\x28\xfc\xbc\x8e\xd1\xa9\xde\xd8\x9f\x4c\x11\xbe\x86\x48\x92\xfd\x50\xef\x1c\xbd\x57\x25\x65\xcc\xdb\x06\x7a\x9f\x3a\xb0\x05\x49\x51\x10\xff\x97\x23\x50\x3a\xd4\x27\x22\x69\x84\x61\xab\x45\x7e\x86\x7c\x94\x85\x13\x8b\xc4\x6d\x0b\xc9\x2e\x77\xd7\x9d\x14\x42\x1e\x1c\x52\x14\x6d\x10\xf4\xd8\x2c\x9c\x86\x3c\x2a\x36\xf9\x4f\xa5\xd1\x42\xcb\xa8\x12\x52\x8c\x5f\xa2\xf5\x6a\x55\x44\xcb\x76\x4a\xf1\x14\x8e\xda\xe3\x25\x14\x8a\x70\xdb\x5f\x37\xf2\xa6\xdf\xbc\xe1\x6d\x58\xca\x8b\x46\x4b\x08\xfe\xce\x6d\x49\x1e\x53\xba\xb8\xee\x35\xa6\xee\x28\xf7\x65\xbb\xbf\x81\xcc\xc1\x2e\x93\x31\xd8\xa4\x42\xb1\xd9\x2e\x6d\xa8\x68\xda\x72\xac\xf8\x61\xe4\xf7\xf5\x93\x87\x74\x00\x28\xcb\x4e\x69\x0c\x0e\x22\x04\x2a\x82\x61\x98\xdd\x57\x14\xcc\x17\xa7\x58\x5d\x0e\x26\x45\x3e\x97\x0d\xdd\x6b\x61\x4d\xa6\x1c\x65\x8b\x8b\xe4\x64\x32\x76\x86\x61\x11\xd5\x4e\x05\x0c\x1e\x67\x7e\x03\x96\x0e\xfd\x03\xd2\x6f\x36\x08\xe9\xa7\x0a\x5f\xb0\x10\xbc\x22\x4a\x6d\xa0\x7d\x3f\x1b\xad\x0c\x70\x38\xce\x6b\xae\xa2\x05\x22\x12\xd9\xcf\xbf\xa5\x76\x1e\x87\x39\x92\x71\xfc\xbd\xab\xdd\x27\x3b\xee\xca\xb4\x60\x9c\x77\x55\x5a\x98\x77\xce\x95\xc1\xc2\x49\x8d\xe2\x2a\x47\x3f\x37\x4f\xce\x2b\x26\x8d\x30\xf3\xfb\x9a\xd3\xa4\x8e\xd4\x5b\x7c\x0a\x24\xb1\x61\x18\x8e\xc7\x3c\xec\x2c\x73\x93\x80\xf3\xd6\x7c\xa1\x84\x1f\xe6\x22\xdb\xa1\x57\x06\xe5\x74\xf1\x29\x35\xcb\x0c\x52\x29\x42\x79\x28\xe3\xb3\x12\x47\x30\xe6\x0a\x52\x77\x9f\xb4\x68\x09\x99\x4c\x22\xfb\x11\x4b\x66\x0f\xe6\x81\x8a\x7c\x4d\xd4\x1b\xf2\xc9\xf9\x95\x3b\xca\xfc\xf9\x15\xda\x20\xff\x3a\x12\xa8\x4d\xce\xbf\x90\x6d\xe6\xba\xe9\x07\xb8\xb3\xde\xd7\xc3\xaf\x8b\x62\x7e\xfa\x19\xc9\x9c\xa3\xe0\x9e\xa0\xc4\xdd\x1d\x6d\xb5\x52\xbb\x7e\x55\xeb\xbc\x42\x2f\x49\x17\xbe\xc0\x9e\xbe\xb3\xb3\xb3\x53\x45\x4b\xf4\xc5\xcf\x3f\xa3\xda\x75\xbd\x06\xdb\x3d\x41\xc0\xb1\xdd\xd3\x2e\x56\x6a\xd7\xad\x4e\xbb\x46\x81\x5d\xe9\xc0\xae\xca\x02\x83\xe1\xc5\xe9\x0c\x3c\x7d\x2a\x80\xc6\x9b\x37\xb4\x26\x5a\x42\x30\xd2\x85\xf5\x59\xdd\xd5\x0d\xa8\xc3\xfe\x8a\xcb\x2e\x6d\xa0\xda\x4a\xdb\x59\x06\xc6\x94\x15\x7d\x49\xed\x6d\x38\xb5\x55\xd1\xcf\x68\xa5\x8d\xfe\x03\xd5\x51\x17\x2d\xd7\xcb\x88\x28\x06\xe7\x50\xc5\x0d\x0f\x25\x03\x7f\x30\xc2\x2c\xbb\xce\x7c\x81\x83\xd4\x3c\x27\xf4\x98\x54\x2a\xb4\x2a\x39\x2a\x29\x48\x92\xdd\x44\x1a\x0c\xfb\x15\x13\xad\xba\x81\xce\x93\x0a\x2d\x0f\x04\xb9\xd6\x5f\xb3\xf4\xe9\x2a\xcf\xe1\x53\x11\xe5\x73\xf8\xe8\x2b\xaa\x95\x0c\x6b\x1e\xe1\x2b\xc9\xd9\x09\x6e\x1d\x99\x02\x24\xe2\xe9\x7b\x9e\x69\x23\x69\x77\x3e\x65\x47\xfb\x79\x86\x34\x38\x1a\x80\x21\x0d\xfd\xaf\xdd\x90\x66\x17\x5f\x9b\x9a\x00\x1b\x38\x52\x70\x83\x02\x5d\xa1\xbf\xcb\xc5\xdf\xd4\xd5\x17\x23\x7c\x5d\x5a\x85\x51\xe2\xe4\xb9\x60\x54\xcd\x52\xad\x3f\x14\x23\x1f\xe1\x6b\x33\x84\x26\x1b\x3f\xe9\x68\x3f\x3f\x91\x90\x35\x70\xe6\x5d\x8f\xa9\x57\xa5\x4f\x9e\xe9\xa2\xc7\x48\x3a\xeb\x26\xa0\x11\xbe\xee\x8d\xfc\xa4\x74\x9e\xad\x74\xee\x81\x0e\x72\xa4\x85\xf4\x20\x77\x75\xcf\x43\x1c\xc7\x8e\xad\x71\x00\x4b\x80\xb4\xaa\xb9\xda\xa7\xde\xa9\xda\xf8\x9d\xad\x2a\x69\xa7\x36\x2c\xae\xeb\x60\x10\x02\xdc\x1f\x71\x18\x55\x5e\xbc\xb8\x43\xc4\x4d\x89\xc2\xe9\x7a\x5b\x44\xd3\xc3\x57\x0a\x25\xdc\xf2\x0b\xc6\x21\x3c\xfd\xf5\x52\x13\x5f\x6c\xd4\x66\x5b\xac\xc7\xf2\x91\x32\x69\x95\xc5\x12\xa5\xd0\x3a\x1f\xf8\xd1\x85\x3e\xb2\xa3\xcc\x22\xab\xe6\x6a\x91\xd4\x74\x72\xa3\x6c\x0b\x6d\x14\xe4\xc7\xa4\xab\xa5\x09\x9a\x09\xe8\xf4\x5e\x94\xb1\xce\xae\xa4\xb3\x7e\x9a\x25\x95\xd0\x43\x8d\xaa\x07\x49\xf8\x72\x95\x05\x59\x51\xeb\x55\x9b\x03\xee\xc2\x7b\x9e\x32\x4c\xab\xa8\x51\xd6\x7d\xf6\x83\x9f\x85\x51\xbd\xdc\xa6\xc5\xca\xf2\x7d\x4b\x3c\xde\x6d\xeb\x62\xd5\xff\xba\xdd\xab\x2c\x02\x0f\xb5\xa6\xc6\xd0\x9e\x7d\x0f\xa3\xb8\xfc\x8f\xda\xc6\xe8\x70\x7c\xc7\x3b\x99\x84\x20\xdd\x91\xe8\xd4\xad\x0c\x93\x78\x42\xde\xf6\xe2\x00\xc3\x26\x55\x76\x43\x92\x01\xde\x63\x4f\x52\xe8\xf6\xee\xdb\x92\x20\xc7\x85\x16\xc3\x77\xbd\x39\xb1\x55\x44\xf7\x27\x79\xb9\x95\xdf\xa2\x44\xad\xc5\x76\x29\x51\x4d\x6c\x54\xe2\xcd\x63\xef\x55\x5a\xd3\xf3\x72\x39\x87\x92\x16\x3d\xef\xed\xca\x80\x11\xf4\x66\x56\x09\xf9\x9a\xd0\xb7\x2a\xbb\x6e\x71\xe1\xad\x4a\x43\xb8\xec\x4e\xf5\xe9\x64\x67\x79\xbd\xdc\x46\xf5\x29\x1b\xae\x8b\x6d\x8a\x3d\xdc\x6d\x93\xa2\x8d\xfe\x75\x7b\x54\xc9\xf6\x1f\x6a\x65\xcd\xb2\xe1\xba\x7d\x83\x22\xa3\xf8\x98\xdb\x53\x96\xdc\x14\x18\x18\x05\x98\x1c\xd1\x3f\x1d\xed\xf5\xb8\xa7\x53\x05\xa7\x03\x7f\x8a\x2b\x05\x1b\xa7\xc9\x96\xd1\xc0\xcf\x06\x23\x54\x31\xd3\x47\x03\x0a\xa3\x24\xbe\x02\xba\x85\x8c\x2b\x95\x17\xfb\xfe\x78\x18\x27\x13\x1c\xb0\x69\x08\xfc\xcc\x37\x53\xd0\x2d\xce\xc0\xe5\x49\xbd\x3b\xff\x66\x73\xb5\x08\x99\x7c\xd7\xcc\x1b\x28\x8c\xb2\xee\x9c\x0c\xcb\x33\x6e\x56\xc7\x65\x0c\xa0\x6c\x0d\xb3\x88\x51\x0f\xb5\x10\x50\xe8\x8a\xc3\xa9\x96\x0e\x40\x23\x52\xf0\x42\x2e\x4c\x1c\xb0\x6c\x66\x92\x17\xba\x33\x13\xaf\x64\x27\x7b\x23\xa5\x44\x9b\xcc\xd2\x0c\xf5\x31\x0a\xc9\x88\x4e\x70\x94\xd1\x3c\x6b\x3e\x5c\xaf\x27\x38\x13\x1e\x0b\xa5\x72\xfb\x6a\x79\x3a\x55\xe5\x3e\xcd\x71\x48\x5d\xab\xf2\x04\xf1\x9f\xf1\x34\x43\xb3\x68\xca\x93\x06\xaa\xd9\x41\x25\x9b\x96\x9a\x85\xfb\xbe\x65\xe3\x00\x99\x06\x37\xc5\x28\x08\x2f\x31\xd7\xe7\x92\x66\x70\x90\xdd\x95\x59\xf3\x68\x23\xfd\x82\x25\xd1\x66\x49\x4c\xb3\x18\x85\x59\xca\xbd\x62\x10\xa1\xe0\xfb\xde\x31\xf5\xad\xc8\xd3\x84\xb8\xee\x4b\xa6\x52\x59\x77\x99\x79\x1f\x02\x2b\x65\x9b\xcd\x00\x64\xe0\x64\x9e\x8a\xda\xce\xaa\x33\x25\x5a\x3e\xda\xf2\x33\x9f\x0b\xeb\xb5\xb2\x92\xe6\x66\x10\xa4\xd0\x06\xcf\x0b\xee\x18\x69\x46\x0b\xe5\x37\x45\x11\x64\xc1\xc8\x3c\xce\x8c\x5d\x10\x5d\xf3\xcc\x09\x80\xf2\x4b\xea\x53\xe2\x4b\x16\x94\xd4\x9e\x18\x38\xde\xe3\x4c\xe6\x39\x45\xa7\xf2\xc2\xe4\xf7\xa5\xea\xcd\xdf\x1b\x59\xc9\x32\xc9\xcc\x4d\xf7\xfa\x3c\x1d\x9d\x1c\x50\x54\x1a\x20\x16\x4c\x54\x05\x25\xfb\x38\x03\x19\xcd\x89\x13\xc9\x68\x4d\x62\xca\x80\xe1\xfc\x48\x69\x9b\xd0\x35\x17\xf9\x72\x53\x22\x1b\x30\x83\x68\x97\x36\xd4\x24\xe9\x65\x29\x98\xe7\x3a\x4d\x91\x7f\xe9\x87\x63\x88\xd8\x45\xf9\x02\x30\x3b\x37\xd5\x9c\x48\xce\x2a\x61\x74\x19\x7f\xc6\xa9\x9e\x64\xb8\xc2\x92\x03\x7b\xe8\x6a\x14\x0e\x46\x56\x56\xdd\xbf\x29\x60\xd5\x66\xab\x7c\xa1\xf4\xe3\x78\x8c\xfd\xe8\x16\x05\xf1\xce\x78\x96\x8e\xd0\xaf\x23\x9c\xd1\x78\x26\x3c\x17\x2d\xb8\x6b\x4d\xfd\x04\x18\x05\x7b\x95\x73\x6d\xc1\xae\xef\x10\x0e\x44\x70\x7a\x18\xf1\xfb\x6f\xf3\x02\xe0\x16\x25\x24\xd7\x9a\xe1\xa9\x72\x5d\x71\x39\x16\x04\x63\xcf\x14\xac\xc6\x5a\xa5\x45\x95\xc5\x47\x07\x7c\x41\x9d\x09\x5b\x22\x39\x71\x5b\xb4\x25\xe4\x35\x37\x4e\x83\x91\x75\xa9\x55\xc8\x47\xc9\xd0\xcc\x45\xf7\xbc\x78\x2e\x2b\x6c\x68\x29\x99\x8b\x0a\x73\xe8\x79\x6d\x7b\x44\xbf\x5e\x3c\x8b\x32\x4e\x5f\x16\x66\x42\x80\x46\x34\x91\xf0\x11\xc4\x2d\xde\x50\xf1\x5f\xd5\x9a\x7c\x6d\xf2\x22\xd7\x90\x33\x0c\x8e\xe2\x59\x14\xa0\xd9\x94\x3a\x14\x0e\xc6\xb3\x00\x6b\x74\x6f\x56\xd3\x30\xca\x8d\x5c\xe4\x0f\xe5\x63\xdb\x0a\x2c\x82\xf8\x2a\x92\xf1\x88\xa3\xf1\x0d\x1a\xce\xc4\xa2\xb4\x44\xd2\x5f\x5d\x45\x63\x9c\x52\xa7\x4a\xbb\xac\x05\x7c\x23\xc1\x13\x3f\x8c\x54\xe1\xaa\x5c\xbf\x26\xfe\x75\x45\xe9\x17\x5c\x9c\xa2\x65\x5b\x66\x76\x6f\xfe\x95\xaa\x98\x73\xaa\x79\x70\x4d\x39\x50\x32\xc7\x43\x69\xfd\x25\x92\x08\xd0\x45\x4f\x40\x1b\x4e\x72\x22\x5f\xd5\x3e\x86\x51\x45\x6e\xf2\x25\x6a\x79\x0a\x9d\xd9\xcc\x27\x79\x06\x6f\x1b\x91\x10\xba\x93\x00\x16\xbb\x6d\x51\x3e\x4f\xd5\x2c\xec\xf7\x1b\x79\x04\xc4\xdb\x25\x69\x3d\x39\x8d\x26\x08\x66\x38\x21\xa7\x49\xb1\x31\x2c\xe7\x07\x04\x70\x86\xb4\x57\x64\xdc\x45\xdd\x83\x04\x57\xb1\xe5\xaa\x77\xcd\x31\x52\x52\x60\xe5\x0c\x1f\xa6\xdc\x2c\xaa\x70\x5f\x99\x85\xe9\xc9\xb0\xe4\x11\xb5\xa0\xa1\x70\x32\xb4\xbc\x21\xcf\xf4\x7c\xaa\xe4\xb1\x45\x8b\xb0\x75\x2b\x9c\x54\xfc\x3d\xb9\xe9\xfb\x1a\xbb\x95\xce\x42\x59\xe8\xe4\x75\x4f\x2b\x37\xc7\x6e\xf8\x17\x99\xbc\x9d\x1b\x1b\x62\x8e\x89\x75\xc6\x0a\x2d\xde\x54\x1e\x26\x4e\x9a\x8e\x4c\xf4\xfc\x0c\x3e\xf2\x53\xc8\x90\xeb\x3c\x71\xcf\x4d\x45\x9e\xb3\x6b\xd9\x07\x8a\x4e\x3a\x83\x4e\xc3\xae\xe1\x14\xc5\x91\x74\x14\xae\x77\x50\xa5\x5d\x6f\x80\x25\x6b\xd5\x72\x2c\xde\xa5\x95\xf9\x31\x58\x3c\xda\xcf\xc3\x0f\x12\xf5\xb5\x28\x03\x59\x61\xc0\xd4\x22\x57\x33\x3a\x08\x0b\xe4\x24\xbf\x6b\x74\x3b\xd2\x10\xa2\x21\x92\xe7\x05\xb9\x2b\x6d\x43\x22\xe6\x40\x09\xdd\x76\xbc\xbb\xd9\x68\x77\xec\x4e\x62\x45\xa9\xae\xef\x1c\x61\x8d\xc7\x56\x2b\x1f\x66\xed\x18\x8b\xf0\x1e\x6e\x0d\x81\xa9\x86\x98\x63\x89\x9d\x6b\x52\xf8\xc2\x79\x78\x95\x09\xa3\x97\x87\x50\x91\x00\xc2\xb2\x8a\x47\x2d\xe1\x58\x49\x00\x5a\x61\x5e\xa6\xd4\xa0\xef\xcd\x6c\x38\x2c\x1b\x33\xdf\x90\x8f\x16\x1b\xeb\x4f\xd3\x00\x58\x86\x3c\xd8\x34\x2d\x7f\xf9\x8c\x7d\xce\x08\xc2\x14\xb8\x1e\x47\xb8\xb4\x0b\x11\x65\x45\xcc\x7f\x68\xee\xf2\x5e\x60\xce\x67\x80\x57\xe5\x05\x43\xca\xa6\x4b\x51\x4b\xce\x57\x9d\xd0\x82\x32\xa1\x28\x63\xe0\x58\x8f\x0e\x8d\x04\x53\xd8\xa8\x10\x2c\xe4\xc1\xc6\x97\x08\xe9\x04\x5f\x1b\x28\xe9\x1c\x6b\x8a\xbf\x0f\xe6\x3b\xb1\xc3\x92\xdc\xa4\x02\x17\x27\x83\x44\x1f\x63\x40\xd9\xcf\x68\xbe\x78\x56\x33\x8f\x19\x8a\xc2\x14\xe1\xe1\x10\x0f\xb2\xf0\x12\x8f\x6f\x90\x8f\x02\x9c\x66\xc9\x0c\x9e\x3d\x90\xd3\x97\xe3\x68\x80\x4b\x45\x19\x2d\x49\xa1\x4a\xa2\x07\x40\x29\x0f\xc8\x0d\x25\x16\xd7\x5c\x90\x41\x78\xa0\x9d\x01\x6d\x70\x72\x14\xc9\x84\x1c\x6a\x09\x47\xe9\x22\x42\x2f\xa8\x36\x9f\xea\x79\xd1\x85\xe8\x7e\xc7\x32\xbe\xe6\x81\xa8\x18\x0c\x9a\xb7\x56\xe6\x09\xf0\x0b\x70\x56\x69\x84\x38\x93\xdd\x91\xe6\xc1\xba\x78\x48\x79\xd7\xe2\x91\x92\xdf\xb5\xeb\x8d\xd5\x66\xa3\x9c\x98\x9f\x32\x8d\x8f\x12\xff\xde\x67\x93\xf6\x42\x04\x4e\x0a\xa3\x0c\x27\x43\xc9\x5a\x18\x39\x57\x05\xe7\xaf\xac\xeb\x9c\x6a\xe9\x76\xcb\xe2\x23\xfa\x68\x84\xc7\x53\x9c\x10\xf1\xa7\xc4\x22\xd8\x61\xb8\x31\xdf\x60\x1d\xe5\x6f\x70\x8f\x47\x65\x26\xdd\xa9\x82\x76\x75\xe5\x9c\xf6\x6a\x17\xba\x54\xb1\x09\x5b\x6e\xfd\x9c\x5c\x55\x31\x1e\x04\xd0\xae\xfb\x3d\x63\x5d\xd8\x03\xe0\x22\xf5\xbc\xc8\x56\x22\x1c\x16\xd5\x2c\x62\x79\x86\x4b\x95\xc2\x17\x3f\x36\x5a\xe9\x89\xb0\xe4\xdd\xfd\xcd\xde\xc3\xd3\x13\x11\xa1\x79\x50\x0a\xd2\x02\xa3\xab\xbf\x05\x4d\xed\x4e\xfc\x41\x29\xba\x9a\xf8\x83\xfb\xd0\x96\xa8\x7e\x2f\xfa\xfa\x8c\xed\x2a\x24\x89\xbe\x7a\xe7\x80\x16\x99\x07\x4a\x64\xb4\x11\x5a\x77\x31\x62\x2b\x3c\xfe\x0a\x4d\xd2\x1c\x1f\x06\x82\x0d\x38\x31\xb0\x1f\xb9\x17\x03\xcf\xd4\x02\x21\x7d\xf7\xfd\x6c\x44\xc3\xfa\x3e\xe3\xef\xd9\x30\xbf\xce\x23\xfd\xde\x9e\x79\xed\xd6\xf7\x1a\xde\x97\x21\x53\xe1\xe1\x88\xab\x0f\x1e\xef\x97\x43\x5e\x34\xee\xaf\xc0\x50\x8e\xff\xeb\x0a\xfa\x2b\xbe\x43\xf0\x5f\x5b\x00\x5d\xf3\x8a\x82\x47\x8d\xcd\xa7\x4c\x22\x00\x29\x1a\xac\xf4\xbe\x20\x3c\x8d\x52\x5b\x72\x81\x71\x85\x91\xed\xb4\xca\x99\x68\xb1\xb2\xdc\x48\x4b\x3c\xde\xcd\x4c\x8b\x55\xff\xeb\xec\xb4\xca\x22\xf0\x50\x9c\xb2\x0f\xed\xd9\x4d\xb5\x28\x2e\xff\x00\x5b\x62\xa3\xfc\xc4\x9f\x0a\xe1\x70\xe2\x4f\x17\x8f\xbd\x60\x71\x11\x37\x41\xb8\xac\x32\xe9\x98\xdf\xd5\x60\x19\x2d\x6d\xa0\xa6\xdb\x66\xf9\x26\xc3\x75\x8b\xd1\x32\xfd\x73\x99\x2e\xd3\x3f\xa7\x01\x33\x07\xdc\xc8\x01\x57\x42\xb4\x84\xea\x55\x8b\x4d\x34\xff\x52\xc6\x32\x9a\x03\x6e\x6a\x80\x1b\x4e\xc0\x0d\x2b\x60\x3b\xe4\x2c\x09\xa7\x63\xb8\x7a\xa9\xd0\x61\x79\xf3\x06\xfc\x26\xbe\xd2\xe7\x06\x79\x5e\x27\x8f\x80\x82\x0d\x8a\x98\x8a\x3f\xe8\x54\x54\xfe\x40\x6f\x48\xeb\x3f\xfd\x84\x00\x9b\x3f\xd0\x4b\x54\x5b\x59\x6b\x4b\x33\x54\x7d\x8d\xfe\x28\x08\x77\x21\xcd\x3d\xb5\x05\x9f\xf8\x53\xb0\x99\xdd\xcc\x2a\x15\x8e\x30\x74\xba\x83\x5e\xa2\x4a\x13\x2d\xa3\x3f\xaa\xac\xa7\xcd\xa1\xd5\xdb\xc9\x88\xcf\x60\x2a\x2e\x82\x80\xa7\xfb\x36\xa9\x91\x7d\x20\x28\xa1\x0d\x24\xa1\xd3\x31\x9c\x49\x20\xb6\x5e\x5e\xdc\x6e\x1c\x3c\x0a\xc7\x18\x55\xe4\x7e\xb2\x70\x01\xae\x58\x23\xd6\x61\x91\x9b\x59\xbc\xcf\x8c\xb3\xca\x50\xef\x61\x27\xaf\xf0\xe4\xbb\xdb\x59\x0a\x56\xbb\x10\xa3\xff\xae\x4d\x2d\xd9\x0e\x41\xed\x7a\xe4\xad\xa4\xbc\xb9\xa5\xa8\xb5\xe0\xe6\x20\xea\x09\x43\x79\xf1\x46\x18\xca\xcf\xe7\xfb\x46\x89\x04\x5f\xe2\x24\xc5\xfb\x52\xc1\xfc\x95\x2d\xae\xd9\x0f\xf9\x67\x27\x75\x17\x02\xb5\x6d\x01\xfc\x4f\xe7\x3f\x84\xfd\x90\x15\xca\x3a\x58\xc8\x69\xd4\x86\x4f\xf9\xc2\x66\xb6\xf9\x7f\x54\xcf\xd0\x06\xfa\xa3\x5c\xac\x4e\x0b\x4b\xd9\xbb\x88\xe2\x04\x7f\x33\xae\x22\x81\xdc\x8b\x02\xf0\x73\xce\xa7\x3b\x24\x6f\x0e\x86\xf3\x78\x86\xd4\x0e\x85\xf1\xc3\xc6\x06\x5a\xae\xcf\xe1\x49\x32\x85\xc9\xb5\xef\xc4\x88\xad\x22\x41\x22\xd2\x5e\xa6\xf8\x43\x1c\x4f\xf3\x25\xe1\xe9\x38\x78\xd2\x8c\x2a\x22\x87\x76\xe3\xe9\x4f\xbb\xe8\xc5\xe6\xdb\xde\xd6\xf6\xce\xbb\xdd\xbd\xff\x7a\xff\x61\xff\xe3\xc1\xe1\xff\x3e\x3a\x3e\xf9\xf4\xcb\xaf\xbf\xfd\xfb\xff\xf8\xfd\x41\x80\x87\x17\xa3\xf0\x8f\xcf\xe3\x49\x14\x4f\xff\x3b\x49\xb3\xd9\xe5\xd5\xf5\xcd\x97\x5a\xbd\xd1\x6c\xb5\x3b\x6b\xeb\xaf\x96\x56\x37\x58\x84\x5b\x71\xb4\x13\x8b\x76\x61\x54\xf3\x21\x76\x78\xa5\xe4\x96\x1b\x8a\x85\xa9\x4d\x14\xd2\xda\xb1\xb9\xa9\x90\x99\x0e\x1d\xfb\x0d\x73\xec\x4a\x89\x90\x24\x2d\x8f\x9c\x9a\x64\x07\x16\xb4\x8c\xea\xd5\x33\xf0\x5e\xc9\x05\xa6\x86\x49\x5c\x1c\x68\xa3\x0c\xd0\xea\x19\xdf\xe0\x65\x31\xcc\x02\x95\x0a\x44\x91\x12\xb9\xe7\x2b\x11\x66\x00\xfd\xaf\xb4\x45\xd9\xb7\x26\x2a\x0e\xde\x83\xd8\x10\x2f\x2d\x29\x1f\x04\xd9\x8a\x1f\x8c\x22\x8d\xd8\x92\xd6\xb0\x08\xb7\x79\xee\x1e\xfd\x90\x2f\xed\x11\xaf\x9d\x99\x7d\xda\x4f\x47\xff\xa7\xa3\xbf\x38\xfa\x7f\x3a\xd9\x59\xae\x77\xd0\xdb\xed\xd2\x0e\x5a\xf5\xce\xdb\x6d\xd9\x47\xab\xde\x51\x9f\xe0\xeb\xdd\x9d\xb6\x28\x32\x7f\xad\xe3\x56\x49\x1c\x1e\xd0\x79\xab\xde\x71\x7a\x6f\xd5\x3b\xff\x00\x8d\x40\xf9\xc3\x3a\x0c\xc6\x7d\xce\xea\x76\x7f\x7f\xb0\x8c\x8a\x03\x7c\x18\x87\x51\xe6\x72\x32\xae\x77\x1c\x4e\xc6\xd6\xc3\x74\x8e\xa9\xdb\xcb\x58\x34\x59\xd6\xd5\x58\x02\x7a\x8f\x13\x94\x4e\xc4\xf7\x72\x56\x03\xda\x5c\x74\x6d\x7c\xd7\xc7\x28\xba\xaa\x84\xcb\x1a\x5f\x7c\x0b\xf9\xac\x41\xa5\xc5\x7c\x8d\x79\x2d\x21\xdf\xf2\x17\x8f\xed\x69\xac\x36\x5c\xce\xd1\xb8\x0e\xb2\x8f\xc0\x50\x75\x33\x26\x22\x50\xbe\x58\x1a\x64\xb1\x68\x41\xd8\xdc\x14\xee\x92\x72\xb4\xd1\x79\x59\x3e\x14\x06\x23\xcb\x0f\x25\xf6\x30\x69\x9f\xfa\x70\xef\x7d\xea\xc3\x77\xb0\x4f\x95\xc1\xe1\xa1\xf7\x29\xeb\x72\xfa\xb0\xfd\xb4\x4d\x89\xbf\x07\xdb\xa6\xd2\x2b\x7f\xba\x1d\x05\xa1\x1f\x55\x16\xdd\xb1\x6c\x47\xf2\xef\x7f\xcb\xfa\xf0\x38\x5b\x56\x99\x65\xf2\xfd\x6f\x59\x1f\xb6\xb5\x4d\xeb\x69\xc7\x32\x76\x2c\x69\xc5\x2c\xb4\x79\x7d\xd3\xdd\x4b\xcc\x8b\x84\x2d\x01\xa4\xf4\x91\x47\xc3\x87\x2f\xec\xee\x84\x2e\xee\x5a\x8d\xfc\x3f\x5c\xac\xd0\x8f\xa4\xfb\xec\x2b\xfd\x96\x2f\xff\x79\xea\x02\x20\x2c\xb7\xb6\xa0\x73\x2f\x6d\x01\xcb\x51\xfb\x2d\x95\x06\x1e\x92\x5e\xa5\x23\xbf\xae\xbd\x1a\x4d\xfc\xc1\x23\xaa\x16\x3c\xc4\x9b\x85\x5f\xd0\xda\x3f\x41\xdd\x60\xe4\x8b\xbd\x83\x2a\x42\x31\x62\x91\xbe\xec\x6f\xb5\xa1\x26\x98\xdc\xec\x6f\xb5\x6d\x32\x1e\x98\x38\x7f\xc6\x37\x34\x0b\x36\xb5\x83\x15\x7d\x05\xe7\x5f\x3f\xca\x78\x12\xef\x38\x99\x50\x1b\xed\xed\x5f\x0e\xcf\x61\xd3\x3d\x89\xdf\xe3\x5c\x18\x44\x57\x57\x57\x2b\xf1\x14\x47\x69\x3a\x5e\x89\x93\x8b\xd5\x20\x1e\xa4\xab\x90\x84\x3b\x5e\xd5\xea\x8c\xb2\xc9\xd8\xa2\x08\xd9\xbe\x9c\xbe\xdf\xda\xc9\xd1\x16\xcf\x25\x83\x21\xcc\xf7\x01\xd1\xf6\x38\xc3\xfb\x85\xa5\x3c\x87\x3d\x8a\x0c\x4c\x4a\x1e\xc2\x88\xbb\xbd\x48\xe1\x9e\x73\x57\x97\x16\xaa\xd4\x1b\xeb\x8a\xa7\x8b\x01\xdf\x61\xa4\x26\x87\xc5\xd0\x13\xa4\xec\x6f\xb5\xe7\x61\x1b\x66\xcc\x16\x59\x0f\x52\x2d\x7d\xc8\x62\x34\xa5\x56\xa7\xb2\x77\x8e\x63\x87\x33\xfc\x62\xb4\xdd\x81\x0d\x4f\x17\xd5\x1b\xeb\x60\x42\xaa\x7c\xa5\x9d\x03\xcc\xb5\x2f\x39\x3e\x4a\xdb\xb7\x77\x76\xbb\x71\x10\xed\x63\xfb\xe1\x60\xa9\xd1\x07\x30\xb3\xfe\x1c\x0c\x0d\xef\x1b\x4a\xf3\x73\x52\x34\xcd\xaf\xf8\x67\x3e\x57\xeb\x5a\x3e\xbf\xbb\x82\xf1\xd4\x69\xac\xd5\x6a\x3a\xe0\x05\xbd\x83\xe6\xfa\xfd\x94\x93\x77\xb7\x20\x85\x3f\xa1\x11\x42\x15\x90\x08\xdb\x87\x0c\xac\x64\xd1\xde\xc5\x4a\x9f\xd7\xa5\xb1\x00\x6c\x80\x0a\x2a\xa7\xfe\x38\x43\x9b\xf0\x9f\xc5\xc5\x62\xa0\x2e\x4a\xde\x0f\x41\x5e\x98\x6c\x1e\x9f\x83\xe1\x0a\x75\x8b\xc0\x15\xde\x19\x0f\xf0\x2b\xc8\x5b\x03\xc5\x95\xfc\x8e\x6a\xcd\x85\x04\x5e\x75\x8a\x2d\xe2\x2d\x59\xe9\x8c\x7b\x98\xb5\x85\x97\x1a\x21\x0f\x66\xa2\x9c\xaf\x0e\x2b\x2c\x97\x5b\x18\x84\x16\xa0\x43\xfc\x1e\xc6\xc6\x96\x12\x6d\x91\x33\x72\x0e\x4c\xf8\x04\x8b\x37\xce\xe3\x32\xdf\x63\x68\x8f\xd8\x93\xa5\x9c\xc4\xc4\x69\xd1\xfc\x85\x05\xcb\x77\x6c\x63\x22\xe0\xd5\x8f\xcc\x98\x45\xc3\x95\x1b\xb4\xbc\xe1\xf8\x58\x8f\x02\x44\x8c\x03\xcf\x01\xe7\x05\xb3\xea\xb2\x44\xcb\xce\xbf\x56\x46\x72\x30\x86\xdc\x09\x84\x41\xe1\xc4\x26\x19\x05\x1b\xf4\xaa\x36\x2f\xfc\xe9\xcc\x12\x84\x26\xc4\xc0\x99\x9f\x95\x83\x52\x9d\x1e\x94\xa4\x81\x2e\x4c\xfb\xa3\x61\x2f\x90\x75\x8e\x82\x0d\x63\xcb\x50\x99\xef\x24\xb2\x62\x31\x63\xac\x6d\x68\xa3\x2c\xd5\x92\x74\x34\x9c\xfe\x2c\xd1\x2e\x44\x80\x39\x5e\xaf\xac\xcd\x75\x29\x1e\x2c\xfb\x1d\xdf\x89\xf7\x2e\xc8\x77\x1f\xd0\xfb\xd6\xe2\x57\x26\xf5\xa6\x3c\x37\x97\x2a\x29\xda\x0d\xe9\xbd\xca\xdd\xf3\x0f\x48\xe1\xea\x62\xd3\xa6\xfb\xb5\x8b\xb3\x2f\x56\xcd\x43\x0e\xb1\xe1\x3e\x60\x0a\xc5\x06\xa1\x42\xce\x65\x7d\xd7\x9e\x63\xba\xb0\xb0\x61\x57\x25\x16\x70\x5c\x29\xde\xef\x6e\x5f\x17\x1c\xdf\x29\x34\xfb\xd9\xdd\xe3\x87\xcf\x6e\x7b\xdd\xe3\x47\xd2\xee\xda\x1a\x39\xd3\xaf\xfd\xad\xcf\xf4\x83\x70\x3a\xc2\xc9\xf2\x23\x9b\x08\xc0\xe9\x5d\x6e\xea\xaf\x39\xc4\x9b\x99\x3b\x1f\xe4\x34\xdf\x83\x8e\x1d\x12\x8e\x93\x8a\x43\xbb\xfc\xd2\x6d\x42\x20\xde\x6b\x99\x30\x94\x1a\xe4\x0c\xe7\x67\x50\x89\xfe\xe4\x8c\x98\x55\xdc\x81\x97\x19\x8b\xaa\x40\x8b\x2c\x90\x4e\x83\x9c\x6e\xe8\xdc\x64\xf8\x3a\x23\xa7\x48\x9f\x3d\xa3\x29\xed\x13\xf3\xcd\xe2\xa9\x36\xfc\x00\x0f\xc2\x89\x3f\x1e\xdf\xb0\x34\xa0\x41\xe9\x9b\x1b\x79\x54\x6e\x59\x2b\x6c\xe0\x4e\x04\x1a\x6a\xb3\x8b\x27\xe3\xb8\x0b\x7e\x8f\x9a\x9e\x23\x9f\x12\xe9\x56\x47\xee\xfc\x62\x17\x3b\x4a\x4d\x87\xa3\x96\x5c\x66\x25\x9f\xdd\x3c\x81\xc4\x2e\xbe\xbe\x63\x26\x08\xcb\xf0\x4a\xe4\x23\xdf\x37\x2c\x38\x9d\xda\xcd\x43\x18\x4d\x67\xd9\x7d\xe6\x94\x93\x87\x4a\x74\x77\xa0\xb3\x87\x22\x8e\x81\xc6\x28\x2c\xf4\x71\xe7\xa4\x12\x30\x5a\xf6\x10\x36\xf9\xe4\x6c\xa0\xbc\x0d\x5a\xe1\xb5\x95\x7a\x7a\x0a\xf5\x70\x8d\x40\x0e\xa8\x2b\x03\xbd\xb5\xeb\xe6\xdd\x3b\x6d\xde\x5d\x6d\xb7\x95\x36\x88\x6e\xbb\xe1\x69\xca\xf3\xf5\x27\x53\xbb\x7f\xba\xee\xdb\xb5\x3b\x1a\x91\xcc\x8b\x34\xe1\xe6\x21\x05\x1c\x80\x85\xc6\xd5\x9a\x88\x8a\x94\xd8\x90\x1d\x55\x1f\x26\x21\x3d\xb8\xbc\xce\xe5\x78\xa5\x95\xc4\x25\x55\x51\x44\x56\x07\xe7\x65\x3c\x48\x70\xf6\x40\x4a\x25\x22\xff\xee\xda\x03\x07\x41\x2f\x19\x9b\xb0\x79\x22\x53\x47\xdf\xb2\x1a\x43\xd9\x39\xd8\x11\x20\xd8\xaa\x33\x12\xfa\x22\xea\xa3\x20\x1e\x75\x0f\xf7\x02\x6f\xb7\x87\x8c\x2f\x0b\x07\xa6\x39\xe1\x65\xe9\xa1\x4a\x8a\x2e\xab\x8f\x93\xdd\x10\xbf\x40\x31\x45\x3b\xfa\x56\x8a\x8b\xc9\xba\x5e\x14\x19\x53\xab\xc4\xf5\x05\x3a\x2c\x7b\x94\xcc\xcd\xf1\x38\xbe\x42\x7e\xd2\x0f\xb3\xc4\x4f\x6e\x10\x53\x2f\x7d\xc6\x37\x96\xb8\x83\x9f\x65\x8d\xc4\xcf\xd6\x86\x0b\x06\x4a\x57\xb7\x94\x1b\xad\x39\xce\x90\x04\xa5\x02\x37\x48\x88\xff\x06\xba\x8d\x38\x41\x61\x14\xe1\x04\xa2\xcf\xc6\xb3\x0c\x04\x08\x3d\x0a\x1f\xc4\x4c\xa4\x3a\x46\x4a\x86\xec\x81\xb6\x62\x04\xa4\xe3\x1a\x3f\xb9\x46\x68\xa9\xb1\x08\x09\xc4\x92\x56\x32\x2e\xd2\x47\x86\x52\xc1\x50\x2a\x68\x34\xf6\xdb\xc1\x11\xcc\x27\xbd\x06\x9c\xfa\x01\x1a\xc4\x51\x9a\xf9\x91\xde\xbc\x35\x89\x94\x3a\xc7\x6e\xc5\x9a\xc0\xfb\x34\x3c\x43\xbf\x6f\xa0\xda\x75\x7b\x40\xff\x67\x73\x87\x31\x0a\x37\x3b\xf4\x7f\xc5\x9a\xb1\x58\xd3\x89\x85\xda\xb3\x8d\x22\xff\x82\x38\x64\xb0\x03\x3d\x46\x14\x32\xc1\xc4\x1f\x24\x12\x59\x41\xbe\x32\x1b\x33\xb6\x0c\x24\x74\xda\xc6\xc7\x1d\x7a\x52\x55\x5f\x9c\x2f\x98\xbb\x45\x20\x83\x61\xfe\x6e\xe2\x8f\xed\x6f\xf6\x58\xf4\x31\xc0\x2b\x84\x25\x56\x18\x09\x65\xc1\x29\x2f\x13\x88\xcc\x28\xfd\xf0\xc1\xc8\x64\x92\xe0\xad\xcc\x0d\x3e\xf6\x58\xd1\xc3\x60\xa8\xff\xa7\x47\x0f\x9b\x23\xa6\x2e\x22\x22\x12\x1e\x9a\xd3\xd0\xdc\x08\x62\xee\x1a\x73\xa3\x88\xb9\xab\x3e\x52\x24\xb1\xfb\x73\xbb\x1e\x55\x4f\xc3\x78\x5b\xf6\x63\x22\x5d\xec\xda\x83\xa3\x15\x06\x1c\x2b\xe4\x98\xf2\x58\x69\x40\x73\x09\x85\x4b\x1a\xfc\x92\x49\xa0\x52\x75\x86\x1c\x9b\xf8\x03\xfb\x25\x91\x38\xf8\x3b\x8c\xe0\x5e\xfd\xad\x15\xe6\xd7\x9d\xd6\xb2\xe5\xf5\x38\xec\x2f\x13\x54\x02\xb0\x6d\x4d\xb5\xaf\x38\x1a\x2c\x83\x4d\xa3\xe5\x3d\x75\xb3\xd4\x3e\x4c\x82\xf6\x7c\xe3\xbb\x74\xe4\x37\xda\x3a\x48\xf2\xb2\xa1\x83\x4b\x47\x7e\xbb\xde\x30\x5f\x36\xd7\x2d\x25\x9b\xda\xab\x24\x9c\xe2\x49\x50\xef\xd4\xac\xb6\x7f\xca\xab\x69\xff\x73\x30\xd4\xdb\xc1\x97\xd3\xcf\xc1\xb0\xe8\xde\x41\xed\x7a\x1c\xe0\xe5\xc1\xb0\x6f\x7d\x9d\x25\x8e\xd7\xcb\x17\x63\x3f\x98\xf8\x91\xed\x73\x6c\x07\x86\x07\xfa\xeb\xa9\x1f\x2c\xfb\x51\x1a\x5e\xbf\x6a\xe8\x83\x40\x3e\x85\x69\x5c\xaf\xd5\x1b\xfa\x88\xb3\x4f\xaf\xd6\x5e\xad\xe9\x33\x44\x3e\x7d\xc1\x49\xcc\x5c\xaf\x2d\x5f\x23\xc7\x37\xaa\x23\x5b\x1e\xe1\x6b\xed\x83\x8f\x75\xe2\xa2\x71\x37\x02\xe3\x7d\x32\xd0\x27\x37\xf1\xfb\xfd\x30\xb3\xbe\x5c\x1e\xe3\x0b\x7f\x70\xf3\xd8\x77\x40\x62\xf5\xc0\x93\xbe\x68\xe0\x65\xbe\x56\xc4\x23\x5b\x22\xf0\x4c\x56\x86\x66\x16\xca\xd6\x81\xf8\xdd\x68\x89\xdf\x84\xea\xf9\x6f\x42\xec\xe2\x37\xfd\x95\x93\x76\x6e\x5f\x0a\xbf\x18\x21\x53\x0c\x28\xfd\x1a\x77\x58\x14\x1d\x4e\xad\xd2\x53\x96\xa8\x4f\x82\x36\xf3\xb7\xb1\x52\x83\x50\x22\x6d\x56\x26\x40\xf1\x46\xd0\x9d\xfc\x86\x92\x9b\x78\x23\x53\x99\x78\x19\xa9\xaf\x24\x9a\x82\x67\x42\x4a\xf0\x23\xa7\x20\x3a\x2a\x03\x36\x50\x8c\x5e\xa4\xdf\x9c\x4c\x16\x55\x44\x2a\x0a\x48\x99\xd7\x2e\xae\x98\x74\x87\x62\x63\x5d\xea\xb6\xeb\x5e\xb1\x36\xd9\x53\xe9\xaa\xdb\x6e\x79\x0a\xe1\x75\xdb\x6d\x2f\x9f\xf8\x6e\xbb\xe3\xa9\xa3\xd7\x6d\xaf\xe9\x37\xc2\x3a\x29\x77\x3b\x35\x8f\x51\x6b\xb7\x03\xf8\x08\x4a\xe9\x76\x1a\x9e\x4c\x2b\xdd\x4e\xcb\xb3\x51\x4b\xb7\xd3\xf4\x64\x0a\xe9\x76\xda\x9e\x4c\x3f\xdd\x0e\xe0\xa5\xd0\x4c\xb7\xb3\xe6\xe9\x54\xd3\xed\xac\x7b\x3a\xdd\x74\x3b\xaf\x3c\x83\x48\xba\x6b\x35\xcf\x42\x4e\xdd\x35\xc0\x9f\x2d\x89\xee\x1a\x60\xcf\x48\xa3\xbb\xd6\xf2\x0c\xe2\xe8\xae\x01\xe2\x84\x8c\xba\x6b\x80\x73\xbe\xce\xba\x6b\x1d\xf9\x02\xdd\xcb\x97\x6c\x77\x8d\x5f\xad\x93\xc5\xdc\x5d\x7b\xe5\xf1\xa5\xda\x5d\xaf\x79\xf9\x12\xee\xae\xd7\xbd\x7c\x71\x77\xd7\x01\x9d\x9c\x82\xbb\xeb\xd0\xb8\x60\x34\xdd\xf5\xd6\xed\x99\xd7\xa9\x3d\x5d\x1e\xfc\xf5\x97\x07\xbd\x11\x1e\x7c\x26\x9d\x82\x95\x42\xdd\x80\x68\x9a\xb3\x74\x36\x25\x03\x83\x59\x7c\x6a\xa9\xdf\x20\xc7\xd3\x90\xe6\xe8\x87\x0d\xf4\x82\x43\x7e\x61\xb1\x08\x11\x4e\x1a\x0f\x78\x5d\x51\x68\x8e\x2f\xda\x39\xc2\x43\x9c\x60\x38\xe8\x25\xe1\x05\x9c\xc9\xc2\x28\xcc\x72\x30\xe9\x6c\x8a\x13\x50\x5d\x6f\x68\xe9\x39\x24\x28\x9b\xb3\x8b\x09\x8e\x32\xad\x00\xca\x62\x34\xf2\xa3\x60\x8c\x95\x71\x93\x61\xf7\xad\x90\x15\x9b\x1a\xa8\x6a\xba\x03\x4a\xba\x6f\x1a\x4b\x9e\x9a\x40\x85\x51\xb6\x2e\x69\xe8\x87\x72\x7d\xa1\x98\x50\x67\xc7\x3c\xe6\xe7\x35\xa8\x12\xfe\x13\x81\x0a\x2f\x64\x6c\x94\x43\x84\x15\xb1\x98\xa6\xff\x02\x48\x97\x21\xbe\x72\xa1\xe8\x6c\x5e\x42\x78\x8f\xa3\x80\xbe\x7e\x55\xcb\x73\x82\x03\x2c\x41\x67\xcc\xab\xff\x40\xd6\x9c\xb0\x1d\x81\x45\x67\x07\x6e\x54\xad\x1a\xad\x38\xb1\xaa\x77\xec\x68\xb9\x5b\x5a\xac\xc6\x5e\x94\x35\x1b\x8b\x36\xb1\x58\x8d\x9d\x71\xec\xdf\xa5\x4a\xa7\x05\xef\xf3\xf2\x77\x24\xa5\x15\x4a\xc1\x1e\x92\x5f\xdd\x64\xf8\x00\x92\x03\x19\xaf\x6d\x79\x97\x15\xfa\xdb\xa5\x8b\x2e\x6f\xab\xcc\x8a\xc8\x4b\x2f\xa6\x42\xc8\xa1\xbd\x15\xb8\xa1\x0d\x3b\xce\x16\xcd\xc2\xf6\x35\xcb\xbe\x7a\x93\xd9\x8c\x9f\x17\x72\x17\xb4\xa1\xb2\x48\x3e\xed\xbc\xfe\x69\x78\x76\xa7\xe4\xd9\xb9\x39\x77\xf8\x05\x53\x55\x6d\xee\x38\xaa\x16\x15\x8c\x35\x4f\x6d\xe1\x21\xe6\x46\x68\xeb\x88\x32\xdf\xd6\xac\x67\x64\x34\xc9\x6b\x02\x0f\x45\x44\xea\x93\x99\xb9\xd9\xae\x3f\x9d\x8e\x6f\x58\xc3\x7e\x72\x31\x23\x2c\x3c\x2d\xf2\x57\x64\xfc\x7a\x65\x9a\xc4\x59\x4c\x70\x94\x39\x77\x91\xe1\x84\xbe\xfb\xd8\x15\x2c\x9d\xfa\x93\xac\xf3\xd7\xc8\x3a\x10\x30\xfa\x2f\x88\x4b\x64\xcd\xa9\x54\xc2\x44\x02\xb6\x58\x7a\x8f\x87\xb2\x5c\xb7\x4e\xaa\x9c\x30\x66\x21\x95\xa4\xaa\x4b\xed\xe6\xcf\x26\xe9\xb9\xf8\x4a\xa7\x65\xe7\x22\x27\x84\x4d\x6c\xd0\xe1\x5b\xf1\xfb\x29\xfd\x91\x86\x11\x0b\xc6\x4a\x58\x46\xed\xba\x5e\x63\x7f\x55\xf4\x55\x4d\xe3\xcb\x96\x57\xa5\x6a\xb5\x50\xdf\xdf\x6a\x6b\xd6\x14\x36\x03\x10\xdd\x6b\x12\x6d\xb0\x51\xb5\x18\x80\xf0\xb4\x37\x85\xb7\x63\xb9\x26\xd8\x9e\xab\xf8\xd4\xe4\xa4\xb5\xeb\xce\x5a\xab\xdd\x68\xd6\xea\x1e\xaa\x5d\xe3\xe1\x20\xf0\xfb\xeb\xaf\x2c\x79\x15\x6b\xd7\xaf\xd6\xfb\x7e\x30\x18\x62\x0f\x06\xa6\xd9\x68\xb7\xd6\x3a\x6a\xb9\x33\xe7\x8d\x98\x96\x46\x4f\xee\xc5\xbe\xc8\xa4\x67\xdb\xbb\xae\xfc\x29\xc2\xe0\x5e\x3d\x7f\x0f\xa9\x77\xdc\x3b\x86\xfb\xfa\x9a\xcf\x06\x45\xe2\x9c\xc0\xe3\xe9\x05\x51\xe8\x88\xc0\xbb\x7f\x2e\x95\xde\x3f\xe5\x0f\x67\x36\x97\x10\xe9\x33\x21\x38\xb3\x00\xf9\xab\x54\x2a\x12\x4c\xea\x29\x8e\xbe\x22\xf9\x25\xec\x75\xad\xaa\xe6\x23\x8e\xbe\x96\x04\xd8\x68\x55\x2d\x00\x21\x94\xb1\xe2\x92\x6e\x82\xbb\x9f\x71\xc8\xae\x72\x43\x61\xbf\xee\x57\x86\xb4\x86\xa4\x31\x45\x4b\xa8\xa6\x8b\x0f\x4a\xe9\xba\x56\xba\x5e\x58\xba\xa1\x95\x6e\x14\x96\x6e\x6a\xa5\x9b\x85\xa5\x5b\x5a\xe9\x56\x61\xe9\xb6\x56\xba\x5d\x58\xba\xa3\x95\xee\x14\x96\x5e\xd3\x4a\xaf\x15\x96\x5e\xd7\x4a\xaf\x17\x96\x7e\xa5\x95\x7e\x55\x3c\x3b\x35\x6d\x76\xe6\x4c\x66\x5d\x2b\x5e\x3c\x9b\xf5\x86\x56\xbc\x78\x3a\xeb\x4d\xad\x78\xf1\x7c\xd6\x5b\x5a\xf1\xe2\x09\xad\xb7\xb5\xe2\x6d\x83\x1b\xac\xae\x12\x86\xfc\x39\x8c\x2e\x48\xd5\xd0\x1f\xf7\x6d\x62\xb3\x4f\xb6\x81\x53\xeb\x40\xf5\xe1\x93\x75\x50\x06\xf0\xc9\x3a\x00\x01\x7c\x6a\xda\xd0\xe9\xe5\x77\xd0\xea\x37\x82\xc4\xce\x4e\xc5\xf7\x50\xdf\x43\x03\x0f\x05\x9e\xb4\x40\x3d\x84\xd6\x3c\xb2\x85\xd6\xce\x74\xde\x10\xd0\x7a\x81\x87\x44\xd5\x7c\x84\x3c\x84\xea\x0d\x0f\x9d\x9c\xd6\x8d\x7a\x03\x5a\x8f\xb6\x44\xab\xe6\x8b\x96\xd4\x5b\x23\xf5\x1a\x46\xbd\x3e\xad\x27\x90\xf4\xa5\x7a\x4d\x0f\xa1\x06\xb4\xd7\x34\xea\x15\xf5\xaf\x25\xfa\xd7\x5a\xa8\x7f\x6d\xd1\xbf\xf6\x42\xfd\xeb\x88\xfe\x75\x16\xea\xdf\x9a\xe8\xdf\xda\x42\xfd\x5b\x17\xfd\x5b\x5f\xa8\x7f\xaf\x44\xff\x5e\x2d\xd4\xbf\x7a\xcd\x63\xfd\xab\x9b\x04\x53\xd4\xc1\x7a\xdd\x63\x1d\xac\x9b\x14\x53\xd4\x43\x82\x25\xed\x61\xdd\x24\x99\x42\x12\x6d\x7a\x9c\x44\x4d\x9a\x29\xec\x63\x4b\xf4\xd1\x24\x9a\xc2\x3e\xb6\x45\x1f\x81\x6a\xcc\x4e\xbe\x7b\xe7\xe8\xa4\x87\x50\x9b\x76\xd2\xa4\x9b\x80\x56\xb4\x76\x92\xd0\xdb\x2b\x5a\xd1\x24\x9c\x01\xad\x68\xef\x64\xdd\x43\xa4\xa3\x27\xa7\x75\x93\x72\xfa\xb4\xa2\xb5\x93\x84\x63\x34\x6a\x50\xd1\x24\x9d\xa2\x3e\xb6\x45\x1f\x1b\x76\x5e\xe3\xea\x23\xa1\x39\xda\xc7\x86\x9d\xd9\x38\xfb\xd8\xe6\x7d\x6c\xd8\xb9\x8d\xab\x8f\x2d\xd1\xc7\x86\x9d\xdd\xb8\xfa\xf8\x2a\xef\xa3\x9d\xdf\x38\xfb\xd8\x12\x7d\xb4\x33\x1c\x57\x1f\x09\x63\x64\x7d\xb4\x73\x1c\x57\x1f\xd7\xf3\x3e\xda\x59\x8e\x93\x56\x9b\x1e\xef\xa3\x9d\xe7\xb8\xfa\xd8\x10\xb4\xda\xb0\x33\x1d\x57\x1f\xd7\x44\x1f\x9b\x76\xa6\xe3\xea\x23\x59\xfe\xb4\x8f\xcd\xba\x7d\x41\xee\xee\xba\x89\xb5\x05\xb8\x36\xed\x5c\x67\x77\xd7\xde\x49\x32\xac\x64\x6d\x9d\x9c\x36\xed\x5c\x67\x77\xb7\x60\x41\x76\xa0\xa2\x9d\xeb\xec\xee\x3a\x3a\xd9\xf2\x50\xa3\x09\x15\x4d\xd2\x29\xea\x63\x3d\xef\xa3\x9d\xe9\xb8\xfa\xd8\xca\xfb\x68\x67\x3a\xae\x3e\xc2\x44\xd2\x3e\xda\x99\x8e\xb3\x8f\x35\xd1\x47\x3b\xd3\x71\xf6\xb1\xe9\xb1\x3e\xb6\xec\x4c\xc7\xd5\xc7\x9a\xe8\x63\xcb\xce\x74\x5c\x7d\x6c\x8a\x3e\xb6\xec\x4c\xc7\xd5\x47\xc2\xca\x69\x1f\x5b\x76\xa6\xe3\xea\xe3\x2b\x31\x8f\x2d\x3b\xd3\x71\xf5\x91\x2c\x0f\xd6\x47\x3b\xd3\x71\xd2\x6a\x9b\xd3\x6a\xcb\xce\x74\x5c\x7d\x6c\xe4\x7d\x5c\xb3\x2f\xc8\xbd\x3d\xb7\xa0\xda\xa1\x9d\xb4\x73\x9d\xbd\x3d\x7b\x27\x81\xe6\x80\x07\xb4\xec\x5c\x67\x6f\xaf\x40\x0c\x68\x83\x08\x68\xe7\x3a\x7b\x7b\xf6\x4e\x12\xde\xd1\x80\x61\x6d\xdb\x45\x1d\x57\x1f\xc9\x7c\xd0\x3e\xb6\xed\x4c\xc7\xd5\xc7\xa6\xe8\x63\xdb\xce\x74\x9c\x7d\xac\x89\x3e\xda\x99\x8e\xab\x8f\xf5\xbc\x8f\x76\xa6\xe3\xea\xe3\xba\x98\xc7\xb6\x9d\xe9\xb8\xfa\x08\x34\x47\xfb\x68\x67\x3a\xae\x3e\x82\x48\x4e\xfb\x68\x67\x3a\xce\x3e\x36\x3d\xde\x47\x3b\xd3\x71\xf5\xb1\x25\xfa\xd8\xb1\x33\x1d\x67\x1f\xeb\xbc\x8f\x1d\x3b\xd3\x71\xf5\xb1\x21\xfa\xd8\xb1\x33\x1d\x57\x1f\x5f\x89\x79\xec\x34\xcd\x05\x09\xd7\x28\x19\x4e\x26\x38\x08\xfd\x8c\x39\x95\x81\xbb\x82\x5a\x8e\x1c\x71\xd1\x06\xaa\xc0\x7f\x97\x90\xaf\x6b\x58\x69\x99\x3a\x2b\x53\x27\x65\xfa\xf6\x32\x0d\x56\xa6\x41\xca\x0c\xec\x65\x9a\xac\x4c\x93\x94\x09\x0c\x6d\xae\xa6\xaa\xdc\xb1\x58\xea\x2e\x18\xd0\x16\x32\xa5\x8b\x6c\xba\x7e\xe6\xdb\x0e\xe6\x7e\xe6\x8b\x50\x3e\x7e\xe6\xbb\x95\x63\xd1\xdb\x30\x4b\x4f\xe2\xcc\x1f\x0b\x98\xd1\x96\x9f\xf9\xd4\x83\xe4\x25\x5a\xb7\x40\x87\x3a\x1f\xf0\x30\xe3\xd0\x85\xc7\x09\x94\x37\x3a\xe3\x4c\x79\x25\xd0\x3c\xcd\x41\xfe\xfc\xf3\xcf\xa8\x0d\x17\x6f\xb5\xeb\xf5\x5a\x7e\xdf\x96\x97\xf8\x17\x6a\x36\x0c\xe2\x50\xfb\xb2\x8b\x36\x10\xa8\xdd\x87\xe3\x38\x4e\x2a\x52\x27\x57\x15\xdd\xbb\xab\x73\x50\xf6\x03\xda\x90\x9e\xf4\x85\x23\x50\xaf\x54\x2a\x39\x6e\x4b\xa8\xd3\xa2\xf9\xd2\x5e\x41\x30\xd1\x56\x95\x2a\x6c\xec\xfa\x59\x5e\x95\xe1\x9c\x2b\x67\xe5\xb7\xe5\xb5\xb3\x26\x38\xa6\x9a\xd5\xc1\xcd\xd3\xcd\x1a\x5c\x62\x91\xce\xb6\xca\x74\xf6\x83\xb5\xb3\x1f\xee\xda\xd9\x0f\xd6\xce\x7e\x28\xdb\x59\xb3\xb7\xb2\x13\x55\x45\x74\x9f\x07\x9b\x82\x9c\x7a\x76\xff\x41\x30\x78\xa7\x6e\x0c\xe0\xa3\x68\xf3\xa4\x2a\xcc\x2b\x3f\xc7\x1b\x52\xd1\x79\x5b\xc8\x77\x97\x19\xc6\x3b\xbd\xdf\x16\xba\xf7\x70\x5c\x71\xa1\xa2\xeb\x7f\x81\x09\x5c\x61\xec\x9e\xda\xef\x2e\x76\xd9\x2d\x59\xa5\xb2\xab\x5c\x4b\xec\x2e\x7c\x1f\x41\x69\x61\x57\xb9\x8b\xd8\x75\x5e\x42\xcc\xbf\x71\x38\x62\xb9\x81\x61\x0e\x59\x04\x9e\x00\xc6\x54\x2d\x5a\x22\x59\x39\xb8\x21\x14\xb2\x7a\x50\xb0\x82\x53\xa6\xb8\xa1\x83\xc7\xfc\xfa\xdf\xd8\x78\xe1\xf3\xb9\x41\x0b\x2e\xef\x4a\x1e\x41\x83\x7c\xb5\x7b\x38\xd0\x5f\x02\x49\x4d\xf5\x75\xed\xa1\xd4\x43\xea\x15\x1a\xf0\x49\xb4\x81\x7c\xb4\x84\x2a\x95\x3e\xfa\x89\x6e\x8e\x95\xff\x4b\x7e\x06\x55\xc2\x06\xae\xd1\x12\xca\xa4\xf6\x44\xc0\xe2\x88\x4c\x53\x4a\x57\x2a\x8d\x53\xde\x6c\xa0\x65\x94\x56\xa1\x5a\x5f\x33\x7a\x13\x58\x69\xe7\xff\x72\x58\xc1\x76\x5c\x19\xa0\x9f\xd0\xff\x7d\x1c\xac\xb4\x43\xd0\x5c\xac\xfa\xe8\x77\x34\x40\xbf\x13\xc4\x1e\x1e\x19\x4d\x00\x9c\x8b\x0c\x41\xa4\xd2\x47\x5f\x1f\x78\x70\xe4\xdb\xea\x63\x57\x9a\xf4\xb9\x89\xf7\xcb\x04\x59\xe3\x7e\x62\x9a\x8b\x22\xac\x06\x13\x8c\xc3\x59\xcc\x51\xfa\xae\x61\xcd\xd8\xba\x14\x46\x2e\xfb\x5b\x6d\x8b\xef\x57\x71\x79\xd3\xe1\x2b\x8f\x2f\xa6\x5c\xe6\xab\x19\xf9\xf7\xb7\xda\x56\x93\x01\xe7\x24\xcc\xc9\x55\xff\x50\x53\x70\xa7\xd0\x0e\xf3\x27\x4e\xf6\xf2\x7b\x88\x89\xa3\x4e\x65\x62\x22\x76\x27\xfe\x80\x4c\x86\x92\x19\xde\x9c\x0f\x56\xcc\x9c\x93\x3c\x9b\x3d\x9d\x97\xc2\x0c\xec\x2c\xb2\xb5\xc3\x02\xaa\xf1\xb7\x76\x31\xfb\xe7\xc7\x64\xa3\x8b\xed\x25\x8b\x33\x84\x76\x30\x0e\xfa\xfe\xe0\x33\x8b\xab\x39\x89\x03\x58\x52\x84\x66\xc4\x7c\xc3\xcb\xde\xce\x5b\x22\x02\x59\xc4\x03\x30\x73\x82\xaf\x8a\xb5\x1c\x58\xb8\xd0\x56\xf6\x09\x00\x66\xcc\x23\x56\x7d\x6f\xe7\xed\xca\x76\x44\x63\x95\x83\x01\xd5\xce\x5b\x8b\xc1\xcf\xd4\x61\x2e\xc3\xcc\x0c\x0b\x4c\x66\xdc\xa2\x29\x0b\x41\xc5\x05\x12\xfa\x68\xbb\x67\x96\x42\x79\xd0\x42\x72\x28\x0f\xb5\x3c\x8f\x51\xfe\x1e\xdf\xa4\x59\x82\xfd\xc9\x66\x14\xb0\xde\x59\xac\x23\x63\x66\x16\x2b\xc0\x79\xac\x01\x9b\x90\x7d\x84\x27\x18\x82\x8c\x83\x31\x26\x9d\x27\x16\x2b\x13\xfc\xe7\x23\x7c\x9d\xd1\xd7\x76\xf1\x1d\x5f\xbe\x65\x31\x53\xa1\xf5\x95\x74\x1c\x0e\x70\x85\xa3\x20\x6e\xea\x05\x2e\x36\xfb\x49\x65\xd6\xb6\xf0\x3f\x65\xd6\xee\x31\xba\x60\x38\x3c\x0a\xd3\x85\xc7\xf6\x9b\xd1\xcd\x49\xde\xa1\x3e\x1e\xc4\x13\xe6\x75\x4f\x08\x22\x8c\x67\x69\x39\x92\x11\x5d\x2c\x25\x8e\x17\xf4\xa6\x32\xb7\x0b\x9a\x6f\x84\x79\x60\x83\xf3\xde\x65\x1e\xac\xe5\xf2\xb5\x6a\x34\x2e\x87\x63\xa6\xcd\xe7\x9f\x21\xb3\xeb\xa5\xf5\x48\x23\x4a\xa3\x0d\x14\x5e\xb2\x29\xac\x39\x56\x62\x7c\x89\xd1\xde\x2f\x70\xfe\x4c\x67\xfd\x14\xff\xf7\x0c\x47\x59\xc1\xe9\x19\xf0\x15\x0e\x0c\x73\x0d\xa0\x75\x7c\xb4\x09\x31\x27\x81\xfc\x31\x2a\xc7\x74\xa0\xa1\x60\x45\x00\xf1\x90\xda\x95\xd5\x55\xc4\x66\x24\x7f\x67\xcd\x96\x5b\x1c\x35\x86\x9a\x9e\xe7\x16\x82\x10\x09\x46\x34\x0a\xe7\x68\x83\x5e\x18\x16\x5c\x9c\xd8\x79\x5b\x64\x70\xcd\x37\x9d\x45\xe2\xd4\x75\x9a\x4f\xc2\xc7\xf7\x2e\x7c\xa0\xff\x9c\x26\x38\xc5\xc9\x25\xa6\x62\x48\x3c\x23\xa2\xbc\x24\x7e\x80\x1a\xc3\xcf\xc2\xfe\x98\x71\x60\xb4\x95\xa0\xb7\x49\xe8\x47\xe8\x1d\x75\xcf\x44\xc3\x70\x8c\x71\x34\x58\x19\x00\x08\x1e\xf2\x19\x22\x60\x6b\xf4\x73\x72\x04\x45\xfe\xcb\x8f\xd0\x6e\x32\xeb\xdf\xa0\x3f\x46\xe4\x3f\x2b\x57\xb8\xff\x9f\x17\x13\x3f\x1c\xaf\x0c\xe2\x89\x5d\xde\x39\x39\xe2\xcd\x15\x88\x3d\x72\xa1\xd2\xd2\xcf\xb3\x3c\xdf\x4b\x34\x20\x07\x05\x9a\x32\xe9\xf9\xb3\x67\x64\xd0\x81\xf4\x44\x3a\x24\x50\x12\x51\xa5\x50\x15\x66\x9d\xfe\xfa\x13\xad\xae\xc6\x97\x38\x19\x8e\xe3\x2b\x52\x07\x36\xbe\x3a\x4f\x07\x4a\xea\xd5\x3b\xd5\x9f\x48\xd9\xd7\xe2\x73\x43\xfe\xbc\xae\x7f\x6d\xb2\x3d\x8c\x35\x06\x78\x02\x2a\x04\xac\x68\x77\x75\x15\xf1\x66\x51\xbf\x4e\x8a\x00\xca\xd0\x74\xed\xb5\xa8\xd2\xc8\xab\x88\x32\xcf\x00\x01\x5a\x88\x96\x6a\xaa\xa5\x58\xb1\x67\x80\x0a\x2b\x77\x0b\xff\x12\x82\x94\x4b\x2c\x2d\xf5\x9b\xd2\x77\xf8\x87\x97\xa1\x45\x96\x96\xfa\x8d\xd7\xcf\xdd\x05\x96\x96\xfa\x75\xf6\x9d\xfc\x0b\x1d\xe7\x8d\xc2\xc3\xd2\x06\xf4\xfc\xcd\x1b\x96\x0f\x52\x7e\xdd\xa0\x2a\x40\xe5\x2d\x43\xc8\x6c\x49\x54\xab\x5d\xd7\xea\x4c\xeb\x97\x17\x65\x5c\x8f\x14\x22\x2f\x6f\x75\xea\x60\xcb\xa3\x32\xa0\xff\x55\x69\x84\xbd\xa4\x37\x48\x9c\x94\xf2\x97\x55\x46\x30\xd2\x14\xac\xae\x22\xb2\x4b\xc0\x4d\x0c\x0a\xa5\x85\x44\x17\x8f\xb1\xd2\x5e\xa4\x08\xe0\xa5\x28\x8e\xc6\x37\x74\x39\x6e\xfd\x7a\x70\xb4\x85\xfe\x40\x6f\xd0\x3a\xc0\xe4\x0d\xd6\x6d\x58\xd0\xbb\x38\xb5\xb3\xec\x1b\xef\x2f\x5f\x4b\xca\x59\x40\xac\xab\x15\xc7\xeb\xbf\x50\xe6\x5c\x54\xe4\x34\x8a\x6b\x32\x8c\xd9\x2a\xe3\x89\xa2\x59\x3e\x60\x06\xea\x45\x12\x0f\x72\x4b\x3d\x20\x34\xd8\x1b\x29\x96\x81\xd0\x1d\xe4\x20\x34\x5f\x16\xe2\xd2\x01\x21\x6c\x93\xe6\x29\x2b\x7a\xa6\x8b\x46\xec\xb3\x84\xab\xaa\x7a\x5e\x44\x28\x42\x0e\xc1\x08\xdd\x4d\x38\x42\x0b\x0a\x48\x48\x95\xe7\xcc\x43\x57\x4e\xf7\xf2\xd9\x4b\x2c\x8d\xd7\x9a\x64\x25\x8a\x4b\x02\x96\x53\xc4\x92\x0a\x2f\x20\x69\xb5\x9e\x24\xad\xef\x5d\xd2\x72\xc8\x57\x0e\xf5\xce\xc9\x51\xb1\x9c\xb3\xa8\x7a\xc7\xc2\xd2\x75\x5e\xfe\xc4\xc4\xff\x79\x4c\xbc\xf0\x34\xfb\x08\x2c\x7b\x2f\x1a\x24\x18\x22\x37\x30\xe0\x1a\x48\x26\x87\xe4\x93\xbb\x8c\xa8\x31\x8d\xe3\x0b\xdc\x96\x7f\x45\xb5\xbf\xd5\xe6\x50\x76\x57\x98\x7f\xde\x26\x65\x16\xd8\x05\xda\x4f\xbb\xc0\xdf\x62\x17\xd8\x1e\xe3\x41\x96\xc4\x51\x38\x40\xbd\x38\xc0\xfd\x38\x9e\xaf\xf0\xdf\xee\x15\x29\xfc\xe9\xd7\x85\x76\x84\xed\x9e\xaa\xf0\x27\xcf\x0f\xb5\x03\xc8\xac\x5d\x65\x20\x6a\xbd\x22\x2d\x26\xc1\x47\x59\x48\x8f\x85\x5f\x80\xef\x84\x1f\x4f\xbd\xd4\x9b\xaf\x37\x83\x32\x0b\xac\xe3\xbf\x77\x72\xe4\xff\x39\xeb\xf8\x60\x96\x4d\x67\x59\xf9\x4b\xbb\x83\xc2\x4b\xbb\x83\xc5\x2f\xed\x74\xa9\xee\x40\xbb\xc4\x3b\xf8\x6b\xaf\x83\x1e\x5d\xaa\x33\x75\xf3\xe2\xcd\xc3\x4a\x76\x05\x0d\x7d\x2f\xd2\xdd\x3f\xe9\x84\x7d\xa0\x5d\x6b\xba\x84\xa8\x83\x12\x97\x16\x07\x0b\x5e\x5a\x3c\x65\xb1\xfb\x7b\x30\xdf\xcd\x8f\xc7\x7b\xe8\xb7\x95\x57\x8d\x26\x37\x10\x47\x69\x46\x96\xf7\xc5\x8d\xc1\x7d\xa7\x7e\xb0\xb2\x19\xa5\xe1\x6f\xa4\xb4\xc8\x05\x37\xf5\x03\x99\xfd\x05\x7e\xe6\x4b\x17\xa1\xae\x0b\xd0\x54\xbd\x01\x25\xb5\x8e\x73\x83\x5f\xc5\x00\xf8\xb5\x5a\xb4\xaf\xa7\x15\xe9\xbb\x12\x8a\x00\x51\xcc\xa2\x4c\xf4\x4c\x0b\x66\x05\xb6\x78\x87\xf4\x9b\x01\x8c\xbe\x58\x56\x31\xfb\x97\xf6\xdd\x68\x8d\xc6\xb4\x19\xfb\x29\x8d\x9c\x85\xa6\x71\x1a\xaa\x1e\xf8\xa4\x51\xf2\x9d\xd4\x3f\x8c\x79\x67\x45\x0b\x4b\x1a\x46\xcb\xa8\xae\x35\x72\xe8\x07\xf9\x33\x0c\x94\xc8\x36\xa2\xbe\xa6\xac\x44\x6e\x2b\x0f\xa9\xa5\x36\x92\x87\xd4\x92\x4b\xdb\x82\x6b\xa9\x96\xd9\x4b\x1a\x20\x6e\x87\xc8\x2d\x70\x67\x91\x85\x38\x74\x8a\x78\x87\x33\x29\xe1\xbc\x32\x55\x54\x81\x2f\x46\xb3\x78\xe6\xa4\x3e\x57\x54\x34\x97\xc9\xf1\x97\xf5\x3d\xbf\x08\x92\x50\x60\xfb\x8a\xe1\x21\xa1\x81\x71\xf4\xf6\xf9\xb3\x5b\x2b\xdf\xe4\xcb\xe5\xfa\x55\xa3\xb9\x10\xef\xbc\x5f\x62\xb2\x27\xde\xf9\xad\x78\xe7\xde\xf1\x01\x82\x90\xb8\xe5\x58\xe7\x1e\x0b\xa0\x7b\x5f\xd6\xf9\x97\xb3\xc3\x7c\x49\xcc\xe1\x87\x16\x56\x45\xd3\x01\xd8\x23\xd0\xad\x24\x7e\x14\xc4\x93\x8a\xc1\x01\xab\xd5\x15\x4d\x52\x2a\x86\xc3\x52\x87\x9d\x1a\x5c\xae\xd1\x3a\xf3\x08\xb8\x27\x46\xa5\x33\x2a\x4e\x9c\x0b\x31\xaa\xbf\x77\xe6\x85\xff\x51\x8c\x6a\x75\x6f\xbb\x87\x5e\xad\xbd\x5a\x5b\xae\x23\x46\x1b\x68\x1f\x67\xa3\x38\x40\x0d\x17\xb7\x82\xd0\xde\x77\xe5\x56\x9b\x41\x40\xfd\x07\xd5\x05\x51\x82\x0b\xf0\xd5\x4b\x6a\xd3\x3f\xbe\x68\x95\x06\xfe\x0f\x4e\x62\xc8\x1d\x96\x8d\x30\x4a\x70\x2a\xf1\x45\xa5\x23\xa4\x1c\xeb\x31\x79\x36\xf0\xbe\x13\x2f\x60\x0b\xf1\x0b\xc3\x41\x5d\x8d\xce\xe6\x01\x34\x85\x67\x5f\xd8\x71\x84\xd1\x24\x4e\x30\x15\x1e\x97\x97\xa1\x6f\xae\x51\xe4\xeb\x7d\x79\xb9\xe4\x02\x87\xf9\x5c\x64\x81\xaf\xdd\x2f\xca\xf9\xd3\x02\xff\x66\xa7\x38\x14\xc5\xf1\xb4\x9c\x18\xf2\x91\x93\xa3\x73\x65\x0b\x62\x77\xaf\x89\xbc\x48\x11\xcd\x89\xa6\x16\x22\xba\xfb\x85\x9b\x7d\x22\xba\x6f\x45\x74\xff\x47\x62\x7e\xc5\x24\x27\xf1\xc0\xbf\x50\xf8\x2d\x7d\x70\x96\xcf\xb7\x86\x00\x5c\xa9\x14\x8b\xc0\x55\xf4\xf5\xab\xfe\xea\x4e\x5b\x8c\xbd\xc7\xf3\xe3\x0a\xac\xae\xa2\x4f\x04\xbe\x5a\x2f\x34\x22\x05\x80\x66\x41\x94\xb9\x1a\x85\x63\x8c\x2a\x3f\x54\x72\x5f\xeb\x3c\x06\x37\x78\x1c\x1a\x31\xb7\x85\x09\xa7\xa1\xc8\x0c\xc5\x96\x84\x54\x15\xa5\xee\xd8\x0d\xf1\x78\xcb\xec\x5e\x12\x05\x2d\xc4\x4b\xfe\xde\x8e\x5b\x96\x1c\x5d\x34\x49\xd6\xe3\xf2\x95\x3c\x13\x12\xb4\xf6\xd7\xe7\xf9\x78\xdc\x24\xe1\xe5\x62\x62\x1b\x31\xaf\xc5\x97\xe3\xdd\xcd\x7a\x1e\xeb\x99\x3c\x49\x1f\xcd\x44\xe0\x36\x07\xd1\x43\x3f\x4d\xc9\x42\x5e\x26\xa8\x05\xe8\x3d\xbe\x41\x5b\x38\x09\x2f\x69\x4e\xc8\x1d\x3e\x28\x8d\xe2\x98\xd3\x87\x6f\xdf\x6f\xed\x34\xf2\xd6\xc4\x73\xc9\xc4\xe3\xbd\x38\x1a\x86\x17\x33\x96\x89\x32\x86\xac\x90\x69\x51\x7e\xc9\x24\x9e\xe2\x24\xbb\x41\x7f\xd2\x63\x31\x78\x93\x02\xf3\x3d\x19\xd1\x1c\xc7\x29\x79\x08\x23\x96\x2e\x20\x8b\x85\x2f\xcd\x0a\xda\xc2\x43\x7f\x36\xce\xba\xa8\x85\x2a\xf5\xc6\x3a\x24\x52\xae\xba\xe0\x3b\x12\x9a\xe3\x84\x27\x32\xcf\xc1\x91\xf1\x9f\x87\x66\x98\xb1\xe4\x99\x29\x80\xca\x0f\xf5\xd2\x87\x2c\x46\x53\x9c\x0c\xe3\x64\x22\x01\x57\x20\x4b\xe9\x1f\x07\xc3\x8b\xae\x6b\x94\x11\xbd\xf8\x3a\x86\x98\x33\xf5\xc6\xfa\x6a\xb3\xa1\x85\xe0\xa6\x5d\xa1\xa8\x6b\x9f\x72\x84\x94\xc6\x6f\xab\x45\x09\x49\x8b\x12\xc8\x93\x59\x09\x72\xd2\xe2\xeb\x6d\x7e\x16\xd1\x03\xe0\x73\xb7\xa4\xab\x72\xc6\x50\x32\x7e\x03\x1b\xdd\x70\x7f\xb3\x61\x9c\xc0\x29\x26\x6f\xf4\x01\x12\x83\x7e\x0e\x86\x46\xd2\x78\x4a\xed\xfc\xf4\xa8\x98\x61\x2d\x52\xf1\xcf\x7c\xb2\xd6\x69\xfa\xc9\x7b\x83\xf1\xd4\x69\xac\xd5\x6a\x3a\xe0\x82\xec\xf5\x83\xe1\x85\xdd\xf0\x82\x4c\xc4\x86\xf8\xc9\x09\x8f\x14\x77\x05\xc3\x30\xd7\x3b\x5c\x57\x50\x0f\xba\xb2\x2c\xe8\x2e\xf9\x66\xa7\x0c\x36\x50\x0b\x7f\x58\x29\x59\x39\xf5\xc7\x19\xda\x84\xff\x2c\x9e\x88\x96\xbb\xd1\x48\x7e\xed\xf7\x21\x3b\x9a\x48\x3d\x18\xae\xb0\xa8\x24\x15\xde\x19\x0f\xf0\x73\x4e\x2a\x2b\x2e\xcf\xab\x56\x73\xa1\xdc\x2e\xea\xd4\x5b\x0d\x08\xc3\xcc\x91\x14\x96\x79\xd9\x83\xef\x3e\xa3\x55\x42\x3e\x94\x07\x79\x62\x76\xec\x66\x89\xee\x04\xe5\x20\x9b\xd2\xc1\xa6\xe9\xe6\x0d\x7d\x8e\x2d\xd4\x13\xc8\xc9\x7b\x51\x80\xaf\x6d\x35\x4e\x6b\xd7\x4c\x01\x64\x89\xd6\x39\x27\x44\x97\x40\x45\x08\xcb\xe2\x8d\x33\x7f\x7d\x8e\x0d\xaf\x94\xbf\x71\x56\xe2\x5b\xde\x06\x99\x95\x15\xf6\x64\x33\xc2\xc8\xb7\x16\x5a\x34\x7f\x31\xc7\xc8\x42\xfd\xc8\x04\x75\xad\x83\x3c\x2e\xd2\x1b\x8e\x8f\xd5\xb8\x40\x74\x92\xe5\x39\xe6\xc9\xb2\x81\x02\xf3\x34\xbe\x79\xaf\xf5\x39\x43\x2c\xa3\x77\x9e\x1a\xd8\xfc\x3e\x3f\x1b\x03\xc0\x57\x86\xd8\x3a\xba\x66\x71\x91\xc5\x28\x7f\xc5\x3a\xee\x40\x64\x4f\x8c\xb1\x1d\x74\x28\x47\xb3\x63\x60\x2d\x58\x28\xb6\x1c\x75\x6a\xcb\x21\x4d\x9f\xd3\x98\x03\x01\x3f\x57\x9a\x80\xd1\x13\x23\x2d\x7f\xb4\x8d\x75\x99\xf1\x46\xf3\x42\x41\xd9\x3a\xcb\x47\x5f\x7e\x67\x0f\x58\x25\x35\xf1\xdb\xc1\x91\xda\x1d\x70\x9d\xb2\x78\x5c\x1b\xe3\xf6\x07\xb5\x81\xf9\x83\xdb\xc0\x48\xb3\xf9\x1a\xfd\x51\x30\x7a\xe4\x2f\xaf\x71\xfa\x07\x98\xc3\x18\x1d\x39\xfd\x43\x37\x8b\xe1\x7f\xb7\xe6\x6b\x3d\xe0\x14\xf9\x93\x98\x03\xd3\x4d\x43\xa3\xb6\x29\xd1\x98\xc4\x69\xed\x6c\x69\xa9\xd8\xa4\x48\x02\x2e\x1d\x7d\x39\xdf\xb0\x04\x31\x63\x7b\x59\x5e\xaf\xc8\x80\x52\x3e\x46\xdc\x6b\x43\x2f\x13\x6c\xa6\x70\x23\x5f\x70\x13\x7f\x28\xd1\x32\x4c\x6d\xe9\xf6\xe7\x47\xaf\xb1\x88\x06\x0f\x10\xc4\x86\x8a\x08\x42\x32\xa4\x42\xa1\x4b\x4c\x58\xac\x9a\x87\x1c\xb2\xe9\x7d\xc0\x14\xca\xa6\x79\x90\x1d\x71\x94\x74\x09\x30\x1e\xd2\x05\x55\x36\xec\xaa\x58\x4c\x0a\xcd\x11\x9e\x6e\x8b\x6c\xd1\x28\x34\x7b\xa0\x1e\x3d\x85\x2e\xcf\x09\x7b\x7b\xe6\xad\xfd\xbd\x7d\xe8\x17\x48\xeb\x3e\x3f\x39\xfa\xe3\xea\x8e\x9c\xe9\xb5\x5d\x59\xaf\xff\x09\xda\xa5\x63\x30\xce\xec\x71\xe3\x5d\xaa\x44\x92\x5f\x16\xe9\x91\x04\x1e\x47\x78\x96\xfa\xfd\x31\x66\xe1\xc0\x24\x74\x8e\x91\x9c\x6a\x91\x42\xd1\xdf\xbc\x43\x6a\x86\x35\x69\x5b\x38\x82\x6c\xca\x88\x19\xda\x32\x1b\x63\x53\x93\x24\xca\x43\x8c\x95\x30\x45\x3e\xa2\x09\x98\xd1\x25\x4e\x52\x88\x5a\x36\xf2\x33\x14\xe1\x8b\x31\x1e\x64\x38\x20\x6c\x78\xc0\x52\xaa\x66\x4c\xe1\x93\xc5\x68\x1c\x66\xd9\x18\x2f\xd3\x00\x97\x2b\x2a\x50\x9c\x24\x71\x82\x82\x18\xa7\xd1\x8b\x0c\xf9\xc3\x21\x1e\xd0\xba\x14\xa9\x17\x29\x4a\xf1\x60\x96\x84\xd9\x8d\x27\x2a\xf6\x67\x19\x0a\x33\xa8\xc4\x6b\x84\x59\x2a\x02\x2a\x84\xe3\x30\x63\x4e\xdc\x34\xaf\x6b\x48\xf8\xf3\x04\x47\x74\x3f\x48\x6d\x8a\x32\x3a\x20\x1f\x68\xe7\x84\xba\x4c\x7b\x2b\xcf\xdf\x5d\x93\xb6\x15\x1f\x52\xde\xcb\x66\xd0\xce\x03\x46\x6e\xbd\x0d\xa7\x86\xcb\xa2\xd3\x42\xc8\x4e\x68\x64\xf7\xc2\xce\x73\xda\x6f\xa2\x5d\xf2\xcb\x92\x38\xee\xfd\x69\xed\xcc\x43\x95\xf7\xa7\xcd\x33\x16\x2c\x00\x7d\x25\x8f\xec\x2a\xa0\xde\xa9\x5a\x92\xc8\xbd\x3f\xad\xd3\x4a\x35\xb5\x52\xb3\xb8\x52\x83\x56\xaa\xab\x95\x6a\xc5\x95\x9a\xb4\x52\x43\xad\x54\x17\x95\xd4\x3a\xb6\xec\x48\xc6\x90\x71\x2f\x43\xd7\xa0\xf5\xc4\xa0\xf5\xec\x83\x66\xe2\x23\x0d\x17\xeb\x13\xbd\x30\x19\x0e\x79\xda\x41\x8a\x34\x0d\xb2\x5a\xab\x91\x2f\xb6\xfe\x9a\x13\xd1\x54\x21\xd7\xad\x90\x1b\xa5\x20\xd7\x9c\x03\x2f\xc1\xd0\x20\x37\x4b\x41\xae\xbb\x66\xc7\x93\x60\x68\x90\x6b\x1a\xe4\xf9\x13\xd9\xf3\x93\xe4\x06\xf5\xf5\x74\xaa\x74\xaa\xfa\x34\xfe\x85\xa9\xc9\xc8\xe8\xe4\x13\xd6\x93\xde\xa4\x19\x9e\xa0\x61\x3c\x4b\x50\x16\x4e\xf4\xb9\x5f\x30\x28\x6f\x84\xaf\xb3\x63\xb2\xfa\xdc\xf1\x63\x2d\x11\x6f\xf7\xe3\x20\x1c\xde\x50\x4e\x48\xe9\xb0\x04\x16\xeb\x6e\x2c\x7a\xa7\xd4\x71\xe0\xb7\x53\x48\x79\x09\xd1\x56\x8c\x4c\x71\xb6\x24\xb9\xbf\xa0\x14\x67\xb3\xa9\xfa\xa1\xc0\xa3\x63\xfe\x61\x7f\xef\x17\xea\xda\x51\x74\xc2\xdf\xfb\xe5\xbc\x86\x36\xd0\xde\x2f\x66\x6a\x34\xa9\x48\x9d\x16\xa9\x5b\xa3\x19\xcb\x4b\x1a\xa6\x32\x9d\xf5\x2f\x31\x11\x15\x5c\x47\xff\x1a\x0d\x7e\x0c\x6d\xd3\xe8\xc7\x5f\x11\x7d\x72\x45\x3f\x96\x8b\xb3\x30\xc7\xa2\x7c\x7e\x1d\x6a\x0f\x73\x2c\x9a\x6d\x88\x66\xeb\x4a\xb3\xf5\x79\xcd\xd6\xd5\x66\xeb\x8b\x35\x0b\x61\x74\xc2\x1a\x5f\x82\x04\x48\xd8\x50\x57\xa0\xab\x6a\x13\xaa\x36\xf8\x62\x86\xaa\x35\x75\x99\x3a\x66\x84\x91\x75\x11\x6b\x45\x40\xad\x35\x7a\xae\xd7\x63\xfb\xd3\x8f\x75\xfa\xb1\x6e\xfd\xd8\xa0\x1f\x1b\xd6\x8f\x4d\xfa\xb1\x69\xfd\xd8\x2a\x6a\xb3\x5d\xd4\x66\xa7\xa8\xcd\x35\xd1\x66\x81\x46\xaa\x14\xe7\x41\x8b\x73\x1f\x54\x8e\x03\x21\x53\x49\x21\xfb\x11\x3d\x48\x72\x57\xa7\xf2\x5a\x92\x3e\x4a\x71\x66\xb5\x88\xbd\x77\xee\xed\x1d\x06\x37\xf7\x32\x03\x2e\xa4\x96\x3e\xa6\xa1\x86\x7e\x03\x22\x44\x95\xdf\xc8\xdc\xf3\x55\x02\xcf\x62\xef\x7d\xad\x57\xac\xd3\x8a\x0d\x56\x71\x4d\xab\xd8\x76\x56\x6c\xd0\x8a\x2d\x56\xb1\xae\x55\x5c\x73\x56\x6c\xd2\x8a\x9d\x33\x81\x9a\x52\xb1\x9e\x57\xbc\xd7\x2e\x56\x14\xa5\x9e\x22\xc2\x63\xc7\x1f\xb3\x94\xec\x2c\x78\x3c\x3c\xde\x25\x7a\x3c\x87\xc3\x18\x9c\x80\x63\x8b\x1f\x6f\xc5\xd7\xea\x84\x87\xa4\x1c\xbd\xc2\x9b\xee\xb8\xd8\x8b\x4e\xa6\x7e\x61\xc7\x93\xdf\xdc\xe6\x1f\xc3\x4b\xfa\xa5\xd3\x5a\x6d\x36\x74\xb5\x9c\x58\x26\x82\x60\x2b\x25\x5d\xa1\x94\xf5\xa1\x7c\x91\x44\x50\xcd\xe0\xe7\xd8\xbf\xc4\x28\x1e\x07\x4e\x56\xbb\x80\xfc\xd0\x3b\xa7\x93\xdb\xd3\xe3\x1d\x2a\x2d\xf6\xfc\xf1\x60\x36\x26\x2b\x2c\xc2\x57\xce\x66\x7b\x2c\x11\x4c\x8f\x26\x82\xa9\x5d\xb7\x82\x26\xfc\x1f\x5a\xe2\x12\x9a\x9e\xaf\xa5\xc7\xf2\xc2\xf4\x68\x5e\x98\xda\x35\xab\xd1\x84\x98\xf2\x3d\x2e\xa0\xd6\xaa\xe8\x0d\xaa\xf4\xce\xa5\xe7\xff\x40\x75\xd4\x45\xb5\xaa\x09\xb1\xc1\x20\x36\x28\x44\x06\xb0\xc5\x20\xd6\x35\x88\xf5\x12\x10\x9b\x0c\x62\xd3\xe8\x56\x85\xb6\xa3\x40\x6c\x94\x80\xd8\x62\x10\x5b\xd6\x5e\x37\x35\x88\xcd\x12\x10\xdb\x0c\x62\xdb\xda\xeb\x96\x06\xb1\x55\x02\x62\x87\x41\xec\x58\x7b\xdd\xd6\x20\xb6\x4b\x40\x5c\x63\x10\xd7\xac\xbd\xee\x68\x10\x3b\x73\x21\xe6\x62\x3f\x05\xaa\x54\x5f\xd3\xab\xeb\xde\x31\x82\xa6\xc9\xee\x73\xb1\x7c\x8f\x45\x44\x4a\x5d\x5c\x03\xaf\x0e\x49\xd7\x7a\x96\x24\x1c\x3c\x5d\x7e\x32\x1b\x64\x68\x14\x5e\x8c\x90\x1f\x05\x68\x1c\x5f\x21\x3f\xb9\x98\x41\xf8\x17\x70\x73\xfe\xef\x99\x9f\x18\x89\x7b\xa0\x01\x1f\x6d\x90\x56\xb8\x14\x67\x51\x1e\x5c\xf4\x69\x11\xba\x4b\x58\x8f\x4f\xbc\xcf\x0a\x06\x09\x4e\x67\xe3\x0c\xc5\xc3\xa2\xe6\x47\x74\x0b\xa8\x5c\xf8\xe8\x25\xba\xf0\xa9\xeb\x4a\x7d\xad\x8a\x96\x10\x7d\xd5\x67\xaf\xda\xf0\xaa\x0f\xaf\x6c\x48\x8e\x29\x20\xa9\x2b\xf4\x48\xf8\x12\x5d\x5c\xc3\x0c\x57\x81\x20\x78\x01\x21\x76\x4a\x05\x6c\x89\x60\x48\x87\x7e\x3b\x38\x42\x10\x4e\x52\xfe\xf8\x8e\x72\xb8\x8b\x11\xfa\x1d\x5d\x8c\xcb\x32\x39\xbb\x52\xe5\x37\xc6\xe2\xde\x51\x16\x57\xa9\xbc\xcb\xb7\x6f\xb2\x93\xbd\x93\xc4\x82\x2a\x2b\xd0\x51\x0b\x74\xf2\x02\x3a\x3d\xff\xc6\xb8\xe1\x3b\xca\x0d\x2b\xb4\x99\x7c\xbf\x7d\xc7\xf9\x1f\xec\xb7\x4b\x88\xb4\x66\xc2\x68\x30\x18\x0d\x0e\xa3\xae\x22\x50\x37\x30\xac\xa9\x05\x6a\x45\x18\x36\x19\xf4\x26\x87\xde\x50\x31\x6c\x68\x18\xd6\x2d\x18\xb6\x18\x8c\x16\x87\xd1\x54\x11\x68\x1a\x18\x36\xd4\x02\x8d\x22\x0c\xdb\x0c\x7a\x9b\x43\x6f\xa9\x18\xb6\x34\x0c\x9b\x16\x0c\x3b\x0c\x46\x87\xc3\x68\xab\x08\xb4\x0d\x0c\x5b\x6a\x81\x56\x11\x86\x6b\x0c\xfa\xda\x99\x42\x22\x02\xc3\x8e\x86\x61\x5b\xc1\xb0\x54\xe2\x8f\x94\x27\x9d\x10\xba\xd6\x12\x69\x27\xe6\x5d\x77\x51\x58\x19\xbe\xce\xe4\x7b\x27\x59\x93\xca\x43\x29\x28\x69\x1c\xe8\x6d\x91\x79\x7f\x35\x1d\xfb\x04\x9b\xeb\x0c\x39\xc1\xb1\x38\x33\x95\xbc\x65\x1b\x44\x71\x71\x55\xa4\xd4\x55\x93\x77\xc8\x25\xab\x45\x77\x50\x72\xc1\xd2\xc6\xc8\x9e\x7a\x37\xd2\x6d\xb7\xbc\xfc\x52\xa4\xdb\xee\x78\xec\xae\xa4\xdb\xa9\xdf\x9e\x79\x6b\x7f\xef\x48\x84\x4f\xf7\x55\x4f\xf7\x55\x8f\x76\x5f\xa5\x2d\xf1\xfc\x3e\x47\xbf\xc9\xf9\x7b\xdd\xe1\x3c\x54\x56\xb8\xf7\xe2\x68\xfe\x5e\x3d\x9a\xbf\xbf\xeb\xd1\xfc\xbd\x7a\x34\x7f\x5f\x74\x34\x9f\xa7\x60\x7e\xba\xa9\x7a\xba\xa9\x7a\xba\xa9\x52\xbe\x3c\xdd\x54\x3d\xdd\x54\x3d\xdd\x54\xe5\xcd\x3e\xdd\x54\xe9\x1f\x9f\x6e\xaa\x1c\x8f\x4f\x37\x55\x4f\x37\x55\x4f\x37\x55\xf0\xf7\x74\x53\x55\x4e\x89\xfb\x74\x53\xf5\x74\x53\xf5\x74\x53\x25\xfd\x3d\xdd\x54\x3d\xdd\x54\x3d\xdd\x54\x3d\xdd\x54\xfd\x4f\xbe\xa9\x7a\xb0\x3b\xaa\xbb\xdd\x4e\x95\xb9\x97\x2a\x71\x23\xf5\x58\x77\x51\x7f\xef\x7c\x28\x4f\x77\x51\xff\xfc\xbb\x28\xf9\xee\xa8\xd7\x9a\xeb\xe8\x24\xdf\x1c\xf5\x5a\xd2\xb5\x11\x3c\x3c\xfe\x9d\x11\xf5\xd2\x14\xb7\x46\xf6\xa0\x02\xdc\x43\xbb\xe8\x5a\x09\xdc\x38\x65\x8f\x62\x29\x66\xba\xa9\xaf\x88\xc2\x0c\xa5\xfd\xf8\xda\x84\x73\x2c\xd0\x39\x96\xaf\xe9\xf8\x9f\x4d\x9a\x6c\xb4\x3b\xee\x43\x39\x3b\x74\x87\xf3\xd5\xb8\xef\xf1\x8d\x4d\x8f\xab\xb6\xe8\x71\xff\xf1\xb9\x0d\xb3\x41\x21\x43\xc0\xa3\x4a\x84\xe8\x5f\xf2\x38\x39\x54\x87\xac\x12\xd9\xda\xf8\xd8\x9f\x2a\x80\xcc\x48\x68\xca\x67\x23\x28\x9a\xed\xec\x4f\x7a\x51\xf9\x03\x2d\xd1\xf1\x59\xe2\x8d\x56\xd1\xbf\xa0\x57\x8e\x58\x0a\x57\xfe\xd4\x8e\x33\xec\x1b\xa6\x86\x40\x9a\x80\x63\xbb\x63\x3c\x79\x4d\x66\x7c\xfe\xf4\xf4\xac\x2a\x7e\x96\x55\x43\x10\xcd\x1f\x2c\xcb\xac\x00\x74\x6f\xb5\x1c\xd7\x84\x80\x16\xc4\xc8\xbf\x4e\xa6\xc7\xae\x32\x54\x5a\x16\x4e\xce\x8d\x76\xc7\xa1\x10\xa9\x39\x95\x21\xd6\x46\xcb\x2a\x46\xa4\xf5\xa4\x29\x46\xf2\x41\x0b\xb5\x2f\x7f\xe4\xc3\x39\x37\x03\x3c\x28\x07\xd5\xea\x9f\x65\x3c\xb5\xf9\x10\xab\x29\xa2\xcb\x28\xa2\x2a\xb5\xc8\xb2\x88\x42\xd0\xa0\xd3\x84\x71\x8c\x2a\x95\xef\x0a\x09\x3b\x08\xd7\x4a\xb4\x05\x04\xeb\x26\xd6\x9c\x50\xd5\xf7\x6a\x67\xbf\x92\xba\x15\xb6\xa6\x48\x15\x86\xd7\x59\x9e\xd7\x20\xd2\xf3\x18\x68\xc7\xa7\x4f\x10\x07\xc5\x72\xa3\x95\x93\x7a\x68\x9c\xdd\xc9\x58\x28\x73\xc5\xc4\x32\x05\xbb\xef\x55\xee\xed\xb5\x1e\x42\xe8\xed\xb5\x16\x96\x78\xcd\x3d\x56\x13\x77\x7b\x2d\x6b\x6c\x0b\xb8\xa1\x09\x71\x70\x87\x1d\x7e\x2b\x89\xa7\xca\x2e\xcf\x5e\xc0\x20\x7c\x83\xa8\x78\x01\x69\x4e\x0d\x34\xa7\xe9\xf9\xc9\xc4\x93\x52\x22\xd4\x1c\xaa\xbf\x6a\xc8\x60\xf5\x58\x73\x04\x75\x29\xea\x97\xb6\x8a\x09\xa8\xae\x0a\x42\x8d\x18\x57\x4a\x88\x21\x6d\xf0\x82\xc5\x77\x18\x64\x3c\x0b\x36\x70\x61\xf8\x42\xf0\x22\xbb\xf8\xcf\xb0\x99\x2f\x2f\x5b\xf7\xf0\x05\xd8\x3d\x9a\x93\x00\xe9\x3b\x5a\x6d\x64\x88\x1e\x66\xc5\x01\xa4\xc5\x57\x1d\xa3\xf9\xe2\x95\x47\x0a\x15\x9f\x34\x7b\xad\xc7\x3a\x66\xde\x2f\x5d\xdf\xb7\x3c\x5f\x3e\xda\x29\xf0\xdb\x06\x71\x26\xac\x0a\xa7\x38\xb9\xc4\xcf\x9f\x55\x06\x55\xd4\xa8\xd5\x1b\xa8\x7f\x83\x7a\xff\xdf\xff\x1b\x24\xe1\x00\xed\xe3\x34\x0a\xc7\x2b\x68\x73\x3c\x46\x49\x78\x31\xca\x52\xc4\xca\x07\x2b\xcf\x9f\x3f\x3b\xc2\x41\x98\x66\x49\xd8\x9f\x01\x7c\x3f\x0a\x20\x28\x4f\x18\xa1\x34\x9e\x25\x03\x0c\x6f\xfa\x61\xe4\x27\x37\x84\x1d\x4c\x52\x8f\x45\x69\x48\xe0\xbf\xf1\x2c\x43\x13\xe0\xe9\x03\xe0\xac\x1e\xf2\x13\x8c\xa6\x38\x99\x84\x59\x86\x03\x34\x4d\xe2\xcb\x30\xc0\x01\x0d\x3a\x41\xd6\xe9\x30\x1e\x8f\xe3\xab\x30\xba\x40\x83\x38\x0a\x42\xba\x86\x49\xa5\x09\xce\xba\x6c\xc5\x2f\x23\x15\xad\x14\x14\xc3\x14\x9f\x41\x1c\x60\x34\x99\xa5\x19\xd9\xa8\xfd\x30\x02\xa0\x7e\x3f\xbe\x24\x9f\xa6\x37\xd0\x45\x14\xc5\x59\x38\xc0\x1e\x8d\x2b\x34\x0e\x53\xd0\x2c\xcb\xed\x45\x81\x86\x4c\x10\xa6\x83\xb1\x1f\x4e\x70\xb2\xe2\xc2\x21\x8c\xe4\x81\xe0\x38\x4c\x93\x38\x98\x0d\xf0\x83\xa3\x81\x58\xd7\x82\x78\x30\x13\x71\x30\x48\x8d\xd5\x38\x61\x31\x32\x26\x7e\x86\x93\xd0\x1f\xa7\xf9\x30\xc3\xdc\x40\x35\x09\x75\x32\xcf\x27\xbb\x7b\xc7\xe8\xf8\x60\xe7\xe4\xd7\xcd\xa3\x6d\xb4\x77\x8c\x0e\x8f\x0e\x7e\xd9\xdb\xda\xde\x42\x6f\xff\x8d\x4e\x76\xb7\x51\xef\xe0\xf0\xdf\x47\x7b\xef\x76\x4f\xd0\xee\xc1\x87\xad\xed\xa3\x63\xb4\xf9\x71\x0b\xf5\x0e\x3e\x9e\x1c\xed\xbd\xfd\x74\x72\x70\x74\x8c\x7e\xdc\x3c\x46\x7b\xc7\x3f\xc2\x87\xcd\x8f\xff\x46\xdb\xbf\x1d\x1e\x6d\x1f\x1f\xa3\x83\x23\xb4\xb7\x7f\xf8\x61\x6f\x7b\x0b\xfd\xba\x79\x74\xb4\xf9\xf1\x64\x6f\xfb\xd8\x43\x7b\x1f\x7b\x1f\x3e\x6d\xed\x7d\x7c\xe7\xa1\xb7\x9f\x4e\xd0\xc7\x83\x13\xf4\x61\x6f\x7f\xef\x64\x7b\x0b\x9d\x1c\x78\xd0\xa8\x59\x0d\x1d\xec\xa0\xfd\xed\xa3\xde\xee\xe6\xc7\x93\xcd\xb7\x7b\x1f\xf6\x4e\xfe\x0d\xed\xed\xec\x9d\x7c\x24\x6d\xed\x1c\x1c\xa1\x4d\x74\xb8\x79\x74\xb2\xd7\xfb\xf4\x61\xf3\x08\x1d\x7e\x3a\x3a\x3c\x38\xde\x46\xa4\x5b\x5b\x7b\xc7\xbd\x0f\x9b\x7b\xfb\xdb\x5b\x2b\x68\xef\x23\xfa\x78\x80\xb6\x7f\xd9\xfe\x78\x82\x8e\x77\x37\x3f\x7c\xb0\xf6\x92\xe0\xae\xf4\xf1\xed\x36\xfa\xb0\xb7\xf9\xf6\xc3\x36\x6d\xe9\xe3\xbf\xd1\xd6\xde\xd1\x76\xef\x84\x74\x27\xff\xd5\xdb\xdb\xda\xfe\x78\xb2\xf9\xc1\x43\xc7\x87\xdb\xbd\x3d\xf2\x63\xfb\xb7\xed\xfd\xc3\x0f\x9b\x47\xff\xf6\x18\xcc\xe3\xed\xff\xfd\x69\xfb\xe3\xc9\xde\xe6\x07\xb4\xb5\xb9\xbf\xf9\x6e\xfb\x18\x55\xe6\x0c\xc9\xe1\xd1\x41\xef\xd3\xd1\xf6\x3e\xc1\xf9\x60\x07\x1d\x7f\x7a\x7b\x7c\xb2\x77\xf2\xe9\x64\x1b\xbd\x3b\x38\xd8\x82\x81\x3e\xde\x3e\xfa\x65\xaf\xb7\x7d\xfc\x1a\x7d\x38\x38\x86\xd1\xfa\x74\xbc\xed\xa1\xad\xcd\x93\x4d\x68\xf8\xf0\xe8\x60\x67\xef\xe4\xf8\x35\xf9\xfd\xf6\xd3\xf1\x1e\x0c\xda\xde\xc7\x93\xed\xa3\xa3\x4f\x87\x27\x7b\x07\x1f\xab\x68\xf7\xe0\xd7\xed\x5f\xb6\x8f\x50\x6f\xf3\xd3\xf1\xf6\x16\x8c\xee\xc1\x47\xe8\xea\xc9\xee\xf6\xc1\xd1\xbf\x09\x50\x32\x06\x30\xf8\x1e\xfa\x75\x77\xfb\x64\x77\xfb\x88\x0c\x28\x8c\xd4\x26\x19\x82\xe3\x93\xa3\xbd\xde\x89\x5c\xec\xe0\x08\x9d\x1c\x1c\x9d\x48\x7d\x44\x1f\xb7\xdf\x7d\xd8\x7b\xb7\xfd\xb1\xb7\x4d\xbe\x1e\x10\x28\xbf\xee\x1d\x6f\x57\xd1\xe6\xd1\xde\x31\x29\xb0\x47\x9b\xfd\x75\xf3\xdf\xe8\xe0\x13\x74\x99\xcc\xd1\xa7\xe3\x6d\xfa\x53\xa2\x58\x0f\x66\x12\xed\xed\xa0\xcd\xad\x5f\xf6\x08\xda\xac\xf0\xe1\xc1\xf1\xf1\x1e\xa3\x13\x18\xb2\xde\x2e\x1b\xee\x95\xe7\xcf\x5e\xae\xaa\x3a\xaf\x7d\x3f\x1b\x3d\xac\xde\xab\x5c\xd4\x69\x1a\xf8\x58\x14\xa1\x8f\xa5\xac\xb3\xe1\xc2\xce\x8f\xb2\x14\x65\x7e\x9f\x4b\x2c\xa4\xca\xf9\x97\xb1\x35\xd8\x66\x2e\x47\xd5\x3c\x84\xea\x1e\x42\x0d\x0f\xa1\xa6\x87\x50\xcb\x43\xa8\xed\x21\xd4\xf1\x10\x5a\xf3\x10\x5a\xf7\x10\x7a\xe5\xa1\x7a\xcd\x43\xf5\xba\x87\xea\x0d\x0f\xd5\x9b\x1e\xaa\xb7\x3c\x54\x6f\x4b\x16\x96\x6b\xb4\x2e\xf9\x46\xe0\x91\xf2\x04\x46\xbd\x4d\xe1\x92\x7a\xd0\xd6\x2b\x06\xbf\xc1\x60\xd4\xa1\x8d\x1c\x4e\x93\xb5\xd5\x62\xb8\xbc\x62\x30\xd6\x25\x3c\xd7\x18\xac\x0e\xc3\xa5\x4e\x61\xd6\xe5\x58\xcb\x75\x56\x97\xe3\x52\xa3\x30\x00\x0f\x8e\x67\x93\xc2\x22\xf0\xeb\x72\xbf\x65\x38\x2d\x56\xb7\xcd\x70\x5f\x63\x30\x1a\x12\x9e\x75\x06\x6b\x9d\xe1\xc2\xfa\x5d\x6f\x9e\x55\x5f\xcb\x73\x91\xcc\x99\x0b\x8e\xc7\x9a\x34\x56\x0d\x06\x93\xe3\xdc\x51\xc7\x03\xfa\xd6\xd4\xfa\xde\x61\x75\x9a\x39\x2c\xa8\xdb\xce\x71\xe6\x30\xf8\x78\x40\x5b\x75\xad\xef\x50\xa8\x2d\x75\x70\x8d\x21\xd8\xc9\x07\x57\x00\x69\x48\x03\x4d\x91\xcd\x01\xad\xb3\x3a\xd2\x60\xc1\xc4\xb4\xf3\xc1\x15\x30\x9a\xd2\x40\x53\x64\x25\x84\x1a\x6c\x64\x6b\x12\x30\x3e\x1a\x6b\x62\xf6\x04\x85\x22\x36\x3a\x14\x59\x75\x36\xd2\x79\x2b\x83\xa2\xc8\xc6\x0a\xd0\x93\x5b\xe2\xb4\xd5\x94\xc6\xb3\x93\x7f\x53\x68\x7a\xcd\x83\x4f\x30\x54\x9c\x5e\x5f\xe5\xb4\xc7\x69\xaa\xde\x96\x86\x75\x8d\x95\x55\xe6\xa3\x9e\x13\x81\x98\x8b\x57\xac\x20\x27\x9e\x75\xa9\x0c\x47\x7c\x0d\x7e\xcb\x67\x29\xb1\x96\x5b\x79\x55\xde\xbe\x58\xf3\xf2\x9a\x58\x57\x40\xe6\xa0\xf8\xfa\x6c\xe7\xb4\x2f\xfa\xd9\xc8\x51\x10\xe3\xc4\x48\x86\xc2\x45\xda\x94\xcc\x5b\x20\x0c\x31\x65\xf0\xdb\x39\x02\xd0\xcf\xb5\x7c\x21\x42\x83\x2d\x86\x48\x47\x43\xba\xa9\x0e\xbe\xe8\x74\x3d\x87\x23\xc6\x4e\x2c\x68\xf8\xae\xc0\x11\x0c\xa4\x2e\x0d\x52\x27\x6f\x57\x2c\x3c\xb6\x80\xeb\x4d\xcb\x7c\x88\x0e\x68\x88\x73\x40\x62\xc1\x35\xa4\xff\xb6\xc5\x2a\x56\x07\xa8\x6d\x29\xd7\x52\x67\x46\xcc\x64\xde\x29\x54\xaf\xa3\x33\x25\x4b\xf6\xf9\x88\xac\x10\xcb\x7c\x20\x11\xaa\xb9\xe6\xa1\xda\x75\x7b\x73\xbd\xb1\xf6\xea\xd5\x2b\xf2\xbb\xb3\xbd\xf5\x6a\xfb\xed\x66\x9d\xfc\x5e\xdf\xa9\xbf\x7d\xdb\xdb\xea\x91\xdf\x9b\xaf\xda\xcd\x9d\xad\xd6\xb6\x3a\xdf\xa3\xc4\xd9\x40\xbb\xb6\xd9\x58\x7f\xbb\xdd\x81\x06\x7a\xad\xad\xad\x7a\xa3\x05\x0d\x6c\xad\xd5\x9a\xdb\x3b\x4d\xf2\x7b\x6d\xb3\xb3\xb5\xd6\xd9\x86\x86\x39\x42\x67\x56\x7d\xc0\xd1\xde\xe1\xf6\xfe\x56\xbd\x53\x83\xf0\xfb\x73\x74\x48\xa2\x6c\xae\x45\x92\x5e\xd1\x5d\xf9\xae\x77\x45\x54\x99\x08\x48\x38\x82\x60\x77\xd6\x5a\xed\x46\xb3\x06\x23\xb8\xbd\xd3\xdb\xda\x7c\xbb\x0e\x1d\x7c\xb5\xfe\x76\x73\xab\xb7\xb3\x4d\x7e\xd7\x6b\xcd\x46\xbb\xb5\x06\x83\xd3\x6b\x6e\x35\xb6\xeb\x3b\xb5\x33\xa7\x6a\xbc\xac\x52\xde\xaa\xd8\x2d\xed\xa5\x54\x2f\xb8\xa9\x99\x6f\x8e\x4f\xb1\x00\xdd\x6b\x6e\x16\xe9\xb8\xbe\xd9\x3f\x97\x4a\xf3\xcb\x83\x73\xd3\x90\x09\x15\xdd\xa9\x48\xf5\xd0\x06\xaa\x98\x05\x10\x35\x00\x95\x1a\xcb\x0d\x1f\xa4\x97\x8b\x19\x95\x1a\x00\x99\x5d\xa9\x06\xd0\xb4\x2e\x35\xc1\x15\xa8\xc6\xd0\x3c\x5b\xe7\x5d\x24\xee\x1f\x08\x29\x3a\xaf\x1c\x81\x01\x9c\x8f\xc6\xee\x02\x09\x14\x48\x9c\x05\x40\xfc\x3c\xff\xe2\x86\x00\x32\xd1\xf9\x17\x37\x04\xd8\xa6\xcf\x53\x37\x04\xd8\x34\xce\xd3\xc4\x1e\xd1\x7a\x75\x95\xac\xb2\xcf\xe4\xd0\x7c\xe9\x27\x21\x91\x8e\x2d\x97\xb4\xfe\xd8\x43\xfd\xb1\x87\x06\x63\x0f\x05\x63\x0f\xe1\xb1\xa5\x21\x3f\xf1\x50\x3f\xf1\xd0\x20\xf1\x50\x90\x78\x08\x27\x7a\x63\x3e\x41\xc5\x27\x08\xef\x9a\x2e\x23\xfd\x04\x82\x8e\xc3\xc7\xba\xfe\x71\x40\x3e\x0e\xe8\xc7\x86\xfe\x31\x20\x1f\x03\xfa\xb1\xa9\x7f\x84\x03\x03\xa6\x1f\x5b\xfa\x47\x91\xa6\xda\x57\xf3\x52\xf3\x2e\xe9\xb7\x82\x56\x53\x42\xf8\xef\xd2\x06\xaa\x5b\xd7\x76\x46\x96\x8f\x3f\x46\x4b\xf9\x9a\x5a\xfa\x32\x3e\x0d\xcf\xce\xaa\x5f\x6d\x4e\x0c\xe0\xb5\xf3\xa6\xde\xa9\xfe\xf9\xfc\x99\xca\x1a\x49\x1b\x68\x58\xaf\xf4\xc7\xde\x60\xec\x05\xe3\x2a\x5a\x42\xa3\xb1\xdd\xf7\xe6\x16\x09\x85\x5c\xf8\xa6\xd9\xa0\xaa\x36\x0b\xb4\x86\x0e\xcd\x18\x79\x03\x5a\x6b\xdd\x09\xad\xa9\x43\x33\xa6\xca\x80\xd6\x69\x39\xa1\xb5\x74\x68\xc6\xdc\x4a\xd0\xfe\x5c\x5d\x65\x10\xd7\x6b\x4e\x88\x6d\x1d\xa2\x41\x10\xc8\x1e\x26\x9d\x4c\x62\x66\x9d\x2e\xf2\x05\x25\x71\x36\xae\x64\x5e\x4a\xa6\xd5\xe6\xb4\x01\x34\x90\x2d\xe1\xb1\x7d\xca\x61\x45\x18\x4b\x8a\xfc\x01\xdd\x06\xb6\x2f\x40\xee\xd0\x2e\x59\x93\x75\xab\x1b\x10\xac\x97\xbe\xad\x36\x2c\x33\xe3\x26\x51\xa0\xea\x27\x68\x49\xa2\xd6\xe4\xee\xd4\xda\xae\xf4\x13\x6f\x90\x78\x41\x02\x23\x9e\xdc\x8f\x5a\x5b\x3a\xb4\xfb\x52\xab\x0a\xed\x5e\xd4\xda\xd0\xa1\xdd\x9b\x5a\xeb\x3a\xc4\x07\xa6\xd6\x04\x6e\xad\x0b\xc8\x35\x71\x90\x2b\x70\xd4\xc4\x46\xae\xc0\x88\x6d\x5f\x80\x45\x53\x72\x4d\x9c\xe4\x0a\x1b\x80\xad\x36\x6c\x0d\xa6\x85\x86\xce\xca\xf7\xe4\x74\x0c\x20\x43\x82\xd5\xaf\x26\x61\x92\x7f\x36\x50\x65\x97\x9a\xe6\x0e\x08\x67\x0e\x2c\x3d\xdd\x65\x26\xbc\xbb\xd4\xfc\x36\x20\xe5\x6c\x23\xb2\xcb\xcc\x74\x77\xa9\x21\x2d\x26\xe5\x7c\x6b\xb9\x26\x2b\x07\xc6\xb2\xb0\x23\xf4\xad\xe5\x5a\xac\x1c\x18\x26\xf7\x49\xb9\x81\xb5\x1c\x18\x30\x2b\xc3\xa2\x8b\xb5\x3b\x2c\xb5\xc6\x3d\xcc\xb3\x02\x3f\xf3\x85\x30\x44\x1e\x2c\x1b\xff\xfc\x34\x8c\xbc\x64\xf4\x36\xcc\xd2\x93\x38\x03\x8e\x47\x61\x46\x5b\x7e\xe6\x53\xab\xad\x97\x68\xdd\x02\x1d\xea\x7c\xc0\xc3\xcc\x48\xda\x08\xe5\x8d\xce\x6c\x06\x81\x99\x85\x18\xb1\x7c\x8b\xd4\x98\x29\x07\x49\xa4\xc9\xf6\x19\xfa\xba\x41\x13\x0b\xe7\x36\x12\xa2\xc4\xbf\x50\xb3\xa1\x53\x6b\x0e\xa9\x52\xa9\xe4\x45\x97\x10\xe1\x0f\x04\xe4\xab\x2a\x01\xd5\x22\xeb\xb6\xde\x72\x08\xd0\xbc\x2a\x1d\x8e\x5c\x78\x96\x5e\x96\x17\x9e\x0d\x60\x4c\x70\xd6\x80\xcd\x13\x9c\x6d\x1d\x95\xf3\x74\xe4\xf9\x30\x79\x8e\x1d\x30\x8e\xb1\xa4\xed\x58\x5d\x85\x93\x20\x82\xec\x2e\xd4\x21\xcb\x6a\x38\x35\xa5\x27\x2f\x33\x9b\x4b\x31\x59\xc2\xea\x96\x65\x74\x0b\xe1\xec\xa2\x0d\x24\x8b\xef\xf7\x3b\xbf\xb5\x4b\x1d\xdf\xec\x27\xb2\x5d\x38\x8a\xed\x5a\x9c\x49\x50\xd1\x19\x6c\x57\xb8\xeb\xed\x2a\xc7\xab\xdd\x85\xcf\x55\x94\x42\x76\x95\x33\xd5\xae\xf3\x30\x35\xdf\x14\xee\x88\xde\x84\xd3\xc9\x65\x19\x2c\x02\x18\x6c\xb5\x28\xbb\x31\xd7\x26\x48\x61\x53\x83\x71\x1c\x15\x33\x28\x30\x25\x20\xa5\x72\xed\x02\x3c\xba\xcd\x20\xe8\xe7\x73\x83\x48\x68\x3d\x93\xd6\x18\x9a\xf0\x55\xb1\x8b\x82\x9f\xb7\xf4\xf6\x1f\xc9\x16\x71\xc3\x7a\xe5\xda\x43\x37\x1e\xfa\x62\x4b\xf3\x51\xa9\x5c\x83\x67\xe7\x0d\xfc\xfb\x25\xcf\xd6\x7e\x6b\xc0\x69\x14\xc3\xa9\x5c\x57\x7f\xaa\xdc\x54\xa9\x3b\xf9\xff\x25\x0f\x5f\xaa\xd5\xea\xff\xcf\xde\xf7\x2f\xc7\x6d\x23\x0d\xfe\x1d\x3f\x05\x76\xab\xd6\x1e\x45\x23\x89\x00\x7f\x81\xb6\x95\xbb\x44\xb1\x3f\xe7\x62\xc7\x2e\x5b\x7b\xf1\x57\x2e\x7b\x17\x24\x41\x0d\xe3\xd1\x8c\xbe\x19\xca\x1a\xed\xc6\x5b\xf7\x1a\xf7\x7a\xf7\x24\x57\x68\x80\x24\x48\x02\xe0\x8c\x2c\xe7\xdb\xec\x5a\x5b\xeb\xcc\x0c\x1b\xdd\x8d\xfe\x85\x26\x7e\x34\x1e\xd8\xb0\xf9\xa3\xd8\x04\xa2\x7f\x08\x8c\x2d\x6b\x16\x5c\xc1\x38\xae\xbb\x80\x01\x78\xbb\xde\xbb\x3b\xf9\x07\x30\x67\xc7\x18\x6e\x23\x33\x21\xb4\x5f\x5b\x54\x16\x5c\x90\x4a\x6c\xa6\x0b\x23\xa6\xcd\xc3\x87\x0b\xe0\x6a\xf3\xcd\x37\xdf\x4c\x7c\x72\xb0\xd0\x99\x92\x1f\x9c\xbb\x61\xea\xcd\x30\xf2\x1e\xb8\xed\x36\xc3\x58\x6f\xfb\x51\xfb\x5b\x60\xcf\x53\xfd\xb9\x5a\xca\xc8\x34\x44\x63\xb9\x9f\xc7\x02\x7d\xd3\x8b\x79\x94\x67\xb4\x3b\x59\xea\x09\xbc\xc9\x3d\xc5\xe2\x3d\xc3\x2e\x1c\x7b\xab\xab\x9a\x5b\xd3\x76\x9b\xe1\xe4\x60\x6f\xab\x4d\x0d\xb0\xdd\x56\xa5\x5a\x39\x4f\x9e\x7d\x7b\xf2\x1b\xa8\xc6\xd1\xfc\x3d\xbf\x86\xa6\x6b\x9e\xad\x78\x65\xb9\x3b\xc9\xa2\x50\xb8\x72\xf0\x16\x15\x2a\x2f\x32\x6c\x54\xf3\xe4\x9c\x65\xad\x7a\xf4\x2d\x56\x06\x0d\x75\x80\x87\x5a\x3a\x67\x99\x41\x53\x5f\x7d\x94\xeb\xc0\x96\xad\x51\x35\xa4\xf9\x76\xa2\x8f\x6f\xa7\x71\xfc\x65\x8b\xd3\xbf\xc2\x91\x95\xcf\xbd\x74\xdf\x2b\xac\xa6\x11\xb6\x96\x4c\x7b\xf5\xe4\xdb\x03\xbc\xc5\x4a\xc6\xf0\xae\xea\xdb\x5c\xbf\x38\x86\xd3\xa7\xed\x12\x46\xb9\x28\xab\x89\xa1\x00\x55\x77\x49\x83\x17\x59\xce\x52\x9a\x18\x6a\x33\x79\x9b\x84\xa6\x2c\xcf\x0a\xde\x59\xe3\x30\x01\x66\x7e\x4e\x38\x2e\xbc\xee\xb3\x4f\x5f\x02\xb1\x65\xe8\xe6\xe4\x7b\x38\x83\x3e\x40\xb0\xcd\xdc\xb3\x79\xba\x58\x3c\x4a\xcd\x93\xc5\x90\x30\x9a\xa7\x8a\xe1\x75\xd5\x3c\x51\x2c\x1e\xf1\x66\x9a\x78\xc0\xa9\x75\x9e\xd8\x3a\x27\x6c\x79\x5b\x80\x79\x1f\x24\x4f\x98\x5a\x6a\xc1\xfc\x2c\x13\xff\x6e\x09\x8c\xee\xd9\xd3\xfa\xaf\x9e\x50\x32\x23\xaa\xcf\x39\xfc\xfc\xa6\x44\x07\xc8\x7f\x8b\xde\xa9\x8f\xb4\xfd\x88\x03\xed\x73\x64\xbb\x3b\x52\xb1\x34\x59\xc0\xe1\x58\xf9\x6e\x09\xaf\x0f\x3e\x36\x97\xa9\x31\xbf\x09\xc1\xd4\xd2\x84\x09\x24\x21\x20\x61\xf2\x4d\x26\x86\x03\xb2\x1c\xed\x03\x21\xdb\x44\x23\x7a\x88\x88\x67\x95\x1a\x4c\x9b\x4d\x26\x29\xba\x8b\x32\x99\xe7\x8a\x8f\x39\x60\xf6\x36\x21\x93\xab\xb0\x23\x53\x7c\xe8\x21\x0a\xc6\x48\xa4\xe8\x1d\xca\xd0\x3b\x94\x4b\xcc\x11\xcf\x13\x9e\x32\x53\xd1\xa1\x1e\xe6\x68\x07\xe6\x25\xef\xe2\x53\xa6\x7a\x71\x80\xbc\x4d\xec\xf1\x20\xf0\x49\x60\xa7\x75\xf4\x75\x43\x8e\x7a\x7b\xe8\xeb\xa3\xad\xfb\x22\xf0\xfb\x61\x92\xfb\x9c\xf4\x67\x79\x90\x45\xa5\xc2\x5f\x72\xd3\x74\x1f\x3a\x46\x99\x69\x8a\x0f\x01\xc9\x87\x0f\x91\xef\xa9\x5e\x82\xfa\x8d\x77\x8b\xa2\x63\x64\xe2\x83\x6d\x77\x5a\x6b\xab\xc9\x40\x35\x89\x56\x4f\xb6\xb1\xfe\x09\x6f\xd4\x99\x08\x84\x09\xc3\x41\xe5\x13\xd4\x99\x04\x84\xc9\xc2\xcc\x0c\xe3\xeb\x13\x85\xb9\x19\x26\xd0\x27\x09\x79\x1f\xe6\xcb\x04\xdf\x3f\xeb\x04\x9f\xc8\x85\x0f\x8b\xf9\x72\xb9\xd2\xe7\xdc\x8e\x60\xa0\x56\x7f\x9f\x44\x04\x6a\x21\xb4\x98\x47\xe6\xe9\x06\xd3\x74\x9f\x69\x86\x6e\xc7\x79\x20\xe3\x74\xdd\xef\x71\x36\xe8\xcb\x14\xc2\x60\x32\x40\xa4\xcf\x3b\xcd\x1e\x40\x03\xd7\xc4\x41\x37\x21\xef\xce\x19\x88\x67\x5f\xa6\x0b\x6e\x75\xba\x00\xf4\xb1\xc5\x4c\x81\x59\x2d\xed\x24\x81\x52\x8d\xfd\xd8\x94\x00\xb0\x4f\x0b\xd0\xdf\x75\x81\x8d\xf5\x8c\x91\x30\xfa\xdc\xb5\x31\x14\x95\x7f\x9f\xe9\x83\xc1\xf4\x80\xfe\x0e\x4f\xc2\xa8\xf3\x16\xaf\x9d\xc2\xee\xcf\x0a\x10\x12\x6c\x37\x2f\x20\x00\x3b\x38\xe1\xbb\x44\xfe\x9b\xce\x0d\x64\xd8\x0b\x13\x9e\x53\xf1\xca\xef\x47\x71\x96\x87\x5e\x0c\x9f\xbd\xd8\xcb\x73\x0c\x9f\x8b\xd8\xe3\x61\xe2\x9b\xe7\x0c\x8a\x22\xf3\xbc\xd4\x87\xc9\x85\x88\x86\x14\x87\x58\x7e\x0e\x8a\x84\x16\x0c\x10\xa4\xbc\x60\x41\xc1\x82\x1d\xa6\x0b\xb6\xca\x3c\xb5\xb0\xaf\x44\xa7\xb5\x74\x9c\xa2\x85\x88\xda\xa4\x33\x07\xc7\xc3\xe4\xc5\xb2\xb0\xf4\x65\x88\x1e\x19\x71\x09\x09\x76\x1d\xa4\x45\x93\x91\x61\xba\xe3\x1d\x83\x81\x9a\x10\xf3\x21\xf6\x2f\x43\xf5\x27\x0c\xd5\x42\x2b\xdb\x0d\xd6\x46\xe5\x74\x86\x6b\xa9\x20\xe7\x80\x4d\x48\xff\xa8\xb3\x76\xae\x59\x0d\x47\xf7\xe3\x44\x0c\xe0\xc9\x97\x79\xfd\xff\x9e\x81\xf9\xf7\x77\x2c\xef\x07\x79\x89\x43\xf9\xb7\xe6\x54\x2e\x5a\x2d\x2f\x17\x39\xca\xba\xe7\xf5\xb4\x1e\x3c\xe9\x5f\x9d\xf2\x63\x77\x19\xa0\x9e\xa8\xe5\x2d\x0e\xf9\xc4\x94\xc1\x20\x7d\x49\xb9\x5c\xbf\x58\x95\xe7\x7c\xb2\x30\x0e\x63\xeb\xff\x5a\x55\x3f\xd5\xef\xf9\xe2\xcb\x64\xd1\x7f\xcf\x6c\x26\x82\xa5\x3a\xd1\x31\x22\x0f\xea\xcf\x0f\x8f\x25\x86\xfa\x07\xc7\xdc\xf0\x1f\x26\x0b\xf4\x27\x05\xb6\x67\x9d\x2f\x54\x3e\x5a\xb0\xf9\x9a\x8f\xef\x0a\xec\xcf\x8f\xd5\xef\xe3\xab\xcb\xee\x1b\xae\x41\x2c\x67\xbc\x7a\xbc\x62\xf0\x99\xcd\xbf\x2b\xab\xb5\x41\x40\xcd\x12\xfe\x02\x1d\xa0\xc9\x02\x2a\x7b\xee\xa1\xaf\x3b\x93\x1f\xfd\x99\x2c\x8d\x56\x3d\x4b\xad\x57\x66\x87\xdf\x40\x21\xbd\xfa\x3d\x57\xb3\x72\xce\xd1\x44\x3d\x7b\x88\xd4\x96\xcc\xbe\x14\x5b\x6d\x5a\x05\xdd\xa0\xa0\x56\x29\x3f\x79\x23\x81\xa0\xec\xe8\x40\x10\x60\x0b\x17\xcb\xab\xc9\x62\x8a\x30\x3a\x42\x64\x6f\x8b\x8a\xed\x08\x6e\x42\xd9\x05\xad\xbf\x67\x2c\x9e\x2d\x51\xec\xef\x8f\x4c\x85\x2e\x3a\x10\x75\x86\x34\x69\x71\xde\x7c\x8d\x4d\x24\xde\xdb\x65\xd3\xc3\x0c\xfd\xb3\xaf\xb4\x3d\x39\x5c\xcf\xcb\x8c\x4f\xbc\xbd\x2f\xab\x5e\x5b\xaf\x7a\x0d\x1e\x15\xf0\x28\x34\x3d\x3a\x83\x47\x83\x05\x23\xc8\x59\xe0\x51\xfc\xc9\xcb\x68\x91\xa3\xd6\xfd\x6f\xbd\x8c\x76\xc6\xce\xcf\x99\xb7\x69\x16\xd3\xf0\x40\x28\x43\x68\xd8\x68\x3c\xa9\x5b\x3e\x7c\x88\x88\x5c\xf4\xaa\x7f\xf9\xe6\x9b\x6f\x50\xbc\xb7\x87\xd0\x3b\x33\xa6\xee\x5f\x07\x13\x0e\x06\x98\x30\xdd\xdb\xdb\x0e\x53\xb7\x9d\x6f\x0c\x2f\x9d\x9e\xe0\xb6\xdf\xc6\x4d\xf2\x5d\x60\xad\xdb\x58\x32\xab\x75\x1b\x6f\xea\x7a\xd3\x5b\x32\xdb\xc5\xe4\x0f\x31\x25\x3b\x76\xbb\x6e\x67\xbe\x93\x00\xb5\x86\xa3\x94\xb8\xaf\x7a\x0e\x45\x7e\x55\x0f\xf7\x9d\x0b\xa6\xb6\xd5\xcf\x0c\x4e\x35\x4e\x38\xba\x8b\x0a\xd8\xec\xf6\x0f\xf1\xf1\xcc\x76\x85\xcb\x39\x83\x0a\x73\x0c\xdd\x45\x29\x80\x33\xb9\x3a\xf8\x0e\xa9\x75\x42\x13\xff\x90\xac\x94\x67\x82\xf1\x66\xa9\x55\x2d\xb6\xa9\xb5\x56\xb9\xf5\x4f\x3e\xc1\x89\xf6\x04\xfb\x9d\x47\x9d\x46\xe6\xb1\xad\x21\x06\xf7\xd4\x4c\x38\xd8\xb8\xac\x9c\xcc\xa1\x5d\xa4\x30\xca\x27\x58\x7b\x82\xb1\xfe\x28\x96\x3b\x5b\xe5\x23\x12\x9a\x47\x3c\x58\x40\x16\x94\x66\x68\xbf\x26\xbb\x2f\x84\xba\x2f\x2f\x7a\xb3\x2e\x1e\x43\x43\x82\x8e\x6b\xc1\xec\x0b\xd1\x9a\x28\x88\xc0\x75\x66\x40\x20\x62\x5d\xbf\x4e\xbb\xf8\x13\xe1\xd1\x94\x7e\x41\xed\x4c\xb8\x2d\x01\x9b\x96\xf9\xd0\xc8\x12\x69\xbf\xda\x3a\x1a\x59\x0e\x9d\x54\x42\x10\x15\x31\xd1\xfa\x77\x59\x1a\x95\x30\xa1\x82\x81\x92\xe1\x85\x19\x26\x52\x30\x50\x12\xfc\xcc\x0c\x13\x2b\x18\xf0\xf9\xd9\x97\x65\xd8\x2f\xcb\xb0\x5f\x96\x61\x87\xd9\xe6\x97\x65\xd8\x7f\xca\x39\xde\x30\xda\x79\x8e\x37\x8c\x46\xe7\x78\xf5\x77\xb6\xe1\x1c\x6f\x18\x7d\x99\xe3\xbd\xf5\x39\xde\x30\xda\x76\x8e\xd7\xa4\x9c\xee\x1c\x2f\x28\xc8\xbd\x69\xbb\x59\x3b\x33\x2f\xcd\x52\xef\x77\xbd\x34\xbb\x89\x82\xdf\xe4\xe2\x82\x86\xce\x97\x59\xe0\xee\x2c\xf0\x26\x82\x35\xd5\xc3\x4d\x14\x68\xbf\xbf\x8e\x02\x55\xa5\x1b\x20\x0e\xb5\x3a\xd1\x3b\xd5\x74\xd3\xfa\xf7\xf2\xc9\xf3\xbf\x3c\x7f\xfc\xf8\xd5\xa3\xd3\x57\xfd\xd9\xe2\x17\x3f\xfc\xe5\x87\x9f\xbe\x7f\xf4\xfa\xd1\xf0\x56\xee\x97\xcf\xff\xfc\xd3\xf7\x7f\x39\x79\xfe\xd3\xab\xd3\x6f\x7f\x6a\x5a\x6a\xe4\xe4\xb4\xf2\xc9\x76\xd3\xca\x5a\x8b\xd5\x6c\x59\x17\x6d\xe9\xcd\x49\xd7\xa4\xc5\xdb\x35\x9e\xa2\x6b\x5b\xa9\xf2\x4a\x4e\x89\x54\xe8\x21\x22\xc1\x03\x54\x19\xa6\x44\xb4\x3e\xbf\xd9\xa0\x7d\x14\xa2\xaf\xd1\xb5\x3c\x3d\x58\xd5\x87\x34\xe1\x13\xd9\x83\x99\x4a\xf4\x27\x14\x0d\x72\x11\x48\x03\xf9\xd5\x6b\x74\x8c\xae\xd1\x9f\x50\x68\xca\x12\xf9\xd5\x7f\x0a\xac\x04\x7d\x8d\x04\x1d\x5f\xd0\xd9\x33\x00\x6f\xe4\xb4\xdc\xeb\xde\xcf\xd7\xf2\xe7\xff\xb4\x4c\x05\x6b\x62\xbb\x28\x51\x09\xd7\x09\x18\x84\xd6\x48\x66\x23\x25\xb3\x91\x07\x34\x37\x06\xc1\x34\xa0\x52\xba\xe8\x5a\x82\x5e\x5b\xa6\x95\x5a\x03\xe9\x8a\xf1\x1a\x2e\xf8\x19\xf6\x5a\xc8\xb5\xdf\xf5\x8f\xa3\x7d\xeb\xad\x72\x74\xad\xe1\xe9\xe3\x57\x2f\x05\xaf\x1b\x0f\x9b\x8c\x41\xbf\x77\xc2\x32\x3f\x26\xc0\x80\x44\x6d\xac\xcf\xd6\x57\x3d\xdb\x32\x82\x3d\xad\xc1\x2c\x22\x54\x37\x4f\xfc\x82\x1e\xa2\xf8\x01\xfa\xc5\x31\x33\x07\x7d\x80\xa3\xa9\xe6\xaa\x28\x35\xf9\xb4\xac\x5e\x2c\xd7\x50\xc7\x55\x58\x15\x5c\x96\xfb\xcb\x1e\x3a\x40\xa6\xdd\xd4\x35\x72\xbd\xd1\x43\xa4\xea\x45\x98\x80\xc5\xdf\xa0\x83\xef\x8e\x11\x90\xd1\xb0\x58\x68\x75\x77\x54\xeb\x54\xbf\x39\x06\xb2\xf6\xcd\xd5\x03\xca\xcf\x34\xca\x1d\x54\x07\x86\xf7\x9e\x86\x81\xed\xa6\x96\x34\xc3\x5a\xf0\x4d\x05\x06\x34\xa2\x16\x6a\xdf\x89\x7e\x74\x84\x5e\xac\xca\xf3\xb2\x2a\x3f\x70\x74\xb1\x9c\x5f\x2f\x96\xe7\x25\x9b\xa3\xe5\x07\xbe\x42\xff\xf1\x78\x42\xf6\xee\xa3\xcd\x3b\x8a\xf6\xd1\xe6\x5d\x04\xff\x86\xf0\x6f\x20\xc2\x8c\x19\xa5\xb2\x68\x49\x5e\x9e\x1f\x78\x87\xbc\x4d\xec\xd8\x32\x6f\x61\x4e\x61\x38\x36\xda\xc7\xc8\xa2\x57\x2f\xc0\xcb\x39\x3e\x35\xfc\xd4\x05\xc6\xfa\x3a\x9b\x0e\xec\x67\x6f\xd7\xd5\x94\x35\xf8\x4f\xc5\xcf\x2f\x96\x2b\xb6\xba\xee\xdc\x44\x27\x5c\xe0\x54\x1f\x88\xac\xab\x94\xc6\x5b\x67\xcc\xde\x7f\x6a\xec\xd9\x18\xdf\xbd\xb5\x1d\x7f\xbb\x95\x1d\xbf\xb3\xae\xe3\xbb\x56\x75\x6e\xff\x2a\x81\xe5\x65\x75\x71\x59\x3d\x85\x57\xeb\x0e\x2c\x82\x24\x3d\xe7\xeb\x72\xc5\x73\xed\xa2\x81\xb4\xac\xd6\x75\x41\x68\xd9\xb8\xf3\xb6\x50\x37\x7e\xbe\x98\xd7\x6a\xd2\x6a\x70\xb3\x15\xbf\x8f\x08\x09\xa6\x88\x84\xd1\x14\xf9\x34\x98\xa2\x10\x93\x7e\x63\x75\x67\xc1\x7d\xf1\x4c\x7f\xd4\xbf\xb4\xa0\x7e\x69\xb6\xde\x5b\xa0\xf7\xae\x87\xed\x06\xf7\x17\xc0\x4c\x2d\xdc\x84\x58\xbf\x7b\xd7\xdf\xde\xbc\xb5\x44\xfb\x2d\x4c\x4d\xfc\x01\x1e\x69\x72\x0b\x7e\xd5\x98\x1d\x2c\xc2\x8d\x95\x12\x00\x4e\x9a\xdb\x7a\x61\x04\x88\x3c\x0f\x1d\x20\x31\xd0\x36\x37\x25\xe8\x92\x10\xd9\x8b\x4f\x3e\xd7\x8a\x9e\x61\x62\xce\x20\x34\xe3\xe4\x59\xdd\x89\xa7\x6c\x01\x73\x3f\xbd\xae\x1d\x21\x62\x9a\x43\x4b\xd7\xcb\x55\x3a\x2e\xff\x1e\xfa\x4f\xa9\x24\xf8\x8c\x94\xa8\xbb\x28\x26\x64\x6d\x9d\x36\x7f\x46\xe0\x0e\xfa\x3e\xb8\x88\xf5\xae\x62\x16\xd6\x2b\xa8\x05\x79\x67\x3d\x41\xd2\x29\x24\x48\x6e\x52\x41\x90\x74\x4a\x07\x92\x9b\xd7\x0c\x54\x0c\xe3\x31\x8e\x71\x97\x65\x7c\x23\x9e\x71\x97\x69\xbc\x0b\xd7\x46\x3d\x48\xe3\x6a\xa6\x46\xca\x45\xb5\x94\xd6\x6c\xd6\xf4\x9c\xc1\x64\x5e\xed\xce\x06\x51\x08\x88\x43\xb8\x6f\xf6\xdd\x31\xc8\xc5\x06\x33\x5f\x5e\x21\x05\x33\xbe\x1a\xf1\x52\x0c\xb0\x6b\x8b\x0f\xc8\x44\x19\xfc\x40\x7e\x94\x49\x2f\x7c\xb6\xbb\xc0\xe9\x8c\x57\x6c\xf8\x64\x87\xb7\x06\x0d\xd9\xb3\x52\xbc\x82\xcc\x2f\xcf\x17\xd0\x39\x83\x5b\xd5\x12\xac\xd3\xec\x29\x6a\x33\x69\x23\xf0\x8e\xef\x24\x3a\x8d\x8e\x96\xda\x37\x14\x0b\x21\xf1\x57\xa7\x9e\x8d\xf6\x5c\xb0\x4f\x35\xd8\xf9\xf2\xca\x9a\x97\x5a\xa5\x75\x6a\xcc\x73\x4c\x3d\x39\x15\x5a\x38\x7d\xb3\xb1\xf1\x7e\xba\x91\xb6\x76\x0c\x3d\xb0\x03\x81\xb1\x1d\x03\xeb\xdb\xed\xbe\xb9\x99\x19\x38\xc2\x6a\xdb\xa3\x00\xba\x34\x11\x7a\x09\xe0\xf5\xd0\xb5\x58\x7e\xba\xc1\x2d\x38\xde\x06\x5c\xda\xd7\xe9\x06\xbb\xf4\xa8\x60\x9f\x36\xb0\xa0\x47\xa7\x79\xaf\x2f\x57\xe0\x51\xf2\x3a\x11\x61\xea\xe3\x56\x7e\xba\x09\x54\x2c\x40\x93\x89\xe2\xad\x39\x1a\xac\xe8\xab\xf3\xc1\xb6\xd7\x1b\xc0\xf6\xb4\xc1\x26\xa3\x86\xc4\xf6\xb4\x87\xed\xd9\x38\xb6\xdf\xd4\xa9\x3a\xa1\xd0\x61\x9f\xa8\x1f\x12\x2d\x66\x8a\x76\x7a\xdb\x7b\x39\x5b\xa2\x17\xa5\xc3\xb2\x05\xc9\xfa\xce\x47\xfc\x40\xfb\x2a\x53\xb9\xe6\xfb\x27\x9b\x7c\x47\x72\x0d\x5a\x97\x19\x0b\x20\x69\x41\x63\x01\xa9\x86\x7e\xda\x42\xdb\x43\x12\x0c\x16\xb3\xe5\x73\x99\xa5\x1c\x77\xe6\xc3\x74\xbe\xac\x9d\x7d\xb9\x84\x44\xcf\x11\xe2\xc5\x0b\x74\x4b\x62\x74\xe2\x41\xf3\x95\x49\xdd\xe9\x87\x0f\x5b\x26\xc1\xb4\xeb\xfe\xc1\x55\x9a\x3e\x41\x07\xda\x73\x9b\xa1\xa3\xae\xeb\x34\x38\x8c\xc8\x9f\xed\x88\xbc\x3b\xe7\xd1\x76\x77\xab\x19\x8f\x7e\x97\x15\x57\x1a\x1a\x98\xed\x18\x32\x17\x05\x37\xee\xf9\xb3\x11\x1a\x4f\x77\xa4\xe1\x1a\xdb\x56\x6c\xb1\xbe\x58\xae\x9d\x56\x02\xe1\xf7\x45\xf9\x54\x3a\xc6\xe9\x1b\x6d\x42\xb1\xb5\x43\xeb\x98\x27\x1b\x6e\x33\xf0\x29\xc8\xb1\xd1\xcf\x1a\x3f\x2e\x4a\xc4\x2a\x18\x02\x21\x5e\x9a\x73\xc2\x53\x0f\xfa\x60\x2c\xda\xda\xbc\x1c\x79\x4d\x00\x30\xc2\x9d\x7a\x75\x77\x24\xb4\xcd\xe5\x4f\xbd\xba\x33\x0a\xce\x32\x6e\x1d\x1d\xa1\x93\x99\x2b\xf8\x6d\x3f\xac\xdf\x70\xc8\x18\x0f\x8d\x48\x0b\x5f\x75\x1c\x6e\xc6\x95\x11\xe3\xde\x2d\xa4\xd6\xad\x4e\x1b\x83\xdb\xbe\xc9\x06\x37\x8d\x26\x5a\x12\xb2\xb7\xcd\x00\x28\x11\x90\x1e\x02\x32\x40\xe0\x94\xa2\xc8\x3d\x56\xcb\x2b\x87\x10\xe7\x9a\x37\x9c\xb6\xae\xf1\x0e\x4d\xfe\xa1\xd8\x97\x3f\xdc\xad\x99\x81\xaf\xae\xf8\x31\xd7\xbc\xe6\xb4\x75\x21\x1d\x23\xfc\xd0\x62\x9c\x2f\xaf\x3e\x7d\x82\xf6\x87\xa5\xe9\x8d\x64\xa0\x6f\xab\xa7\x75\xa6\x21\xc5\xf8\xd6\x9b\xcc\x84\xe7\xa3\x2f\x6d\x1d\x2c\x36\x47\xec\xe4\x2b\xdd\x16\xc2\x25\x1d\x8b\x1d\xff\x5c\xdb\xa2\x0c\x93\x34\xb7\xbe\x2b\x6a\x00\xdf\xcc\xf8\x88\x76\xc3\x69\xa0\xaf\x61\xf2\x6a\x38\x0f\x74\xd3\xbd\x54\xf8\x26\x5b\xa9\x60\x93\x54\xc6\xcb\x79\x77\xbf\x13\xde\x43\x47\x5d\xfe\xf7\xd0\xd7\xfd\x1f\x80\x38\x2c\xd0\x34\xbb\xb9\xfe\x49\x36\x41\x7d\xf2\x1c\x9e\x3e\xcd\x58\x33\x6f\x9c\x83\x44\x47\x46\xd5\xeb\x20\xf5\x2c\xe0\x10\xe7\x91\x71\x33\xdd\xab\xff\xba\xe4\xfc\x6f\x7c\x88\x74\xc6\xd6\xb3\xda\xb8\xb7\xba\x8b\x7e\xc0\xc5\xa7\x4c\x16\x8e\xcf\x09\x6d\x9f\xd2\xdb\xd2\xf9\xdd\xe7\x10\x5b\x7a\xf6\x59\x39\x2d\x35\x54\x13\x73\x7a\xc2\xb9\xd3\xdc\x9c\x86\x4a\x4d\xcf\xe9\xa8\x6e\x3a\xaf\xd8\x8a\xc2\xdd\x89\xa7\x83\x4e\x3c\xbd\x69\x27\x9e\x0e\x3a\xf1\x74\xb7\x4e\x98\x55\x25\x4d\x57\x39\x59\xb5\x44\x2b\x5e\xad\x4a\xfe\x81\x1b\x36\x20\x22\x75\xb8\x5b\xc6\x83\x8b\xcb\xf5\xac\x66\xc3\x24\x22\x03\xe4\xb3\x21\xe4\xa7\x97\x27\x36\x9c\x1e\x6a\x48\x4f\x87\x2e\x6c\x3d\x4f\x74\x4b\xbb\x26\xed\xf1\x4b\x6d\xa1\x34\x84\xb3\xe6\xb0\xd3\x16\x11\x62\xcb\xc5\x9c\xfa\x63\xbb\x3f\xd3\x29\xf6\x2f\xdb\x35\x6f\xb8\x5d\xd3\xdf\x75\xb3\xa6\x3f\xb6\x55\xd3\x77\x6c\xd4\xf4\xbf\x6c\xd3\xbc\xed\x6d\x9a\xfe\x96\x9b\x34\x0d\x6a\xe9\x6c\xd1\xf4\xb7\xd9\xa0\xe9\xdb\x8f\xe1\x37\x1b\x0f\xef\xd3\xe0\xe3\xdb\x29\xc5\xff\x22\xdb\x35\xfb\x05\x76\x42\x4c\x7e\xb3\x3d\x9c\x75\xb9\x1d\x41\xf3\xf7\x55\x6e\xe7\x46\xbb\x2d\xd5\xe3\x76\xb7\x67\x0d\xb3\x53\x41\x9e\x10\x93\xce\xb6\x90\x10\x13\xeb\x36\x13\xba\x65\x41\x1e\x01\xd8\xd9\x6a\x42\x55\x55\x8b\x10\x93\x5b\x3b\x42\xac\x77\xdf\x5a\x93\x67\xb0\xc9\xc1\xdb\x64\x69\x9a\x26\x79\x98\x4f\xb5\x82\x3d\x7b\x53\x13\x64\x44\x12\x46\x12\xc2\xf4\x72\x3e\x7b\x86\xba\x3d\x86\xa6\x09\x0e\x13\x0f\x87\x4c\xaf\xfe\x63\x26\x82\x43\x52\xf0\x4c\xd6\x0c\xaa\x6b\x03\x6d\x49\x24\x8a\x7d\x9f\x44\x91\x2c\x2b\xa4\x2a\x07\x99\x89\x50\x9e\x06\x01\xa3\xb1\x5e\x57\x68\x4b\x22\x79\xea\x65\x84\x7b\xb9\x5e\x86\xc8\x4c\x24\x88\xd3\x30\xa0\x38\xd7\x8b\x14\xf5\x52\xd3\xdb\xae\x52\x24\xec\xe9\x86\x55\x8a\x70\xf4\xa5\x4c\xd1\x2d\xe5\x44\x74\xe7\x32\x45\xa2\xc9\x58\x5e\xa4\xc7\x8c\x61\x66\x44\xbf\x94\x29\xba\xfd\xdc\x88\x6e\x5b\xa6\xc8\xa8\x9c\x6e\x7e\x44\x47\xcb\x14\xf9\xd4\x5d\xa6\x48\x0c\xe3\xf7\x29\x31\x65\x4b\xe4\x5f\x24\x5b\xfa\x97\x3e\xdc\x72\xbb\x07\x5b\x3e\xd3\x91\x95\x9b\x27\x51\xf2\x51\xd3\x5d\x85\xe8\x2f\xf5\x0e\x5e\xc3\x5d\x37\xdd\x4d\xbe\x87\xec\xe2\x62\x7e\x3d\x51\x3f\x4e\x11\x5b\x9d\x5d\x9e\xf3\x45\xb5\xee\xdf\xc9\xa3\x1f\x9f\x69\xf9\x81\x52\x4a\x2d\x89\x1e\x79\x6f\x13\x10\xca\x48\x91\x40\x5e\x91\xc7\x84\x32\x4e\xc8\xde\x74\x08\x17\x63\x3f\x0e\x82\x04\xca\x0c\x12\x9f\x17\x51\x98\xe5\x7a\x6a\x30\x68\x90\x86\x99\x57\xa4\x59\x01\x17\x20\x64\x41\xee\xa7\xa4\x30\x21\xe6\x49\x1a\xe6\x29\x0b\xe1\xf6\x6c\x4c\x93\x3c\x4d\x33\x27\x62\x3f\x09\xa3\x8c\x84\x29\xa4\x33\x7e\x40\xd3\xd0\xa7\x26\xc4\x61\x52\x60\x8c\x0b\xe0\x38\x8d\xbc\x30\xf7\x70\xe2\x44\x9c\x10\xbf\xa0\x84\xc1\x95\xdb\xac\xc0\x49\x50\x24\xa9\x09\x31\x4b\x71\x16\xf2\x1c\x38\xce\x59\x94\x53\x8c\xa9\x13\x71\x4e\xbd\x98\x31\x29\x63\xe6\x7b\xbe\x47\x02\xa3\x8c\x31\xa1\x7e\x98\xca\x3b\x23\x82\x30\xf6\xa2\x22\xe5\x4e\xc4\x24\xf0\x31\x0d\x53\xb8\x3b\x22\xe0\x3c\x48\x09\xcd\x8c\xa2\x08\xbd\x2c\xce\x33\xb8\x40\x3c\x0f\x8b\x22\x0d\x38\x71\x22\x8e\x49\xca\xc3\x3c\x06\x51\x14\x24\x4e\x69\x12\x19\x95\x47\xbd\x9c\xa7\x58\x5e\x5e\xe1\xa7\x38\x4a\xa2\x14\xbb\x65\x9c\xe6\x99\x17\xc9\x0a\x95\x24\xcc\x62\x4c\xfc\xd0\x84\x38\xc3\x49\x5a\x60\xc9\x40\x56\x44\x09\x89\x92\xc0\x89\x98\x07\x49\x1a\x25\x19\xc8\x2e\xe1\x05\x0e\x58\x6e\x94\x31\x2f\x52\x1e\xc4\x14\xae\x11\xf7\x69\x50\x90\x90\xfb\x4e\xc4\x5e\x91\xe1\x24\xcf\xa0\x01\x4d\x69\x96\x87\xa9\x91\x63\x12\x78\x19\xc3\x59\x06\x97\xb4\xc7\x2c\x4b\xb2\x28\x74\x2b\x2f\xe7\x09\xc9\x22\x70\x90\x30\x21\xa9\x47\x62\x23\xe2\x80\xc5\x01\x0d\x18\xbc\x23\x44\x9c\x45\x3c\xa0\x6e\x8e\xc3\x2c\xf5\x58\x92\x03\x27\x69\x1e\xe0\x22\xcd\x03\xa3\x4b\x47\x45\x42\x69\x0e\x88\xa9\x8f\x71\xe8\xa7\x6e\x8e\x13\xea\xf3\x10\x87\x04\x5c\x9a\x47\x51\x5e\x30\xb3\x83\x50\x1f\x67\x51\x04\x19\x3e\xc9\xd3\xc0\x27\xd8\x73\xc7\x0a\xcf\xf3\x49\x9c\x51\x79\xe7\x7b\x91\x12\xec\x1b\xcd\x2d\x2d\xc2\x24\x2e\x32\x55\xdf\x94\x17\x1e\xe7\x6e\xab\xc8\x22\xee\x79\x69\x01\x86\xef\xe7\x8c\xd2\x22\x33\x5a\x45\x1e\xb2\x38\xc1\x01\x20\x4e\x7c\x8f\xb1\x98\xb8\x45\xe1\x45\x19\x8b\xfc\x50\x5e\xef\xe2\x79\x3e\x25\x66\x07\xc1\x01\x49\x48\x22\xdf\xbd\x3c\xe6\xf1\x88\xc7\x6e\x51\x90\x38\x8d\x3d\x46\x21\xb8\x04\x51\x4e\x48\x51\x18\x5d\x9a\x70\x2c\xc4\x04\x22\x0b\x33\x12\x65\x09\x89\x9c\x88\x83\x9c\x64\x51\x5e\x80\x55\x84\x2c\x0b\x08\xe3\xb9\x31\x56\xf8\x3e\xf5\x72\x0c\x22\x4b\xf2\x24\x4c\xfd\xbc\x70\x22\x8e\x42\x8f\xc5\x7e\x18\x48\x07\x61\x45\xe4\xe7\xdc\x6c\x6e\x11\xf3\x58\x0a\x71\xdb\xcf\xe2\x38\x25\xcc\x1d\x36\x29\xce\x48\x96\x10\x19\xdd\x62\x9e\x33\xce\x23\x13\xe2\x84\xc4\x84\x64\x52\x64\x38\xa0\xc4\x0f\xfd\xd4\x89\x98\x91\xb4\xe0\x94\xc9\x38\x9b\x15\xd8\xf3\x23\xa3\x83\x30\x8a\x59\x14\x05\xc0\x71\x9a\x05\xc4\xf7\x3c\x77\x74\xcb\x48\x90\xd2\x34\xf6\x20\xce\x7a\x05\x4d\xe2\x04\x1b\xa3\x5b\x1c\x65\x21\x66\x20\x63\x2f\x0a\x83\x94\xfb\x6e\xab\xc8\x71\x42\x38\xc5\x09\x20\x8e\x78\x11\x12\x6c\x1c\xf3\xf2\x28\x49\xbc\x88\x80\x2e\xc2\x30\x0a\x59\x32\xe2\x79\x45\xe0\x71\x3f\x94\xb2\x0b\xe3\x18\x13\x8f\x30\xa3\x1d\x7b\x11\x63\x9e\xec\x99\x4f\xd2\x34\xc7\xa9\x5b\x79\x38\x61\x41\x86\x31\x84\xcd\x94\xe6\x24\xf7\x32\x23\xc7\x98\xfb\x71\x94\x79\xd2\x8e\x71\x80\x59\x1a\xba\xa3\x1b\x89\x03\x1a\xc7\x01\xd8\x71\x5e\x50\xce\xd3\x24\x31\x21\xf6\x83\xd4\x4b\xb3\x14\x7a\xc6\x71\x92\x06\x74\xc4\xdc\xfc\x04\x67\x5e\x96\x82\x52\xb2\x30\x4b\x42\x16\xf9\xc6\x78\xcc\x73\xca\x58\x00\x61\x93\xfb\x01\xa6\x2c\x73\x9b\x5b\x98\x26\x59\xc6\x82\x42\x8e\x0c\x91\xcf\xfd\xd8\x88\x38\xa2\x84\x47\x85\x0c\x56\x79\x94\x92\x94\x32\xb7\x28\xe2\x80\x16\x94\x70\x70\x90\x30\xe7\x45\x4a\xcc\xb1\x22\xa6\x2c\x8c\x7c\x39\xd2\x04\x3e\x8e\x49\x11\xb9\xad\x82\x06\x19\x8d\x29\x96\x99\x10\x2e\x3c\x96\xc6\xc6\xb0\x49\xb3\x2c\xf6\x88\x54\x1e\x66\x51\xe0\x27\xdc\x9d\xbb\x25\x5e\xca\x8b\xa2\x60\x32\x8b\x8c\x7c\xcc\x89\xd1\x2a\x58\x10\x7a\x51\xc6\xc1\xf3\x72\x4e\x49\x9a\x73\x77\xee\x96\xf2\x22\x61\x7e\x21\x47\x06\x92\x45\x71\x82\xcd\x79\x45\x14\xe3\x98\x16\x72\x08\xf3\x63\x12\xfa\xc4\xad\xbc\x8c\x91\xd8\xe7\x19\xc8\x98\x33\x12\x45\x38\x31\xca\x38\xc7\x34\x4a\xa9\x1c\x9a\x88\x30\x24\xd2\x9d\x04\x1c\x26\x22\x2c\x67\x71\x9e\x83\x83\x64\x39\xf7\x78\x8a\x8d\x61\xb3\x08\xe3\x3c\x28\xe2\x42\x0d\xba\x3c\xc7\xb1\xdb\x8e\xbd\xa8\xf0\xa2\x58\xe6\x0b\x31\xc1\x71\x54\xa4\x46\x97\xf6\x58\xe4\xc7\x79\x06\x0e\xc2\x48\x46\x13\xca\xdc\x23\x08\xc6\x7e\x91\x50\x2f\x50\x13\x77\x89\x97\x33\x23\xc7\x38\x8d\xb1\x97\xfa\x32\x1e\xfb\x38\x0b\x62\xec\x96\x31\xa1\x79\x1a\xc7\x45\x28\xad\xc2\x0b\xe2\x9c\x1a\xe3\xb1\x4f\x32\xc6\xd2\x18\xac\x22\xf0\xb2\x98\x04\x89\xdb\x41\xfc\x2c\xe1\x29\xf7\x40\x14\x38\xcc\x92\x94\xa7\x46\xe5\x05\x3e\xce\xa3\x38\x83\x9e\x25\x19\xf6\xbc\x3c\x70\xdb\x71\x90\x65\x61\x1e\xc8\xc4\x3b\x4b\x7d\x1e\x90\xd4\x38\x34\x89\x74\x85\x24\x09\x04\xab\x22\x8b\xc2\x98\x8b\xf0\xea\x8a\x15\x45\x96\x46\x05\x93\x83\x24\xcb\xa3\x82\x71\x23\xc7\x51\x16\x04\x38\xa1\x80\x38\x60\x41\x1c\x52\x1c\xab\x49\xd4\xb7\x8e\x63\xab\xed\x7b\xe1\xcf\x37\x3d\xa1\x6a\xbb\x06\xed\xe7\xce\x09\xd5\xbf\xdc\xec\x84\x6a\x88\xc9\x76\x4b\x07\x86\xe5\x88\xdb\xaf\x3e\x7a\xd3\xa5\x83\x88\x79\x09\xaf\x27\xdc\xfd\x34\xcb\x12\xcf\xb2\x74\x90\xa6\x51\xcc\xb8\x1c\x7e\x69\x90\x31\x16\x77\x53\x17\x07\x11\x3f\x8b\x78\xe1\xc7\x10\xc9\x0a\x9e\x04\x05\x15\x91\xcc\x04\xc9\xc2\xa0\x28\x42\x1f\xbc\x20\x2c\x70\xee\x47\xc5\xb6\xb3\xfa\x21\xf6\x78\x48\x64\xf0\x61\x39\x8f\x28\xc9\x2d\x4b\x07\x49\xea\x85\x11\x95\x06\x49\x52\x9f\x47\x19\x2e\xb6\x24\x82\x0b\xea\xe7\x89\xb4\xf9\x22\x0d\x70\x9a\x47\x96\x9e\x84\x29\xf7\xb2\x5c\xa6\x41\xd8\x8f\x39\xc1\x71\xb2\xcb\xd2\xc1\x6d\x9f\x23\xdd\xa6\x34\x2c\xc0\x79\xf6\xca\xaf\x4f\xb0\xbd\xf4\xeb\x13\x62\xaf\xfd\xfa\xc4\xb7\x17\x7f\x7d\x12\xd8\xab\xbf\x3e\x09\xed\xe5\x5f\x9f\x44\xf6\xfa\xaf\x4f\x62\x4b\x01\x58\xd9\x41\x28\x0f\x6b\xdc\x07\x2e\x9f\xcf\xe5\xf3\xe1\x61\x0f\x29\x03\x68\x6e\x3c\x02\x25\x9f\xcf\xe5\x73\x4b\x73\x02\xcd\x89\xb5\x39\x99\xcb\xe7\x96\xe6\x3e\x34\xf7\xad\xcd\xfd\xb9\x7c\x6e\x69\x1e\x40\xf3\xc0\xda\x3c\x98\xcb\xe7\x96\xe6\x21\x34\x0f\xad\xcd\xc3\xb9\x7c\x6e\x69\x1e\x41\xf3\xc8\xda\x3c\x9a\xcb\xe7\x96\xe6\x31\x34\x8f\xad\xcd\xe3\xb9\x7c\x6e\xd8\xd6\xb7\x65\xd1\x63\x69\x19\x26\xe4\x4c\x1a\x45\xbf\xe2\x1e\x6c\xb9\x95\x06\x61\x6a\x95\x4a\x5b\x30\xb5\xca\xa4\x1d\x98\x5a\x65\xd2\x04\x4c\xad\x72\xa9\x7e\x53\xab\x5c\x6a\xde\xd4\x8a\x4b\xad\x9b\x5a\x71\xa9\x70\x53\xab\x42\x2a\xdb\xd4\xaa\x90\x7a\x36\xb5\x3a\x93\x3a\x36\xb5\x3a\x93\xea\x35\xb5\x9a\x49\xd5\x9a\x5a\xcd\xa4\x56\xe7\xa6\xba\x83\xae\xa3\xbb\x5b\x5e\x87\x6a\xad\xa7\x5d\xd3\xff\xb9\x94\xb5\x87\x6d\xc7\xcd\x1f\xc1\x08\x5e\x2f\x9f\x0d\x41\xb6\x28\x14\x2d\xc9\x08\x11\xfc\x5c\xd6\xa7\x0d\xf4\xaa\xd1\xe8\x6b\x44\xde\x02\xa4\xb9\x96\x6b\x8b\x63\x2e\x71\xa8\xf3\x05\x7d\x1c\x70\x6a\xfe\x46\x15\xa8\x8f\x8e\xd0\x7f\x40\x35\x62\x3b\xf1\xba\xa4\xf3\x4e\x15\xaa\x37\xb3\xa6\xce\xf1\x66\xec\x2c\x9e\x02\x9b\x6b\x2d\xdc\xe7\xf1\x24\xd4\xac\x53\x05\x7b\x26\x8b\xff\xea\xc5\xab\xe7\x50\xa2\xb8\x2e\x07\xdc\x81\xa3\x03\x38\xd8\xf4\xfa\x0e\x75\xc1\x62\xd7\x09\x53\x09\x39\xef\x70\x31\x1f\x72\x31\x33\x71\x31\x1f\x72\x31\xd3\xb9\xe8\xc2\xc5\x43\x38\x4b\x25\x63\x5d\xa5\x96\x9a\x39\x1f\xb4\xda\xdb\xbb\x14\xdf\x6e\x35\x8a\xb7\xd3\x28\x6e\x35\x8a\xb7\xd2\x28\x9e\x75\x0a\x7c\xcf\xea\x2a\xdc\x5a\x61\xee\xb9\xaa\xd5\xad\x09\x09\x2b\x09\x77\xc1\x60\x1f\x73\xa2\xa9\xb4\xc6\x17\x8d\xaa\x14\xcf\x3b\x6c\xcc\x0d\x6c\xcc\x4c\x6c\xcc\x07\x6c\xcc\x3a\x6c\x74\x11\x46\x03\x7c\x24\x72\xea\x74\xa7\xda\xe1\xae\x50\x12\xb7\x6a\x8f\x5d\x6a\xff\xb9\x8c\x65\xe4\x32\x0e\xcc\x3d\xc8\xb9\x82\x74\x9c\x09\x97\x90\x38\xd2\x02\x89\xf5\x56\xe8\x1a\x56\x32\x80\x8d\x99\x45\x1f\x76\x5e\xc3\x8e\xf2\xd0\x46\x9a\xb9\x10\x5a\x19\xf7\x47\xae\x2e\x78\x1b\xca\x66\x12\x7c\x06\x35\xdb\x04\x1e\xa1\x49\x6f\x0f\x3d\xac\xbd\xb3\xf9\xe5\x7f\x20\x8c\xee\xa3\xc1\xb6\xe9\x21\x1f\xe2\xdf\x5a\x83\xe3\x6c\x88\x7f\xf7\x1b\x6f\xb1\x70\x81\x6f\xca\x05\x48\x71\x4b\x1e\xa4\x76\x86\x1c\x48\x4d\x0c\xe8\x9b\x91\xb6\xa3\xe2\xcf\xa5\x4d\xbd\xed\xa8\xf7\x73\x69\x62\xce\x5e\x13\x5f\x15\xc5\x9f\xa1\xbb\xa8\x98\xa9\xb2\xf8\xe2\x8b\xf9\x1c\x9f\x6c\x23\x7d\x9f\xcf\x45\x9b\xb9\x6a\x23\xbe\x9c\xcd\x1d\xc5\xf4\x67\x50\x4d\x5f\xa0\x4e\x25\x1d\xf8\x9c\xc9\xcf\xa9\xfa\x6c\x6f\x3e\x87\xe6\x82\x4a\x2a\x49\xc2\xe7\x4c\x7e\x4e\xd5\x67\x77\x49\xfe\x99\xac\xc9\xaf\x02\x8e\x1c\x57\xd8\x5c\x96\x97\xde\x93\xc5\x0f\xd8\xac\xae\xd8\xaf\x1e\x76\x6a\xf6\xcf\xb4\x5b\x24\x58\x3d\xea\x38\x2b\xf3\xc3\xdb\xd4\xa4\x41\xa4\x68\xce\xba\x34\xe7\x1d\x9a\xb3\x2e\xcd\xb9\x4e\x73\xb6\x0d\x4d\x2c\xfb\xc9\xd5\xd0\x20\xcf\x9b\x70\x39\x28\xd0\xba\xec\xff\xac\xbe\xb4\x42\x7b\x18\xb4\x0f\x05\x4d\xbf\x7e\x26\xcb\x70\xbb\x69\xca\x7e\x2a\xe0\x9a\xe6\xac\x4b\x73\xde\xa1\x39\xeb\xd2\x9c\xeb\x34\x67\x2d\x4d\x63\xd6\x39\x7e\x0f\x81\x99\xd7\x1f\xa1\xfa\xd2\x8f\xf6\xc3\x54\x3f\x82\xf3\xfe\x58\xba\x8e\x51\xfd\x08\xc1\xe0\xc7\xd2\x16\x42\x3f\xc0\x45\x09\x02\x66\x36\x6f\x58\x34\x39\xa5\x04\x14\x04\x67\x6d\x5f\x64\xb8\xa8\xb0\x1e\x2e\x66\xdb\xc4\xaa\x96\xac\xf8\x57\x48\xc4\x4d\xb3\x02\x52\xd9\xcc\x44\x30\xbb\x11\xc5\x1f\x8d\xa1\xa7\x4f\xf1\xc7\xd2\x44\xf1\xc7\xf2\x26\x14\xcd\xc1\xae\x4f\xf1\x67\x23\xc5\x9f\x4d\x14\xcd\xd6\xd6\xbf\xbc\xc2\x42\x12\x26\x2f\x6a\xb7\x07\x40\x2b\x77\x30\x0f\x52\x47\xa5\x7d\x19\x1e\x81\x45\xa2\xb3\x58\xe3\xda\x8e\xcd\x3f\x5f\xe4\xac\xe2\xe8\xca\xfd\xa6\x2f\xfe\xe0\x7d\xd3\x68\xdf\xf0\xba\x79\x66\x62\x1b\x06\xa0\xc2\xd4\x06\x5e\x6c\x0b\x53\x1b\x78\x87\xe6\xa6\x36\xf0\x0a\xcd\x4d\x6d\xe0\x95\x7c\x92\xcf\xe1\xfa\x8e\xb9\xed\xfe\x0e\x78\xa7\x9f\xe4\x33\x80\x92\xa2\xe3\xba\xe4\xf2\x81\xd0\xac\x37\x81\x08\x4c\x99\x89\x47\x98\x52\xc8\x4c\x3c\xc2\xec\x45\x6a\x6a\x03\x93\x17\xa9\xa9\x0d\xcc\x93\x30\x53\x1b\x98\x26\x19\xdc\x66\x20\xfe\x60\xda\x65\x22\x4d\xbd\x22\x56\x61\xc0\xc4\xcd\x44\xca\x41\x58\xd6\x7e\x3b\xe2\x48\x69\x54\xc3\x64\xe7\x56\x2f\x2b\xd1\xe6\x0c\x21\x33\x78\x02\xf6\xcf\x06\xd9\xc0\x93\xa6\x18\xc5\xe4\x09\xd8\x3d\x93\xcc\x3e\xf1\x74\x6e\xd9\x90\xd9\x3e\x1e\x6d\x96\x51\x12\x04\x11\xa5\x43\x82\xb8\x25\x08\xe2\x49\x15\xc1\x4e\x24\x48\xc7\x09\x6a\xf3\x92\x92\x20\x81\x10\x3b\x24\x48\x5a\x82\x64\x56\x8f\x4b\x13\x80\xd7\xc2\xeb\x38\x41\x6d\x26\x53\x12\xf4\x05\xc1\x7c\x48\xd0\x6f\x09\xfa\x82\x56\xae\x08\xfa\x23\xee\xd0\xc7\xa3\xcd\x7d\x4a\x82\x81\x20\xc8\x87\x04\x83\x96\x60\x20\x68\x71\x45\x30\xd0\x09\xf2\x71\x82\xda\x6c\xa9\x24\x18\x0a\x82\xc5\x90\x60\xd8\x12\x0c\x05\xad\x42\x11\x0c\x75\x82\xc5\x38\x41\x6d\x7e\x55\x12\x8c\xe0\xa5\x62\x48\x30\x6a\x09\x42\xf6\x7e\xa6\x08\x46\x9d\x97\x88\x71\x82\xda\x8c\xac\x24\x18\x0b\x82\xb3\x21\xc1\xb8\x25\x08\xaf\x4d\x6a\x4c\x16\xf0\xae\x24\xe0\x93\xcf\x5e\x7c\xb9\x14\xe7\xf6\x2e\xc5\xc1\x22\xb9\x57\x37\x9b\x09\x64\x50\x87\xc5\xf7\x6e\xfb\x5a\x1c\x33\x19\xfc\x4f\x79\x31\xce\xc9\x72\xf1\x81\xaf\x64\x95\x5f\x54\x2d\x91\x4f\x0e\xd2\xb2\x12\x09\x4a\x8e\x18\xec\xcf\x4e\x79\xb1\x5c\x71\xb5\x9d\x7a\xa0\x35\xed\xac\x89\xb6\x76\x57\x2d\x5f\xfb\xe4\x36\x2e\xe2\xf9\xbd\x5e\xc1\xa3\xf3\xd9\xd4\x07\xb9\x8f\xb0\x47\x82\x23\x5f\xd5\x29\xfe\x72\xba\xc9\x7a\x54\x29\xc4\x64\xd7\xd3\x4d\xa2\xc9\xc8\xe9\xa6\xce\xb6\x86\xc1\xe9\xa6\x10\x93\x2f\xa7\x9b\x6e\xfb\x74\x93\xd0\xca\x76\xa7\x9b\x8c\xca\xe9\x9c\x6e\x92\x0a\x72\x9e\x6e\x92\xe7\x68\xb7\x3c\xfd\xed\xff\xae\xcf\x33\xf1\x45\x76\x90\xb2\x35\x8f\x82\xde\x83\xf3\x3c\xec\x83\x7e\xb8\x78\x9f\x17\xbd\x1f\xb3\xf2\x62\xc6\x57\xbf\xc9\x91\x28\x8d\x55\xf8\x2e\x38\x94\x0f\x24\x63\xf0\x59\xe7\xe7\x5f\xe1\xe8\xd4\xcf\x5b\xdd\x09\x04\x9b\x67\x4e\xa0\xeb\x0d\x9c\xf6\xdb\xf8\x51\xa8\xa3\x23\xf4\x82\xaf\xce\x61\x14\x3d\x99\x2d\xcb\x8c\x23\xdc\xbf\x36\x45\x34\x7f\x71\x82\xbb\x67\x97\xc2\x78\x8a\x82\x64\x8a\x02\x3c\x45\xbe\x3f\x45\x24\x9c\x22\x1c\x4f\x51\x32\x45\x08\x6b\x5b\x8d\x42\x3a\x45\xa1\x37\x45\x01\x99\x22\x3f\x98\x22\x12\x4d\x11\xa6\x53\x84\xbd\x29\x22\x3a\x5c\x32\x45\x21\x9e\xa2\xc0\x9f\x22\x3f\x9c\x22\x12\x4f\x11\x4e\xa6\x08\x0b\xfc\x1a\x5c\xe4\x4d\x51\x48\xa6\x28\x08\xa6\xc8\x8f\xa6\x28\xf2\xa7\x28\x0c\xa7\x28\x88\xa7\xc8\x4f\x34\x40\x1f\x4f\x11\xf1\xa7\x08\x87\x53\x14\x4f\x11\x8a\xc8\x14\x85\xc1\x14\x05\x70\xb5\x80\x0e\x28\x38\x21\x53\x84\x83\x29\x8a\x04\x20\x9e\xa2\xd0\x9f\xa2\x20\x9c\x22\x3f\xd6\x00\x49\x32\x45\x04\x4f\x11\x16\x24\xa7\x08\x11\x3a\x45\xc4\x9b\x22\x2c\xd8\x91\x60\x6f\x1d\x72\x25\x66\xb9\x92\xae\x5c\x05\x17\x42\x8e\xa2\xdf\x44\x7c\x9e\x22\x14\xea\xdc\x2a\xc2\xa2\x5b\x82\x5b\x60\xc8\xd3\xb9\xf4\x95\xe0\x04\x57\x02\x20\x9a\x22\xbd\xbb\x38\x92\xf2\x10\x02\x06\xee\xfd\xae\x22\x84\x42\x85\x80\x85\xfc\xfc\x58\x0a\x36\x0c\x7b\xf2\x0a\x3c\xa5\xad\x50\x6a\x3f\xd0\x29\x08\xd5\x08\xd3\xf0\x85\x4a\x23\xa9\xf6\x50\xd7\xa1\x50\x81\xb0\x07\x61\x17\x42\x87\x42\xb0\x75\x56\xd3\xb9\x11\xea\xf2\xfc\x72\xce\xe0\x9a\x14\x91\x54\xae\x67\x65\x31\xb8\xe1\x09\xbc\xe0\x87\xd3\xbf\xbc\x7a\xf2\xc3\x63\x79\xa7\x94\x90\x18\x99\x22\xe8\xbc\x90\x10\x15\x16\xa9\xd4\x04\xd2\x55\x96\x8a\x95\x3a\x89\xb2\x5e\x10\x08\xd5\xe9\xbf\xfa\xee\xf9\x6b\xbe\x46\x6c\x91\xab\xda\xe8\x17\xa0\x52\x79\x9f\x86\x81\x0f\x01\xff\x97\x17\x5d\x7d\xf6\x52\x4a\x6f\xe3\xdd\x87\x97\x11\x4a\x3c\x6f\xda\x7f\x56\xbf\x2b\x48\x10\x03\x00\xe9\x00\x50\xcf\x23\x03\x10\x5f\x03\x19\x3e\x0d\xf4\xa7\x06\x02\x61\x97\x00\x31\x10\x88\xba\x4c\x9a\x40\xe2\x5e\x3f\x0c\x84\x68\x87\x91\x21\x8a\xa4\x4f\x65\x88\x82\xe9\x20\x26\x80\xb4\x2f\xad\x21\x48\xd6\x23\x33\x00\xc8\xfb\x5d\x19\x82\x70\x0d\x64\x48\xa1\xe8\x72\x39\x6c\x4e\x5d\xad\x31\x1d\xd5\x07\xa1\x23\x04\x7c\x3a\x62\x55\x41\x9f\x88\xc1\x2e\xa8\xdb\x6e\x22\x3a\x6a\x98\x31\x75\x19\x26\xa5\xa3\xfa\x4e\xe8\x88\xbe\x59\x9f\x09\x83\x49\xf4\xc9\x0c\x39\xc9\xe8\xa8\xc6\x73\x3a\x62\x35\x9c\xba\xad\xbb\xe8\xd3\x30\x68\xde\xaa\x2e\x15\x25\xb0\x59\x90\x44\x7b\x6a\x51\xa6\xdf\x01\x31\x52\x0f\xba\x58\x4c\x7d\x0c\x75\x10\xa3\x4d\xe8\x7c\x1a\x9e\xc7\x5d\x36\x1c\xbe\x81\x1d\xe6\x9f\xf4\x39\xb5\x06\x0a\xec\xd0\x68\xda\xed\x8c\xc1\x2a\x3a\x9d\xb1\xc6\x09\xec\xb0\x5f\xde\x03\xb1\x85\x0a\x6c\x0e\x05\x74\x54\x14\x98\x8e\x8a\x82\xd0\x51\xd5\xfb\xd4\xad\xb6\xa0\x87\xc2\x16\x2b\x5c\xe2\x8e\xa8\xcb\x84\x63\x3a\xa2\x0c\x4a\x47\x24\x99\xd0\x51\xd3\x62\xd4\xad\xd0\xb4\x2f\x6f\xc3\xe0\xd1\xa7\x32\x04\xc9\xa9\x4b\xa5\x9c\x8e\xb8\x50\xd1\xd7\xa8\x7e\x47\xd5\x74\x2c\xcb\x08\x3c\x8f\x06\x1e\xb6\x46\x10\x05\x63\x4d\x33\x1a\x05\xda\x22\x48\x4d\xc4\x33\x11\x09\xba\x44\x8c\x30\x61\x17\x8f\x91\x99\xa8\x8b\xc7\x08\x13\xb7\x30\x06\x2a\x7a\xb0\x35\x36\x4f\xfa\x24\x0c\x48\x58\xbf\x3b\xf6\x84\x43\x11\x32\x20\xc9\x3a\x82\x35\x00\xe4\x2d\x80\x35\x80\x48\x16\x0c\x8d\x8b\xbe\x56\xac\x79\x97\x53\x98\x98\x8e\xf4\x82\x50\x97\xb4\xfd\x3e\x09\x93\x6d\xd0\x9e\xde\x4d\xb6\x41\xc7\x05\x1e\xd1\x11\x43\x8d\xe9\xb8\xa1\x52\x3a\xa2\x94\x84\x3a\x94\xc2\xa8\xdb\x97\xd2\x3e\x07\xf6\x40\xe2\x74\x95\x9c\x8e\x18\x31\xef\xcb\xd4\x1e\x4f\xac\x16\xa4\xbf\x80\x18\x9e\xe2\x2d\xdc\x1e\x93\x2d\x9c\x09\xfb\x5b\x38\x3e\x0e\xb6\xb0\x67\x1c\x3a\x5d\x1f\x47\x63\x2e\x89\xe3\x91\x60\xa8\xa7\xe0\x66\x0c\xc9\x58\xb8\xc4\x6c\xcc\xef\x71\xba\x45\xb4\xc4\xd9\x58\x20\xc3\xf9\x16\xc1\x12\xf3\x2d\x42\x19\x2e\xfa\x1a\x32\x9a\xcb\x58\xa8\xc0\x78\xcc\x43\x31\xd9\xc2\x41\xb0\x3f\xe2\x65\x38\xd8\x26\xb0\x85\x5b\x84\x1d\x1c\x39\xa3\x1b\x8e\xb7\x08\x4b\x98\x6e\xe1\x8b\x38\xd9\xc2\xeb\x31\xdb\x22\x9a\xe2\x74\x2c\x82\xe1\xcc\x15\xc2\x70\x3e\x16\x16\xf8\x16\x61\x14\x17\xbd\x08\xb5\x4b\xaa\x82\xbd\xc0\x12\x8c\xcc\x2c\x93\x8e\x54\xb0\x35\x45\x91\xb8\x4d\xd8\x03\xed\xb9\x67\x78\x1e\xf6\x94\x33\x84\x88\x3a\x42\x33\xd1\x88\x3b\x10\xe3\xc3\xb1\x3d\x37\x69\xa9\xd8\x32\x93\xba\xa7\xb6\xac\xa4\xe5\x62\xc8\x67\xd6\x93\xe6\x10\x22\xef\x48\xcb\x96\x9a\x00\x06\x4b\x5a\xa2\xda\x9a\x25\xe0\xea\x1e\xa6\x63\xec\x13\x6a\x37\x14\x9f\x8e\x19\x4a\x40\xc7\x14\x1d\x52\x77\xe7\x23\xea\x36\xa5\x58\x7b\x3e\x7c\x4a\xa9\x5d\x74\x09\x75\x89\x8e\xd1\x31\xf3\x4a\xa9\xdb\x09\x32\xea\x36\x9d\x9c\x8e\x19\x06\xa7\x63\x4e\x50\xd0\x31\x13\xef\xa4\x15\x16\x23\xc0\x23\xee\x8a\xc9\x88\x85\x62\x7f\x34\x64\xe0\xc0\x69\xa9\x38\x1c\x75\x78\x1c\x8d\x46\x0d\x1c\xbb\x22\x31\x1d\xf5\x44\x9c\x8c\x86\x0c\xcc\x1c\xde\x88\xd3\x91\x70\x81\xb3\xd1\xa8\x85\xf5\x70\x60\x20\xc1\x47\x62\x2f\x2e\x46\x43\x92\x4a\x2d\x9c\xdd\xc4\x4e\xbf\xc2\x64\x3c\xb4\xf8\x8e\xc8\x81\x83\x11\xb7\xc6\xe1\x68\x6c\xc1\x91\xd3\x81\x71\x3c\x1a\xdb\x30\x1d\x09\x3e\x38\x19\xf5\x40\xcc\x46\xc2\x00\x4e\x47\x63\x20\xce\x46\x43\x01\xce\x47\xe3\x11\xe6\x8e\x60\x87\x8b\x6e\x34\xda\x25\x7f\xa0\x9e\x24\x69\x8e\x2d\x75\xf6\x89\xbd\xc0\x92\x4a\xd4\x4c\x1b\x9e\xfb\x2d\x86\xc0\x6c\x88\x81\xdd\x88\xc2\xae\x44\xcc\x39\x44\x93\x1c\x9b\xc8\xc7\x5e\x27\xfd\xb3\x8f\x9f\xf5\x8a\x8a\x39\x83\x68\x75\x6b\xce\x1f\xe4\x73\x73\xee\xd0\x8a\xcf\xb6\x82\xd2\x8a\xc7\x80\x23\xd7\xbc\xd4\x92\x39\xd4\xe6\x6d\xce\x1d\x5a\x05\x5b\xfa\xef\xd4\x2f\xa6\xf6\xee\x11\x3a\xc6\xbc\x4f\xc7\x04\x10\x50\xb7\x8a\x43\x3a\xd6\x85\x88\x5a\xed\x27\xa6\x63\xc6\x47\xa9\x4b\x7e\x49\x97\xb8\x2d\x89\x70\x58\x47\x4a\x5d\xda\xcb\xe8\x98\xf5\xe5\xd4\x6d\xbf\x9c\xba\xdd\xaf\xa0\x63\x1e\x82\xbd\x11\x17\xc1\x78\xc4\x0b\x31\x19\x75\x43\xec\xbb\x46\x0a\xa7\x85\xe3\x70\xd4\x45\x70\xe4\x8d\xe9\x09\xc7\xa3\x91\x0c\xd3\x51\x6f\xc1\xc9\x68\xb8\xc0\x6c\x34\xe0\xe1\x74\x24\x66\xe2\x6c\x34\x6e\xe0\x7c\x24\x2c\x61\xee\x88\x4b\xb8\x70\x86\x0d\x99\x3d\xb8\xfb\x80\x47\xfd\x12\x13\xbb\x63\x62\x7f\xc4\xed\x71\x30\x62\xf8\x38\x1c\xf5\x1d\x1c\x8d\x47\xb7\xd8\x11\xde\x30\x1d\x77\x9e\xc4\x19\x3f\x30\x1b\x8d\x7f\x38\x1d\x0d\xa2\x38\x73\x06\x11\x9c\x8f\x46\x29\xcc\x47\xc2\x14\x2e\xba\x71\x64\xb7\xe4\xc1\x18\x53\x6a\x7e\x6d\x2b\x24\x0d\x37\xc6\x94\xe1\xbe\xb6\x5d\xc3\x98\x31\x28\x00\x98\x4f\x31\xe6\x0d\x4d\xce\x67\x78\x1e\xd5\x08\x6c\x00\x71\xcb\xa0\xe1\xa9\xae\x73\x5b\xca\xd0\xf2\x67\xc9\x19\xda\x1e\x1a\x28\xa4\x2d\x83\x66\x16\xb2\x0e\x80\x69\xe0\xb0\xfa\x1e\xd7\x95\x63\x40\x5d\x74\x84\x63\x9e\x73\x70\xb5\xc7\x74\x44\xb8\x84\x7a\x36\xc3\xf1\xa9\xdb\x70\x02\xea\x32\x9c\x90\x8e\xd8\x45\x44\x47\xa4\x16\xd3\x11\xd3\xa3\x74\x44\xb5\x09\xb5\xc9\x9d\xd1\x11\x9d\xa6\xd4\x6d\xb5\x19\x1d\xb1\x9a\x9c\x8e\x68\x8e\x53\xb7\xe1\x16\xd4\x65\xf6\xd8\x73\xba\x2d\xc6\x9e\x55\xaf\x98\x8c\xf9\x34\xf6\xc7\x7c\x12\x07\x23\x5e\x8d\xc3\x31\xa7\xc0\xd1\x58\xe4\xc0\xf1\x88\x6f\x37\xe3\x9e\x55\x8d\x38\x19\x73\x20\xcc\x46\xe2\x23\x4e\xc7\x22\x08\xce\x9c\x11\x0a\xe7\x63\x11\x06\x73\xfb\xe0\x5c\x8c\x44\x08\xc8\x0f\xdc\xba\xc2\x23\x96\x86\xc9\x88\xa7\x63\x7f\xcc\x99\x71\x30\xe6\xac\x38\x1c\x0b\x55\x91\x3d\x14\xe1\x78\x2c\x58\x60\xea\x76\x97\x64\xcc\xe1\x31\xb3\x06\x0b\x9c\x8e\xf9\x32\xce\x46\xc2\x05\xce\x9d\xc1\x12\xf3\xb1\x50\x86\x8b\x5e\xc0\xd9\x25\x2b\x50\x6c\x53\x53\x14\xa9\x71\x9a\xf2\x02\xd9\x96\x98\xfb\xec\xb7\xcf\x89\x09\x77\xd0\x4a\xc4\x88\x3f\xd4\xfb\x63\xca\x0a\x9a\xa7\x43\xdc\x71\xc7\xa0\xad\xa3\xa2\x31\x1b\xd0\x98\x1a\x22\x66\x35\x59\x23\xcb\xa9\x32\x50\x53\x06\xa0\xc9\x6a\xf8\x3c\xd7\xd0\x0e\x9f\xf2\xa6\xaf\xc3\x67\x45\x47\xca\xa6\x9e\x3a\x95\x84\xa9\x5b\x49\x84\x5a\x7a\xe4\x53\x97\x76\x02\xea\xea\x4f\x48\xdd\x56\x17\x51\xb7\x65\xc4\xd4\x2e\x0f\x4a\x5d\x76\x91\x50\xbb\x3d\x33\xea\x56\x7d\x4a\xdd\x3a\xcc\xa8\xc5\xa6\x72\xea\x56\x11\xa7\x2e\x9b\x2a\xa8\xdb\x94\xb1\x37\xe2\x47\x18\x8f\x18\x1f\x26\x23\x9e\x8a\x7d\x87\x01\xe2\xc0\xe9\xa7\x38\x1c\x71\x45\x1c\x79\x23\x31\x28\x76\xfa\x5c\x93\xc1\x5a\x78\x4f\xac\x51\x9b\xd9\xbc\x15\xa7\x23\xa1\x0d\x67\x8e\xb8\x88\xf3\x91\x18\x82\xf9\x88\xcf\xe2\xc2\x19\xdc\xc4\x88\x6e\x61\x1c\x3b\x4d\x09\x13\xa7\xd3\x62\x7f\xc4\x2f\x71\x30\xe2\x98\x38\x74\x78\x26\x8e\x46\x62\x0d\x8e\x47\x83\xd5\x88\x27\xe1\x64\xc4\x47\x31\x73\x04\x00\x9c\x3a\xa3\x16\xce\x9c\xa1\x05\xe7\x36\xff\xc7\x7c\xcc\x85\x8b\x6e\xe8\xd9\x7d\xe8\x36\xd8\x48\xcd\x6a\xe0\x61\xc3\xd0\xad\x52\x0d\xc3\xa0\xad\x90\x9a\x9a\x05\x4d\x92\x63\x7a\x1a\x5a\xba\x1f\x49\x94\x86\x31\xba\x4d\x99\x86\x4f\xa9\xd6\x01\xd3\x30\xdd\xf4\x7d\xd8\x94\x69\x46\x3e\x7c\x9a\x6a\x9d\x30\xbd\xaa\x6b\x79\x9c\x61\x98\x96\x72\x1b\x62\xe5\xad\xdc\x4c\x2f\xe9\x5a\xe6\x3b\xec\xa9\x4b\x0c\x98\x9a\x85\x4a\xa8\x4b\xbf\x3e\x75\xf5\x31\xa0\x0e\xc3\x09\xa9\x4b\x78\x11\x75\xf5\x24\xa6\x36\xf1\x50\xea\x30\xab\x84\xba\x54\xcd\xa8\x4b\x23\x29\x75\x18\x42\x46\x6d\x66\x9e\x53\x97\x25\x73\x6a\xb6\xd8\x82\x3a\x94\x8c\x3d\xa7\x96\x31\x76\xba\x2b\x71\xfa\x2b\xf6\x9d\xbe\x82\x03\x97\x3b\xe0\xd0\xe9\x4a\x38\x72\x3a\x04\x8e\x5d\x11\x41\x8d\x37\xc6\x47\x89\x33\x5a\x60\xe6\xf2\x18\x9c\x5a\x82\x06\xce\x6c\x41\x36\x77\x7a\x2e\xe6\xce\xa0\x80\x0b\x6b\x44\xc4\x9e\x53\xeb\xd8\xe9\x88\x98\xb8\xbd\xdb\xb7\x58\x1a\x0e\x9c\x8e\x86\x43\x97\x0b\xe3\xc8\xea\x87\x38\x76\x46\x06\x4c\x9d\xde\x8f\x13\xa7\x2f\x62\x66\x09\x56\x38\x75\xba\x1b\xce\x5c\xd1\x01\xe7\x56\x2f\xc6\xdc\x19\x39\x70\xa1\x05\x87\x5d\xc6\x54\x2a\x06\x78\x62\x40\xd8\x08\x67\x18\x8f\xef\xb7\x8b\x1b\xc3\x70\x2c\xdb\x0d\x03\xb1\xc2\x67\x78\x14\x4a\x7c\xc4\xc8\x47\xd4\x3c\x34\x05\x61\xc5\x89\x79\x9c\xa1\x9e\x99\xff\xa4\xe9\xb7\x29\x04\x4b\x3e\x4d\x8f\xd2\x06\xa9\x81\xcf\xec\xbe\x3c\xec\x31\x0c\xbf\x66\x3b\xe1\x8d\x10\x0d\x6d\x0a\xc5\x84\xe1\x51\xbd\xa8\x64\xed\xb9\x7c\x8c\x5d\x32\x55\x30\xc4\xa5\x7f\x05\xe3\xbb\x74\xad\x7e\x0f\x5c\xc2\x56\x30\xa1\x5d\xac\x0a\x22\x1a\xed\x73\x6c\x31\x2d\xf5\x98\xba\x24\xaa\x60\x12\x9b\x96\xd4\x73\x66\xb7\x52\x05\x91\xba\xec\x51\xc1\x64\x66\x95\xab\xa7\xb9\xcb\x8c\x14\x0c\x77\x99\xa8\x82\x29\xec\x1e\x5a\x67\xc4\x46\xc7\xc6\xae\x1e\x60\x62\x11\x32\xf6\x6d\x16\x87\x03\x17\xb3\x38\x74\xa9\x05\x47\x2e\x61\xe0\xd8\xd1\x45\x5b\xfc\x4d\xec\x2a\xc4\xcc\x65\xa9\x38\x75\xc6\xc3\xcc\xe5\x51\x38\xb7\xdb\x37\xe6\x36\xa3\xc3\xc5\xb8\x77\xb5\x2f\x37\x56\x08\xec\x8e\x05\x98\x8c\x1b\x1c\xf6\xc7\xbc\x0f\x07\x4e\xef\xc3\xe1\x78\x10\xa8\x95\xed\xec\x6e\x3c\x1e\x94\x30\x1d\x0f\x6e\x38\x19\x8f\x06\xb5\x39\xb8\xbc\x4c\x1a\x85\xf5\x69\x36\x16\xd6\xa4\x61\x38\xf8\xe4\x63\x11\xa7\x36\x12\xa0\xa2\x8d\xec\xf2\xa3\x5e\xd7\xe0\x19\x5b\xbf\x5f\xa3\x6a\xc6\x2a\xb4\xe6\x73\x9e\x55\x50\x8f\xe8\xd5\x77\xcf\x5f\xa3\x72\x71\x51\x5f\x13\xd1\x54\x34\x78\xf6\xed\xab\xde\xc5\xc5\xed\xc1\xc4\x29\x6a\x37\xfe\xc3\x05\x8a\xea\x0b\x7c\x56\x5f\xa6\x7a\x43\x4f\xfd\x2a\x01\xe4\x97\xfa\xb3\xf8\x32\xd5\xfa\xd3\xe7\x5c\xab\xaa\xf4\xfd\xa3\x57\xb2\x30\x16\x92\x85\x5f\xdc\x77\x54\x09\xe8\xe6\x82\x2a\xf9\x45\xab\x92\x72\xd3\x2b\xaa\xdc\xa5\xf5\xde\xf3\xeb\xa6\x04\xd8\x7b\x7e\x6d\x28\x7d\xf7\x9e\x5f\xd7\x75\xf5\xde\xf3\x6b\x73\x59\x3d\x41\x43\xaa\x28\x8c\x50\x5a\x56\x6b\xc4\xb2\x6c\xb9\xca\xcb\xc5\x19\xaa\x96\xe8\xc5\x09\x36\xe2\xfd\xae\x84\x52\x40\x6f\xfa\x35\x90\x4d\x77\x87\x84\x91\xfd\xee\x90\x16\xdd\x8b\xa5\x40\xf8\xe2\x04\xbf\x29\xdf\xa2\x03\x84\x0d\x35\x4a\x15\x5d\x59\x9e\x7f\x52\xf7\xee\x4d\xdb\x5e\x95\xe3\x13\xff\x99\xf8\x18\x1d\x68\xa8\xa1\x0e\xdf\x1e\xba\x3b\x40\x6c\x28\x58\xfa\xed\x7a\xcd\xcf\xd3\x39\x47\x38\x42\xeb\xcb\xf4\x3d\xbf\x36\x88\x7f\x7d\x99\xfe\xc8\xaf\xd7\x8d\x0a\xda\xef\x76\xa1\x2c\x5e\x01\x90\x14\x4d\xfd\xe5\x21\xc2\x51\xf3\xcd\x7e\xc5\xca\x09\x54\x9c\x52\xfc\x98\x05\xb9\xae\xb1\x2b\x5e\xde\x28\xa4\x6f\x15\x53\x46\xbc\xee\xab\x5b\xd2\xb2\x7a\x05\x55\x51\x8e\xb5\x22\x28\x0d\x5e\x1b\x4a\x69\x50\x01\x35\x1a\x14\x19\xb6\x31\x59\x0d\x09\xec\x56\xd3\xa5\x53\xac\x96\xe7\x10\x60\xe6\xbc\xa8\x10\xa1\xe0\x19\x82\xb2\xb9\xa1\x14\xce\x9b\x49\x89\x8e\xe4\xdd\x10\x1e\x14\x70\xac\x8d\x6b\x32\x79\x71\x42\x94\x0d\xee\xa1\xfd\x46\x02\x7b\xe8\x4f\x88\xd0\xb7\x50\xe3\x11\x6c\xab\x44\x7f\x82\x3b\x2e\xb6\x66\x6f\x55\x9e\xcd\xb6\xe7\x2f\x80\xf2\x9d\x2d\x93\x7b\x1d\x2e\x09\x85\xc7\x92\x57\xb4\x8f\x48\x60\x61\x78\xcf\xc0\xf1\x80\xac\xa9\xb2\xbf\xe8\x40\xb9\xc8\x38\xe2\x2c\x9b\x29\xb3\x43\xe5\x1a\xb1\x8b\x8b\x79\xc9\x73\xa1\x4b\xb6\x40\x7c\x73\xc1\x16\x39\xcf\xeb\xba\x8c\x10\xde\xa7\x46\x6c\x42\x04\x0a\x4d\xc6\x16\x28\xe5\x28\x5d\x2d\xdf\xf3\x05\x2a\x17\xd5\x12\x51\x59\x14\x78\x8d\xd6\x19\x9b\x4b\xf4\x12\xe5\xda\x8c\xed\x6a\x56\x66\x33\xc4\xe6\xf3\xe5\xd5\x1a\x50\x0b\xbc\xd5\x52\xa0\xbd\x5c\xf3\x1c\x5d\x95\xd5\x6c\x79\x59\x49\x06\xd7\xe5\x72\x31\xc4\xa2\x04\x0d\xe5\x35\x27\xed\x97\x87\x0f\xd5\xb5\x32\xed\x4f\x22\xa0\xf8\xd8\x24\xb9\x8e\xe5\x62\x69\xb9\xb1\xdb\x70\x15\x5a\x08\x62\xed\x67\x88\x59\x93\x52\x2a\xf1\x6b\x24\xb4\xef\x9b\x55\x65\xeb\x47\xac\xf7\x23\x7e\xab\x0a\x7b\xfe\xaa\xff\x04\x97\x02\x0c\xae\xda\x31\x44\xc0\x13\x59\xf8\x12\x95\x8b\x0f\x7c\xb5\xe6\xf6\x28\x58\x2e\x3e\xbc\xea\x05\xc2\xce\x4f\x5b\x0d\x10\xd8\x31\x40\xb4\xd8\x74\x89\xad\xdf\xe0\x50\x18\x74\x1f\xfb\xc7\xce\x84\x43\xfb\x85\x2f\xb2\xd5\xf5\x45\xb5\xc3\x55\x80\xaa\x62\xed\xf2\xa4\x69\xd7\x02\x4f\xbb\x21\xdf\x5a\x42\x37\xe7\x9f\x83\x6a\x2b\x11\x57\xed\xde\x13\x37\xe5\x69\x2d\x48\x53\xd2\xf1\x1f\xbc\xd2\xf3\xb4\x2e\x73\x73\x40\xaa\x5d\x8d\xd5\xd7\x81\x04\x5b\xf5\xc1\xe0\xe6\x2c\x43\xf6\xf1\xc3\xa2\xac\x4a\x36\xd7\x4b\x5f\x75\x61\xf8\x26\x9b\xb1\xc5\x19\x7f\xfa\xb2\x2d\x8b\x2a\x2b\x8f\x79\x1b\xaf\x90\xff\xeb\x9b\xb4\xb9\x8d\xbc\x9f\x1a\xde\x58\x8b\xc2\xda\xe6\xe5\x53\xbd\x0d\x01\x3a\xbe\xfa\xdb\xae\x0d\x95\xbc\x79\x45\x21\xfe\xbf\x25\x6f\xd0\x26\x54\x7f\xc6\xca\xb4\xae\xab\xda\x64\xf9\x30\xf0\x28\xf9\x51\x7a\x15\x7c\x1e\xbf\xb6\xcd\x30\x12\x19\xf3\x09\x40\x67\xbb\xf6\xa2\x31\x0c\xdd\x4e\x2c\xb0\xab\x2e\xec\x4a\xc1\x1a\x99\x7c\xcc\xcb\x75\xc5\xe7\x8d\x15\x9b\x31\x16\xd0\xf9\xed\x52\x0b\xea\x0e\xd0\x85\x18\x68\x65\xa9\xb5\x37\xe5\xdb\x37\x93\x89\xe2\xf6\x5d\x1b\xae\x45\x22\xd9\xbc\xba\xc0\x77\x28\xab\x6d\x12\x8d\x21\x60\xf7\x1c\x69\x65\x93\x54\xcf\x93\xe6\x35\x1b\xc5\x78\x00\xff\xf3\x22\x5f\xa2\xf5\x15\xbb\x90\xe9\xc7\x9c\xad\x2b\x69\x0c\xc3\x10\x5e\xb9\x55\xd6\x63\xb6\xab\x30\x97\xe3\x57\x06\x1b\x86\x8a\xe2\xbb\xba\xfa\xc0\x35\x6e\xcd\x05\x6f\xe2\xea\x37\x09\x29\x23\xa1\xcb\xf0\x46\x56\xa1\xe5\x65\x35\x88\xc0\x4d\xc8\x75\xab\xac\x13\x72\xed\x3a\xeb\x0c\x19\xef\xf9\xb5\x2c\x01\x1d\x05\x47\x3e\xd1\x9f\x94\x1f\x2c\x0f\xb4\xba\xd1\x91\xb1\x6a\xf4\x11\x7a\x25\x2c\x50\xbd\x04\xac\x96\xeb\x75\x9b\xa6\x43\xcd\x43\x48\x88\xe1\xb5\x54\xb6\x68\x06\xaa\x56\x70\x93\x7a\xbc\x3a\x67\xeb\xf7\x1d\x97\xad\x6d\x77\x32\xe9\x98\xa8\x70\xc4\x7a\x74\x7d\xd7\xe9\xba\x70\x5a\x81\x45\x13\x41\xc7\x64\xdf\x81\xcd\x7e\x65\x34\x7c\xf1\x4c\x64\x54\x12\xb3\x82\xaa\xfd\x6e\xc0\xf6\xcb\xa7\xdb\xb3\xbd\xb2\xb3\x3d\x77\xb3\x3d\x77\xb0\xbd\xda\x82\x6d\x67\x11\xe9\x75\x5d\x45\x5a\x4e\x7f\x6c\x57\x47\x7a\xac\x08\xb3\xc4\x55\xf1\x4d\xa5\x97\x62\xfe\xfe\xd1\xab\x43\x95\xa0\x75\x6a\x31\x4f\x51\x56\x9c\x19\x8a\x6b\x5f\xcc\x99\x60\x62\x53\xa1\x3e\x16\x95\x70\x4d\x5a\x3a\x26\x44\x4d\x65\xe7\xe1\x44\x4d\xb7\xe8\xf6\xf7\x8f\x5e\x19\x2b\x6e\x9f\xae\xca\x8b\x39\x3f\xd8\x6d\x8a\x48\x36\xea\x4c\x14\xe9\x3f\xfd\x7e\xa6\x8b\xd4\x44\x84\x60\xbb\x84\x0a\xa5\x59\xff\x7a\x20\x95\xc5\xf2\x35\x46\xc7\x02\xee\x50\x4a\xf5\x91\xd4\xf1\x72\x35\x69\xef\x59\x57\x17\xc7\xd7\xa4\x0f\xd7\xf3\x32\xe3\x13\x6f\x8a\xc8\xde\xe0\x2e\x8c\x06\x2d\xb9\x21\x5a\x32\x45\x81\x03\xad\x7f\x43\xb4\xc1\x14\x45\x7b\xf6\x8b\x34\x6e\xfc\xee\xc1\xd7\xf8\x50\x6f\xac\xb5\xb0\x4a\xe6\x50\x7f\xe7\xd8\xa2\x81\xbf\x05\x85\xdb\x79\xa7\x11\xb4\x76\x64\x8e\xec\xda\x7d\xbc\x05\x05\xf3\xa8\x87\x13\x72\x6b\xc3\xde\x3f\x49\x58\x6d\xa2\xcb\x2d\x04\xd7\x16\xd7\x8e\x21\xd6\x16\xe2\xba\x81\xb6\x81\x72\xd6\xcf\x6f\xa0\x7a\x25\xf4\xb5\xc2\xec\xf7\x43\x32\xed\x55\xd5\xd7\x8a\xbb\xdf\x0f\x83\x69\x5b\xd5\xfd\x7e\x18\x4d\x55\xb1\xf7\xfb\x11\xfe\xf8\x76\x4a\x83\x4f\x2a\xb8\xff\x5b\x56\xda\xff\x6c\xf5\xf0\xff\x7b\x2a\xdb\xc3\x4d\x05\xe5\x82\xe7\xb7\x5b\xe2\xfe\x3b\xb6\xe6\x6d\xd5\x7a\xb6\xe6\xda\xb3\xd7\x3e\x71\x56\xc0\x1f\xfa\xf2\x26\x0a\xd0\x82\x9d\xf3\xf5\x85\xee\xa5\x47\x3a\x1b\x02\x44\xb0\x21\xff\xfb\xf7\x8f\x26\x34\xdf\xa2\x28\x68\xae\xb0\x31\xa1\x79\x1d\x05\x82\x0f\x60\x6a\x13\x05\x87\xea\x8b\xe0\xdf\x90\x19\xb4\xa8\x25\x7a\x35\x9d\x52\xfe\x8d\xaf\x11\x43\x0b\x7e\x35\xbf\x46\xd2\xd7\x72\x13\x61\x3d\xa0\xa0\xce\x6d\x1e\x8b\xcb\xf3\x94\xaf\x3e\x22\xb8\x55\x0a\x6e\x55\x11\x1f\x7c\x02\xe9\xfc\xa1\xb3\xc9\x7c\x79\x05\x2d\xc4\x7f\x4d\x0d\xba\x8d\xbb\xd1\x6d\x08\x50\xcb\x65\xd3\xca\xa5\x8e\x08\xb5\x78\xea\x81\x59\xae\xfe\x79\xc4\xf3\xe1\xad\x2c\xf0\x42\x2f\xf2\xba\xf3\x9d\xb5\xa4\x21\xc4\x2f\xca\x4e\x46\x25\x7a\x38\x15\x5c\x9b\xc7\x30\x75\xbf\x96\xe1\x56\x4f\x78\x2c\x7a\x7b\x8c\xba\xb7\x6f\xeb\x6f\xe6\x7d\x4d\x7d\x57\x56\x57\xe5\x9a\xa3\x9f\x9e\x9f\xae\x01\xc3\x98\x62\xea\x8b\x52\x94\x81\x7c\x44\xdf\x0a\xfd\x0a\xb9\x1c\x80\x60\xd4\x48\xc2\x8a\x8a\xaf\xd0\x82\x9f\xb1\xaa\x5c\x9c\xdd\x82\xe0\x01\x15\x17\x82\x57\x2a\x38\x5c\x2c\xab\x89\x55\xaa\x47\x47\x68\xb1\x1c\xcd\x54\xe1\x4e\x16\x29\xd0\x7f\x34\xd2\x7d\x60\x04\x93\x82\xfd\x47\x2d\x64\x43\x4a\xaa\x24\xa3\x04\x53\x5b\x43\xab\xce\x07\x1d\xee\x3a\x19\x80\x4d\x2b\xdf\xfe\xf4\xbd\xa6\x15\x58\x4e\x80\x71\xfb\x82\xad\x61\x79\x61\x2b\x1f\x6a\x34\x05\x38\x84\x4b\x34\xca\xaa\x96\x82\x44\x8d\xf7\x96\x95\xff\xed\x4f\xdf\xdf\x8e\xea\xe5\xda\x4e\xab\x78\xb6\xc8\x27\x6c\xb1\xac\x66\x7c\xa5\x18\x71\x99\x01\x5b\xe4\xba\x19\x88\x1e\x8e\x98\x42\xeb\x67\x77\xa5\x40\xc6\xac\xa2\xf1\x3c\x05\xff\x9b\xd9\xc7\xf3\x97\x9f\xdb\x3c\x9e\xbf\xfc\x4c\xd6\xf1\xfc\xe5\xed\x18\xc7\x72\xd5\xb1\x8d\xe5\x6a\x07\xd3\x58\xae\x6e\x6c\x19\xbf\xee\x68\x19\xbf\xfe\xc6\x96\xf1\xfa\xf3\x9b\xc6\xeb\xcf\x66\x1b\xaf\x6f\xcb\x38\x36\x3d\xeb\xd8\xec\x64\x1e\x9b\x4f\xb0\x8f\x77\x3b\xda\xc7\xbb\xdf\xc8\x3e\x60\x51\x5e\xb7\x8c\x85\x9c\x19\x55\x2f\x84\x73\x5e\x54\xdb\x67\x65\x0b\xb0\x09\xf9\x0d\x2d\x8b\x06\x13\x5c\x61\x73\x5b\xc6\x00\xc8\x6e\xc7\x1c\x00\x55\xc7\x20\xe0\x97\xa7\x13\x12\xba\xec\x40\x02\xe9\xa6\xb0\x30\xd9\x81\x78\x05\x5a\xa0\x87\xc8\x27\xb6\x95\x2e\xcd\x52\x26\xad\xa9\x3c\x7c\x88\x16\xb0\x44\xde\x18\x83\xdc\x3a\x44\xd0\x01\x5a\x18\x2f\xab\x37\x9b\x90\xc0\x33\xb4\xb5\x8f\xa8\x7e\x79\x72\x33\xa4\xa3\x99\x2c\xd0\x81\xe1\xc6\xd0\x01\xe9\xfe\x52\x97\x20\xf7\xdf\x69\xbd\x30\x95\xff\x6f\x67\xbe\x2f\x27\xf6\x97\x8b\xda\x7a\x5f\xde\x92\xf5\x4a\xbd\x77\x2d\x55\x33\xde\xda\x9e\xb7\x30\xde\x41\xc4\x04\x54\x37\xb0\x5f\xcd\x0b\x1a\x3c\xe3\x06\xac\xc8\xff\xe6\x16\xfc\x72\x59\xb1\x8a\x7f\xee\x00\xbc\x02\x2a\xb7\x65\xc2\x80\xed\x76\x4c\x58\x32\xa6\x9b\xf0\x6a\x39\x1a\x7f\x05\xc8\xa8\xfd\xaa\x1e\x81\x1d\xa8\xa8\xbe\xd8\x13\xe9\x60\xfb\xcb\xcb\x49\x14\x0c\xcc\xf2\x53\x15\x76\x4b\x31\xe7\xf7\xa5\xb1\x91\x90\x23\x20\x76\x57\xd8\xcb\x81\xc2\x9e\xde\x44\x61\xdf\xe6\xf9\xe7\xce\x7c\x59\x9e\x7f\xa6\xcc\x57\x5e\xf9\x7d\x1b\xef\xcc\x79\xef\x9d\x39\xdf\xe9\x9d\x39\xdf\xfa\x9d\xb9\x3f\x22\xec\x37\x89\x2c\x6c\x18\x35\x27\xbf\x19\x5b\xad\xae\x45\xb3\x7a\x0c\x91\x17\xc3\x77\x86\x95\xf6\x7a\x78\x33\x8e\x61\x22\xb5\xdf\xe6\xdc\x68\x5f\xd2\x50\x3c\x7c\x6a\x44\x97\xdf\xcc\xab\x2b\xdf\x2e\xd4\x15\xe0\xcb\x42\x9f\xdb\x5c\x9b\x6e\x38\x5e\x2d\x2f\xf8\xaa\xba\x46\x7f\x57\x57\x0c\x03\x20\x98\x57\x83\x62\x30\xad\xa8\x0c\x64\x7d\x68\xc2\x53\x87\x95\xe6\x4e\xf4\x6e\x74\x59\x97\x67\x8b\xb2\x28\x33\xb6\xa8\x50\x0a\xcf\xcb\x85\xe6\x1b\x40\xd4\x31\xfb\xdb\xce\x4b\xd7\xcc\xd4\xbf\xdc\xc2\x3c\xf0\x90\x03\xbb\x3b\x76\xc4\x35\x79\x7e\x21\xcc\x92\xcd\xf7\x3a\xb2\x1f\x15\x1c\x32\x06\xe4\x46\x72\x1a\xda\xad\x84\xc8\xbb\x6a\xfe\x04\x5f\xbd\xd2\x45\xdd\xef\x45\x67\xcd\xb7\xeb\xb3\x9f\x88\xec\xcd\xa0\xbd\xf8\xdb\x75\x5a\x7b\xba\x2b\x16\x4c\x71\x82\x19\x4e\xe1\x4c\x4d\x86\x73\xcc\x71\xb1\x37\x40\xf2\xf6\xdf\xa8\xab\x53\x84\xbd\xad\x97\x07\xc0\xe8\xa6\x8d\xd9\x0e\xc2\xf2\x95\xda\x3c\x01\x61\xb1\xfe\x22\xff\xfb\xeb\xaf\x86\x03\x18\x22\xef\x6f\x7c\xe0\x0f\xc7\x68\xb8\x0a\xa6\xff\xc9\xb1\xb9\x06\x3f\x6e\xd8\xe8\xef\x05\xb4\x26\xed\x7d\x04\xd2\x87\xe6\x7c\x71\x56\xcd\xd0\xd7\x88\x6e\xb9\x95\xba\x1f\x68\x4e\x96\x8b\x0f\x7c\x55\xbf\x1a\x6a\x61\x58\xc5\x07\x31\x68\xd7\xa7\x03\xb6\x0a\x3c\xf5\xa8\xdd\x68\xb7\xb3\x32\xf7\x11\x9d\x76\x83\xe8\xbd\x35\xca\x59\xc5\x10\x5b\xef\x48\x67\xeb\x99\xac\xee\x4a\xe1\x46\x0b\xd0\x87\xd5\xf2\xb5\x4f\xec\x4b\x21\xf0\xf8\x13\xf6\xec\x28\x5a\x5d\xa3\x32\xec\xdc\xa9\xe1\x9e\x4a\x65\x36\x4c\xd6\xea\x35\xed\xe2\x91\x6a\x33\xe0\x92\xdd\xdd\x7a\xf3\x7e\x97\xb6\xfb\xa4\x57\xbb\x84\x57\xb7\x7a\x33\xd8\xc2\x2f\xfe\x6a\x1e\x0e\x2f\x2e\xd7\xb3\x49\x9d\x48\x89\x1c\xc1\xf4\x5e\x69\x86\xee\xe5\x12\xc8\xb0\x4f\xb6\x4e\x45\x34\x05\xd7\x11\xa4\xc6\x39\xed\xba\x8d\x75\x23\xc9\xc0\x2b\x00\x8d\x30\xc9\x6c\x79\x01\x83\xa4\x65\xec\x47\xa3\x69\x6b\x63\xf6\x1c\x65\xf3\xe5\xc2\xf5\xa6\xb2\xad\x49\x03\x9e\xbe\x2d\xc3\x8f\x76\x5b\x86\xc7\x4e\x5b\xd6\x31\x43\x96\x22\xd9\x6d\x76\xbe\x9a\x76\xba\x9e\x00\xfc\x1f\xc1\xb0\xff\x28\x25\x33\x44\x5a\xc7\x52\x89\x6f\x18\x66\xeb\x5d\x63\x76\x02\x70\x86\xa9\x5e\x58\x97\xc9\x89\x85\x4c\xe3\x42\x57\x1d\xff\x19\x75\x83\xab\x6d\x7c\xe0\x4a\x99\x7c\x8d\xfe\x4d\xf9\xd6\x24\x76\xbb\xa9\x02\x70\x67\x7d\xb9\x49\x8f\xad\xfb\x66\x7a\xbb\x65\xd4\xd6\x98\x8f\x6f\xa7\x34\xdc\x66\xbf\xcb\xd1\xd7\x7f\x40\xb3\xaa\xba\x58\xdf\x3f\x3a\x3a\xaf\x66\xeb\xc3\x94\x1f\x5d\x56\x05\xfd\x65\x8d\x3e\x90\x43\x7c\x48\x50\x7a\x8d\xfe\xe7\x39\xab\x66\x25\x5b\x0b\x8b\x69\x37\xc8\xc0\xae\x10\xb9\xd9\xe3\xe8\x08\x7d\xcf\x2b\x79\x1c\x8e\x73\x21\xee\x92\xa5\x73\xbe\x46\x7f\x55\x94\xfe\x7a\xe7\x2b\xd8\xc6\xbf\xe2\xfc\x51\xb3\xff\x65\xb0\x93\x06\xdd\x93\xca\xbb\x87\xee\xde\xad\x7f\x7e\x60\x47\x8f\xfe\x2a\xbb\xa3\x21\x7f\x06\x3f\xb4\xb8\xcf\xd5\xf7\x2e\x6a\xf5\xeb\xdd\xbb\x86\xfd\x39\xc7\x1d\x26\x1b\x60\x27\x1b\x67\xb0\x73\xe6\xaf\x53\xb9\x1b\xff\xa7\x65\xce\x0f\x7f\x59\xa3\xe5\x0a\x7d\x27\xb7\xd2\x94\x45\xc9\x73\x94\x2d\x73\x3e\x05\x2c\x6c\x91\xa3\xcb\x35\x47\x65\x25\xc6\xb5\xbf\x0a\x39\x6a\x7d\x50\xfb\x70\x9a\x3e\x9c\xa9\xef\xdd\x3e\xc8\x5f\x1f\xc8\x3d\x49\x6d\xb3\xc3\x06\xfa\x58\x47\xf6\xeb\xaf\xda\xb7\xc3\xab\x72\x91\x8b\xb7\xcb\x0e\x8c\xdc\x3a\x24\x78\x41\xfa\xcf\xb0\xd9\xe7\xce\x57\x47\x5f\x1f\xdc\xda\xdf\xd7\x47\x77\x64\x6f\xd7\xd5\xaa\x5c\x9c\x3d\x5e\x2d\xcf\x4f\x66\x6c\x75\xb2\xcc\x85\xe6\x5e\xc1\x8f\x87\x85\xf6\xab\x12\xfe\x29\x7b\xcf\x17\x52\xc6\x7d\x93\xbd\xb8\x5c\x5c\x0b\xf9\xde\xf9\xaa\x89\x60\x97\xd9\x9a\xe4\x5c\xfc\x38\x91\x74\x64\x07\x61\x69\x13\x36\xdf\xd7\x43\x20\xfc\x94\x2d\x2f\x17\x15\x5f\xa9\x99\x4b\xf8\x69\x5e\xc7\x0a\xd9\xbc\x0d\x16\xf0\x14\xce\x33\xd6\x5f\xf8\xa6\x5a\x31\xf1\xe5\x6a\x56\xce\x39\x9a\xd4\xd8\x1e\x2a\x24\x92\xf4\x57\xd0\xa6\x45\x98\xa9\xee\x7d\x5b\xd5\x0d\xf6\xf7\x85\xab\x7f\x05\x3a\x95\xc0\xdf\x1c\x23\x6f\xf3\x3d\xf5\x3c\xa1\x73\xf9\xd3\x43\xf8\xe9\xbb\xc7\x8f\xc5\x4f\x16\x4a\x42\x5c\xf0\xba\xbe\xbe\x5c\xad\x96\x67\xac\xe2\x53\xb0\xba\x6a\xc6\x57\x1c\xce\x79\xa2\x05\xdf\x54\x48\xb0\xc0\xb2\x8a\xaf\xa0\x11\x74\x63\x1b\xfe\x80\xc1\x89\x04\xbf\x8b\xbc\xcd\xe3\x13\xcf\xdb\x13\x16\xea\x6d\xbe\x87\x8f\x7f\x17\xc1\x79\xbe\xbc\x6a\xe9\x43\xb3\xaf\xa4\xe4\xe5\x50\x3e\x51\x5d\x14\x08\xfc\xc7\x8f\xf7\xe0\x68\xa6\xb7\x87\xf6\x91\x86\x19\x1e\xec\xd7\x15\x87\x14\xf5\x36\x0b\x56\x5d\xbd\x5c\x9c\xb3\x2a\x9b\xf1\xbc\xa5\xf7\x00\x2d\x17\xf3\x6b\xc4\x2e\x2e\x38\xf4\xbb\x5c\x83\x03\xa2\xcb\x45\x59\x4d\xc5\x8b\x66\xc6\xd6\x1c\xde\x36\x85\x20\x1a\x4c\x0d\x8c\x10\x52\x55\xef\x8b\x6a\xb0\x8a\xa1\x9e\x69\x5f\x2f\x58\xb9\x1a\xf6\x0c\xfa\xa5\x78\xfd\x4a\x89\xee\xe0\x40\xf1\x7e\xa7\xdf\x01\x4b\x4b\x01\x28\xfe\xaf\xe2\xbd\x84\xaa\xbd\xf1\x26\xce\xc0\x17\xe0\x0c\x30\x0a\xb7\xbe\xd0\x58\xb9\xcc\x5b\xba\x46\x5e\x2e\x72\xbe\x41\xc7\xe8\x00\x1b\xcd\xbe\xf1\xa3\x7b\xf7\x34\xe3\xdf\xdf\x97\xcd\x2c\xc6\x0f\x74\xde\x00\xc8\xdb\xbe\xb1\x0b\x53\x7a\x2c\x34\x2e\x25\x23\x7f\x3d\x38\xae\xd5\xff\x40\x93\x17\xda\x3f\x36\xc4\x8f\x1a\xd1\x37\xdf\x20\xec\xd5\x06\x84\x7e\x55\x3e\xa4\x54\x52\x73\x22\x8d\x15\xfd\x8a\x3a\x76\xd8\x08\x7f\x0b\x42\x80\xd0\xa6\xa4\x46\xf8\xd9\x8c\x67\xef\x5f\x65\x6c\xce\x56\xff\x5b\xb4\x9a\x08\x3d\xbc\x58\x96\x0b\xb9\x9b\x1a\x04\xd0\xfc\xd4\xf5\xf8\xf6\x67\xe9\xf5\xad\x70\xaa\xd9\x6a\x79\x85\x1e\xad\x56\xcb\xd5\x04\x7a\x75\xef\xa9\x48\x85\x5a\xd3\xfc\xf3\xfe\x3d\xb4\xdf\x22\x38\xac\x96\x32\xb2\x4e\x70\xb4\x77\x58\x2d\xff\x7c\x71\xc1\x57\x27\x6c\xcd\x27\x7b\x68\x5f\x22\x10\x26\xbf\x58\x56\xc2\xc0\x81\x59\x29\x97\x7b\xe2\x61\xdd\xd1\x8f\x9f\x61\x24\x68\xe5\x04\x59\xb5\xc8\xc4\x5b\x71\x4c\xe5\x32\x9b\x1a\x9c\xa4\x94\x0d\xda\x98\xe8\x02\xfc\xa6\x6e\x23\x35\x0a\x53\x95\x1b\xea\xed\xf5\xf5\x22\x1d\xe2\xa4\x6e\x68\x52\x8b\x86\xf6\xae\x32\xce\xc7\x8f\xa9\x8a\x75\x2a\xcc\xe1\x83\xf4\xba\xe2\x68\xcd\xff\xeb\x92\x2f\x32\x08\x74\x76\x46\x5b\x1a\xb5\xe9\xc0\x40\x78\x7d\x9e\x2e\xe7\x8d\x23\xd9\x28\x53\xaf\x4b\x99\x0c\x29\x37\x98\xc6\x85\x14\x49\x01\x61\x25\xa0\x13\xaf\x61\xa9\xd9\x78\x6c\x60\x02\xc2\xb0\xce\x84\x3f\x64\xc2\x61\xf0\x0f\x76\x64\x12\x13\xc9\xa5\xa7\xb8\x7c\xe4\x75\x50\xec\x1f\x5b\xac\x26\xda\xa2\x33\x8f\xbc\x41\x67\x82\x4f\x92\x28\xa6\x8a\xd9\x58\x32\xfb\x78\x4b\x66\x31\xd9\xb5\x53\x2d\xa4\x89\xab\x6e\x47\xbb\x1e\xd0\xd8\x26\x60\xe8\xbb\x84\x48\xfd\xd5\x38\xd1\x4f\x9a\x1a\xa4\x22\x75\x1f\x26\x57\x83\xac\xa9\x85\x1f\x1d\x54\x1a\xd0\xfa\x07\xa1\x04\x19\xad\xb6\x1c\x5c\xda\x1e\xeb\x84\xf5\x51\x46\x43\xb9\x7f\xec\x70\xfd\x5e\x44\x6f\x9b\x7d\xae\x44\xb8\x91\xfd\x8a\xb3\xfc\x64\xb9\xa8\xca\xc5\x25\x1c\x9e\x05\xed\xb7\xa1\x48\x70\xf2\x03\xf4\xfd\x9b\x63\x60\xeb\x44\x24\x16\x86\xd1\xe0\xde\x0f\x8b\x0f\x6c\x5e\xe6\x00\x24\xa5\x7d\x4f\x75\xab\x91\x77\x97\x0a\x92\x08\x61\xa2\xe0\x4d\x43\xe7\xad\x72\x13\xd1\xb4\xf9\x71\x7f\x5f\x24\xe3\x75\x84\xea\xa1\xb9\x2b\xc3\x88\x4c\x04\x45\x94\xfc\xbb\x16\x0c\x8d\xd0\xfe\xe3\x86\xb1\xa3\x23\xf4\x43\x81\xae\x38\x12\xf9\xda\xe5\x05\x12\x99\xea\x14\x95\xd5\xff\xfb\x3f\xff\xb7\x1e\x96\x74\x14\xc0\xf1\x1d\x4b\xcf\x07\x80\xf7\x06\xc1\x5f\x5a\xef\x2b\xf0\x82\x49\x6b\xe5\x02\x18\xeb\x66\x48\xf4\x2f\xbe\xfe\x25\x30\x98\xef\x50\x57\x9f\xa0\xaa\x2e\xa6\xe3\xa1\xd6\x95\x64\x0b\x36\x87\xc3\x0f\x8d\x1c\x5f\x72\x96\xa3\xa2\x5c\xad\xab\x5a\x4a\xd0\xad\xdd\xd5\x3c\x1c\xdd\xd0\x64\xb1\x1c\x8a\x77\xbd\x57\xdb\x84\x24\x74\x57\xe9\x5f\x45\x56\x8d\xd7\x46\xbe\x35\xaf\xc3\x31\xac\x87\xe7\x51\x6d\x50\x27\x35\x2a\x50\x0b\x3a\xb6\x38\xcc\x83\x7e\x3c\xd0\x91\x61\xf9\x9a\x01\x35\x77\x1a\xed\x9a\x12\xb0\xc6\x7a\x5b\xf3\xd5\x62\x54\x37\x81\xdf\xc1\x04\xeb\xb4\x5e\xf6\xdd\xef\xcb\xf6\x9c\x5d\xa3\x72\x91\xcd\x2f\xe1\x25\x44\xbc\x5c\xe8\xaf\x34\x26\x29\x3f\xae\xa5\xf3\x68\x07\xe9\x80\x29\xdf\x4c\x80\x9e\x7a\x4f\x23\xb0\x37\x49\xd2\xd2\x05\xea\xdb\x04\xea\x41\xf2\x22\x05\x36\x96\x1f\x7c\x4e\x99\x0f\x47\xf8\xbe\x44\xa9\x92\xe8\xe3\xdb\x95\x28\x84\x8c\x1b\x0a\x3d\x06\xa1\x7b\x9b\xbe\xd8\xbd\x8d\x77\xb2\x87\x7e\x05\x89\x4c\x24\x0f\xf2\xd7\x46\x1f\x81\x55\x1f\xf0\x46\x65\x78\xc7\xc0\x9e\xfe\x0a\x66\xd6\x44\x2d\x4f\xa3\x16\xfe\x7c\xfa\xf8\x80\xa2\x1c\x66\xca\x78\xde\x44\xde\x3a\x6c\xaa\x13\x58\xcd\x77\x08\x68\xda\x77\x88\x3f\x0f\x7a\x39\x89\xca\x35\xda\xd1\x58\xf2\xd7\xe0\xeb\xa6\x24\x1a\x58\x1d\xd5\x80\x8a\x1e\x00\xb5\xa4\x44\x8b\xb1\xed\xec\x4f\x27\xdd\x69\xe7\x89\xaa\xf3\x0b\x2d\x1b\x99\x54\xe7\x17\xe8\xb8\x37\x96\xec\xa1\x3f\x1c\x1f\xcb\xa0\xdc\xcf\x4e\xd4\x22\x46\x75\x7e\xd1\xcf\x33\xb4\x17\xf4\x16\x7a\xef\x73\x4e\xbe\x09\xb1\xa2\x63\x60\xf0\xde\x07\xbe\x5a\x97\xcb\xc5\xbd\xfb\xe8\x1e\x4c\xfa\xde\x9b\x8a\x5f\x25\x3f\xf7\xee\x6b\x59\x21\xfc\x2e\xbb\xab\x7e\x97\x5f\xee\x7c\xf5\x51\x4d\xd2\xbd\x5a\x9e\x73\xf4\xed\xb3\xef\x51\x7a\x59\xce\x73\xb4\xbc\xa8\xca\xf3\xf2\x6f\x7c\xb5\x9e\xa2\x79\xf9\x9e\xa3\xd5\xe1\x2f\xeb\xa9\x7c\x25\x86\x99\xf6\xf5\x05\xcf\xca\xa2\xcc\x84\xf3\xe6\x25\x28\xfc\x82\x55\x15\x5f\x2d\xd6\x80\x0f\x1a\x55\x33\x8e\x8a\xe5\x7c\xbe\xbc\x2a\x17\x67\xf7\xe5\x9c\xa7\x30\xbf\xde\xb9\x48\x74\xaf\x36\x9a\x7b\x72\x72\xb7\x03\x70\xc8\xce\xf3\xde\x2c\x6a\x73\x44\x52\x3c\xbb\xf3\x95\x54\x97\x3a\x34\xd9\x4c\x73\x77\x07\x30\xd1\x67\xd0\x1d\x28\xa7\x7d\xbb\xe8\xcd\x1a\xff\x41\xfb\x7e\xb8\x58\xe6\xfc\xf4\xfa\x82\xb7\xc9\x5c\x3b\x57\xad\x5e\x3c\xca\x85\x3e\x6f\xfc\xb2\x5c\x9c\x2d\xff\xd7\x2b\xf4\xc1\x3b\xa4\x87\x1e\xbc\x9e\xb7\x2d\xb4\xb3\xa4\x0d\x33\x2a\x34\xd6\x98\xd8\xea\x6a\xc6\xe6\x3d\x4c\xf1\xa1\x77\x20\x27\x62\x56\xf5\xde\x28\x79\x8a\x51\xfd\x36\x63\xeb\xe7\x57\x8b\x17\xf5\x16\x98\x63\x05\x74\xd8\xfd\x1d\xc0\x9b\x25\x12\xa8\x1a\x27\x85\x52\x47\x8c\x2e\xb8\x5c\x1f\x12\xcf\xe1\x20\xf1\x9e\x90\x8d\x2e\xab\x37\xef\x65\x01\x43\x01\x01\x9f\x3b\x93\x5f\xbd\x7e\xbd\x9c\x95\x8b\xa5\xe8\x15\x43\x57\x3c\x45\xea\xa0\xaa\x9a\xb5\x3e\x54\x06\xad\x64\xf2\xf1\x8e\x3a\xa2\x0a\xcb\x26\x1f\xa7\x7f\xff\xf8\x76\x4a\xa3\x6d\x96\x44\x06\x27\x76\x5f\x3f\x7b\xfa\xa4\xaa\x2e\x5e\x8a\x21\x63\x5d\x35\xd8\xfe\x98\x96\x67\x72\x33\xcb\xe1\x2f\xeb\x3f\x6e\x83\xf9\xde\xe5\x9a\xc3\x0b\x5b\x56\xdd\x7b\x70\x67\x48\xe8\xbb\xf2\xec\x27\x40\xf8\x40\x74\xf8\x97\xf5\x4c\x04\xe5\xf2\x6c\xb1\x5c\xf1\xfb\xf3\x72\xc1\xef\x34\xa4\xaf\x78\xea\x6f\x45\x52\x28\xe9\x67\x9e\xca\xb1\x49\x1e\x33\xbe\x77\x78\x34\x2f\xd3\x23\x81\x42\x04\xe7\x3b\x47\x47\x28\x5f\x2e\xee\x55\x68\xf9\x81\xaf\x56\x65\xce\xeb\x15\x87\x7a\x81\xe3\x8e\x76\x06\x59\x2d\x1d\x88\x08\x77\xaf\xd9\xd1\x00\x0b\x12\x1d\x80\x43\x49\xb3\x0b\x25\x2c\x04\xd6\xc9\x74\x10\xe0\xee\xc1\x9d\x8f\x06\x71\xc8\x27\x6a\x65\xab\x66\xf9\x8f\xf7\x09\xf9\xf8\x56\x88\x61\xfa\x46\x8a\xe1\xed\xde\x9d\x3b\xff\x3f\x00\x00\xff\xff\x30\x1c\x67\x1d\x64\x21\x06\x00") +var _web3Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x7b\x13\x39\xd2\x38\x0e\xbf\xcf\xa7\x50\xfc\xdc\x0f\xb6\x89\xb1\x73\x60\x18\xc6\x99\x0c\x1b\x02\x33\x64\x6f\x20\x5c\x40\x76\x76\xef\x6c\x96\xab\xed\x96\xed\x1e\xda\xdd\xfe\x75\xb7\x73\x18\x92\xef\xfe\xbf\x54\x3a\x95\x0e\x7d\x70\x12\xe6\xb4\xc9\x0b\x70\x4b\xa5\x53\xa9\x54\x2a\x95\x4a\x55\x19\xfd\x7f\xcb\x28\xa3\x7b\x9d\xc9\x32\x19\x17\x51\x9a\x10\xda\x29\x7a\x49\x2f\xeb\x7e\x51\x29\x79\x27\xed\x2d\xbb\x5f\xa2\x49\x67\x3d\x39\x49\x4f\xf9\xaf\x02\x7e\x9d\x05\x19\x09\xf6\x8a\xcb\x05\x4d\x27\x44\xd6\xb5\xd7\x92\x45\x5b\x0f\x1e\x88\xc4\x5d\x56\x66\xf9\xe0\x41\xd0\xcd\x68\xb1\xcc\x12\x12\x74\xd2\xde\xfa\x66\x97\xa5\x47\x32\x2d\x12\x69\xac\xd6\xc9\x5e\x42\xcf\xc9\xcb\x2c\x4b\xb3\x4e\xeb\x20\x48\x92\xb4\x20\x93\x28\x09\xc9\x3c\x0d\x97\x31\x25\xed\xd6\x46\xba\xd1\x6a\xb7\xba\xbb\xc5\x2c\x4b\xcf\xc9\xa4\x3f\x4e\x43\xba\xd7\x7a\x73\xf4\xe2\xf8\xf5\xcb\x4f\x6f\x8f\x3e\x7e\xfa\xf1\xe8\xf8\xed\x8b\x56\x6f\x72\xcd\xea\x8b\xf7\x58\xdf\xf7\xbe\xd0\x8b\x45\x9a\x15\xf9\xf0\xcb\xf5\xf5\x2e\x1b\xc3\xc9\xe6\x69\x7f\x1c\xc4\x71\x27\xee\x8b\xac\x9e\xec\x7d\x87\xf2\x01\x26\x7b\x00\xb8\x75\x7a\x42\x4f\x77\x45\x57\xf3\x4e\xf2\x2c\x19\xd2\xee\x75\x2f\xee\xe9\x92\xb4\xc7\x71\x77\x2d\xa0\x58\x93\x32\x13\x7a\x11\x35\xc2\xd5\x24\xcd\x3a\x0c\x3a\xdd\xdb\xdc\x4d\xbf\xcf\xfa\x31\x4d\xa6\xc5\x6c\x37\xdd\xd8\xe8\xe6\x9d\x8c\x21\x5e\x75\xe3\xba\xdb\xf9\xb2\x35\x3c\x51\x5d\x16\x55\xf4\x38\x96\x7a\xa2\xed\xee\x97\x35\x9e\x20\x3b\xb3\x77\xb2\x46\xc8\x97\x35\x42\x08\x69\x8d\xd3\x24\x2f\x82\xa4\x68\x0d\x49\x91\x2d\x69\x8f\xa7\x46\xc9\x62\x59\xe4\xad\x21\x39\x81\x6f\x09\x0d\x79\x49\x30\xa7\xad\x21\x69\x7d\x4a\xcf\x13\x9a\xb5\x7a\x3a\x87\x8d\x8e\xe5\x04\x61\x98\xd1\x3c\x6f\x89\x9c\x6b\xf8\xff\x54\x54\x2d\x8b\xc3\xff\x22\x2d\x5d\x16\xf5\xed\xa5\x9f\x50\x11\xa3\xbd\xd1\x65\x41\xf3\x9d\x6d\x7f\x7b\x12\x48\x61\x7a\x8d\x90\xeb\xde\x9d\x20\xe0\x46\xfd\x51\xc3\x41\xd8\x6b\x86\x80\x95\x51\xfd\x47\x1d\xfa\x38\x4d\x0a\x9a\x14\xb7\x1e\xfc\x9f\x72\xde\xd9\x8c\xfd\x61\xa6\x7d\x12\xc4\xf9\x6f\x37\xf4\x8c\xe6\x34\x3b\xf3\xad\xfa\x3f\xfa\xa4\xe5\xcb\xd1\x7b\x3a\x8d\xf2\x22\x0b\xfe\x0b\x26\xaf\x57\x55\x07\x3d\x3f\xba\x15\xdf\x2f\xb2\x20\xc9\x27\x5e\xd6\xf7\x67\xc1\x41\x66\x91\xc2\xea\x48\xc8\x69\xf1\xa1\x9a\xa4\xee\x0c\x17\x76\xd3\xbf\x49\xa3\x5f\x79\x02\x82\x26\x88\xaf\xaa\x60\x91\x45\xf3\x20\xbb\xf4\xf6\x23\x4d\xe3\xda\xc9\xdb\x17\x6d\xfd\x79\x51\x68\xee\xc1\x95\xd5\x94\x21\xe1\xa0\x74\x1b\xff\x23\x21\xc1\xdb\xfb\x30\xca\xd3\xf3\xe4\x16\x3d\x0f\x92\x34\xb9\x9c\xa7\xcb\x7c\x85\xae\x47\x49\x48\x2f\x68\x68\xec\x5d\x77\x36\xb1\xba\x72\xd4\x1d\xb3\xf6\xf3\x28\xb9\x0d\xe3\xde\x5f\x02\x26\x5e\x26\x21\x0d\x5b\x16\x9a\xe8\x19\x23\x84\xbf\x00\x8e\x46\x51\x18\x36\xc3\xd1\xcd\xea\x3f\x0b\xe2\xa5\xb7\xfb\xcb\x28\x29\xb6\xbf\x79\x52\x3d\x05\x6f\xe9\xf9\xf3\xe8\x77\x44\xfe\xad\xd6\xdc\xc1\x2c\x48\xa6\xbf\x27\xe9\xdc\x09\xe5\x94\xd4\x8d\xa4\xfa\x4a\xaa\xf1\x62\xe6\x1d\xdf\x8d\x6a\x11\xb4\x76\xba\xb6\x76\xdd\xfb\x72\x7d\xda\xdb\xfe\xdd\x0e\xfd\x7f\xa1\x33\xef\xef\x24\x3b\x4e\x96\x49\x78\x63\x52\xb9\xf5\xc6\x75\x7f\xec\xfd\x73\x1f\x7b\xef\x0f\x7d\x7f\xe4\x33\x87\x77\xf0\xe2\xbc\xf0\x47\x93\x36\xbf\xee\x66\xae\xf7\xaa\x9d\x3b\xdb\xab\x56\x9d\xf7\x49\x96\xce\x6f\x39\xed\x45\x7a\xcb\xa3\xe6\xed\x04\xbe\xdf\x77\xdd\xfc\x11\xf0\x17\x25\x61\x94\xd1\x71\x71\xe8\xdd\x33\x57\xe8\xc9\xed\x26\x22\x1a\x07\x8b\x8f\xbf\xeb\x64\xf8\x31\xd9\xec\xb4\x4b\x17\x69\x1e\x55\x1d\xd4\x17\xc1\x65\x30\x8a\xa9\x29\x14\xfc\x2e\x5c\xa9\x8c\xe6\xee\xe4\xf8\x75\x3b\x1a\xd8\x97\xe3\x7d\x61\xe2\xf3\xb7\x3f\xc9\xdc\x09\x92\x4a\xea\x6e\x46\x67\xbf\x03\xfa\xff\xb0\x58\xbf\x8b\xf3\xe3\x8d\xf9\xe4\xd7\xc6\xba\xcd\xf4\xee\xd1\xde\x10\xed\xb7\xde\xb8\xbe\xf6\xcc\x1e\x7a\xb6\xb4\x2a\x39\xee\x71\x13\x39\x0e\x8c\x37\xc8\x9e\xb4\x70\xe8\xb4\xfb\x83\x49\x9a\xcd\x83\xa2\xa0\x59\xde\xee\xee\x02\xc0\x87\x34\x8e\xc2\xa8\xb8\xfc\x78\xb9\xa0\x26\x2c\x6b\x9f\x41\xad\x0d\x1e\x3e\x5c\x23\x0f\x0d\x48\xa1\x73\x27\x51\x4e\x02\xb2\xc8\xd2\x94\x01\x93\x62\x16\x14\x24\xa3\x0b\x76\xc8\x4a\x8a\x9c\x88\xb9\x23\x2c\x93\xd5\x70\x58\x90\x79\x50\x8c\x67\x34\x1f\xb2\x4f\x91\x8d\x7e\x9e\x9c\xe2\x8f\xc7\xc6\xd7\xa9\x99\xb9\x63\x7d\x9f\x9e\x3c\x39\x3d\x39\xed\x91\x7e\xbf\xbf\x46\x1e\x0e\x9c\xb1\xc9\x1e\xef\x11\x65\x4d\xd3\xe9\x8a\x29\x2e\x66\x51\xde\xff\x04\x0b\xe3\x47\x89\x20\x06\xd8\xe7\xe8\x3a\x64\x19\x87\x49\xb1\x8b\x80\xf9\xbe\xed\x83\x3e\x82\x1c\xd1\xdc\xee\xda\xf5\xee\xda\x9a\xa7\x1f\xfd\x45\x96\x16\x1c\x6b\x7b\x24\xa1\xe7\x46\x5f\x3b\x5f\xae\xbb\xbb\xd5\xa5\xfa\x20\xbd\x64\xcb\x71\x91\xb2\xc6\x3d\xb0\x75\xed\xf6\xa3\x5c\xcc\xb9\x46\x08\x23\x47\x89\x14\x61\xd7\xb2\xbe\xce\x12\xfb\x30\x6f\x9d\x81\xc0\x76\xe7\xdf\x27\x9d\x93\xcd\x47\xdf\x9d\x3e\xec\xfe\xfb\xb4\xfb\x6c\xd0\xe5\xe3\x34\x0f\x0e\xa5\xdd\xba\xee\x7d\x69\x61\x52\x6c\x0d\xbf\xeb\xb5\x38\xbd\xb5\x86\x5b\x8f\xaf\x4f\x7b\xdf\xfc\xce\xe4\xfd\x3c\x4d\xe3\x1a\xda\x1e\x31\x90\x12\xc2\x66\x79\xf2\x7f\x4e\xa5\xf0\xeb\xb1\xfe\x79\x8a\x92\x77\xf0\x47\x1d\x19\x43\xcf\x6e\x4a\xc3\xac\xf0\x2a\x44\xcc\xe1\x6d\x0a\x66\xa9\x2b\x92\xaf\x59\xa4\x82\x76\x79\x8b\x55\x65\x6f\x42\xb5\xff\x61\xa8\x35\x69\xf6\xe1\xff\x34\x22\x5a\xd1\x9f\x7a\x8a\x7d\xf2\x7b\x53\x2c\xdb\xc3\x14\xc9\x16\x7e\x9a\x2d\x66\x94\xc0\x66\x07\x84\xdb\xf7\x51\x2e\xcb\x55\x3f\x04\x5d\xc2\xcf\xc7\xe8\xf7\x29\xce\xd8\x31\xbe\x4c\xfa\x25\x62\x6b\x55\x3f\x9f\x1a\xf5\x88\xa2\x1e\x2a\x87\x4e\xde\x98\xcc\x59\xe9\x95\xe8\x9c\x17\x70\x08\x9d\x25\xaf\x4a\xe9\x66\x99\x2a\x52\xe7\x8d\x56\x96\xbe\x19\xb1\xb3\x4a\x38\xa9\x7f\xd9\xea\x5d\x77\x6f\x46\xf8\xa2\x77\xf5\x94\xff\x6d\x13\xca\x1f\x3c\x84\x0e\x7f\x9c\x45\x39\x99\x44\x31\x65\x94\xba\x08\xb2\x82\xa4\x13\x72\x4e\x47\x3b\xfd\x5f\xf2\xfe\x1a\x80\x88\x2f\x06\x30\xc9\x28\x25\x79\x3a\x29\xce\x83\x8c\x0e\xc9\x65\xba\x24\xe3\x20\x21\x19\x0d\xa3\xbc\xc8\xa2\xd1\xb2\xa0\x24\x2a\x48\x90\x84\x83\x34\x23\xf3\x34\x8c\x26\x97\x50\x47\x54\x90\x65\x12\xd2\x0c\x08\xbe\xa0\xd9\x3c\x67\xed\xb0\x8f\x9f\xde\x1e\x93\xd7\x34\xcf\x69\x46\x7e\xa2\x09\xcd\x82\x98\xbc\x5b\x8e\xe2\x68\x4c\x5e\x47\x63\x9a\xe4\x94\x04\x39\x59\xb0\x94\x7c\x46\x43\x32\xba\x14\x54\x44\xc9\x8f\xac\x33\x1f\x44\x67\xc8\x8f\xe9\x32\x09\x03\x36\xe6\x1e\xa1\x51\x31\xa3\x19\x39\xa3\x59\xce\x66\x68\x47\xb6\x25\x6a\xec\x91\x34\x83\x5a\x3a\x41\xc1\xc6\x90\x91\x74\xc1\x0a\x76\x49\x90\x5c\x92\x38\x28\x74\x59\x17\x05\x7a\xa4\x21\x89\x12\xa8\x76\x96\xca\x95\x1d\x15\xe4\x3c\x8a\x63\x32\xa2\x64\x99\xd3\xc9\x32\xe6\x82\xe3\x68\x59\x90\x9f\x0f\x3f\xbe\x3a\x3a\xfe\x48\xf6\xdf\xfe\x8b\xfc\xbc\xff\xfe\xfd\xfe\xdb\x8f\xff\xda\x25\xe7\x51\x31\x4b\x97\x05\x61\x12\x25\xd4\x15\xcd\x17\x71\x44\x43\x72\x1e\x64\x59\x90\x14\x97\x24\x9d\x40\x15\x6f\x5e\xbe\x3f\x78\xb5\xff\xf6\xe3\xfe\xf3\xc3\xd7\x87\x1f\xff\x45\xd2\x8c\xfc\x78\xf8\xf1\xed\xcb\x0f\x1f\xc8\x8f\x47\xef\xc9\x3e\x79\xb7\xff\xfe\xe3\xe1\xc1\xf1\xeb\xfd\xf7\xe4\xdd\xf1\xfb\x77\x47\x1f\x5e\xf6\x09\xf9\x40\x59\xc7\x28\xd4\x50\x8f\xe8\x09\xcc\x59\x46\x49\x48\x8b\x20\x8a\xe5\xfc\xff\x2b\x5d\x92\x7c\x96\x2e\xe3\x90\xcc\x82\x33\x4a\x32\x3a\xa6\xd1\x19\x0d\x49\x40\xc6\xe9\xe2\xb2\xf1\x44\x42\x65\x41\x9c\x26\x53\x18\xb6\xa2\x32\x42\x0e\x27\x24\x49\x8b\x1e\xc9\x29\x25\xdf\xcf\x8a\x62\x31\x1c\x0c\xce\xcf\xcf\xfb\xd3\x64\xd9\x4f\xb3\xe9\x20\xe6\x15\xe4\x83\x1f\xfa\x6b\x0f\x07\x92\xd9\xfe\x0d\xc8\x76\x9c\x86\x34\xeb\xff\x02\x2c\xf2\x6f\xc1\xb2\x98\xa5\x19\x79\x13\x64\xf4\x33\xf9\xdf\xb4\xa0\xe7\xd1\xf8\x57\xf2\xfd\x9c\x7d\xff\x8d\x16\xb3\x90\x9e\xf5\xc7\xe9\xfc\x07\x00\x0e\x83\x82\x92\xed\xcd\xad\x6f\x80\xe1\xd5\x6f\x05\x15\x02\x2c\x2a\x23\xe4\x31\xdf\xde\x21\x24\x05\x04\xcc\x76\x41\x1f\xe4\x61\x52\x98\x80\x51\x52\xf8\xe0\x8e\x1d\xc0\x65\x09\xe4\x8b\xcb\x24\x98\x47\x63\xc9\xc6\x51\x89\x90\xe7\x00\x8f\xf2\x95\xfc\x50\x64\x51\x32\x35\xcb\xe4\x90\xe6\x83\x7e\x4f\x03\x6b\x8c\x19\x0d\xbc\x63\x3c\x76\x41\x97\x65\xb0\x9e\x6e\xab\xfe\x02\x70\x94\x8b\x01\x1a\x9c\x39\x47\x55\xf4\x60\x87\x15\x7c\x5a\x5a\x88\xa3\xfc\xbe\xaa\x02\xb6\x11\x0e\x7c\x75\xa5\x4e\x8f\xa4\x04\x7a\x3f\xcb\x82\x4b\x0e\xce\x99\xb8\x25\x0a\x1c\x30\xfa\x44\x12\x80\x58\x49\x9c\x43\x84\xa4\x48\x09\x4d\x18\x0d\x0f\x42\xca\xfe\x53\xad\x30\x66\x1c\x70\x36\xc9\xb8\x92\x90\x6b\xcd\x8d\x99\xd7\x8d\x47\xcc\xc0\x72\x73\x67\x86\x24\xb2\x07\x35\xe4\x46\x17\x81\xf7\xcf\x69\x31\x4b\x43\x4f\xb7\xb8\x72\x3d\xcd\xe6\x84\x4b\x2e\xa9\x31\x23\x6b\x84\xaf\x41\x51\xfc\x93\x98\x19\x91\x45\xfe\x06\xbd\x27\x5f\x38\xf1\x5c\x2b\xb1\xfc\x6f\x1c\xf3\x39\xf9\x82\x2b\xbb\x86\x2c\x78\xab\x90\x93\x2f\xf0\xae\xe1\x9a\x88\xcf\x88\xf1\x06\x2e\x11\x31\x32\x84\xbe\xb0\x9d\x88\xb1\x7b\x40\x88\x81\x0c\xb4\x53\xe3\x2e\x39\x38\x92\x28\x62\xd8\xcc\x4d\xf1\x0e\x61\xad\x3f\x89\xe2\x82\x66\x1d\x54\xb6\x8b\x74\x10\x82\x8a\x0a\x21\x14\x48\x22\x00\x9d\x42\xf7\x64\xf3\x74\x97\xf3\xcf\x68\x42\x3a\xeb\xb8\x11\x5c\x07\x7f\xa0\xc1\x9f\x72\xb4\xa3\xe4\x2c\x88\xa3\x50\xd3\x00\xab\x71\x7d\x48\xda\x64\x83\xe0\xca\xd7\xb0\xac\x81\x6b\x36\x29\xb0\x84\xd2\xc8\x22\x0e\xa2\x84\xd3\x97\x35\x8d\x1c\xe0\x9d\xc8\x29\x9f\x45\x91\x7e\x34\xfa\x85\x8e\x8b\x6b\xab\x42\x39\xc9\xba\x1c\xaf\x36\xb4\xe0\xca\xa7\x0e\x75\xc3\x99\xb9\x1e\x2f\x6f\x09\x5c\x30\x69\xa8\x58\xde\x39\x61\xc0\xa7\x3d\x72\x02\xe0\xa7\xdd\x66\xa8\x89\xa3\x1c\x24\x20\xbe\xf8\xca\xb1\x93\x63\x34\x00\x0b\xe0\xd8\xf1\xa5\x2f\x74\x81\x32\xc4\x38\xcd\x36\xc2\x4d\xee\x2e\x7d\x81\x9d\xbc\x8c\xbe\x73\x49\xe0\x53\x5a\xe0\x15\x98\x0b\xce\x21\x48\x96\x15\x13\x7d\x63\x25\x8c\x1a\xfa\xf3\x60\xd1\x29\xe3\xb1\xa0\x95\xf3\xac\x11\x83\x77\xf2\x9a\x3b\xbc\xa7\x27\x50\xe4\x94\xb3\x67\xf9\xa5\x56\x11\xea\x8f\xd8\xa7\x8e\x26\x93\x9c\x16\x4e\xa7\x32\x1a\x2e\xc7\x14\xf5\x2b\x18\x8f\x7b\xa4\xa6\x73\x80\x9d\x22\x28\xa2\xf1\xbb\x20\x2b\x5e\xc3\x4b\x22\xab\xe6\xbe\x9d\xdf\xf1\xf4\x53\xd6\x95\x31\xa6\x44\xc3\x0f\x6e\x95\x6f\x82\x62\xd6\x9f\xc4\x69\x9a\x75\x3a\x4e\x8b\x1b\x64\x67\xab\x4b\x06\x64\x67\xbb\x4b\x1e\x92\x9d\x6d\x31\x68\x84\xbe\x60\x3c\x26\x1b\xa4\xa3\x36\x1d\x03\xeb\x25\x28\x24\xcf\xd0\xde\x45\xc8\xce\x36\x19\x1a\x09\x25\x9d\x95\xa8\xef\x91\x4d\x8c\xfd\x8c\xe6\xcb\xb8\x90\xd4\xc3\x67\xf0\xcd\x32\x2e\xa2\x9f\xa3\x62\xc6\xe7\x44\x52\xa0\xd1\xb7\x9e\xa2\xa3\x9e\x39\x83\xb2\x72\x31\x42\x5e\xbf\x79\xe2\xf3\x93\xbe\xd5\xaa\x6f\x0d\x34\xec\x01\x5a\x23\x6a\x78\xad\xd6\xae\x5e\x38\x34\x9e\x88\x11\x8b\xce\x8a\x5d\x21\xcd\x5e\x06\xe3\x59\xc7\x66\x4c\x11\xa6\x2d\xc6\xf5\x4b\xe7\x4b\xcf\xd5\x69\x17\x17\xe2\x08\x81\xae\x6c\xb8\xda\xce\x8e\xd9\x7d\xb9\x8e\x10\x11\xaa\xb5\xcb\xa8\x98\xc6\x13\x01\x62\xcf\x11\x74\xc0\xed\x92\xc4\x13\x7c\xd8\x93\x85\x9b\x30\x97\xe2\xc6\x1e\xa1\xe2\x19\x1e\x19\x90\x6d\x0d\x7a\x4d\x68\x9c\x53\x6b\x78\x83\x01\x09\xd3\xa4\x5d\x90\x20\x0c\x89\x28\x55\xa4\x66\x95\x7d\x12\x15\xed\x9c\x04\x71\x46\x83\xf0\x92\x8c\xd3\x65\x52\xd0\xb0\x04\x4b\x5f\x69\x9c\xd7\x7a\x11\x0e\x06\xe4\xe3\xd1\x8b\xa3\x21\x99\x44\xd3\x65\x46\x09\x3b\xb0\x25\x34\x67\x27\x40\x76\x4a\xbb\xcc\x4d\x66\xf5\x5b\x10\xc9\x1f\x67\x92\xcd\xc9\xa0\x18\x81\x12\x2b\x25\xcb\x5c\xa1\x35\xa3\x93\x00\xd4\x31\xe7\xb3\x34\xa6\xbc\x87\x51\x32\x5d\xaf\x61\x04\x15\x3c\xc0\xe6\xfc\x62\xd0\x3d\x92\x3a\x2b\xdf\x58\xe4\x72\x4e\x6a\x45\x7d\xcf\x16\xd7\x71\x55\x63\x88\x80\x78\xc3\xe4\x3c\xd0\x64\x9d\xd3\xc2\x99\x53\x4e\x56\x6f\x83\x39\xb5\xf7\x21\x9d\x83\xe5\x4c\xb7\xac\x67\xf3\xa9\xde\xcf\x74\xc5\x9e\x3a\x15\x5f\x14\x18\xd4\x52\xad\xfc\xab\x18\xb6\xac\x64\x91\xd1\xb3\x28\x5d\xe6\xaa\x43\xdb\xbb\x0c\x25\x51\x42\xa2\xa4\x70\x4a\xd4\xe1\x1f\xf5\xd7\xd7\x20\xfb\x9b\xa4\x19\x81\x47\xc2\x11\xd9\x23\x5b\xbb\x24\x22\xdf\xcb\x01\xc8\xf7\xc2\x24\xda\xd8\x28\x2b\xce\xfe\xac\x3e\x6f\xec\x91\x8d\x8e\xc4\x41\x44\x1e\x91\xad\x53\x26\xe1\x93\xab\x2b\xb2\xb9\x5b\x5a\x49\x05\x2b\x17\xf4\xb0\x41\x22\xf2\xb0\x6c\xe6\x36\xec\x5e\x30\xe1\xa0\x8c\xed\xcb\xbf\x6b\x27\xd5\x4c\xb9\xee\x76\xba\xd6\x14\x0e\x06\x64\x12\x65\x79\x41\x68\x4c\xe7\x34\x29\xd8\xf9\x8a\xa3\xa9\x47\xf2\xcf\xd1\x82\x44\xc5\x2a\x53\x6e\x60\x7f\xd3\x87\x7d\x86\xbf\xca\x19\x80\xa7\xf3\x61\x18\xb1\x46\x82\x58\x2d\x72\x81\x4f\x87\xff\xb8\xf8\xf6\xf3\x45\x4d\x3a\x25\x0c\xe2\x24\x22\x1b\x64\xeb\x54\xf2\x09\xb2\x41\x9c\x6e\x78\xd0\x5e\x8b\x60\x8b\xf9\x79\x20\xc5\x56\xe9\xa1\x7d\x4e\x15\x37\x66\x3d\x7f\x68\xa6\xc2\x84\x2d\x13\x53\xb7\x5c\xfc\x35\x94\x49\xca\x18\xd2\x66\x15\x43\x22\x8d\x68\xba\x96\xa3\x0c\x06\x64\x1c\xc4\xe3\x65\x1c\x14\x54\x0a\x3e\xec\xc8\x27\xfa\x42\xa2\x82\xce\x6f\xc1\x8e\x18\x2b\x3a\xf9\x13\x31\xa5\xae\x0d\x7b\xbd\xd2\xbe\x72\xcb\x09\xf9\xfd\x18\x0c\x66\x2e\x5f\x9d\xb7\x10\x47\x5b\x24\xfa\x51\xa3\x0d\x11\xba\x48\x71\x33\x99\x56\x68\x8c\x38\x64\x63\x8d\x91\x4c\x57\xb7\x9a\x4a\x25\xe2\xd7\x25\x95\xeb\x41\x50\xc3\x1e\xf1\x0f\xea\xf7\xe9\x88\x50\x31\xad\x23\xe2\xd0\x20\xdb\x34\x41\x4b\xa5\x92\xa8\x04\x21\x65\x3a\xa2\x72\x84\x88\x12\x70\xc2\x80\xd6\x34\x62\xaa\x35\x44\x78\x88\xbe\xd3\xb1\x81\x9b\xd5\x15\x44\xb2\x14\xa7\x62\x0c\xcf\x89\x38\xf7\x9e\xc2\xad\xe3\xfe\x1d\x6b\x94\xf8\x90\x3b\x30\x32\xb9\xbe\xb4\x5a\xc4\xd0\x8b\xc8\x1a\xb5\x86\xa9\x4a\xe5\xa0\x47\x55\xab\x67\xc0\x18\xe5\x1c\x88\x95\xb9\xeb\x91\x36\x51\x47\xa9\x93\xa8\x4f\x0e\x16\x5d\x2b\x65\x92\x83\x01\xc9\x97\x73\x7e\x43\xe7\xd9\xa5\x84\x88\xa8\xe0\x45\x75\x27\xd1\x29\xe3\x8a\xea\x0b\xb6\x24\x1f\xff\x91\xcd\x9b\x88\x90\xd2\xa6\x83\x82\xc1\x80\x64\x74\x9e\x9e\xc1\x35\x26\x19\x2f\xb3\x8c\xc9\xa7\x4a\x38\x4d\x21\x59\x74\x33\xca\xa1\xe7\x9e\xde\xe6\xab\x68\xfc\x24\x32\x1b\x6b\xfe\x8c\x91\x91\x47\x4e\xfd\x8d\x29\xed\x83\xb5\x0e\x4b\xae\x75\xbc\xa7\x56\xc9\xe3\x3c\x54\x56\x58\x57\x0e\x92\xac\xd8\x0e\x86\x2f\x49\xcc\xfb\x0b\xde\x5b\xd6\xd6\x58\xdc\x32\x61\x53\x0b\xe8\x7d\x87\xdb\xab\xda\x26\x18\xe2\x5a\xb4\xd3\xed\x79\xb3\x9f\xa7\x69\x5c\x96\xc7\x84\x90\x92\xac\xe3\x8a\x3c\x7c\xb9\x59\xda\x6c\x55\x26\xe7\xc2\x65\xb9\xef\x69\x50\xda\xe3\x63\x9e\xb9\xc6\x08\xc2\xb5\xdf\x00\xd4\x29\x9b\x0d\x69\x38\x3b\x7c\xdc\x6b\xf1\xbb\xdf\xd6\xf0\x1b\xf8\xc9\xfa\xd6\x1a\x3e\x61\xbf\xf1\x75\x6c\x6b\xf8\xb4\xe7\xb3\xf5\x88\x92\xa2\x35\xdc\xda\x64\x3f\x33\x1a\xc4\xad\xe1\xd6\x36\xfb\xcd\x6f\x65\x5b\xc3\xad\x1d\xf6\xb5\xe4\x50\xd0\xc0\x52\x80\x3d\xb9\x3e\xed\x3d\xfd\x2d\xed\xa2\x6a\xae\xa1\x6f\x66\x4d\x84\x2b\x59\xc5\xa8\xc8\x2c\x67\xdb\x16\xe1\xdc\x15\x4d\x8c\xfc\x45\x2b\x2c\x8d\xcc\x9e\x34\xa9\xeb\x16\x76\x47\x25\xc6\x46\x8d\x1a\x45\x57\xe2\xde\xe9\x92\x6c\x27\x5b\xd2\x06\x26\x4c\xd6\xb0\xeb\x2d\x99\xbe\xbb\xb7\x64\xba\xb7\x64\xfa\x6f\xb1\x64\xd2\x0b\xe1\xae\xcc\x99\x9e\x47\xd3\xb7\xcb\xf9\x08\x58\xa1\xe2\xce\xa3\x68\x9a\x40\x62\xff\x17\xc5\xc9\x97\x45\x14\x9b\xf6\x35\xfd\x01\xa4\xf1\x7f\x25\xd8\xd8\x0b\x32\x4e\x93\x49\xe4\x18\x03\xc9\x93\x19\xda\x15\xe0\xec\x02\xdb\x82\x1c\x38\xe7\xd5\x39\x01\x7e\x4f\xe0\xc1\x06\x3b\x67\x31\xbe\xa5\xad\x64\x61\x29\xb0\xb9\x01\xe5\xcc\x43\x86\x63\x0e\x19\xe5\x24\xa1\xd3\xa0\x88\xce\x68\x4f\x72\x22\xb8\x38\x2a\xce\xd3\x76\x4e\xc6\xe9\x7c\x21\xa5\x55\x28\xc5\xe6\x56\x95\x9c\xc4\x69\x50\x44\xc9\x94\x2c\xd2\x28\x29\x7a\xfc\x3a\x94\x91\x7d\x98\x9e\x27\xd6\x99\xce\x54\x93\xb8\xc7\xb7\x2b\x8e\xe5\x2b\x85\xef\x6b\x39\x16\xb6\x94\x12\x4a\x43\x38\x45\x8f\xf4\x1c\x87\x7e\x63\x18\x40\xda\xb5\xb2\xf3\x31\xdb\x35\x18\x30\xd4\x2f\xb9\xb0\x6a\xb7\xcf\xe7\xa2\x33\xee\xbf\xfc\xf8\xea\xd3\xf3\xc3\x9f\xde\x1e\xbf\x79\xfe\xf2\xfd\xa7\xf7\x47\xc7\x6f\x5f\x1c\xbe\xfd\xe9\xd3\x9b\xa3\x17\x2f\xd1\x19\x4e\x69\xe2\x60\x26\xfb\x8b\x20\x7c\x4d\x27\x45\x87\x7f\x15\xe9\xc7\xf3\x34\x3f\x50\x58\x14\x6d\xf6\x8b\x54\x88\x4b\x5b\x4f\xba\x3d\xf2\xe4\xb1\x79\xc3\x83\x77\x4b\x18\x4e\x87\x37\x62\x1a\x60\x98\x13\x2f\x0f\xbf\x25\x38\x7f\xae\xce\xc6\xe6\xa1\x79\x55\x1c\xba\x52\x87\x81\x45\x0f\x42\x8a\xf4\x15\xbd\x90\xe3\xce\x97\xa3\xbc\xc8\x3a\xdb\x08\x7f\xb1\x75\xb5\xcf\x8b\x4b\x2d\xf7\x06\x79\xb2\xd3\x25\x03\x8c\x22\x1b\xdd\xef\xa3\xe9\xac\x10\xc5\x7a\x24\x26\x0f\xbf\x32\x3e\xc5\x0e\x7c\xa7\x68\x2d\x95\xe9\x6e\x8d\x5d\x79\x3c\x33\xd1\xaa\xb4\x73\xbf\xdb\x0c\x58\x6a\x53\xde\x58\xb7\xcf\xd7\xfc\x06\xa9\x9f\xa0\x3a\x4e\xc7\x25\xf9\xf2\x15\xf1\x41\xe6\xdf\x76\xee\x94\x71\x67\xf3\x59\x9b\x64\xe9\xfc\xb8\x98\x3c\xbd\x9f\x38\xcf\xc4\x89\x77\x46\x65\x8c\x4c\xbc\x42\x92\x93\xc6\xbe\x69\x90\xac\xce\xc8\xec\x27\x47\xe5\x73\xd6\xde\xbc\xdd\x5f\x9b\x6c\x88\xea\xc9\x33\x42\xda\x5b\x6d\x32\x24\xed\xcd\xf6\xed\x79\x54\x1d\x26\xd9\x89\x95\x95\xfa\x07\x83\xcb\x09\x13\x8c\xe7\xcb\xb8\x88\xb8\x50\x39\xba\x24\xdb\xff\x99\x33\xf1\x5c\xd9\xd0\x05\xac\xe6\x82\x4e\x69\x56\xb1\x95\xbc\x17\xb5\xd6\xed\xdf\xab\xce\x88\xb0\x65\x2e\x99\x11\x81\x26\x8b\xfa\x18\xd6\x54\x8b\x6a\x73\x8d\xe6\x34\xb7\xb2\xb6\xbb\xfd\x45\x7a\xde\xd9\xda\x7e\xda\xed\x9a\x28\x3d\x98\xd1\xf1\x67\x12\x4d\x0c\x9c\x22\xb1\xc8\x42\x44\x1e\x4d\x13\x1a\x1e\xe6\x6f\x75\xb6\xa3\x88\x56\x75\xcc\xe8\x85\xe8\xb1\x89\x0c\x49\xb4\x70\xe8\x83\xb6\x0b\x53\x12\x4b\xd9\x91\xe5\x3c\x62\x62\x78\x10\xe7\xda\x6a\xd9\x6e\xbd\x16\x5f\x3e\x0c\x49\x76\xb3\xd9\x23\x5b\xdd\x1e\xd9\x7a\x82\xe4\x91\xed\xae\x91\xdb\x25\x7b\x7b\x7b\x8c\x64\xbd\x54\x98\x31\xf6\xf1\x28\x88\xa1\x53\x84\xab\x0e\xf4\x85\x07\x17\x35\x5d\x22\xe2\x8a\x04\x5b\x08\x34\xc8\xc3\xb1\x83\x65\x38\xd3\x82\x61\x45\xbb\x4a\x38\x84\x65\x11\x4d\x09\x97\xd3\x2d\x7a\x53\x5d\x30\xf0\x67\x18\xc5\x32\x60\x3e\x8f\x7b\xbc\x37\x48\x97\xd9\xe9\x92\xab\x2b\xd2\xda\x6c\x09\x1d\xf1\x60\x40\xc6\x8a\x8a\x98\xf0\x2c\x27\x52\xb5\xce\x81\x60\x96\x95\x98\xed\x4a\xd8\xf2\xf2\xd6\x9a\x64\x31\xb1\x1e\xfd\xa3\x67\x72\xf9\x7c\xce\xa3\x64\x69\x2f\x81\xf6\xe4\x96\x7f\x6d\xa8\x5b\x56\xbe\xa5\xee\xc6\x1a\x74\xe8\x06\xe4\xb3\xac\xa6\x9f\xe3\x4a\x02\xf2\x91\x0e\x5d\x89\x76\x44\xf3\x2e\xd5\x1c\xdf\x05\xd9\x7c\x1d\x94\x09\x7e\x5f\x86\x32\x87\x71\xd7\xa2\x0c\x30\x86\xe4\x61\x13\x45\xa2\x39\x17\x45\x0e\x27\xf7\x99\x9b\x5b\x2b\x51\xc0\xf4\xc3\xe8\x2c\x0a\x69\xf8\xfc\xb2\x82\x81\xdf\x84\x9a\x6a\x70\x73\x7c\xd7\xc8\x59\x96\x62\xe7\x78\x65\xf4\x1c\xdf\x06\x3f\xee\x15\x2c\xaf\x5a\xa1\xa8\x4c\xdc\xd2\xaf\xa5\x1b\xe3\x45\x6e\x6b\xe6\x5c\x94\xe2\x48\x34\xed\xa2\xc8\x11\xce\x7c\x18\xf2\x2c\x2f\xd8\xac\x6e\x29\xad\x6d\xb5\xc9\x33\xbe\x2f\x0b\xb7\x18\xab\x61\xb3\xf4\xd8\x88\x1e\xe5\x56\x6c\x7c\x31\x9d\x68\xc4\x31\xf1\xa1\xe2\x60\xe3\xc8\x1d\x49\x30\xa7\xfc\x75\x0f\xfb\x65\xc9\x5f\x02\x86\xd5\xa9\x6a\xf0\x60\xde\x39\x81\x42\x1b\x3d\x82\x35\xe5\xac\x90\x78\x5f\x4d\xf6\x48\xd9\x33\xdd\x87\xdd\x01\x3a\xcf\xe4\xd1\xaf\x82\x27\xe6\x70\x45\x25\xca\x9f\x6c\x9d\x9a\x72\x70\x7b\xf3\x82\xc9\xcb\xee\xe4\xf6\xf3\x38\x1a\x53\x26\x96\x6c\x93\x87\x50\xdd\x8a\x74\x5e\x33\x33\xf8\x08\x7e\x67\x13\xb4\x2a\xfa\x4b\xf5\x00\xce\x26\xa3\xce\x87\x16\x1f\xe0\x88\x13\x37\x60\x36\xe6\x9e\x3c\xee\x8a\x3d\xbc\x48\x05\x7c\x97\x3c\x94\x47\x4a\xdf\x0c\x58\x15\x71\xd1\xf0\xc9\xe3\x9e\x68\x7f\xb5\x29\xa8\x38\x92\xf3\xe1\x7b\xce\xe4\x77\x8a\xfd\x20\x1f\x47\x51\x15\xfe\x3d\x67\xf9\xdf\x10\xf3\x52\xa5\x03\xaa\x81\x66\xf8\x5f\x6d\x02\xb4\x6f\x9a\xb2\x19\xd8\xd7\xde\x6b\x4a\xa6\xa0\x94\xb7\x97\xa0\x5c\x55\xe8\x62\xdb\xe7\xbd\x66\x05\x69\xca\xc0\x5d\x6b\xf3\xa2\x45\x36\x88\x38\xe0\x00\xda\xf9\x6f\x65\x53\xf0\x78\xb3\x47\x70\x52\x99\xc3\x80\x2f\xd2\xee\x03\x1d\x34\x87\xd6\x77\xcf\x86\x81\x15\x3b\x74\x52\x1c\x38\xbc\xc0\x87\x65\x19\x4e\x29\x8e\xcc\xa1\x9b\xe4\xf6\x23\x4d\xe3\xa1\x9d\xe0\x40\x31\x09\x64\x68\x27\x60\x28\x25\x96\x0d\xed\x04\x17\xea\xd8\x01\x3b\xf6\xc2\xe1\x46\x75\x8a\xa7\x3e\x17\xf0\xd8\x0f\x89\x07\xab\x53\x3c\x70\x18\xdb\x28\xc9\x85\xf4\x4d\x8f\x9b\xe3\x96\x33\x27\x08\xa7\xb9\xb0\x82\xea\x87\xde\x75\x77\x2d\xef\x74\xcd\x9b\xa1\xd6\x70\xeb\x69\xaf\x65\xde\x28\xb5\x86\xdb\x60\xbe\x00\x0b\xa3\x35\xdc\xda\xea\xb5\xf0\xbd\x54\x6b\x68\x7e\x5e\x9f\xf6\xb6\x36\x7f\x67\x7f\x2e\x87\xdc\x30\xbe\xc2\x01\x51\x94\x14\x65\xfe\x87\xc4\xd5\x55\x94\x14\xdc\x35\x0b\xfb\xf1\x58\xfd\x3a\xd5\x89\x3b\xe8\xb7\xe5\xb9\x25\x4a\x0a\xee\xb7\x25\x4a\x8a\x27\x8f\x15\xd8\x53\x5d\xd1\xf6\x37\x4f\x4a\xea\x62\xf0\x35\x7e\x8c\xec\xa3\xe1\x57\x74\xc5\x05\xe0\xb6\x0d\xc2\x61\x52\xac\x68\x76\x61\x94\xa8\xb0\xb6\x80\xe6\x2a\x4a\xde\xc8\xb6\x22\x4a\x0a\x29\x2a\x3e\xbb\x91\x3f\x17\xde\xab\x7a\x1b\x88\xad\x46\x21\xec\xee\x8d\x20\xee\x8d\x20\xfe\xbc\x46\x10\x44\x5b\x41\x70\x51\xe9\x8e\x0c\x20\x1a\xd8\x35\xd8\xac\x9e\xdb\x2d\xa4\x60\x8d\xae\xdd\x76\xf4\x3d\x12\xea\xf9\x8c\x26\xea\xb1\x62\x8f\x1b\x7e\x33\x01\x5c\x79\x6f\x90\x92\xe5\xc0\x6b\x18\x61\xe9\xbe\xed\xb7\x89\xc0\x49\xa5\xfc\xc8\xff\xbf\xba\x22\xed\x36\xe2\xb3\xa9\x7c\xb6\xc0\x7f\xec\xa2\x77\x86\x51\x22\x5a\x6f\xec\xee\x63\x4a\x0b\x6c\xef\x0b\xd6\xe3\xed\x5c\xbe\x02\x05\x5e\xc2\x2a\x31\x4c\xdd\xb5\x7c\xcf\x2d\x5d\x4d\x29\x5a\xaa\x99\x74\xad\xb8\x32\xd2\x91\x7d\xec\x1a\xd6\xec\x80\x1e\x6c\xcd\x6e\x37\x52\x69\x87\x06\x26\xfe\xc6\xb1\x03\xdf\x3d\x36\x46\xc6\x38\xa3\x8c\x98\xe4\x7a\x30\x7d\xb2\x70\x72\x0f\xa3\xc9\x84\x82\x35\x32\x47\xb9\x75\x2e\x39\x57\x8f\x42\xf0\x71\x44\xa2\x44\xcc\x92\x34\x5c\x4e\xbc\x87\x10\xf3\xe8\xc2\xb6\x43\x5f\x3f\x82\x05\xe7\x30\xaa\x17\xe5\xa8\x3c\xf7\x3f\x98\x35\xe9\xae\xf4\x4a\x4f\x13\xa4\x22\xd5\x55\x30\x9a\xce\x47\x51\xe2\xba\xb7\x29\xd2\x29\x65\xdc\x9d\xd5\x40\xa7\x7d\xbe\xa8\x82\xc5\x82\x26\xb0\x96\x82\x84\x3f\x80\xb0\xb0\x2b\x6a\xab\xbb\x84\x11\x8c\x69\x16\x8d\x19\x7b\x92\xbd\xaa\x2f\x2c\x6e\x4f\xd3\x89\x80\x85\x7d\xa8\x12\xb5\x72\x78\x75\x7a\xbf\x2a\xb4\x2a\xbd\x05\xbf\x32\xd9\x25\xf5\xd8\x1d\x07\x71\x2c\xf0\x2b\xef\x70\xf8\x88\x66\x81\x5e\xba\x79\xf4\xab\xf0\x2c\x08\x77\x75\xb3\x20\xef\xb1\xff\x25\xa1\x81\xef\x5f\xcf\xa5\x1d\xc6\xb7\x32\x04\xf5\xeb\x4c\x2b\x51\xe3\x77\xcd\xe4\x5b\xb8\x62\x55\xac\xef\xed\x81\x74\x31\x89\x12\xeb\xa1\x52\x1d\x12\xb4\xcb\x22\x51\x95\xb8\x5e\xb6\x95\x06\x3c\x77\x3f\x7f\x5e\x7e\xf4\xe7\x1a\x5f\x57\x43\xd3\x60\x99\x19\xb5\x57\x0d\x7a\x1d\x46\xad\xdf\xff\x77\xc9\x33\xd2\x6e\x93\x61\x33\x6b\x2c\x84\x32\xaf\x4d\xd6\x0a\x78\x63\xbc\x9f\x2b\x27\x94\xcc\xe8\x7b\xeb\xa5\xf5\x17\x7e\x9c\xc9\xbd\x47\x5e\x09\x07\x98\xe1\x07\x73\x4c\x64\x40\xe2\x95\x58\xd4\x8d\x79\x51\x08\x4e\x95\x6c\xfc\xf9\x9c\x33\xa9\xe5\xb5\x4b\xf8\x95\x1f\x29\xa1\x3b\x31\x61\x9d\xd5\x51\x67\x6c\x6b\x25\xb8\x43\x9b\x92\x1f\x79\x32\x21\x90\x37\xf0\x0d\xb0\x48\xe7\x8b\xe2\x12\xab\x04\x1b\x6c\xa2\xb5\xab\xd0\xa4\x47\xc4\x9e\x86\x20\x7d\xac\x80\x1b\xe9\x6e\xaa\xd4\xd1\x94\x17\x13\x95\x03\x11\x55\xd6\x8d\xc1\xb8\x58\xd9\xf0\x88\x05\x37\x19\x87\x7e\x89\x57\xee\x1c\xea\x75\x94\x17\xce\xb3\xbf\x13\x63\x34\xa7\x1e\x8f\x50\x95\xa3\xd7\x35\xbb\xdb\x8b\x7a\x14\x24\xaf\xe9\x97\x8b\x90\x9b\xb5\x8a\x47\x70\x4a\x15\x59\xa4\x05\x7a\xe8\xca\x0b\x4b\xe1\x88\x3b\x1d\x22\xc6\xc3\x3e\xf5\x7e\x50\x80\x9a\x6f\x8a\x8c\xbd\x4d\xad\x47\xbe\x7d\x95\x2c\x48\xfb\xf6\xcb\xf6\x14\x62\x36\x4f\xf6\x70\x8f\x35\x2c\x1e\xc6\xc6\x9e\xab\xe8\x17\x4f\xb5\xdc\xe7\x59\x1c\x52\x8b\x40\x9d\x14\x3f\xb9\x55\x4f\xe6\x06\x03\x39\xdd\xf4\x8c\x66\x97\xc5\x0c\x1c\x91\xa0\x7a\x30\x76\x5c\xaf\x53\xd2\x1c\xcd\xc1\x8f\xf1\x4c\xd7\x7f\x43\xa1\x1c\x2f\xdd\x69\x13\xae\xd2\xf9\xba\x47\xda\x6d\xa9\x7c\xaf\x50\x52\xbc\xe3\xb3\x64\xe9\xf4\x94\xfa\xee\xfa\xb4\xb7\xd5\x28\xd0\xde\x57\xd4\xc9\xc1\x6d\x74\xb5\x52\x2e\x63\x20\x25\x5a\x39\x69\x63\xc6\xfe\xe7\xaa\x32\xf8\xf5\x58\xff\x3c\x45\xc9\x3b\xf8\xc3\xd2\xcd\xb1\x34\xae\x9c\x63\xbf\xa4\x76\x8e\xfd\x7e\x8a\xaa\x43\xfa\x39\xa7\xc6\x06\x1a\x3a\xe7\xee\x7d\x15\x15\x1d\x2b\xbc\x8a\x8e\x8e\xc3\xdb\x4a\x3a\x96\xba\xa2\x96\xce\x2c\x52\xa1\xa6\xe3\x2d\x56\x95\xbd\x89\xa2\x8e\xe1\xb6\x44\x51\xd7\xcc\x4b\xbe\xe8\x56\x03\x45\x5d\xa3\x50\x5e\x5f\xeb\x65\x9d\xe7\xf6\x6f\x15\xf2\xe0\xc5\x57\x21\x10\x59\xc2\x26\x11\x9e\xbe\x22\x91\xd8\x85\x2a\xc8\x44\xb6\x5b\x5d\xfe\x46\x3a\x5d\x2e\x49\x35\x79\x30\xe7\x69\xef\x6e\x9f\xca\xa9\x51\x36\xa0\xbb\xbb\x0f\x3d\x52\xf9\x78\xc7\xc3\x87\x91\x7f\xdb\x28\x6f\xee\xd8\x76\x4c\xb3\x22\x88\x12\xbf\x73\x5b\x07\x91\xfc\x36\xa9\x86\xa8\x39\x50\xdf\x4c\xaf\x26\x6b\x51\xc4\xca\xa8\x75\x05\x51\xd0\x6c\xce\x8e\xfc\xd1\x04\x6a\x36\xfb\x1d\x0a\x97\xb5\x64\x1a\x9d\xd1\x44\x9a\xb4\x98\x47\xea\x32\x5f\xb9\x96\xfd\x0b\x3f\x66\x6b\x73\x5b\xc0\x32\xaf\xdc\x69\xd7\x6f\x7c\x8b\x21\x9a\x2f\x11\xee\x99\xb6\x55\x78\x85\xe3\xf4\x8c\x66\xd9\x79\x16\x15\x05\x05\x73\x2f\xde\xab\x16\xd9\x80\xde\x37\xc6\xdd\x39\x68\xd9\x73\xfc\x8a\x1f\xac\x20\xf4\x51\x34\x4a\x04\x0a\x0b\xd7\xe9\xb0\xfd\xd0\xbe\x11\x32\x5d\xad\xa4\xd5\x9c\xd6\xda\x96\xe0\xcd\xe3\x3f\xc0\x8f\xc1\xc1\x00\x54\xe1\xc1\x9c\xad\x0a\x70\x79\x28\xb4\x59\x6c\xbc\x8c\x13\x50\x7e\xc7\x10\x47\x9f\x29\x09\x48\x1e\x25\xd3\x98\x2a\x27\x5c\x00\xd9\x37\xec\xa1\x81\x82\xb9\x8f\x19\xee\x93\x83\xb7\x76\x75\x45\x4e\xda\x27\x5b\xa7\xed\xd3\xae\x12\x06\x6b\x7c\x00\x88\xee\x99\x78\x67\x5f\xd8\xaf\x61\x89\xe8\xce\x6d\xa0\x38\x2a\xc0\x56\x61\xab\x47\x1e\x81\x31\xf6\x26\xf4\x65\x0b\x7b\xa1\xd1\x1d\x72\x04\x59\xe9\xa5\xa1\x27\xfd\x3a\x94\x9d\x16\xa4\x37\x87\x87\x12\x50\x37\x30\x18\x90\x20\x8e\xc9\x28\xc8\xa3\x31\x77\x7e\x00\x2f\x05\x76\xb6\x85\x02\x27\x4e\xd9\xc9\x58\xf6\xa6\x47\x76\xb6\xeb\x8c\x4e\xcc\x85\x2d\x38\x9a\x3c\x81\x4b\x5d\x24\xa1\x53\x10\x20\x21\x22\xd4\xc9\x69\x8b\xec\xfd\x00\xeb\x53\xa7\x3d\xe6\x89\x95\xca\xb4\x7d\x59\xdb\xaa\x1c\x60\x46\x4b\x7b\x56\xb1\xda\x71\xab\xa5\x34\xab\x7d\x7e\x19\xde\x60\x1c\xa2\xdb\xb5\xb6\x51\x54\xe4\xc1\x03\x82\xbf\x4f\xd0\x6f\xe4\xff\xed\x54\xee\xba\x2a\x2c\xc6\x60\x7a\xa3\xb9\x11\xcb\xb7\x6a\x6a\xe4\x2c\x98\x73\x23\x26\xcc\x9c\x1a\xe4\x6e\xed\x96\x33\x63\xf5\xab\x62\x62\x50\x9b\x5f\x7b\x5e\xee\x72\x62\x4c\xbf\x27\x9a\x91\xa2\x99\x80\xb3\x51\x0b\x6c\x11\xb6\x39\xd2\xf9\x21\xa9\x25\x8c\x15\xb6\xc4\x54\x6c\x3d\x56\x80\xdb\xa7\x27\x3b\x02\x54\xa6\x71\x10\x05\xb1\x75\x6a\x25\xe8\x6f\x77\x77\x00\xac\xde\x60\x7b\xc0\x63\x11\x43\xac\xdf\x13\x50\x63\x77\x34\x91\xd1\x84\x74\x50\x16\xe2\x90\x36\x3f\xbe\xe1\xc4\x02\xc3\xf6\xbd\x86\xd8\xaa\x98\x72\xb1\x49\xc8\x53\xb5\x6f\x9e\x61\xde\x7c\x53\xdd\x52\xc1\xf7\x9c\x09\x17\x9f\x2d\x63\xde\x8d\x8a\x4e\xcc\xca\xf1\x74\x6b\xd7\x6b\x8d\xe6\x59\x65\xf0\xa1\x88\xfc\xd2\xf9\x35\x5c\x28\x96\xee\xf6\xc2\x55\x51\x1c\xe4\x05\x39\x39\x65\xc2\x04\xaf\xf7\x46\xd3\xbe\xee\x9f\x77\x35\x07\x20\x67\x11\xc7\xc1\x12\x1c\x68\xf4\x33\x28\xf8\x54\x34\xd0\x84\x48\x2a\x8c\x63\xd1\x11\x46\x71\x60\xfb\xa6\x89\x8c\x2e\x49\x48\x27\xc1\x32\x06\x45\x68\xbe\x64\x72\xaa\xda\x98\x5b\xc2\x47\x4d\x4f\xc4\x78\xb4\x67\xd1\x38\x46\xdd\x80\x01\xeb\x1d\x71\x45\x51\xb8\xe1\xe9\xad\xd4\xa8\x5e\x3a\x6a\x97\x3a\x62\xb4\x44\x72\x7b\x8d\x00\xc5\x0b\x52\x3e\x69\x31\x8a\xef\x91\x16\x5b\x04\xec\xbf\xd3\xd6\xa9\xa6\x76\x01\x81\xd2\xa0\x50\xb2\x8c\xed\x67\x0f\x68\x36\x1b\xa1\xcd\xf6\x2e\x67\xf5\xb7\x66\x21\xb8\x1e\xaa\x9c\x95\xc0\xf7\x06\xe1\x29\x8f\xcf\x7a\x0e\x37\xbc\x6c\x38\xc6\x78\xd9\xbf\xb0\xea\x2d\x22\x16\xdc\xaa\xf3\xef\x13\x7e\x1a\xff\xf7\x69\xb7\x5e\x44\x10\xca\x5b\xe5\xea\xa1\xfc\xde\xc1\x8a\x61\x21\xa1\x9b\xb3\x0e\xf9\xf0\xd4\xbd\xcb\xb2\x70\xe6\xb9\xb4\x10\xf7\xe8\xf6\xc6\xe0\x75\x46\x6d\xde\xca\x08\x3f\xa8\xd2\x03\xaa\xcd\x16\x6a\x5c\xc1\x2a\xfb\x6f\x6c\x4c\xbc\x4b\x4a\xff\xfc\x5e\x51\x5d\xa7\xb2\x34\x9e\x60\x67\xb2\x82\x95\x39\x85\xd4\xb3\xe4\x93\x53\x9f\x07\xf1\xfe\x62\x99\xcf\x3a\x8e\x5b\x52\xf9\x4c\x5b\xfa\x18\x75\x6b\x66\x63\x71\x1d\xae\x9f\xf9\xbc\x7f\xe2\x96\x90\x13\xcf\xce\x59\x8f\x60\xe7\xb2\x96\x6f\xd2\x5b\x79\xf4\x15\x13\x88\x3d\xf9\xde\x7a\xfe\xa0\xeb\x8e\xd4\x21\x10\xff\xdb\xcf\x9f\xcf\x1d\x6b\x8d\x1b\xd6\xd2\x89\x60\xb3\x09\x7e\x52\x2b\xe6\x63\xe5\xd9\x58\x73\xee\x08\x2d\xdd\x91\xb1\x24\x91\x3b\xdb\x26\x0e\x41\xf9\xfd\xe8\x24\x4b\xe7\x5e\x73\x03\x0e\xe5\xe3\x2d\x23\xfb\xc1\x8e\x65\x20\x64\x58\x06\xad\xf0\x60\x4a\x32\x35\xde\x72\x03\x16\x25\x06\x82\x59\x94\xe1\x4c\xb3\x86\x55\x7d\x15\x5e\x05\x7b\x13\xbe\xb1\xe4\x82\xae\x78\xe2\x03\xdd\x93\x82\x8e\x40\xd7\x43\xb2\x0d\xc6\x0f\x5d\xe9\xce\x59\x20\xaf\x6c\x11\x55\xd6\x89\x9b\x77\x2a\xf6\xad\x28\x28\xf0\xa1\xe0\x77\xec\xb8\xf4\x06\xd9\xe1\x1e\xef\xf9\x6e\x9b\x33\x90\x9c\x04\x93\x82\x66\x6a\x91\xe0\xfe\xde\x68\xad\xfa\xcb\xf8\x1c\x77\x6b\xce\x51\xe2\xb0\x9b\x54\x62\x4f\xc4\x8d\x79\x5b\x56\x3f\x76\xea\x51\xea\x43\xda\x0e\x78\x53\xc9\x68\x1a\x72\x1a\xf2\xb0\xba\x6f\x0c\x76\x63\xaf\x1a\xa6\x11\xa3\x32\xbd\xcd\xa2\x69\xdf\x20\xd1\xdd\x72\xad\x3f\xc4\x1e\x82\xff\x1a\x52\xbf\x34\x48\x6d\xf8\xf7\x87\x22\xfe\x7b\xda\x47\x7f\xbf\x0b\xed\x13\x2f\xe9\xe3\xe8\x8c\x37\x25\x7d\x3b\x86\xd8\x8a\x9b\x8a\x43\xac\x76\xfd\xcd\x76\x16\xb3\x17\xab\xd4\x2f\xe6\xcf\x4b\x6f\xb1\x43\x5f\xfe\xf5\x57\xbe\x84\x17\xe2\xd6\xcf\x35\x52\xad\xeb\x7e\x87\x6c\x91\x0d\xb3\x77\x5d\xee\x90\x89\x87\x11\xf3\x4c\x3d\x77\x3f\x6c\x5d\xba\x19\x0f\xb6\x2b\x9c\xd9\x1b\xb8\xb6\x2c\xbe\x0c\x2e\xb6\xb6\xe2\xd8\xf0\x9c\xab\x95\xb5\xdd\x35\xd5\xaa\xde\x8b\x44\xab\xeb\xb5\x17\xbc\xe5\x57\xbb\xea\x4d\xdc\xf5\x69\x6f\xeb\xf7\x8e\xbb\x7f\x5c\xff\xec\x6d\x59\xf1\xee\x4d\x78\x22\x81\xff\xb9\xad\xcb\x52\x3f\x7d\x5b\xa2\xb7\x6f\x4b\xfc\x60\x6d\xe9\x79\xfd\xb6\x54\xcf\xdf\x96\xe8\xfd\xdb\x12\x3d\x80\x5b\x9a\x2f\xe0\x9c\x1a\x1b\x58\xd8\x38\xfe\x51\xbe\xe2\x23\xb8\x63\xef\x2b\xb8\xe3\xd5\x9f\xc1\x1d\x37\x7d\x07\x77\xec\x3e\x84\x3b\xbe\x83\x97\x70\xcb\x5b\x3f\x85\x3b\x6e\xfc\x16\xee\xf7\x0e\xea\x7f\xdc\xc0\xe2\x6c\x59\x65\x72\x26\x5d\xab\xf0\x1f\x82\x38\x91\xd5\xd9\x12\x9b\x9d\x2d\x0d\x2b\xb1\xa5\xcf\xf0\x6c\xa9\x2d\xcf\x96\xd8\xf4\x6c\x89\x6d\xcf\x96\x96\xf1\x99\xa7\xde\x26\x8b\xe3\x37\xb5\x3f\x3b\xf6\x1b\xa0\x1d\xdf\xc0\x02\xed\xb8\xb1\x09\xda\xb1\xc7\x06\xcd\x2e\x7d\xb3\x35\x52\x61\x86\xd6\x74\x91\x34\x37\x44\xfb\xb6\xc9\x2a\x69\x2f\x73\x0a\x8a\xd9\x71\xd1\xe6\xd1\xf8\xa6\x29\xa1\xc9\x19\x09\x53\x0a\xd6\x0a\xf0\x3a\x30\x48\x42\x70\x60\x4b\xfe\xf9\xe6\xf5\xab\xa2\x58\xbc\xa7\xff\x6f\x49\xf3\x62\x0d\x04\xb3\xcb\x05\x4d\x27\x56\x0e\xf7\x63\xa3\xde\x6f\xb4\x25\x5e\x44\xc3\x7d\x1b\x9a\x7c\xb9\xde\x5d\x33\x22\x45\x96\x42\x9a\x09\x20\xa9\xff\x92\xcf\xd8\xee\x13\x4d\x93\x34\xa3\xc3\x38\x4a\xe8\xda\x35\xb7\x58\x65\x78\x68\xe4\xea\xfe\xfe\xe5\xec\xfd\xcb\xd9\x3f\xf1\xcb\x59\xfe\x6a\x56\xd8\xb0\x19\xcf\x66\xf9\x86\x43\x6e\xf6\x7a\x56\xec\x7d\xc7\x45\x14\x43\x9d\x5c\x9f\x09\x6b\x87\x3f\x4f\x72\xc0\xa2\xe2\x52\xb1\x44\x5d\x64\x1c\x07\x79\x4e\x4e\xa0\xc8\xa9\xe8\x26\xcf\xd0\x4c\x98\x57\xb5\x36\x80\x7b\x23\x58\xa5\x42\xb9\xca\x38\x08\xa9\xf0\x64\xdd\xdc\xc9\x39\x40\xb2\x9a\x8e\xdf\x1e\x7e\xfc\xc0\xce\xd6\x30\x09\xed\x73\x1a\xb5\x39\x69\xb6\x3f\xa3\xdf\x6f\xd0\xef\x9f\xd0\xef\xfc\xd7\x60\x94\xca\x8f\x49\x94\x24\xf4\x52\x7d\xd1\x79\x91\xc2\x53\x46\x99\xb2\x88\xc6\x66\x42\x12\x24\x66\xc2\x3c\x1a\x67\x76\x4a\x1c\x47\x4e\x21\x03\xde\x00\x95\x1f\x46\x91\x69\x16\x24\xa1\x1a\x8a\x91\xf5\x93\xf1\xf5\xd1\xf8\x7a\x67\x7c\xbd\x34\xbe\xfe\xcf\xf8\xfa\x97\xf1\xf5\xd6\xf8\x7a\x61\x7c\xfd\xc3\xf8\x3a\xe6\x5f\x6b\xa7\xe5\xae\x6b\xd8\x1c\xbd\xdb\x7f\xc1\xa6\x78\x48\x76\xb6\x7b\x2a\xf1\xc3\xe1\x4f\x6f\xf7\x3f\x1e\xbf\x7f\xf9\xe9\xf5\xcb\xb7\x3f\x7d\x7c\x35\x24\x8f\x75\x26\xcc\xea\x50\xff\xd4\x39\x25\x94\x33\x24\x5f\x88\x95\xa0\x9d\xa8\x43\xc6\xa7\x17\x47\x3f\xbf\x25\xd7\xba\xa6\x77\x47\xaf\x5f\x33\xe8\x8f\x87\x6f\x5e\x1e\x1d\x7f\x1c\x92\xad\xcd\xcd\xcd\x81\xe8\xa1\xb8\xf1\x7e\x1e\xa7\xe3\xcf\x43\xd2\x66\xac\x33\x2f\xda\x46\xde\xfe\x18\xe2\x18\x0f\xf5\xdb\x46\xfe\x00\x83\xed\xe7\x75\xbe\x4f\xee\xe3\x60\xdc\x6f\x64\x7f\xf5\x8d\x6c\x4d\xb9\x80\xc8\x67\xc1\xce\x5d\x79\x80\x38\xc8\x2e\x17\x45\xfa\xf7\x0f\x78\x73\x18\x43\xda\x23\x1d\xfe\x82\x35\xe8\x05\x18\xb0\x9c\xb6\x37\xb4\x93\xeb\xbe\x01\x28\x2e\xc7\x0f\x54\x45\x12\x79\xf0\x40\xe6\xf6\xa5\xbf\x08\x2e\x26\xcf\xe8\x45\xdb\x7e\x45\x67\x78\xfe\xfa\x81\x6c\xb3\xd2\xb6\xeb\xe3\x6d\xe9\x2e\xd2\x2c\x4e\xe4\x65\xb8\xba\xe0\xb7\x9c\xb3\x13\xeb\xb5\x1d\x07\x95\x38\x62\x9d\xeb\xbf\xa2\x17\x7d\xd0\x5e\x0a\xcf\xbd\x3e\x1b\x23\x86\x15\x39\x6c\xdd\x3a\x3f\xd1\x71\xf5\xdb\x90\x6c\x7f\xf3\x84\x97\x44\x8f\x93\xe5\x9b\x33\xc6\xf2\x14\x8e\x5b\xc3\x6f\xbe\xeb\xb5\x4c\x94\xb7\x86\x4f\x37\xaf\x4f\x7b\xdb\x8d\x7c\x3e\xdd\xf3\xbd\x7b\xbe\xf7\xe7\xe5\x7b\x9a\xed\xf1\x77\xfe\x77\xc0\xf7\x2c\xd9\x7d\x75\xd1\xdd\x23\xb9\xcb\x82\x3e\xc1\x7d\xa5\x50\x43\x36\xaf\xed\x0f\x04\xbb\xd7\xb1\x88\x26\x4f\x31\x00\xfb\x56\x22\xfc\x32\x89\x8a\x37\xc1\x42\x89\x8b\x6d\x29\x51\x0f\x39\x0f\x6a\x6f\x4a\x59\x93\x49\xed\x43\xcd\x16\xdb\x5b\x86\x9c\x3f\x44\x19\x9b\x9b\xaa\xd0\xff\x56\xe4\x8d\x82\xd1\x28\x98\x52\xd5\x12\xce\x43\xc2\xff\xd0\xce\x9b\x7b\xea\x44\xd9\x6f\xaa\xb3\xe3\xf4\x8c\xc6\xc1\x58\x36\x6b\x67\xeb\x33\xc6\xd0\x97\x3d\xf5\x57\x8e\x20\x7e\xaa\x85\xc8\x67\x41\x92\xa4\x89\x31\x6e\x13\x42\x9f\x6b\x86\x15\x10\x35\xad\xc0\xc9\x6a\xe8\x81\xc0\xa8\xd4\xe7\xa5\x61\x35\x50\x5d\x4d\xe2\xec\x36\xf4\x02\x19\x95\xa9\xf3\x98\x3d\x36\x0f\xa0\x7f\x88\x26\xa0\x41\xae\x1e\x38\x04\xfa\xd9\x84\xf5\x81\xe2\xb9\x86\x53\x5f\x65\xc5\xb8\xbf\x8d\xea\xc6\xd5\x37\x2d\x80\xca\x14\x2b\x94\x61\xc5\xfc\xc6\x56\xda\x11\xc3\x22\x08\x85\x29\x29\x98\x7a\x5e\x2c\xe8\x98\x6d\x5e\xca\x3c\x1f\x1b\x5d\x09\xef\x29\x3e\xcb\x29\x5d\xc5\x88\x32\xb8\x50\x84\xe3\xb2\x6c\xb0\xc6\xb3\x20\x0b\xc6\x05\xcd\x72\xa9\xe2\x87\x7b\x79\x51\x1a\xed\x23\xde\x36\xa2\x69\xd2\x43\xb6\xd0\x64\x73\xcd\xef\xf6\x23\x9a\xce\x0a\x22\x3d\xd2\x5a\xde\x7d\xc5\x18\x0c\x69\x93\x83\xf4\xa0\x77\x79\x0f\xda\xf1\xf8\x18\xe2\x16\x22\x00\x03\x11\x69\xe1\xb5\xaa\xba\x21\xde\xea\xf6\x7f\x49\xa3\x04\x82\x35\x90\x67\x50\x07\x19\x92\xd6\x66\xab\x4b\x36\x04\x70\x89\xe1\xdb\x8d\xe7\x02\xa2\xf5\xfc\xd9\x27\x03\x06\xb1\xe2\x6c\x88\x1e\x6e\x70\x8f\xcb\x37\x9d\x97\x32\x43\x44\xd3\x11\x0d\x6c\x9d\x60\x86\x08\x91\x3c\x5c\x1f\xd3\xd6\xbc\x70\x6f\xcd\x15\xb3\x12\x25\xac\x12\x3f\xb2\xb0\x3f\x6a\x8f\xa3\x24\xd6\xb8\x36\x3b\xe4\x1e\x48\x8e\xf9\xd6\xae\x44\xfa\x19\x0f\xf6\x3c\x18\x90\x1f\xa3\x24\x24\xfc\x71\x97\xe8\xa8\x0a\xd6\xcc\x24\x8a\x56\x4b\xdf\xe4\x83\xed\x4b\x0f\xe2\x47\xcd\xe8\x85\x34\x61\x56\x67\x2e\x96\xc6\x4f\x3d\xec\xc4\x51\x7e\x56\x62\xd5\x6c\xe3\x77\x2f\x60\x5c\x23\x6c\x6a\x76\x49\xb4\xb1\xb7\x8d\xc1\x65\x20\x64\x6c\xdb\xa1\x9b\xea\x44\xac\x1d\x11\xfa\x42\xb5\x30\x21\x1d\x5e\x64\x6f\x8f\x6c\x76\x8d\x53\xda\x28\xa3\xc1\x67\x0d\xca\x46\xb9\xb1\x47\xc4\xab\x72\x36\x83\x07\xb3\x20\x3b\x48\x43\x0a\x35\x78\x0f\x61\x6c\xb2\xa5\x39\x4e\x5e\x64\xcd\x28\x84\x4f\xda\x4a\x24\xb2\xcf\x8a\xfc\x76\x34\x02\xcd\xfd\xf7\x10\xc9\x4d\x66\x3e\x2f\xca\x5e\xa7\x9b\x93\xed\xf1\x31\xdf\x59\x64\x74\x12\x5d\xf0\x08\x5a\x9b\x17\x5d\x36\x0b\xc0\x35\xfc\xee\xed\x45\xa8\xb7\xf2\xd9\xf7\xda\x2e\xc3\x11\x34\x88\x81\x9b\x57\x06\x13\xf0\x85\xf8\x34\x7c\xed\x0b\xb7\xeb\xa2\x1b\x98\x2a\x18\xc5\x0b\xcc\xf3\xd9\x87\xe5\x20\xcc\xb6\xf9\x72\x90\x33\xc2\x5a\xd2\xd4\x31\x49\x33\xdb\x84\x2e\x2f\xb2\xb2\x70\xf8\x68\x46\x19\xd4\x58\xcc\xcd\x7e\xd1\x89\x6e\xb6\xd2\xc1\x3a\x51\x44\x06\x37\xbc\xb6\x69\x10\xd6\xdf\x8d\x3d\x92\xc8\x7d\xe1\x7b\xb2\x4d\x9e\xb1\x93\x0d\xd9\x20\x6c\x3f\x48\x7c\x34\x21\x5c\xc8\xcf\xe8\xc5\x5d\x92\x86\x15\x73\xc0\xa6\x8d\x1a\xd6\xf0\x9b\x11\x87\xc3\x33\x10\x75\xfc\x36\x14\xf0\xbb\x4d\xab\xe5\xb1\x74\xb2\x8c\x63\x85\x86\x01\x3d\xa3\x49\xc1\x1f\x0a\x00\xcb\xff\x25\x4f\x13\x12\x8c\x22\x9b\xc7\x4b\xb7\x89\x1f\xd3\x1f\x97\x71\x6c\xbf\xa1\x94\x8f\x09\x58\xe9\x47\xbc\xb4\xfb\x18\x8a\x37\xec\xb4\xab\x19\xbb\xdb\x86\x21\x48\xb1\xca\xb1\xea\x94\x7d\xf7\xc1\x84\x22\x4a\x42\x7a\x71\x34\xe9\xb4\x3b\xed\x2e\xf8\x86\x7c\xb4\xe5\x79\x0e\xa9\xe0\x1d\x3b\xc1\xe2\x72\x41\x45\x73\x00\x04\x54\x64\xfa\x33\xeb\x44\xdd\x2f\x32\x7e\x70\x9f\xc1\xef\x92\x6b\x21\x8a\x99\x96\x7f\xaa\x15\xb2\x41\xda\x1d\x36\x73\xaa\xf6\x0d\xd2\xee\xb6\x1b\xad\xbd\x30\xca\x17\x71\x70\xc9\xe7\x05\x7c\x8c\x26\x05\x93\x6d\x15\x36\xec\x37\x6b\x17\x90\xfd\x82\x17\xab\x7a\xe1\xca\x6a\x33\x27\xdf\xbf\xbc\x8c\x1e\xb0\x2d\xcd\xa2\x18\x3a\xed\xcb\x60\x8b\x97\x1d\x61\x56\xd7\x25\x8f\x7e\x50\x89\x6a\x5a\xdd\xbe\x55\x3e\x7c\x56\x36\x9b\xce\xcc\x1a\x68\x16\x60\x7c\xb2\xc9\x33\xfb\x4d\xab\x78\x0f\xc6\xd6\x8c\x76\x36\x32\x18\xe8\x81\xa6\x67\x34\x8b\xd3\x20\xa4\xa1\x52\x04\x7b\xd6\x04\x1e\xc0\x47\x4d\x24\x65\x6f\x1a\x07\xe4\xe3\xd1\x8b\xa3\x21\x99\x07\x9f\x41\x35\x1c\x25\x67\xcb\x38\xa1\x59\x30\x8a\xe9\x5d\x0e\x50\x9f\x06\xec\xd7\xbb\x5b\xe4\x11\x41\xd9\xdd\x6e\x3f\xa3\x8b\x38\x18\xd3\x4e\x9b\xb4\xc1\xa9\x1b\x3b\x2d\xb4\xcc\x08\x91\x69\x72\x46\xb3\x22\xd7\xf1\x36\x41\xee\x0b\xe9\x38\x9a\x07\xb1\xcd\x64\xa3\xc4\xcf\xec\x8b\xf4\x05\x2f\xe0\x52\x5e\x65\xec\x4c\xd3\xad\x21\x17\xf0\x44\x4d\xb5\xd1\x1f\x8b\xd4\x0d\x8e\xa9\xc2\xcf\x34\x19\x63\xad\x6c\xcb\x78\xe2\x5d\x8d\x0b\xd5\x55\x1d\x99\x35\x91\x5a\x52\x77\x7c\x9e\xb8\xdc\x42\x7d\x6a\xee\x28\xc6\x61\x9f\x03\xc4\x34\xcf\x3f\xce\x82\xa4\xb3\x09\x4e\x64\x1f\x71\xab\x73\x61\xbd\x2f\x08\x6b\xab\x0b\xb1\x5b\x51\x8e\x81\xc5\xfd\x25\xb8\x69\x16\xa8\x0c\x92\x4b\xe1\x78\x47\xb8\x23\x4d\xca\xd1\xda\x17\x78\xdd\x4f\x42\xae\xfe\xe7\x34\x14\x4d\x2e\x73\xe1\x48\x3d\x27\x23\x3a\x49\x33\xda\x77\xe8\xea\x95\x38\x3a\x54\xe3\xfe\x4a\xec\x41\x35\xa4\xf5\x0a\xf6\x79\x03\xf9\x6a\xfd\x3e\x14\xa6\x62\xf3\xe0\x82\x87\xad\xbc\x88\x8a\xcb\x21\x79\x0a\x2a\x6c\xb9\xeb\x44\xb9\x70\x69\x0c\x45\xbb\xf6\x26\x83\x26\xb9\xb3\xc1\x20\x76\x8d\xa2\x78\x3a\xab\x0b\x5b\x65\x85\x21\xdd\x19\xa3\x1d\x76\x0a\xe1\x48\x6b\x7b\xab\x80\xf8\x4a\x7f\xff\x70\xf4\xb6\xaf\xb0\xcc\xdb\xd3\x0e\x2c\xc1\x75\x6c\x4e\x02\x3b\x94\x67\x8f\x2c\x82\x3c\x67\xbc\xab\x98\x65\xe9\x72\x3a\x33\x57\x80\x1a\x88\xa0\x35\xa8\xd5\xbd\x9c\xd4\x5c\xed\x11\x9c\x96\x3c\x32\x6f\xe9\x88\x25\x80\x78\xdb\x61\x56\x57\x53\xdb\x99\xb4\x1f\x45\x15\x90\xce\x7a\x94\xff\x18\x25\x51\x41\x2d\xa4\x5b\xdd\x00\x09\x11\x75\xc2\x94\xb2\xdc\x8e\xa2\x75\xf1\x5e\x6c\x2a\x7c\x1d\xb0\xf3\x52\x02\xdc\x9f\xfc\x4c\x6d\x41\x6a\x4a\x0b\x08\x57\x7c\x34\x39\x4e\x22\xaf\xb6\x0b\xca\x16\x33\x2a\x7e\xa8\x05\x47\x8a\xb4\xa7\xb4\x53\xca\x21\xba\x37\x6a\xa3\xea\x87\xaa\xa6\xc3\x3b\xd3\x85\x22\xe0\xb6\x2b\x27\x34\xcb\xd2\x4c\xba\xa4\xe1\x3d\xce\x49\x92\x16\x64\x9c\x66\x19\x1d\x17\xc3\x73\xb5\x6e\xcc\x5e\x1b\x0b\x88\x15\x94\x24\xb0\xe4\x99\xf0\xdf\x33\xf8\xaf\x5f\xa4\xaf\xd3\x73\x9a\x1d\x04\x39\xed\x00\x73\xe1\xfa\x5e\xcd\xc7\x18\xd4\x3f\xc4\x2d\xb3\xb8\xba\x39\x61\xff\x9f\xea\xa3\x38\x02\xc1\x7e\xbf\x31\xe1\x71\x4f\x64\x09\x3d\x27\x2f\xd9\xa8\x3a\x6d\xb8\xea\x85\x8e\x80\xad\xea\xbf\xdb\x05\xa1\x17\x51\x5e\xe4\x3d\xb2\x88\x69\x90\x83\x58\x0c\x23\x4f\x13\x85\xaa\x49\x1a\xc7\xe9\x79\x94\x4c\xa1\x64\xce\xb8\xa0\xb5\x8c\x44\x0f\x7b\xe0\x5f\xa1\xa7\x9f\x7d\x54\x44\x89\x55\xbd\x07\xef\x57\xa6\x57\xe1\xe0\x33\x85\x45\xc8\x19\x3e\x5c\x46\x47\x60\x4f\xab\x98\x2c\x27\x01\xc6\x6a\xc1\x57\x05\x9f\x78\x8e\x5a\x41\x59\xef\xd2\x3c\x8f\x46\x31\x9f\x42\x70\xa1\x21\x8c\xfa\x3e\x1c\x32\xf9\x32\x2b\xf8\x4f\x26\x52\x4b\x6c\xbd\x9c\x4c\xa2\xe9\xa5\xf8\x38\x92\xa4\xf4\x88\x7c\x66\xcd\xf3\x3f\x7d\x5d\x05\x9f\xe2\x66\x8b\x83\xcd\x35\x98\xba\x5c\xe2\x9f\xf2\x2a\x8a\xc3\x4d\x35\x9c\xba\xff\xe1\x9f\xe2\xc2\x48\xe7\xf1\x02\x8f\x1e\xa9\x85\xa9\xef\x71\x78\x81\x5f\x83\x51\x6a\xe4\x79\x4a\xc8\x7b\x18\x3e\x00\xb8\xbe\xc1\x79\xbc\x04\xea\x05\x2a\xcc\x3f\x05\x16\x10\x08\xb1\x20\xd0\x07\x5c\xa6\x08\x84\x50\x8d\xc3\x29\xfa\x5d\xc8\xdf\xb6\x48\xc1\xf9\x82\x75\xf2\xbd\x52\x72\x3a\x27\x87\x71\x90\xb0\x93\x41\xa0\x58\xb3\x48\x17\xba\xb2\x34\x23\x01\x79\xf5\xf2\x9f\x70\x08\x97\xd2\xda\x9d\x31\x14\xb5\xcf\xca\xa3\xdd\xcf\x33\x2a\xfd\xec\x05\xe8\x2a\x57\x44\x41\x41\xc1\x02\xd8\x7a\x0a\x72\x72\x4e\xd9\x02\xd1\x0e\x56\xe4\x30\xd6\x90\x34\xf4\x33\x35\x8e\xe4\x72\x9c\x98\xa5\x70\x51\x87\xd5\x2c\x99\x04\x16\x8a\x78\x09\x1c\x35\xd6\xe4\x54\x9c\x3b\x59\xf2\x10\xde\x86\x45\x05\xe4\x99\xd1\xc8\x10\x7f\x21\xc9\xaa\x76\xf9\x06\x1c\xc7\x9e\x15\x7c\x4e\xa3\xfb\x05\xfb\xdf\xb2\xc4\x8b\xb4\x6a\x81\xa3\xf3\xc2\x6f\xb6\xd4\xd9\x6a\xfb\x1d\x17\x3b\x20\xe4\x6e\x96\x7a\x11\xcd\x69\xfe\x7b\x2c\xf3\x44\x28\x17\xd9\xe2\x56\xaa\xaa\x9c\x1f\xf3\xd9\x16\x4d\x94\x29\x8b\x43\x0d\xaa\x23\x8d\x68\x42\x53\x81\xbc\x3a\x64\x53\xaf\x49\xc1\xac\x4d\x39\xb9\xd2\x15\x68\x00\x85\x7e\x6c\x7b\x63\x4d\x42\xcd\xf1\xe7\x1b\x26\x03\xc2\xaa\x97\xe5\xc5\x8f\xab\x2b\xb2\xb9\xeb\x3d\xdb\x88\x7a\x9d\xb3\x09\x4f\x37\x0e\x44\x02\xe5\xb2\x27\x0f\x1e\x10\xf1\xdb\x27\xf3\xb3\x26\xed\x5c\x7c\xc0\xf0\xb9\x40\x33\x44\x31\x51\x58\xa9\x44\x36\x2f\xda\xbd\x76\x1b\xdf\xb7\x58\x8e\xd2\x7c\xa5\x31\x9d\x94\x8a\x74\x89\x0c\x1d\xeb\xa1\x14\x45\x27\x1c\x4c\x06\xf1\x50\x27\x31\x61\x35\x09\xb0\xc5\x79\xda\xce\xc9\x58\x85\x74\x71\x48\xcb\x8c\xf8\xd2\x84\xbe\x4a\xa8\x06\x9d\x91\xcd\x3a\x4d\x7d\x97\x41\x32\x0c\x7c\x84\x28\xcb\xb7\x5e\xe1\xc5\x77\x07\x39\xad\x53\x05\xb0\x46\xa2\x76\xea\x5a\x93\x5b\xfe\xb5\x60\x96\xfb\x8b\x78\x99\xeb\x2e\x88\x6f\xaf\x77\x43\x05\x64\x2a\x92\x66\x74\xfc\x39\x97\xa7\x26\xce\x22\xe5\x2d\x67\x2e\xde\xca\xc5\x97\xe0\xc6\xd7\x1b\x8c\x98\x93\xfc\xd8\x1b\x88\xd8\x0c\x29\x8c\x1a\x60\xeb\x3f\x40\x05\xb0\x63\x3b\x08\xae\x24\xa6\xce\xaa\xdc\x98\x39\x51\xde\xd2\xa0\x0d\xfe\xb3\x79\x71\xb2\xf9\xe8\xbb\xe0\xd1\xe4\xf4\xcb\xe3\xcd\xeb\xff\x19\x44\xfd\x82\xe6\x85\x02\x5f\x61\xf0\x15\x63\xfe\x4a\xa3\x6d\x30\x4e\x50\x00\x0c\xfe\xd3\xd9\xbc\xe8\x3e\xab\x1c\x28\xa6\xc0\xc1\x40\x07\xcb\xe2\xe1\xb0\xa0\x7b\xdc\x85\xb0\xb0\x3a\x9c\xc3\x43\x5e\xb6\x21\xa3\x61\x9b\x14\x2c\x3c\x01\x12\xd3\x57\x85\xb7\x33\x66\x5f\x18\xa3\x43\x60\xfb\x8f\x7e\xf4\x82\x59\x5d\x86\xd8\x5d\xed\x1c\xbc\x1d\xe7\x73\xf6\xef\x38\x58\xe4\x20\x3c\x88\xdf\x3d\xec\x9e\xd1\xee\x2d\xf7\x3a\x8f\x3a\x6b\x54\x7e\xa4\xf6\x76\x8e\x19\x1a\x8c\x67\x64\x1c\xe4\x4e\x35\x51\xce\xa9\x64\x39\x17\xb3\x83\x48\x89\xaf\xb1\xe6\x04\xc5\xdb\xca\x97\xf3\x39\x0d\x4b\x69\xcb\x6a\xee\xae\x69\xcc\xaa\xbe\x8a\xd6\x06\x03\x3e\x20\x0b\x39\x81\x2a\x29\x7e\x39\x1b\x90\xd6\x86\x08\x88\x57\x41\x0e\xae\x68\x66\xc1\x8e\x6c\xc4\xd4\xa4\x48\x59\xc7\xe7\xee\xe5\xf1\x26\xdc\x50\x12\x8b\x3c\xc0\x75\x77\x31\x23\x31\x85\xc7\xd4\x28\xfe\xde\x62\x41\x33\xd6\x5b\x39\x0f\x09\xc4\x2e\x9c\x46\x3c\xbc\x5d\x90\xd3\x79\xb0\x60\xf3\xb1\x65\xe8\xf9\x3a\xca\x7e\x01\x75\x1a\x9c\xb2\x6d\x3d\xe9\x92\x1f\xc8\xb7\x6c\x37\x17\x59\x27\xd1\x69\xbf\x48\x8f\x59\x43\x42\x13\xb4\xbe\xb7\x87\x32\x81\xe2\xab\x2b\xfc\x7e\xcf\x53\x23\xd6\x2d\x59\x35\x96\x78\x0a\x47\x6b\x52\x73\x7c\x83\xef\xeb\xe8\x0b\x8a\x4c\xdf\x88\x83\x9e\x24\xc7\x12\x5a\x2c\xd2\x3b\xa5\x45\xa9\xbc\x56\xfb\xf2\x0a\xa4\x88\x54\xc6\x8a\xfc\xec\x47\xd7\xa2\x9d\x76\x5b\xd0\x92\x4b\xa7\x06\x82\x6f\x44\xb5\x08\x68\xec\xf4\x9e\x55\x54\x41\xc7\xb2\x17\xe8\xd6\xdd\xa6\x69\x60\x79\x33\x6d\xf9\xc7\xa8\xf4\x3b\x76\xee\x99\x70\xff\xf9\xf2\x22\x4e\x91\xb8\x41\xc1\x75\x04\x6c\x92\x90\xdd\xff\x8d\xbd\x52\xea\x46\xf4\x65\xb3\xd2\xda\x9a\x2a\x69\xd3\x2a\x69\x4a\x9e\x5a\xd2\x34\x18\x69\x91\x32\x89\x32\x0a\xc9\xf6\x26\x77\x19\xf4\x48\xdc\x0f\xf2\x36\xf9\xf3\x84\xcd\x0b\xc2\x6d\x3b\x5c\xdb\xae\x5a\x52\xf6\x5f\xf6\x0b\xe7\x03\x98\x6f\x2b\xfb\xad\x66\xf4\x6b\x49\x33\xde\x6d\x4f\xfa\xd4\x95\xf8\x40\x32\x3c\xdf\x6b\xab\xb6\x59\x4f\x45\xe2\xee\xcb\x57\x9f\x09\x21\x23\x2f\xc2\x8d\x92\xaa\x51\x3f\xa6\xea\x91\xc7\x9b\xfe\x4b\x02\xe9\x87\x58\x1e\xa6\x73\x2d\xe5\xd6\xc7\xd8\xf4\x9e\x24\x7d\x37\x5f\x46\xdc\x4d\xbe\x93\xf9\xce\x80\xa4\xc3\xbb\x61\x89\x85\xb2\x6f\x49\x5e\x04\xc9\x98\x71\x11\x5d\xf8\xea\x4a\x21\x4d\x14\x86\xc7\x6b\xf0\xcb\xf0\x9b\xe1\x4d\xe5\xa6\x11\xc0\x8b\x54\x95\xed\xa6\x88\x92\xe7\xe1\x3a\x2c\x7d\x70\x6c\x8b\x1a\xa2\xc8\x13\x21\xc9\x8b\x1f\xc1\x5a\x45\xcf\x60\x34\xbc\x6f\xed\xbb\x43\x0f\xef\x4b\x63\xdc\xc8\x1e\xd7\x63\xe7\x47\x6d\x43\xb2\x2a\x7e\x64\xd1\x1b\x61\x48\x96\x68\x37\x1c\x11\xeb\x53\x51\x3f\x1c\xde\xf5\x1b\x0c\xe6\x48\xf4\xad\xe1\x62\x60\xf2\x45\xb2\x8c\x63\x08\x92\xd0\x71\x57\x08\xd8\x6d\x83\x0a\xc3\x33\x76\x71\x5d\xdb\x70\xe4\x23\xde\xd9\x06\xec\x80\x03\xde\x84\x19\xf0\xa4\x1b\x4d\xa4\xe8\x5e\xd3\xd1\x80\x07\xc0\xfa\xb1\x38\x01\x35\x1a\x8e\xc4\x0d\x8a\xd1\x90\xa5\x41\xc1\xca\x31\xd8\x07\x12\xbe\x8f\x82\x89\x5c\x2a\xa9\xce\x1c\xc4\xdf\x73\x73\x5d\x69\x03\x84\xca\x31\xb0\x62\xf6\xa3\x01\xe5\x39\x29\xbb\x74\xf7\xa9\xf5\x75\xb8\x98\xe4\xaf\x70\xb5\x2d\xeb\x35\x19\x43\xd4\xa7\x0e\xf5\xec\x6d\xf8\x38\xba\xca\xa8\x03\x31\xee\x97\x6c\x02\xe9\x72\x4e\x46\x71\x3a\xfe\x4c\x66\x34\x08\x69\xc6\x3e\xd2\xb9\x6d\xb4\x11\xe5\xcf\x59\xb2\x4f\x68\x98\xd1\x0b\xe5\x16\x1d\xca\x92\x49\x14\x17\xb6\x32\xd3\x43\xb0\x00\x6b\x78\x1f\x66\x29\x95\xe7\xfc\x6f\xb6\xb6\xf5\x41\x9f\x83\xd7\xe0\xa5\xfc\x98\xce\xeb\xc2\x55\xf9\x4e\xe9\x2e\x94\x2f\xe0\xb0\x3e\x69\xaf\xb9\xfd\xb8\xc1\xcc\xc4\x29\x13\xf3\x16\xd1\xd8\x9d\x87\x8f\x2c\xb9\x6e\x1e\x0a\x05\x54\x31\x01\x50\x93\x31\x01\x50\xac\x72\x02\x9e\x3c\xd6\xf8\xe7\xd0\x37\xc6\x3f\x54\x85\x6b\xf2\xa1\xdf\x01\xba\x11\xf6\x4b\xfc\x8e\x08\x91\x6f\x28\x7f\xf4\x64\x2a\xbc\xf9\x19\xaa\x5f\x3c\x1d\x04\xc3\x21\xff\x4f\xa6\x08\x03\x92\xa1\xfe\xc9\x73\x90\x71\xc9\x10\x7f\xc8\x72\xc7\xc5\xe4\xe9\x50\xfc\x2f\xd3\xc0\x5c\x65\x28\x7f\xe8\x7a\x38\xac\xfc\xa5\xd3\x05\xbc\xfa\x29\xea\x71\x6d\x6e\x87\xbe\x44\x0e\xed\x9a\x72\x0e\x3d\x69\x06\xac\xb4\x9a\x1c\xda\x09\x72\x1c\x3f\x53\x18\xc5\xcf\x14\x8d\x01\xd2\xc4\x0f\x09\xa7\xa4\xc5\x21\xfe\x90\xb9\xa6\xca\x7a\xe8\xa4\x28\xac\x71\x41\x7d\xa8\x7f\xf2\x1c\x24\x1d\x0f\xf1\x87\xcc\x35\x4e\x22\x43\x3b\x41\x42\xa1\x7c\x2b\xc7\x3a\xba\x0f\xdd\x24\xd9\x43\x07\xd2\x49\x92\x75\x4a\x61\x6c\x88\x7e\xe3\xfe\x26\xd3\xa1\xfa\x25\xd3\xf9\x9e\x3a\x54\xbf\xd4\xe8\xf9\x7a\x1f\xea\x9f\x6a\x4c\x6c\x97\x1c\xca\x1f\x32\x95\x6d\x58\x43\xf1\xbf\xaa\x83\xf1\xbb\xa1\xfc\x21\x53\x81\x6d\x0c\xe5\x8f\x1e\x2c\x30\xee\x9f\x4e\x3c\xea\x6e\x0d\xb7\xbe\xeb\x55\xba\xb7\xe9\xb5\x96\xc5\xe4\x69\x6b\xf8\xf4\x9b\xeb\xd3\xde\xf6\x56\x13\x87\x0f\xe6\x12\xde\xe3\x0b\xb8\x25\xfc\x1c\xb4\x86\xa4\xb5\xd9\xdf\xde\xec\x6f\xb5\xd6\xae\xa5\x27\xb8\xed\x46\x81\x8a\xef\x1d\x49\xdc\x3b\x92\xf8\x2b\x38\x92\x10\xb5\xac\xb9\xae\xe0\xfe\x4e\x27\x93\x8c\x5e\x92\x9f\xa3\x78\xfc\x99\x92\xef\x7f\xa1\x93\x89\xed\x4d\xa2\xa1\xc3\x38\x00\x8b\x82\x84\x1c\x31\x89\x3b\x00\xa8\x28\x48\x5c\xb0\x1f\x83\x11\x03\xfb\x47\x3a\xa5\x71\x5e\xd0\x38\xa6\x19\xf9\x7e\x02\x89\x2e\xf0\x4f\xc1\x19\xf9\x39\x4d\x43\xf2\xfd\xb4\xd4\xcb\xc5\x63\xed\xdd\x47\xb8\x82\x7c\x13\x24\xc1\xd4\x74\x3d\xd1\x1f\x30\x2c\x0c\x32\x0e\x30\xe7\x00\xd2\xc5\xc4\xe1\x08\x0e\x47\x36\x70\x34\x0a\x12\x09\xf2\x12\xac\xf8\x6d\x08\x2e\x79\xe5\x03\x5a\xcc\x24\xe0\x8b\xe7\x15\x70\xe1\x48\xb9\x9b\x9d\x55\xd5\x97\xcf\x54\x7d\x6f\xc1\x31\x79\x19\x60\x42\x0b\x09\xf8\x8e\x66\x39\xbc\xa4\x2a\x87\x5e\x08\x10\xd5\x89\xf3\x20\x9b\x57\x75\x83\xe5\x2b\x60\x5a\x14\x10\xb4\xc9\x85\xcf\x45\x96\x04\x95\x5c\xc5\x80\x94\xec\x82\x9d\xa8\xb4\x6f\x8f\x28\xb6\x2a\x44\x51\xe5\xcb\x5d\x84\x70\x20\xe9\x8c\x49\xbc\xdb\xa0\x49\xe8\xe9\x1b\xcf\x90\x60\xcf\xe1\xc4\xe4\x42\x8d\x58\xba\xc2\x64\x96\x2e\x68\x56\x5c\x7a\xe0\x16\x22\x4b\x82\xbe\x2a\x8a\xc5\xbb\x2c\x3d\x8b\x42\x2f\xb9\xb1\x85\xba\x10\xd9\x8a\xd8\x16\xe3\x8a\x12\xd1\x62\x6c\x17\x68\xe6\xd0\x70\x6d\x4d\xc9\xea\x3f\xd3\xd1\x0e\xe9\xc8\x6a\x4c\xa7\xbc\x99\xbd\x42\x12\x7a\x6e\x2d\x1b\x5d\x12\xf9\xe7\x15\x91\x56\x51\xcf\x25\x14\x02\xa2\xfc\xa9\x0b\x3d\x67\xcb\x05\xfc\xf4\xe3\x2a\xc2\x91\xc8\x7c\xf1\xdc\xc9\xcb\x67\xb2\xe4\x87\x99\x5b\x32\x81\x35\xc0\x72\xdf\xd2\xc2\xc9\x5d\x68\xc2\x67\x20\x72\x1d\x38\x70\xa3\x5f\x7f\x95\x6d\x30\xba\x76\xfb\xa0\x09\x1c\x80\xc4\x67\x07\xc3\x68\xca\xd6\x47\x8d\x60\x11\x0d\xd5\x66\x28\xfe\xe7\x47\x0e\xdc\x49\x81\xad\xdc\x28\x8a\xc9\x67\x68\x7c\xf5\x14\x0c\xa2\x97\x21\xfe\x70\x9a\xf8\xa4\xd6\x00\xff\xe1\x0c\x50\x00\x74\x74\xfb\x82\x9c\x23\x9a\x0f\xd1\xef\x0e\x37\xe6\xb9\xee\xee\x32\x89\x69\x30\x00\x0f\xbc\x39\x25\x7a\x0c\x29\xdf\x89\xc1\x25\xd0\x1a\x23\x37\xcf\xf8\xea\xc6\x56\x3a\x2e\x26\x34\xca\x3a\x65\x38\x4d\x8a\x29\x0f\x87\x0c\xae\xa7\x71\x5c\x78\x65\xd2\xf6\xf4\x25\xa3\x3c\x56\x84\xee\xc5\x67\x4a\x17\x87\xf9\x87\xcb\x64\x1c\x25\xd3\xca\xae\x40\x59\x0b\xbe\x19\x05\x7a\x3a\x82\xf9\xc2\x73\x6d\xbf\x62\x41\xc9\x57\x30\xdc\x9b\x14\x7c\x79\x60\xe4\x8b\x59\x09\x05\xdf\x1e\x38\xf1\xec\x5a\x82\xb1\x4f\x07\x0a\xbf\xc0\xe5\x80\x2a\xc5\x0b\x6b\xd4\x29\x13\x3c\x6d\xeb\xe7\x54\xb2\x79\x91\xe2\xad\xd5\x86\x46\x69\x9e\xba\x31\x2e\x65\xed\x55\x38\xe5\x16\x8e\x12\xf2\x67\xea\x1f\x19\x86\x12\xdf\x0e\x1c\x36\x6c\xe1\x90\x2a\xc5\x03\xeb\xde\x0a\xcb\x32\x07\xf6\x6d\xa1\xd3\xe7\xb2\xb2\x4e\x8e\xa7\xdd\xc3\xe7\xfb\x6f\x51\x63\xec\xd3\x81\xd2\xde\x69\x38\x98\xf8\xf6\xc1\x49\xc7\x29\x0a\x10\x12\xd8\x2e\x66\x2f\x7c\xbe\xf5\xe3\x87\xdc\xfc\x52\xc8\x74\xae\x68\x5e\xd7\xc1\x9d\xb4\x0d\x59\x76\x7d\x1a\x46\x19\xa8\x8a\xc7\xc1\x02\x1e\x5f\xa0\x0b\x4c\xcf\x8c\x1e\x1e\xec\xbf\x33\xd6\x3e\x2b\x87\x2d\xe4\x22\x2e\x4a\xb2\xe5\xcb\xa4\x4a\x9e\x6f\xbc\xf5\x64\x10\x7d\xd1\x8c\x5c\xd9\xe0\x4f\x46\xf1\xdf\xaa\x80\xa3\x27\x8a\x77\xc3\x5e\x27\xc4\x91\x8e\x79\xe7\x9c\x80\x0e\xa6\x2d\xf7\xa4\x24\x0d\x69\xbb\x67\x40\x4c\xc1\x2e\x64\x48\xda\x4c\xe8\xf8\x34\x8e\x23\x9a\x14\xff\xe0\xe0\x6d\x7d\x27\xdd\xed\xdd\xa4\x35\x5a\x9c\xa7\xd9\xe7\xb2\x06\x13\x5a\x7c\x12\xa0\x16\x88\x19\x2f\x60\x68\xaf\xf2\x5b\x76\x8b\x0a\x85\x76\x59\xbf\x68\x31\xfb\x04\x73\x3d\x4e\xe3\x7f\xfc\x0e\xfd\x3b\x9f\x45\xf9\x42\xb9\x46\x76\xba\x97\xcf\x66\xb7\x46\x1b\xfc\x3c\xf5\xee\x25\x51\x7e\x90\x26\x09\x77\xd9\x84\x96\x5b\xd7\xa0\xbd\x8e\x77\xbb\x7c\xf0\xc0\xbb\x8d\xe2\x2a\x3b\x5d\xff\x0e\xc6\x9d\x14\x48\x99\xbc\x94\xe6\xc1\x38\x14\x02\x27\x08\x89\xc6\xab\xb7\x65\x75\x4b\x67\xa2\xf8\x84\xc0\x55\x4e\xc6\xc1\xa2\x35\xdc\xde\x64\x49\xf8\x48\xd2\x1a\x6e\x6f\xb1\x34\x7d\x1c\x68\x0d\xb7\x1f\xab\x14\x2e\x3a\xb5\x86\xdb\x4f\x55\x12\x16\xee\x5b\xc3\x9d\x6d\x95\xc1\x56\x78\x6b\xb8\xb3\xa3\x13\xb4\x50\xdf\x1a\xee\xe8\x4a\xf5\xb1\xb0\x35\xdc\xf9\xd6\x49\xa6\xc5\xac\x35\xdc\x79\xea\xa4\x27\xb4\x68\x0d\x77\xbe\x73\xd2\xa5\x20\xdc\x1a\x3e\xde\x74\x32\xf3\xd9\xac\x35\x7c\xbc\xe5\xa6\x33\x59\xb8\x35\x7c\xac\xbb\x2f\xcf\x38\xad\xe1\xe3\x6f\x54\xa2\x79\x70\x6e\x0d\x1f\x3f\x51\x59\x52\x6a\x69\x0d\x1f\x7f\x5b\xad\xdb\xbb\x3e\xed\x6d\xef\xdc\x6b\xde\xee\x35\x6f\xff\x2d\x9a\xb7\x20\x8e\xc1\xbf\xc4\xed\xdc\xb8\x22\x05\x97\xa3\x0a\xf1\xe9\x42\x64\x94\x98\x97\x67\xdc\xa2\x1f\xe9\x18\xa0\x37\x12\x4e\xc7\x8c\xa9\x0b\x8e\xe4\xea\x69\xbc\x8a\x9a\x1f\xe1\x72\xd7\xaa\x0c\xd2\x24\xc4\x39\x0f\x7d\x64\x82\x48\x56\x24\x32\x95\x73\xd7\xfd\x38\x36\x86\x62\x0a\x46\xe6\xd1\xaa\x07\x37\xf5\x3d\x62\x99\x96\x95\x28\x3d\xcc\x04\x7c\x44\xfe\x85\x5f\xce\xb3\xff\x70\xb2\x63\x2e\xc9\x37\x21\xa7\x87\xd5\x51\xbe\x2d\xa9\x55\xba\x03\xdf\x53\xbf\xae\xae\x20\xfc\x0d\xb1\xdd\x3e\xb0\x44\x48\x3d\x69\x33\x29\x14\xc2\x0a\xb4\x7b\xa4\x5d\xa4\xfc\xe7\x69\x9f\xa3\x19\x85\x3b\x9c\x78\x6e\x43\x45\x33\x27\x93\x53\x30\x70\x51\xf6\xa1\xe2\x86\xb4\xeb\x89\x99\x6d\x55\xc3\xfa\xc3\x8a\xef\x21\xe2\xe1\x1e\x74\xa0\x23\xfc\xbc\xa4\x63\xe0\xe9\x06\xa5\xcd\x82\x7e\xb7\x05\xae\x28\x34\x5e\x0d\x3c\x9b\x8f\xbb\xb0\x73\x8a\x2a\x8c\x7b\x82\x16\x87\x41\x11\xc8\x11\xb0\xdf\x7d\xf6\x0f\xd9\x43\xbf\xaf\xae\xc0\x28\x56\x01\xc0\x55\x72\x2e\x41\xc4\xd7\xd5\x95\x0e\xbe\x09\xda\x46\xd6\xb4\xbc\x23\x47\x80\x27\x9b\xa7\xfd\x9c\x31\x04\xe5\x61\x9d\x41\xcf\x85\x80\xa3\x29\xcc\x9d\xae\x5f\x3c\xd3\x85\x5b\xd9\x13\xa6\xb6\x42\xba\x73\x2f\x6d\x3b\xbf\xa8\xe7\xe9\xdd\x93\xcd\x53\xf4\xf0\x6a\x1d\xda\xef\x92\x2f\xf0\xd4\x21\x48\x92\xb4\x20\x93\x28\x09\x79\xbf\xa2\x64\xca\x1b\x7a\xa6\x9a\x1f\xa7\x49\x9e\xc6\xb4\x7f\x1e\x64\x49\xa7\x8d\x4b\x70\x67\x39\x8c\x15\xc7\xe9\xb4\x8d\x4c\x5f\x45\x8f\x19\x2a\x1c\x87\x4b\x54\xb0\x21\x1c\x98\x0b\xe6\xae\xe3\x5b\x9d\x3d\xde\xad\x9e\x49\x10\xe6\x11\x0a\x6a\x94\xbe\x0e\x61\x8a\x1b\x2c\xc7\x0b\x3a\x66\x12\x80\x67\x3d\xf6\xc0\x21\xd3\x28\x18\x7f\x56\x21\x44\xc1\x13\x81\x38\xec\xca\xeb\xd6\x4e\x90\x4d\x97\xf0\x12\xe4\x44\xfd\x42\xce\x78\x4c\x2b\x74\x59\x23\x84\x7e\xae\x2c\x86\xdd\xc6\x75\x1c\x08\x36\xf1\x5b\xa6\x1b\x0b\xcd\x36\x92\x65\x1c\x3b\xe8\x4e\x25\xa5\x09\xe7\x77\xfa\x00\x2c\x21\x26\x28\xc8\x1a\xd7\xcc\x02\x26\xfb\xa3\xc8\x54\x1a\x22\xf1\x9b\x73\xf6\x4e\xda\x83\x83\x52\xbb\xe7\x65\xac\x3d\xc9\xde\xd9\x61\xab\xd3\xed\xe9\x86\x10\x86\xeb\x67\x2a\x28\x8a\x60\x3c\xfb\x98\x1e\x48\x3f\x58\x78\xca\xa4\x73\x2c\x7c\xe6\xd6\x53\xcb\xc7\xcd\x3f\x9d\xe1\xc8\xa2\xfd\x20\x8e\xd5\x7e\x22\x80\x4b\xce\x14\x4e\x37\xd5\x01\xc3\x73\xc2\xf0\x1e\x31\x80\x54\x5b\xc3\x6d\x90\xee\xf9\xaa\x6f\x0d\xb7\x41\x76\xc7\x21\xdb\x76\x00\xd8\xda\x08\x5b\xc3\xc7\x3b\x4c\x64\x7e\x7c\x2f\x32\xdf\x8b\xcc\x7f\x6d\x91\x19\x45\x7b\x81\xb3\xf7\x5d\x85\x7b\xf9\x7b\x9e\x26\xd9\x62\x6c\xca\x9b\xbf\xf0\x44\x75\x75\x98\x65\xa9\x2d\x02\xf3\x34\x25\x89\xba\x2a\x0a\x36\x58\x43\xc8\x74\x64\x4c\x40\xc7\xa7\x52\x49\x53\x64\xe4\x22\xae\x77\x8d\x9f\xc0\x20\x0c\xa5\x4b\x47\xc6\x8e\x45\x61\xf0\x92\x0d\x5d\x13\x09\x96\x45\x60\x10\x86\x1e\x1b\x5b\x22\xc6\xcf\x0b\x15\xda\xba\x75\xb0\x06\xe3\xc4\xac\x38\x0c\x7d\x32\xb7\x6f\xe0\x39\x0f\x0a\x2e\x21\x6a\x47\x24\x99\x76\x55\xff\x05\x8c\xb7\x6b\xbe\xfd\xdc\x74\x2e\xa0\xf0\x6b\x74\xd3\x9d\x02\x7d\x4f\x94\x84\x5c\xcd\x24\x61\x7b\xa8\x6e\x9a\x65\x3d\x21\x89\xe6\xae\x4c\xcc\xc9\x87\xff\x12\xc2\xa2\x06\x10\xf8\xc1\x1e\x26\x15\x2a\x7b\x04\x5e\xb7\x97\x3c\x60\x13\x55\x9e\x00\xcc\x29\x3e\x1e\x94\x0a\xec\xbc\x48\x49\xb5\x4c\xac\x91\xfd\x11\x95\xf6\x1d\xd9\xc7\x2e\xb0\x2e\x16\x51\x3f\xca\xff\x11\xc4\x51\xf8\x9e\xe6\x8b\x34\xc9\xa9\x68\xca\x79\x7c\xe7\x8c\xc1\xdf\x5e\x87\xaf\xb1\xfe\x61\x72\xe6\xad\x75\xd7\xa9\xf4\xda\xed\x5f\x69\xe5\xdc\x65\x93\x33\x58\xbe\xe7\x82\x6b\x08\x5f\x86\x68\xbc\x2f\xfa\x00\x4e\x23\x70\x82\x13\xc4\x5e\x4f\x85\x3a\xdf\x10\xbf\x28\x01\x94\xa5\xf5\x93\x7c\xf0\xad\xe1\x36\xe8\xd1\xc4\x8a\x6c\x0d\x77\xc0\xea\xad\x51\x90\xef\xfb\x0d\xff\x7e\xc3\xff\xf3\x6e\xf8\x7a\xbf\x57\x62\xf9\x1d\xa9\xc8\x1a\xea\xaa\xd8\x89\x27\xb3\xc0\x72\x21\xeb\x0f\x20\x73\x55\x75\x9a\x84\x43\xef\xa6\xb0\x1e\x4c\x3e\x88\x12\xd0\xfb\xe8\x10\x82\xc0\x94\xc6\xd0\x88\x38\xee\xdb\x3f\xb9\x7a\x09\x3f\x32\x83\x6d\xde\x7e\xa7\xcc\xe1\x0e\x34\xd8\x3b\x09\xa5\xe4\x02\x30\xf6\xbd\x26\xd2\x95\xb3\x99\xea\x6d\x40\x38\xfb\xf5\x57\x6d\x3e\xf5\x1c\x45\x3d\x51\xce\xba\xd5\x09\x46\x91\x47\x0d\x82\xdc\x3e\x13\xcb\xcf\x32\x8f\xef\xbd\xb7\x47\xda\xa8\x4f\x6d\xf2\xe0\x81\xe1\xc7\x19\x9d\x9b\x79\xb3\x86\xb3\xff\xeb\xae\xb5\x0d\x57\x35\xe8\xf1\x0c\x4d\x3a\x90\x58\xb2\x5d\x43\x1e\x77\x18\xed\xd9\x19\xac\x8a\x18\x58\xee\x69\x1a\x68\x4f\x1c\xde\x39\x42\x39\xa8\x42\x23\xd2\xf2\x48\xed\x55\x03\xe9\x51\xc5\xf3\x12\x9e\xa2\xf8\xd1\xda\xfb\xb2\x29\x08\x43\x49\xc3\xb9\x3e\x86\x63\xda\x90\x69\xd7\xaa\xa6\x52\x7a\xe2\xa4\xe2\xaf\xb2\xf2\x64\xaf\x8f\xeb\x37\x27\x14\xf4\x0a\x71\x95\xd9\xc7\x9a\x2a\xa5\xfd\x51\xfd\xf9\x44\x8b\x99\x54\x37\xeb\x4e\x9a\x7e\x2f\x6a\x55\xa9\x13\x47\xcd\xa1\x11\xa0\x55\xa5\x0d\xe6\x95\x73\x8b\x46\x93\xca\xf9\xcd\xdd\xcd\xa8\x5d\x5f\xbd\xa2\x46\x32\xbc\xbb\x98\x5b\xce\x7b\x2d\xb5\xb2\xe0\xac\x42\xdb\xa8\x78\xac\x39\x79\xae\xde\x8a\x77\xac\x74\x3a\xf7\xe3\xb8\x72\xba\x00\x48\x5c\xf4\xac\x4c\x60\x5c\x15\x5a\xd3\xc1\xd5\xa9\xcd\x78\x14\xe8\x2a\xd5\xca\xa8\xad\x8a\xdc\x94\x9b\x1c\xb0\xfd\x93\x93\x3e\xa5\x45\x2e\x8c\x57\xe2\x4b\x12\xd2\x45\x9c\x5e\xd2\x50\x9a\x08\xc2\xf3\xc1\xf1\x2c\x88\x12\xfb\xb9\x1a\xd4\xf6\x63\x9a\xc9\x1e\x79\x7c\x0f\xc8\x03\xab\x8f\x24\xe5\xba\xbc\x56\xaa\xc5\x35\xc3\x43\xee\xb1\xbc\xdc\xd0\xcf\xda\x4a\x5a\xc4\x06\x0f\xb2\x25\xa4\xb0\xd4\xe4\x0b\xf1\x9a\x21\x90\x8c\xa3\xe6\xfd\x11\x82\x94\xef\xc9\x87\x65\x90\x3f\x18\x90\xf3\x20\xe2\xea\x72\x10\xb9\x16\x85\x56\xc1\xca\x9b\x32\x73\xde\xc5\x52\x50\xf1\xa2\x75\xc7\x68\xd7\x74\xbc\xbc\x4e\xe1\x69\xb2\xd1\xbe\xbd\x2b\x41\x7f\x37\x36\x76\xcd\x63\xd3\x60\x40\xf2\x22\x5d\x70\x5d\x6d\x94\x4c\x49\x30\x61\x5d\xf9\x66\x93\xcf\x55\x4e\x3a\x45\x34\xa7\xe9\xb2\xe8\x3a\x47\x47\x8e\x80\x1f\xc8\x37\x9b\xde\xc3\x22\xef\x7d\x9f\xd5\xfe\xb3\xa8\x5c\x87\x54\xe8\x92\x2f\xd7\x9e\x33\x9d\x8d\x40\xfe\x60\xcf\x7b\x0e\x55\x33\xe2\x3d\x6d\xea\x93\x9f\xf6\x0b\xac\x18\x13\xdc\x97\x04\x7c\x65\x8c\x19\x61\x83\x8f\xe0\x11\x93\x98\x97\x49\x68\x63\xa0\xed\x3b\x7c\xd2\x18\x39\x14\xc1\x7f\x8e\x37\xe2\x1b\xb7\xca\x96\x1f\xae\x59\xf9\x13\x71\xb1\x66\x50\xcd\x94\x16\x1f\x75\x53\xef\x39\xa9\x69\x8e\x82\xba\xf1\x2a\xc8\x67\x98\xa8\x7a\x92\x30\xbb\xfe\x23\x7c\x34\xe9\x08\x00\x3f\xb5\x79\x0b\x79\x3b\x08\x11\x8c\x44\x5d\xfd\xb1\xb9\x00\xcd\x1e\x41\x98\x23\x7f\x77\xe4\x5f\x99\xf3\xf6\x27\xca\x79\x7b\xd9\x5f\x34\xe9\x98\x14\x77\x75\x45\xd6\xa1\xc5\xca\x62\x44\xb1\x6e\x0f\x6d\xe2\xbf\x9b\x2c\x01\xfc\xd7\x70\x39\xd8\x43\x4a\x43\x14\x21\x7a\xa7\x72\x66\xe4\xdf\x60\xa0\xee\xf9\xe2\x74\x8a\xa8\x16\x8e\x15\x92\x8d\xaf\xb7\xbb\x35\xcd\x13\x43\x54\x53\x1c\xb5\x64\xaa\x1b\x54\x36\x18\x10\xbe\x59\x49\x71\x21\x48\x42\x22\x6e\x46\x48\x30\x0d\xa2\x44\xac\x9c\x73\x2a\x02\xfc\xd5\xfc\xf9\x65\x4f\x7b\x03\xac\xa9\xc1\x96\x75\x9c\xed\xbf\x66\x48\x63\xee\x96\x4d\x5c\x0a\xb2\x2d\x81\xed\x8e\x39\x1d\xa7\x49\x48\x18\xc3\xad\xad\x04\x91\x6e\x3d\xb1\x12\x83\x23\x82\x2e\xac\x69\x87\xbd\x5e\x8c\xee\xb8\x43\xd8\x75\x3b\x12\x25\xc4\x89\x16\x71\xca\xbc\x48\x33\x1a\x2a\x37\xee\x5c\x02\x01\x8d\xcf\x34\xc8\x49\x30\x67\x1b\x52\xdf\xcb\xaf\xed\xbf\x52\xfe\x6d\xff\x79\xbc\xcb\xdf\x45\x17\xab\x7b\x78\x5d\x9a\x5b\xc6\x31\xdc\x12\x36\x24\xd2\x4e\x36\x3d\x50\xa0\x2b\x06\x49\xe8\x3f\x06\xec\x98\x7d\xa9\x7c\x69\x58\x52\x9c\x05\x56\x73\x68\xb0\x2b\xc5\x07\x06\x38\x55\x05\xa3\xc8\xb8\x5c\xe0\x2f\x8a\xa8\x3c\xbe\x43\x5a\x30\x8a\xc8\x1e\x83\x94\x72\xd6\x43\xae\x09\xad\x1f\x93\x3e\x21\x25\x24\x40\xa2\xa9\x28\x2e\x6b\x91\x63\x4b\xe8\xb9\x4a\x92\x63\x4a\x2e\xaf\x31\x31\x58\xba\x91\x2d\x69\x53\x10\xc4\xdd\x15\x8b\x6e\x57\x14\xb5\xe5\x60\x43\xb2\x10\xbe\x4e\xa4\xa2\x38\x74\x4a\xfb\x24\x65\x01\xa1\xa4\x65\x7d\xfc\x93\x49\xaa\x2d\x3d\xf1\x50\x68\xa0\x27\x82\xa1\xd4\x77\xfd\x42\x2a\xb6\xe8\x6f\x65\x0d\xec\x4f\xfd\xe0\xd2\xb5\x3a\x45\x62\xfa\xeb\x48\x3a\xe8\xa9\xd9\xc7\x1c\x6c\x30\xe0\xa1\x15\xb5\x95\x85\x51\xa9\xb6\x95\xf8\x72\xbd\xcb\x80\x25\x96\xd6\xcd\xb6\x05\x62\x50\xc5\x70\xc6\xcd\xe0\x2d\x0e\x10\x32\x7e\x94\x10\x47\x63\x0a\x57\x0d\xda\x5e\xc3\x8a\xfe\xe7\xb3\x1d\x01\xfb\x8f\x72\x8b\x11\xe2\x58\x8d\xe4\xfd\x45\xba\x30\x1c\xcc\x99\xdd\x8b\x83\xbc\x10\x90\x4e\xd5\xfe\xee\x70\x42\xea\xb0\x82\xe0\xbc\x68\x5d\xbd\x38\x81\x38\xb4\x90\x6e\xf7\x49\xa3\xb0\xa6\x4b\xac\x21\x01\xdc\xe7\x41\x49\x7e\x20\x9b\x76\x6d\x62\xa6\x25\xed\xef\xcb\xb5\x5c\xaf\x05\x90\x7f\xb7\x52\x09\x22\x34\x59\xcc\x52\xaa\xd3\x94\xa9\x1d\x1e\xd6\xba\xd9\xe5\xfe\x22\xb8\x0c\x46\x31\xf5\x75\xcf\x3d\x0e\x70\xfb\xa9\x9c\x26\xa1\x0e\x48\x95\xa4\xc9\x23\x51\x09\x46\x87\xbd\x4d\x5c\x97\x4d\x3d\xf8\xf6\x63\x9c\xd1\xaf\x82\xed\xc8\xa5\xd2\x83\x11\xa3\x5a\xe5\x04\x81\xed\xdb\xc6\x1e\xaf\x68\xd7\x9c\xc4\xd2\x1b\x41\x7c\xa2\x35\x74\x00\x52\xee\x83\x58\x08\xa6\x96\x20\xa4\xe4\x3c\xc8\x95\x40\xb9\x66\xe2\x8a\x2f\x6d\xb8\x7a\x45\x47\x18\x6d\x98\x65\xdd\xbf\xce\x82\x7c\xe6\x43\x3a\xeb\x35\xcd\xb2\xb2\x9b\x48\x7c\xe5\xe8\xbb\x57\xac\x92\x78\x98\x38\x1a\x86\xfc\xda\x0b\x71\x5d\xd6\x13\x7f\x5b\x25\xc7\x2e\xb2\x07\x65\x4a\x84\xaf\x52\x09\x71\x12\x65\x79\x51\x2e\x20\xae\x28\xe3\x95\x68\x40\x7c\x6a\x0f\xdf\xf5\xab\xf1\x55\xe7\xf8\x12\x02\x6d\xf2\x81\xd7\xcd\xb3\xd5\x58\x53\x94\xd7\xa2\x7a\x95\xa1\xfb\x79\x9a\xd2\xc9\x73\x20\xa1\x2b\x13\xd8\x95\x9b\x20\x3b\xdf\xbe\xe0\x76\xa5\x90\x24\x3e\x0d\x03\xb4\x1b\x0b\x5e\xb6\xd6\xac\x4e\x3b\xeb\xd9\xd4\x45\x4d\xd7\xa6\x0c\x34\x51\xf5\x0f\xd6\x06\x03\x6b\x07\x36\x2e\x70\xb4\xcb\x63\xa4\xbe\xb4\x2a\xef\xf0\x7d\x79\x30\x30\x7c\xe9\x96\x86\x9d\x1e\x8f\xc1\x2d\x6e\xca\xe3\x34\x45\xc9\xb4\x42\x36\x33\xd5\xd8\xe6\xc8\xf9\x24\x5e\xbb\x9c\x08\x8b\x43\x55\xa2\x10\xf9\x82\xa4\xae\xa6\x12\xd1\x84\x24\xa9\xae\x81\xb1\xb7\x45\x90\xe7\x34\xec\xb1\x2a\xb4\xeb\x3b\x06\x91\xa3\x25\x6d\xf2\x32\x45\x78\x30\x03\x16\x3a\x0d\x73\x48\x9f\xef\x54\xd3\x66\x95\xac\x2c\x43\x69\x4b\x79\xad\xad\x2c\x66\xc8\xb5\x24\xc4\xaa\x81\x08\x61\xd2\xa8\x40\x75\xa9\x27\x0b\x8c\xe8\x38\x58\xe6\x94\x9d\xc4\xc3\x34\x69\x17\xe4\x3c\x48\xc0\x28\x29\x5f\xa4\x51\xcc\xaf\xc3\x93\x82\x66\x93\x60\xac\xbc\x63\x37\x38\x8a\x37\x39\x6e\xdb\xfb\x54\x3d\x43\x24\x8e\x7f\x5d\xb5\xa8\xd1\xe2\xfc\x89\x16\xdc\x5d\x33\xdb\x20\x7b\xe4\x7c\x16\x8d\x67\x60\x35\xc0\xd6\x77\x91\x8a\x7d\x8c\x2c\xe2\x65\x5e\x7f\xf7\x2a\x18\x41\xcd\x04\x6b\xee\xe1\xb7\x64\xaa\x91\x61\x57\x17\x54\x55\xb1\x7a\x01\xf2\x36\xc2\x63\xb9\xe0\x88\xac\x95\x6f\x24\xc8\x54\x09\x31\xe6\x53\x87\x3e\xb7\x48\x6f\xce\x7d\x3d\xc7\x1e\xef\x79\xb7\xc1\xfd\x79\x19\x6f\x72\x4e\xc3\xde\x63\x70\xc9\x53\x16\xdf\x81\xd8\xdd\xfe\xb4\x61\x38\xc7\x9f\xfb\x7a\x85\x78\x4e\xd3\x5e\xbb\x25\x8b\x6e\x77\x95\xfd\xb3\x69\x2c\xd1\x1a\x7e\x5b\x66\x02\xad\x4c\x1a\x5a\xc3\xed\x1d\xd7\x26\x5a\x8c\xbc\x35\xdc\xd9\xba\x3e\xed\x6d\x3f\xb9\xb7\x7d\xba\xb7\x7d\xfa\x6b\xdb\x3e\x21\x63\x67\x61\x03\x79\x07\xd6\xce\x25\x7e\x2c\x85\x75\x25\x7f\x98\x75\x34\x91\x97\xce\xfb\xd9\x34\x1f\x96\xa8\x6e\x90\x90\x27\x8e\xb0\xa2\x12\x1c\xfb\x4e\x6e\x27\x8c\x7d\xca\x4a\x09\xb6\x71\x02\x3e\xdf\xf3\xf5\xe1\xfd\xbb\x03\xce\xdc\x6f\xd3\x01\x1e\x70\x09\x58\x2d\x85\x17\x8c\x45\x4a\xde\xbf\x3b\x10\x17\x05\xfe\x0e\x88\xf7\xe8\xe0\x45\x51\xb7\x3c\x4b\x73\x7c\xfd\xe5\x36\x7e\x70\xf4\xf6\xed\xcb\x83\x8f\x87\x47\x6f\xc9\xcb\xf7\xef\x8f\xde\x0f\xc9\x81\xd2\xff\x8e\x79\x95\xfc\x48\x1f\x52\xd2\xde\x20\xac\x3e\xb2\xd1\xee\xfb\xfb\xa0\x5d\xde\x34\x1d\xbb\x7a\x68\xcf\xb5\x08\x05\x5b\x3d\x11\xaf\xcc\xdf\x84\xb4\xa4\x1d\x12\xdb\x2a\x18\x0d\x13\xde\xa5\xd1\x3c\x0f\xa6\x94\xec\x91\xf5\x75\xf1\xd4\x90\x6d\xeb\xe2\x77\x9f\x87\x8c\x75\x52\xfa\xb2\xd8\x33\xe2\x4d\x1e\x12\x35\x5d\x7f\xff\x70\xf4\x16\x66\x25\x53\x5d\xf2\x84\x59\x15\x7d\x73\x1e\x93\x69\x1c\x88\xaa\xcd\xd1\xea\xd9\xfc\xc8\xef\xab\xf1\x78\xe7\x79\xd3\x29\xfd\x78\xf8\xe6\xe5\xd1\xf1\xc7\x21\x11\xb7\xde\x8c\xb8\x58\x27\xe7\x39\xd9\x20\x6d\xf6\x5f\x30\x9e\x31\x8e\xd1\x36\x62\xda\x08\x3f\x92\xdf\xde\xef\x56\xf7\xbb\xd5\x5f\x7b\xb7\x42\x9b\x15\x3c\xbb\xfc\xa3\x9a\xe9\x36\x7f\xcd\xde\xe8\x11\xfd\x1d\xbe\x65\x97\x4e\x87\xd8\xfa\x57\x87\x33\x1c\x93\x29\x37\x8e\x21\xe2\x91\x2d\xb4\xa5\x0f\x0b\xb6\x15\xf2\xd7\x7e\x08\xbf\x90\xb6\xbc\x48\x93\x8e\xf3\x79\xec\x0a\x52\xf1\x1e\x39\x4f\x93\x6e\xcd\x1b\x7a\x94\x99\xa4\xc9\xe5\x3c\x5d\xaa\x16\x55\x42\xc9\xe9\x4d\x22\x6d\x4a\x25\xae\x68\xc8\xe5\x01\x88\x62\xe0\x84\x6b\x12\x69\xea\x78\xf6\x3c\x4d\xe3\x6b\x08\xaf\x1a\x82\x0f\x72\xbe\x49\x50\x0e\x19\xa2\xd9\x81\x07\x22\x34\x34\x3c\xa6\xcb\x13\x1f\x44\x23\x60\x8b\x52\xd4\x3e\x58\x33\xa6\x09\xbb\xdf\x62\x10\xa6\xe7\x28\x5e\xaf\x1d\x81\x01\x21\xdf\xbd\x13\x89\x3c\xa2\x42\xd4\x17\x35\xc1\x05\x87\xf8\x5d\x62\xef\xea\x2f\xaf\x0d\x96\x4b\xaf\x88\x31\xb6\x39\x7d\x86\xdc\x07\x38\xb8\x31\xb2\x70\x1d\x6a\xf7\xe0\xde\x70\x41\xde\x0a\xca\x51\x87\xaa\xab\xf2\x12\xc4\x29\xd1\xf5\x50\xde\xd1\xf4\xda\x7c\x74\xb0\x42\x3d\x43\x2b\x84\x43\xf3\x8a\x71\xe1\xa2\xd5\xf4\xb0\xd2\x88\xa4\x2b\xf5\x1b\x0d\x27\x8f\xa6\x49\x50\x2c\x33\x7b\x38\x38\xbd\x6c\x3c\x18\xa6\x7c\x3c\x0a\xaa\x6a\x40\xe0\xc1\xa0\x79\xff\xc5\x13\x07\x49\xde\x82\x23\x05\x49\xa8\x54\x4b\x45\x0a\x41\x89\x27\x51\x12\xc4\x7e\xb3\x67\x5e\x87\xcf\xa8\x14\xaf\x6b\x2b\x4b\x54\x6f\x20\x45\xe6\xd1\x33\x9a\x5d\x16\x33\xae\xb2\x9e\x8f\x22\x60\x19\x29\x8f\x12\x0d\x7d\x13\x71\x16\x2a\xb1\xe5\xf1\x0d\x22\xba\xe3\xb8\xb6\x53\x8b\x5b\xfd\x42\xaf\x00\xef\x3d\x88\x68\x7f\x1d\xca\x41\x47\x9d\x6b\x11\xa9\xd7\x5c\xb7\x76\x1e\xb7\x9f\xa2\x72\xfe\xb2\x55\x38\x17\xe4\x8e\x3a\x25\xb5\x77\xba\xae\x4a\x53\xcc\xd3\x47\xd9\xb1\xdb\xb2\x74\x14\xc3\xa2\x92\x9f\x83\xe7\x65\x11\x4c\x5b\x94\x3f\x89\x20\xc6\x94\x65\x0d\x20\x80\xf0\xfc\x31\xba\xd1\xc9\xc9\x32\x8e\x4b\x9e\xb8\x68\xcd\x22\x71\x6f\xff\x4d\x85\x30\xd4\x57\x16\x9a\x11\x32\xad\xd1\x9c\x55\x5c\xf7\x0b\xec\x3b\x8f\x63\x3a\x7c\xfb\xea\x91\x33\xfb\xea\xbc\x6b\x07\xd7\x5b\xa9\x36\xe8\x7b\x0d\xc5\x99\x44\x32\x4e\x93\x71\x50\x74\x8c\xd9\xef\x96\x3b\xb2\x29\xe5\x7a\xc2\x8b\x4d\x39\xd7\xb3\x77\x5b\x5a\xc6\xe1\x42\x7e\xf7\xe0\xf2\x30\xc1\x15\x84\xe5\x10\x9c\x10\x78\x2d\xa1\x6a\xf6\xc1\x03\xd0\x37\x98\xbd\xa8\xde\xa6\xcb\xbd\xef\x00\x0e\xee\xd0\xfd\x4e\x90\x4d\xad\xd5\xa5\xc5\xc7\x67\x46\xc9\x21\xfe\x12\xae\x79\xb6\x90\x2b\x14\x31\x3e\x71\xff\xa2\xea\xb5\x9f\x6a\xf1\xc9\x24\x5f\x94\x94\x86\xeb\xdb\xee\xee\xb2\x95\xf9\x4b\x1a\x25\x9d\x56\xcb\xad\x5c\xbd\x8a\xe3\xe4\xc6\xf1\x84\xaf\x37\x40\x36\xec\xb0\x65\xde\xed\xe1\x1e\xe1\xab\x9a\x24\x2d\x0e\x8d\xbe\x2a\x14\x7a\x1c\x0e\x69\xe0\x86\x6d\xc3\xb3\x85\x6e\xcf\x6a\x05\xb7\xaf\x36\x12\xc4\xb5\xd3\x65\xb1\x58\x16\xaf\xd3\xa9\x66\xd7\xc2\x19\x0f\x5a\x2d\xd2\xfb\x0f\x77\x34\x83\xc4\x32\x13\x4c\x73\x6b\x18\x93\xed\x07\x8a\xc3\xf0\x5b\x2e\x83\x9f\x66\x34\x5c\x8e\x29\x9a\xab\x60\x3c\xee\x11\xe1\x8b\x12\xf3\x93\x60\x3c\x3e\x11\xc9\x9c\x27\x32\xa4\x88\x6f\x49\xe5\xcf\xcc\x29\xeb\xe7\xb3\x68\x52\x74\xba\x64\xe8\x60\x54\x66\x39\x4a\xab\x60\x3c\x96\x5a\x2a\x6e\xed\xcd\x49\x9b\xc6\xb4\xa0\x72\x1c\xda\x4b\x92\x99\xce\xa9\xea\x06\x2c\x03\xdd\x5f\x89\x87\x25\x62\x69\xb3\xad\x9e\x8b\x71\xa5\x9e\x15\xee\x4a\x2e\x32\x1a\xae\x16\x7e\x3c\x9e\x1b\x6c\xe9\xe7\x8f\xee\x92\x69\xbb\xde\x25\x53\x55\xf1\xad\x72\x23\x3b\xb3\x02\x62\x48\x80\x86\xf3\x07\x5b\xec\xb0\xfd\x3e\x39\x02\xe5\x1f\xca\x01\x54\x29\x2d\x63\xdb\xff\x06\xaf\x1a\xad\x67\x6d\xde\x27\x8d\x95\xd4\xf8\xb5\xbc\x4d\x31\x50\xf3\xe4\x5a\xc6\x01\xa5\x81\x21\xb4\x74\x82\x00\x4e\x0d\xea\xf5\x01\x60\x07\x56\x9a\x28\xbc\xa0\x27\x8a\xdd\xf3\xb6\x4f\x4b\x07\x60\x58\x4d\x78\xef\x84\x0d\x5c\x22\x97\x58\x55\x57\xc2\x75\x8e\xb2\x6e\xe8\x1b\xeb\x69\x13\x05\xfc\x6d\x9d\x5d\x0e\xfc\xba\xc9\x37\x9c\x06\x3d\xfa\xbf\xea\x48\x22\x38\x88\xc8\xda\x60\x40\x3e\x1e\xbd\x38\x1a\x92\x8c\x72\x8b\xac\x1e\xc9\x53\x61\x3a\xa3\xae\xb8\xb4\x31\x4e\xc0\x35\x5d\x7d\x56\x2e\x2a\xda\x39\x49\xe8\x98\xe6\x79\x90\x5d\xb2\xc5\x02\x21\xb0\x73\x46\x6e\x6d\x70\x58\x0c\xee\xa2\xc9\x79\x9a\x7d\xe6\x52\xde\x7c\x19\x17\xd1\x22\x46\xa1\x1c\xcc\xe0\x29\x7e\xff\x46\x83\x87\xc4\x6b\xcc\xfd\x8d\xb4\xe5\xe6\x75\x98\x66\x0c\xb2\x79\xc3\x88\x54\x37\x46\x43\xbe\x71\x98\x27\x13\x55\xaa\x2f\x71\xe4\xf3\x60\xb3\xce\x3a\x77\xe2\xc2\x9e\xfa\xce\x0f\x65\xb0\x16\x3b\x25\x8e\x81\xa3\xd9\x4f\xe1\xd0\xc9\x57\x53\x8d\x1d\xa4\xb7\x9e\xd2\x23\x94\xae\x5f\x10\xbc\x3d\x26\x07\xc0\x73\xe4\xe6\x39\x3e\x6c\xf0\x1c\xc5\xf4\x84\x49\x8f\xd9\x45\x8f\xe9\xa7\x28\x96\xd3\xc2\x0a\x15\xe3\x73\x72\x55\x79\x10\xab\x9e\xee\x88\x56\x8c\x57\xc3\x78\x86\x5c\x46\x2f\x44\x47\x39\xb9\x5c\x79\xd8\xaa\xe0\x1d\x0c\x9c\x20\xc3\x51\x7a\xd1\x37\xd8\x91\xfe\xd8\x25\x12\x40\x72\x21\xf8\x7f\x57\xa6\x2a\x96\xc3\x7f\xa8\x74\xc4\x68\xe4\x4f\x53\x8e\xa4\x17\xe2\x7d\xb7\xcb\xcd\x39\x1a\xb4\x6b\xa2\x12\xfe\x5c\xc2\x91\x5b\xc3\x1d\x70\x61\x84\xbd\x86\x33\xc6\xfc\xdd\xfd\xcd\xe8\xfd\xcd\xe8\x5f\xfb\x66\x54\x5c\x8b\x8a\x37\xbf\xff\x15\x01\xf6\xee\xd4\x65\x38\x1c\x02\x1e\x92\x83\x34\x39\xa3\x8c\x15\x05\x22\xe6\x31\x9c\x83\xe1\x2c\x00\x81\x8b\x65\x24\x17\x46\xc0\x41\x9c\xa7\x24\x88\xe3\xf4\x3c\xe7\xf1\xd9\x41\x51\x97\xf7\xd7\x58\x45\x52\xf0\x7f\x13\x5d\xd0\xf0\x9a\x67\xad\xb9\xf7\x1a\x6b\xe2\x46\xb5\x48\xed\x28\xc7\x42\x65\xa9\x0e\x9c\x1d\x53\x25\x4a\xae\xae\x64\x84\x74\x9d\xd1\x56\x3a\xd4\x76\xd7\x56\x06\xf0\xb3\x9c\x10\x91\xb8\x62\x96\xf7\xa1\x23\xf5\x8b\x46\x43\x5c\x0f\x71\x34\x01\x55\x73\x17\x6a\xdf\x74\xea\x04\x48\xc1\xf7\xf1\x93\x56\xe3\xce\x48\x46\x51\x52\xed\xc0\x91\x8b\x89\x9a\x8c\xd3\xca\xcb\x1f\xdb\x12\x36\x55\xfa\x7d\x71\xd8\xea\xb1\x49\x38\xa3\x59\x34\x01\xc7\x1e\x19\x1d\x07\x8c\xe3\xa0\x48\x35\x0f\x1e\x90\x38\xf8\xf5\x92\xc4\x69\x10\x92\xf0\x32\x09\xe6\xd1\x98\xa4\x09\xcd\xa1\x35\x31\x21\xba\x21\x11\xcd\x3a\x55\x7a\x02\x80\x92\x06\xf6\xb2\x71\x07\x8a\xcd\xd6\x94\x16\x47\xea\x90\xec\x71\xe1\xcc\x26\x46\x0b\xac\x75\xfe\x01\xb0\x32\x41\x4c\x89\x3c\x26\x97\xdf\x7a\x18\x9a\xfe\xd2\xab\x17\x9e\x9d\x9f\x47\x10\xb0\x04\xf5\x8a\x80\x0e\x22\xa7\xfc\x04\x3d\x74\x9e\x56\x71\xe1\x7d\x99\x51\xa1\x5e\xec\xc1\x05\xde\x98\xaf\x0e\x7e\x38\x9e\xd1\x0b\x9f\xda\x40\x6b\x4d\xad\x04\xcb\x15\x65\x83\x22\x86\xe6\x53\xc4\xd5\x2e\x55\xca\x5b\x0a\x7f\x19\x85\xfb\x99\x88\x4f\xce\xaa\x12\x8b\xac\x4b\x86\x72\xbd\x09\x30\x57\x56\xf2\x5d\x13\x78\xde\xd7\x41\x37\x87\x56\xb7\x7b\x0e\x1c\x5b\x02\x1a\x8a\x7d\xb9\x30\x45\x8a\xeb\x71\xf3\x03\x19\x96\x59\x02\x05\x38\x28\xb3\xdd\x1a\xdc\x5f\x0d\x57\xba\xd6\xea\xab\x72\x5d\x5f\xef\x6e\x52\xa3\x28\x65\xea\xa7\xd0\x41\x87\x53\x60\x3e\x63\x14\xe8\x41\xb8\x45\xea\x52\x55\xb3\x1f\x86\xfc\x59\x84\x52\xa2\x05\x49\x48\x72\x5a\xe4\x64\xb9\x80\x0c\x71\x1a\x01\x96\x11\x15\x34\x63\x7b\x47\x7a\x26\x84\x2d\xe1\xc7\xb4\xbf\xb6\x86\x9e\x46\xbc\x4e\xa7\xf9\x7e\xf1\xa1\x08\xb2\x62\xcd\xd6\x34\xe6\x34\x9e\xa8\xc4\x89\xfb\x80\x59\xb0\x70\xb3\x16\x23\x50\x18\x8d\x27\x8e\x13\x1f\xf9\xca\x6e\x4a\x0b\xae\xcf\x62\x85\xad\xa7\x76\xa0\x5f\xd0\xc3\xcc\xa1\x7b\x44\x9e\x3c\x2d\x9e\xc1\x5a\xe9\xfb\x18\x07\x64\x4c\x69\xd1\xb1\x1e\xfd\x08\x4b\x46\xe7\x94\x33\x18\x88\x17\x34\xf0\x4c\x94\xf5\x51\xa0\x0d\xcc\x26\xe1\xa2\x5b\x26\x4a\xb3\x23\x70\x85\xd1\xef\xf7\xc9\x2f\x4b\xee\x09\x98\xb5\xc9\x78\xaf\x73\x5e\x2e\x79\x19\x59\xf1\x2a\xf2\xda\x7e\x02\x6b\xad\x74\x35\x0c\xff\x19\x93\x67\x7a\x0f\xa6\xdc\x90\xb3\xee\x9d\x26\x7f\xbc\x63\x9a\x7d\x1a\xfd\xab\x77\xc4\xfa\xf5\x48\x77\x91\xc6\x31\x27\x1f\x3f\xd9\x0a\xda\xd4\x60\x36\x5d\x2a\x95\x08\xa8\x6d\x93\x37\xca\x0c\xd7\x20\x96\xb4\x84\x5c\xc4\x8c\xa6\xce\x9c\x4a\x23\x0b\x46\x7a\x72\xac\xbe\x49\xf0\x3d\x9b\xf2\xd1\x44\xda\xf8\x24\xdf\x94\x3a\x6e\x46\x19\xda\x4c\x19\x86\xa6\x95\xd7\xcf\xac\x04\x5d\xc9\x50\x16\x72\x49\xe7\x56\xe8\xb9\x1d\x91\x96\xea\x03\xa0\x4f\xb6\x37\x6a\xc6\x78\xde\xa5\x71\xcc\xf8\x8c\xee\x09\xa7\xc1\x21\x2f\xc2\xce\x69\x74\x4e\x93\x02\x8e\x9c\x7d\x46\x71\x30\x34\xbd\x97\x2c\x84\xa1\xfd\x09\xc7\x14\x90\xe3\x61\x78\xda\x93\x57\x54\x46\x72\x4f\x13\xa3\xc8\xc1\x7e\x8c\xb8\x82\x18\xe8\x97\x6d\xd6\x32\x6c\xa1\x43\xe2\x96\x4c\xd6\x23\x4e\x7c\x0f\xb9\xdc\x3c\xb7\x03\x3d\x71\x9a\x3a\xc8\x28\x8c\x09\xec\xb5\x0f\x3c\x2f\x1d\x81\xd9\x71\x0d\x36\xba\x70\x35\xf0\x81\x34\x7c\xab\xa8\xca\x4a\x75\x5d\xa5\xca\x1e\xbf\x52\xcd\xec\x0c\xb2\x25\x20\xa5\x2e\xe3\x4b\xad\x31\xb5\xb0\xa9\xc5\x60\x4b\xf4\x45\xd0\x0e\x1a\xcc\x04\x04\x29\x67\xde\x7d\x32\xa6\x56\x88\xb0\xac\x51\x19\x62\xcb\x3d\x28\xcb\xd7\x6c\xcf\xc9\xc2\xd7\x4e\xea\x77\x69\xbf\xfb\x09\x3d\x17\xb7\x4e\x18\x07\xd8\x59\x18\x67\x92\x51\x68\xf8\xc6\xf3\x33\xc7\x9a\x65\xdf\x19\x8f\x3c\x62\xee\x78\x54\xcb\x07\x89\xe0\xc8\xe2\x5c\x58\x41\xbd\x96\x47\x52\x97\xbd\x54\x94\xf5\x77\xa3\x5a\xef\x6c\x2c\x6d\x46\x04\xa1\xeb\x08\x10\xfb\x6a\xc8\x28\x5c\x32\xb0\x33\xc7\x82\x26\x21\x18\xb8\xa9\x49\x0e\x72\x50\xb4\x24\x39\xa3\x50\xe5\x0c\x46\x57\x94\x4e\x00\x98\x15\x62\x52\x4f\x97\x2b\x57\x54\xeb\xcb\x24\xc8\xf3\x68\x9a\xd0\xb0\xef\xf6\xd1\xa6\x28\x1f\x4f\xf6\xcd\x8e\x92\xb1\xc6\xa3\x9a\x09\xf2\x36\x83\x4d\xc6\xd0\x48\xb4\x3d\x31\x89\xb1\x74\x18\xc4\x19\x0d\xc2\x4b\xfd\x60\x5d\x0b\x8a\xf9\xed\x29\xcd\x14\x64\xa5\xf4\x5a\x37\xae\x68\xd2\xb1\x5a\x53\x4e\xe0\x36\x5d\x97\x5c\x7a\x65\x72\x2e\xee\xf3\x0b\xc9\xa4\xe8\x22\x15\x63\x8b\xe6\x73\x1a\x46\x41\x41\xe3\x4b\xbb\x59\x41\xee\xe3\xa6\xb4\x6d\x4a\x27\x50\x7d\xa7\xc4\xd5\x84\xcf\x6d\x15\xd6\x64\x73\x96\xcf\xb6\x1f\x3e\x18\x74\x97\x7b\xee\x84\xe9\xb0\x37\x73\x93\xb7\x71\xc3\x3e\xd4\x0f\xa9\x8e\x31\x98\x23\x1e\x8d\x35\x4f\xe2\xba\xd4\x1d\x08\xc2\x35\xba\x13\xbe\x6e\x3a\x10\xbc\xef\xd6\x8f\xc7\x91\x1c\xd2\x85\x14\x1c\xcc\x81\xd4\xf0\x77\x78\x5a\x3e\x4f\xcf\xa4\x4a\x93\x04\xf9\x65\x32\x56\x87\x1f\x9f\x60\xe4\xe3\xdb\xcb\x04\xde\x4e\x1b\x08\x40\x32\x86\x85\x2d\x87\x77\x61\x43\xf8\x55\x6a\x36\x04\x7f\x07\xa3\x53\x2b\x66\xbb\xcf\x7b\x82\x23\x53\x78\x4d\x4e\x54\x49\x5b\x28\xb7\x76\xd4\x12\x3b\xca\xc1\x80\x1c\x4e\x34\x67\x8c\x72\xf5\xae\xef\x92\x0a\xff\x2b\x24\x2a\x88\x76\xd3\xa5\xcb\x9d\xcf\x28\x18\x63\x88\xd1\x77\x09\x67\xaa\x39\x89\x0a\x93\xad\x7a\x37\x6a\x87\xd8\xd5\x32\xf3\xed\x1e\x3e\xf4\x8b\x1a\xed\x09\xc5\xfb\x31\x84\x48\xf1\xf0\xb7\xaf\xe8\xa0\xc7\x92\xc7\x33\x6a\x5b\xef\xc5\xe9\xb4\xac\x5d\x62\x31\xa6\x8a\xb3\x05\xd4\x32\x64\x7b\x42\x89\x3f\x3e\x7f\xc4\x12\x13\xc4\x39\x00\xd8\x03\x6b\x4e\x47\x8e\x9f\x29\x21\x88\x1f\xbe\xe0\x09\x43\x41\x63\x9d\x6e\x9f\xef\xc8\xe3\x40\x7a\x2c\x04\xbf\x2a\x34\x24\x6c\x75\xcf\xb2\x34\x49\x97\xb9\x72\x5f\x28\x0c\x03\xd8\x6e\x6f\xbb\x22\xe2\xd5\x08\x61\xb7\xed\x35\xaf\x05\xa7\x12\xa9\xb6\xd2\x6b\x42\x40\xae\x0d\x1d\xab\xa1\x7e\x0e\x6f\x31\x6f\xd7\x35\xfc\xd8\xb9\x22\xe5\xb8\x75\x82\xbf\x55\x5c\x90\x5e\x9f\xf6\x76\x36\x9b\x5c\x81\xb6\x97\x39\xd7\x8b\x8f\x8b\xf6\xda\xfd\x85\xe8\xfd\x85\xe8\x9f\xf8\x42\x54\x3f\x15\x45\x2a\xeb\x9b\xbc\x17\x15\xc0\x2b\xdc\x64\xfa\x82\xbf\x35\x7e\x62\x9a\x4c\xa2\xa9\x17\x8e\x67\x49\xc0\xc3\x51\x60\x05\x75\x89\x46\x41\xe2\x09\xd4\x02\xda\x64\x1e\x69\x8a\xdb\x48\xf3\xcb\xcc\x51\x34\x15\x1e\x0c\x2c\x2b\x46\x0e\xf4\x3c\x9a\x5a\x4a\x7d\x6c\xcd\xc8\x35\xce\x57\x1c\xe2\x4a\xc1\x5e\x9b\x5e\xab\x74\x3a\xb6\xc4\x05\x3d\x63\x49\x1b\x86\x54\xc4\x7b\xe7\x7d\x86\x56\xa4\xaa\xac\x04\xdb\x55\x4a\xa0\x28\x7f\x97\x51\x71\x0d\x8a\x6e\x27\x8c\xba\x47\x3a\xdd\x6a\x60\x84\x4b\xb0\x83\x84\x70\x7f\x4f\xae\xae\xdc\x3c\x71\x36\xf5\x67\xd2\x20\x8b\x23\x56\x14\x75\x2d\x59\x2c\x8b\x17\x74\x12\x2c\x63\xef\xc5\x49\x5d\x1f\xd9\x8e\x6c\xb7\xa3\xae\x7c\xbd\xe1\x5b\x18\xc9\xf4\x43\xd4\xa2\xc7\xf7\x54\xf9\x3d\x0e\xee\x82\x35\x8a\xdf\xa2\xfb\xf6\x8b\x2e\x2e\xa0\xb0\x5a\x4a\xe6\xd8\x68\xd4\x53\x21\xca\xf6\xe0\x41\xd2\xd6\x2b\x7a\xe1\x19\xb9\x58\x55\x7c\xb0\x39\x32\x8a\x4c\x27\x24\x30\x7c\x03\x82\xe3\x49\x65\x47\xa0\xec\x02\xd8\xba\x7b\xf5\xf2\x9f\xd6\x72\x83\x3a\x98\x5c\xec\x5d\x68\x52\x97\x6f\xf8\xd8\x75\x0c\xdf\xe5\x15\xb9\xd4\xf6\xbb\x75\x7a\x23\x7f\x7f\x31\x2e\x8f\xe1\xfa\x0f\x5d\xc1\xc2\xe7\xd5\x95\x45\x43\xfb\x63\x88\xbb\x80\x1c\x9f\x61\x78\x8f\xc7\x2d\x59\x2d\xf4\x49\xb8\xa1\xf2\x5f\x3d\x9a\x72\x10\xae\xba\x48\x45\xc0\xe8\xa8\x20\xf3\x68\x3a\xe3\x82\xa3\xf2\x5e\x2c\x94\x54\x4e\xcb\x45\x5a\xdb\x6e\x91\x9a\xad\x9e\xb4\xe7\xc1\xc5\x8f\x94\xbe\xa3\xd9\x4f\x41\xde\xee\x11\xf6\xfd\x2e\x8b\xd2\x2c\x2a\x2e\x8d\xf4\x69\x90\xbf\xcb\xa2\x31\x15\xbf\xd9\x7f\x30\xcd\xec\x47\x92\x26\x63\xea\x7b\xc5\xf8\x99\x5e\x56\xbc\x63\xfc\x4c\x2f\x9b\xbe\x64\x84\x9a\x1c\x5c\xf3\x1a\xf6\x90\xdd\xc5\x0b\x3a\x8e\xe6\x41\xdc\xc1\x00\xee\x4b\x32\xf3\xb2\xf5\x6b\x13\x3b\xf2\xb9\x79\xd7\x34\xef\xab\xfa\xee\x49\xff\xa6\xd4\x7d\x4f\xd7\x7f\x44\xba\x16\x42\x91\x43\xd8\x70\xff\x2a\x83\x09\x09\xaa\xf6\x8a\x4a\x8d\xe9\xf9\xc2\x14\x8f\x44\xfa\x9a\x21\x13\xd5\x52\x70\x71\xd1\xfd\xa2\x34\x83\x17\x7d\xbc\x9d\xae\xcb\xd3\xb9\xd6\x88\x99\x00\xca\x43\x46\x2a\xf1\x67\x02\xa8\x37\x20\x2c\x1d\xe1\x02\x5e\x9b\xf9\xab\x77\xa0\xbc\x6d\xd8\x50\x52\xf9\x77\xd1\x07\x92\xf2\x17\x82\x2c\x0d\x39\x0d\x72\x3f\xdc\x34\xc8\x0d\x28\x20\x5f\x04\xaa\x45\x45\x94\x6f\x0c\x15\xaf\x0d\x93\x50\x35\x55\xdb\x60\x25\xf5\x63\x18\xc3\xcf\xa7\x6a\xc9\x59\x75\xd5\x2d\xba\xe0\xe5\x2d\x3b\xb0\x46\x0f\x8a\x8b\xbe\x34\xfc\xf3\x56\x80\x9f\x19\x4b\x2d\xc4\xc5\xca\xcb\x46\x86\xe8\xb9\xc9\xf2\x11\xd1\x82\x2a\x57\x91\x0a\x5e\xb5\xca\x52\xb2\x2b\xb6\x5c\xd6\xe0\xa8\x43\x3a\xca\x50\xcd\xda\xf2\x41\xb9\xf4\xe9\x81\xd2\xa4\x27\x33\x1b\x2c\xb5\x52\xd0\xf2\x26\x4b\x16\x9d\x0a\x86\xb3\x9c\x2f\xe3\xa0\x88\xce\xe8\x4f\x41\x7e\x9c\xc3\x9b\xbe\xb2\xaa\x1c\x58\xab\xae\x69\x6d\x0d\x53\xa3\x1c\x1a\x3b\x9d\x4c\xe8\x58\xd4\xcc\x57\x6e\xc9\x72\x28\x2f\xe0\xa3\xe7\x52\x68\x7b\x51\x9a\xd6\x22\xb2\x58\x9c\x4e\x6d\xe3\x4b\x9d\x81\x22\x0a\x39\xda\x41\x50\xf1\x79\x75\x83\x9e\x07\xca\x0c\xb6\x4e\x11\x28\x5a\x6a\xb4\x0e\x81\xc8\x9a\xaf\x3c\x38\x38\x55\x2e\x36\xa8\xb0\xc1\x52\x33\x6b\xc2\x26\x46\x50\x83\xf6\xd9\x4d\x94\x73\x26\xf0\x52\x28\xf4\x0f\xf8\x68\xd8\x1f\x05\x39\xad\xe5\x8d\x3e\x50\x1f\x19\x78\xe0\x0c\x02\xe0\xf9\xd3\x20\x7f\x1d\xcd\xa3\xc2\x43\xbf\x26\x80\x28\xab\x12\x4b\x88\xde\xc8\x37\xca\xe4\xd1\xaf\xbe\xdd\x4e\x67\x1a\xd0\x45\x34\xa7\x79\x11\xcc\x17\xa5\x45\x14\x84\x5e\x58\x3c\x23\x29\x63\x5b\x46\x76\x59\xb5\x4a\xa7\x82\x3a\x13\x46\x93\x49\x34\x5e\xc6\xf0\xae\xa7\x0c\xd3\x1a\xc8\x1c\x48\x5a\x04\xf1\x8b\x26\x15\x58\x90\x58\x6a\x36\x57\xaa\x00\xd7\x3c\xce\x5c\xaf\x6e\xb6\x2b\x6b\x46\x05\x9d\x77\xed\x17\x7d\x8e\x59\x25\x40\xb9\x17\xd8\xc6\xaa\xf6\x49\x6d\xbc\x60\xdd\xf2\x1e\x71\x9d\x4c\x83\xc5\x1d\xa7\x53\xef\x2a\xc6\x1c\xc5\xb7\x86\xe3\x74\xaa\xd5\x6f\xee\x42\x86\x7a\x8d\xc5\x8c\x2b\xc4\x4b\x19\x5d\x7b\x44\x13\xf6\x65\x6c\x6a\x6a\x9c\x56\x86\x87\xc6\xec\xa2\xbb\xb8\x4e\x67\xd7\x32\x2a\x6e\xb0\xfd\x79\x2b\x31\x9a\x88\xd3\xa9\xa7\x6a\x99\x5a\x52\xa5\x2a\x64\x9e\x2e\xe0\x2a\xa7\xfe\xc4\x7c\x3e\x8b\x72\xc6\x8d\x17\x69\x5e\xdc\xe0\xc8\xfc\x2e\xcd\xab\xa5\x22\x37\x06\x53\x25\xd7\x76\x2b\xc5\x13\xcd\x3a\xa9\xcc\x42\x07\x03\xe8\x74\x7f\x11\x5c\xc2\xbb\x8a\x3d\x43\x4d\x86\xb3\x04\x92\x21\xa9\x28\x62\xef\x79\x4d\x66\x62\xd8\xf3\x34\xfb\xfc\x31\x7d\x97\xa5\x67\xb4\xbc\x0c\x02\xc2\x65\x17\x42\xe2\x2d\x2f\x28\x21\x50\x68\x81\x09\x8e\x3c\x65\x58\x52\x73\xd6\xc2\x3b\xc9\xdd\xac\x60\x9e\x82\xd2\xc9\x9e\xf1\xf5\x8c\x9c\xa0\xcf\x53\x32\x54\x66\x0c\xd7\xba\x55\xae\x83\xe7\xea\xf8\x38\x4e\xcf\xe1\x59\x89\xd4\x6b\x54\x55\x5f\xfd\x0c\x82\xc7\x4e\x64\xc4\x44\xd2\x24\xbe\xe4\x01\x21\x0a\xe3\x75\x86\x7c\x21\xc1\x5f\x42\xf8\x1e\xf6\xc8\x67\x12\x64\x68\x3f\xda\xc1\x0f\x24\xec\xa3\x35\xeb\x63\x23\xde\xa5\xee\x83\x80\xfe\x85\x95\xaa\x97\x9b\xd5\x51\xba\x9f\xac\xcd\x7b\x85\x6a\xc2\x16\x74\x0d\xf8\xa5\x17\x8b\x28\xbb\xf4\xac\x78\x94\x8b\xc9\x2d\xe7\xee\x63\xbc\xd0\x2c\xaf\x6c\x09\x58\xa0\x9e\x05\x00\x94\xed\x93\x25\x2c\x88\xee\xae\x6f\x55\xbe\x0f\xce\x25\xc9\x88\x14\x2f\x18\xaa\x7e\x3f\x1f\x47\x91\xbd\x7c\x65\x19\xbc\xdb\xfe\x3d\x17\x88\x53\x70\x48\x9a\xd3\xeb\x50\x35\x00\xfe\x94\x21\x0a\x9a\x8f\x39\x0c\x06\xab\xac\x08\x58\x9b\x78\x35\x96\x2e\x46\xbd\xdc\x6e\xb1\x92\xac\x6b\x00\x8e\xa2\x66\xf4\xaf\x98\xaa\xad\x91\xf3\x85\x4b\xc1\x66\x3e\x11\xbf\xc6\x4b\xe8\x39\xdc\xe8\x75\xcc\x60\xda\x70\xd5\x31\x0a\x92\x7e\x94\xff\x23\x88\xa3\xb0\x03\xb1\x2e\x44\xca\x8b\x28\xa3\xe3\xa2\xe3\xbb\xe7\x10\x2e\xc5\x00\x50\xd4\xd8\xe9\x3a\x97\x28\x58\xd0\xd1\x31\x88\x64\x0f\x3c\xd5\x1a\x5e\xeb\x3c\x15\x35\xa8\x42\xf4\xcc\xac\x89\xab\x27\x6c\x1b\x12\xe1\x57\x5c\xc2\xb6\x65\x50\x70\xbd\xd0\x3f\x5c\x26\xe3\x28\xf1\x4b\x2b\xc2\x91\x37\xba\x79\x5a\x37\x93\x88\xeb\xd7\xc8\x10\xcf\xc0\x0b\x12\x18\x21\x46\xc9\x14\x0e\x38\xde\xe3\xad\x0b\x66\xfa\x92\x12\x6e\x9d\x6a\x2a\xc0\x50\x66\xf9\x59\x34\x9d\xd1\xbc\xae\x3c\x86\x32\xcb\xe7\x97\xc9\x98\x86\x42\x77\xed\xd3\xa0\x79\xe1\x2a\xea\x78\x2e\x82\xa4\x34\xa9\x07\x60\x7d\x75\xb1\x8c\x71\x1a\xd6\x57\xa4\x00\xab\x6a\x69\xd4\x25\x03\xd8\x57\xdb\x87\x22\xcd\xf8\xd3\x8e\xca\x7a\x04\x58\x45\x0d\x8d\xba\x83\x61\xad\x19\xa7\x41\x4c\xc3\x8f\x59\x44\x93\x6a\x0c\x59\x80\x55\xb5\xd4\x74\xc9\x03\xec\xab\xad\xc1\xac\x59\x80\x55\xb5\x34\xea\x53\xc5\xac\x31\x80\x28\x99\x36\x44\x14\x86\xf4\xd6\x23\x5b\xaa\xad\x46\x02\x56\xf8\x53\x2c\x89\x7f\x51\x77\xfd\x3f\xac\x85\xe8\xe9\x7a\x2a\x2a\xa8\x29\x69\xdc\x0c\x0f\x3d\x69\x08\xd6\x77\xb2\x1d\x96\x67\xa1\x92\xf6\x4e\x38\xf4\x27\xa3\x12\x86\xdc\x36\xf4\xa4\x71\xd8\x32\xe3\x91\x61\x69\x0e\x2e\xe7\x1f\x50\x79\x5e\x49\x59\x5b\xa3\xec\xa9\xc2\x06\x31\x7a\x6f\x28\xcc\x86\xde\x54\x0c\x8f\xcf\xe4\x43\x4f\x1a\x86\xb5\xd0\xe8\x49\xc4\xd0\xf6\x1e\x3a\x2c\x49\xe7\x7b\xaf\x61\x71\xc8\xaf\x47\x5b\xc3\xad\xa7\x65\x7e\xb4\x98\x00\xd2\x1a\xee\xec\x5c\x9f\xf6\x76\xb6\xee\x7d\xb0\xdc\x9b\x1c\xfe\xd7\x98\x1c\x0a\x4a\xbf\x8b\x60\x4a\xab\x45\x9e\x68\x68\x67\xc8\x63\x3d\x99\x06\x84\x3c\xed\x2b\x84\xb0\x68\x1e\x74\x22\x88\xe3\x81\x15\x97\x15\x5e\x93\xdb\x41\x9d\xdc\x50\x14\xf2\x49\x84\x1b\xbf\xae\x22\x04\x85\x2f\x80\xdd\x27\xbe\xb9\x89\x10\x09\x38\x74\xf3\xea\xe1\x0b\x74\xa5\x62\x77\xc0\xb5\xf2\xa4\xdb\x55\x0b\x51\x1f\x03\x50\x4a\x40\x9d\xf2\x1b\xc3\xc8\xd0\xce\x02\x44\x7c\x62\x88\x3b\x09\x9f\xc1\xf6\x07\x7b\x32\x0c\x47\xab\x60\xd5\xa2\x1f\x20\xe2\x73\x71\x36\xcd\xf1\x49\xed\x06\x01\xcb\xe5\x09\x55\x07\x77\x04\x2f\x26\xc0\xeb\xf9\x93\xb9\x6c\x9a\xf3\x18\x19\xeb\xe2\x9c\xd7\xac\xc3\x58\x18\xab\xec\x34\xee\xde\x0f\x0e\x29\xc9\x1c\x1c\xaa\x52\xbc\xcd\x75\x07\xe7\x1f\x9b\xed\x79\xa3\x42\x4c\xec\x68\x3c\x34\x44\x44\x55\x40\x4a\x1c\x43\xdb\x17\x75\x2d\xca\xc9\x38\xcd\x32\xd7\x21\x2a\x9c\xdf\x83\x82\xee\x67\xd3\xdc\x17\xa3\x52\x47\xc9\x7f\x48\xfe\x06\xe7\xff\x9c\x7c\x81\xd3\xff\x35\x6b\x2f\x2a\xc4\x8b\x24\xc3\x67\xaa\x67\xaa\x70\x3b\xa5\x73\xa4\x55\x34\x1c\x0a\x50\xe4\x58\x32\x05\x1a\xf1\x83\x81\x7c\x7a\x06\xea\x4c\xc3\x19\x11\x6c\x9e\xe0\x02\x53\xc7\x9e\x63\x5b\x6d\x00\x0f\x57\xb3\xe0\x52\x3e\xc3\x14\x73\xb7\xde\x71\x42\x97\x06\x5d\xe5\x50\xbf\x4b\x1e\x3c\x70\x2e\x98\xac\xfb\x2e\x01\xce\x9d\x63\x57\xc2\xeb\x2b\x35\xa3\x8c\x55\xc0\x7a\x03\x0e\x9a\x26\x89\x1d\x49\x88\xeb\x7b\x7b\x65\x84\x6c\xbe\xbb\xcb\xd2\x73\x19\x3d\xb0\x22\xc6\x5f\xc7\x71\x87\x51\xe5\x40\x5a\xaa\x14\xc1\xc2\x0e\x93\x8a\x11\x02\x25\x7d\xc7\xc1\x3c\xe4\xe5\x6c\x1a\xda\x71\x7c\x89\x33\xe9\x20\x56\xad\x6a\x83\xc3\x4a\xca\x53\xed\x57\x92\x9d\x11\x34\x77\x75\x86\xb1\x2a\xbf\x30\x63\xdd\x96\x04\xd3\xbd\xd6\xdc\x1c\x2f\x9f\x8e\x27\xb2\x6d\x91\xfa\xe3\x56\x18\x91\x6f\xf7\x48\x49\x4c\x0a\x5f\x68\x03\xf1\xea\x0a\x0d\xd7\x08\xa9\x5b\x61\xb9\x57\x12\x73\x49\xa2\xfe\x66\xb1\x65\xbc\xc5\x2b\xe7\xfd\x46\x11\x66\x84\x73\xfc\xcd\x1e\x79\x2a\x75\x99\x15\x4d\x2c\x93\x45\x30\xfe\x7c\xc4\x6f\x51\x0c\x1b\x56\x48\x32\x34\x9b\x66\x92\xee\x82\xa1\xd2\x4c\x65\x55\xfc\x87\x22\xbd\x3d\xb2\x4d\x9e\xc9\x44\xe9\xbf\x9f\xc8\x73\xa0\x76\x68\xa1\xbc\xee\x97\xb9\xef\xc7\x42\x4e\x4f\x14\x37\x67\x54\x28\x52\xb0\xf3\x71\x15\xb9\xf1\x64\xf3\x94\x0c\x7d\x2e\xe6\x0f\x20\x72\x79\x80\x82\xc5\x4b\x64\xd9\xe1\xe8\x83\x38\xc6\x8b\xbb\xdf\xef\xcb\xf5\x7d\x60\x97\xb5\x36\x1f\xc7\xb9\xd3\x21\xdf\xee\x20\x28\xb5\x04\x65\xbb\x51\xa0\x6a\xe8\x71\x3f\x3e\x76\xc5\xdc\x93\x21\xbc\x9c\x95\x87\xae\xc0\x78\xdb\x18\x24\xa1\xe9\x01\x48\x82\xf1\xb0\xed\xfc\x64\xc4\xea\xe0\x21\x2f\x19\xb8\x40\x9b\x97\x76\xc5\xac\x42\xd4\xe9\x3a\xaa\x85\x5e\x95\x45\xf6\x5e\x25\x6c\xb7\x7f\xdf\x94\x32\x98\x65\xeb\xab\xf6\x18\x38\xc8\x68\xf9\x4f\x38\xfc\x36\xc4\x42\xcc\x7e\xc0\x69\xb9\x29\x7d\xe1\x22\x58\xfc\xb1\x8b\xe9\xeb\x28\xee\x68\x5c\x72\x69\x09\xa7\x8d\x4a\xd6\x7d\x0f\xc9\xf5\x0d\x83\x62\x7c\xb4\x98\x71\x24\x88\xaa\x7b\x46\xd7\xdc\x67\xa3\x50\x0a\x2f\xe1\x8e\xb1\x1e\x90\xab\x7c\xe7\xa1\x77\x93\x06\x7b\xae\x7b\x26\x97\x07\x20\xe7\x4c\xf2\x3d\x90\xe1\xc2\xa3\xc7\x4d\x83\x76\x4d\x97\xd8\xbc\xd3\x34\x74\xdc\xff\x17\xd9\xa5\xf5\xea\x15\x81\xc2\x43\xd7\xf2\xf1\x12\xe3\x65\xee\x18\x5c\x23\x74\x1c\x07\x4b\x9c\xe2\xf7\x08\xc5\x85\x50\x29\xb3\xf3\xb2\x75\x24\xc9\x54\x6e\x14\x4d\xce\x95\xf6\xb6\x61\x16\xa9\xdd\x15\xac\x16\xfe\x54\x4b\xad\x76\xcd\x48\x92\x12\x80\xc2\x98\xf8\x07\xb2\x09\x87\x1a\xe3\xac\xe9\x4a\x87\x38\xde\x6d\x90\x70\x2f\x03\x49\x28\x3c\x91\x42\xc0\xe2\xe4\x91\x3c\xa8\x3a\x91\x9b\x6b\x96\xab\x11\xad\x90\xad\x1b\x6b\x1e\x3a\xe6\x1d\xb4\xa8\xae\x16\xbc\x79\x98\x08\x9a\x17\xd1\x3c\x28\xe8\x4f\x01\x28\x10\xeb\xa8\x0a\x81\xd7\x51\x14\xae\xf9\x2e\xa8\xe9\xeb\x53\x47\xb3\x19\x42\xe3\xaa\x9b\x1d\x0f\x68\xd9\xcc\xbc\x97\xcd\x50\x19\xf8\x0e\x02\xf8\x48\x5d\xa0\x90\x0f\xf0\x54\x4c\x69\xf1\xc2\x0e\x4c\x25\x77\x56\xbb\x9a\xba\xb9\x12\x75\xdd\xf1\x3c\x35\x42\xbc\xb4\x47\x10\x2b\x93\xc7\xf4\x69\x2e\x35\xdf\x22\x7c\x26\x2e\x2a\xf1\x8c\xc8\xbe\x12\x61\xbf\x6d\x2c\x4d\x55\xff\x8d\xc2\x69\xaa\x42\xab\x0e\xf2\x6b\xc6\xd6\xd4\x3a\x1a\x36\xc0\x6c\x31\x96\x4e\xdb\x72\x7e\x6a\xae\x63\x44\x02\xba\xdc\xa6\xaa\x62\x5c\xa2\xec\x1f\x9b\x2b\x11\x23\xc6\x90\x04\xc3\x62\x8a\x11\x2a\x07\xcf\x89\xeb\xe5\xd0\xd2\xb8\x3e\x03\xd7\xc9\x9f\x58\x8f\xdb\x64\xc8\x3f\xac\x9d\xa4\xdd\x73\x84\x97\xa1\xf6\x2e\xa8\xf2\x94\x5f\x44\x31\x9c\x53\x9d\xc5\x3b\x2e\xbd\xee\x72\x06\x59\x4b\x0c\x32\x28\x50\xd9\xf6\xa3\xc2\x6d\x55\x6f\x3d\x9e\xc8\x58\x78\x82\x0b\x43\xd0\x59\x37\xb1\xa3\x6d\xc9\x60\x9b\x2f\xb0\x0c\x25\x3d\xcb\xe8\xb4\xb2\xad\xc2\x42\x67\x3f\x58\x2c\xe2\x4b\xe1\xe7\xaa\x11\x61\x75\x6d\x23\x4c\xbe\x05\x58\xcd\xb0\xc4\x1b\xd5\x5d\x33\x0f\x22\x7a\x94\x66\x3c\x3a\x80\xd4\xad\x23\x47\x79\x26\xec\x6b\x05\x8f\x92\xe9\x7a\xc5\x63\x47\x5f\xa5\xe0\xe2\xb0\xa9\x31\x5c\x06\xe8\x4a\xcd\xde\xc9\x2f\x2b\x6e\x8a\x48\x7c\x24\x3a\xa9\xb4\x98\xde\xad\xa5\x83\x2a\xf6\xf9\xa7\x8c\x9c\x25\xcb\x02\x81\x47\xd9\x78\x19\x07\xd9\xfa\xfa\xfa\x7a\x75\xbc\x2c\x49\x41\xbb\x77\x12\x31\x8b\x6b\x7f\x5b\xc3\xed\x27\x7e\xf7\x43\xdb\xf7\xb7\xff\xf7\xb7\xff\x7f\xed\xdb\x7f\x71\xf5\xcf\x60\x65\x44\x33\x7f\x1c\x96\xdf\x2d\xc2\x8a\xcf\xb2\xa0\xda\x10\x60\x6d\x30\x80\x88\x6d\x41\xc6\x48\x99\xed\x60\xcb\xdc\x1c\x22\x23\xb8\x30\x9a\x4c\x68\x46\x93\x82\xd0\xe4\x2c\x87\x42\xa3\x2c\x3d\xcf\x69\xb6\x86\xdc\xd1\x9e\x47\x49\x98\x9e\x83\xc6\x02\xc5\x29\x21\x0f\x1e\x88\x9c\xfe\x3f\xdf\xbc\x7e\x55\x14\x0b\xe1\xe9\x98\x73\x4d\x33\x8d\xec\xf9\x61\x81\xf5\x89\x30\x1b\xd1\x34\x49\x19\x23\x88\xa3\x84\xb2\x9e\x24\x69\x48\xd7\x90\x6f\x3b\xa7\x46\x35\xf0\x8b\x79\xcc\x46\x26\x36\xb6\x76\xb7\x69\x23\xd7\x1c\x93\xff\x7c\xf5\x7e\xdb\xa8\x6e\x96\x6d\xb7\xbb\xa5\xa5\xa4\xe4\xc0\x5a\x78\x27\x91\xe9\x9a\x44\x80\xfc\xc4\x44\x7b\x70\xee\xca\x5d\xc1\xb3\x5e\x2a\x03\x08\xa3\x3c\xde\xf2\x67\x69\x5e\xf4\x48\x11\xcd\x69\xba\x2c\x7a\xac\xc2\xac\x07\x4a\xe6\xf3\x34\x13\x4f\x29\x61\x33\x61\x70\x64\x8f\xc0\x7f\x57\x57\xa4\x2d\x88\x3d\x4e\xc7\x41\xcc\x12\x87\x4f\xbf\x79\xfc\x0d\x84\x45\xe6\x7b\x0f\xaf\x90\xed\x84\xe2\xd7\xd5\x15\xd9\x54\xd9\xac\x19\xb2\x07\xad\xa9\x34\xd9\x28\xd9\x53\xed\xd7\x0a\x4f\x8b\x8c\x2e\x20\xce\x20\x3d\xb7\xa6\xcc\x92\x9d\x04\xe0\x7b\x74\x96\x11\x92\xd3\xf3\x34\x8d\x69\x90\x5c\xc3\x1d\x2b\xdb\x9f\xa5\x04\xa3\xb1\x2c\x9c\x8a\xa2\x03\x9f\xd9\x96\xe1\xb9\x0a\x63\x1a\xc9\x5d\x66\x07\xcc\x8b\x40\x56\x3d\x47\x35\xbf\x41\xe1\x84\xc4\x78\x18\xdc\x00\xea\x6c\x42\xb4\x78\x05\x43\x7e\xf5\x7e\x5b\x47\x25\xe6\x92\x16\xc2\x3c\x9a\x08\x06\x63\xb8\x6e\xb4\x2a\x32\xc6\xc3\xab\x04\x79\x58\xd6\x9a\x2e\x68\xd2\x69\xbf\x3b\xfa\xf0\x51\x06\x52\xe5\x84\xc3\x3b\xb7\xbb\x86\xfc\x40\xc2\xdc\x3e\x78\x60\x4e\xaa\x71\xe8\x5b\x82\x41\x4d\xfb\x79\x90\x47\x63\xd2\x26\x1b\xd0\x85\xe7\x4b\xc6\x1e\x50\x15\x1b\xa4\x3d\x54\x57\x85\xaa\x9e\x7e\x91\x8a\x27\x97\xed\x51\x90\xd3\x27\x8f\xdb\xd6\xf8\xb5\x17\xf4\x57\x34\x08\x69\xd6\x69\xef\x03\x5f\x8d\x7e\x0d\xf8\x69\x0b\xda\xe7\x23\xac\x28\xc4\xe4\x63\x9a\x14\x8f\xd8\x41\xbb\xdd\x23\x6d\x26\xf9\x47\x63\xa8\x62\xf0\x4b\x2e\xd5\x8e\xea\xc6\x4a\x4c\x59\x0d\xb9\xf2\x78\x39\x97\xc9\x18\x1d\xaa\x6d\x4d\xb2\xef\xe2\x79\x81\xae\xaf\xfd\x91\xd1\xab\x48\x2f\xb7\x23\x65\x4a\x5d\x9a\x4d\x72\x92\x66\x4c\x5a\x15\xa1\xb6\x81\x1e\xb5\x76\x5f\x63\x2e\x09\x3b\xf0\x9c\x87\xc7\x40\x8a\x26\x97\xaa\x7e\x81\x64\xa9\xc8\xc7\x4e\xce\x7d\xd6\x00\x07\x69\x92\x50\xf1\xe8\x46\x52\x98\xa6\x44\xe3\x72\x51\xb6\x2e\xc3\x8d\x7c\xa4\x17\x85\xd3\x41\x01\x8b\xde\x1a\x89\xb7\x1d\x66\xb7\xaa\xba\xf4\x5e\xd4\xdf\xf1\x35\x88\x57\x49\xf3\xc8\xd7\x40\x03\x41\x0d\x11\xec\x2b\x8e\x53\x41\x09\x22\xeb\x47\x27\xd6\x0c\x29\xb2\x68\x3a\xa5\x19\x0f\x90\xc5\x66\x1f\xc4\x16\xe5\xed\x96\xe1\xa0\x8e\x60\xa0\x07\x3e\xaa\x31\xe3\x5c\x37\xa1\x1f\x30\x5e\xd9\x35\xb8\x49\x02\x9e\xc9\xf3\x22\x28\xe8\x78\x16\x24\x53\xbf\x02\x81\xb1\x14\x8d\xf8\x20\xbc\xfc\xc0\x0a\xc0\x8d\xf0\x63\xc6\x61\x6c\x96\xb7\x6e\xc6\xa9\x6e\x40\x31\x1a\x50\xde\x2a\xa1\x00\x68\xf6\x65\x56\x0d\x45\xc1\x99\xcc\x7b\x6b\xa5\x6e\xac\x56\xa4\x2d\x82\xaf\xb6\xec\x8b\x2d\xa3\x65\x76\x16\xbc\xb6\x50\xac\x37\x02\x17\xb3\x66\x65\x79\x5f\x2f\xbd\x8f\xbc\x54\x07\x6f\x1e\x62\x21\xdf\x2d\x07\xb0\xbb\x50\xc5\x04\xc4\x4a\xc3\xeb\x4a\x5f\x96\xc7\x97\x8c\xde\xf9\xcb\x68\x58\x5c\x8c\xaa\x4b\xd6\x56\x94\x8b\xfa\xa9\xc9\x4c\x95\x10\x20\x15\x9c\xb6\x30\xc0\xce\x0f\x49\xbb\x20\x93\x20\x8a\x69\xd8\x27\x47\xec\x9c\x76\x1e\xb1\xb3\x47\x00\x31\xed\xca\x57\x13\x6a\xd3\x33\x17\x1a\x9f\x4a\x9f\xa1\x62\xa7\x44\xe1\x90\x7c\xa7\xfe\xa4\xbe\x8f\xed\x3e\xd9\x62\x3c\x24\xed\xed\xfe\xa6\x52\x1e\x4a\xfd\x63\x3b\xa1\xc5\xa7\x38\xca\x0b\x9a\x44\xc9\x54\x65\x2b\xed\xe1\xa9\x61\xd0\x25\x15\x5c\x19\x0f\xd0\xe7\x92\xaf\xb4\x2a\x64\x83\xd4\x93\xe0\xa8\x0b\xf0\xd0\xa5\xaa\xc0\x38\xed\x33\x31\xb7\x35\x7c\xca\x7e\x19\xf2\x73\x6b\xb8\xf5\x2d\x3b\xf9\xef\xdc\x9f\xfc\xef\x4f\xfe\x7f\xf1\x93\xbf\x36\xfc\x87\x27\xb7\x77\x64\xf4\xaf\x0c\x39\xf1\xa9\x72\x14\x4d\xb9\x0d\x6e\xff\x17\x7e\x42\xe7\xf7\x20\xe1\x6b\x3a\x31\x37\x04\x15\xa9\x14\x5e\xce\x21\x21\x5d\x6d\x76\x1c\x82\xb3\x8b\xf3\x19\xeb\x7d\xc7\x34\xd0\xfa\x9e\x17\x26\x0f\xc9\x76\xd7\xb7\x5b\xb6\x37\x99\x14\x6f\xbe\x9e\x25\xfe\x17\x71\x82\xb9\xbf\x13\xa7\xba\x20\x21\x87\xcf\xf7\xdf\x8a\x49\x0e\xc9\x77\xdf\x92\x71\x3a\x5f\x2c\x45\x94\xa0\xd1\x25\x99\xa7\x67\x51\x32\x45\xb1\xf0\x1e\x93\xf1\x2c\xc8\x60\x2f\xe0\x37\xb3\x21\x37\xa5\x92\xe6\xea\x12\x3a\xa6\xfc\xd1\x42\x91\xb2\x06\x39\xae\x72\xd2\xd9\x27\x7b\x64\x6b\xb3\x47\x9e\xb3\xff\xb7\x7a\xa4\xdf\xef\xf7\xc8\xff\x91\x3d\xb2\xf3\x4d\x97\x1d\x76\x48\xbe\xa0\xe3\x68\x12\xf1\x85\x74\xf8\xe1\x68\x6b\xe7\xc9\xd6\x13\xdb\xc4\x2c\xca\x53\x48\x17\xe3\x70\x7d\x22\x5f\xf3\x17\xdd\xac\x23\x6c\x80\xe6\xd5\x1a\xbe\x59\x16\x92\x54\x28\xc1\x84\x63\x0e\xb3\x7e\x63\x42\x59\xc5\x78\x1e\xd9\x88\xda\xfb\xed\x3e\x43\xcb\x41\x1a\xd2\xfd\xa2\xb3\x89\xb4\xd6\x6c\x6c\xed\xff\x73\xb2\x39\x03\xe4\xaf\xce\x81\x58\x8b\xf4\x78\xb1\xa0\xd9\x41\x90\x6b\x55\x36\xca\xce\x97\xa3\xbc\xc8\x3a\x8f\xbb\xf2\x3d\xb9\x48\xd8\xec\x3d\xb6\x6e\xcc\x78\xee\x22\x8e\x8a\x4e\xbb\xdd\x35\x9f\xda\x27\x5d\xd3\xba\x4a\x3c\xb4\x4c\x7c\x9d\x97\xf2\x21\xc0\xfc\xb0\x47\xf6\x99\x40\x08\x1f\xdf\xef\x91\xff\xeb\x3a\x11\x2c\x3c\x33\x2b\x26\xd6\x80\x54\x2e\x91\x43\x4a\x1e\x91\x7d\xb2\x41\xb6\x36\x91\x9d\x91\x2f\xaa\x83\x8c\x9c\x6b\xdb\x30\x5d\x77\xfb\xbf\xa4\x51\xc2\x86\x69\x5b\x2a\x8e\x97\xe0\x2f\x1a\xa6\xf8\xcd\xd1\x0b\x46\xd8\x5b\x9b\x92\x29\x09\x0b\x3f\xa0\x7c\x0f\xc5\x7d\xbb\xf9\xe4\xb1\x4d\x70\xf3\x34\xfc\xee\xdb\xad\xcd\x32\x42\x33\xe9\x4b\x7b\xe1\xe6\xd4\x24\x0a\x57\x52\x51\x46\xe7\x41\x94\x70\xdd\x11\xcb\xd3\x77\x8f\xc2\x35\x91\xc9\x1e\x04\xb0\xb6\x5b\xde\xee\x5a\x4e\x97\x80\x59\x49\x30\x65\xf1\xfa\x9d\x61\x22\xa7\x9b\x04\x59\xfb\x30\x29\xb8\x3f\xa7\x1e\xd9\xda\xec\x92\xff\x3f\xc3\xda\x86\x53\x0b\x77\xe9\x24\xcc\xcf\x7d\xbe\x94\x54\x5d\xaa\xa4\xae\xcf\x98\xa7\xfa\x77\x48\xdc\x04\x1d\xd6\x81\x30\xf8\x87\x0b\x75\x48\x10\x6f\x1d\x04\xfb\x94\xf3\xe5\x9f\x9c\x01\xf6\xd5\xee\x9f\x04\x61\x09\xad\x97\x9c\xdb\x55\x27\x46\x72\x5d\x3f\x29\x84\xd0\x5a\xce\xe5\xeb\x1c\x8b\xa8\x18\xcc\xbe\xca\x71\xfa\x1e\xa0\x2c\x29\x46\xb3\x21\x5c\x2b\xb6\x86\xb5\x62\x2c\xa7\x8f\x6a\xac\xf3\x78\x11\xe4\xcf\xa5\xc7\x0b\xf4\x52\x41\xc4\xb2\x25\x5b\x4f\x10\x0b\x1b\x05\x39\xdd\x79\x42\xf6\xa0\x8c\x56\x0f\xed\x3c\x31\x4c\x00\xc2\x90\x72\xcd\x22\xec\x81\x1d\x5e\xa8\x47\xb6\xbe\x31\x25\x61\xd5\xcf\xe7\xa3\x20\xe9\xf0\x62\x26\xf3\xb3\x16\xb3\x70\xaa\x83\x16\xee\x73\x36\xf4\x22\x35\x76\x2f\x36\x7d\x04\x9c\x1d\x64\x97\x72\x45\x73\x65\x12\xd8\xeb\xbe\xe3\x91\x4c\x92\xb4\x10\x42\xd9\xf7\xd1\x0f\xad\x29\x48\x24\xdc\x59\xd3\x44\x23\x35\x9f\x05\x5c\x5a\x83\xfd\xed\x62\x1c\x2f\xf3\xe8\x4c\x05\x5e\x8d\x46\x51\x1c\x15\x4a\xc0\x19\x05\xc9\xe7\xc1\x28\x0b\x92\xf1\x8c\xe4\x34\x3b\x8b\xc6\x72\x03\x0c\xb8\xef\x85\xd6\xf7\x83\xe8\x87\xbe\x4d\x43\x2a\x08\x4a\x2e\x77\xa1\x09\xcd\xd8\x36\x14\xc4\xd3\x34\x8b\x8a\xd9\x9c\x84\x34\x1f\x67\xd1\x88\xb3\x25\x21\xff\xd0\xa4\x7f\x1e\x7d\x8e\x16\x34\x8c\x02\x10\x82\xd8\xd7\xe0\x30\x29\x68\x96\x04\xfc\xe9\xc4\xa7\xe7\x41\xf2\xf9\x93\x70\xfc\xf0\x89\xcf\xeb\xff\xef\x27\x31\xd2\x64\xfa\x89\x0d\xf1\x13\xbc\x25\xfa\x14\x46\xd3\xc8\x79\xca\x21\xa7\xc6\x47\x91\x23\xb9\xa7\xca\x19\x90\x1e\x8f\x8a\xd4\xb3\xcd\x36\xa0\xd5\xe7\xf6\x8a\x1c\x59\x6c\x51\xcc\xe8\x01\xdf\xa7\xda\xff\x7c\xd9\xde\x5d\xf3\xf2\x4c\xc1\x63\x3b\xd6\xce\xdd\xc1\x15\x6c\x90\xf6\x26\x88\x4a\xd0\x0a\x36\x77\x61\xe8\x78\xc1\xb0\x41\xf6\x48\x87\x8b\x53\x9d\xef\x9e\x92\x47\xba\x89\xae\x7c\x36\xf0\x68\xdb\xda\x6f\x95\xcf\x18\xb3\x29\x54\xa7\x68\xb0\x46\x6d\x25\x98\x08\xc2\x15\x10\x36\x0f\x7f\x1f\x25\x79\x11\x15\xcb\x42\xba\xfa\x8e\x42\x9a\x14\x6c\xd3\xb2\xc3\x46\xf0\x5a\x0e\x93\x30\xca\xa8\x69\xc0\x60\xbe\xb1\xc9\x7b\x52\x96\x55\x8f\x6c\xe0\xd5\x54\x0b\xb5\xd4\x82\xa6\x5a\xba\xad\xd6\x2a\xbc\xc8\xec\x89\xd7\xfd\xb7\x79\x04\x36\x39\x43\xfb\xe5\xc7\x57\x6c\x1e\xe4\xeb\x16\x8c\x01\x94\xaa\xfa\xd6\xb5\xf8\x75\x5a\xc5\xaf\xe5\x53\x3a\x8e\x5c\x11\x5b\x3e\xca\xf9\x4b\x39\xcc\xc7\x1d\xb9\x13\xfc\xff\x94\xca\x9b\x6a\x2f\xf2\x28\x3e\xa4\xc2\x83\x3f\xa7\xe3\x2d\x29\xa1\xf3\x10\x79\x17\xaa\x94\x13\x22\xec\xa5\x28\xe2\x64\x85\x85\x3f\xed\xa2\xa8\x56\x57\xae\xb0\x00\x5d\x2f\x7d\x3d\x88\xc7\xac\x63\x8a\x78\x47\xd5\x23\xa9\x47\x6b\x03\x63\xc3\xda\x1a\x77\x94\x16\x25\x0c\xfe\xf3\xcf\x97\x27\x9b\x8f\xbe\x3b\xfd\xb2\x7d\xdd\x79\xf9\xf1\x15\xfb\xbd\xff\xe8\xff\x4e\xbf\x6c\xed\x5c\x5f\xa9\x8f\x9d\xcd\xde\xce\xd6\x75\xf7\x7f\x06\xfd\x02\x94\xa0\x6a\x03\x37\xde\xe5\x95\x31\x06\x04\xce\x9f\xe7\x6d\xad\x88\x30\xf1\x04\x13\x4e\xff\x5e\xb4\xbd\xd0\x4b\xf0\x6e\xf0\xf6\xc2\x5d\x49\x16\xe2\xf4\xa0\xf0\xe3\x9e\x9d\xc7\xe4\xea\xaa\x2c\xef\x9b\x1b\x0e\x7b\x42\xa2\xa4\x64\xe0\x06\xf7\xb9\x9b\xa1\x7b\xd9\x48\xa3\xc1\x6f\x6f\x36\xb2\xda\xe4\x22\x25\x1b\x69\xbe\x9c\x33\xc0\xe3\x5c\x1c\x1f\xe6\x69\xf8\xe8\xbb\x6f\x1f\x6d\x6d\xaa\x6c\x38\xe3\x42\xef\xc6\x69\x4c\x3a\x87\x1f\x8e\x06\x87\x2f\x0f\x08\x3b\x37\x0c\xb7\x37\x37\x77\xba\x36\x4f\x46\xd5\xba\xa7\x50\x94\xeb\x0c\x5c\xe6\x35\x1c\xb6\x38\x13\x6e\xf7\xc8\x76\x33\x5b\x55\xcc\x54\x8d\x2d\x85\xd0\x69\x9f\xfc\xf3\xfd\xcb\x9f\x1c\x37\x98\xaa\x80\x7f\x34\xa5\x35\xba\x93\x8a\x20\xeb\x86\xa7\x09\xa0\x03\x3e\x12\x9d\x21\x7f\xdb\x23\x8f\xbb\x64\x48\xda\xed\x46\xe3\x1e\xc7\x11\x3c\x24\x53\x1d\x04\xe5\x53\x94\xd8\xe3\x63\x58\xf8\x69\xff\x1f\x47\x3f\xfe\xeb\xe8\xfd\xff\xda\xb3\x0a\x75\x94\xcc\xa9\x5d\xbf\x77\x72\x39\xd0\xad\xc7\xbe\xb5\xb5\xfa\xc8\xc5\x6a\xf2\x9f\x4b\xdc\x83\x87\x3b\x34\xa7\x02\x67\x78\x81\xe7\x1c\x82\xef\x9d\xc4\xe0\x7c\xee\xf3\x8c\x43\x87\x3b\xe0\xc7\xe8\x10\x5b\x7a\x94\x91\xe7\x0f\x75\x4a\x31\x4e\xa8\xfc\x8c\x62\x9e\x67\xb6\x9e\x74\x7b\x64\x7b\x53\x39\xe8\x33\xa4\x3c\x89\x5e\x6b\x90\xb2\x70\xb3\x05\x5a\xe2\x95\xea\x10\xb2\xb8\x52\x1f\xeb\x15\x5b\x43\xf3\xf3\xfa\xb4\xb7\xf3\xf8\x5e\x8d\x7f\xaf\xc6\xff\x8b\xab\xf1\x85\x0a\x7f\x31\xae\xb6\xdf\xbb\x85\xc5\x5d\x4b\x07\xd8\x6c\xed\xae\x14\x18\xb0\xc6\x4e\x8f\xeb\x99\x16\x63\xaf\x25\xd8\x22\x28\x66\x3d\x92\x50\xc3\xfa\xfb\x13\x68\x2e\x9c\x87\xa7\xf2\xaa\x1a\x87\x26\x97\x5e\x0b\x84\xbd\x0e\xd8\xf8\xb0\xff\x78\xaa\xce\x1a\xab\x1b\x5e\xe0\x8a\x85\x4c\xe8\x7c\x61\xd0\x43\x5d\x5e\x39\x52\xb5\x8a\xf5\xd3\xa4\xd3\x86\x51\xb5\x71\x28\xdf\xae\x61\x3f\x9d\xa7\x8c\x89\xf1\xb7\x84\x87\xef\x0e\x88\xbe\x57\xe6\x2f\x0c\xdb\x3d\x42\x11\xeb\xfd\xc4\xd9\xa0\xb8\xf0\xee\xd8\xae\x5c\xbd\x3d\x48\x42\xdc\x3e\x6a\xbe\xb4\x32\xb2\xa6\xde\x18\xbc\x3e\xfc\xf0\xf1\xe5\x5b\x58\x41\x07\x47\x6f\xdf\xbe\x3c\xf8\x78\x78\xf4\x96\xbc\x7f\xf9\xe1\xdd\xd1\xdb\x0f\x2f\x3f\x94\xb6\x1a\x06\x45\x80\x9b\x65\xdf\x78\x73\x1a\x3c\x14\x66\x84\xf3\xe0\x62\x9c\xce\x17\x31\xbd\x88\x8a\xcb\x21\x79\x02\x94\x65\xf5\x10\x74\xa1\xca\x0e\x81\x55\xa5\xf7\x9b\xae\x27\xee\x92\xb0\x39\xf8\x62\x86\x61\x87\x83\x5f\x68\xdb\x4e\x88\xee\xf0\xf0\xf4\xc0\x5f\x42\x72\x3e\x8b\xc6\x33\x32\x0f\x8a\xf1\x4c\x88\xaf\x7c\x13\x62\x0c\x2d\x34\xca\x79\x62\x6e\x40\xd3\xfe\x38\xed\x70\x1d\xe5\xf4\x16\x2c\x10\xfc\x51\x94\xa3\x49\xe7\x93\x9f\x90\x4f\xe0\x6d\x5c\x14\x9e\xba\xce\xfc\x55\x61\x36\x56\x01\xb6\xeb\x40\xd9\x11\xef\x4b\x23\x41\x43\x35\xa2\xef\x76\x45\xd7\x0e\x16\x27\x51\x46\x0d\x8f\x00\x36\xba\xca\xc6\xc3\x86\xe2\x69\xbd\x02\x5c\x87\xa5\xc6\xa6\x2d\xfa\x2f\xa4\x31\x2d\x68\x55\x0d\xf6\x60\x6c\xdc\xe0\x57\xd8\x3f\xb3\x5d\x0b\x08\x51\x10\x04\xaf\x0f\x94\x3b\xdc\x56\x2a\xe1\xce\x72\x48\xca\x1d\x85\x47\x45\x7f\x6d\x4d\x0a\x83\x26\x09\xaf\xd9\x6a\x0f\x78\x91\xc9\x84\x3f\xcd\xf3\x90\x78\x64\x16\xc6\x7e\x81\xf1\xaa\xb2\xd9\x60\xcf\x92\xd7\xfe\xc1\xfd\xf2\x6b\xf7\xd2\x72\x89\xbf\x78\xf9\xe8\xe0\xd5\xf1\xdb\xff\x7d\xf9\x5e\xd5\x13\xd2\xf1\x6c\x99\x7c\xa6\xa1\x78\x55\xc2\x5f\x8c\x8a\xbf\x7e\x46\x17\x71\x30\xa6\x9d\xc1\xbf\xaf\x4f\xfe\x9d\xfc\x3b\x3b\x7d\xf6\xef\x2f\x83\x69\xaf\x7d\x7d\xf5\xe8\xd1\xd5\x97\x76\x17\x1c\x63\x7f\xf1\xc2\xff\xfb\x54\x96\x38\x11\x65\x4e\x59\xa1\x13\x59\xea\xf4\xc4\x5f\xce\x2e\x65\x14\x2a\x29\xa3\xdb\x42\x2d\xa9\x86\x50\x19\x71\xcd\xc7\xb2\xdb\x92\x93\x1a\x18\x70\xd7\x2c\x20\x1e\xf1\x97\xc1\x00\xee\x40\xa9\x70\x87\x01\x9e\x36\xa0\x82\x35\x87\xf4\x59\xde\x01\xcb\x32\x57\xae\xf0\x3b\x63\xc1\x90\x0d\xc2\xdf\xbf\x1a\xa2\xba\xba\xb3\xb6\x38\x99\xeb\xd4\xc0\x67\x0b\x06\x7d\x47\xa5\x84\x35\x0d\x37\xa6\x59\x73\x17\x9f\xee\xcc\x9e\xdd\x19\x31\x74\xf0\x18\xad\x2c\xa8\xc1\xf5\x5d\x32\xa6\x31\x84\x83\x90\x8f\x38\x8d\x32\xe3\x98\x06\x99\x34\xe1\xb2\x5a\x11\xc9\xd6\x82\xf6\x03\x81\xaf\x86\x42\x56\xe4\xdb\xe3\xcc\xf2\xf6\x5e\x87\xff\x2a\xed\x2a\x05\xce\x30\xfc\x75\x8f\x6c\x6d\x6e\x6e\x92\x87\xfc\x72\xc6\x73\xd7\xea\x75\xfc\x00\xef\xf6\x00\x3b\x12\x5f\x8c\x83\xe4\x54\xd0\x0b\x8f\x24\x24\xde\xf5\xad\x8e\x2a\x77\xc6\x2c\x12\x81\x60\x55\xc2\xb2\xd2\xe9\x30\x67\x11\xfd\xc5\x32\x9f\x99\x16\x83\xb6\xaf\x78\x0c\x2e\x9c\xff\x30\x1e\xf9\x93\xd8\x42\x83\x30\xcc\x71\x9c\x7b\x61\xe5\xe0\x4a\x63\x5c\x3d\xdc\x5b\xe3\x1b\xae\x3c\x18\x88\xb3\x76\xc4\x83\x2d\x08\xae\x07\xbb\xb1\xbc\x15\x52\xa9\x87\x21\x2f\x15\x64\x59\x74\x46\x31\xc3\x0d\x42\x35\x7b\xb2\xbd\x0a\x0e\xeb\x81\x36\x62\x2d\xf8\x6d\x4a\x91\x4c\x21\x5f\xab\x47\x21\xb9\xba\x92\x5f\x27\x9b\xa7\x6a\xcb\x84\x2b\x6c\xde\x37\x0d\x2d\x12\xcc\x12\x3c\x11\x4b\x74\xde\xcd\x8b\xec\xa9\xde\x54\x49\xbc\x0c\xb4\xaf\x1a\x96\x75\xcb\x5d\x4d\xae\x23\xbc\x52\xc9\xf9\x8c\x4a\xbf\x03\x21\x17\xcb\xe1\xf4\x05\x1a\x77\xb6\xbf\x87\x08\xcd\x82\x88\x2b\x50\xeb\xda\x77\xaa\xa3\xfd\x24\xcd\x3a\x0c\x2f\x9f\xe9\x25\x3f\x29\xfa\x06\x60\x3a\x81\xe9\xf8\x81\xfa\xb3\x20\x3f\x3a\x4f\xde\x41\x98\xb0\xe2\x12\x22\x6f\x5a\x5c\xa0\x04\x3d\x9f\xe9\xe5\x69\xb9\x6d\x67\x3b\x4d\xc8\xe1\xbb\x83\x76\xd7\x5a\xfc\x42\xb6\xa8\xa8\xd3\x31\xb3\xd0\xcb\xe4\x00\xfb\x20\x14\xce\xf2\x09\x3a\x6e\x44\x39\xc9\x8b\x88\x87\xd2\x89\x42\x44\xd4\xd8\x2c\xb4\x14\xe1\x7e\x3b\xce\x4e\xf9\x69\x49\xca\x01\x6c\xf7\xc8\xa8\xe8\x47\x8f\x53\x81\xd9\xab\x69\x9a\x50\xa1\x79\xea\xac\x7f\xb2\xc5\xfe\xf3\x2c\x2a\xc0\x5f\x8a\xc5\x8d\x10\x88\x75\x84\xfa\xe4\x9e\xa1\xa4\x8b\xc1\xf5\xb2\xda\x85\x02\xc9\x3b\xf4\xaa\x17\x04\x6b\x98\x7e\xac\x7a\xe9\x07\xf4\x74\x85\x18\x9b\xec\xae\xc1\xb9\x57\x40\x91\x44\x53\x3d\x96\x88\xe7\x08\x55\x7b\xd6\x94\xbd\x0c\xd1\xb3\x5f\xdf\xa8\x2a\x2c\x9e\x6f\x26\x36\x28\xaa\xc6\x52\x83\x39\x94\xda\x7d\x94\x58\x7f\xbe\x7d\xd2\x32\xbb\x13\xda\x44\xeb\x8c\xe2\xb8\xe3\xf9\x57\xba\x04\x2b\x6b\xfd\xda\xac\xd5\xde\xb0\xd9\xed\x46\xbb\x45\x72\x6c\x98\xdd\xc7\x76\xda\x9a\x0f\xc2\x8b\xad\xb4\x20\xf9\x72\xb1\x48\xb3\x02\x74\x6b\xfc\xa6\xf6\xdd\x01\x51\x5a\x95\xb6\xe1\x08\xb2\x9c\x30\x1b\xbf\x54\xb8\xc9\x62\xac\xa7\xb2\x95\x28\xcc\x7b\xac\x07\x9a\xaa\xb4\xa0\x47\x0e\x75\xed\xdd\xb4\xd4\xdb\x8d\xab\xc7\xd5\x18\x74\x9c\xb4\x97\xbc\xd2\xbe\x3e\xed\xed\x7c\x73\xaf\xd2\xbd\x57\xe9\xfe\x57\xa8\x74\xc5\xc3\x8a\x5b\x3d\xc7\xde\x0f\xb2\x34\x21\xff\xbb\x9c\x07\x67\x51\x4e\xbe\x0f\xd8\xe7\xdf\x3e\xf3\xcf\xfe\x9c\x7a\xd5\xbd\x83\x01\x39\x4c\xa2\x22\x0a\xe2\xe8\x57\x4a\xfe\xce\x7b\xc1\x08\x35\x20\x39\x58\x62\x49\x83\x1b\x18\x28\x5b\xaa\x86\x93\xf3\x3e\x68\x75\x65\x31\x19\x45\x44\x84\x4f\x3b\x0c\x87\x64\xb3\xee\xe6\x8d\x5b\x7b\xb0\xe1\xdb\x6e\x75\xbd\x66\x26\x5e\x77\xba\xfa\x15\x9a\x8c\xd4\x36\x91\x08\x85\x96\xb4\x41\x8f\xc7\x09\x2f\x7f\x9d\xd2\x43\xaa\x9e\x89\xac\x46\x66\x49\xdf\xbb\x5e\x37\x44\x68\x04\xac\x3d\xa7\xf7\x83\x35\x81\x9e\x12\x57\xbc\xbc\xad\x9e\x68\xcc\x70\x9a\xca\xb3\xba\x65\xaa\x65\xd9\xa4\x63\xcc\xa3\xcc\x76\xd7\xdb\x28\x66\x5a\x10\x9e\xb1\x33\xaa\x9c\x1d\x72\xf8\x02\x72\x64\xef\xd4\xa4\x6d\x6c\x94\xf9\x19\xf2\xbf\xfe\xe1\x6f\x85\x9c\x6a\x74\xb6\x7c\x1e\x24\x46\xaa\xd2\xe5\xbb\x20\xfe\x3f\x3b\x30\xc9\x17\x42\xcd\x0d\x2f\x24\x0e\xd4\xe1\x51\x1a\x10\xf9\x4d\x75\x94\xb2\xae\x2e\x6e\x9f\xe7\x65\xb6\xd5\x80\xdf\x3c\x43\xa2\xc1\x6a\xcf\x0a\xe7\xcd\x13\xad\xcb\x50\xee\xd3\x07\xe9\x9c\x05\xd0\x33\xd5\x76\x9f\x9e\xd1\xec\xb2\x23\xbd\x21\x7f\x88\x92\x69\x4c\xdf\x70\x84\x77\xc9\x90\x78\x33\x74\x4d\x62\x5a\x55\x47\xfc\xe0\x62\x02\xd5\x41\x4b\x09\xef\x92\x6e\x90\x05\x91\x4c\xe3\x14\x69\xd8\x16\x89\x0c\x39\x3f\x7b\x7b\x7b\x9c\x6a\x30\x90\x70\xbb\x20\x61\xd9\x99\x9b\x81\xf1\x6b\xdd\xb6\xaf\x3a\x21\xc3\x5a\x3e\x25\x07\x03\x1e\x58\x52\x25\x09\xaf\xec\x98\xb9\xc8\xf5\xd8\xc8\x9f\x3c\x67\x44\x23\x78\x8f\x56\xc3\x8e\x9e\x33\xa0\x72\x17\xdf\xa2\xe3\x16\x7f\xe1\x75\xe5\x9c\xa9\x8a\xaa\xa4\x80\x13\x76\x41\x79\x24\x16\x45\x47\xf2\x9e\x2e\x99\x44\x34\x0e\x2d\xd3\x03\xd1\x8a\xd1\x53\x8b\xe7\xe0\x0e\x5a\x8c\x87\x77\xcd\x22\x43\x99\x6c\x45\x7d\x90\x64\xe1\x3a\xc2\x72\xd8\x9b\x84\xed\x4b\xd6\x26\xbf\x05\x8b\x33\xf5\xf0\x8e\xac\x28\xea\x13\x72\x22\x13\x03\x9f\xdc\x8b\x81\xf7\x62\xe0\x5f\x5b\x0c\xd4\xef\xf3\xf8\xa2\xb9\xab\x17\x7a\x77\x73\x77\xcf\x40\xde\x48\x75\x63\xa9\xb1\x32\x9c\x13\x45\xa4\x16\x69\x85\xcc\x3e\xd1\x29\x52\xb8\x5c\x93\xb9\xec\xd3\xb8\xb8\x07\x9e\xa7\xf3\xb5\x64\xb0\x89\xc0\xc0\x27\x3f\x0e\xa9\xa9\x0d\xa1\x71\x06\x2a\xc1\x3d\x3d\xfb\x8a\x58\x39\x86\xd2\x15\x34\x06\x6f\x82\x24\x98\x52\xfd\x3a\x9f\xb1\x2c\x8e\x0a\x43\x15\x20\x5d\x78\x68\x70\xb4\xdf\xcf\x0d\x0c\x39\x15\x67\xf3\x1a\xfb\xf7\x90\x32\x0e\x13\x25\xa6\x7f\x4f\x4b\xfc\x1b\x05\x39\xf7\xb9\x50\x16\x89\x62\x4a\xc1\x4b\xa5\x67\x93\x32\x3d\xcd\xdb\x8e\x45\x65\x9b\x66\x7b\x40\x62\x0e\x22\x44\x1b\xa5\xb1\x26\x0c\x77\xa2\x28\x7c\x8e\x22\x0e\x65\xc7\x27\x7d\x19\xe6\x4c\xb0\x51\x29\x75\x6e\x8e\xb9\x33\x4e\x7d\x49\x21\x42\x73\x88\x6d\x57\x8d\xb3\x4f\xde\x30\x56\x1e\xd1\x5c\x84\x40\x07\x7c\x38\x5e\x28\x0d\xcf\x9e\x8d\xf1\x26\x07\x75\xf5\x76\x19\xc7\xda\x31\x46\x8f\x49\x91\xf4\x22\x82\x6b\x33\x1f\xee\xfe\x98\xf1\x87\xee\x2c\xec\x0e\x59\xfb\x5a\x71\x77\x1c\x4c\x36\x8a\xb6\x63\x07\x38\x51\xa1\x64\xcc\x83\x18\xa9\x09\x1f\xf3\xfe\xdd\x81\x88\x30\x51\x1d\x3b\x46\xa3\x4d\xb8\x7a\xe5\x84\x07\x48\x57\x27\x4e\x1b\x4d\x1c\xf4\x90\x41\xba\x58\x32\x88\x4e\x25\x79\xd0\x81\x6a\xa9\xc4\xc6\xba\x87\xbb\x96\x50\x90\xef\x71\xa3\xa7\xb4\x25\x43\x2a\xa7\x8b\x3d\x02\x21\xde\xab\x42\x48\x91\x67\xfa\x37\xa7\x6e\x28\x72\xca\xd8\x01\xfa\xac\xf1\xac\xef\x60\x9d\xf3\x7b\x15\x7b\x19\x63\xde\x45\x3c\x77\xc0\x5b\x7d\x56\x34\xdd\x11\x97\xe0\xde\x13\x23\xc5\x0c\xf5\x8c\x51\x68\x6f\x56\xe0\x6c\x06\x8e\x3d\xcf\xbc\x00\xaa\x2a\x6f\x6c\x12\x81\x0b\x5f\xc8\x22\xf9\x7e\x4a\xd2\xe1\x0a\x91\x8b\x02\xb9\x6e\x1b\x21\xa1\x59\x0c\x22\xec\x8e\x55\xec\x23\xb6\x97\xe4\x95\x9d\x2f\x0b\x79\x02\x80\xd1\x32\xc0\x80\x90\x67\x04\x18\x52\xc7\x14\xbf\x16\x44\xaa\x33\x40\xb3\x54\xa2\xcc\xa8\x72\xab\x8c\x55\x1c\x0e\xaa\xa4\x8b\x5c\x8e\x4f\x53\xda\x1a\xfd\x82\xd1\xc5\x32\xe4\xd0\x46\xcb\x28\x0e\x01\x61\x62\x50\x2c\xd3\xf1\x6f\x0b\x0c\xff\xe3\xd1\x8b\xa3\xf5\xf5\x75\x10\xef\xdb\x39\x59\x4e\xe3\xcb\xbe\x88\x22\xc6\x0e\x04\xcb\x9c\xed\x89\x85\x6a\x25\x41\x2e\x65\xd9\x6f\x69\x57\xa3\x6e\x48\x18\xe3\x80\x0c\xf5\xde\x7a\xcb\x88\xf4\x34\xfa\xe5\x84\x65\x9f\x6c\x9e\x9e\x32\xb1\x0b\x7f\x5e\x5d\x29\xbb\x4d\x1b\x94\xff\xd8\x82\x32\x6c\x2c\xbb\xfe\xab\x22\xab\x76\x80\x24\x88\x0b\x3b\xe8\x55\x88\x2a\xbb\x45\x55\x97\xea\xda\xe8\x94\x87\x40\x49\xfc\xcf\xb2\x88\xe3\xe7\x5b\xc8\xef\xfa\x34\xbc\x8a\x1f\x68\x62\x45\xb0\xf0\x85\x2a\x30\xce\xea\xd0\x96\x29\x51\xea\x8b\x29\x7d\x3f\x63\xc4\x62\x51\xe6\x75\x1e\xd3\x3c\xbb\x61\x0e\x2f\xda\xc1\xcc\x4c\x19\x45\x5a\x06\x34\xde\x70\x2a\x66\x77\x8d\x6a\xca\x87\x60\x5f\x43\x09\x52\x61\x59\x4d\x3d\x3d\xcb\x30\x57\x34\xa9\x77\xe7\x28\x39\xe4\x32\xa3\x70\x43\xfa\xfe\xdd\x81\xf2\xc0\xc4\x4d\x59\xc6\x41\xa2\x84\xcd\x28\x11\x4a\x17\xbf\xaf\xa7\xcc\xf5\xf5\xd8\xef\xf7\xaf\x71\x7c\x37\xdb\x97\x9e\xd6\x64\xca\xa2\x1e\x4e\x5a\xe7\xd3\xbe\xd4\xdd\xfc\x2a\x44\x28\x69\xc0\xf4\x49\x8f\x67\xad\x0c\xd1\xa2\x64\x89\x62\xe7\x8d\xb4\x81\x69\x7a\xfd\xf7\xed\xbd\xde\xe7\x5e\xef\xf3\xd7\xd6\xfb\x08\xa5\x4f\x38\xba\xc5\xcd\x9f\x4f\xef\xa3\xb4\x35\x58\xf1\xc3\x99\x93\xd2\xe8\xbc\x78\x6e\xf0\x11\x36\x0c\xd3\xe5\x87\xa3\xa9\x80\x91\x5a\xc9\xbb\x15\x81\xc2\xd6\xb4\xbc\x94\x77\x3c\x36\xfd\xe2\x82\x8b\x7c\x21\x96\x74\x65\xc9\x41\x1d\x56\x33\xda\x59\x04\x90\xa3\x76\xe9\xf8\x3a\x68\xe9\x9b\xf5\x2e\x5f\x1e\xb0\x68\xb1\x2c\xd4\xe3\xb5\x84\x9e\x0b\x6c\x76\xf4\x76\xc9\x84\x8e\x21\x69\x2b\x38\x2b\x8e\xc6\x90\xb4\xc3\xd1\x27\x5f\xae\x14\x13\x77\x54\x9f\x54\xa3\x53\xda\xac\x51\x05\xe7\x6d\xd4\x97\x2b\x1b\xdd\x76\x1b\x5d\x2c\x8b\x57\xf4\xa2\x7e\x98\xaf\xe8\x45\xd9\x18\xcd\xac\xea\x01\xd6\xb7\xc5\x81\xca\x86\xe6\x6f\xcb\x1a\x97\xd8\x8c\x4e\x34\x9c\x9c\x88\x9e\x46\x72\x4f\x0c\xbd\x27\xba\x05\xc0\xa7\x25\x3b\xd7\x8b\xe7\x7a\xd7\xe2\xb4\xd3\x1a\xee\xc0\x16\xf5\xf4\x7e\x8b\xba\xdf\xa2\xfe\xda\x5b\x94\xbe\x9a\xa0\xc5\xec\x46\xf7\x12\x02\xf8\x6e\x5f\x25\x96\x44\xff\xf7\x85\xff\xf7\x5d\x82\xf8\xef\x41\x6a\xb6\x4d\x06\x22\xcd\x91\x2d\xa0\x85\x48\x96\x60\xe3\xb2\xf6\xc6\x69\x32\x89\xa6\x12\x0c\x85\xc2\xc1\xd0\x32\xb2\x8a\x04\x3b\x17\xcf\xd6\x8c\x0b\x1a\x91\x28\x61\x7e\xe4\xa1\xc0\x2d\x64\x40\xa2\x04\x39\xcc\x3f\x5c\x26\x63\xbe\xc5\x60\xa8\x9c\xa7\x4a\x30\xc6\x8a\x33\x6a\x03\x89\x54\x55\x17\x77\x50\x84\x21\xa2\x51\x90\xc8\x6c\xee\xf5\xd0\xe9\x8f\x4c\x56\x42\x08\xf8\x4c\x6b\x72\x67\xa0\x74\xde\xe2\x8d\x20\x28\x01\x37\x4f\xbb\xe4\xc1\x03\x22\x7e\xf7\x41\x27\x78\x34\xe9\xb4\x37\x2f\xda\xdc\x75\xc9\x66\x97\x3c\x23\x2d\x5a\xcc\xd8\xee\x01\x81\x49\x9f\x5f\xbe\x0a\xf2\x59\x8b\x0c\xed\x64\xae\xd1\x6d\x69\x29\x01\xc5\x7f\xfa\x31\x4b\xe7\xcf\x7f\x83\x9e\xb6\x45\x97\x50\x58\xa1\xe7\x97\xd0\x30\xeb\xf4\x7e\x12\x1e\xb2\x72\x2a\x9a\x97\x17\x92\x8f\x43\xc1\xea\xf1\x2c\x93\x71\x4c\x7f\xa3\x01\x1c\xb3\xb6\x6a\xba\x8e\x61\x4a\x3b\x2d\xe7\x07\x8d\xf3\x20\x5d\x26\x8d\xae\x99\xee\x60\x1c\xde\xb6\x39\x09\xe1\xa1\x94\x80\xf1\x51\x39\x53\xf0\x1b\xf6\xff\x58\x35\x88\x26\xc3\x99\x04\x0c\x60\xf4\x59\x75\xef\x65\x31\xbb\xeb\x03\x42\xe3\xc3\xc1\x1d\x9d\x0d\x20\x00\x70\xf9\xd9\x80\xab\x3e\x38\x17\x8f\xa8\xb7\x47\x0b\xdc\x99\x45\x4d\x3f\x16\x37\xe8\x02\xba\xe3\xe6\xdc\x95\xfb\xbf\x20\xd8\x43\xf7\xe1\xf3\xfd\xb7\x56\x30\x32\xc1\x53\xb9\x56\x86\x3f\xa0\x15\xba\x99\xeb\xb5\x35\xde\xbb\x3e\xb7\x8c\x52\x6f\x69\x5e\x16\x33\xad\x0d\xea\x91\x36\x0e\xdd\xdc\xee\x89\x61\x4e\x69\x31\x2c\xd1\x79\x4a\x5f\xa5\x7d\x5c\x50\x8c\xa4\x27\xf4\x74\x46\xe1\xb3\x20\x36\xa2\x8c\xf5\xad\xc0\xd9\x67\x41\xec\x38\x23\x51\x69\xd7\x6b\x80\x9e\x95\x86\x22\xfc\xfc\xdd\x64\x30\xa2\xe8\x4d\x86\x23\x8a\x36\x1c\x50\x93\xb3\x28\xe3\x2e\x41\x0c\x96\x9b\xb5\x27\x27\x01\xe8\x9e\x9e\x24\x9b\x72\xf2\xd5\x11\x0a\x59\x73\x1a\x57\x78\x43\x72\xa2\x05\x2a\x7e\xbd\x27\xdc\x68\xfe\xa8\x6f\xf3\x6c\x08\x1c\xf9\x9c\xf3\x13\x05\x8c\x42\x47\x5a\xf7\x58\x43\x5c\x0d\xcf\x53\x3e\x6b\x14\x50\xc9\xb1\x39\xcd\x82\x29\xdd\x2f\x9a\x9c\x9c\x05\x68\x29\x8e\x7c\x10\xea\x50\x5b\x81\x25\xbe\xee\x38\xc7\x2e\x52\x38\x59\xae\x82\x16\xef\xc0\x84\x73\xc7\x9a\x31\x31\xa8\xd2\xe1\x58\x99\xbf\xfd\x7c\x7b\x07\x26\x57\x7d\x1d\x3d\x73\x76\x64\x0d\x4d\x89\x8c\xb7\x1b\x96\xaf\xb7\x3d\x67\x89\x6b\xfb\x57\xb6\x78\xc9\xf5\x6a\xf4\xcb\x9a\xa8\xa6\x5d\xd8\x7f\xeb\x31\x01\x60\x0e\x26\x94\x44\xf7\x35\x30\x81\x48\xf9\x16\x83\xee\xad\x95\x50\xf6\x7c\x11\xc5\xfc\xf0\x56\x4b\xde\x02\xb4\x82\xc6\x5d\x08\x89\x87\xcd\x72\xfa\xb3\xe5\xb5\x86\xf4\x68\x17\x73\xba\x55\x25\xb2\xba\x1d\xdc\xba\xe5\x44\x55\xcd\x8d\x9c\xc2\x17\x74\x1c\xcd\x83\xb8\x1c\x15\x5a\x0a\x6c\x88\x04\x5d\xa0\x84\x28\xff\xb8\x03\x36\x85\xa7\x9a\xc1\x96\xc7\x4a\x2e\x39\x82\x81\x7c\x5d\x39\xe8\xfa\x15\x84\x2a\xac\x66\x1e\x1f\x3d\x27\xd4\x95\xc6\xa4\x4a\x39\x83\x2b\x3b\xfc\xfe\x91\x38\xcd\x4d\xf0\xf4\x9e\x8e\x69\xb4\x68\x40\xe6\x6e\x99\x26\x04\xe0\x82\xde\x96\x02\x44\x8d\x8d\x07\xd8\x70\x15\xd7\x72\x31\xcf\xe0\x6c\xc0\x26\x14\xc0\xc5\xa2\x3b\x12\x10\x6b\x97\x37\x3b\x20\xbd\x0f\xce\x9b\x2f\x71\xb7\x80\x1f\x11\x95\x70\x4d\x38\x1b\xc3\x83\x47\x16\x72\x43\x4b\xd7\xf5\xb6\x51\x57\x6f\xde\x4f\x7b\xa6\x7c\x6b\xcc\x37\x8e\x68\x9a\xac\x30\x0e\x13\xba\x64\x1c\xa5\x40\x5f\x79\x1c\x0d\x3a\x5f\xde\xe3\x3b\x97\xb5\x4b\x08\x47\x18\x77\x55\x75\x14\x02\xff\x7b\x3b\x6a\xe5\xdc\xa4\xa3\x6c\x2f\xb8\xb3\x13\x81\x19\x21\xbd\x6a\x4c\x08\xd2\x3f\x34\x3f\xc0\x4d\x28\xc6\x18\xe1\xad\xb8\xd2\x98\xcb\xa7\x32\xae\x79\xdd\xb4\x71\xe8\xbe\x0c\x76\x5e\x32\x85\x66\x9d\xbe\xb1\x96\x76\xe4\xf5\xeb\xd7\x0d\xfb\x10\x97\x52\x90\xaa\x69\xa5\x96\x3f\xd0\x6c\x41\x6b\xb7\x27\x85\x01\x0e\x5d\x8d\x00\x07\xa6\xa2\x17\xf9\x72\x34\x8f\x8a\x9f\xd3\xac\x4e\x4a\xd2\x80\x25\x2b\xdd\x97\x5f\x7d\xf5\xdd\xa0\x55\x01\x55\xba\x15\x97\xb4\x67\x1d\x71\x9c\xeb\x6f\xad\xf8\xe9\xe1\x34\xa5\xe8\x30\x52\x0f\xd2\xd0\x04\x83\x25\x6c\xa4\x80\xec\x6f\x15\x12\x07\x30\xb7\xa4\x2d\x3e\xb8\x10\xfa\x28\x61\xe4\xa1\x82\x65\xe9\x4a\x30\x2d\x03\x10\xb2\x53\x59\xb6\xd5\xa8\x69\xd0\x8b\x18\x89\x4e\x74\xc5\x00\x94\x67\xee\x57\x66\xa1\xd2\x12\xa8\x79\x73\x45\x3b\x19\xaf\x5f\xbf\x76\x81\x39\xf5\xa3\x2a\x15\x61\x1a\x83\x66\x09\xf0\x2d\x2c\x1c\x78\x4c\x36\xa5\xec\xae\xf2\xd1\xac\xe9\x88\x91\xae\xd2\xba\x9a\xa6\xa3\x6a\xe1\x46\xc9\x28\xc8\xb1\xa2\x42\x74\x00\x18\xa5\x58\xb7\x02\x46\x81\x5c\x77\x7b\x2b\xb4\x31\x8f\x12\xd3\xba\xc5\x69\x41\x40\xdc\xb0\xfe\x59\x90\xcf\xb2\xa0\xa8\x1c\x43\x09\x4c\xa3\x9d\x61\xf5\x1e\xc9\xdb\xd9\x8a\x0e\xf9\x41\xea\xcf\x19\xe2\x3a\xd8\x3c\x5c\xac\xde\xc3\x69\x90\xbf\xcb\xa2\x71\x25\xce\x4a\x60\x6e\xac\x04\x5e\xbd\x97\x22\xec\x50\x5e\xd5\x4b\x05\x73\xc3\x36\x46\xe8\x0a\xad\xa2\x99\x72\xb0\xaf\x44\x43\x32\x26\xc3\x3f\xb8\xad\x4d\x55\xdf\x6c\x50\xd4\x22\x66\x21\xc6\xb5\x4b\x7f\xac\xed\x18\xd0\x95\xe6\x28\x32\x5e\x2c\x04\xe3\x22\xcd\xa4\xf8\x23\x2d\x1f\xc0\x8c\xb8\x47\x18\xac\x61\x4b\x2c\xa0\x7d\x8d\x4d\xa4\xa5\x83\xf3\x14\xb5\x87\x9e\xdb\x71\xa8\x83\x8c\x82\xa5\x12\x3c\x1e\x3b\xb0\xcc\xe9\x51\x9c\x22\x6e\x3d\xa1\xeb\x61\xa8\x90\xe1\xe6\xad\x1b\xbb\x9e\x34\xc7\xe8\xd3\x62\xd6\xe9\xf6\x5c\x92\x7d\x9d\x4e\x91\x6c\xdc\xac\x4b\xbe\x81\x6a\x43\x8c\x6a\x17\xfa\x12\xfb\x1d\x51\xa0\x3f\x8d\xd3\x51\x10\xf7\x19\x52\xfb\x81\x9b\x2c\x62\x9e\xf9\x9a\x8c\xc6\xc1\xff\xc7\xde\xbb\xef\xb7\x6d\x33\x8b\xa2\x7f\x27\x4f\x81\x66\x9f\xaf\x91\x63\xc6\x16\x75\xb3\xa3\xc4\x5d\xcb\x91\xed\xd8\x2b\x71\xec\x6d\x3b\x6d\xbf\xed\x9f\x9b\x1f\x25\x42\x16\x1b\x89\xd4\x22\x29\x5f\xda\x78\xbf\xcf\x79\x8e\xf3\x62\xe7\x87\xc1\x85\xb8\x52\x94\x2f\x69\xda\x65\x7f\x6b\x35\x22\x09\x0c\x06\xc0\x60\x30\x18\xcc\x65\xfa\xf1\xb6\xcd\x92\xca\x46\xa3\xf4\x65\x59\x93\x92\x55\x4a\xd1\xa0\xee\xfa\x20\xe7\x94\xe2\x15\x6a\xf6\xe9\x99\x17\x8d\x6a\x3b\x1f\x15\xf6\x7c\x9a\x61\xce\xb3\xae\xbf\xee\x3d\x33\x0c\x84\x98\x81\x7a\x61\x99\xf3\xac\xdb\x68\xc3\x0b\x3a\xa7\xcf\xba\x8d\x57\xf4\x51\xd0\xc2\xb3\x6e\x93\x56\x89\xfa\x41\xfc\xac\xdb\x6c\x7a\xaa\xf9\x20\x3c\xb2\x41\x7a\xd6\x6d\xb5\xe0\x99\x9b\x11\x3d\xeb\xb6\x28\x78\xc6\xd9\x9f\x75\x5b\x14\x2d\x7e\xd9\xfb\xac\xdb\x22\x0d\x72\x23\xa0\x67\xdd\x56\xf3\xe6\xcc\x6b\xbe\x7a\xb4\x47\x7c\xb4\x47\xfc\x67\xdb\x23\xba\x8c\x11\xef\x6c\x33\x5f\xdd\x4c\xb0\x82\x0d\x20\x94\xfb\x88\xf3\x87\x34\xb1\x87\xb7\xf3\x4d\x56\x0a\xe3\xfa\xdb\xd8\xac\x54\x30\xa9\x5f\x5d\x5d\x2d\x62\xd2\xd8\xe2\xdc\xb0\x84\x8d\x84\xc5\x03\x38\x9c\x8f\x50\x30\x8d\x24\xdc\x1f\xe8\x40\x62\x26\xa3\xd7\x04\x1e\x35\x63\xfd\x6d\x85\x2b\x8c\x53\x5d\x37\x6e\xb4\xe2\x2a\xb4\x80\xc0\x27\x8b\x5f\xc6\xa6\xf6\x11\xe7\x96\x4d\x4d\xdd\xbc\xe4\xdd\xe5\xe6\xcc\x6b\xd5\x1f\x77\x8b\xc7\xdd\xe2\x9f\xbd\x5b\x7c\xa7\xd6\xeb\xf7\x67\x68\x5e\xd1\x0e\xbe\x30\xe5\x3c\xc4\x69\x96\xc4\xc1\xf8\xd1\x9e\xf3\xa1\xed\x39\x6f\xaa\x59\xf8\xc5\xf8\xb2\x30\x1b\x2c\xd3\x0f\x17\x05\x4d\x15\xf1\x94\xcd\xea\x67\x6b\xa1\x3b\xdc\x50\x46\x13\xb2\x11\x1c\x05\x97\xef\xf1\xbc\x9b\x0b\xb9\xe8\x73\xef\xe9\x93\x27\x3a\x6e\x46\x81\x12\xcf\xb4\xea\x37\x71\x66\x3b\xe2\x83\x64\xb8\xf7\xe4\x49\xc5\xbb\xe9\xca\x57\x70\x78\x70\x84\x07\xc9\x05\x0d\x0e\x55\x76\x67\xc5\xcb\x59\x71\x55\xbf\x96\x0c\xc8\x2c\x1e\x27\x83\x2f\xd5\x28\x45\x29\x5b\x42\x2c\xae\x72\x55\x0c\x1e\xab\x8d\x9b\x73\xf4\xee\xf9\xe6\xbb\x98\xfb\xb9\xd7\xdf\x8b\x5c\x73\xda\xae\x8d\x9d\x5d\xaa\x3e\x3f\xd5\x66\xa7\x7c\x6e\x16\xb9\xcb\xd4\xe7\x46\x43\xde\x26\x59\xb3\x86\xa5\x46\xa4\xc5\x5b\xbc\x55\x28\x48\xba\x3d\xe1\x54\xed\xba\xed\x70\x5e\x8a\x48\xe0\x64\x79\xf7\xe1\xce\x07\x9b\x73\xd4\xc2\xc5\x74\xc8\x85\x1d\x62\xb9\x29\x97\xf3\xed\xb6\x10\xce\x2d\x2a\x22\x4d\x2b\xa4\xcb\xe9\xfe\xa3\x9c\xfe\x28\xa7\xff\xb3\xe5\x74\x26\xa4\x67\x23\x87\x56\x67\x8e\xf8\x8d\x53\x3c\x9b\x10\xd0\x3f\xcd\x51\x02\x0d\x92\x14\xaf\x44\x89\x2a\xa7\xaf\x55\x0e\x9c\x50\xd1\xd1\x72\x9e\xbf\x26\x14\x3a\x1e\x8d\x1e\x5c\x3b\xf4\xfd\xc8\xe3\x84\x3b\x1e\x8f\x94\xdb\x0d\x7c\xc9\x82\x4e\xef\x7c\x8b\x0b\x9d\x6c\x34\xff\x42\x27\x1b\xc1\x85\x0e\x15\x5c\x16\xb9\xb7\x29\x93\xf3\xdd\x9b\x93\x21\x1e\x48\x5b\xd3\x85\xf5\xa6\x8e\x89\x08\xd9\x68\xf4\xd9\x5e\x40\x35\x0a\x41\x16\x5d\x56\x59\xa3\x51\x3c\x4c\xdc\x2d\x5a\xbe\xde\xad\xb9\x0c\xe7\xfb\xc1\x15\x23\x82\xe3\xe8\x0f\xfd\x72\x58\x6a\x7b\x5e\x51\xd5\xea\xe7\x36\x88\x44\xf1\x61\xf2\x4b\x39\x02\xb6\x22\x77\x6b\x78\x12\xa4\x5f\x4e\xd2\x59\x96\xe3\xf0\x10\x1b\x97\xc1\x52\xf3\xe5\x05\xef\x86\x44\x8c\x89\x4c\x77\x18\x44\x25\xed\x3b\xcb\xdc\x8d\x02\x82\x30\x3c\x4c\xa3\x8b\x20\xc7\xf4\x48\xe8\x68\xbd\xac\xd8\xdd\xfa\x4e\x93\x7e\xcd\xed\x7e\x59\xb1\xbb\x21\x30\x0a\xb2\xb9\xad\x3b\xcb\xdc\xad\xe9\x73\x9c\xd3\x0d\xbd\x74\xec\x4b\x4a\xdd\xbd\xf9\x0a\x73\x5f\x56\xec\xce\x74\x7f\x7c\x3d\x29\x6d\xdc\x55\xe4\xce\x54\x3f\xaf\x61\x57\x91\xbb\x0e\x39\x91\xe3\x72\x4c\x41\xef\xa4\xc9\xe4\x30\xc8\xb2\xcb\x24\x0d\xcb\xc6\xbf\x62\x9d\x3b\xaf\x83\x79\x63\xe2\x2a\x72\x67\x32\x9c\xd7\xb0\xab\xc8\x7d\xb0\x9e\x79\x6d\x97\x94\xb2\x37\x2f\x1e\x56\x57\x51\x36\xeb\xc3\xcd\x1b\x4d\x69\x3c\x8b\x8b\xe7\x49\x94\x65\x51\x7c\xfe\xb4\x32\xb6\xd3\x24\xd3\xaf\xae\x24\x2c\x2d\x5f\x2d\x7a\x0a\x54\xae\x77\x44\xf3\x6f\xb9\x8e\x47\x23\x29\x81\x98\x66\x7b\xa1\x9c\xa2\x35\xcb\x88\x56\xe3\xf1\x0c\xfd\x78\x86\xfe\x67\x9f\xa1\x8b\xbb\xae\xfe\x1f\x7f\x68\x77\x5d\x9b\x63\x7c\x85\xde\xe2\x14\x9f\x67\x7f\x04\xd9\x1f\x11\x7a\x13\x8c\xf1\xd5\x7f\xa6\xf9\x30\x5b\x19\xcd\xd4\xe3\x70\x87\x45\x33\x3d\xc2\x43\x9c\xe2\x78\x80\xbb\x88\xb4\x9f\x75\x57\x57\xcf\xa3\x7c\x34\xeb\xaf\x0c\x92\xc9\x2a\x3f\x75\xaf\x9e\x27\x2f\xc5\xef\xfe\x38\xe9\xaf\x66\x97\x41\x3a\x59\x8d\xe2\x1c\xa7\x71\x30\x5e\x25\x5d\xc2\x57\x39\xff\x77\xe5\x3c\xf9\x5f\x1f\x9a\xcd\x07\xbe\x1a\x2b\xee\xbb\x8e\x09\x36\xff\xf0\xc3\x35\xfc\xf8\x5b\x5c\x76\x51\xcb\x57\x9c\x5f\x26\xe9\x97\x23\x0c\xa1\x6a\xcb\x14\xe5\x7a\x71\x53\x5b\xde\xff\xe3\x8f\xcf\x25\xa5\xee\xe2\x9b\x77\x1d\x0f\xb6\xe3\xa0\x3f\xc6\xf3\xb0\x94\x4a\xda\x11\xb4\x17\xb8\x0b\x6e\x97\xc1\xb4\x22\x6e\x45\x49\x07\x6e\xd6\x02\x77\xc0\x2d\x4c\x2e\x63\x16\x85\xb8\x0c\x31\x5e\xcc\x8e\x95\xe5\x6b\x75\x77\x53\x07\x62\xb3\x69\x05\xb4\x68\x21\x3b\x52\xc6\xb7\x3b\xa3\x94\xe2\x3c\x8d\xf0\xc5\xbc\x08\x10\xbc\x98\x1d\x2d\xcb\xd7\xbb\x90\x56\x4e\x76\xbb\x39\x44\x45\xca\x38\xc8\x49\xfb\x74\xe7\x21\x3a\xc7\x15\xdc\x99\xed\xb8\xa8\x1f\xee\x30\x26\x34\x7b\xc3\x9c\x18\xa9\x76\x1c\xd4\x0f\x77\x1e\x0d\x96\xb0\xa5\x1c\x19\x5a\xc8\x8e\x8f\xf1\x8d\xa3\xd4\xaa\x84\x52\xc9\xad\xae\xa1\xe2\xd4\xd9\xb2\x74\xfb\x57\xf0\x43\xe9\x65\xc1\x88\x8a\x97\x9c\x0f\x48\x37\x8e\x53\xf5\x99\x53\xbf\x04\x88\x90\x60\xf1\x78\x8e\xa5\x8b\xc9\xe9\x4c\x7a\x90\x64\xf1\x07\xbd\x66\x1c\x45\x17\x4e\xdf\x18\x32\x27\xf0\xdd\x79\x86\x2c\x87\x6d\x51\xca\x2a\xb0\xe1\xbb\xe3\x78\x65\x39\x5f\x11\x61\xc9\x16\xec\xd6\x7a\x2f\xd9\x7c\x3c\x53\x3d\x9e\xa9\xfe\xd9\x67\x2a\x76\xa0\xe2\x17\x44\xdf\x36\x4a\xfb\x6d\x0c\xab\xb9\x77\x54\x30\x8d\xb8\x30\x4e\x53\xfc\xe5\xa3\x32\x0b\x34\x7a\x5d\x56\x1a\x95\x92\x97\xce\xaf\xa7\x44\x3e\x60\x11\x28\x5f\x3f\x95\x18\x78\x94\x0f\x46\x35\xf2\x5d\xcf\x2d\x32\x08\x32\x8c\x9e\x13\x8a\xcf\xf2\xe7\x5d\xe5\x13\x4c\x56\x7a\x9e\xad\x64\xa3\x68\x98\xd7\xb4\x84\x22\xc8\x48\x0e\x58\x37\x0b\x30\x96\x0c\xee\x6b\x31\xbe\xa4\x11\xa8\xe8\x85\xec\x6b\x0b\x1a\x53\x1c\x87\x51\x7c\xfe\xe0\x78\x1c\xd2\x76\x64\x1b\x22\x1b\x52\x2c\x74\xa0\x89\x8d\x06\xce\xa8\x4c\x13\xac\xdc\x48\xd2\x81\x28\x35\xdf\x92\x90\x41\xd3\x65\x04\x85\x14\x2c\xb2\x93\x45\xaa\x8e\xa3\x38\xcb\x83\xf1\xb8\x52\xcb\x5a\x69\xbb\xaf\xbb\xbb\x50\x09\x1e\xe7\x38\xff\x90\x9c\x57\x08\x28\x46\x4a\x39\x7d\xec\x69\x8b\x5a\x91\x92\x56\xa7\xc9\xdc\x38\x1c\xa4\xc8\x9c\xf6\x7a\xa3\x20\x3e\xc7\x15\x9a\xb4\x09\x1f\x14\x84\x6c\x92\xa5\x8c\x9e\x22\x08\x91\x8e\x49\x8d\x24\xe3\xb1\x2c\x0f\x2c\xcc\x6f\xb2\xd1\x68\x05\x58\xa3\xc1\x6e\xb2\x91\xc9\x6e\xdc\xe2\xd3\x9c\x5b\x1a\x83\x0c\x90\x71\x4b\xa3\x58\x12\xdc\xab\x9a\xde\x4d\x8c\xc8\xa6\xa9\x7f\x38\x44\x4c\xd2\x45\xc6\x35\x05\x6d\x96\xe1\xa0\x17\xbd\x5b\xf3\x1a\x19\xdf\x43\xdb\x32\xe9\x19\x92\x28\xc5\x01\xe7\xa3\x2e\xf9\x0f\x05\x96\x8d\x46\x5d\xf2\x1f\x2a\xbc\xda\x12\x32\xb4\x5a\x8f\x22\xe9\xa3\x48\xfa\x0f\x17\x49\x0b\x3d\x3f\xf7\xb1\xbe\xa7\x6c\xd1\xd4\x3f\xfc\x08\x9f\x93\x79\x0e\xd2\xcd\x7e\xe4\xc8\x4b\x90\xad\xbe\x53\x8b\x42\xa2\x7f\xae\x9e\x8f\x06\xc1\x54\x06\xe2\x82\xb1\xd7\xdb\x3c\x34\x21\x48\x98\x30\x47\x74\x66\xbd\x8c\x36\xd0\xf3\xfa\xd5\xa0\x13\xbe\x0a\x1b\x83\xb0\xd5\x7a\x15\xac\xb5\x5b\x83\xd6\xab\x56\xa3\xd3\xc2\xfe\x7a\xfd\xd5\xa0\x5d\xc7\xcd\x56\xd8\x69\xb5\x3b\x8d\xfe\xf3\x02\x17\x1b\x98\xc0\x0f\x7c\xdf\xef\x0f\xea\x6b\xad\xc1\xab\xc1\x30\x58\x5b\xf7\x87\xf5\x41\x73\x1d\x77\x9a\xfd\xb0\xed\x0f\x5e\xf9\xfd\xf5\x60\x58\xaf\x3f\x77\xf3\x26\x8a\x63\x57\x92\x74\x83\x7e\xd4\xb5\x0c\x62\xc1\x09\x99\x1b\x7c\xd7\xda\x3f\xba\xd3\xd3\xc2\x04\x6d\x03\xb2\x3e\xae\x16\xb8\x66\x77\x29\x54\x85\x63\x96\xcf\xe2\xb3\xae\xef\x3d\x9b\x33\x4f\xcf\xba\x0d\xc2\x6c\xdb\x8f\xcc\xf6\x91\xd9\xfe\xb3\x99\x6d\xc1\x6b\xb9\xf2\x4b\x63\xb6\x65\x86\xc9\xc3\x34\xf9\x03\x4f\x82\x78\x25\xc4\x3f\x7d\xab\x74\xfe\xfa\x05\xe9\x5d\xd2\xf5\x53\x45\xa2\xf4\x9d\xbe\x50\x32\x12\x68\x25\x32\xbd\xc4\x6d\x72\xef\x2f\x9e\xe1\xbf\x24\x5b\x3f\x1f\x8b\x87\xcf\xd7\x5f\x35\xc7\xf7\x9d\x53\x7c\x5b\xba\x54\x92\xe4\xdb\x16\xba\x45\x1b\xe1\xff\xb0\xbd\xa5\x75\x21\xdd\xf6\x77\x92\x5e\xdb\xd9\xef\x7b\x4a\xb0\xfd\xc3\x06\x25\x1c\xed\x15\xd9\x50\x86\x51\x8c\xc3\xbb\x64\xe0\xe6\x99\x63\xf3\x04\xb1\xb4\xd5\x45\x3a\x6b\x48\xc7\x2d\x0e\xdb\x22\x21\xeb\x0a\xda\x27\x1b\x5b\x84\x33\x46\x49\x30\x4c\xda\x58\x6a\x39\xb0\xe7\x66\xd3\xe7\xe3\xba\xc3\x46\xea\xeb\xc7\xd9\x78\x7c\x23\x19\xbb\x47\x43\x84\xaf\xa2\x0c\x8a\x5b\x87\x5c\x6b\xb1\x34\xa7\x3c\xcf\x60\xc3\x5b\xa3\x39\x6c\xe4\xbc\xfb\x2f\x91\x7f\xb6\xe4\x48\x33\xbf\x32\x4d\xa6\xb5\x25\xc8\x5b\xcd\xee\xbd\x08\xff\x87\xf5\x04\xa3\xf5\x83\x2c\xdc\xa8\xc3\x4d\xed\x1b\x0a\xcc\xf2\xc4\x4e\x8a\xaa\x1d\x84\x8b\x18\xd9\x2b\xde\x0b\x27\x35\x56\x4f\xdf\x0d\x75\x84\x28\x89\x78\x82\x92\x22\x9d\xf7\x3b\x9c\xd7\xa4\xd3\x39\x8e\x67\x13\x9c\x06\xfd\x31\xee\xa2\x3c\x9d\x61\x53\xf5\x17\x4c\x70\x56\x9a\xaa\x5b\xca\xe7\x0d\x85\x41\x79\x8b\xa4\x1c\xde\xd9\x9c\x24\xde\x99\x96\xc5\x3b\x73\xa4\xf1\xd6\x8b\xbc\x56\x34\x62\xa2\x79\x9f\x67\xef\xa7\x9d\xb0\x67\x77\x49\xfa\xbf\x7b\x50\xde\xa3\x43\xc6\xfa\x42\xe0\x07\xd9\x75\x3c\x78\x07\xfb\x0d\x11\x79\xa1\x0b\x4b\x67\x4a\x4e\xf4\x4d\x56\xa4\x26\xb9\x69\x68\xd5\x94\x49\x02\x10\x2a\xcb\x80\xdb\x65\xb4\x0c\x38\xac\x0c\x46\x41\xba\x99\xd7\xea\x4b\x2b\x79\xf2\x69\x3a\xc5\x69\x2f\xc8\x70\x6d\x89\x7f\x86\xac\xca\x35\x7f\xc9\xb9\xf1\xf0\x99\x75\x67\x1e\x2d\x36\xee\x22\x8d\x2a\x8f\x88\xc6\x6b\x9c\x93\x0e\x99\x2b\x46\x08\x28\x4a\x82\x6d\xf1\xd6\x96\x62\x5b\x55\xf4\xf0\xcc\xf6\xa2\x0a\xdd\xee\x25\x8d\x4d\x91\x8a\xbb\xac\x83\x7c\xd4\x17\xeb\x65\x71\xd7\xef\x0e\x02\x86\x0a\x33\x27\x6b\x87\x68\xda\xf3\x05\x7b\x55\x31\x3d\xba\x9a\x12\xdd\x3e\xd8\x66\x52\xf4\x1b\x35\x7b\xf9\x39\xce\x17\x4c\x5e\x7e\x8e\x5d\xdb\xc9\xf7\x9d\xbb\xdc\x42\x1c\xd5\xb3\x97\xeb\x66\x73\x5d\x59\x1e\x35\x95\xe4\xa7\x67\xaa\x7a\x9d\x4c\x13\xab\xa2\x6d\x56\x15\x13\xa1\xcb\x53\xf6\x50\xe9\xd0\xf9\x00\x49\x07\x73\x2d\x66\x0f\x39\x62\x77\x1e\x8f\xd8\x8f\x47\xec\x7f\xf6\x11\x5b\xd2\x67\x32\x0e\x31\x61\x2c\x5d\x3d\x69\xff\x17\x1e\x0e\x53\x7c\x8d\x7e\x89\xc6\x83\x2f\x18\xbd\xf9\x1d\x0f\x87\xae\x68\x3d\x0b\x85\xf6\xd9\x0f\x52\x72\x84\x3f\x08\xe2\x01\x0e\xa0\xac\x2d\xa8\xcf\x2d\xe2\x00\xb1\x2a\xef\x82\x0b\xf4\x4b\x92\x84\xe8\xcd\xb9\xf3\x90\xdf\x2a\x0e\xf9\xff\xc5\xb8\xa9\xe2\x3c\xcc\x58\x6c\x59\x4a\x5b\x4b\xa0\x3a\x3d\x0b\xad\x2d\x05\x2d\x4e\xd3\x44\x0b\x1e\xb4\x4a\xdf\x51\x1b\x04\xba\xed\xec\xe5\xcf\x33\xb2\x31\x4e\x93\x38\x8b\xfa\x63\x4a\x60\xd3\x00\x9c\x48\xd0\x84\xdd\xf9\x90\xbd\x68\x9a\x26\x17\x51\x88\xd3\x4c\xd4\x0a\xc6\x59\x62\x56\x4d\xc6\x63\x52\x95\x50\x1b\xb7\x1e\x47\x71\x12\xd2\xaf\x51\x3c\x48\x26\x32\x64\x02\x8c\xe5\x14\xa0\x57\xae\x79\x34\xc1\x64\xb1\x45\x19\xf2\x51\x86\x07\x49\x1c\xc2\xee\x18\xc5\xe7\x63\x9c\x27\x31\x0c\x27\xe9\x5e\xc9\x41\x9f\xa3\xaa\x1c\xf7\xf9\x4b\xb4\x21\xba\x22\xe9\x19\x48\xdb\xa0\x01\xbe\x91\x5e\x72\x5c\x64\xad\x83\xf3\xf0\x47\x24\x94\x51\x9a\xc4\xc9\x2c\x1b\x5f\x43\x18\x0c\xc7\x3e\x4c\x3e\x59\xce\x23\x28\x0c\xf2\xc0\x79\x42\x56\x7b\xab\xa8\x3c\xe2\x50\xe9\x3c\x01\x23\x9f\xd4\x7e\x50\x7a\xaf\x24\x37\x4c\xe2\x2c\x21\x5b\x17\x21\x8a\x1a\x25\x8d\x95\xbd\xf8\x22\x18\x47\xe1\x21\x2b\x5f\x93\x65\x1e\xee\x85\x0d\x83\x21\x49\xf8\xea\x1e\xcf\xc8\x7c\x25\x4f\x0e\xe9\x3b\x40\x69\x85\xf6\xde\x83\x6e\x32\x63\x0b\xe9\xfc\xc2\x4e\xe5\x1b\xea\x5c\x51\x61\x96\x81\xe6\x57\xe5\xd0\x29\xde\x48\x94\xfd\x4c\xd0\x3d\xa2\x54\x88\x85\xa0\x26\x75\x33\x1f\xa5\xc9\x25\x52\xbb\xa7\x97\x57\xba\xc3\xba\x49\x3f\xad\x54\x3a\xf9\x07\x0b\xcd\x3e\x48\xb3\xa5\x24\xa0\x9f\x4b\x85\xf4\x33\x9f\x18\x00\xb8\x41\x11\x52\xf0\xdc\x4a\xb4\xc1\x53\x67\x4a\xb2\x71\x19\x75\xdc\x0f\x21\x98\x73\x4f\xe5\x7e\x06\xb2\x82\x3c\x4f\x3a\x85\xd3\x54\x17\xf1\x2d\xbd\x59\xd2\xcd\x6d\xc8\x9f\x02\x67\x11\x1a\x9b\x3f\x64\x46\x6d\xb9\x7d\x43\xc8\x65\xd9\x5e\x15\x12\xd4\x83\x73\xba\x8f\x0d\x36\x6a\x2c\x3b\x19\x90\x02\x6f\xc9\x77\x8b\x92\x89\xd6\xbb\x0f\xc2\x84\x16\xbe\x33\xc2\x04\x9c\x64\xea\xe4\x4c\xe6\x76\xa4\x98\xdd\x03\x2d\xaa\x34\xc8\xf5\x6c\x30\x1b\x35\xde\xca\x9d\x48\x2f\x9b\x47\x7b\x4a\x87\x04\xd1\xa1\x39\xdb\x1f\xce\xc5\xbe\x4a\xa4\x4d\x7e\x26\x64\x22\x9f\x41\x71\x39\x9f\x2a\xbb\x6a\xae\x94\x96\x44\x5d\x75\xd7\x77\x6e\xf7\xf3\x76\xee\x9c\x1c\xa9\x98\xe0\xa2\x23\x4a\xbe\x1d\x8a\x4f\x73\x39\x36\x8d\xfd\x7f\x03\xd0\xf6\xc2\xb9\x4b\xc6\xf2\x55\x98\x25\x71\x4c\xf2\x24\x4c\xd0\x60\x8c\x83\x78\x36\x45\x31\xc0\x27\x03\x2c\x8e\xed\x65\x43\x25\x61\x6f\x59\x79\x14\x49\x39\x20\x8a\x68\x5c\x1d\x4b\x22\x1c\x9d\xd2\xd2\x67\x44\x48\x22\xd5\xbb\x88\x02\x89\xc2\xae\x01\xa8\x6b\x03\xd9\x2d\x7e\xde\xf0\x9c\xd8\xab\xab\xfa\xe8\x2b\x0c\x80\x09\x60\xea\x6e\xce\x10\xaa\x89\x15\x3e\x67\x72\x93\xa9\x10\x4a\x89\x08\xca\xcc\x68\xe1\x74\x73\x1e\x91\x23\x5d\xa4\xeb\x8e\x49\x1d\xcb\x9c\x1b\x73\x5b\x3a\xf2\x02\x84\x4a\xa4\x50\x97\x77\x88\x5a\x96\x59\x06\xf9\xb5\x34\x3c\x05\xfe\x6c\x74\x6a\x4c\xa3\xfa\x05\x5f\x67\xb5\xa2\xee\x12\xd7\xf2\x42\xb2\x78\xf4\xe3\x8f\xc8\x35\x86\x84\x98\xd2\x13\xfa\xbe\xa6\x14\x7a\xad\x8e\xb3\x2e\x00\x97\x8c\x77\xb1\xfb\xa4\x98\xf0\x02\x22\xff\xf3\x61\x9f\xe0\xc1\x28\x88\xa3\x6c\xc2\x8f\xa1\xe5\xcc\x01\x00\x94\x0f\x2f\x6d\x43\x1e\xd8\x2f\x18\x4f\x45\xfe\x00\xde\xd9\xd5\x17\xbf\x67\xa3\x28\x26\x0d\x5d\x0d\x92\xc9\x74\x8c\xaf\xa2\xfc\xba\xdb\x86\x23\x19\x29\x40\x08\xa2\x46\x36\x87\x2f\xf8\x9a\x6a\x0a\xc4\x68\x4a\xe3\xb5\xba\x8a\x52\x3c\x49\x2e\x30\x0a\xc6\x63\xe8\x55\xe6\x21\x7c\x35\xc0\xd3\x1c\xc4\x7e\xf6\x4a\x2e\x9f\x8f\xf0\x35\x8a\x31\x1d\x91\x3e\x66\xf5\x43\xd2\xe3\x59\x30\x1e\x5f\xa3\xfe\x35\x0c\x19\x19\x1e\x96\x0a\x00\x68\xe6\x17\xb2\x21\x45\xf1\x79\x6d\x49\xda\x07\x6a\x3f\x28\xbd\x43\x5f\xbf\x12\x7c\x57\xa2\x38\xc4\x57\x07\xc3\x1a\xb8\x29\x12\x62\xfb\xfc\x7c\x09\x26\xff\xa5\xaf\x6f\x10\x12\x85\x7d\xc1\xd7\x67\x2b\x62\x25\xea\xe6\xd0\x26\x45\x92\xf2\x86\x69\xf2\xdf\x98\x3c\xe1\x94\x49\xe6\x7d\x40\x6d\x73\x51\x12\x57\xe1\x09\xd4\xa4\xb6\x8c\x26\x99\xc5\xb0\xa9\x02\x75\x50\x21\xea\x10\x70\x96\xce\x64\x38\x57\x7a\x4f\x00\x4b\xaa\x48\x0f\x0d\x56\xb6\x4f\x76\x3f\x1f\x1e\x7c\xf8\xb0\xf7\xf1\xdd\xe7\x93\xbd\xfd\xed\x83\x4f\x27\xf2\xf1\xa8\xca\x0c\x98\x42\x95\x22\x31\x3d\xc8\xd1\xd1\x94\xc9\x08\x5e\x5b\x41\x1e\xa0\x0d\x74\x7a\xf6\x5a\x7d\xbf\x07\xee\xc6\xfc\x75\xb5\xa5\x2a\x00\xae\x4c\x67\xd9\xa8\xa6\xd3\x3d\x13\xf1\x94\xd2\x7b\x61\x46\x0b\x7f\xc1\xd7\x4b\xc6\x18\x14\x00\x17\x18\xbc\x4a\xe2\xa6\x80\xcc\x1a\xe5\x4b\x6a\x12\x4c\x15\x26\x19\x01\xd9\x02\x43\x01\x12\x23\xa4\xa9\x0e\xd3\x7e\x30\x95\x54\x17\x92\x5e\x5b\xf5\x14\xa7\x82\x2b\x70\x8d\xa5\x3f\xf5\x31\xd8\x0f\xa6\xa7\x50\x2d\x82\x2d\x9e\x8f\xcc\x29\x14\x3f\x93\x3c\xd2\x45\xe3\x8a\xdf\x3c\x5a\x58\x66\x4e\x54\xa9\x59\x09\x6f\x72\x72\xb0\x75\xd0\xe5\x44\x86\xc6\xc9\xf9\x7f\xe8\x52\x75\xe2\x90\xab\xef\x2a\x49\x57\x50\x16\x64\xd6\xa3\x23\xfb\xb6\x32\x09\xa6\x35\x97\xb1\x02\xff\x03\xfb\xc5\xb0\x18\x65\x32\xf6\xec\xa8\x17\x85\xb2\xe3\x8d\xa0\x88\x2f\x18\x65\xb3\x14\xf4\xc4\x9c\x59\x45\x19\xca\xf2\x88\xd0\x03\xe5\xe4\x38\x44\xc1\x10\x1c\x84\xd2\x34\xba\x08\xc6\xda\x5e\xab\xc0\x24\x03\x02\x6e\xff\x74\x69\x44\xe1\x99\x8e\x62\xd1\xa5\x95\x41\x61\x0f\xa0\xd6\x11\x5f\x9c\x0e\x33\x5c\x77\x22\x7f\xba\x41\x78\xcc\xf4\xcc\x96\x1a\xc3\x60\x9c\x61\xf9\x96\x8d\xb9\x3d\xcd\x1d\x53\x91\xce\x9f\xb5\x89\x6e\x01\x83\xcc\x0b\xcc\xb8\xb4\x68\x1d\x87\xff\xd7\xc6\x78\xfe\x00\x35\x2b\x8c\x63\x75\xc5\x00\x52\x28\x4c\xea\x25\x54\x54\x47\x49\x5b\xec\xee\x61\x52\x71\x71\xeb\x19\x90\x7c\xc9\xe9\xca\xb8\x74\xa4\x07\xd5\x50\x6f\xbc\xb4\xd4\x4b\x66\xea\x0a\xa6\x90\x7e\xd6\x6d\x40\x68\x1f\xa6\x0c\x7f\xd6\x6d\x82\x1b\xea\x5a\x95\x3b\x32\x16\x73\x13\xe7\x79\x14\x9f\xdb\x3d\x7b\x81\x31\x85\x52\xe6\x5a\xb4\x21\x7c\xd6\x5e\x1b\x25\x8a\x48\xcf\xc2\x3e\xc8\x15\xb4\x88\x35\xca\xfa\x4d\x50\x5e\x7f\xbc\xd6\x7b\xbc\xd6\xfb\x87\x5f\xeb\xb1\x88\xbe\xec\xd4\x72\x9b\xa8\xbe\xf3\xcc\x61\x1d\xb9\x2f\xb4\xd4\x17\x8b\x18\xce\xf2\x25\xed\xb3\xc3\xc1\x66\x18\x66\x30\x74\x62\x77\x0b\x62\x50\x4b\x65\x68\x46\xc5\x2f\xe6\xf4\xe6\x11\xe1\x2b\xca\x21\x52\x1e\x82\xa4\x00\x74\x53\xa5\xbb\xfd\xd3\xa7\xf2\xf9\x80\x9d\xcf\x9e\xea\x4a\x22\xb2\x6d\x3e\x65\xd7\x56\x52\x39\x89\x57\xd1\x38\x3d\xdc\x95\x8e\x94\x4b\x62\xe6\x70\xa5\x70\x34\x26\x37\x91\xb1\xb7\xa8\x1a\x5d\x42\x11\xdd\xb7\x79\x4f\x33\xcb\x66\x61\xb3\xc7\xe1\x7f\xea\xbe\xa5\x6f\x4f\x2e\xdd\xa5\xb0\x10\xe4\x81\x88\x00\xe5\x1f\x7f\x04\xdc\xa9\x62\x2a\x8a\xcf\x81\x1b\x2f\x29\x10\xf9\xf5\xc5\xbc\x94\xa6\x14\xa2\xec\xa5\x7c\xdb\x4e\x0a\x69\x68\x1c\x64\xd0\xcc\x71\x4e\x26\xfb\x87\x8d\x0d\x63\xa0\xf9\x9f\xf1\x62\x75\x95\x66\x6e\x57\x48\x0a\x96\x5a\x9e\xce\x88\xcc\x96\x66\x39\xca\x12\x6a\xe7\x38\x9d\x02\xeb\x86\xb3\x73\x10\x5f\xe7\xe4\xc0\xef\xa1\x3e\x1e\x12\x06\x40\x97\x38\xbf\x42\x85\xd1\xa0\x4a\x46\xed\x2f\x1a\xd6\x7e\xb0\x60\xfd\xe3\x8f\xc8\x36\xf2\x4b\x46\x7d\x64\x5e\x37\x10\x54\x2d\xee\xd1\xce\xce\x26\x94\x6f\xc6\xf8\x2a\x47\xbd\xc3\x4f\x68\x70\x3d\x18\x63\x4f\x74\x13\x86\x5d\x6c\x36\xd0\x13\xe8\x32\xb3\x59\x9a\xa6\xc9\x80\xf0\xac\x8c\x8e\x8e\xd1\x8a\x74\x0c\x16\xcb\xc4\x36\x17\x96\x8e\x30\xd2\xd0\x4b\xdd\x78\xa8\x5e\xa5\x7f\x96\x61\xa5\xa4\xe0\x12\xcd\x24\x63\xb0\xa7\x02\x80\x6e\xc6\x26\xe9\x62\x6b\xa6\x1d\x94\x23\xdd\xaf\x6e\x09\x75\xe3\x15\x42\xf8\x5e\xe8\x15\x6c\x82\xbd\x97\x75\x48\x54\x67\x00\x9c\x85\xac\x13\x6e\x27\xb9\x67\x4d\xcb\xe9\xcc\xb5\x59\x6e\x32\xaf\xc9\x7f\x48\xd6\x35\xed\x11\x39\x5a\x52\x4e\x2d\x53\x2e\xbc\xbc\x2c\x95\x13\xeb\x55\x3a\xe9\xc3\x87\x20\x0c\x85\x6d\x97\x94\xf7\x53\x7c\xd7\xa7\x47\x3a\x38\x48\x2c\x96\x1b\x6f\xc1\x7b\xc9\x56\x9c\x0a\x74\x62\x24\x64\x4b\xdf\xa2\xdd\x52\x8b\xc5\x68\x58\xbc\x52\xb5\x52\x05\x0b\x02\xad\x82\x86\x7c\x25\x24\xe4\x59\x74\x4b\xb4\x06\x81\x09\x95\x73\x4d\x9a\x83\xa5\x92\xd1\xb6\x4a\xb5\x02\x21\xb7\x01\x1b\x91\xd5\xd5\x6c\x17\x44\xf6\x7d\xcc\x51\xfa\x28\xfb\xfe\xd3\x65\xdf\xc2\xa4\x8d\x27\xec\xbd\x2f\x1f\xdd\xbd\x7e\x10\xab\xd2\x6e\xd4\x0f\x84\xeb\x2d\xbe\xa2\xea\xea\x32\xd7\xdd\xe3\x49\x90\xe6\xdb\xac\x60\xe1\x76\xeb\xbc\x1a\x03\xb5\x12\x34\xcb\xfb\xa2\xe9\xbc\xa5\xd7\xe2\x12\xec\x38\x4f\xa3\xf8\xfc\x06\x5c\x5b\x6c\xef\x89\xb4\xdc\x0f\x62\xf9\xd3\xcf\xc1\x78\x86\x6f\xd0\x05\xf9\x87\x5d\x87\x10\xc8\x43\x9c\xe2\x39\x37\xa4\x9e\x6a\x5e\x00\x41\x6a\x18\x4e\xaa\x58\x9c\x8f\x3c\xc0\x88\x48\xeb\x1e\x6d\xc9\xdc\xc2\x40\xed\x46\x47\x19\xb2\x4d\xf7\x83\xb8\x96\x27\x4b\x4c\x55\x04\x3a\x1c\xf2\x99\xab\x7c\x6a\x16\x2b\x22\x52\x0f\xd2\x44\xd4\x9e\x47\x54\x7d\x43\x21\x32\x3f\xdd\xe7\xa6\xfe\x98\x41\xdc\x8a\x52\x22\x8b\xd9\x1c\x62\x78\x8f\x4e\x12\xe6\xd9\x2b\x77\x07\xaa\x33\xe8\xb5\x25\xb3\x6b\xbc\x3d\x21\xc7\x40\x37\x6c\x92\x2e\xb8\x48\x08\x4f\x69\x9c\x8f\xe4\x94\xe0\xb5\x25\x68\x84\x61\x1b\x67\x79\x94\xcf\xa8\xc0\x65\x9a\x7f\x85\x78\x9a\x64\x51\x2e\x63\xc9\xe0\x0a\xf4\x00\xcc\x60\x1c\xe1\x38\xd7\x2d\x31\x2a\x37\x6c\x98\x58\xf0\x54\xe3\xe6\x08\x2e\x8a\x91\x39\x7e\x5c\x05\x5f\x7a\x95\x2c\x48\x6f\x38\x8b\x43\xb0\x89\x1c\xe0\x34\x0f\x22\x31\xfd\x8e\xe5\x23\x26\x76\xb1\x75\xf4\xe0\x4b\x48\xe0\x75\x8b\xb5\xc4\x46\x9e\xcc\xa6\x96\xf1\x4b\x92\x6d\x85\xf7\x7a\x9e\x14\x12\x2d\x01\xdd\xa5\x0d\x48\xb4\x39\x9e\xe1\x2e\xfd\x87\x8b\xb9\x5a\xb2\x77\xe7\xac\xb0\xc9\x2f\x26\x05\xe2\xda\x47\x03\xc4\x39\x21\xe2\x1c\x12\xd5\x26\xb3\x2c\x87\xad\x0e\x4f\x70\x9c\x0b\xba\xe9\x5f\xe7\x38\x6b\x36\x96\x98\x30\xfe\xc3\x92\x36\x91\xac\xdc\xbd\x4f\x1f\x99\x04\x6d\x02\x79\x7d\x4a\xaa\x68\x16\x47\xff\x3d\xc3\x28\x0a\x71\x9c\x47\xc3\x48\x65\xc5\x95\x26\x9b\x0f\x4f\x85\x29\x86\x26\xed\x6c\x33\x80\x6d\x47\xda\x84\x5e\xeb\x54\xc0\x07\xb9\x16\xf4\xa3\xa5\x95\x20\x27\x9c\x75\x85\x0f\x30\x07\xfd\xe7\x5d\xa9\xc0\x10\x56\xf9\x30\x5a\xa3\x20\x98\x1b\xe2\xb3\x6e\x93\xc8\xae\x3c\x73\xff\xcd\x99\xd7\xae\x94\x2b\x99\xa9\x77\xdb\x95\x12\xb6\xbd\x96\xb5\xf0\x09\x11\x30\x86\xc1\x20\x4f\xd2\x6b\x8f\x6a\x94\xc9\xc0\x3e\x21\x7c\x9a\xc8\xfa\xc9\x10\x89\xde\x6c\x6c\xa0\x67\x34\x22\xd3\x33\x28\xf3\x64\x75\x15\xf5\x92\xc9\x24\x89\xff\xeb\xf8\xe9\x93\x27\x46\xe7\x8b\x5f\xac\x01\x8e\x53\xed\x19\x19\x86\x14\x3f\x5b\xf2\x90\xf4\x0a\xc7\x83\x97\xfd\x20\xc3\x9d\x96\xf6\x61\x12\xb6\xf5\xa2\x17\xd3\x2f\xe1\x50\x7b\x39\x88\xa6\x23\x9c\xbe\xa4\x90\x97\x5e\x3f\x7d\x72\xf3\xf4\x09\x1e\x67\x18\x49\x9d\xa1\x1a\x73\xda\x17\x3e\x0c\xcf\xd0\x8f\x3f\xb2\x0f\x2b\xc1\x24\x14\x7d\xdb\xdc\xdf\x7a\xfa\xe4\x09\xfd\x50\x3b\xe5\x38\x7b\x48\x45\x15\x9e\x09\x86\xf4\x03\x45\x0c\x7e\xcb\xf8\x9c\x89\x51\x96\x11\x63\x0d\xd1\x70\x18\xa8\xd6\x4f\x93\xcb\x0c\xa7\x4b\x4f\x9f\x3c\x11\x23\x96\x24\xf9\x4a\x2f\xbd\x9e\xe6\xc9\x7f\x1d\xd3\xaa\x37\x70\x7c\x92\xf7\x1f\xf1\x1d\xfd\xf9\xf4\xe9\x93\x9a\x7a\x1e\x7b\x82\xa8\x4a\xe4\x78\x94\xa4\xf9\x60\x96\x67\xf4\x0d\x59\x36\x3d\xb4\x81\x78\xdd\xd7\xd2\xeb\xcf\xe3\xa8\x4f\x3e\xad\x8c\xa3\xbe\xf4\x1e\xb4\x61\x3d\xe8\x14\xf9\x4a\x4a\xad\x48\xef\x14\x08\xc1\xf8\x3c\x01\x10\xe4\xc7\xeb\xa7\x02\x8b\x0f\x49\xf2\x65\x36\x45\x79\xd0\x1f\x63\x09\x93\xe3\xb7\x07\xbf\xb2\x43\x9f\x78\xb7\xf7\xf1\xe7\xcf\xb6\xf7\xc7\x9f\xde\x7e\xde\xdf\xfb\xf5\x73\xdd\xf5\xc1\x77\x7d\x68\xb8\x3e\x34\xad\x6d\xbb\xda\x91\x3f\x1a\x6d\xc9\x1f\x8d\xf6\xe4\x8f\xbc\x4d\x31\x34\xbd\x64\x32\x25\x27\xc5\xb1\x39\x44\xb6\x29\xd5\x6a\x85\xc9\xac\x4f\xc4\x7e\x52\xab\x28\x00\x2c\x56\xc6\x02\xc9\xa6\x0a\x11\x84\x13\x44\x11\x7a\x83\x1a\xed\xce\x6b\x14\x2d\x2f\x2b\xe0\x85\x90\x88\xde\x20\xbf\xb1\x6e\x7c\x23\x7f\xe1\x69\x74\x86\x36\x08\x8c\x37\xc8\x7f\xad\x7e\xa7\x77\xa9\x25\xb5\x6a\xb4\xda\x12\xfa\x0d\xd5\xaf\x7c\xbf\xaf\xd7\x2f\x1e\x6f\x9e\x2a\xbd\xfe\x25\x18\x7f\x41\xef\x76\x6a\x8d\xdf\xd6\x97\xd4\xde\x5e\xd1\x10\x89\xea\xbb\x48\x7b\xb9\xd0\x08\x48\x83\x9c\xf5\x93\x2b\xf5\x23\x58\x1a\x90\x36\xaf\x22\xf4\x1b\xaa\x5d\x15\x1d\x62\xbf\x1b\xd2\xef\xa6\xf4\xbb\xb5\xa4\x75\x16\xa0\xd4\xb2\x2b\xf4\xd3\x4f\x3f\xa1\x75\x28\x99\x5d\xa1\x1f\x51\xfd\x6a\x38\xa4\x03\xd4\x69\x6a\x55\xc8\xea\x38\xbd\x22\x03\x99\x5d\x69\x9f\xf8\xe2\x39\xcd\xe0\xfb\xd5\xeb\xa7\xce\x4e\x4d\x66\xe3\x3c\x9a\x8e\xa3\x01\xa8\x09\xcc\xee\x5d\x11\x32\x0e\x4f\xaf\xce\x5e\x5b\xbe\xb5\xe8\xb7\x86\xf5\xe3\x3a\xfd\xd8\x3a\x2b\x69\x3d\x9b\xf5\x11\x08\x38\x1e\x9a\x44\x57\x68\x90\x8c\x67\x93\x38\x53\xa8\x5f\x86\x49\x24\x85\x5a\x08\xbd\x7a\x41\x68\xa6\xee\xf3\x91\x62\x8f\x75\xbf\x5e\xd7\x87\x56\xac\x64\x3a\x58\xb5\x1c\x26\xa6\xb5\x84\xbe\x92\xdf\x74\xbc\x1d\x55\x7c\xb9\x8a\xdf\x91\xaa\xf8\x1d\x57\x9d\x86\x5c\x67\x7d\x09\x15\x75\x1a\xc6\xac\x0b\x6e\x40\xeb\xe4\x25\x23\x15\xc5\x17\xf2\x68\x91\xc7\xca\x23\x76\xb5\x2e\x8d\x0f\x23\xcf\x16\x7b\x55\xe7\x2f\x1a\xca\x90\x96\x8e\xa8\xc2\x1f\x19\x8d\x55\x19\x56\x85\x75\x2a\xf5\xe6\x8c\xad\xc2\x56\x95\x8a\x73\x06\x58\x61\xb9\xac\x62\xd9\x28\xc3\x6d\x01\x28\x82\x71\x6a\x72\xc2\x1f\xae\xac\x4c\x90\x31\x80\x8d\x05\x38\x20\x54\x69\xa0\xdf\x50\x78\x4a\xfe\x77\xb5\x8e\x7e\x43\x57\x8d\xb3\x33\x7d\x21\x41\xd9\x08\xfd\xb6\x01\x05\xaf\x22\xa3\x80\xc2\x24\xe1\xe7\x0d\x1c\x6a\xc5\xbe\x72\x98\xe2\x01\xed\x5c\x88\x8e\x06\x49\xcc\x36\x98\x62\x57\x3a\xea\x1d\x7c\x24\x7b\x44\xfd\xaa\x5e\xf7\x50\xfd\xaa\xee\xc3\x7f\x1b\xf0\xdf\x16\xfc\x77\xdd\x03\x5a\x20\xff\x6d\xc0\x7f\x5b\xf0\xdf\x75\xf8\xaf\xdf\x27\xff\x6d\x76\x8a\xcd\xec\xc5\x0b\x86\xd4\x0b\xb4\xb9\x7d\x4c\x03\xb2\x23\x2a\x0e\x21\x22\x10\xa4\x51\x3e\x9a\xac\xf0\x32\xab\x05\x2a\xa4\xf4\x06\x13\x1f\x56\xe8\x83\x24\x61\xac\xe0\xab\x9c\x86\x0f\x10\x5d\xfe\x1c\x26\x47\x38\xc3\x79\x17\x39\xb6\x48\x36\x08\xc7\x5f\xa2\x29\x33\xfd\x4d\x86\x28\x3e\x4a\xe0\x38\x36\x0a\x32\xd4\xc7\x38\x06\xf7\x00\x76\xc1\x15\xc4\x21\xd8\xf0\x85\x51\x88\xe2\x24\x67\x76\x98\x26\x29\xd0\x6c\x2e\x1c\x12\xb7\x17\xfd\xfc\x05\x5f\x1f\xa6\x51\x92\x1e\x51\x13\xe0\x8d\x8d\xe2\xbd\x95\x74\xb8\x5d\x98\x36\xa7\x66\x07\x54\xf1\x8d\xff\x71\x8b\xc3\x0d\x7b\xf3\xc5\x5b\x0b\x7f\xfe\x82\xaf\x7f\x49\x52\xb0\x62\xfc\x82\xaf\x57\x2e\xc9\x6f\x7b\xb1\xe3\xe8\x0f\xcc\x4a\x65\xd1\xf9\x5b\xc2\x80\xd0\x2a\x6a\x95\x2d\x23\xe1\x08\x90\xc2\x00\x99\x60\xf9\xc8\x71\x1c\x8b\x67\xde\xe0\x32\xea\x54\x6a\x81\xf4\x3f\x1b\x8c\x30\x39\x7e\x20\x22\x42\x5b\xfa\x90\x1d\x25\x97\x04\x76\x8d\x37\xb3\x4c\x76\xe9\x17\xa5\x7d\x90\xe1\xda\x87\x85\x37\x2a\x8d\xb3\xf4\xee\x54\x5f\xaa\x85\x8d\x28\x41\x87\x8a\x1e\xf4\xe7\x1b\x86\x21\x7b\xb6\x48\x21\x88\x91\x9d\x28\x4f\x07\xc9\x5a\x8e\xfc\x49\xa8\x9c\x42\x9d\x33\x3a\xb2\x30\xe3\xec\x8d\x85\xd5\xb8\x19\x16\x92\xf6\x13\x03\x38\x84\xd3\xd1\x87\x52\x46\xfb\x07\x86\xf8\xbf\x04\xe2\x4e\xcc\xd9\x2c\x1c\x25\x39\x22\x24\xe9\x2e\x94\xcb\x7b\x80\xba\x05\x94\x42\x3e\x9e\xf5\xab\x40\x06\xf1\x89\xc3\x3c\x93\xf6\x36\xf8\x50\xec\x54\x4c\x46\x3b\x93\x76\x31\xb9\xc4\xba\x52\x00\x30\x65\x90\xd9\xeb\x39\xd8\xee\x47\x57\xc0\xb6\xcb\xb0\xfd\x6d\x03\x98\xf8\x29\x1b\xe4\xd5\x82\x3a\xbe\xa2\x3a\x43\xdd\x32\xd9\xa8\x98\x70\x20\x2d\xb6\xee\x7e\x42\x1d\xc2\xcf\xb4\x09\x43\x1b\x1b\xa8\x35\x6f\xd2\xbe\xbb\xa1\xb5\xf7\xd9\x31\xe2\xae\x35\x63\xd0\x3a\x1b\x92\x33\xf4\x1b\x91\x25\xcc\x45\x34\x97\x9b\xcb\x32\x5d\x39\x9b\x89\xe2\x8b\xf7\x16\x4e\x63\xbc\x76\x33\x1b\x52\xb4\xe0\x37\xe2\xa9\x60\x39\xfc\x95\x83\xeb\xc8\x0c\x8b\xf1\xd1\x97\xa2\x8e\x8d\x78\xe1\xc8\xc8\x9b\xf9\x57\x09\xd1\x38\xd9\xc9\xfd\x72\xa6\x96\x15\xdc\x3c\xc4\xdf\xa0\x16\x78\xb2\xd0\x87\x32\xda\x57\xe7\xe2\x94\x43\x60\x92\xe6\x82\x1d\x29\x01\xa6\x0a\xdd\xea\x1a\x22\xa4\xa8\x0a\xd7\x8e\xa5\x74\x86\x7e\x73\x2f\x4e\xc7\x9f\x2a\x7c\xdb\x57\xa0\x8e\x40\xf3\x54\x5d\x8a\xf6\x39\x70\x4a\xb2\x9e\x34\x3d\x38\x1e\xa4\xd7\x53\x6a\x1a\x2b\xcb\x79\xfb\x1e\x4a\x86\xc3\x0c\xe7\xc6\xcc\xd0\x35\x12\x26\x3d\x51\xaf\x28\xec\x99\x7b\xb5\x57\x9c\x10\x8b\x9f\x7e\xf1\xb3\x51\xfc\x6c\x7a\xc0\x62\xe4\x53\x86\x82\x6b\x88\x17\xc5\x95\x70\xcd\xcb\x60\x8a\x1a\x71\x08\xb2\x67\x2b\x1f\x39\x84\x18\x42\xdf\xfb\xa7\x14\x0c\x91\x5f\xf4\x21\x55\xbe\xa9\x65\x9b\x25\x65\x9b\xd6\x23\x51\x95\x21\x54\x69\xd5\x53\x09\x54\x7d\xf4\xd5\xc7\x86\xfa\xd8\xf4\x84\xc2\xc2\xd8\xbc\x57\x57\xd1\x1e\x39\xf9\x7e\x17\x63\x64\x9f\x74\x65\x98\xac\xb3\xee\xa1\xbb\x91\x9b\x8d\x68\xd8\x81\xa0\xb2\x64\x6d\x19\xd8\x77\x98\x05\x0b\x85\x1b\x49\x2a\xaa\x13\x4c\x2d\x3a\xae\xba\x34\x58\x67\xf0\xfa\x37\x85\xd9\xd6\x6d\x1a\xa0\xcc\xd7\xa7\x43\xab\x65\xcc\x0f\xd4\x6a\xa8\xb5\x1a\x7a\x2d\xab\xb6\x29\x6b\xea\xd3\xa9\xd5\x6a\xda\xd4\x50\xef\xb5\xb3\x83\xfd\xe8\x2f\x6f\x81\xb6\x13\xc3\x91\xe5\x8c\x23\xf6\x5f\x3a\xaa\x1b\xc8\x7f\xcd\x7e\xbe\xe1\x33\xc4\x5e\x38\xf6\x5d\x98\xe3\x68\x98\x03\xa5\x7b\x0e\x45\x59\xe9\xc4\x71\xd4\x73\x32\x79\x92\xba\xa6\x2e\x24\xaf\xdf\x24\x45\x57\x2d\xf3\x0d\xb9\xeb\x37\x49\xa9\x55\xcb\x1a\xba\xd4\xf5\x9b\xa4\xbf\xca\x9a\xd2\x6b\x63\x1b\x5e\x5e\xb6\x6d\x00\x80\x9c\xaf\x22\xe7\x3b\x90\x6b\xcc\x41\xae\x59\x8a\x5c\xfd\x96\xc8\x35\x54\xe4\x1a\x0e\xe4\x9a\x73\x90\xab\x97\x22\xe7\xdf\x12\xb9\xa6\x8a\x5c\xd3\x81\x5c\x7d\x0e\x72\x7e\x29\x72\x8d\xb9\xc8\x59\x49\xf7\xd3\x14\x8c\x88\xb2\x3c\xc8\xb1\x59\x00\xd8\x49\x5e\xb7\x74\x0c\x58\x46\xae\xeb\xd1\xe0\x0b\x99\x8b\xbc\x61\xfb\x42\x06\x22\xd7\xb5\xe3\x56\x25\x8a\x75\x3d\xcd\xe1\x7d\xb0\x7c\x6a\xf4\xe4\x21\xad\x1d\xfd\xd4\x62\x59\x3e\xfa\xb1\xc5\x5c\x41\xca\xb9\xa5\x58\x42\x4b\xd5\x28\x41\xac\x1f\x8e\x9d\xef\xc6\xce\x5c\x3f\x06\x76\xc6\x12\x52\xb1\xab\xdf\x06\xbb\x86\x84\x5d\xc3\x8d\x9d\xb9\x80\x0c\xec\x8c\x35\xa4\x62\xe7\xdf\x06\xbb\xa6\x84\x5d\xd3\x8d\x9d\xb9\x82\x0c\xec\x8c\x45\xa4\x62\xd7\x98\x8f\x9d\x49\xad\x98\x47\xb6\xb6\xcb\x25\x74\x1b\xb6\xac\x23\x5d\xc8\x31\x96\x93\xba\xb9\x5a\x56\x95\x21\xfa\x34\x5d\xb2\x0f\x3b\x0a\x77\x51\xa3\xdd\x59\x6d\x36\x98\x06\x7a\xc9\xa6\x0a\xe6\x12\x8b\x10\x90\x32\xe6\x39\xcc\x54\xc3\xcf\x33\x96\xf0\x09\x41\x0e\xef\x61\x30\xc0\x42\x47\x2c\x80\xfc\x27\xbe\x0a\x26\x53\x71\x52\x2e\x3e\xf0\x39\xa5\xb0\x72\x7c\x95\x4b\xb7\xdb\x2b\x9b\xdb\xc7\x2b\xec\x1c\x51\x9b\x70\x93\xf4\x2f\xf8\xda\x43\x83\xe1\xb9\x90\xe6\x0b\x28\xd3\x71\x40\x90\xb8\xca\x91\x0e\x85\x49\xf8\xb5\xa2\x1d\x1b\x20\xa6\xd3\xee\x59\x94\xd8\x9f\x69\xd8\xd4\x5d\x3c\x9e\xe2\xb4\xb6\xb9\x4d\xaf\xf5\xa9\xce\xfe\xe9\x13\x66\xb3\x22\x37\xf9\xfa\xe9\x53\x08\x81\x0b\x06\x24\x8a\x55\x41\xb7\xdd\xf0\xb8\x5d\x42\xb7\x0d\xb6\x23\x92\x65\x42\xb7\xdd\xf2\x0a\x93\x84\x6e\x1b\x7c\x18\x27\x61\xfb\x59\xb7\xe3\xdf\x9c\x79\xed\xc6\x9d\xac\x45\xbe\xa5\x99\xc8\x83\x19\x73\x7c\x43\xb3\x0c\xba\x12\x5e\x20\x66\x40\x41\x9a\x47\x83\x64\x32\x4d\x62\x88\xb9\x4e\xbe\xad\x3e\x7d\x22\xe6\x7d\x1c\xf5\x57\x58\xd1\xaf\x5f\x65\x03\x00\xe1\xf5\x79\xcf\xc6\x1d\x41\x86\x0b\xab\x8e\x20\xc3\xd2\xb7\x5f\x92\x34\x04\xbf\x74\x51\x40\xbc\x91\x21\xcc\x86\x60\xf0\x07\xb4\xbe\xc9\x6f\x79\x0a\x98\xd6\xcf\x0a\x66\x18\x5c\xab\x7a\x64\xa1\x4a\xef\x3f\xe5\xc3\x75\x80\x82\xe3\xc1\x0a\x79\xd0\xb0\xee\xb4\xc4\x57\xfa\x58\x66\x88\x22\xbe\x6c\x5f\x4c\xdf\x6f\xed\x14\x97\x4d\xf4\xd9\x7a\x83\xd5\xcf\xa8\x7d\x1e\x59\x56\xfc\x16\x2b\xc7\x93\xe9\x38\xc8\x6d\x0c\x4a\x44\x99\xfe\x33\x66\x11\x79\xb8\x06\x15\xbc\x0a\x04\xaf\x03\xbd\x5f\xf4\x07\x5e\xe1\x11\x26\xbb\xa8\x85\x6a\x7e\x63\x1d\xf5\xa3\x3c\x5b\x2a\x03\x18\x5d\x58\xe0\xed\xfd\x7c\x5b\x70\x9f\xb7\x3f\xf6\x3e\xff\xba\x73\x70\xb4\xff\x79\xff\x60\x6b\x1b\x6d\x42\x6c\x83\x3c\x88\x73\x94\xe2\x69\x8a\x33\x1c\xe7\x51\x7c\xce\x15\x31\x84\x0c\x27\x49\x58\xf4\xdd\x0a\x73\x6b\xbb\x12\x4c\xc6\x4e\x0d\x98\xd2\xa5\xa0\x66\x72\x24\x1e\xed\x14\x65\xb9\x24\x2c\x66\x93\xa2\xdb\x03\xbf\xef\x59\x0a\x06\x0f\x22\xc9\x87\x5c\x44\x29\x2e\xf5\x4e\xd0\x3d\x99\x03\x74\x32\xc2\x64\xd4\xf3\x04\xcd\x98\x9f\x00\x61\x01\x88\x14\x06\xd0\x0a\xc8\xd5\xe2\x61\x30\x3c\xef\x02\xe9\x72\x5c\x97\xe4\x1d\xd5\xc0\x16\xb6\x8b\x8c\xc2\x66\xe4\x17\xc5\xae\xc9\xb0\xa1\x4f\xed\x31\x25\xdc\x09\xe9\x11\xe4\xbf\xe0\xeb\x15\x6b\x59\xee\x1a\x3a\x18\x9e\xa3\xda\x01\xb4\x12\x8c\x97\xa0\xce\xc0\x36\x78\x15\xc7\x40\x6d\x8b\x07\x12\xa5\x13\x7a\x43\x48\x84\xf7\x8e\x10\xca\xa0\xac\x4f\xe4\x5c\x11\x0d\xdc\xdf\x55\x29\xc1\x2c\x80\x14\x69\x41\xde\xe3\xf9\xd5\xf3\x0a\xdd\xa6\xb7\xe9\x30\x27\x69\x8d\x5d\x9e\xc1\x10\x7a\xe8\x4f\x14\x5d\x74\x51\x74\x51\xf0\xc6\x1b\xc5\xf4\x40\x99\x6f\x15\x52\x57\x89\x0b\xc5\x24\x07\x5d\x03\x20\x67\x0e\xa1\xf5\xd9\x8d\xb3\xba\x56\x2d\xb2\x87\x2e\xa1\x55\xa4\x27\xc7\x42\x7c\xa4\xa7\xfb\xa5\xa7\x2d\x7c\x5f\xf4\x24\x20\xdd\x8d\x9e\x54\x3e\x7d\x0b\x7a\xda\x8b\xa3\x3c\x0a\xc6\xd1\x1f\x38\x43\x01\x8a\xf1\xe5\xf8\x9a\x61\x18\xb2\xe1\x98\x4f\x4b\x7c\xd7\xb8\x1a\x26\xe9\x64\x3f\x09\x31\xda\xa6\xce\x6a\x10\xa7\xb9\xe0\x74\x49\x2a\xd3\x29\x58\x57\x83\x9f\x1f\xa7\x5a\xb1\xc9\xd8\xc9\xf0\xbb\x23\xd9\x7b\x23\xab\x9a\xf9\xc1\xc6\x29\x6e\x49\x70\x51\x1c\x29\x16\x36\x62\x9a\x24\x72\xb1\xa8\xa8\x37\xa7\x53\x42\x0b\x30\x5a\x3c\xdd\x74\x66\xb9\x66\x20\x43\xbc\x21\x7e\xf2\x4d\x91\xd2\xa0\x79\x2a\xce\x89\xe4\x4c\x0d\xeb\x93\x74\x42\xa7\x3d\xb0\xe9\x6e\x28\x7d\x17\x24\xb5\x51\x90\xd7\x6b\x5b\x49\x6a\x47\x03\xb6\x32\xd6\xb3\x78\x44\x09\x9d\x7a\x00\xd8\xfa\x01\xf6\x45\xb5\xca\x0b\x07\x6c\x74\x54\x3e\x0c\xc1\x1c\x32\xd1\x12\x68\xcf\xee\x48\x3e\x6c\x09\x9a\xb8\x29\x33\x9c\x56\x31\xa2\xa2\x46\x45\x61\x90\x07\xa8\x0f\xb2\x97\x5a\xc2\x21\x8f\x01\x68\x9a\xea\x82\xbb\x3b\xeb\x80\x0f\x71\x0a\x73\x39\x48\xe2\x41\x8a\x73\xfc\x92\x0d\xc7\x38\x39\x57\x98\xb2\x74\x2f\x75\xb4\xd8\x58\x43\x40\x0d\xc0\x9c\xfa\xb7\x30\x9e\x82\x43\x89\xa5\xe0\x70\x81\x4d\xef\x6b\xc6\x5c\x61\x08\x50\xa6\xec\x24\xbc\x81\xb7\xc1\x1a\x90\xc0\x57\xd8\xb9\x24\xfe\x24\x60\xd1\xa8\x59\x2c\x1a\x41\x14\x9f\xdf\x03\x37\x29\x3a\xbf\xc1\xc9\x83\xc1\xaf\x3d\x27\x6d\x3e\x57\xc9\xa4\x4a\xbd\x4b\x8e\xb9\x93\xc2\x58\xc9\xae\x16\xe6\x95\x0e\x9d\x83\x7b\xe0\x38\xb4\xcd\x7e\x00\x5f\xe4\xea\x36\x9a\xa2\xed\xa1\xe0\x22\x88\xc6\x41\x7f\x8c\xa9\x19\x62\xe6\xde\x16\x3f\xf3\xce\x54\xa6\xaa\x9d\x28\x66\x1b\x5f\xe9\x3e\xc5\xe0\xaa\xfb\xcc\xc7\x24\x67\xee\xd1\x34\x6a\x1a\x85\x54\xec\x1a\x28\xca\x10\x1e\x0e\xf1\x20\x8f\x2e\xf0\xf8\x1a\x05\x28\xc4\x59\x9e\xce\xe0\xd9\x43\x29\x0e\xc2\x97\x49\x3c\xc0\x95\xf6\x99\xaa\xd4\x0b\x68\x3c\x14\x0d\x53\xe0\x0f\x4d\xc9\x7c\x24\x6b\xd5\x89\x58\x54\x59\x94\xfa\x45\xc5\xf9\xe4\xcf\x8b\x56\xa7\xff\x9d\x62\x2e\x66\x50\x48\x2d\x11\x0d\x4b\x01\xa0\xd2\xd5\xa2\x14\xb5\x5c\x94\x2c\xc0\x90\x21\x20\x12\x41\x95\x2d\x38\x1c\xb2\x80\x99\x9c\x53\xef\x48\x13\x62\x5d\x7c\x66\xed\xb9\xca\x66\xbf\xb1\xbe\xda\x6c\xc8\x9f\xa8\x4a\xc4\xf6\x45\x93\x83\xba\xc8\x57\xbe\xaa\xf2\x6f\x17\x35\xaa\x9c\x9d\x32\xab\x2a\x3b\x98\xaf\xc8\x46\xce\xb5\xc9\x4f\x2d\x6c\xa4\x4f\x46\x58\x12\x0a\x58\xa6\xad\x00\x8d\x40\x6b\x4c\x84\xcc\x0a\x4b\x91\x8b\xb0\x9b\x31\xc7\x07\x22\x0c\xf0\x65\x4d\x84\x26\xb6\xae\x2d\x1d\xfa\x06\x87\x25\x66\xed\x6d\xaa\x3c\x35\x1d\xb9\x21\xdb\x3a\x57\x99\x52\xaf\xeb\xf4\x9b\x22\x7f\xe2\x53\x86\xc7\x78\x90\xd3\x86\x8f\xf3\x34\xc8\xf1\xf9\x75\xcd\x65\xae\x2d\x69\x9f\x41\x5c\xdc\x40\xcf\x29\x2b\x7d\xee\x34\x0f\x63\xb3\x71\x18\x64\x19\x61\x13\x6f\x83\x0c\x87\x8a\xc7\x9c\xfc\x57\x6e\x1c\xc6\x40\x1d\xe3\x14\x0e\x5c\x64\x57\x73\x43\x2a\x5f\xe4\x7a\x72\x3f\x76\x9f\x51\x62\xa3\xee\x42\x8a\x91\x93\xcc\xd8\xcc\x1b\x96\x32\xbb\xd1\x22\x0a\x98\x7d\x1e\xc4\xc5\x0d\x45\xd1\x43\xee\x0b\x1c\x7d\x0c\x3c\x87\xa5\x27\x23\xfb\xae\xd1\x7f\xed\x3e\xe7\x4e\x68\xab\x37\x45\x1e\x2a\xbd\x31\xd2\x31\xb7\x4c\xa8\xce\xb6\x65\x2e\x59\x5b\x62\x1a\x5e\xfb\xd5\x9b\xaa\xc3\xce\xf2\x14\x07\x93\x5b\xa9\xb2\x41\x86\x62\xca\x67\xd9\x06\xbf\xd9\x78\xd9\x8f\xa8\xc1\xb6\x7a\xa2\xa1\xd2\x09\xc4\xb1\x96\x34\xd3\x3e\xaa\x35\x1b\xaa\x62\x5a\x52\xf8\x1e\x03\x7e\x9a\xda\x57\x7f\x59\xe2\x11\xb2\x63\xd9\x6b\x6d\x3b\x2c\x17\x11\xa7\x41\x0a\xc7\x2d\x9b\x80\x68\x6e\x6f\x70\xbc\x29\xac\xab\xb8\xd0\xf8\xc3\x0f\xcf\x87\xe3\x59\x36\x7a\x5e\x6d\x9b\xa3\x50\x5c\x1b\x9d\x18\xe6\x2e\xf2\xcb\xe6\x15\xce\xb5\x90\xd6\x74\x2a\xdf\x96\xca\xca\xf3\xcf\x13\x7a\xf6\xed\xad\xb0\x1f\x7f\xde\xcc\xa7\x10\xc5\x63\x07\xea\x19\x54\x22\xb5\x21\xdd\x6e\xb2\x83\xb6\xe1\x1c\xcc\xde\xcb\x4a\xef\x32\x05\xbd\xac\xa2\x9c\xf0\xec\x5c\x85\x7c\xbd\xf0\x6e\xba\xa9\xf6\xc8\xaa\x10\xd4\x53\xcb\x14\x0a\x7e\xa0\xea\x6f\xb0\x1f\xf2\x99\xe2\xdb\x1d\xe8\x61\x7b\x6f\x7b\x86\x2a\x9a\x73\x94\xe8\x82\x7a\xed\xdc\x46\xf3\x5c\xc0\x28\xd5\x15\x8a\xba\x5c\xd1\x24\xd5\xbb\x95\xc6\x59\x4c\x67\x71\x40\xfa\x9f\x39\x9d\x85\x26\x78\xc1\xe9\xb4\x2a\x7e\x2b\x4e\xa7\xa8\x7b\x87\xe9\x2c\x53\xf8\x56\xbb\x3a\xf8\xa6\xd3\x79\xe7\xe9\x2a\x59\x02\x73\xe6\x4b\xd7\x9b\x96\x4c\x12\xdd\x4c\x84\x9e\x77\x60\x13\xeb\x98\xd5\xf5\x05\xda\x40\xd1\x85\x3c\x5b\x65\x5b\x04\xdb\x31\x69\x60\xe9\xde\x28\x88\x62\xc8\x79\xe2\xba\x6b\x7d\x0b\x76\x03\x9f\x79\xe7\xd1\x86\x3b\xf8\x80\xae\x62\x53\x76\x10\x52\xd7\x20\x06\x69\x68\x8a\xc6\xb4\x5d\x42\xdc\x89\xbe\x2e\xe3\x28\x6f\x7b\x7c\x3b\xd0\x4e\x42\x52\x13\xca\xdc\x91\x5e\xbd\xed\x59\xf6\x1e\x13\x3c\x6d\xe2\x50\xc4\xff\xcc\xb9\x1a\x83\x52\x69\x90\x33\xa3\xee\x15\xbd\x8e\x01\x43\xa3\x59\x2a\x1d\x09\xad\x08\x13\x96\x12\x2e\x23\x21\x95\x13\x22\xeb\x0d\x09\xb3\xcb\x22\x40\xd8\xcf\xcb\x11\x66\xa1\xf7\x29\x7e\x10\xc9\x33\xab\x80\x9c\xb9\x30\xec\x05\xc9\x1f\x4c\x25\x13\x75\xa8\x37\x00\xe4\xc7\x83\x2e\x08\xd7\x06\x5d\x96\x95\x27\x03\x15\x2a\x40\xc3\x4c\x5e\x85\xe2\xb4\x85\xb6\x3a\xc0\x22\xfd\x86\x44\x5e\x48\x0e\xc3\xd9\x42\x88\x15\x9a\x1c\xf1\xca\x61\xce\xfa\xeb\xc1\x11\x9c\x97\x19\xd1\x99\x65\xae\x92\x14\xfa\x55\x28\xba\x3d\xa4\xf4\xcb\x2b\x9a\xb5\x09\xfd\x0c\x0f\xd9\xd7\xa5\xa6\x8f\xae\x15\xb3\x23\x3c\xc1\x20\x85\xc3\xee\x4a\x49\x80\x5d\x45\xc1\x69\x1f\x1c\xda\xe1\xb5\x59\x9d\x4b\xb0\xf8\x82\xc7\x9d\xa7\xcc\x94\x26\x94\xe7\x78\x0b\x53\x40\x67\x07\x64\xcf\x9d\xb9\xeb\x36\xc4\x15\xd6\xad\xd8\xa7\x1e\xd7\xed\xe3\xba\x45\xb7\x5f\xb7\x77\x59\x1d\x60\x21\x3c\x8a\xb2\x85\xd7\x86\x15\x13\x46\xd1\xc0\x45\x7e\x3d\x38\x72\x72\x00\xd9\x83\xcc\xe0\x00\x77\x65\x3b\x56\xcc\x4e\x8a\xa1\xe9\xe3\x41\x32\x61\x4b\x87\xb0\x85\x28\x99\x65\xd5\x99\x87\x18\xac\xaa\xec\x41\x90\x12\xef\x46\xcd\x89\xfb\x42\x1e\x50\x20\x22\x71\x69\xc9\xe6\xe1\x3f\x4a\x92\x0c\xa3\x49\x74\x45\x64\x21\x4b\xff\xc0\x13\xd4\x14\xd2\x90\x4c\x88\x4c\x0a\x73\x91\x5d\x72\x01\xd2\x29\x39\xe9\x64\xb3\x7e\x86\xff\x7b\x86\xe3\xdc\xaa\x62\x40\xaa\x68\x27\xa5\xf5\x50\x47\xd1\xa9\x1a\x94\x51\xd2\x66\x65\xbe\xaa\x9f\xec\x6c\x36\xac\x6c\x31\x92\x8a\xd5\x66\x8d\x94\x44\xfe\x60\x02\x0b\xeb\xf1\xe8\x0c\xfd\xb6\x41\xeb\x9d\x46\xa5\xa1\x4b\x8a\xdf\xdc\x04\xfa\x6d\x8f\x95\x57\x02\x9a\x48\xa2\xed\x61\x10\x86\x64\x02\xe7\x28\x40\xa6\x90\xe6\xaa\xb7\x42\xff\xb5\xab\x3f\x0e\xdf\xf7\x8e\xd1\xff\x6a\xaf\xae\xa1\x29\x03\x9a\x31\x5d\x9e\x0d\xe6\xe1\x97\x41\xb6\x06\x72\xf2\x34\x08\x57\xf8\x53\x89\x6c\x7c\x18\xf0\xeb\xe7\x59\xc6\x63\xe7\x8b\x40\x28\xcc\x5c\x19\x02\x27\x0b\x3c\x16\xb2\xbf\x02\xc8\xf2\xed\x33\x41\xcb\x5a\xc9\xae\xc7\x63\x21\xa0\xa4\xfb\x48\x00\x94\x89\x68\x96\x64\x50\x20\x9e\xe5\x03\x1f\x9b\xc5\xe1\x4b\x8c\x2b\xf9\x55\x5c\xaf\x79\x5a\xdc\x2c\xe5\x82\x39\x08\xf5\xcb\xb5\x5b\x33\x10\x51\x8d\xc6\x3a\xd9\x90\xc6\xcb\x15\x33\x64\x16\xe7\x82\x76\xc0\xaf\xc8\x84\x1a\x33\x82\x35\x80\xd2\x17\x2f\x69\xce\x69\x11\x61\xe5\x5f\x5a\x01\x5b\xb3\xf4\x5e\x88\xb7\x6b\x86\x5e\xa0\xa9\xde\xe0\x2b\xa1\x17\x88\x80\xa2\x60\x51\xf8\xba\x18\xef\x99\x83\x8b\xf1\x1e\xdc\x5a\x94\xb7\x73\x31\x2b\x45\x2a\x2b\x0f\x5f\x50\xb0\x1f\xb5\x4d\x14\xa1\x65\x97\x5b\xbe\x0c\x9d\xc6\xb9\x97\xde\x94\x48\xaf\x1a\x76\x68\xa3\xb0\x7d\xe7\x87\x7f\x19\xb4\xa7\xa2\x64\x33\x43\xd8\x0c\x43\xfb\x20\xc0\x5c\x0f\x92\x78\x10\xe4\x1c\x66\x65\x0d\xcc\xa7\x78\x2a\x18\x0a\x2c\xd9\x51\x10\xd2\x40\x46\x6c\xa1\x7e\x1b\x2e\x33\x8b\x75\x3e\xf3\x4d\x38\x02\x34\x5b\xe1\xca\x1d\xca\xe9\x2c\xc1\xc6\x07\xde\xe1\x5c\xc9\x5c\x2c\x2d\x62\x88\x01\x8b\xc6\x41\x96\xc3\xf3\xfc\x35\x5d\x88\xd7\xa7\x35\x75\x39\xbf\x44\xfe\x12\x75\x31\x3b\x63\xce\x60\x36\x4f\x62\x2a\x38\xb8\x29\xa6\x00\xb7\xa1\xaf\x41\x69\x33\xa5\xdb\xe6\x82\x7a\xfe\xbf\xe2\x22\xc8\xe6\xa2\x60\xbf\x59\xb0\xdd\x2a\x94\xdd\x03\xdd\x9f\xd1\xff\x7e\x12\xe2\x1b\xaa\x1e\x3c\x11\xa7\x35\x7a\x29\x02\x27\x09\xa9\x3b\xbd\xb7\x3d\x17\x14\x36\x57\x37\x82\xbe\x08\x2c\x5d\xd8\x30\x21\x02\xc9\x3b\x08\x1c\xfc\x08\xd8\x00\x48\x86\x93\x1a\x81\x13\x4c\x01\x33\x4f\x3b\xd5\xd1\xb6\x8d\x26\x6e\x14\x6f\x84\x05\x0c\x03\xe9\x44\xab\x1f\x7b\x92\xf5\x61\xb9\x0d\x60\x49\x80\x33\xd5\x3e\xd4\xe2\xc7\x09\x72\x33\x19\x01\x45\x2d\x8a\x54\xc5\x2e\xf9\x3e\x01\xdb\x4f\x07\xfe\xc5\xc4\x9a\x87\x01\xc3\x96\x94\x4b\xda\xaa\x71\x89\xf3\xc4\x40\xa0\xc2\x96\x08\x1a\x0d\x38\x95\x6b\x77\x33\x76\x69\x7f\xf5\x45\x79\xf3\xaa\xf5\xca\x12\x7a\xb1\xba\x30\x06\x42\xd5\xe2\x38\xcb\xbc\xc7\x78\x8a\x82\x1c\x8d\x31\xe1\x82\x49\xcc\x57\x00\x4b\xf3\x41\x2d\x41\x61\xbf\x06\x86\x6b\xf2\x2d\x24\xce\x37\x93\x28\xa6\x46\xa2\xec\x10\x6f\x84\x4b\x54\x1f\x59\x25\x3a\x7d\x12\xfe\x94\x90\x26\x60\x7f\x4c\x8f\xbc\xd1\x05\xfa\xf1\x47\xab\x3e\x5e\x0f\xd4\x71\x78\x2b\x5d\x46\x81\x89\xaa\x4c\x71\x9e\xcf\xf5\x66\xab\x5e\x49\xbb\x45\xd2\x42\x24\x11\x86\xd2\xec\x95\x85\xa0\x79\x73\xf7\x4b\xc8\xab\xab\xe4\x20\x43\xf3\x7d\xb9\x44\x2e\x90\xd7\x99\xe9\x17\x48\xe0\xf0\x7b\xae\x0e\x82\x5f\xc5\x53\x1b\x41\xd7\x29\xf9\x56\x97\xf1\x0f\xb7\xac\x1e\x16\x6f\x6b\x7b\x20\xf9\xcd\x99\x01\x2a\x1f\xd9\xda\x9b\x67\xf9\x77\x47\x4b\x05\x30\xbd\x63\xb2\x87\xdd\x0c\x05\x0d\x92\xf1\x18\x53\xfa\x4f\x86\x5c\x34\x00\x51\x13\x43\x32\xbd\x32\xd1\x43\x12\x45\x25\x27\x6f\xb2\x8d\xa6\xc1\xa5\xf4\xca\xea\x97\x68\x77\xfd\xa0\x0e\xe8\x42\x48\xa9\x52\xbb\xb8\x78\x84\x14\x0f\x8c\x0b\xd2\xfa\x64\x7d\x1a\xe6\xb8\x2e\x40\x59\x30\xa6\xd8\xc3\x0f\x00\x06\x2a\xc9\x80\x86\x1f\xc5\x69\x74\x41\x65\x15\xce\x31\xac\x00\xf9\x55\x6a\x21\xe7\x4b\x96\x83\x66\xac\xd5\x6a\x72\xcd\x6d\x7a\x56\x2e\xdf\x0c\x46\x78\x72\x3b\xb8\x76\x81\x93\xa9\xcc\xc1\x62\x7a\x28\xc1\xb3\x82\xa0\x49\x19\x6f\x8a\xa4\x8d\xf4\x14\x43\x45\x2c\xfe\x56\x17\xc3\x06\x49\x7c\x81\xd3\x5c\x91\x61\x69\xba\x3b\x6e\x4c\x09\x16\x9f\xd4\xfa\xcf\xed\xb6\x7a\x48\xab\xa8\xce\xab\xe2\x65\x45\x7b\x98\xf9\x2e\x56\x2a\x6a\xf3\x8f\x75\xc2\xbb\x49\xc6\x47\xb3\x13\x0d\x62\x91\xc5\x6a\x9a\x64\x59\xd4\x1f\x63\xf7\x8a\xb5\x34\xb5\x98\x73\x53\x31\x50\xa6\x3d\x28\xfd\xc6\x4f\xe0\x7f\x1a\x50\x90\x50\x9f\x93\x15\xdc\x95\x7e\x17\x0e\x4f\xd6\x4a\x5f\xf0\x75\x57\xf5\x8b\xb2\x16\xd3\x3c\xa5\xec\x85\xc8\x32\xee\xc2\x7f\xe7\x14\x14\xab\xb2\x6b\xba\x73\xd9\x6b\x30\x11\x5e\xb7\x4c\xb0\x17\x16\x72\xbd\x7a\x74\x7e\xdf\x3b\x5e\xb3\x57\x90\x58\x78\xcb\x5e\x42\x2c\x1c\x09\x28\x7d\xb7\x72\x30\xc5\xf1\xf1\xf1\x07\xa3\x5a\x75\x67\x32\x79\xfa\xed\x82\xd7\x24\xba\xda\x8b\xd5\x72\x95\x4d\x8f\xe8\x2a\xce\x16\x5b\xc6\xc8\xb9\x6e\x4c\x56\xa2\xf9\x06\x3a\xb8\x09\x39\xd4\xb9\x81\x73\x03\x5b\xee\x95\x01\xbb\x02\xfc\x8e\x86\x91\xbe\xc6\x4b\xe0\x40\x16\xb0\x8c\xa6\x00\x83\xf4\x71\xb8\xf0\xa2\x2c\x30\x8e\x13\xfa\x46\x63\x80\x2c\x69\x3f\x2e\xe3\x1e\x55\x97\x34\x45\x5e\x5c\xd3\xb1\xb5\xbd\x8c\x9e\x3f\xb7\xfb\x56\x58\xcb\xaf\xe4\x09\xcd\x37\xe4\x72\xe5\x98\x53\xcb\x41\xaa\x4e\xc2\xe4\x15\x65\xe2\x14\x63\xe3\xb2\xaa\x2a\x4a\xa0\xaf\x5f\x29\xb9\x16\x75\x56\xf8\x24\x5e\xf3\x63\xaf\xa1\xa3\xb1\xca\x49\x94\xca\xe6\xdd\x6b\xd0\x76\xe0\x6a\x43\xfc\xb4\xdf\x6e\xb0\x9e\xdb\x88\xd3\x06\x9a\x15\x17\xb9\x8c\x61\xf7\x52\x07\xb1\xfc\xba\x43\xac\xba\xc0\xbd\xe4\x62\xde\xcc\xcb\x41\x32\x99\x06\x39\x6c\x2f\x55\x97\xa1\xbc\x2d\x68\x9b\x98\x24\xfe\x54\xdd\x13\x6d\xcb\xef\x36\xc8\xdd\x97\xe1\x60\x42\xdb\x3e\xe6\xe4\xed\x20\x64\x89\xba\x5c\xbc\x51\xa1\x6f\x51\xbc\x32\xf7\x9d\xa3\x96\x91\x23\x2d\x29\x4b\xb0\xf8\x62\x0b\xd4\x48\xc4\x5d\xad\x02\x79\x67\x3b\xc6\x42\x7f\xcd\x43\x2c\x29\xee\x54\xb5\x5c\x4a\xd1\x6a\x0c\xed\xfd\x69\xfd\xaa\xdd\xec\xf8\x9d\xc1\x1a\x24\x36\xe8\xb4\x3b\xad\xf6\xb0\x3d\x3c\x5b\xe2\xaa\x78\x00\xcd\x1f\x8a\x7e\x38\xce\x91\x15\x50\x70\x8e\x85\xe3\xf0\x25\xea\x16\x8c\x8c\x86\xb5\x59\x7c\xcf\x2b\x5b\x63\xb2\xbf\xd2\xa2\xc2\x23\x5f\x27\x05\x9d\xde\x7a\xc9\xa8\x31\x1b\xf8\x82\xbe\xc5\x1a\xbe\xdf\x00\x0e\xa6\x30\xaa\x2d\xbd\x69\x90\x66\xb8\xa6\x2c\xd4\x92\x8b\xc9\x34\x53\x14\x3f\x45\x35\xab\x57\x02\x29\x8e\x68\x0c\xaf\x39\x8b\x8e\x12\x86\x81\x4c\x99\x7a\xb5\x0c\x22\xbf\x8c\x93\x0e\xc3\x2c\x29\x84\x01\xee\x04\x67\x39\xb5\x6d\x08\xc6\x96\x05\xaa\xc1\x3c\xad\x9f\xa1\x8d\x0d\x54\xac\x3d\xf4\xe3\x8f\x7a\xbb\xa7\x3e\x2b\xc3\xd7\xa4\x4b\x05\xb5\x7d\x45\x2f\x30\xcc\x96\x91\xca\x61\x8c\xc5\xaf\xb5\xc8\x4c\x79\x1a\x1e\x6a\x2d\x95\x58\xd7\x25\x17\xec\x88\x0e\x57\x41\x05\x0c\xb3\xbc\x01\x7f\x0a\x0d\xd4\xf5\x5b\x6b\xa3\xb8\x72\xab\xe3\x77\xaa\x31\x0a\xeb\xd1\xc8\x71\x0c\xf2\xa4\xd3\x89\x2a\x9a\x97\xde\x15\xf1\x45\x78\x99\x06\xd3\x29\xc8\x91\x41\xce\x9a\x97\x55\x26\x28\x20\x3b\x7d\x26\x79\xa5\x95\xae\x5e\xc5\xd5\xc7\x70\x65\x2b\x1c\x7e\x6c\x9f\xaa\x3a\x90\xdc\xfa\xb2\x47\x08\x3d\x5c\xc6\x2f\x93\xea\xb9\x8e\x40\xee\x2d\xeb\x2c\x75\x08\x8d\x43\x4a\x35\xe2\x80\x51\x5c\xec\x58\x0e\x4e\x65\x21\xa2\x74\xef\x45\x40\xa8\x6b\x88\x6a\xd2\xc4\x96\x06\x95\x62\xd7\x0e\x64\xde\x98\x37\xdd\x5d\x3c\x54\x0b\xe5\x93\xe5\xa8\x53\xe2\x7d\xce\x9a\xa6\x36\x28\xec\x77\xe1\x77\xfe\x37\x89\xe1\x62\xdf\xc2\x36\xff\xda\x0d\x8c\x2c\x4b\xbb\x46\xc5\x5c\x56\xc2\xbf\xd2\xd4\x46\x28\xae\x96\x8e\x53\xd8\xc3\x35\x58\x04\xa9\xd1\xd5\x09\xdf\xb4\x71\x4f\xac\x36\x87\x34\x50\xa2\xec\xb0\x38\xc7\xba\xbd\x58\x6f\x17\x42\x67\xa1\xe8\x39\xdb\x36\xfb\x75\x29\xba\x41\x52\x38\x9f\xd8\x02\xa0\x59\x7d\x56\x0d\xb1\xa4\xf0\xcc\x10\x01\x12\x58\x67\x6f\x23\x99\xf4\xa0\x7f\x05\x4c\xb8\x02\x36\xa0\x30\x7b\x23\xc2\x71\x85\x63\xae\x6b\x3f\xaa\xbe\x9d\x96\x6d\xda\xca\xfe\x6a\x16\xe4\xaa\x45\xcb\x27\x42\x56\xa2\x6f\x2b\xd1\x85\xa5\x88\xa4\x23\x64\xf4\x62\x96\xa1\x5a\xc1\x02\x10\x5c\x88\x9a\xc5\x84\x3e\xb0\x28\xc9\x5e\x59\x0a\x4b\xba\x40\xdd\xc2\xda\x52\x5a\xd2\x0b\x12\xd2\x1b\x5a\x8e\x6b\x37\x95\x8f\x2d\xec\x1e\x3a\x13\x13\x27\x14\x5f\xf2\xb5\x0c\x7a\xb0\xed\x49\x26\x00\xb1\x43\x69\x17\x4d\xd2\x23\xe4\xf6\xfe\x3b\xee\x53\x5a\x80\x16\x11\xe9\xf8\x1b\xec\x4d\x45\x54\xe5\xf9\x6c\x9a\x7b\xcf\x5b\xd8\x34\x27\x3b\x16\x46\x41\xf2\xa8\xbf\x35\xcb\xbe\x6f\x14\xf5\x7d\xe9\x1e\xb7\x14\x67\xec\x02\x47\x84\x81\x6f\xb0\xab\x30\x8d\x83\xa4\x5a\x90\x17\x93\x06\x58\xde\x29\xd8\xed\x37\x9c\x5f\x65\xe4\x0b\x6e\x62\x6b\x8e\x71\x0a\x73\xc3\x90\x27\x4f\xd9\xc4\x94\xa8\x8b\x74\x58\x8a\xbd\x49\x62\x32\x8a\xc2\xc7\xba\x4d\x88\x26\x16\xd6\xc6\x58\xd9\x9a\x3e\x56\xea\xfd\x0b\xe8\x98\x82\x2c\x9b\x4d\x70\xa8\xde\x27\x06\xe3\x14\x07\xe1\xb5\xb4\xdf\x29\x07\xb2\x59\x4c\xd3\x56\x56\x88\x68\xb6\x18\xdb\xb3\xf3\xaf\x85\x0e\x4d\x84\x71\x81\x89\x7a\x9a\xe1\x85\x79\xbd\x5b\x5f\x34\x8b\x17\x85\xf5\x17\x4a\xdc\x06\xc9\x53\x15\xd2\x01\xa7\x02\x24\x88\xdf\xce\x03\x3e\x1b\x3a\x25\x79\xf5\xb0\xca\xb6\x54\xde\x2c\x76\x8d\xbc\x08\xe7\x84\xb0\xe1\x36\x21\x94\x3d\x99\x4b\x55\xbf\xd8\x40\xa5\xda\x51\x06\xad\x44\x29\x6a\x68\x26\xac\x37\x24\xef\xed\x26\x12\xf3\xae\x4c\xbe\x84\x43\xb8\x2f\xa1\xff\x96\x5f\x96\xcc\xb3\xc2\x30\x2f\x4c\xde\x53\xe8\xa4\x95\x6a\xf7\x24\x5b\x04\x3c\xdc\xe9\x93\xc6\xc8\x5a\xde\xfb\x99\x2b\x0c\xa6\x2c\x5e\x50\x75\x75\x2c\xaf\xc1\x2c\x2f\xd8\x03\xc8\x29\xa4\x19\x00\x5c\xee\x15\x52\x04\x2a\xc7\xd4\xb6\x22\x8a\x99\x25\x2f\xb3\x03\x60\x26\x33\xe7\x38\x06\x63\xde\x72\x68\x22\x4a\xb9\x03\x18\x0d\x9d\x5d\x0e\xcb\xd4\x19\x80\x0a\x4b\x12\x92\x36\x51\xa7\x05\x26\xc7\xf0\x81\xdb\xcf\xee\x0d\x51\x32\x89\x88\x8c\xe0\xa1\x80\x7e\xba\x8c\xc6\x63\xd4\xc7\xa2\xc1\x10\xa5\x41\x1c\x26\x93\xf1\xf5\x3d\x1d\xee\xa9\xd5\x04\x1b\x26\x0f\xed\xfd\xec\xc1\x94\x92\xc6\xbf\x01\x17\xa2\x93\x1c\x9a\x2c\x48\xa2\xc6\x15\x7c\x85\x07\xb3\x1c\xd7\x9e\xf3\x68\x54\xcf\x3d\x96\xb8\xc3\x63\xe6\x5b\x0e\xb1\xe8\x9e\xa0\x7b\xe8\x39\x19\x0e\xf2\xff\xcf\xdd\x67\x66\x0a\x46\xe6\x6e\x9c\x9a\x3d\x4e\xa2\x1e\xa3\x2e\xaa\xd8\xb4\x1b\xf5\xd3\x69\x66\xb3\xec\x50\x54\xff\xe0\xbc\x4a\x32\x94\xc8\x14\x4e\xad\xd3\x5a\x35\xd2\x9a\x5b\xdc\xea\xe8\xd2\x96\xd6\xb5\x29\xad\xd0\x78\xb3\x34\xf1\x40\xa1\xc0\x15\x31\xee\x8a\x34\xc8\x6c\x21\xdd\x2c\xad\xb0\x44\xde\xd2\x78\x00\xfe\xd6\x80\xb5\x84\x36\xf3\x72\x0c\xc0\x6e\xda\x50\x93\x8b\x64\xd0\x4c\x41\xce\x93\xc9\xf2\x31\x47\x2f\x4c\x7d\xb6\x92\x1a\xba\x48\xe1\x6c\x77\x96\x3a\x62\xa2\xd4\x82\x87\xf1\xe2\x48\x2d\xa4\xe8\xdb\x69\xb5\x6d\x9a\x01\x45\xc5\x1d\x32\xbe\xcc\x59\x9e\xc6\x92\x3d\x01\xcb\x21\x7e\xdd\x5e\x1f\x6e\x89\x12\x27\x14\xe2\xf6\x6f\x36\x0d\xd7\x03\xea\xc7\xdf\x6f\xed\xdc\x20\xb2\x7d\x72\x0b\x4a\xdb\x2e\x5c\x48\x79\x9c\xd9\x96\x6f\x71\x0b\x69\xc5\x2d\x1d\x76\x3b\x3f\x7c\x09\x87\x5d\x69\x7b\x96\x28\x64\x41\xf5\x38\x73\xa9\x5a\x64\x5f\xfe\x3e\xf4\xe5\xa5\xd2\xc1\x77\xa0\x8e\xf8\x9b\xa8\xcd\x2d\x8b\xaf\x92\x26\xf9\x39\x1f\x6a\x57\x58\xd9\x87\x6f\xd8\x43\x7f\x3e\xb0\x06\xbb\xd8\x8e\xbe\x91\xc2\x41\xdb\x5d\x93\xdc\xa5\xdc\xb5\xc9\x2e\x04\x3c\x11\x5b\xb8\xb8\x22\x61\x4f\x87\x57\xc8\x18\xec\x99\x6e\x7b\x2e\xef\x4e\x2a\xc6\xd2\xbe\x19\x5d\x5a\x81\x2d\x56\xc1\x60\xc5\x1a\x92\xc0\xa9\x98\x57\xf4\x25\xee\xeb\x0c\x39\x00\x84\x31\x3f\x6a\xfb\x92\x1e\xdf\x40\x63\x3f\xba\xa2\xc9\x40\xa0\x82\x75\x48\xa5\xb3\x35\x35\xcc\x54\xa0\xbb\xf4\x26\xd6\x13\xdf\x1d\xf4\xc1\x7f\x01\x3f\xbe\x67\x05\xf1\xf7\xce\x98\xbf\x47\x3d\xb1\x8d\x19\x2e\xaa\x28\xbe\x13\x63\xbc\x77\x14\x4d\x45\xf1\x7d\x31\xee\x8a\x7a\xe2\x6f\xce\xbb\xbf\xb9\xb2\xf8\xdb\x6f\x15\x9e\x62\xdb\xe3\x38\xa1\xdd\xdf\xde\x51\x49\x1f\xee\xbe\xbf\xb0\x6d\x1d\xf2\xf8\x56\xdc\x3d\xca\x14\xe4\x85\x2a\x4f\x64\xba\x94\x53\x5a\xb2\xfc\x95\x37\x67\x5e\xbb\xf9\xbd\x26\xa5\xbc\xf7\x1c\x94\x8b\xe6\x9e\x54\x72\x4e\x1a\x88\x99\xe9\x27\xb5\xb4\x93\xbc\xa2\x23\xf1\x24\xe8\x47\x0b\xe0\xe2\xa7\x9a\x7c\x72\x3f\xc8\x47\x1e\xb2\xa4\xa0\x2c\x8e\xd7\x1f\x92\x41\x30\x46\xd3\x64\x7c\x3d\x8c\xc6\x28\x19\x22\xba\x69\xb1\x53\xbc\xe5\xc8\xcb\x62\xdb\x6f\xa8\x05\xb5\x86\x15\xc6\x24\x5e\xef\x90\xf7\x37\xaf\xcd\xd8\x41\x92\xad\x65\xff\x77\x83\xa9\x81\x8d\xe0\xac\x4f\x66\x50\x27\xe2\x9d\x95\x69\x9a\xe4\x09\xf9\x84\x36\xc8\xe9\x43\x2f\xc0\xea\xa1\x0d\x14\xe3\x4b\x82\x40\x39\x84\x78\x36\x1e\x3b\x16\x8a\xc0\xa0\x58\x26\x52\xbc\x23\x5b\x24\x4f\x3e\x27\xe5\x4a\x6e\xa7\x62\xfb\x43\xd4\x4f\x83\xf4\x7a\x9e\x8e\x5c\xca\x0f\xea\x04\x05\xd9\x42\x99\xd6\x93\x08\x17\xbc\xcb\xc1\x18\x45\xf1\x08\xa7\x91\x12\xc0\x55\x89\xe8\xa0\xe7\x19\x35\x23\x8c\x9a\xd3\x59\x21\xec\x1f\x8f\x31\x0c\xee\x71\xc2\xcf\x60\x14\xe4\x1c\x21\x16\xca\x83\x8a\x41\xc6\xa9\x12\xa1\xb2\x38\x80\x5c\xee\x4a\x2e\x70\x9a\x46\x21\xce\xd0\x21\x55\x88\x44\x38\xa3\x0c\x7c\x7a\x8d\xa2\x98\x65\x33\x2e\x10\xa8\xd0\x82\x9e\xab\xe1\x64\x51\x00\x86\xcc\xe5\x28\xb7\x48\xd4\x40\x32\x51\xfb\xd7\x27\x94\x84\x15\xe9\xa6\xc4\x24\x51\xf6\x17\x8b\xf0\x38\xec\xa2\xe7\x90\x29\xeb\xb9\x6e\x38\x62\x6f\x93\xfc\x4d\x70\x3e\x4a\xc2\x52\x1f\x79\xa9\xb4\x1e\x23\xdf\xe6\x78\x86\x90\x19\xce\x90\xa2\xaf\x18\x64\xf3\x79\x75\x06\x31\x9c\x06\x97\xb1\xf9\x45\x62\x24\x44\x58\x28\xd2\xea\xb9\xcc\x89\x37\x67\xe7\x13\x1c\x5b\x4c\x87\xc9\x8e\x52\x8e\x05\x2a\x98\x0f\x3b\x77\x15\xe5\xad\xe9\x1f\xac\x08\x30\x33\x29\xee\xfa\x15\x09\xc7\xd2\xd4\x8e\xd3\x0f\xbc\xc9\x51\x90\x1d\x5c\xc6\x8c\xec\xaf\x6b\xcf\x49\xcd\xe7\x4b\xc2\xe7\x89\x3c\xc2\x26\xc8\xcb\x93\x17\x73\xfb\x41\x6b\x95\x4e\xb7\xa5\xd6\xff\x93\xcd\xa6\x44\xd4\x8a\xa3\x7c\x25\x20\xc2\x29\xdb\xfa\x82\xf4\x7c\x46\x46\xd7\x3a\x1e\xc8\x92\x41\xa1\x64\x9c\x0a\x8f\xdb\xf4\x79\x86\x0a\x8e\x1e\x51\xa5\x30\x9f\x74\xba\x4a\x4d\x08\x72\x07\x95\xfd\xc0\xb1\xed\x20\xae\x18\x1f\xe2\x14\xc7\x03\xd2\x00\x8c\xf3\x54\x5f\xaf\xc6\x30\x30\xb9\xd8\x06\xd0\xb9\xcf\x20\x5b\x6a\x0c\x1b\x53\xdd\x86\x95\x92\xc9\x4c\x93\xaa\xbc\x67\x31\x1d\x07\x98\x40\xba\x6a\xcd\x10\xa8\x9b\x7c\x3e\x8a\x0c\x36\xb5\x25\x71\x0d\x47\x44\x69\x08\x29\x07\x40\x6a\x4b\x7f\x67\x5e\xc9\x23\x96\xa3\x0d\xc6\x36\xf9\x9d\xc5\x5c\x5e\x44\xcb\x95\x73\x3c\xb3\x11\x58\x72\x45\x9c\x6c\x73\xe5\xf2\x08\xea\xd2\x1a\xe1\xef\xd4\x75\xe2\xa4\x1a\x5e\xfc\x36\x64\x53\xe6\xae\xee\x98\x2b\x74\xc0\x98\x19\x4b\x12\x00\x24\x05\x26\xf4\x61\x88\xb2\x64\x82\x69\xea\x29\x74\x39\xc2\x31\xba\x4e\x66\xa9\x30\xb3\x0f\x88\x38\x4b\x81\xdf\x73\xec\xdc\xbb\xee\x82\xba\xa3\x73\xd9\x5e\x86\x28\x03\x58\x59\x31\x47\x46\x0c\xfd\x2d\xb7\xbb\xb9\x68\x54\x9a\xd3\x5e\x32\x25\xc2\xce\xb4\x90\x7b\x98\xbc\x73\x07\x71\x4a\x02\x06\x1a\x26\x45\xa6\x9a\x80\x26\xf2\x9e\xa7\x94\xad\x4e\xba\x7f\x56\x95\x5f\x6e\x39\xee\xd0\x88\x72\x89\x2d\xfa\x67\x5d\xe3\x22\xe2\x21\xbf\x6c\xfb\x18\x4c\xc0\x68\x62\x4e\x3d\xc4\xb6\xea\xa2\x98\xbe\x59\xcb\x00\x97\x4a\xb7\x58\x32\x9d\xa7\x72\xf1\x33\xb4\x21\xb5\xaf\x7e\x5a\x20\x75\x91\x63\x93\xdd\x46\x97\x49\xfc\x3c\xa7\xf2\x33\x77\x77\x94\x82\x17\x8e\x93\x64\x8a\x82\x7e\x72\x61\xd9\x06\xcb\xbb\xfc\x9c\x43\x7b\xee\xee\x30\x70\x51\xd1\xaa\xdc\x4f\xf1\xb6\x42\x5e\xad\x4a\x8b\x47\x1c\x4e\xa0\xa7\x60\xff\xb2\xc8\xba\xb1\x6d\x7c\x83\x71\x12\xe3\x07\xe0\x78\x00\x17\x6d\x14\x7b\x08\xbc\xa8\xb0\x93\x91\x62\x73\x37\x32\x39\x17\x89\x2a\x1c\x71\x7e\x6a\xb5\x27\xb3\x9f\x91\xad\xb7\xfb\x31\x0a\xc0\xf3\x56\x8b\x45\x58\x1a\x59\xc8\x88\xf3\x5e\x0e\xc2\x16\x9e\x46\x18\x3f\xa8\xe1\x10\xb3\xe8\x3c\x8e\x86\xd1\x20\x88\x73\x16\x50\x32\xa2\xbd\x07\x90\xb4\x1d\xdb\x31\xf9\x17\xc9\x83\x98\x9e\x95\xe5\x37\xf7\x10\x36\xc6\x6c\x5e\x27\x0b\x47\x18\x7c\xd9\xf4\x6a\xce\x58\x23\xab\x59\x98\x18\x29\xed\x06\x63\xee\xa0\xe1\x7b\x4b\xf5\x22\xfb\x67\x2b\x1b\xbb\x61\x0b\xe3\xd0\xfe\x57\x07\x70\x5a\xbf\xaa\xd7\xeb\x7e\xbd\x51\x6f\x7a\xa8\x7e\x55\x6f\xd5\xdb\xf5\x4e\x7d\xed\xec\xc1\x00\x7b\xa8\x53\x39\xf4\x0a\x0b\x5f\xc7\x67\xc4\x58\xb1\x97\xcc\x21\x18\x96\x2b\x7f\xa0\xff\x7e\xfd\x0a\x31\x7b\x35\x51\x63\x88\x6a\x62\x7a\x7f\xd8\xb0\x28\x0a\xe5\x3f\x80\x2a\x19\x0d\xf1\x9f\x95\x8d\x49\x75\x00\x94\x3c\xc6\x38\x3e\xcf\x47\xd4\xf4\xc8\xc9\x45\xaa\xc7\x8c\x29\x16\xca\x62\x91\x62\xb6\xe3\x41\x12\x12\x7a\xc7\xf4\x87\x4e\xee\xf0\xba\x3c\xf6\xa7\x20\x00\x1c\x0f\x56\x76\xf1\x95\xbb\xcd\x79\x01\x64\x2a\xad\xf6\x85\x83\xbb\x14\xc4\x5a\x21\xb2\x8b\x25\xae\xc1\xbc\xb0\x2e\x96\x2a\xca\x90\x7c\xca\x87\xeb\x0b\x45\x73\x61\x53\xe1\x8c\xe5\xc2\xa7\xea\xeb\x57\xb4\x8b\xaf\x4a\xc3\xb7\xcc\x21\xa0\x41\x90\xe3\x98\xed\xf9\x2a\x05\x39\x98\xbf\x9b\x90\xa4\x7b\xd8\x62\xc0\x4f\x18\x37\x94\x28\x13\xd2\xfc\x2e\x7a\xaf\x5b\x15\x97\x2a\xb4\x21\xb0\xf3\x79\xfc\x0c\xf1\xa6\xe1\x4e\x69\x06\x25\x75\xa6\x44\x03\x3b\x2f\x16\x8e\x84\x0c\xec\x2f\x06\xc3\xb2\xf8\x2a\xe6\xa3\x40\x84\x3a\x28\x48\xcc\x5d\x3a\xca\x8e\x0b\x1e\xa3\xf0\x1c\x07\xf0\x63\x95\x25\x51\xf8\x45\x1d\xa3\x53\xbd\x71\x30\x99\x22\x7c\x05\x91\x24\xfb\x91\xde\x39\x7a\xaf\x4a\xca\x98\xb7\x0d\xf4\x3e\x75\x60\x0b\x92\xa2\x20\xfe\x2f\x47\xa0\x74\xa8\x4f\x44\xd2\x18\xc3\x56\x8b\x82\x1c\x05\x28\x8f\x26\x16\x89\xdb\x16\x92\x5d\xee\xae\x3b\x29\x84\x3c\x38\xa4\x28\xda\x20\xe8\xb1\x59\x38\x8d\x78\x54\x6c\xf2\x4f\xad\xd1\x42\x2f\x51\x2d\xa2\x18\xbf\x40\xeb\x4b\x4b\x22\x5a\xb6\x53\x8a\xa7\x70\xd4\x1e\x2f\xa3\x48\x84\xdb\xfe\xba\x51\x34\xfd\xe6\x0d\x6f\xc3\x52\x5e\x34\x5a\x41\xf0\x77\x6e\x4b\xf2\x98\xd2\xc5\x75\xa7\x31\x75\x47\xb9\xaf\xda\xfd\x0d\x64\x0e\x76\x95\x8c\xc1\x26\x15\x8a\xcd\x76\x79\x43\x45\xd3\x96\x63\x25\x88\xe2\xa0\xaf\x9f\x3c\xa4\x03\x40\x55\x76\x4a\x63\x70\x10\x21\x50\x11\x0c\xa3\xfc\xae\xa2\x60\xb1\x38\xc5\xea\x72\x30\x29\xf2\xb9\x6a\xe8\x5e\x0b\x6b\x32\xe5\x28\x5b\x5c\x24\x27\x93\xb1\x33\x0c\x8b\xa8\x76\x2a\x60\xf0\x38\xf3\x1b\xb0\x74\xe8\x1f\x90\x7e\xb3\x41\x48\x3f\x53\xf8\x82\x85\xe0\x15\x51\x6a\x03\xed\x07\xf9\x68\x65\x80\xa3\x71\x51\x73\x15\x2d\x10\x91\xc8\x7e\xfe\xad\xb4\xf3\x38\xcc\x91\x8c\xe3\xef\x6d\xed\x3e\xd9\x71\x57\xa6\x05\xe3\xbc\xab\xd2\xc2\xbc\x73\xae\x0c\x16\x4e\x6a\x14\x57\x39\xfa\xb9\x79\x72\x5e\x31\x69\x84\x99\xdf\xd7\x9d\x26\x75\xa4\xde\xe2\x53\x20\x89\x0d\xc3\x68\x3c\xe6\x61\x67\x99\x9b\x04\x9c\xb7\xe6\x0b\x25\xfc\x30\x17\xdb\x0e\xbd\x32\x28\xa7\x8b\x4f\xa5\x59\x66\x90\x2a\x11\xca\x7d\x19\x9f\x55\x38\x82\x31\x57\x10\xdf\x7d\xd2\xa2\x25\x64\x32\x89\xed\x47\x2c\x99\x3d\x98\x07\x2a\xf2\x35\x55\x6f\xc8\x27\x9f\x2f\xdd\x51\xe6\x3f\x5f\xa2\x0d\xf2\x5f\x47\x02\xb5\xc9\xe7\x3f\xc8\x36\x73\xd5\x0c\x42\xdc\x59\xef\xeb\xe1\xd7\x45\xb1\x20\xfb\x82\x64\xce\x51\x72\x4f\x50\xe1\xee\x8e\xb6\x5a\xab\x5f\xbd\xaa\x77\x5e\xa1\x17\xa4\x0b\x7f\xc0\x9e\xbe\xb3\xb3\xb3\xb3\x84\x96\xe9\x8b\x9f\x7e\x42\xf5\x2b\xbf\x0e\xdb\x3d\x41\xc0\xb1\xdd\xd3\x2e\xd6\xea\x57\xad\x4e\xbb\x4e\x81\x5d\xea\xc0\x2e\xab\x02\x83\xe1\xc5\xd9\x0c\x3c\x7d\x6a\x80\xc6\x9b\x37\xb4\x26\x5a\x46\x30\xd2\xa5\xf5\x59\xdd\xd5\x0d\xa8\xc3\xfe\xca\xcb\x2e\x6f\xa0\xfa\x4a\xdb\x59\x06\xc6\x94\x15\x7d\x41\xed\x6d\x38\xb5\x2d\xa1\x9f\xd0\x4a\x1b\xfd\x07\xf2\x51\x17\xbd\xf4\xab\x88\x28\x06\xe7\x50\xc5\x0d\x0f\xa5\x83\x60\x30\xc2\x2c\xbb\xce\x7c\x81\x83\xd4\xfc\x4c\xe8\x31\xad\xd5\x68\x55\x72\x54\x52\x90\x24\xbb\x89\x34\x18\xf6\x2b\x26\x5a\x75\x03\x7d\x4e\x6b\xb4\x3c\x10\xe4\x5a\x7f\xcd\xd2\xa7\xcb\x22\x87\x4f\x4d\x94\x2f\xe0\xa3\xaf\xa8\x5e\x31\xac\x79\x8c\x2f\x25\x67\x27\xb8\x75\x64\x0a\x90\x98\xa7\xef\x79\xa2\x8d\xa4\xdd\xf9\x94\x1d\xed\xe7\x19\xd2\xe0\x78\x00\x86\x34\xf4\x5f\xbb\x21\xcd\x2e\xbe\x32\x35\x01\x36\x70\xa4\xe0\x06\x05\xba\x42\x7f\x57\x8b\xbf\xa9\xab\x2f\x46\xf8\xaa\xb2\x0a\xa3\xc2\xc9\x73\xc1\xa8\x9a\x95\x5a\xbf\x2f\x46\x3e\xc2\x57\x66\x08\x4d\x36\x7e\xd2\xd1\x7e\x7e\x22\x21\x6b\xe0\xcc\xdb\x1e\x53\x2f\x2b\x9f\x3c\xb3\x45\x8f\x91\x74\xd6\x4d\x40\x23\x7c\xd5\x1b\x05\x69\xe5\x3c\x5b\xd9\xdc\x03\x1d\xe4\x48\x8b\xe8\x41\xee\xf2\x8e\x87\x38\x8e\x1d\x5b\xe3\x00\x96\x00\x69\x2d\x15\x6a\x1f\xbf\xb3\x64\xe3\x77\xb6\xaa\xa4\x9d\xfa\xb0\xbc\xae\x83\x41\x08\x70\xbf\x27\x51\x5c\x7b\xfe\xfc\x16\x11\x37\x25\x0a\xa7\xeb\x6d\x11\x4d\x0f\x5f\x29\x94\x70\xab\x2f\x18\x87\xf0\xf4\xd7\x4b\x4d\x7c\xb1\x51\x9b\x6d\xb1\x1e\xab\x47\xca\xa4\x55\x16\x4b\x94\x42\xeb\x7c\xe0\x47\x17\xfa\xc8\x8e\x32\x8b\xac\x9a\xcb\x45\x52\xd3\xc9\x8d\xb2\x2d\xb4\x51\x92\x1f\x93\xae\x96\x26\x68\x26\xa0\xd3\x7b\x71\xce\x3a\xbb\x92\xcd\xfa\x59\x9e\xd6\x22\x0f\x35\x96\x3c\x48\xc2\x57\xa8\x2c\xc8\x8a\x5a\x5f\xb2\x39\xe0\x2e\xbc\xe7\x29\xc3\xb4\x8a\x1a\x55\xdd\x67\x3f\x04\x79\x14\xfb\xd5\x36\x2d\x56\x96\xef\x5b\xe2\xf1\x76\x5b\x17\xab\xfe\xd7\xed\x5e\x55\x11\xb8\xaf\x35\x35\x86\xf6\xec\x7b\x18\xc5\xe5\x7f\xd4\x36\x46\x87\xe3\x3b\xde\xc9\x24\x04\xe9\x8e\x44\xa7\x6e\x65\x98\x26\x13\xf2\xb6\x97\x84\x18\x36\xa9\xaa\x1b\x92\x0c\xf0\x0e\x7b\x92\x42\xb7\xb7\xdf\x96\x04\x39\x2e\xb4\x18\xbe\xeb\xcd\x89\xad\x22\xba\x3f\xc9\xcb\xad\xfa\x16\x25\x6a\x2d\xb6\x4b\x89\x6a\x62\xa3\x12\x6f\x1e\x7a\xaf\xd2\x9a\x9e\x97\xcb\x39\x92\xb4\xe8\x45\x6f\x57\x06\x8c\xa0\x37\xf3\x5a\xc4\xd7\x84\xbe\x55\xd9\x75\x8b\x0b\x6f\x55\x1a\xc2\x55\x77\xaa\x4f\x27\x3b\x2f\xd7\xab\x6d\x54\x9f\xf2\xe1\xba\xd8\xa6\xd8\xc3\xed\x36\x29\xda\xe8\x5f\xb7\x47\x55\x6c\xff\xbe\x56\xd6\x2c\x1f\xae\xdb\x37\x28\x32\x8a\x0f\xb9\x3d\xe5\xe9\x75\x89\x81\x51\x88\xc9\x11\xfd\xd3\xd1\x5e\x8f\x7b\x3a\xd5\x70\x36\x08\xa6\xb8\x56\xb2\x71\x9a\x6c\x19\x0d\x82\x7c\x30\x42\x35\x33\x7d\x34\xa0\x30\x4a\x93\x4b\xa0\x5b\xc8\xb8\x52\x7b\xbe\x1f\x8c\x87\x49\x3a\xc1\x21\x9b\x86\x30\xc8\x03\x33\x05\xdd\xe2\x0c\x5c\x9e\xd4\xdb\xf3\x6f\x36\x57\x8b\x90\xc9\x77\xcd\xbc\x81\xc2\x28\xeb\x2e\xc8\xb0\x3a\xe3\x66\x75\x5c\xc6\x00\xca\xd6\x30\x8b\x19\xf5\x50\x0b\x01\x85\xae\x38\x9c\xa5\xca\x01\x68\x44\x0a\x5e\xc8\x85\x89\x43\x96\xcd\x4c\xf2\x42\x77\x66\xe2\x95\xec\x64\xaf\xa5\x94\x68\x93\x59\x96\xa3\x3e\x46\x11\x19\xd1\x09\x8e\x73\x9a\x67\x2d\x80\xeb\xf5\x14\xe7\xc2\x63\xa1\x52\x6e\x5f\x2d\x4f\xa7\xaa\xdc\xa7\x39\x0e\xa9\x6b\x55\x91\x20\xfe\x0b\x9e\xe6\x68\x16\x4f\x79\xd2\x40\x35\x3b\xa8\x64\xd3\x52\xb7\x70\xdf\xb7\x6c\x1c\x20\xd3\xe0\xa6\x18\x05\xe1\x25\xe6\xfa\x5c\xd1\x0c\x0e\xb2\xbb\x32\x6b\x1e\x6d\xa4\x9f\xb3\x24\xda\x2c\x89\x69\x9e\xa0\x28\xcf\xb8\x57\x0c\x22\x14\x7c\xd7\x3b\xa6\xbe\x15\x79\x9a\x10\xd7\x7d\xc9\x54\x29\xeb\x2e\x33\xef\x43\x60\xa5\x6c\xb3\x19\x80\x0c\x9c\xcc\x53\x51\xdb\x59\x75\xa6\x44\xcb\xc7\x5b\x41\x1e\x70\x61\xbd\x5e\x55\xd2\xdc\x0c\xc3\x0c\xda\xe0\x79\xc1\x1d\x23\xcd\x68\xa1\xfa\xa6\x28\x82\x2c\x18\x99\xc7\x99\xb1\x0b\xa2\x6b\x9e\x39\x01\x50\x7e\x49\x7d\x4a\x02\xc9\x82\x92\xda\x13\x03\xc7\x7b\x98\xc9\xfc\x4c\xd1\xa9\x3d\x37\xf9\x7d\xa5\x7a\xf3\xf7\x46\x56\xb2\x4a\x32\x73\xd3\xbd\xbe\x48\x47\x27\x07\x14\x95\x06\x88\x05\x13\x55\x41\xc9\x3e\xce\x40\x46\x73\xe2\x44\x32\x5a\x93\x98\x32\x60\x38\x3f\x52\xda\x26\x74\xcd\x45\xbe\xdc\x94\xc8\x06\xcc\x20\xda\xe5\x0d\x35\x49\x7a\x55\x0a\xe6\xb9\x4e\x33\x14\x5c\x04\xd1\x18\x22\x76\x51\xbe\x00\xcc\xce\x4d\x35\x27\x92\xb3\x4a\x14\x5f\x24\x5f\x70\xa6\x27\x19\xae\xb1\xe4\xc0\x1e\xba\x1c\x45\x83\x91\x95\x55\xf7\xaf\x4b\x58\xb5\xd9\x2a\x5f\x28\xfd\x24\x19\xe3\x20\xbe\x41\x61\xb2\x33\x9e\x65\x23\xf4\xcb\x08\xe7\x34\x9e\x09\xcf\x45\x0b\xee\x5a\xd3\x20\x05\x46\xc1\x5e\x15\x5c\x5b\xb0\xeb\x5b\x84\x03\x11\x9c\x1e\x46\xfc\xee\xdb\xbc\x00\xb8\x45\x09\xc9\xb5\x66\x78\xaa\x5c\x57\x5c\x8e\x05\xc1\xd8\x33\x05\xab\xb1\x56\x69\x51\x65\xf1\xd1\x01\x5f\x50\x67\xc2\x96\x48\x41\xdc\x16\x6d\x09\x79\xcd\x8d\xd3\x60\x64\x5d\x6a\x15\xf2\x51\x32\x34\x73\xd1\x3d\x2f\x5e\xc8\x0a\x1b\x5a\x4a\xe6\xb2\xc2\x1c\x7a\x51\xdb\x1e\xd1\xaf\x97\xcc\xe2\x9c\xd3\x97\x85\x99\x10\xa0\x31\x4d\x24\x7c\x04\x71\x8b\x37\x54\xfc\x57\xb5\x26\x5f\x9b\xbc\xc8\x35\xe4\x0c\x83\xa3\x64\x16\x87\x68\x36\xa5\x0e\x85\x83\xf1\x2c\xc4\x1a\xdd\x9b\xd5\x34\x8c\x0a\x23\x17\xf9\x43\xf5\xd8\xb6\x02\x8b\x30\xb9\x8c\x65\x3c\x92\x78\x7c\x8d\x86\x33\xb1\x28\x2d\x91\xf4\x57\x57\xd1\x18\x67\xd4\xa9\xd2\x2e\x6b\x01\xdf\x48\xf1\x24\x88\x62\x55\xb8\xaa\xd6\xaf\x49\x70\x55\x53\xfa\x05\x17\xa7\xe8\xa5\x2d\x33\xbb\x37\xff\x4a\x55\xcc\x39\xd5\x3c\xb8\xa6\x1c\x28\x99\xe3\xa1\xb4\xfe\x02\x49\x04\xe8\xa2\x27\xa0\x0d\x27\x39\x91\xaf\x6a\x1f\xa3\xb8\x26\x37\xf9\x02\xb5\x3c\x85\xce\x6c\xe6\x93\x3c\x83\xb7\x8d\x48\x08\xdd\x49\x00\xcb\xdd\xb6\x28\x9f\xa7\x6a\x16\xf6\xfb\x8d\x3c\x02\xe2\xed\xb2\xb4\x9e\x9c\x46\x13\x04\x33\x9c\x92\xd3\xa4\xd8\x18\x5e\x16\x07\x04\x70\x86\xb4\x57\x64\xdc\x45\xdd\x83\x04\x57\xb1\xe5\xaa\x77\xcd\x31\x52\x52\x60\x15\x0c\x1f\xa6\xdc\x2c\xaa\x70\x5f\x99\x85\xe9\xc9\xb0\xe4\x11\xb5\xa0\xa1\x70\x32\xf4\x72\x43\x9e\xe9\xf9\x54\xc9\x63\x8b\x96\x61\xeb\x56\x38\xa9\xf8\x7b\x72\xd3\x77\x35\x76\xab\x9c\x85\xb2\xd4\xc9\xeb\x8e\x56\x6e\x8e\xdd\xf0\x2f\x32\x79\xfb\x6c\x6c\x88\x05\x26\xd6\x19\x2b\xb5\x78\x53\x79\x98\x38\x69\x3a\x32\xd1\xf3\x33\xf8\x28\xc8\x20\x43\xae\xf3\xc4\x3d\x37\x15\x79\xc1\xae\x65\x1f\x28\x3a\xe9\x0c\x3a\x0d\xbb\x86\x33\x94\xc4\xd2\x51\xd8\xef\xa0\x5a\xdb\x6f\x80\x25\xeb\x92\xe5\x58\xbc\x4b\x2b\xf3\x63\xb0\x78\xb4\x9f\x87\xef\x25\xea\x6b\x59\x06\xb2\xd2\x80\xa9\x65\xae\x66\x74\x10\x16\xc8\x49\x7e\xdb\xe8\x76\xa4\x21\x44\x43\x24\xcf\x0b\x72\x57\xd9\x86\x44\xcc\x81\x12\xba\xed\x78\x77\xb3\xd1\xee\xd8\x9d\xc4\xca\x52\x5d\xdf\x3a\xc2\x1a\x8f\xad\x56\x3d\xcc\xda\x31\x16\xe1\x3d\xdc\x1a\x02\x53\x0d\x31\xc7\x12\xbb\xd0\xa4\xf0\x85\x73\xff\x2a\x13\x46\x2f\xf7\xa1\x22\x01\x84\x65\x15\x8f\x5a\xc2\xb1\x92\x00\xb4\xc2\xbc\x4c\xa9\x41\xdf\x9b\xd9\x70\x58\x36\x66\xbe\x21\x1f\x2d\x36\xd6\x9f\xa6\x21\xb0\x0c\x79\xb0\x69\x5a\xfe\xea\x19\xfb\x9c\x11\x84\x29\x70\x3d\x8e\x70\x65\x17\x22\xca\x8a\x98\xff\xd0\xdc\xe5\xbd\xc0\x9c\xcf\x00\xaf\xda\x73\x86\x94\x4d\x97\xa2\x96\x9c\xaf\x3a\xa1\x05\x65\x42\x51\xc6\xc0\xb1\x1e\x1d\x1a\x09\xa6\xb0\x51\x21\x58\xc8\x83\x8d\x2f\x11\xd2\x09\xbe\x36\x50\xd2\x39\xd6\x14\x7f\xef\xcd\x77\x62\x87\x25\xb9\xc9\x04\x2e\x4e\x06\x89\x3e\x26\x80\x72\x90\xd3\x7c\xf1\xac\x66\x11\x33\x14\x45\x19\xc2\xc3\x21\x1e\xe4\xd1\x05\x1e\x5f\xa3\x00\x85\x38\xcb\xd3\x19\x3c\x7b\x20\xa7\xbf\x4c\xe2\x01\xae\x14\x65\xb4\x22\x85\x2a\x89\x1e\x00\xa5\x22\x20\x37\x94\x58\x5c\x73\x41\x06\xe1\x9e\x76\x06\xb4\xc1\xc9\x51\x24\x13\x72\xa8\x25\x1c\xa5\xcb\x08\xbd\xa4\xda\x7c\xaa\xe7\x45\x17\xa2\xfb\x1d\xcb\xf8\x9a\x07\xa2\x72\x30\x68\xde\x5a\x99\x27\xc0\x2f\xc0\x59\xa5\x11\xe2\x4c\x76\x47\x9a\x07\xeb\xe2\x21\xe5\x5d\x8b\x47\x4a\x7e\xd7\xf6\x1b\xab\xcd\x46\x35\x31\x3f\x63\x1a\x1f\x25\xfe\x7d\xc0\x26\xed\xb9\x08\x9c\x14\xc5\x39\x4e\x87\x92\xb5\x30\x72\xae\x0a\xce\x5f\x59\xd7\x39\xd5\xd2\xed\x96\xc5\x47\x0c\xd0\x08\x8f\xa7\x38\x25\xe2\x4f\x85\x45\xb0\xc3\x70\x63\xbe\xc1\x3a\xca\xdf\xe0\x1e\x8f\xca\x4c\xba\x53\x05\xed\xea\xca\x67\xda\xab\x5d\xe8\x52\xcd\x26\x6c\xb9\xf5\x73\x72\x55\xc5\x78\x10\x40\xbb\xee\xf7\x8c\x75\x61\x0f\x80\x8b\xd4\xf3\x22\x5b\x89\x70\x58\x54\xb3\x88\x15\x19\x2e\x55\x0a\x5f\xfc\xd8\x68\xa5\x27\xc2\x92\x77\xf7\x37\x7b\xf7\x4f\x4f\x44\x84\xe6\x41\x29\x48\x0b\x8c\xae\xfe\x16\x34\xb5\x3b\x09\x06\x95\xe8\x6a\x12\x0c\xee\x42\x5b\xa2\xfa\x9d\xe8\xeb\x0b\xb6\xab\x90\x24\xfa\xea\x7d\x06\xb4\xc8\x3c\x50\x22\xa3\x8d\xd0\xba\x8b\x11\x5b\xe9\xf1\x57\x68\x92\xe6\xf8\x30\x10\x6c\xc0\x89\x81\xfd\x28\xbc\x18\x78\xa6\x16\x08\xe9\xbb\x1f\xe4\x23\x1a\xd6\xf7\x09\x7f\xcf\x86\xf9\x75\x11\xe9\xf7\xe6\xcc\x6b\xb7\xbe\xd7\xf0\xbe\x0c\x99\x1a\x0f\x47\xbc\x74\xef\xf1\x7e\x39\xe4\x45\xe3\xfe\x0a\x0c\xe5\xf8\xbf\xae\xa0\xbf\xe2\x3b\x04\xff\xb5\x05\xd0\x35\xaf\x28\x78\xd4\xd8\x62\xca\x24\x02\x90\xa2\xc1\x4a\xef\x4b\xc2\xd3\x28\xb5\x25\x17\x18\x57\x18\xd9\x4e\xab\x9a\x89\x16\x2b\xcb\x8d\xb4\xc4\xe3\xed\xcc\xb4\x58\xf5\xbf\xce\x4e\xab\x2a\x02\xf7\xc5\x29\xfb\xd0\x9e\xdd\x54\x8b\xe2\xf2\x0f\xb0\x25\x36\xca\x4f\x82\xa9\x10\x0e\x27\xc1\x74\xf1\xd8\x0b\x16\x17\x71\x13\x84\xcb\x2a\x93\x8e\xf9\x6d\x0d\x96\xd1\xf2\x06\x6a\xba\x6d\x96\xaf\x73\xec\x5b\x8c\x96\xe9\x9f\xcb\x74\x99\xfe\x39\x0d\x98\x39\xe0\x46\x01\xb8\x16\xa1\x65\xe4\x2f\x59\x6c\xa2\xf9\x97\x2a\x96\xd1\x1c\x70\x53\x03\xdc\x70\x02\x6e\x58\x01\xdb\x21\xe7\x69\x34\x1d\xc3\xd5\x4b\x8d\x0e\xcb\x9b\x37\xe0\x37\xf1\x95\x3e\x37\xc8\xf3\x3a\x79\x04\x14\x6c\x50\xc4\x54\xfc\x4e\xa7\xa2\xf6\x3b\x7a\x43\x5a\xff\xf1\x47\x04\xd8\xfc\x8e\x5e\xa0\xfa\xca\x5a\x5b\x9a\xa1\xa5\xd7\xe8\xf7\x92\x70\x17\xd2\xdc\x53\x5b\xf0\x49\x30\x05\x9b\xd9\xcd\xbc\x56\xe3\x08\x43\xa7\x3b\xe8\x05\xaa\x35\xd1\x4b\xf4\xfb\x12\xeb\x69\x73\x68\xf5\x76\x32\xe2\x33\x98\x8a\x8b\x30\xe4\xe9\xbe\x4d\x6a\x64\x1f\x08\x4a\x68\x03\x49\xe8\x74\x0c\x67\x12\x88\xad\x57\x14\xb7\x1b\x07\x8f\xa2\x31\x46\x35\xb9\x9f\x2c\x5c\x80\x2b\xd6\x88\x75\x58\xe4\x66\x16\xef\x33\xe3\xac\x32\xd4\x3b\xd8\xc9\x2b\x3c\xf9\xf6\x76\x96\x82\xd5\x2e\xc4\xe8\xbf\x6b\x53\x4b\xb6\x43\x50\xbb\x1e\x79\x2b\xa9\x6e\x6e\x29\x6a\x2d\xb8\x39\x88\x7a\xc2\x50\x5e\xbc\x11\x86\xf2\xf3\xf9\xbe\x51\x22\xc5\x17\x38\xcd\xf0\xbe\x54\xb0\x78\x65\x8b\x6b\xf6\x43\xf1\xd9\x49\xdd\xa5\x40\x6d\x5b\x00\xff\xd3\xf9\x0f\x61\x3f\x64\x85\xb2\x0e\x96\x72\x1a\xb5\xe1\x53\xbe\xb0\x99\x6d\xfe\xef\x4b\x67\x68\x03\xfd\x5e\x2d\x56\xa7\x85\xa5\xec\x9d\xc7\x49\x8a\xbf\x19\x57\x91\x40\xee\xc5\x21\xf8\x39\x17\xd3\x1d\x91\x37\x07\xc3\x79\x3c\x43\x6a\x87\xc2\xf8\x61\x63\x03\xbd\xf4\xe7\xf0\x24\x99\xc2\xe4\xda\xb7\x62\xc4\x56\x91\x20\x15\x69\x2f\x33\xfc\x21\x49\xa6\xc5\x92\xf0\x74\x1c\x3c\x69\x46\x15\x91\x43\xbb\xf1\x0c\xa6\x5d\xf4\x7c\xf3\x6d\x6f\x6b\x7b\xe7\xdd\xee\xde\x7f\xbd\xff\xb0\xff\xf1\xe0\xf0\x7f\x1f\x1d\x9f\x7c\xfa\xf9\x97\x5f\xff\xfd\x7f\x82\xfe\x20\xc4\xc3\xf3\x51\xf4\xfb\x97\xf1\x24\x4e\xa6\xff\x9d\x66\xf9\xec\xe2\xf2\xea\xfa\x8f\xba\xdf\x68\xb6\xda\x9d\xb5\xf5\x57\xcb\xab\x1b\x2c\xc2\xad\x38\xda\x89\x45\xbb\x30\xaa\xc5\x10\x3b\xbc\x52\x0a\xcb\x0d\xc5\xc2\xd4\x26\x0a\x69\xed\xd8\xdc\x54\xc8\x4c\x47\x8e\xfd\x86\x39\x76\x65\x44\x48\x92\x96\x47\x41\x4d\xb2\x03\x0b\x7a\x89\xfc\xa5\x33\xf0\x5e\x29\x04\xa6\x86\x49\x5c\x1c\x68\xa3\x0a\xd0\xa5\x33\xbe\xc1\xcb\x62\x98\x05\x2a\x15\x88\x62\x25\x72\xcf\x57\x22\xcc\x00\xfa\x5f\x69\x8b\xb2\x6f\x4d\x5c\x1e\xbc\x07\xb1\x21\x5e\x5e\x56\x3e\x08\xb2\x15\x3f\x18\x45\x1a\xb1\x25\xad\x61\x11\x6e\x8a\xdc\x3d\xfa\x21\x5f\xda\x23\x5e\x3b\x33\xfb\xb4\x1f\x8f\xfe\x8f\x47\x7f\x71\xf4\xff\x74\xb2\xf3\xd2\xef\xa0\xb7\xdb\x95\x1d\xb4\xfc\xce\xdb\x6d\xd9\x47\xcb\xef\xa8\x4f\xf0\xf5\xf6\x4e\x5b\x14\x99\xbf\xd6\x71\xab\x22\x0e\xf7\xe8\xbc\xe5\x77\x9c\xde\x5b\x7e\xe7\x1f\xa0\x11\xa8\x7e\x58\x87\xc1\xb8\xcb\x59\xdd\xee\xef\x0f\x96\x51\x49\x88\x0f\x93\x28\xce\x5d\x4e\xc6\x7e\xc7\xe1\x64\x6c\x3d\x4c\x17\x98\xba\xbd\x8c\x45\x93\x55\x5d\x8d\x25\xa0\x77\x38\x41\xe9\x44\x7c\x27\x67\x35\xa0\xcd\x45\xd7\xc6\x77\x7d\x8c\xa2\xab\x4a\xb8\xac\xf1\xc5\xb7\x90\xcf\x1a\x54\x5a\xcc\xd7\x98\xd7\x12\xf2\x2d\x7f\xf1\xd0\x9e\xc6\x6a\xc3\xd5\x1c\x8d\x7d\x90\x7d\x04\x86\xaa\x9b\x31\x11\x81\x8a\xc5\xd2\x20\x8b\x45\x0b\xc2\xe6\xa6\x70\x97\x94\xa3\x8d\xce\x8b\xea\xa1\x30\x18\x59\x7e\xa8\xb0\x87\x49\xfb\xd4\x87\x3b\xef\x53\x1f\xbe\x83\x7d\xaa\x0a\x0e\xf7\xbd\x4f\x59\x97\xd3\x87\xed\xc7\x6d\x4a\xfc\xdd\xdb\x36\x95\x5d\x06\xd3\xed\x38\x8c\x82\xb8\xb6\xe8\x8e\x65\x3b\x92\x7f\xff\x5b\xd6\x87\x87\xd9\xb2\xaa\x2c\x93\xef\x7f\xcb\xfa\xb0\xad\x6d\x5a\x8f\x3b\x96\xb1\x63\x49\x2b\x66\xa1\xcd\xeb\x9b\xee\x5e\x62\x5e\x24\x6c\x09\x20\xa5\x8f\x3c\x1a\x3e\x7c\x61\x77\x27\x74\x71\xd7\xeb\xe4\xff\xe1\x62\x85\x7e\x24\xdd\x67\x5f\xe9\xb7\x62\xf9\xcf\x53\x17\x00\x61\xb9\xb5\x05\x9d\x3b\x69\x0b\x58\x8e\xda\x6f\xa9\x34\xf0\x90\xf4\x2a\x1b\x05\xbe\xf6\x6a\x34\x09\x06\x0f\xa8\x5a\xf0\x10\x6f\x16\x7e\x41\x6b\xff\x04\x75\x83\x91\x2f\xf6\x16\xaa\x08\xc5\x88\x45\xfa\xb2\xbf\xd5\x86\x9a\x60\x72\xb3\xbf\xd5\xb6\xc9\x78\x60\xe2\xfc\x05\x5f\xd3\x2c\xd8\xd4\x0e\x56\xf4\x15\x9c\x7f\x83\x38\xe7\x49\xbc\x93\x74\x42\x6d\xb4\xb7\x7f\x3e\xfc\x0c\x9b\xee\x49\xf2\x1e\x17\xc2\x20\xba\xbc\xbc\x5c\x49\xa6\x38\xce\xb2\xf1\x4a\x92\x9e\xaf\x86\xc9\x20\x5b\x85\x24\xdc\xc9\xaa\x56\x67\x94\x4f\xc6\x16\x45\xc8\xf6\xc5\xf4\xfd\xd6\x4e\x81\xb6\x78\xae\x18\x0c\x61\xbe\x0f\x88\xb6\xc7\x19\xde\x2f\x2c\xe5\x39\xec\x51\x64\x60\x32\xf2\x10\xc5\xdc\xed\x45\x0a\xf7\x5c\xb8\xba\xb4\x50\xcd\x6f\xac\x2b\x9e\x2e\x06\x7c\x87\x91\x9a\x1c\x16\x43\x4f\x90\xb2\xbf\xd5\x9e\x87\x6d\x94\x33\x5b\x64\x3d\x48\xb5\xf4\x21\x4f\xd0\x94\x5a\x9d\xca\xde\x39\x8e\x1d\xce\xf0\x8b\xd1\x76\x07\x36\x3c\x5d\xe4\x37\xd6\xc1\x84\x54\xf9\x4a\x3b\x07\x98\x6b\x5f\x0a\x7c\x94\xb6\x6f\x6e\xed\x76\xe3\x20\xda\x87\xf6\xc3\xc1\x52\xa3\xf7\x60\x66\xfd\x25\x1c\x1a\xde\x37\x94\xe6\xe7\xa4\x68\x9a\x5f\xf1\xcf\x62\xae\xd6\xb5\x7c\x7e\xb7\x05\xe3\xa9\xd3\x58\xaf\xd7\x75\xc0\x0b\x7a\x07\xcd\xf5\xfb\xa9\x26\xef\x6e\x41\x0a\x7f\x42\x23\x84\x2a\x20\x11\x76\x00\x19\x58\xc9\xa2\xbd\x8d\x95\x3e\xaf\x4b\x63\x01\xd8\x00\x95\x54\xce\x82\x71\x8e\x36\xe1\x9f\xc5\xc5\x62\xa0\x2e\x4a\xde\xf7\x41\x5e\x98\x6c\x1e\x5f\xc2\xe1\x0a\x75\x8b\xc0\x35\xde\x19\x0f\xf0\x2b\xc9\x5b\x03\xc5\x95\xfc\x8e\x6a\xcd\x85\x04\x5e\x75\x8a\x2d\xe2\x2d\x59\xe9\x8c\x7b\x98\xb5\x85\x97\x1a\x21\x0f\x66\xa2\x5c\xac\x0e\x2b\x2c\x97\x5b\x18\x84\x16\xa0\x43\xfc\x1e\xc6\xc6\x96\x12\x6d\x91\x33\x72\x01\x4c\xf8\x04\x8b\x37\xce\xe3\x32\xdf\x63\x68\x8f\xd8\x93\xa5\x9c\xc4\xc4\x69\xd1\xe2\x85\x05\xcb\x77\x6c\x63\x22\xe0\xd5\x8f\xcc\x98\x45\xc3\x95\x1b\xb4\xbc\xe1\xf8\x58\x8f\x02\x44\x8c\x03\xcf\x01\xe7\x05\xb3\xea\xb2\x44\xcb\xce\xbf\x56\x46\x72\x30\x86\xc2\x09\x84\x41\xe1\xc4\x26\x19\x05\x1b\xf4\xaa\x36\x2f\xfc\xe9\xcc\x12\x84\x26\xc4\xc0\x99\x9f\x95\x83\x92\x4f\x0f\x4a\xd2\x40\x97\xa6\xfd\xd1\xb0\x17\xc8\x3a\x47\xc1\x86\xb1\x65\xa8\xcc\x77\x12\x59\xb1\x98\x31\xd6\x36\xb4\x51\x96\x6a\x49\x3a\x1a\x4e\x7f\x96\x68\x17\x22\xc0\x1c\xaf\x57\xd5\xe6\xba\x12\x0f\x96\xfd\x8e\x6f\xc5\x7b\x17\xe4\xbb\xf7\xe8\x7d\x6b\xf1\x2b\x93\x7a\x53\x9d\x9b\x4b\x95\x14\xed\x86\xf4\x5e\xe5\xee\xc5\x07\xa4\x70\x75\xb1\x69\xd3\xfd\xda\xc5\xd9\x17\xab\xe6\x21\x87\xd8\x70\x17\x30\xa5\x62\x83\x50\x21\x17\xb2\xbe\x6b\xcf\x31\x5d\x58\xd8\xb0\xab\x12\x0b\x38\xae\x94\xef\x77\x37\xaf\x4b\x8e\xef\x14\x9a\xfd\xec\xee\xf1\xc3\x67\xb7\xbd\xee\xf1\x23\x69\x77\x6d\x8d\x9c\xe9\xd7\xfe\xd6\x67\xfa\x41\x34\x1d\xe1\xf4\xe5\x03\x9b\x08\xc0\xe9\x5d\x6e\xea\xaf\x39\xc4\x9b\x99\x3b\xef\xe5\x34\xdf\x83\x8e\x1d\x12\x8e\x93\x89\x43\xbb\xfc\xd2\x6d\x42\x20\xde\x6b\x99\x30\x94\x1a\xe4\x0c\x17\xe4\x50\x89\xfe\xe4\x8c\x98\x55\xdc\x81\x97\x39\x8b\xaa\x40\x8b\x2c\x90\x4e\x83\x9c\x6e\xe8\xdc\xe4\xf8\x2a\x27\xa7\xc8\x80\x3d\xa3\x29\xed\x13\xf3\xcd\xe2\xa9\x36\x82\x10\x0f\xa2\x49\x30\x1e\x5f\xb3\x34\xa0\x61\xe5\x9b\x1b\x79\x54\x6e\x58\x2b\x6c\xe0\x4e\x04\x1a\x6a\xb3\x8b\x27\xe3\xb8\x0d\x7e\x0f\x9a\x9e\xa3\x98\x12\xe9\x56\x47\xee\xfc\x62\x17\x3b\x4a\x4d\x87\xa3\x96\x5c\x66\xa5\x98\xdd\x22\x81\xc4\x2e\xbe\xba\x65\x26\x08\xcb\xf0\x4a\xe4\x23\xdf\x37\x2c\x38\x9d\xda\xcd\x43\x14\x4f\x67\xf9\x5d\xe6\x94\x93\x87\x4a\x74\xb7\xa0\xb3\xfb\x22\x8e\x81\xc6\x28\x2c\xf4\x71\xeb\xa4\x12\x30\x5a\xf6\x10\x36\xc5\xe4\x6c\xa0\xa2\x0d\x5a\xe1\xb5\x95\x7a\x7a\x0a\xf5\x70\x8d\x40\x01\xa8\x2b\x03\xbd\xb1\xeb\xe6\xdd\x3b\x6d\xd1\x5d\x6d\xb7\x95\x36\x88\x6e\xbb\xe1\x69\xca\xf3\xf5\x47\x53\xbb\x7f\xba\xee\xdb\xb5\x3b\x1a\x91\xcc\xcb\x34\xe1\xe6\x21\x05\x1c\x80\x85\xc6\xd5\x9a\x88\x8a\x94\xd8\x90\x1d\x55\xef\x27\x21\x3d\xb8\xbc\xce\xe5\x78\x95\x95\xc4\x15\x55\x51\x44\x56\x07\xe7\x65\x3c\x48\x71\x7e\x4f\x4a\x25\x22\xff\xee\xda\x03\x07\x41\x2f\x19\x9b\xb0\x79\x22\x53\x47\xdf\xaa\x1a\x43\xd9\x39\xd8\x11\x20\xd8\xaa\x33\x12\xfa\x22\xea\xa3\x20\x1e\x75\x0f\xf7\x12\x6f\xb7\xfb\x8c\x2f\x0b\x07\xa6\x39\xe1\x65\xe9\xa1\x4a\x8a\x2e\xab\x8f\x93\xdd\x10\xbf\x44\x31\x45\x3b\xfa\x56\x8a\x8b\xc9\xba\x5e\x16\x19\x53\xab\xc4\xf5\x05\x3a\x2c\x7b\x94\xcc\xcd\xf1\x38\xb9\x44\x41\xda\x8f\xf2\x34\x48\xaf\x11\x53\x2f\x7d\xc1\xd7\x96\xb8\x83\x5f\x64\x8d\xc4\x4f\xd6\x86\x4b\x06\x4a\x57\xb7\x54\x1b\xad\x39\xce\x90\x04\xa5\x12\x37\x48\x88\xff\x06\xba\x8d\x24\x45\x51\x1c\xe3\x14\xa2\xcf\x26\xb3\x1c\x04\x08\x3d\x0a\x1f\xc4\x4c\xa4\x3a\x46\x4a\x86\xec\x81\xb6\x62\x04\xa4\xe3\x1a\x3f\xb9\x46\x64\xa9\xb1\x08\x09\x24\x92\x56\x32\x29\xd3\x47\x46\x52\xc1\x48\x2a\x68\x34\xf6\xeb\xc1\x11\xcc\x27\xbd\x06\x9c\x06\x21\x1a\x24\x71\x96\x07\xb1\xde\xbc\x35\x89\x94\x3a\xc7\x6e\xc5\x9a\xc0\xfb\x34\x3a\x43\xbf\x6d\xa0\xfa\x55\x7b\x40\xff\x67\x73\x87\x31\x0a\x37\x3b\xf4\x7f\xe5\x9a\xb1\x44\xd3\x89\x45\xda\xb3\x8d\x22\xff\x82\x38\x64\xb0\x03\x3d\x44\x14\x32\xc1\xc4\xef\x25\x12\x59\x49\xbe\x32\x1b\x33\xb6\x0c\x24\x74\xda\xc6\xc7\x1d\x7a\x52\x55\x5f\x5c\x2c\x98\xdb\x45\x20\x83\x61\xfe\x6e\xe2\x8f\xed\x6f\xf6\x58\xf4\x31\xc0\x2b\x82\x25\x56\x1a\x09\x65\xc1\x29\xaf\x12\x88\xcc\x28\x7d\xff\xc1\xc8\x64\x92\xe0\xad\xcc\x0d\x3e\xf6\x50\xd1\xc3\x60\xa8\xff\xa7\x47\x0f\x9b\x23\xa6\x2e\x22\x22\x12\x1e\x5a\xd0\xd0\xdc\x08\x62\xee\x1a\x73\xa3\x88\xb9\xab\x3e\x50\x24\xb1\xbb\x73\xbb\x1e\x55\x4f\xc3\x78\x5b\xf6\x63\x22\x5d\xec\xda\x83\xa3\x95\x06\x1c\x2b\xe5\x98\xf2\x58\x69\x40\x0b\x09\x85\x4b\x1a\xfc\x92\x49\xa0\xb2\xe4\x0c\x39\x36\x09\x06\xf6\x4b\x22\x71\xf0\x77\x18\xc1\xbd\xfa\x5b\x2b\xcc\xaf\x3a\xad\x97\x96\xd7\xe3\xa8\xff\x92\xa0\x12\x82\x6d\x6b\xa6\x7d\xc5\xf1\xe0\x25\xd8\x34\x5a\xde\x53\x37\x4b\xed\xc3\x24\x6c\xcf\x37\xbe\xcb\x46\x41\xa3\xad\x83\x24\x2f\x1b\x3a\xb8\x6c\x14\xb4\xfd\x86\xf9\xb2\xb9\x6e\x29\xd9\xd4\x5e\xa5\xd1\x14\x4f\x42\xbf\x53\xb7\xda\xfe\x29\xaf\xa6\xfd\x2f\xe1\x50\x6f\x07\x5f\x4c\xbf\x84\xc3\xb2\x7b\x07\xb5\xeb\x49\x88\x5f\x0e\x86\x7d\xeb\xeb\x3c\x75\xbc\x7e\x79\x3e\x0e\xc2\x49\x10\xdb\x3e\x27\x76\x60\x78\xa0\xbf\x9e\x06\xe1\xcb\x20\xce\xa2\xab\x57\x0d\x7d\x10\xc8\xa7\x28\x4b\xfc\xba\xdf\xd0\x47\x9c\x7d\x7a\xb5\xf6\x6a\x4d\x9f\x21\xf2\xe9\x0f\x9c\x26\xcc\xf5\xda\xf2\x35\x76\x7c\xa3\x3a\xb2\x97\x23\x7c\xa5\x7d\x08\xb0\x4e\x5c\x34\xee\x46\x68\xbc\x4f\x07\xfa\xe4\xa6\x41\xbf\x1f\xe5\xd6\x97\x2f\xc7\xf8\x3c\x18\x5c\x3f\xf4\x1d\x90\x58\x3d\xf0\xa4\x2f\x1a\x78\x59\xac\x15\xf1\xc8\x96\x08\x3c\x93\x95\xa1\x99\x85\xb2\x75\x20\x7e\x37\x5a\xe2\x37\xa1\x7a\xfe\x9b\x10\xbb\xf8\x4d\x7f\x15\xa4\x5d\xd8\x97\xc2\x2f\x46\xc8\x14\x03\x4a\xbf\xc6\x1d\x16\x45\x87\x53\xab\xf4\x94\xa7\xea\x93\xa0\xcd\xe2\x6d\xa2\xd4\x20\x94\x48\x9b\x95\x09\x50\xbc\x11\x74\x27\xbf\xa1\xe4\x26\xde\xc8\x54\x26\x5e\xc6\xea\x2b\x89\xa6\xe0\x99\x90\x12\xfc\x28\x28\x88\x8e\xca\x80\x0d\x14\xa3\x17\xe9\x37\x27\x93\x45\x15\x91\x8a\x02\x52\xe6\xb5\x8b\x2b\x26\xdd\xa1\xd8\x58\x97\xba\x6d\xdf\x2b\xd7\x26\x7b\x2a\x5d\x75\xdb\x2d\x4f\x21\xbc\x6e\xbb\xed\x15\x13\xdf\x6d\x77\x3c\x75\xf4\xba\xed\x35\xfd\x46\x58\x27\xe5\x6e\xa7\xee\x31\x6a\xed\x76\x00\x1f\x41\x29\xdd\x4e\xc3\x93\x69\xa5\xdb\x69\x79\x36\x6a\xe9\x76\x9a\x9e\x4c\x21\xdd\x4e\xdb\x93\xe9\xa7\xdb\x01\xbc\x14\x9a\xe9\x76\xd6\x3c\x9d\x6a\xba\x9d\x75\x4f\xa7\x9b\x6e\xe7\x95\x67\x10\x49\x77\xad\xee\x59\xc8\xa9\xbb\x06\xf8\xb3\x25\xd1\x5d\x03\xec\x19\x69\x74\xd7\x5a\x9e\x41\x1c\xdd\x35\x40\x9c\x90\x51\x77\x0d\x70\x2e\xd6\x59\x77\xad\x23\x5f\xa0\x7b\xc5\x92\xed\xae\xf1\xab\x75\xb2\x98\xbb\x6b\xaf\x3c\xbe\x54\xbb\xeb\x75\xaf\x58\xc2\xdd\x75\xdf\x2b\x16\x77\x77\x1d\xd0\x29\x28\xb8\xbb\x0e\x8d\x0b\x46\xd3\x5d\x6f\xdd\x9c\x79\x9d\xfa\xe3\xe5\xc1\x5f\x7f\x79\xd0\x1b\xe1\xc1\x17\xd2\x29\x58\x29\xd4\x0d\x88\xa6\x39\xcb\x66\x53\x32\x30\x98\xc5\xa7\x96\xfa\x0d\x72\x3c\x0d\x69\x8e\x7e\xd8\x40\xcf\x39\xe4\xe7\x16\x8b\x10\xe1\xa4\x71\x8f\xd7\x15\xa5\xe6\xf8\xa2\x9d\x23\x3c\xc4\x29\x86\x83\x5e\x1a\x9d\xc3\x99\x2c\x8a\xa3\xbc\x00\x93\xcd\xa6\x38\x05\xd5\xf5\x86\x96\x9e\x43\x82\xb2\x39\x3b\x9f\xe0\x38\xd7\x0a\xa0\x3c\x41\xa3\x20\x0e\xc7\x58\x19\x37\x19\x76\xdf\x0a\x59\xb1\xa9\x81\xaa\xa6\x3b\xa0\xa4\xfb\xa6\xb1\xe4\xa9\x09\x54\x14\xe7\xeb\x92\x86\x7e\x28\xd7\x17\x8a\x09\x75\x76\xcc\x63\x7e\x51\x83\x2a\xe1\x3f\x11\xa8\xf0\x42\xc6\x46\x39\x44\x58\x11\x4b\x68\xfa\x2f\x80\x74\x11\xe1\x4b\x17\x8a\xce\xe6\x25\x84\xf7\x38\x0a\xe8\xeb\x57\xb5\x3c\x27\x38\xc0\x12\x74\xc6\xbc\xfa\x0f\x64\xcd\x09\xdb\x11\x58\x74\x76\xe0\x46\xd5\x25\xa3\x15\x27\x56\x7e\xc7\x8e\x96\xbb\xa5\xc5\x6a\xec\xc5\x79\xb3\xb1\x68\x13\x8b\xd5\xd8\x19\x27\xc1\x6d\xaa\x74\x5a\xf0\xbe\x28\x7f\x4b\x52\x5a\xa1\x14\xec\x21\xf9\xd5\x75\x8e\x0f\x20\x39\x90\xf1\xda\x96\x77\x59\xa1\xbf\x5d\xba\xe8\x8a\xb6\xaa\xac\x88\xa2\xf4\x62\x2a\x84\x02\xda\x5b\x81\x1b\xda\xb0\xe3\x6c\xd1\x2c\x6c\x5f\xb1\xec\xab\xd7\xb9\xcd\xf8\x79\x21\x77\x41\x1b\x2a\x8b\xe4\xd3\x2e\xea\x9f\x46\x67\xb7\x4a\x9e\x5d\x98\x73\x47\x7f\x60\xaa\xaa\x2d\x1c\x47\xd5\xa2\x82\xb1\x16\xa9\x2d\x3c\xc4\xdc\x08\x6d\x1d\x51\xe6\xdb\x9a\xf5\x8c\x8c\x26\x79\x4d\xe0\xa1\x98\x48\x7d\x32\x33\x37\xdb\x0d\xa6\xd3\xf1\x35\x6b\x38\x48\xcf\x67\x84\x85\x67\x65\xfe\x8a\x8c\x5f\xaf\x4c\xd3\x24\x4f\x08\x8e\x32\xe7\x2e\x33\x9c\xd0\x77\x1f\xbb\x82\xa5\xe3\x3f\xca\x3a\x7f\x8d\xac\x03\x01\xa3\xff\x82\xb8\x44\xd6\x9c\x4a\x15\x4c\x24\x60\x8b\xa5\xf7\x78\x28\x2f\x74\xeb\xa4\xca\x09\x63\x16\x52\x49\xaa\xba\xd4\x6e\xfe\x6c\x92\x9e\x8b\xaf\x74\x5a\x76\x2e\x72\x42\xd8\xc4\x06\x1d\xbe\x95\xa0\x9f\xd1\x1f\x59\x14\xb3\x60\xac\x84\x65\xd4\xaf\xfc\x3a\xfb\x5b\x42\x5f\xd5\x34\xbe\x6c\x79\xd5\x96\xac\x16\xea\xfb\x5b\x6d\xcd\x9a\xc2\x66\x00\xa2\x7b\x4d\xa2\x0d\x36\xaa\x16\x03\x10\x9e\xf6\xa6\xf4\x76\xac\xd0\x04\xdb\x73\x15\x9f\x9a\x9c\xb4\x7e\xd5\x59\x6b\xb5\x1b\xcd\xba\xef\xa1\xfa\x15\x1e\x0e\xc2\xa0\xbf\xfe\xca\x92\x57\xb1\x7e\xf5\x6a\xbd\x1f\x84\x83\x21\xf6\x60\x60\x9a\x8d\x76\x6b\xad\xa3\x96\x3b\x73\xde\x88\x69\x69\xf4\xe4\x5e\xec\x8b\x4c\x7a\xb6\xbd\xeb\x32\x98\x22\x0c\xee\xd5\xf3\xf7\x10\xbf\xe3\xde\x31\xdc\xd7\xd7\x7c\x36\x28\x12\x9f\x09\x3c\x9e\x5e\x10\x45\x8e\x08\xbc\xfb\x9f\xa5\xd2\xfb\xa7\xfc\xe1\xcc\xe6\x12\x22\x7d\x26\x04\x67\x16\x20\x7f\xb5\x5a\x4d\x82\x49\x3d\xc5\xd1\x57\x24\xbf\x84\xbd\xae\xb5\xa4\xf9\x88\xa3\xaf\x15\x01\x36\x5a\x4b\x16\x80\x10\xca\x58\x71\x49\x37\xc1\xdd\xcd\x38\x64\x57\xb9\xa1\xb0\x5f\xf7\x2b\x43\x5a\x47\xd2\x98\xa2\x65\x54\xd7\xc5\x07\xa5\xb4\xaf\x95\xf6\x4b\x4b\x37\xb4\xd2\x8d\xd2\xd2\x4d\xad\x74\xb3\xb4\x74\x4b\x2b\xdd\x2a\x2d\xdd\xd6\x4a\xb7\x4b\x4b\x77\xb4\xd2\x9d\xd2\xd2\x6b\x5a\xe9\xb5\xd2\xd2\xeb\x5a\xe9\xf5\xd2\xd2\xaf\xb4\xd2\xaf\xca\x67\xa7\xae\xcd\xce\x9c\xc9\xf4\xb5\xe2\xe5\xb3\xe9\x37\xb4\xe2\xe5\xd3\xe9\x37\xb5\xe2\xe5\xf3\xe9\xb7\xb4\xe2\xe5\x13\xea\xb7\xb5\xe2\x6d\x83\x1b\xac\xae\x12\x86\xfc\x25\x8a\xcf\x49\xd5\x28\x18\xf7\x6d\x62\x73\x40\xb6\x81\x53\xeb\x40\xf5\xe1\x93\x75\x50\x06\xf0\xc9\x3a\x00\x21\x7c\x6a\xda\xd0\xe9\x15\x77\xd0\xea\x37\x82\xc4\xce\x4e\x2d\xf0\x50\xdf\x43\x03\x0f\x85\x9e\xb4\x40\x3d\x84\xd6\x3c\xb2\x85\xd6\xcf\x74\xde\x10\xd2\x7a\xa1\x87\x44\xd5\x62\x84\x3c\x84\xfc\x86\x87\x4e\x4e\x7d\xa3\xde\x80\xd6\xa3\x2d\xd1\xaa\xc5\xa2\x25\xf5\xd6\x48\xbd\x86\x51\xaf\x4f\xeb\x09\x24\x03\xa9\x5e\xd3\x43\xa8\x01\xed\x35\x8d\x7a\x65\xfd\x6b\x89\xfe\xb5\x16\xea\x5f\x5b\xf4\xaf\xbd\x50\xff\x3a\xa2\x7f\x9d\x85\xfa\xb7\x26\xfa\xb7\xb6\x50\xff\xd6\x45\xff\xd6\x17\xea\xdf\x2b\xd1\xbf\x57\x0b\xf5\xcf\xaf\x7b\xac\x7f\xbe\x49\x30\x65\x1d\xf4\x7d\x8f\x75\xd0\x37\x29\xa6\xac\x87\x04\x4b\xda\x43\xdf\x24\x99\x52\x12\x6d\x7a\x9c\x44\x4d\x9a\x29\xed\x63\x4b\xf4\xd1\x24\x9a\xd2\x3e\xb6\x45\x1f\x81\x6a\xcc\x4e\xbe\x7b\xe7\xe8\xa4\x87\x50\x9b\x76\xd2\xa4\x9b\x90\x56\xb4\x76\x92\xd0\xdb\x2b\x5a\xd1\x24\x9c\x01\xad\x68\xef\xa4\xef\x21\xd2\xd1\x93\x53\xdf\xa4\x9c\x3e\xad\x68\xed\x24\xe1\x18\x8d\x3a\x54\x34\x49\xa7\xac\x8f\x6d\xd1\xc7\x86\x9d\xd7\xb8\xfa\x48\x68\x8e\xf6\xb1\x61\x67\x36\xce\x3e\xb6\x79\x1f\x1b\x76\x6e\xe3\xea\x63\x4b\xf4\xb1\x61\x67\x37\xae\x3e\xbe\x2a\xfa\x68\xe7\x37\xce\x3e\xb6\x44\x1f\xed\x0c\xc7\xd5\x47\xc2\x18\x59\x1f\xed\x1c\xc7\xd5\xc7\xf5\xa2\x8f\x76\x96\xe3\xa4\xd5\xa6\xc7\xfb\x68\xe7\x39\xae\x3e\x36\x04\xad\x36\xec\x4c\xc7\xd5\xc7\x35\xd1\xc7\xa6\x9d\xe9\xb8\xfa\x48\x96\x3f\xed\x63\xd3\xb7\x2f\xc8\xdd\x5d\x37\xb1\xb6\x00\xd7\xa6\x9d\xeb\xec\xee\xda\x3b\x49\x86\x95\xac\xad\x93\xd3\xa6\x9d\xeb\xec\xee\x96\x2c\xc8\x0e\x54\xb4\x73\x9d\xdd\x5d\x47\x27\x5b\x1e\x6a\x34\xa1\xa2\x49\x3a\x65\x7d\xf4\x8b\x3e\xda\x99\x8e\xab\x8f\xad\xa2\x8f\x76\xa6\xe3\xea\x23\x4c\x24\xed\xa3\x9d\xe9\x38\xfb\x58\x17\x7d\xb4\x33\x1d\x67\x1f\x9b\x1e\xeb\x63\xcb\xce\x74\x5c\x7d\xac\x8b\x3e\xb6\xec\x4c\xc7\xd5\xc7\xa6\xe8\x63\xcb\xce\x74\x5c\x7d\x24\xac\x9c\xf6\xb1\x65\x67\x3a\xae\x3e\xbe\x12\xf3\xd8\xb2\x33\x1d\x57\x1f\xc9\xf2\x60\x7d\xb4\x33\x1d\x27\xad\xb6\x39\xad\xb6\xec\x4c\xc7\xd5\xc7\x46\xd1\xc7\x35\xfb\x82\xdc\xdb\x73\x0b\xaa\x1d\xda\x49\x3b\xd7\xd9\xdb\xb3\x77\x12\x68\x0e\x78\x40\xcb\xce\x75\xf6\xf6\x4a\xc4\x80\x36\x88\x80\x76\xae\xb3\xb7\x67\xef\x24\xe1\x1d\x0d\x18\xd6\xb6\x5d\xd4\x71\xf5\x91\xcc\x07\xed\x63\xdb\xce\x74\x5c\x7d\x6c\x8a\x3e\xb6\xed\x4c\xc7\xd9\xc7\xba\xe8\xa3\x9d\xe9\xb8\xfa\xe8\x17\x7d\xb4\x33\x1d\x57\x1f\xd7\xc5\x3c\xb6\xed\x4c\xc7\xd5\x47\xa0\x39\xda\x47\x3b\xd3\x71\xf5\x11\x44\x72\xda\x47\x3b\xd3\x71\xf6\xb1\xe9\xf1\x3e\xda\x99\x8e\xab\x8f\x2d\xd1\xc7\x8e\x9d\xe9\x38\xfb\xe8\xf3\x3e\x76\xec\x4c\xc7\xd5\xc7\x86\xe8\x63\xc7\xce\x74\x5c\x7d\x7c\x25\xe6\xb1\xd3\x34\x17\x24\x5c\xa3\xe4\x38\x9d\xe0\x30\x0a\x72\xe6\x54\x06\xee\x0a\x6a\x39\x72\xc4\x45\x1b\xa8\x06\xff\x2e\xa3\x40\xd7\xb0\xd2\x32\x3e\x2b\xe3\x93\x32\x7d\x7b\x99\x06\x2b\xd3\x20\x65\x06\xf6\x32\x4d\x56\xa6\x49\xca\x84\x86\x36\x57\x53\x55\xee\x58\x2c\x75\x17\x0c\x68\x0b\x99\xd2\x45\x36\xdd\x20\x0f\x6c\x07\xf3\x20\x0f\x44\x28\x9f\x20\x0f\xdc\xca\xb1\xf8\x6d\x94\x67\x27\x49\x1e\x8c\x05\xcc\x78\x2b\xc8\x03\xea\x41\xf2\x02\xad\x5b\xa0\x43\x9d\x0f\x78\x98\x73\xe8\xc2\xe3\x04\xca\x1b\x9d\x71\xa6\xbc\x12\x68\x9e\x16\x20\x7f\xfa\xe9\x27\xd4\x86\x8b\xb7\xfa\xd5\x7a\xbd\xb8\x6f\x2b\x4a\xfc\x0b\x35\x1b\x06\x71\xa8\x7d\xd9\x45\x1b\x08\xd4\xee\xc3\x71\x92\xa4\x35\xa9\x93\xab\x8a\xee\xdd\xd5\x39\x28\xfb\x01\x6d\x48\x4f\xfa\xc2\x11\xa8\xd7\x6a\xb5\x02\xb7\x65\xd4\x69\xd1\x7c\x69\xaf\x20\x98\x68\x6b\x89\x2a\x6c\xec\xfa\x59\x5e\x95\xe1\x5c\x28\x67\xe5\xb7\xd5\xb5\xb3\x26\x38\xa6\x9a\xd5\xc1\xcd\xd3\xcd\x1a\x5c\x62\x91\xce\xb6\xaa\x74\xf6\x83\xb5\xb3\x1f\x6e\xdb\xd9\x0f\xd6\xce\x7e\xa8\xda\x59\xb3\xb7\xb2\x13\x55\x4d\x74\x9f\x07\x9b\x82\x9c\x7a\x76\xff\x41\x30\x78\xa7\x6e\x0c\xe0\xa3\x68\xf3\xa4\x2a\xcd\x2b\x3f\xc7\x1b\x52\xd1\x79\x5b\xc8\x77\x97\x19\xc6\x3b\xbd\xdf\x16\xba\xf7\x70\x5c\x71\xa1\xb2\xeb\x7f\x81\x09\x5c\x61\xec\x9e\xda\xef\x2e\x76\xd9\x2d\x59\xad\xb6\xab\x5c\x4b\xec\x2e\x7c\x1f\x41\x69\x61\x57\xb9\x8b\xd8\x75\x5e\x42\xcc\xbf\x71\x38\x62\xb9\x81\x61\x0e\x59\x04\x9e\x10\xc6\x54\x2d\x5a\x21\x59\x39\xb8\x21\x94\xb2\x7a\x50\xb0\x82\x53\xa6\xb8\xa1\x83\xc7\xe2\xfa\xdf\xd8\x78\xe1\xf3\x67\x83\x16\x5c\xde\x95\x3c\x82\x06\xf9\x6a\xf7\x70\xa0\xbf\x04\x92\x9a\xea\xeb\xca\x43\x99\x87\xd4\x2b\x34\xe0\x93\x68\x03\x05\x68\x19\xd5\x6a\x7d\xf4\x23\xdd\x1c\x6b\xff\x97\xfc\x0c\x97\x08\x1b\xb8\x42\xcb\x28\x97\xda\x13\x01\x8b\x63\x32\x4d\x19\x5d\xa9\x34\x4e\x79\xb3\x81\x5e\xa2\x6c\x09\xaa\xf5\x35\xa3\x37\x81\x95\x76\xfe\xaf\x86\x15\x6c\xc7\xb5\x01\xfa\x11\xfd\xdf\x87\xc1\x4a\x3b\x04\xcd\xc5\xaa\x8f\x7e\x43\x03\xf4\x1b\x41\xec\xfe\x91\xd1\x04\xc0\xb9\xc8\x10\x44\x6a\x7d\xf4\xf5\x9e\x07\x47\xbe\xad\x3e\x76\xa5\x49\x9f\x9b\x78\xbf\x4a\x90\x35\xee\x27\xa6\xb9\x28\xc2\x6a\x30\xc1\x38\x9c\xc5\x1c\xa5\x6f\x1b\xd6\x8c\xad\x4b\x61\xe4\xb2\xbf\xd5\xb6\xf8\x7e\x95\x97\x37\x1d\xbe\x8a\xf8\x62\xca\x65\xbe\x9a\x91\x7f\x7f\xab\x6d\x35\x19\x70\x4e\xc2\x9c\x5c\xf5\xf7\x35\x05\xb7\x0a\xed\x30\x7f\xe2\x64\x2f\xbf\xfb\x98\x38\xea\x54\x26\x26\x62\x77\x12\x0c\xc8\x64\x28\x99\xe1\xcd\xf9\x60\xc5\xcc\x39\x29\xb2\xd9\xd3\x79\x29\xcd\xc0\xce\x22\x5b\x3b\x2c\xa0\x1a\x7f\x6b\x17\xb3\x7f\x7e\x4c\x36\xba\xd8\x5e\xb0\x38\x43\x68\x07\xe3\xb0\x1f\x0c\xbe\xb0\xb8\x9a\x93\x24\x84\x25\x45\x68\x46\xcc\x37\xbc\xec\xed\xbc\x25\x22\x90\x45\x3c\x00\x33\x27\xf8\xaa\x58\xcb\x81\x85\x0b\x6d\x65\x9f\x00\x60\xc6\x3c\x62\xd5\xf7\x76\xde\xae\x6c\xc7\x34\x56\x39\x18\x50\xed\xbc\xb5\x18\xfc\x4c\x1d\xe6\x32\xcc\xcc\xb0\xc4\x64\xc6\x2d\x9a\xb2\x10\x54\x5c\x20\xa1\x8f\xb6\x7b\x66\x29\x94\x07\x2d\x24\x87\xf2\x50\xcb\xf3\x18\xe5\xef\xf1\x75\x96\xa7\x38\x98\x6c\xc6\x21\xeb\x9d\xc5\x3a\x32\x61\x66\xb1\x02\x9c\xc7\x1a\xb0\x09\xd9\x47\x78\x82\x21\xc8\x38\x18\x63\xd2\x79\x62\xb1\x32\xc1\x7f\x3e\xc6\x57\x39\x7d\x6d\x17\xdf\xf1\xc5\x5b\x16\x33\x15\x5a\x5f\xc9\xc6\xd1\x00\xd7\x38\x0a\xe2\xa6\x5e\xe0\x62\xb3\x9f\x54\x66\x6d\x0b\xff\x53\x66\xed\x0e\xa3\x0b\x86\xc3\xa3\x28\x5b\x78\x6c\xbf\x19\xdd\x9c\x14\x1d\xea\xe3\x41\x32\x61\x5e\xf7\x84\x20\xa2\x64\x96\x55\x23\x19\xd1\xc5\x4a\xe2\x78\x49\x6f\x6a\x73\xbb\xa0\xf9\x46\x98\x07\x36\x38\xef\x5d\x14\xc1\x5a\x2e\x5e\xab\x46\xe3\x72\x38\x66\xda\x7c\xf1\x19\x32\xbb\x5e\x58\x8f\x34\xa2\x34\xda\x40\xd1\x05\x9b\xc2\xba\x63\x25\x26\x17\x18\xed\xfd\x0c\xe7\xcf\x6c\xd6\xcf\xf0\x7f\xcf\x70\x9c\x97\x9c\x9e\x01\x5f\xe1\xc0\x30\xd7\x00\x5a\xc7\x47\x9b\x10\x73\x12\xc8\x1f\xa3\x72\x4c\x07\x1a\x0a\xd6\x04\x10\x0f\xa9\x5d\x59\x5d\x45\x6c\x46\x8a\x77\xd6\x6c\xb9\xe5\x51\x63\xa8\xe9\x79\x61\x21\x08\x91\x60\x44\xa3\x70\x8e\x36\xe8\x85\x61\xc1\xc5\x89\x9d\xb7\x65\x06\xd7\x7c\xd3\x59\x24\x4e\x5d\xa7\xf9\x28\x7c\x7c\xef\xc2\x07\xfa\xcf\x69\x8a\x33\x9c\x5e\x60\x2a\x86\x24\x33\x22\xca\x4b\xe2\x07\xa8\x31\x82\x3c\xea\x8f\x19\x07\x46\x5b\x29\x7a\x9b\x46\x41\x8c\xde\x51\xf7\x4c\x34\x8c\xc6\x18\xc7\x83\x95\x01\x80\xe0\x21\x9f\x21\x02\xb6\x46\x3f\x27\x47\x50\xe4\xbf\x82\x18\xed\xa6\xb3\xfe\x35\xfa\x7d\x44\xfe\x59\xb9\xc4\xfd\xff\x3c\x9f\x04\xd1\x78\x65\x90\x4c\xec\xf2\xce\xc9\x11\x6f\xae\x44\xec\x91\x0b\x55\x96\x7e\x9e\x14\xf9\x5e\xe2\x01\x39\x28\xd0\x94\x49\x4f\x9f\x3c\x21\x83\x0e\xa4\x27\xd2\x21\x81\x92\x88\x2a\x85\x96\x60\xd6\xe9\xaf\x3f\xd1\xea\x6a\x72\x81\xd3\xe1\x38\xb9\x24\x75\x60\xe3\xf3\x79\x3a\x50\x52\xcf\xef\x2c\xfd\x48\xca\xbe\x16\x9f\x1b\xf2\xe7\x75\xfd\x6b\x93\xed\x61\xac\x31\xc0\x13\x50\x21\x60\x45\xbb\xab\xab\x88\x37\x8b\xfa\x3e\x29\x02\x28\x43\xd3\xf5\xd7\xa2\x4a\xa3\xa8\x22\xca\x3c\x01\x04\x68\x21\x5a\xaa\xa9\x96\x62\xc5\x9e\x00\x2a\xac\xdc\x0d\xfc\x97\x10\xa4\x5c\x62\x79\xb9\xdf\x94\xbe\xc3\x7f\x78\x19\x5a\x64\x79\xb9\xdf\x78\xfd\xd4\x5d\x60\x79\xb9\xef\xb3\xef\xe4\xbf\xd0\x71\xde\x28\x3c\x2c\x6f\x40\xcf\xdf\xbc\x61\xf9\x20\xe5\xd7\x0d\xaa\x02\x54\xde\x32\x84\xcc\x96\x44\xb5\xfa\x55\xdd\x67\x5a\xbf\xa2\x28\xe3\x7a\xa4\x10\x79\x79\xa3\x53\x07\x5b\x1e\xb5\x01\xfd\x57\xa5\x11\xf6\x92\xde\x20\x71\x52\x2a\x5e\x2e\x31\x82\x91\xa6\x60\x75\x15\x91\x5d\x02\x6e\x62\x50\x24\x2d\x24\xba\x78\x8c\x95\xf6\x3c\x43\x00\x2f\x43\x49\x3c\xbe\xa6\xcb\x71\xeb\x97\x83\xa3\x2d\xf4\x3b\x7a\x83\xd6\x01\x26\x6f\xd0\xb7\x61\x41\xef\xe2\xd4\xce\xb2\x6f\xbc\xbf\x7c\x2d\x29\x67\x01\xb1\xae\x56\x1c\xaf\xff\x42\x99\x73\x51\x91\xd3\x28\xae\xc9\x30\x66\xab\x8c\x27\x8a\x66\xf9\x80\x19\xa8\x97\x49\x3c\xc8\x2d\xf5\x80\xd0\x60\x6f\xa4\x5c\x06\x42\xb7\x90\x83\xd0\x7c\x59\x88\x4b\x07\x84\xb0\x4d\x9a\xa7\xac\xe8\x89\x2e\x1a\xb1\xcf\x12\xae\xaa\xea\x79\x11\xa1\x08\x39\x04\x23\x74\x3b\xe1\x08\x2d\x28\x20\x21\x55\x9e\x33\x0f\x5d\x05\xdd\xcb\x67\x2f\xb1\x34\x5e\x6b\x92\x95\x28\x2e\x09\x58\x4e\x11\x4b\x2a\xbc\x80\xa4\xd5\x7a\x94\xb4\xbe\x77\x49\xcb\x21\x5f\x39\xd4\x3b\x27\x47\xe5\x72\xce\xa2\xea\x1d\x0b\x4b\xd7\x79\xf9\x23\x13\xff\xe7\x31\xf1\xd2\xd3\xec\x03\xb0\xec\xbd\x78\x90\x62\x88\xdc\xc0\x80\x6b\x20\x99\x1c\x52\x4c\xee\x4b\x44\x8d\x69\x1c\x5f\xe0\xb6\xfc\x2b\xaa\xff\xad\x36\x87\xaa\xbb\xc2\xfc\xf3\x36\x29\xb3\xc0\x2e\xd0\x7e\xdc\x05\xfe\x16\xbb\xc0\xf6\x18\x0f\xf2\x34\x89\xa3\x01\xea\x25\x21\xee\x27\xc9\x7c\x85\xff\x76\xaf\x4c\xe1\x4f\xbf\x2e\xb4\x23\x6c\xf7\x54\x85\x3f\x79\xbe\xaf\x1d\x40\x66\xed\x2a\x03\x51\xeb\x95\x69\x31\x09\x3e\xca\x42\x7a\x28\xfc\x42\x7c\x2b\xfc\x78\xea\xa5\xde\x7c\xbd\x19\x94\x59\x60\x1d\xff\xbd\x93\x23\xff\xcf\x59\xc7\x07\xb3\x7c\x3a\xcb\xab\x5f\xda\x1d\x94\x5e\xda\x1d\x2c\x7e\x69\xa7\x4b\x75\x07\xda\x25\xde\xc1\x5f\x7b\x1d\xf4\xe0\x52\x9d\xa9\x9b\x17\x6f\xee\x57\xb2\x2b\x69\xe8\x7b\x91\xee\xfe\x49\x27\xec\x03\xed\x5a\xd3\x25\x44\x1d\x54\xb8\xb4\x38\x58\xf0\xd2\xe2\x31\x8b\xdd\xdf\x83\xf9\x6e\x7e\x3c\xde\x43\xbf\xae\xbc\x6a\x34\xb9\x81\x38\xca\x72\xb2\xbc\xcf\xaf\x0d\xee\x3b\x0d\xc2\x95\xcd\x38\x8b\x7e\x25\xa5\x45\x2e\xb8\x69\x10\xca\xec\x2f\x0c\xf2\x40\xba\x08\x75\x5d\x80\x66\xea\x0d\x28\xa9\x75\x5c\x18\xfc\x2a\x06\xc0\xaf\xd5\xa2\x7d\x3d\xad\x48\xdf\x95\x50\x04\x88\x62\x16\xe7\xa2\x67\x5a\x30\x2b\xb0\xc5\x3b\xa4\xdf\x0c\x60\xf4\xc5\x4b\x15\xb3\x7f\x69\xdf\x8d\xd6\x68\x4c\x9b\x71\x90\xd1\xc8\x59\x68\x9a\x64\x91\xea\x81\x4f\x1a\x25\xdf\x49\xfd\xc3\x84\x77\x56\xb4\xb0\xac\x61\xf4\x12\xf9\x5a\x23\x87\x41\x58\x3c\xc3\x40\x89\x6c\x23\xea\x6b\xca\x4a\xe4\xb6\x8a\x90\x5a\x6a\x23\x45\x48\x2d\xb9\xb4\x2d\xb8\x96\x6a\x99\xbd\xac\x01\xe2\x76\x88\xdc\x02\x77\x16\x5b\x88\x43\xa7\x88\x77\x38\x97\x12\xce\x2b\x53\x45\x15\xf8\x62\x34\xcb\x67\x4e\xea\x73\x4d\x45\xf3\x25\x39\xfe\xb2\xbe\x17\x17\x41\x12\x0a\x6c\x5f\x31\x3c\x24\x34\x30\x8e\xde\x3e\x7d\x72\x63\xe5\x9b\x7c\xb9\x5c\xbd\x6a\x34\x17\xe2\x9d\x77\x4b\x4c\xf6\xc8\x3b\xbf\x15\xef\xdc\x3b\x3e\x40\x10\x12\xb7\x1a\xeb\xdc\x63\x01\x74\xef\xca\x3a\xff\x72\x76\x58\x2c\x89\x39\xfc\xd0\xc2\xaa\x68\x3a\x00\x7b\x04\xba\x95\x34\x88\xc3\x64\x52\x33\x38\xe0\xd2\xd2\x8a\x26\x29\x95\xc3\x61\xa9\xc3\x4e\x0d\x2e\xd7\x68\x9d\x79\x04\xdc\x23\xa3\xd2\x19\x15\x27\xce\x85\x18\xd5\xdf\x3b\xf3\xc2\xff\x28\x46\xb5\xba\xb7\xdd\x43\xaf\xd6\x5e\xad\xbd\xf4\x11\xa3\x0d\xb4\x8f\xf3\x51\x12\xa2\x86\x8b\x5b\x41\x68\xef\xdb\x72\xab\xcd\x30\xa4\xfe\x83\xea\x82\xa8\xc0\x05\xf8\xea\x25\xb5\xe9\x1f\x5f\xb4\x4a\x03\xff\x07\xa7\x09\xe4\x0e\xcb\x47\x18\xa5\x38\x93\xf8\xa2\xd2\x11\x52\x8e\xf5\x98\x3c\x1b\x78\xdf\x8a\x17\xb0\x85\xf8\x07\xc3\x41\x5d\x8d\xce\xe6\x01\x34\x85\x67\x5f\xd8\x49\x8c\xd1\x24\x49\x31\x15\x1e\x5f\xbe\x84\xbe\xb9\x46\x91\xaf\xf7\x97\x2f\x2b\x2e\x70\x98\xcf\x45\x16\xf8\xda\xdd\xa2\x9c\x3f\x2e\xf0\x6f\x76\x8a\x43\x71\x92\x4c\xab\x89\x21\x1f\x39\x39\x3a\x57\xb6\x20\x76\xf7\x9a\x28\x8a\x94\xd1\x9c\x68\x6a\x21\xa2\xbb\x5b\xb8\xd9\x47\xa2\xfb\x56\x44\xf7\x7f\x24\xe6\x57\x4e\x72\x12\x0f\xfc\x0b\x85\xdf\xca\x07\x67\xf9\x7c\x6b\x08\xc0\xb5\x5a\xb9\x08\xbc\x84\xbe\x7e\xd5\x5f\xdd\x6a\x8b\xb1\xf7\x78\x7e\x5c\x81\xd5\x55\xf4\x89\xc0\x57\xeb\x45\x46\xa4\x00\xd0\x2c\x88\x32\x97\xa3\x68\x8c\x51\xed\x87\x5a\xe1\x6b\x5d\xc4\xe0\x06\x8f\x43\x23\xe6\xb6\x30\xe1\x34\x14\x99\x91\xd8\x92\x90\xaa\xa2\xd4\x1d\xbb\x21\x1e\x6f\x95\xdd\x4b\xa2\xa0\x85\x78\xc9\xdf\xdb\x71\xcb\x92\xa3\x8b\x26\xc9\x7a\x58\xbe\x52\x64\x42\x82\xd6\xfe\xfa\x3c\x1f\x0f\x9b\x24\xbc\x5a\x4c\x6c\x23\xe6\xb5\xf8\x72\xbc\xbb\xe9\x17\xb1\x9e\xc9\x93\xf4\xd1\x4c\x04\x6e\x73\x10\x3d\x0c\xb2\x8c\x2c\xe4\x97\x04\xb5\x10\xbd\xc7\xd7\x68\x0b\xa7\xd1\x05\xcd\x09\xb9\xc3\x07\xa5\x51\x1e\x73\xfa\xf0\xed\xfb\xad\x9d\x46\xd1\x9a\x78\xae\x98\x78\xbc\x97\xc4\xc3\xe8\x7c\xc6\x32\x51\x26\x90\x15\x32\x2b\xcb\x2f\x99\x26\x53\x9c\xe6\xd7\xe8\x4f\x7a\x2c\x06\x6f\x52\x60\xbe\x27\x23\x9a\xe3\x38\x23\x0f\x51\xcc\xd2\x05\xe4\x89\xf0\xa5\x59\x41\x5b\x78\x18\xcc\xc6\x79\x17\xb5\x50\xcd\x6f\xac\x43\x22\xe5\x25\x17\x7c\x47\x42\x73\x9c\xf2\x44\xe6\x05\x38\x32\xfe\xf3\xd0\x8c\x72\x96\x3c\x33\x03\x50\xc5\xa1\x5e\xfa\x90\x27\x68\x8a\xd3\x61\x92\x4e\x24\xe0\x0a\x64\x29\xfd\xe3\x60\x78\xde\x75\x8d\x32\xa2\x17\x5f\xc7\x10\x73\xc6\x6f\xac\xaf\x36\x1b\x5a\x08\x6e\xda\x15\x8a\xba\xf6\xa9\x40\x48\x69\xfc\x66\xa9\x2c\x21\x69\x59\x02\x79\x32\x2b\x61\x41\x5a\x7c\xbd\xcd\xcf\x22\x7a\x00\x7c\xee\x86\x74\x55\xce\x18\x4a\xc6\x6f\x60\xa3\x1b\xee\x6f\x36\x4c\x52\x38\xc5\x14\x8d\xde\x43\x62\xd0\x2f\xe1\xd0\x48\x1a\x4f\xa9\x9d\x9f\x1e\x15\x33\xac\x45\x2a\xfe\x59\x4c\xd6\x3a\x4d\x3f\x79\x67\x30\x9e\x3a\x8d\xf5\x7a\x5d\x07\x5c\x92\xbd\x7e\x30\x3c\xb7\x1b\x5e\x90\x89\xd8\x10\x3f\x39\xe1\x91\xe2\xae\x60\x18\xe6\x7a\x87\xeb\x0a\xea\x41\x57\x95\x05\xdd\x26\xdf\xec\x94\xc1\x06\x6a\xe1\x0f\x2b\x15\x2b\x67\xc1\x38\x47\x9b\xf0\xcf\xe2\x89\x68\xb9\x1b\x8d\xe4\xd7\x7e\x17\xb2\xa3\x89\xd4\xc3\xe1\x0a\x8b\x4a\x52\xe3\x9d\xf1\x00\x3f\xe7\xa4\xb2\xe2\xf2\xbc\x6a\x35\x17\xca\xed\xa2\x4e\xbd\xd5\x80\x30\xca\x1d\x49\x61\x99\x97\x3d\xf8\xee\x33\x5a\x25\xe4\x43\x79\x90\x27\x66\xc7\x6e\x96\xe8\x4e\x50\x0e\xb2\x29\x1d\x6c\x9a\x6e\xde\xd0\xe7\xd8\x42\x3d\x81\x9c\xbc\x17\x87\xf8\xca\x56\xe3\xb4\x7e\xc5\x14\x40\x96\x68\x9d\x73\x42\x74\x09\x54\x84\xb0\x2c\xde\x38\xf3\xd7\x17\xd8\xf0\x4a\xc5\x1b\x67\x25\xbe\xe5\x6d\x90\x59\x59\x61\x4f\x36\x23\x8c\x62\x6b\xa1\x45\x8b\x17\x73\x8c\x2c\xd4\x8f\x4c\x50\xd7\x3a\xc8\xe3\x22\xbd\xe1\xf8\x58\x8d\x0b\x44\x27\x59\x9e\x63\x9e\x2c\x1b\x28\xb0\x48\xe3\x5b\xf4\x5a\x9f\x33\xc4\x32\x7a\x17\xa9\x81\xcd\xef\xf3\xb3\x31\x00\x7c\x65\x88\xad\xa3\x6b\x16\x17\x59\x8c\x8a\x57\xac\xe3\x0e\x44\xf6\xc4\x18\xdb\x41\x47\x72\x34\x3b\x06\xd6\x82\x85\x62\xcb\xe1\x53\x5b\x0e\x69\xfa\x9c\xc6\x1c\x08\xf8\xb9\xd2\x04\x8c\x9e\x18\x69\xf9\xa3\x6d\xac\xab\x8c\x37\x9a\x17\x0a\xca\xd6\x59\x3e\xfa\xf2\x3b\x7b\xc0\x2a\xa9\x89\x5f\x0f\x8e\xd4\xee\x80\xeb\x94\xc5\xe3\xda\x18\xb7\xdf\xa9\x0d\xcc\xef\xdc\x06\x46\x9a\xcd\xd7\xe8\xf7\x92\xd1\x23\x7f\x45\x8d\xd3\xdf\xc1\x1c\xc6\xe8\xc8\xe9\xef\xba\x59\x0c\xff\xbb\x31\x5f\xeb\x01\xa7\xc8\x9f\xc4\x1c\x98\x6e\x1a\x1a\xb5\x4d\x89\xc6\x24\x4e\xeb\x67\xcb\xcb\xe5\x26\x45\x12\x70\xe9\xe8\xcb\xf9\x86\x25\x88\x19\xdb\xcb\x8a\x7a\x65\x06\x94\xf2\x31\xe2\x4e\x1b\x7a\x95\x60\x33\xa5\x1b\xf9\x82\x9b\xf8\x7d\x89\x96\x51\x66\x4b\xb7\x3f\x3f\x7a\x8d\x45\x34\xb8\x87\x20\x36\x54\x44\x10\x92\x21\x15\x0a\x5d\x62\xc2\x62\xd5\x3c\xe4\x90\x4d\xef\x02\xa6\x54\x36\x2d\x82\xec\x88\xa3\xa4\x4b\x80\xf1\x90\x2e\xa8\xb2\x61\x57\xc5\x62\x52\x68\x8e\xf0\x74\x53\x66\x8b\x46\xa1\xd9\x03\xf5\xe8\x29\x74\x79\x4e\xd8\x9b\x33\x6f\xed\xef\xed\x43\xbf\x40\x5a\xf7\xf9\xc9\xd1\x1f\x56\x77\xe4\x4c\xaf\xed\xca\x7a\xfd\x4f\xd0\x2e\x1d\x83\x71\x66\x8f\x1b\xef\x52\x25\x92\xfc\xb2\x4c\x8f\x24\xf0\x38\xc2\xb3\x2c\xe8\x8f\x31\x0b\x07\x26\xa1\x73\x8c\xe4\x54\x8b\x14\x8a\xfe\xe6\x1d\x52\x33\xac\x49\xdb\xc2\x11\x64\x53\x46\xcc\xd0\x96\xd9\x18\x9b\x9a\x24\x51\x1e\x62\xac\x44\x19\x0a\x10\x4d\xc0\x8c\x2e\x70\x9a\x41\xd4\xb2\x51\x90\xa3\x18\x9f\x8f\xf1\x20\xc7\x21\x61\xc3\x03\x96\x52\x35\x67\x0a\x9f\x3c\x41\xe3\x28\xcf\xc7\xf8\x25\x0d\x70\xb9\xa2\x02\xc5\x69\x9a\xa4\x28\x4c\x70\x16\x3f\xcf\x51\x30\x1c\xe2\x01\xad\x4b\x91\x7a\x9e\xa1\x0c\x0f\x66\x69\x94\x5f\x7b\xa2\x62\x7f\x96\xa3\x28\x87\x4a\xbc\x46\x94\x67\x22\xa0\x42\x34\x8e\x72\xe6\xc4\x4d\xf3\xba\x46\x84\x3f\x4f\x70\x4c\xf7\x83\xcc\xa6\x28\xa3\x03\xf2\x81\x76\x4e\xa8\xcb\xb4\xb7\xf2\xfc\xdd\x36\x69\x5b\xf9\x21\xe5\xbd\x6c\x06\xed\x3c\x60\x14\xd6\xdb\x70\x6a\xb8\x28\x3b\x2d\x44\xec\x84\x46\x76\x2f\xec\x3c\xa7\xfd\x2a\xda\x25\xbf\x2c\x89\xe3\xde\x9f\xd6\xcf\x3c\x54\x7b\x7f\xda\x3c\x63\xc1\x02\xd0\x57\xf2\xc8\xae\x02\xfc\xce\x92\x25\x89\xdc\xfb\x53\x9f\x56\xaa\xab\x95\x9a\xe5\x95\x1a\xb4\x92\xaf\x56\xaa\x97\x57\x6a\xd2\x4a\x0d\xb5\x92\x2f\x2a\xa9\x75\x6c\xd9\x91\x8c\x21\xe3\x5e\x86\xae\x41\xeb\x89\x41\xeb\xd9\x07\xcd\xc4\x47\x1a\x2e\xd6\x27\x7a\x61\x32\x1c\xf2\xb4\x83\x14\x69\x1a\x64\xb5\x5e\x27\x5f\x6c\xfd\x35\x27\xa2\xa9\x42\xf6\xad\x90\x1b\x95\x20\xd7\x9d\x03\x2f\xc1\xd0\x20\x37\x2b\x41\xf6\x5d\xb3\xe3\x49\x30\x34\xc8\x75\x0d\xf2\xfc\x89\xec\x05\x69\x7a\x8d\xfa\x7a\x3a\x55\x3a\x55\x7d\x1a\xff\xc2\xd4\x64\xe4\x74\xf2\x09\xeb\xc9\xae\xb3\x1c\x4f\xd0\x30\x99\xa5\x28\x8f\x26\xfa\xdc\x2f\x18\x94\x37\xc6\x57\xf9\x31\x59\x7d\xee\xf8\xb1\x96\x88\xb7\xfb\x49\x18\x0d\xaf\x29\x27\xa4\x74\x58\x01\x8b\x75\x37\x16\xbd\x53\xea\x38\xf0\xeb\x29\xa4\xbc\x84\x68\x2b\x46\xa6\x38\x5b\x92\xdc\x9f\x51\x86\xf3\xd9\x54\xfd\x50\xe2\xd1\x31\xff\xb0\xbf\xf7\x33\x75\xed\x28\x3b\xe1\xef\xfd\xfc\xb9\x8e\x36\xd0\xde\xcf\x66\x6a\x34\xa9\x88\x4f\x8b\xf8\xd6\x68\xc6\xf2\x92\x86\xa9\xcc\x66\xfd\x0b\x4c\x44\x05\xd7\xd1\xbf\x4e\x83\x1f\x43\xdb\x34\xfa\xf1\x57\x44\x9f\x5c\xd1\x8f\xe5\xe2\x2c\xcc\xb1\x28\x5f\x5c\x87\xda\xc3\x1c\x8b\x66\x1b\xa2\x59\x5f\x69\xd6\x9f\xd7\xac\xaf\x36\xeb\x2f\xd6\x2c\x84\xd1\x89\xea\x7c\x09\x12\x20\x51\x43\x5d\x81\xae\xaa\x4d\xa8\xda\xe0\x8b\x19\xaa\xd6\xd5\x65\xea\x98\x11\x46\xd6\x65\xac\x15\x01\xb5\xd6\xe9\xb9\x5e\x8f\xed\x4f\x3f\xfa\xf4\xa3\x6f\xfd\xd8\xa0\x1f\x1b\xd6\x8f\x4d\xfa\xb1\x69\xfd\xd8\x2a\x6b\xb3\x5d\xd6\x66\xa7\xac\xcd\x35\xd1\x66\x89\x46\xaa\x12\xe7\x41\x8b\x73\x1f\x54\x8d\x03\x21\x53\x49\x21\xfb\x11\xdd\x4b\x72\x57\xa7\xf2\x5a\x92\x3e\x2a\x71\x66\xb5\x88\xbd\x77\xee\xed\x1d\x06\xb7\xf0\x32\x03\x2e\xa4\x96\x3e\xa6\xa1\x86\x7e\x05\x22\x44\xb5\x5f\xc9\xdc\xf3\x55\x02\xcf\x62\xef\x7d\xad\x57\xf4\x69\xc5\x06\xab\xb8\xa6\x55\x6c\x3b\x2b\x36\x68\xc5\x16\xab\xe8\x6b\x15\xd7\x9c\x15\x9b\xb4\x62\xe7\x4c\xa0\xa6\x54\xf4\x8b\x8a\x77\xda\xc5\xca\xa2\xd4\x53\x44\x78\xec\xf8\x63\x96\x92\x9d\x05\x8f\x87\xc7\xdb\x44\x8f\xe7\x70\x18\x83\x13\x70\x6c\xf1\xe3\xad\xf8\x5a\x9d\xf0\x90\x94\xa3\x57\x78\xd3\x1d\x97\x7b\xd1\xc9\xd4\x2f\xec\x78\x8a\x9b\xdb\xe2\x63\x74\x41\xbf\x74\x5a\xab\xcd\x86\xae\x96\x13\xcb\x44\x10\x6c\xad\xa2\x2b\x94\xb2\x3e\x94\x2f\x92\x08\xaa\x19\xfc\x1c\x07\x17\x18\x25\xe3\xd0\xc9\x6a\x17\x90\x1f\x7a\x9f\xe9\xe4\xf6\xf4\x78\x87\x4a\x8b\xbd\x60\x3c\x98\x8d\xc9\x0a\x8b\xf1\xa5\xb3\xd9\x1e\x4b\x04\xd3\xa3\x89\x60\xea\x57\xad\xb0\x09\xff\x87\x96\xb9\x84\xa6\xe7\x6b\xe9\xb1\xbc\x30\x3d\x9a\x17\xa6\x7e\xc5\x6a\x34\x21\xa6\x7c\x8f\x0b\xa8\xf5\x25\xf4\x06\xd5\x7a\x9f\xa5\xe7\xff\x40\x3e\xea\xa2\xfa\x92\x09\xb1\xc1\x20\x36\x28\x44\x06\xb0\xc5\x20\xfa\x1a\x44\xbf\x02\xc4\x26\x83\xd8\x34\xba\x55\xa3\xed\x28\x10\x1b\x15\x20\xb6\x18\xc4\x96\xb5\xd7\x4d\x0d\x62\xb3\x02\xc4\x36\x83\xd8\xb6\xf6\xba\xa5\x41\x6c\x55\x80\xd8\x61\x10\x3b\xd6\x5e\xb7\x35\x88\xed\x0a\x10\xd7\x18\xc4\x35\x6b\xaf\x3b\x1a\xc4\xce\x5c\x88\x85\xd8\x4f\x81\x2a\xd5\xd7\xf4\xea\xba\x77\x8c\xa0\x69\xb2\xfb\x9c\xbf\xbc\xc3\x22\x22\xa5\xce\xaf\x80\x57\x47\xa4\x6b\x3d\x4b\x12\x0e\x9e\x2e\x3f\x9d\x0d\x72\x34\x8a\xce\x47\x28\x88\x43\x34\x4e\x2e\x51\x90\x9e\xcf\x20\xfc\x0b\xb8\x39\xff\xf7\x2c\x48\x8d\xc4\x3d\xd0\x40\x80\x36\x48\x2b\x5c\x8a\xb3\x28\x0f\xce\xfb\xb4\x08\xdd\x25\xac\xc7\x27\xde\x67\x05\x83\x14\x67\xb3\x71\x8e\x92\x61\x59\xf3\x23\xba\x05\xd4\xce\x03\xf4\x02\x9d\x07\xd4\x75\xc5\x5f\x5b\x42\xcb\x88\xbe\xea\xb3\x57\x6d\x78\xd5\x87\x57\x36\x24\xc7\x14\x90\xd4\x15\x7a\x24\x7c\x81\xce\xaf\x60\x86\x97\x80\x20\x78\x01\x21\x76\x4a\x05\x6c\x89\x60\x48\x87\x7e\x3d\x38\x42\x10\x4e\x52\xfe\xf8\x8e\x72\xb8\xf3\x11\xfa\x0d\x9d\x8f\xab\x32\x39\xbb\x52\xe5\x57\xc6\xe2\xde\x51\x16\x57\xab\xbd\x2b\xb6\x6f\xb2\x93\xbd\x93\xc4\x82\x25\x56\xa0\xa3\x16\xe8\x14\x05\x74\x7a\xfe\x95\x71\xc3\x77\x94\x1b\xd6\x68\x33\xc5\x7e\xfb\x8e\xf3\x3f\xd8\x6f\x97\x11\x69\xcd\x84\xd1\x60\x30\x1a\x1c\x86\xaf\x22\xe0\x1b\x18\xd6\xd5\x02\xf5\x32\x0c\x9b\x0c\x7a\x93\x43\x6f\xa8\x18\x36\x34\x0c\x7d\x0b\x86\x2d\x06\xa3\xc5\x61\x34\x55\x04\x9a\x06\x86\x0d\xb5\x40\xa3\x0c\xc3\x36\x83\xde\xe6\xd0\x5b\x2a\x86\x2d\x0d\xc3\xa6\x05\xc3\x0e\x83\xd1\xe1\x30\xda\x2a\x02\x6d\x03\xc3\x96\x5a\xa0\x55\x86\xe1\x1a\x83\xbe\x76\xa6\x90\x88\xc0\xb0\xa3\x61\xd8\x56\x30\xac\x94\xf8\x23\xe3\x49\x27\x84\xae\xb5\x42\xda\x89\x79\xd7\x5d\x14\x56\x8e\xaf\x72\xf9\xde\x49\xd6\xa4\xf2\x50\x0a\x4a\x1a\x07\x7a\x5b\x64\xde\x5f\x4d\xc7\x01\xc1\xe6\x2a\x47\x4e\x70\x2c\xce\x4c\xad\x68\xd9\x06\x51\x5c\x5c\x95\x29\x75\xd5\xe4\x1d\x72\xc9\xa5\xb2\x3b\x28\xb9\x60\x65\x63\x64\x4f\xbd\x1b\xe9\xb6\x5b\x5e\x71\x29\xd2\x6d\x77\x3c\x76\x57\xd2\xed\xf8\x37\x67\xde\xda\xdf\x3b\x12\xe1\xe3\x7d\xd5\xe3\x7d\xd5\x83\xdd\x57\x69\x4b\xbc\xb8\xcf\xd1\x6f\x72\xfe\x5e\x77\x38\xf7\x95\x15\xee\xbd\x38\x9a\xbf\x57\x8f\xe6\xef\x6f\x7b\x34\x7f\xaf\x1e\xcd\xdf\x97\x1d\xcd\xe7\x29\x98\x1f\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\x94\x2f\x8f\x37\x55\x8f\x37\x55\x8f\x37\x55\x45\xb3\x8f\x37\x55\xfa\xc7\xc7\x9b\x2a\xc7\xe3\xe3\x4d\xd5\xe3\x4d\xd5\xe3\x4d\x15\xfc\x3d\xde\x54\x55\x53\xe2\x3e\xde\x54\x3d\xde\x54\x3d\xde\x54\x49\x7f\x8f\x37\x55\x8f\x37\x55\x8f\x37\x55\x8f\x37\x55\xff\x93\x6f\xaa\xee\xed\x8e\xea\x76\xb7\x53\x55\xee\xa5\x2a\xdc\x48\x3d\xd4\x5d\xd4\xdf\x3b\x1f\xca\xe3\x5d\xd4\x3f\xff\x2e\x4a\xbe\x3b\xea\xb5\xe6\x3a\x3a\xc9\x37\x47\xbd\x96\x74\x6d\x04\x0f\x0f\x7f\x67\x44\xbd\x34\xc5\xad\x91\x3d\xa8\x00\xf7\xd0\x2e\xbb\x56\x02\x37\x4e\xd9\xa3\x58\x8a\x99\x6e\xea\x2b\xe2\x28\x47\x59\x3f\xb9\x32\xe1\x1c\x0b\x74\x8e\xe5\x6b\x3a\xfe\x67\x93\x26\x1b\xed\x8e\xfb\x50\xce\x0e\xdd\xd1\x7c\x35\xee\x7b\x7c\x6d\xd3\xe3\xaa\x2d\x7a\xdc\x7f\x7c\x6e\xc3\x6c\x50\xc8\x10\xf0\xa8\x12\x11\xfa\x97\x3c\x4e\x0e\xd5\x21\xab\x44\xb6\x36\x3e\xf6\xa7\x0a\x20\x33\x12\x9a\xf2\xd9\x08\x8a\x66\x3b\xfb\x93\x5e\xd4\x7e\x47\xcb\x74\x7c\x96\x79\xa3\x4b\xe8\x5f\xd0\x2b\x47\x2c\x85\xcb\x60\x6a\xc7\x19\xf6\x0d\x53\x43\x20\x4d\xc0\xb1\xdd\x31\x9e\xbc\x26\x33\x3e\x7f\x7a\x7a\x56\x15\x3f\xcb\xaa\x21\x88\xe6\x77\x96\x65\x56\x00\xba\xb3\x5a\x8e\x6b\x42\x40\x0b\x62\xe4\x5f\x27\xd3\x63\x57\x19\x2a\x2d\x0b\x27\xe7\x46\xbb\xe3\x50\x88\xd4\x9d\xca\x10\x6b\xa3\x55\x15\x23\xd2\x7a\xd2\x14\x23\xc5\xa0\x45\xda\x97\xdf\x8b\xe1\x9c\x9b\x01\x1e\x94\x83\x6a\xf5\x2f\x32\x9e\xda\x7c\x88\xd5\x14\xd3\x65\x14\x53\x95\x5a\x6c\x59\x44\x11\x68\xd0\x69\xc2\x38\x46\x95\xca\x77\x85\x84\x1d\x84\x6b\x25\xda\x12\x82\x75\x13\x6b\x41\xa8\xea\x7b\xb5\xb3\x5f\x49\xdd\x1a\x5b\x53\xa4\x0a\xc3\xeb\xac\xc8\x6b\x10\xeb\x79\x0c\xb4\xe3\xd3\x27\x88\x83\x62\xb9\xd1\x2a\x48\x3d\x32\xce\xee\x64\x2c\x94\xb9\x62\x62\x99\x82\xdd\xf7\x2a\xf7\xf6\x5a\xf7\x21\xf4\xf6\x5a\x0b\x4b\xbc\xe6\x1e\xab\x89\xbb\xbd\x96\x35\xb6\x05\xdc\xd0\x44\x38\xbc\xc5\x0e\xbf\x95\x26\x53\x65\x97\x67\x2f\x60\x10\xbe\x41\x54\xbc\x90\x34\xa7\x06\x9a\xd3\xf4\xfc\x64\xe2\x49\x29\x11\x6a\x0e\xf9\xaf\x1a\x32\x58\x3d\xd6\x1c\x41\x5d\x8a\xfa\xa5\xad\x62\x02\xaa\xab\x82\x50\x23\xc6\x55\x12\x62\x48\x1b\xbc\x60\xf9\x1d\x06\x19\xcf\x92\x0d\x5c\x18\xbe\x10\xbc\xc8\x2e\xfe\x13\x6c\xe6\x2f\x5f\x5a\xf7\xf0\x05\xd8\x3d\x9a\x93\x00\xe9\x3b\x5a\x6d\x64\x88\xee\x67\xc5\x01\xa4\xc5\x57\x1d\xa3\xf9\xf2\x95\x47\x0a\x95\x9f\x34\x7b\xad\x87\x3a\x66\xde\x2d\x5d\xdf\xb7\x3c\x5f\x3e\xd8\x29\xf0\xdb\x06\x71\x26\xac\x0a\x67\x38\xbd\xc0\x4f\x9f\xd4\x06\x4b\xa8\x51\xf7\x1b\xa8\x7f\x8d\x7a\xff\xdf\xff\x1b\xa6\xd1\x00\xed\xe3\x2c\x8e\xc6\x2b\x68\x73\x3c\x46\x69\x74\x3e\xca\x33\xc4\xca\x87\x2b\x4f\x9f\x3e\x39\xc2\x61\x94\xe5\x69\xd4\x9f\x01\xfc\x20\x0e\x21\x28\x4f\x14\xa3\x2c\x99\xa5\x03\x0c\x6f\xfa\x51\x1c\xa4\xd7\x84\x1d\x4c\x32\x8f\x45\x69\x48\xe1\xdf\x64\x96\xa3\x09\xf0\xf4\x01\x70\x56\x0f\x05\x29\x46\x53\x9c\x4e\xa2\x3c\xc7\x21\x9a\xa6\xc9\x45\x14\xe2\x90\x06\x9d\x20\xeb\x74\x98\x8c\xc7\xc9\x65\x14\x9f\xa3\x41\x12\x87\x11\x5d\xc3\xa4\xd2\x04\xe7\x5d\xb6\xe2\x5f\x22\x15\xad\x0c\x14\xc3\x14\x9f\x41\x12\x62\x34\x99\x65\x39\xd9\xa8\x83\x28\x06\xa0\x41\x3f\xb9\x20\x9f\xa6\xd7\xd0\x45\x14\x27\x79\x34\xc0\x1e\x8d\x2b\x34\x8e\x32\xd0\x2c\xcb\xed\xc5\xa1\x86\x4c\x18\x65\x83\x71\x10\x4d\x70\xba\xe2\xc2\x21\x8a\xe5\x81\xe0\x38\x4c\xd3\x24\x9c\x0d\xf0\xbd\xa3\x81\x58\xd7\xc2\x64\x30\x13\x71\x30\x48\x8d\xd5\x24\x65\x31\x32\x26\x41\x8e\xd3\x28\x18\x67\xc5\x30\xc3\xdc\x40\x35\x09\x75\x32\xcf\x27\xbb\x7b\xc7\xe8\xf8\x60\xe7\xe4\x97\xcd\xa3\x6d\xb4\x77\x8c\x0e\x8f\x0e\x7e\xde\xdb\xda\xde\x42\x6f\xff\x8d\x4e\x76\xb7\x51\xef\xe0\xf0\xdf\x47\x7b\xef\x76\x4f\xd0\xee\xc1\x87\xad\xed\xa3\x63\xb4\xf9\x71\x0b\xf5\x0e\x3e\x9e\x1c\xed\xbd\xfd\x74\x72\x70\x74\x8c\x9e\x6d\x1e\xa3\xbd\xe3\x67\xf0\x61\xf3\xe3\xbf\xd1\xf6\xaf\x87\x47\xdb\xc7\xc7\xe8\xe0\x08\xed\xed\x1f\x7e\xd8\xdb\xde\x42\xbf\x6c\x1e\x1d\x6d\x7e\x3c\xd9\xdb\x3e\xf6\xd0\xde\xc7\xde\x87\x4f\x5b\x7b\x1f\xdf\x79\xe8\xed\xa7\x13\xf4\xf1\xe0\x04\x7d\xd8\xdb\xdf\x3b\xd9\xde\x42\x27\x07\x1e\x34\x6a\x56\x43\x07\x3b\x68\x7f\xfb\xa8\xb7\xbb\xf9\xf1\x64\xf3\xed\xde\x87\xbd\x93\x7f\x43\x7b\x3b\x7b\x27\x1f\x49\x5b\x3b\x07\x47\x68\x13\x1d\x6e\x1e\x9d\xec\xf5\x3e\x7d\xd8\x3c\x42\x87\x9f\x8e\x0e\x0f\x8e\xb7\x11\xe9\xd6\xd6\xde\x71\xef\xc3\xe6\xde\xfe\xf6\xd6\x0a\xda\xfb\x88\x3e\x1e\xa0\xed\x9f\xb7\x3f\x9e\xa0\xe3\xdd\xcd\x0f\x1f\xac\xbd\x24\xb8\x2b\x7d\x7c\xbb\x8d\x3e\xec\x6d\xbe\xfd\xb0\x4d\x5b\xfa\xf8\x6f\xb4\xb5\x77\xb4\xdd\x3b\x21\xdd\x29\x7e\xf5\xf6\xb6\xb6\x3f\x9e\x6c\x7e\xf0\xd0\xf1\xe1\x76\x6f\x8f\xfc\xd8\xfe\x75\x7b\xff\xf0\xc3\xe6\xd1\xbf\x3d\x06\xf3\x78\xfb\x7f\x7f\xda\xfe\x78\xb2\xb7\xf9\x01\x6d\x6d\xee\x6f\xbe\xdb\x3e\x46\xb5\x39\x43\x72\x78\x74\xd0\xfb\x74\xb4\xbd\x4f\x70\x3e\xd8\x41\xc7\x9f\xde\x1e\x9f\xec\x9d\x7c\x3a\xd9\x46\xef\x0e\x0e\xb6\x60\xa0\x8f\xb7\x8f\x7e\xde\xeb\x6d\x1f\xbf\x46\x1f\x0e\x8e\x61\xb4\x3e\x1d\x6f\x7b\x68\x6b\xf3\x64\x13\x1a\x3e\x3c\x3a\xd8\xd9\x3b\x39\x7e\x4d\x7e\xbf\xfd\x74\xbc\x07\x83\xb6\xf7\xf1\x64\xfb\xe8\xe8\xd3\xe1\xc9\xde\xc1\xc7\x25\xb4\x7b\xf0\xcb\xf6\xcf\xdb\x47\xa8\xb7\xf9\xe9\x78\x7b\x0b\x46\xf7\xe0\x23\x74\xf5\x64\x77\xfb\xe0\xe8\xdf\x04\x28\x19\x03\x18\x7c\x0f\xfd\xb2\xbb\x7d\xb2\xbb\x7d\x44\x06\x14\x46\x6a\x93\x0c\xc1\xf1\xc9\xd1\x5e\xef\x44\x2e\x76\x70\x84\x4e\x0e\x8e\x4e\xa4\x3e\xa2\x8f\xdb\xef\x3e\xec\xbd\xdb\xfe\xd8\xdb\x26\x5f\x0f\x08\x94\x5f\xf6\x8e\xb7\x97\xd0\xe6\xd1\xde\x31\x29\xb0\x47\x9b\xfd\x65\xf3\xdf\xe8\xe0\x13\x74\x99\xcc\xd1\xa7\xe3\x6d\xfa\x53\xa2\x58\x0f\x66\x12\xed\xed\xa0\xcd\xad\x9f\xf7\x08\xda\xac\xf0\xe1\xc1\xf1\xf1\x1e\xa3\x13\x18\xb2\xde\x2e\x1b\xee\x95\xa7\x4f\x5e\xac\xaa\x3a\xaf\xfd\x20\x1f\xdd\xaf\xde\xab\x5a\xd4\x69\x1a\xf8\x58\x14\xa1\x8f\x95\xac\xb3\xe1\xc2\x2e\x88\xf3\x0c\xe5\x41\x9f\x4b\x2c\xa4\xca\xe7\x3f\xc6\xd6\x60\x9b\x85\x1c\x55\xf7\x10\xf2\x3d\x84\x1a\x1e\x42\x4d\x0f\xa1\x96\x87\x50\xdb\x43\xa8\xe3\x21\xb4\xe6\x21\xb4\xee\x21\xf4\xca\x43\x7e\xdd\x43\xbe\xef\x21\xbf\xe1\x21\xbf\xe9\x21\xbf\xe5\x21\xbf\x2d\x59\x58\xae\xd1\xba\xe4\x1b\x81\x47\xca\x13\x18\x7e\x9b\xc2\x25\xf5\xa0\xad\x57\x0c\x7e\x83\xc1\xf0\xa1\x8d\x02\x4e\x93\xb5\xd5\x62\xb8\xbc\x62\x30\xd6\x25\x3c\xd7\x18\xac\x0e\xc3\xc5\xa7\x30\x7d\x39\xd6\xb2\xcf\xea\x72\x5c\xea\x14\x06\xe0\xc1\xf1\x6c\x52\x58\x04\xbe\x2f\xf7\x5b\x86\xd3\x62\x75\xdb\x0c\xf7\x35\x06\xa3\x21\xe1\xe9\x33\x58\xeb\x0c\x17\xd6\x6f\xbf\x79\xb6\xf4\x5a\x9e\x8b\x74\xce\x5c\x70\x3c\xd6\xa4\xb1\x6a\x30\x98\x1c\xe7\x8e\x3a\x1e\xd0\xb7\xa6\xd6\xf7\x0e\xab\xd3\x2c\x60\x41\xdd\x76\x81\x33\x87\xc1\xc7\x03\xda\xf2\xb5\xbe\x43\xa1\xb6\xd4\xc1\x35\x86\x60\xa7\x18\x5c\x01\xa4\x21\x0d\x34\x45\xb6\x00\xb4\xce\xea\x48\x83\x05\x13\xd3\x2e\x06\x57\xc0\x68\x4a\x03\x4d\x91\x95\x10\x6a\xb0\x91\xad\x4b\xc0\xf8\x68\xac\x89\xd9\x13\x14\x8a\xd8\xe8\x50\x64\xd5\xd9\xc8\xe6\xad\x0c\x8a\x22\x1b\x2b\x40\x4f\x6e\x89\xd3\x56\x53\x1a\xcf\x4e\xf1\x4d\xa1\xe9\x35\x0f\x3e\xc1\x50\x71\x7a\x7d\x55\xd0\x1e\xa7\x29\xbf\x2d\x0d\xeb\x1a\x2b\xab\xcc\x87\x5f\x10\x81\x98\x8b\x57\xac\x20\x27\x9e\x75\xa9\x0c\x47\x7c\x0d\x7e\xcb\x67\x29\xb1\x96\x5b\x45\x55\xde\xbe\x58\xf3\xf2\x9a\x58\x57\x40\x16\xa0\xf8\xfa\x6c\x17\xb4\x2f\xfa\xd9\x28\x50\x10\xe3\xc4\x48\x86\xc2\x45\xda\x94\xcc\x5b\x20\x0c\x31\x65\xf0\xdb\x05\x02\xd0\xcf\xb5\x62\x21\x42\x83\x2d\x86\x48\x47\x43\xba\xa9\x0e\xbe\xe8\xb4\x5f\xc0\x11\x63\x27\x16\x34\x7c\x57\xe0\x08\x06\xe2\x4b\x83\xd4\x29\xda\x15\x0b\x8f\x2d\x60\xbf\x69\x99\x0f\xd1\x01\x0d\x71\x0e\x48\x2c\xb8\x86\xf4\x6f\x5b\xac\x62\x75\x80\xda\x96\x72\x2d\x75\x66\xc4\x4c\x16\x9d\x42\xbe\x8f\xce\x94\x2c\xd9\x9f\x47\x64\x85\x58\xe6\x03\x89\x50\xcd\x75\x0f\xd5\xaf\xda\x9b\xeb\x8d\xb5\x57\xaf\x5e\x91\xdf\x9d\xed\xad\x57\xdb\x6f\x37\x7d\xf2\x7b\x7d\xc7\x7f\xfb\xb6\xb7\xd5\x23\xbf\x37\x5f\xb5\x9b\x3b\x5b\xad\x6d\x75\xbe\x47\xa9\xb3\x81\x76\x7d\xb3\xb1\xfe\x76\xbb\x03\x0d\xf4\x5a\x5b\x5b\x7e\xa3\x05\x0d\x6c\xad\xd5\x9b\xdb\x3b\x4d\xf2\x7b\x6d\xb3\xb3\xb5\xd6\xd9\x86\x86\x39\x42\x67\x56\x7d\xc0\xd1\xde\xe1\xf6\xfe\x96\xdf\xa9\x43\xf8\xfd\x39\x3a\x24\x51\xb6\xd0\x22\x49\xaf\xe8\xae\x7c\xdb\xbb\x22\xaa\x4c\x04\x24\x1c\x41\xb0\x3b\x6b\xad\x76\xa3\x59\x87\x11\xdc\xde\xe9\x6d\x6d\xbe\x5d\x87\x0e\xbe\x5a\x7f\xbb\xb9\xd5\xdb\xd9\x26\xbf\xfd\x7a\xb3\xd1\x6e\xad\xc1\xe0\xf4\x9a\x5b\x8d\x6d\x7f\xa7\x7e\xe6\x54\x8d\x57\x55\xca\x5b\x15\xbb\x95\xbd\x94\xfc\x92\x9b\x9a\xf9\xe6\xf8\x14\x0b\xd0\xbd\x16\x66\x91\x8e\xeb\x9b\xfd\xcf\x52\x69\x7e\x79\xf0\xd9\x34\x64\x42\x65\x77\x2a\x52\x3d\xb4\x81\x6a\x66\x01\x44\x0d\x40\xa5\xc6\x0a\xc3\x07\xe9\xe5\x62\x46\xa5\x06\x40\x66\x57\xaa\x01\x34\xad\x4b\x4d\x70\x25\xaa\x31\x34\xcf\xd6\x79\x17\x89\xfb\x07\x42\x8a\xce\x2b\x47\x60\x00\x9f\x47\x63\x77\x81\x14\x0a\xa4\xce\x02\x20\x7e\x7e\xfe\xc3\x0d\x01\x64\xa2\xcf\x7f\xb8\x21\xc0\x36\xfd\x39\x73\x43\x80\x4d\xe3\x73\x96\xda\x23\x5a\xaf\xae\x92\x55\xf6\x85\x1c\x9a\x2f\x82\x34\x22\xd2\xb1\xe5\x92\x36\x18\x7b\xa8\x3f\xf6\xd0\x60\xec\xa1\x70\xec\x21\x3c\xb6\x34\x14\xa4\x1e\xea\xa7\x1e\x1a\xa4\x1e\x0a\x53\x0f\xe1\x54\x6f\x2c\x20\xa8\x04\x04\xe1\x5d\xd3\x65\xa4\x9f\x42\xd0\x71\xf8\xe8\xeb\x1f\x07\xe4\xe3\x80\x7e\x6c\xe8\x1f\x43\xf2\x31\xa4\x1f\x9b\xfa\x47\x38\x30\x60\xfa\xb1\xa5\x7f\x14\x69\xaa\x03\x35\x2f\x35\xef\x92\x7e\x2b\x68\x35\x25\x84\x7f\x97\x37\x90\x6f\x5d\xdb\x39\x59\x3e\xc1\x18\x2d\x17\x6b\x6a\xf9\x8f\xf1\x69\x74\x76\xb6\xf4\xd5\xe6\xc4\x00\x5e\x3b\x6f\xfc\xce\xd2\x9f\x4f\x9f\xa8\xac\x91\xb4\x81\x86\x7e\xad\x3f\xf6\x06\x63\x2f\x1c\x2f\xa1\x65\x34\x1a\xdb\x7d\x6f\x6e\x90\x50\xc8\x45\x6f\x9a\x0d\xaa\x6a\xb3\x40\x6b\xe8\xd0\x8c\x91\x37\xa0\xb5\xd6\x9d\xd0\x9a\x3a\x34\x63\xaa\x0c\x68\x9d\x96\x13\x5a\x4b\x87\x66\xcc\xad\x04\xed\xcf\xd5\x55\x06\x71\xbd\xee\x84\xd8\xd6\x21\x1a\x04\x81\xec\x61\xd2\xc9\x24\xe6\xd6\xe9\x22\x5f\x50\x9a\xe4\xe3\x5a\xee\x65\x64\x5a\x6d\x4e\x1b\x40\x03\xf9\x32\x1e\xdb\xa7\x1c\x56\x84\xb1\xa4\xc8\x1f\xd0\x6d\x68\xfb\x02\xe4\x0e\xed\x92\x35\xe9\x5b\xdd\x80\x60\xbd\xf4\x6d\xb5\x61\x99\x19\x37\x89\x02\xd5\x20\x45\xcb\x12\xb5\xa6\xb7\xa7\xd6\x76\xad\x9f\x7a\x83\xd4\x0b\x53\x18\xf1\xf4\x6e\xd4\xda\xd2\xa1\xdd\x95\x5a\x55\x68\x77\xa2\xd6\x86\x0e\xed\xce\xd4\xea\xeb\x10\xef\x99\x5a\x53\xb8\xb5\x2e\x21\xd7\xd4\x41\xae\xc0\x51\x53\x1b\xb9\x02\x23\xb6\x7d\x01\x16\x4d\xc9\x35\x75\x92\x2b\x6c\x00\xb6\xda\xb0\x35\x98\x16\x1a\x3a\x2b\xdf\x93\xd3\x31\x80\x0c\x09\x56\xbf\x9a\x84\x49\xfe\xb3\x81\x6a\xbb\xd4\x34\x77\x40\x38\x73\x68\xe9\xe9\x2e\x33\xe1\xdd\xa5\xe6\xb7\x21\x29\x67\x1b\x91\x5d\x66\xa6\xbb\x4b\x0d\x69\x31\x29\x17\x58\xcb\x35\x59\x39\x30\x96\x85\x1d\xa1\x6f\x2d\xd7\x62\xe5\xc0\x30\xb9\x4f\xca\x0d\xac\xe5\xc0\x80\x59\x19\x16\x5d\xac\xdd\x61\xa9\x35\xee\x60\x9e\x15\x06\x79\x20\x84\x21\xf2\x60\xd9\xf8\xe7\xa7\x61\xe4\x25\xe3\xb7\x51\x9e\x9d\x24\x39\x70\x3c\x0a\x33\xde\x0a\xf2\x80\x5a\x6d\xbd\x40\xeb\x16\xe8\x50\xe7\x03\x1e\xe6\x46\xd2\x46\x28\x6f\x74\x66\x33\x0c\xcd\x2c\xc4\x88\xe5\x5b\xa4\xc6\x4c\x05\x48\x22\x4d\xb6\xcf\xd0\xd7\x0d\x9a\x58\xb8\xb0\x91\x10\x25\xfe\x85\x9a\x0d\x9d\x5a\x0b\x48\xb5\x5a\xad\x28\xba\x8c\x08\x7f\x20\x20\x5f\x2d\x11\x50\x2d\xb2\x6e\xfd\x96\x43\x80\xe6\x55\xe9\x70\x14\xc2\xb3\xf4\xb2\xba\xf0\x6c\x00\x63\x82\xb3\x06\x6c\x9e\xe0\x6c\xeb\xa8\x9c\xa7\xa3\xc8\x87\xc9\x73\xec\x80\x71\x8c\x25\x6d\xc7\xea\x2a\x9c\x04\x11\x64\x77\xa1\x0e\x59\x56\xc3\xa9\x29\x3d\x79\x99\xd9\x5c\xca\xc9\x12\x56\xb7\x2c\xa3\x5b\x08\x67\x17\x6d\x20\x59\x7c\xbf\xdb\xf9\xad\x5d\xe9\xf8\x66\x3f\x91\xed\xc2\x51\x6c\xd7\xe2\x4c\x82\xca\xce\x60\xbb\xc2\x5d\x6f\x57\x39\x5e\xed\x2e\x7c\xae\xa2\x14\xb2\xab\x9c\xa9\x76\x9d\x87\xa9\xf9\xa6\x70\x47\xf4\x26\x9c\x4e\x2e\xcb\x60\x11\xc2\x60\xab\x45\xd9\x8d\xb9\x36\x41\x0a\x9b\x1a\x8c\x93\xb8\x9c\x41\xfd\xff\xec\x7d\xff\x72\xdc\x36\xd2\xe0\xdf\xf1\x53\x60\xb7\x6a\xed\x51\x34\x96\x08\xf0\x17\x68\x5b\xb9\x4b\x14\xfb\x73\x2e\x76\xec\xb2\xb5\x67\x7f\xe5\xb2\xb3\x20\x09\x6a\x18\x8f\x66\xf4\xcd\x50\xd6\x68\x37\x4e\xdd\x6b\xdc\xeb\xdd\x93\x5c\xa1\x01\x92\x20\x09\x80\x33\xb2\x9c\x6f\xb3\x6b\x6d\xad\x33\x33\x6c\x74\x37\xfa\x17\x9a\xf8\xd1\x80\xad\x04\x02\xaa\x9d\x5d\x80\xaf\xf6\x6d\x10\xf2\xf1\xcf\x03\x23\x91\xed\x86\xb6\xa6\xd8\x84\xa7\x9d\x7d\x51\xf0\xf1\xa3\x5c\xfd\x47\xfa\x8e\xb8\x02\x4f\x36\x53\x74\x35\x45\x7f\x37\x5d\xf3\x31\x99\x6c\xe0\x64\xe7\x15\xfc\xfb\xf7\xf6\xb6\xf6\x8f\x03\x3c\xc4\x8d\x67\xb2\xd9\xbb\x3d\xb9\xda\x93\xc7\xc9\x7f\x13\x5f\xfe\xbe\xb7\xb7\x77\xdf\x86\xcd\x1f\xc5\x26\x10\xfd\x26\x30\xb6\xac\x59\x70\x05\xe3\xb8\x6e\x03\x06\xe0\xed\x6a\xef\xf6\xe4\x37\x60\xce\x8e\x31\xdc\x46\x66\x42\x68\xbf\xb6\xa8\x2c\xb8\x20\x95\xd8\x4c\x17\x46\x4c\x9b\x07\x0f\x16\xc0\xd5\xe6\x9b\x6f\xbe\x99\xf8\xe4\xee\x42\x67\x4a\x7e\x70\xee\x86\xa9\x37\xc3\xc8\x7b\xe0\xb6\xdb\x0c\x63\xbd\xed\x47\xed\x6f\x81\x3d\x4f\xf5\xe7\x6a\x29\x23\xd3\x10\x8d\xe5\x7e\x1e\x0b\xf4\x75\x2f\xe6\x51\x9e\xd1\xee\x64\xa9\x27\xf0\x26\x77\x14\x8b\x77\x0c\xbb\x70\xec\xad\x2e\x6b\x6e\x4d\xdb\x6d\x86\x93\x83\xbd\xad\x36\x35\xc0\x76\x5b\x95\x6a\xe5\x3c\x7e\xfa\xed\xf1\xef\xa0\x1a\x47\xf3\xf7\xfc\x0a\x9a\xae\x79\xb6\xe2\x95\xe5\xee\x24\x8b\x42\xe1\xca\xc1\x1b\x54\xa8\xbc\xc8\xb0\x51\xcd\xe3\x33\x96\xb5\xea\xd1\xb7\x58\x19\x34\xd4\x01\x1e\x6a\xe9\x8c\x65\x06\x4d\x7d\xf5\x51\xae\x03\x5b\xb6\x46\xd5\x90\xe6\xdb\x89\x3e\xbe\x9d\xc6\xf1\x97\x2d\x4e\xff\x0a\x47\x56\x3e\xf7\xd2\x7d\xaf\xb0\x9a\x46\xd8\x5a\x32\xed\xe5\xe3\x6f\xef\xe2\x2d\x56\x32\x86\x77\x55\xdf\xe4\xfa\xc5\x11\x9c\x3e\x6d\x97\x30\xca\x45\x59\x4d\x0c\x05\xa8\xba\x4b\x1a\xbc\xc8\x72\x96\xd2\xc4\x50\x9b\xc9\xdb\x24\x34\x65\x79\x56\xf0\xce\x1a\x87\x09\x30\xf3\x73\xc2\x71\xe1\x75\x9f\x7d\xfa\x12\x88\x2d\x43\x37\x27\xdf\xc3\x19\xf4\x01\x82\x6d\xe6\x9e\xcd\xd3\xc5\xe2\x51\x6a\x9e\x2c\x86\x84\xd1\x3c\x55\x0c\xaf\xab\xe6\x89\x62\xf1\x88\x37\xd3\xc4\x03\x4e\xad\xf3\xc4\xd6\x39\x61\xcb\xdb\x02\xcc\xfb\x20\x79\xc2\xd4\x52\x0b\xe6\x95\x4c\xfc\xbb\x25\x30\xba\x67\x4f\xeb\xbf\x7a\x42\xc9\x8c\xa8\x3e\xe7\xf0\xea\x4d\x89\xee\x22\xff\x2d\x7a\xa7\x3e\xd2\xf6\x23\x0e\xb4\xcf\x91\xed\xee\x48\xc5\xd2\x64\x01\x87\x63\xe5\xbb\x25\xbc\x3e\xf8\xd8\x5c\xa6\xc6\xfc\x26\x04\x53\x4b\x13\x26\x90\x84\x80\x84\xc9\x37\x99\x18\x0e\xc8\x72\xb4\x0f\x84\x6c\x13\x8d\xe8\x01\x22\x9e\x55\x6a\x30\x6d\x36\x99\xa4\xe8\x36\xca\x64\x9e\x2b\x3e\xe6\x80\xd9\xdb\x84\x4c\xae\xc2\x8e\x4c\xf1\xa1\x07\x28\x18\x23\x91\xa2\x77\x28\x43\xef\x50\x2e\x31\x47\x3c\x4f\x78\xca\x4c\x45\x87\x7a\x98\xa3\x1d\x98\x97\xbc\x8b\x4f\x99\xea\xc5\x5d\xe4\x6d\x62\x8f\x07\x81\x4f\x02\x3b\xad\xc3\xaf\x1b\x72\xd4\xdb\x43\x5f\x1f\x6e\xdd\x17\x81\xdf\x0f\x93\xdc\xe7\xa4\x3f\xcb\x83\x2c\x2a\x15\xfe\x92\x9b\xa6\xfb\xd0\x11\xca\x4c\x53\x7c\x08\x48\x3e\x78\x80\x7c\x4f\xf5\x12\xd4\x6f\xbc\x5b\x14\x1d\x21\x13\x1f\x6c\xbb\xd3\x5a\x5b\x4d\x06\xaa\x49\xb4\x7a\xb2\x8d\xf5\x4f\x78\xa3\xce\x44\x20\x4c\x18\x0e\x2a\x9f\xa0\xce\x24\x20\x4c\x16\x66\x66\x18\x5f\x9f\x28\xcc\xcd\x30\x81\x3e\x49\xc8\xfb\x30\x5f\x26\xf8\xfe\x59\x27\xf8\x44\x2e\x7c\x50\xcc\x97\xcb\x95\x3e\xe7\x76\x08\x03\xb5\xfa\xfb\x24\x22\x50\x0b\xa1\xc5\x3c\x32\x4f\x37\x98\xa6\xfb\x4c\x33\x74\x3b\xce\x03\x19\xa7\xeb\xfe\x88\xb3\x41\x5f\xa6\x10\x06\x93\x01\x22\x7d\xde\x69\xf6\x00\x1a\xb8\x26\x0e\xba\x09\x79\x77\xce\x40\x3c\xfb\x32\x5d\x70\xa3\xd3\x05\xa0\x8f\x2d\x66\x0a\xcc\x6a\x69\x27\x09\x94\x6a\xec\xc7\xa6\x04\x80\x7d\x5a\x80\xfe\xa1\x0b\x6c\xac\x67\x8c\x84\xd1\xe7\xae\x8d\xa1\xa8\xfc\xfb\x4c\x1f\x0c\xa6\x07\xf4\x77\x78\x12\x46\x9d\xb7\x78\xed\x14\x76\x7f\x56\x80\x90\x60\xbb\x79\x01\x01\xd8\xc1\x09\xdf\x25\xf2\xdf\x75\x6e\x20\xc3\x5e\x98\xf0\x9c\x8a\x57\x7e\x3f\x8a\xb3\x3c\xf4\x62\xf8\xec\xc5\x5e\x9e\x63\xf8\x5c\xc4\x1e\x0f\x13\xdf\x3c\x67\x50\x14\x99\xe7\xa5\x3e\x4c\x2e\x44\x34\xa4\x38\xc4\xf2\x73\x50\x24\xb4\x60\x80\x20\xe5\x05\x0b\x0a\x16\xec\x30\x5d\xb0\x55\xe6\xa9\x85\x7d\x25\x3a\xad\xa5\xe3\x14\x2d\x44\xd4\x26\x9d\xb9\x7b\x34\x4c\x5e\x2c\x0b\x4b\x5f\x86\xe8\x91\x11\x97\x90\x60\xd7\x41\x5a\x34\x19\x19\xa6\x3b\xde\x31\x18\xa8\x09\x31\x1f\x62\xff\x32\x54\x7f\xc2\x50\x2d\xb4\xb2\xdd\x60\x6d\x54\x4e\x67\xb8\x96\x0a\x72\x0e\xd8\x84\xf4\x8f\x3a\x6b\xe7\x9a\xd5\x70\x74\x2f\x4e\xc4\x00\x9e\x7c\x99\xd7\xff\xef\x19\x98\xff\x78\xc7\xf2\x7e\x90\x97\x38\x94\x7f\x6f\x4e\xe5\xa2\xd5\xf2\x62\x91\xa3\xac\x7b\x5e\x4f\xeb\xc1\xe3\xfe\xd5\x29\x3f\x76\x97\x01\xea\x89\x5a\xde\xe2\x90\x4f\x4c\x19\x0c\xd2\x97\x94\xcb\xf5\xf3\x55\x79\xc6\x27\x0b\xe3\x30\xb6\xfe\xaf\x55\xf5\x53\xfd\x9e\x2f\xbe\x4c\x16\xfd\xf7\xcc\x66\x22\x58\xaa\x13\x1d\x21\x72\xbf\xfe\xfc\xe0\x48\x62\xa8\x7f\x70\xcc\x0d\xff\x69\xb2\x40\x7f\x51\x60\x7b\xd6\xf9\x42\xe5\xa3\x05\x9b\xaf\xf9\xf8\xae\xc0\xfe\xfc\x58\xfd\x3e\xbe\xba\xe8\xbe\xe1\x1a\xc4\x72\xca\xab\x47\x2b\x06\x9f\xd9\xfc\xbb\xb2\x5a\x1b\x04\xd4\x2c\xe1\x2f\xd0\x5d\x34\x59\x40\x65\xcf\x3d\xf4\x75\x67\xf2\xa3\x3f\x93\xa5\xd1\xaa\x67\xa9\xf5\xca\xec\xf0\x1b\x28\xa4\x57\xbf\xe7\x72\x56\xce\x39\x9a\xa8\x67\x0f\x90\xda\x92\xd9\x97\x62\xab\x4d\xab\xa0\x1b\x14\xd4\x2a\xe5\xc7\x6f\x24\x10\x94\x1d\x1d\x08\x02\x6c\xe1\x7c\x79\x39\x59\x4c\x11\x46\x87\x88\xec\x6d\x51\xb1\x1d\xc1\x4d\x28\xbb\xa0\xf5\xf7\x8c\xc5\xb3\x25\x8a\xfd\xfd\x91\xa9\xd0\x45\x07\xa2\xce\x90\x26\x2d\xce\xeb\xaf\xb1\x89\xc4\x7b\xbb\x6c\x7a\x98\xa1\x7f\xf6\x95\xb6\xc7\x07\xeb\x79\x99\xf1\x89\xb7\xf7\x65\xd5\x6b\xeb\x55\xaf\xc1\xa3\x02\x1e\x85\xa6\x47\xa7\xf0\x68\xb0\x60\x04\x39\x0b\x3c\x8a\x3f\x79\x19\x2d\x72\xd4\xba\xff\xbd\x97\xd1\x4e\xd9\xd9\x19\xf3\x36\xcd\x62\x1a\x1e\x08\x65\x08\x0d\x1b\x8d\x27\x75\xcb\x07\x0f\x10\x91\x8b\x5e\xf5\x2f\xdf\x7c\xf3\x0d\x8a\xf7\xf6\x10\x7a\x67\xc6\xd4\xfd\xeb\x60\xc2\xc1\x00\x13\xa6\x7b\x7b\xdb\x61\xea\xb6\xf3\x8d\xe1\xa5\xd3\x13\xdc\xf6\xdb\xb8\x49\xbe\x0b\xac\x75\x1b\x4b\x66\xb5\x6e\xe3\x4d\x5d\x6f\x7a\x4b\x66\xbb\x98\xfc\x21\xa6\x64\xc7\x6e\xd7\xed\xcc\x77\x12\xa0\xd6\x70\x94\x12\xf7\x55\xcf\xa1\xc8\xaf\xea\xe1\xbe\x73\xc1\xd4\xb6\xfa\x99\xc1\xa9\xc6\x09\x47\xb7\x51\x01\x9b\xdd\x7e\x13\x1f\x4f\x6d\x57\xb8\x9c\x31\xa8\x30\xc7\xd0\x6d\x94\x02\x38\x93\xab\x83\xef\x90\x5a\x27\x34\xf1\x0f\xc9\x4a\x79\x2a\x18\x6f\x96\x5a\xd5\x62\x9b\x5a\x6b\x95\x5b\xff\xe4\x13\x9c\x68\x4f\xb0\xdf\x79\xd4\x69\x64\x1e\xdb\x1a\x62\x70\x4f\xcd\x84\x83\x8d\xcb\xca\xc9\x1c\xda\x45\x0a\xa3\x7c\x82\xb5\x27\x18\xeb\x8f\x62\xb9\xb3\x55\x3e\x22\xa1\x79\xc4\x83\x05\x64\x41\x69\x86\xf6\x6b\xb2\xfb\x42\xa8\xfb\xf2\xa2\x37\xeb\xe2\x31\x34\x24\xe8\xa8\x16\xcc\xbe\x10\xad\x89\x82\x08\x5c\xa7\x06\x04\x22\xd6\xf5\xeb\xb4\x8b\x3f\x11\x1e\x4d\xe9\x17\xd4\xce\x84\xdb\x12\xb0\x69\x99\x0f\x8d\x2c\x91\xf6\xab\xad\xa3\x91\xe5\xd0\x49\x25\x04\x51\x11\x13\xad\x7f\x97\xa5\x51\x09\x13\x2a\x18\x28\x19\x5e\x98\x61\x22\x05\x03\x25\xc1\x4f\xcd\x30\xb1\x82\x01\x9f\x9f\x7d\x59\x86\xfd\xb2\x0c\xfb\x65\x19\x76\x98\x6d\x7e\x59\x86\xfd\xa7\x9c\xe3\x0d\xa3\x9d\xe7\x78\xc3\x68\x74\x8e\x57\x7f\x67\x1b\xce\xf1\x86\xd1\x97\x39\xde\x1b\x9f\xe3\x0d\xa3\x6d\xe7\x78\x4d\xca\xe9\xce\xf1\x82\x82\xdc\x9b\xb6\x9b\xb5\x33\xf3\xd2\x2c\xf5\xfe\xd0\x4b\xb3\x9b\x28\xf8\x5d\x2e\x2e\x68\xe8\x7c\x99\x05\xee\xce\x02\x6f\x22\x58\x53\x3d\xd8\x44\x81\xf6\xfb\xeb\x28\x50\x55\xba\x01\xe2\x40\xab\x13\xbd\x53\x4d\x37\xad\x7f\x2f\x1e\x3f\xfb\xf9\xd9\xa3\x47\x2f\x1f\x9e\xbc\xec\xcf\x16\x3f\xff\xe1\xe7\x1f\x7e\xfa\xfe\xe1\xeb\x87\xc3\x5b\xb9\x5f\x3c\xfb\xeb\x4f\xdf\xff\x7c\xfc\xec\xa7\x97\x27\xdf\xfe\xd4\xb4\xd4\xc8\xc9\x69\xe5\xe3\xed\xa6\x95\xb5\x16\xab\xd9\xb2\x2e\xda\xd2\x9b\x93\xae\x49\x8b\xb7\x6b\x3c\x45\x57\xb6\x52\xe5\x95\x9c\x12\xa9\xd0\x03\x44\x82\xfb\xa8\x32\x4c\x89\x68\x7d\x7e\xb3\x41\xfb\x28\x44\x5f\xa3\x2b\x79\x7a\xb0\xaa\x0f\x69\xc2\x27\xb2\x07\x33\x95\xe8\x2f\x28\x1a\xe4\x22\x90\x06\xf2\xcb\xd7\xe8\x08\x5d\xa1\xbf\xa0\xd0\x94\x25\xf2\xcb\xff\x14\x58\x09\xfa\x1a\x09\x3a\xbe\xa0\xb3\x67\x00\xde\xc8\x69\xb9\xd7\xbd\x9f\xaf\xe4\xcf\xff\x69\x99\x0a\xd6\xc4\x76\x5e\xa2\x12\xae\x13\x30\x08\xad\x91\xcc\x46\x4a\x66\x23\x0f\x68\x6e\x0c\x82\x69\x40\xa5\x74\xd1\x95\x04\xbd\xb2\x4c\x2b\xb5\x06\xd2\x15\xe3\x15\x5c\xf0\x33\xec\xb5\x90\x6b\xbf\xeb\x1f\x47\xfb\xd6\x5b\xe5\xe8\x5a\xc3\x93\x47\x2f\x5f\x08\x5e\x37\x1e\x36\x19\x83\x7e\xef\x84\x65\x7e\x4c\x80\x01\x89\xda\x58\x9f\xae\x2f\x7b\xb6\x65\x04\x7b\x52\x83\x59\x44\xa8\x6e\x9e\xf8\x05\x3d\x40\xf1\x7d\xf4\x8b\x63\x66\x0e\xfa\x00\x47\x53\xcd\x55\x51\x6a\xf2\x69\x59\x3d\x5f\xae\xa1\x8e\xab\xb0\x2a\xb8\x2c\xf7\x97\x3d\x74\x17\x99\x76\x53\xd7\xc8\xf5\x46\x0f\x90\xaa\x17\x61\x02\x16\x7f\x83\x0e\xbe\x3b\x42\x40\x46\xc3\x62\xa1\xd5\xdd\x51\xad\x53\xfd\xe6\x08\xc8\xda\x37\x57\x0f\x28\x3f\xd5\x28\x77\x50\xdd\x35\xbc\xf7\x34\x0c\x6c\x37\xb5\xa4\x19\xd6\x82\x6f\x2a\x30\xa0\x11\xb5\x50\xfb\x4e\xf4\xc3\x43\xf4\x7c\x55\x9e\x95\x55\xf9\x81\xa3\xf3\xe5\xfc\x6a\xb1\x3c\x2b\xd9\x1c\x2d\x3f\xf0\x15\xfa\x8f\x47\x13\xb2\x77\x0f\x6d\xde\x51\xb4\x8f\x36\xef\x22\xf8\x37\x84\x7f\x03\x11\x66\xcc\x28\x95\x45\x4b\xf2\xf2\xfc\xc0\x3b\xe4\x6d\x62\xc7\x96\x79\x0b\x73\x0a\xc3\x91\xd1\x3e\x46\x16\xbd\x7a\x01\x5e\xce\xf1\xa9\xe1\xa7\x2e\x30\xd6\xd7\xd9\x74\x60\x3f\x7b\xbb\xae\xa6\xac\xc1\x7f\x2a\x7e\x76\xbe\x5c\xb1\xd5\x55\xe7\x26\x3a\xe1\x02\x27\xfa\x40\x64\x5d\xa5\x34\xde\x3a\x63\xf6\xfe\x13\x63\xcf\xc6\xf8\xee\xad\xed\xf8\xdb\xad\xec\xf8\x9d\x75\x1d\xdf\xb5\xaa\x73\xf3\x57\x09\x2c\x2f\xaa\xf3\x8b\xea\x09\xbc\x5a\x77\x60\x11\x24\xe9\x39\x5f\x97\x2b\x9e\x6b\x17\x0d\xa4\x65\xb5\xae\x0b\x42\xcb\xc6\x9d\xb7\x85\xba\xf1\xb3\xc5\xbc\x56\x93\x56\x83\x9b\xad\xf8\x3d\x44\x48\x30\x45\x24\x8c\xa6\xc8\xa7\xc1\x14\x85\x98\xf4\x1b\xab\x3b\x0b\xee\x89\x67\xfa\xa3\xfe\xa5\x05\xf5\x4b\xb3\xf5\xde\x02\xbd\x77\x3d\x6c\xd7\xb8\xbf\x00\x66\x6a\xe1\x26\xc4\xfa\xdd\xbb\xfe\xf6\xe6\xad\x25\xda\x6f\x61\x6a\xe2\x0f\xf0\x48\x93\x5b\xf0\xcb\xc6\xec\x60\x11\x6e\xac\x94\x00\x70\xd2\xdc\xd6\x0b\x23\x40\xe4\x79\xe8\x2e\x12\x03\x6d\x73\x53\x82\x2e\x09\x91\xbd\xf8\xe4\x73\xad\xe8\x19\x26\xe6\x0c\x42\x33\x4e\x9e\xd5\x9d\x78\xc2\x16\x30\xf7\xd3\xeb\xda\x21\x22\xa6\x39\xb4\x74\xbd\x5c\xa5\xe3\xf2\xef\xa1\xff\x94\x4a\x82\x4f\x49\x89\xba\x8b\x62\x42\xd6\xd6\x69\xf3\xa7\x04\xee\xa0\xef\x83\x8b\x58\xef\x2a\x66\x61\xbd\x82\x5a\x90\x77\xd6\x13\x24\x9d\x42\x82\xe4\x3a\x15\x04\x49\xa7\x74\x20\xb9\x7e\xcd\x40\xc5\x30\x1e\xe3\x18\x77\x59\xc6\xd7\xe2\x19\x77\x99\xc6\xbb\x70\x6d\xd4\x83\x34\xae\x66\x6a\xa4\x5c\x54\x4b\x69\xcd\x66\x4d\xcf\x19\x4c\xe6\xd5\xee\x6c\x10\x85\x80\x38\x80\xfb\x66\xdf\x1d\x81\x5c\x6c\x30\xf3\xe5\x25\x52\x30\xe3\xab\x11\x2f\xc4\x00\xbb\xb6\xf8\x80\x4c\x94\xc1\x0f\xe4\x47\x99\xf4\xc2\x67\xbb\x0b\x9c\xcc\x78\xc5\x86\x4f\x76\x78\x6b\xd0\x90\x3d\x2d\xc5\x2b\xc8\xfc\xe2\x6c\x01\x9d\x33\xb8\x55\x2d\xc1\x3a\xcd\x9e\xa2\x36\x93\x36\x02\xef\xf8\x4e\xa2\xd3\xe8\x68\xa9\x7d\x43\xb1\x10\x12\x7f\x75\xea\xd9\x68\xcf\x05\xfb\x44\x83\x9d\x2f\x2f\xad\x79\xa9\x55\x5a\x27\xc6\x3c\xc7\xd4\x93\x13\xa1\x85\x93\x37\x1b\x1b\xef\x27\x1b\x69\x6b\x47\xd0\x03\x3b\x10\x18\xdb\x11\xb0\xbe\xdd\xee\x9b\xeb\x99\x81\x23\xac\xb6\x3d\x0a\xa0\x4b\x13\xa1\x97\x00\x5e\x0f\x5d\x8b\xe5\x27\x1b\xdc\x82\xe3\x6d\xc0\xa5\x7d\x9d\x6c\xb0\x4b\x8f\x0a\xf6\x49\x03\x0b\x7a\x74\x9a\xf7\xfa\x62\x05\x1e\x25\xaf\x13\x11\xa6\x3e\x6e\xe5\x27\x9b\x40\xc5\x02\x34\x99\x28\xde\x9a\xa3\xc1\x8a\xbe\x3a\x1f\x6c\x7b\xbd\x01\x6c\x4f\x1a\x6c\x32\x6a\x48\x6c\x4f\x7a\xd8\x9e\x8e\x63\xfb\x5d\x9d\xaa\x13\x0a\x1d\xf6\x89\xfa\x21\xd1\x62\xa6\x68\xa7\xb7\xbd\x17\xb3\x25\x7a\x5e\x3a\x2c\x5b\x90\xac\xef\x7c\xc4\xf7\xb5\xaf\x32\x95\x6b\xbe\x7f\xb2\xc9\x77\x24\xd7\xa0\x75\x99\xb1\x00\x92\x16\x34\x16\x90\x6a\xe8\x27\x2d\xb4\x3d\x24\xc1\x60\x31\x5b\x3e\x93\x59\xca\x51\x67\x3e\x4c\xe7\xcb\xda\xd9\x17\x4b\x48\xf4\x1c\x21\x5e\xbc\x40\xb7\x24\x46\x27\x1e\x34\x5f\x99\xd4\x9d\x7e\xf0\xa0\x65\x12\x4c\xbb\xee\x1f\x5c\xa5\xe9\x13\x74\x57\x7b\x6e\x33\x74\xd4\x75\x9d\x06\x87\x11\xf9\xd3\x1d\x91\x77\xe7\x3c\xda\xee\x6e\x35\xe3\xd1\xef\xb2\xe2\x4a\x43\x03\xb3\x1d\x43\xe6\xa2\xe0\xda\x3d\x7f\x3a\x42\xe3\xc9\x8e\x34\x5c\x63\xdb\x8a\x2d\xd6\xe7\xcb\xb5\xd3\x4a\x20\xfc\x3e\x2f\x9f\x48\xc7\x38\x79\xa3\x4d\x28\xb6\x76\x68\x1d\xf3\x64\xc3\x6d\x06\x3e\x05\x39\x36\xfa\x59\xe3\xc7\x79\x89\x58\x05\x43\x20\xc4\x4b\x73\x4e\x78\xe2\x41\x1f\x8c\x45\x5b\x9b\x97\x23\xaf\x09\x00\x46\xb8\x13\xaf\xee\x8e\x84\xb6\xb9\xfc\x89\x57\x77\x46\xc1\x59\xc6\xad\xc3\x43\x74\x3c\x73\x05\xbf\xed\x87\xf5\x6b\x0e\x19\xe3\xa1\x11\x69\xe1\xab\x8e\xc3\xcd\xb8\x32\x62\xdc\xbb\x85\xd4\xba\xd5\x49\x63\x70\xdb\x37\xd9\xe0\xa6\xd1\x44\x4b\x42\xf6\xb6\x19\x00\x25\x02\xd2\x43\x40\x06\x08\x9c\x52\x14\xb9\xc7\x6a\x79\xe9\x10\xe2\x5c\xf3\x86\x93\xd6\x35\xde\xa1\xc9\x6f\x8a\x7d\xf9\xc3\xed\x9a\x19\xf8\xea\x8a\x1f\x73\xcd\x6b\x4e\x5a\x17\xd2\x31\xc2\x0f\x2d\xc6\xf9\xf2\xf2\xd3\x27\x68\x7f\x58\x9a\xde\x48\x06\xfa\xb6\x7a\x5a\x67\x1a\x52\x8c\x6f\xbd\xc9\x4c\x78\x3e\xfa\xd2\xd6\xc1\x62\x73\xc4\x4e\xbe\xd2\x6d\x21\x5c\xd2\xb1\xd8\xf1\xcf\xb5\x2d\xca\x30\x49\x73\xe3\xbb\xa2\x06\xf0\xcd\x8c\x8f\x68\x37\x9c\x06\xfa\x1a\x26\xaf\x86\xf3\x40\xd7\xdd\x4b\x85\xaf\xb3\x95\x0a\x36\x49\x65\xbc\x9c\x77\xf7\x3b\xe1\x3d\x74\xd8\xe5\x7f\x0f\x7d\xdd\xff\x01\x88\xc3\x02\x4d\xb3\x9b\xeb\x9f\x64\x13\xd4\x27\xcf\xe1\xe9\xd3\x8c\x35\xf3\xc6\x39\x48\x74\x68\x54\xbd\x0e\x52\xcf\x02\x0e\x71\x1e\x1a\x37\xd3\xbd\xfc\xaf\x0b\xce\xff\xce\x87\x48\x67\x6c\x3d\xab\x8d\x7b\xab\xbb\xe8\x07\x5c\x7c\xca\x64\xe1\xf8\x9c\xd0\xf6\x29\xbd\x2d\x9d\xdf\x7d\x0e\xb1\xa5\x67\x9f\x95\xd3\x52\x43\x35\x31\xa7\x27\x9c\x3b\xcd\xcd\x69\xa8\xd4\xf4\x9c\x8e\xea\xba\xf3\x8a\xad\x28\xdc\x9d\x78\x32\xe8\xc4\x93\xeb\x76\xe2\xc9\xa0\x13\x4f\x76\xeb\x84\x59\x55\xd2\x74\x95\x93\x55\x4b\xb4\xe2\xd5\xaa\xe4\x1f\xb8\x61\x03\x22\x52\x87\xbb\x65\x3c\x38\xbf\x58\xcf\x6a\x36\x4c\x22\x32\x40\x3e\x1d\x42\x7e\x7a\x79\x62\xc3\xe9\xa1\x86\xf4\x74\xe8\xc2\xd6\xf3\x44\x37\xb4\x6b\xd2\x1e\xbf\xd4\x16\x4a\x43\x38\x6b\x0e\x3b\x6d\x11\x21\xb6\x5c\xcc\xa9\x3f\xb6\xfb\x33\x9d\x62\xff\xb2\x5d\xf3\x9a\xdb\x35\xfd\x5d\x37\x6b\xfa\x63\x5b\x35\x7d\xc7\x46\x4d\xff\xcb\x36\xcd\x9b\xde\xa6\xe9\x6f\xb9\x49\xd3\xa0\x96\xce\x16\x4d\x7f\x9b\x0d\x9a\xbe\xfd\x18\x7e\xb3\xf1\xf0\x1e\x0d\x3e\xbe\x9d\x52\xfc\x2f\xb2\x5d\xb3\x5f\x60\x27\xc4\xe4\x77\xdb\xc3\x59\x97\xdb\x11\x34\xff\x58\xe5\x76\xae\xb5\xdb\x52\x3d\x6e\x77\x7b\xd6\x30\x3b\x15\xe4\x09\x31\xe9\x6c\x0b\x09\x31\xb1\x6e\x33\xa1\x5b\x16\xe4\x11\x80\x9d\xad\x26\x54\x55\xb5\x08\x31\xb9\xb1\x23\xc4\x7a\xf7\xad\x35\x79\x06\x9b\x1c\xbc\x4d\x96\xa6\x69\x92\x87\xf9\x54\x2b\xd8\xb3\x37\x35\x41\x46\x24\x61\x24\x21\x4c\x2f\xe7\xb3\x67\xa8\xdb\x63\x68\x9a\xe0\x30\xf1\x70\xc8\xf4\xea\x3f\x66\x22\x38\x24\x05\xcf\x64\xcd\xa0\xba\x36\xd0\x96\x44\xa2\xd8\xf7\x49\x14\xc9\xb2\x42\xaa\x72\x90\x99\x08\xe5\x69\x10\x30\x1a\xeb\x75\x85\xb6\x24\x92\xa7\x5e\x46\xb8\x97\xeb\x65\x88\xcc\x44\x82\x38\x0d\x03\x8a\x73\xbd\x48\x51\x2f\x35\xbd\xe9\x2a\x45\xc2\x9e\xae\x59\xa5\x08\x47\x5f\xca\x14\xdd\x50\x4e\x44\x77\x2e\x53\x24\x9a\x8c\xe5\x45\x7a\xcc\x18\x66\x46\xf4\x4b\x99\xa2\x9b\xcf\x8d\xe8\xb6\x65\x8a\x8c\xca\xe9\xe6\x47\x74\xb4\x4c\x91\x4f\xdd\x65\x8a\xc4\x30\x7e\x8f\x12\x53\xb6\x44\xfe\x45\xb2\xa5\x7f\xe9\xc3\x2d\x37\x7b\xb0\xe5\x33\x1d\x59\xb9\x7e\x12\x25\x1f\x35\xdd\x55\x88\x7e\xae\x77\xf0\x1a\xee\xba\xe9\x6e\xf2\x3d\x60\xe7\xe7\xf3\xab\x89\xfa\x71\x8a\xd8\xea\xf4\xe2\x8c\x2f\xaa\x75\xff\x4e\x1e\xfd\xf8\x4c\xcb\x0f\x94\x52\x6a\x49\xf4\xc8\x7b\x9b\x80\x50\x46\x8a\x04\xf2\x8a\x3c\x26\x94\x71\x42\xf6\xa6\x43\xb8\x18\xfb\x71\x10\x24\x50\x66\x90\xf8\xbc\x88\xc2\x2c\xd7\x53\x83\x41\x83\x34\xcc\xbc\x22\xcd\x0a\xb8\x00\x21\x0b\x72\x3f\x25\x85\x09\x31\x4f\xd2\x30\x4f\x59\x08\xb7\x67\x63\x9a\xe4\x69\x9a\x39\x11\xfb\x49\x18\x65\x24\x4c\x21\x9d\xf1\x03\x9a\x86\x3e\x35\x21\x0e\x93\x02\x63\x5c\x00\xc7\x69\xe4\x85\xb9\x87\x13\x27\xe2\x84\xf8\x05\x25\x0c\xae\xdc\x66\x05\x4e\x82\x22\x49\x4d\x88\x59\x8a\xb3\x90\xe7\xc0\x71\xce\xa2\x9c\x62\x4c\x9d\x88\x73\xea\xc5\x8c\x49\x19\x33\xdf\xf3\x3d\x12\x18\x65\x8c\x09\xf5\xc3\x54\xde\x19\x11\x84\xb1\x17\x15\x29\x77\x22\x26\x81\x8f\x69\x98\xc2\xdd\x11\x01\xe7\x41\x4a\x68\x66\x14\x45\xe8\x65\x71\x9e\xc1\x05\xe2\x79\x58\x14\x69\xc0\x89\x13\x71\x4c\x52\x1e\xe6\x31\x88\xa2\x20\x71\x4a\x93\xc8\xa8\x3c\xea\xe5\x3c\xc5\xf2\xf2\x0a\x3f\xc5\x51\x12\xa5\xd8\x2d\xe3\x34\xcf\xbc\x48\x56\xa8\x24\x61\x16\x63\xe2\x87\x26\xc4\x19\x4e\xd2\x02\x4b\x06\xb2\x22\x4a\x48\x94\x04\x4e\xc4\x3c\x48\xd2\x28\xc9\x40\x76\x09\x2f\x70\xc0\x72\xa3\x8c\x79\x91\xf2\x20\xa6\x70\x8d\xb8\x4f\x83\x82\x84\xdc\x77\x22\xf6\x8a\x0c\x27\x79\x06\x0d\x68\x4a\xb3\x3c\x4c\x8d\x1c\x93\xc0\xcb\x18\xce\x32\xb8\xa4\x3d\x66\x59\x92\x45\xa1\x5b\x79\x39\x4f\x48\x16\x81\x83\x84\x09\x49\x3d\x12\x1b\x11\x07\x2c\x0e\x68\xc0\xe0\x1d\x21\xe2\x2c\xe2\x01\x75\x73\x1c\x66\xa9\xc7\x92\x1c\x38\x49\xf3\x00\x17\x69\x1e\x18\x5d\x3a\x2a\x12\x4a\x73\x40\x4c\x7d\x8c\x43\x3f\x75\x73\x9c\x50\x9f\x87\x38\x24\xe0\xd2\x3c\x8a\xf2\x82\x99\x1d\x84\xfa\x38\x8b\x22\xc8\xf0\x49\x9e\x06\x3e\xc1\x9e\x3b\x56\x78\x9e\x4f\xe2\x8c\xca\x3b\xdf\x8b\x94\x60\xdf\x68\x6e\x69\x11\x26\x71\x91\xa9\xfa\xa6\xbc\xf0\x38\x77\x5b\x45\x16\x71\xcf\x4b\x0b\x30\x7c\x3f\x67\x94\x16\x99\xd1\x2a\xf2\x90\xc5\x09\x0e\x00\x71\xe2\x7b\x8c\xc5\xc4\x2d\x0a\x2f\xca\x58\xe4\x87\xf2\x7a\x17\xcf\xf3\x29\x31\x3b\x08\x0e\x48\x42\x12\xf9\xee\xe5\x31\x8f\x47\x3c\x76\x8b\x82\xc4\x69\xec\x31\x0a\xc1\x25\x88\x72\x42\x8a\xc2\xe8\xd2\x84\x63\x21\x26\x10\x59\x98\x91\x28\x4b\x48\xe4\x44\x1c\xe4\x24\x8b\xf2\x02\xac\x22\x64\x59\x40\x18\xcf\x8d\xb1\xc2\xf7\xa9\x97\x63\x10\x59\x92\x27\x61\xea\xe7\x85\x13\x71\x14\x7a\x2c\xf6\xc3\x40\x3a\x08\x2b\x22\x3f\xe7\x66\x73\x8b\x98\xc7\x52\x88\xdb\x7e\x16\xc7\x29\x61\xee\xb0\x49\x71\x46\xb2\x84\xc8\xe8\x16\xf3\x9c\x71\x1e\x99\x10\x27\x24\x26\x24\x93\x22\xc3\x01\x25\x7e\xe8\xa7\x4e\xc4\x8c\xa4\x05\xa7\x4c\xc6\xd9\xac\xc0\x9e\x1f\x19\x1d\x84\x51\xcc\xa2\x28\x00\x8e\xd3\x2c\x20\xbe\xe7\xb9\xa3\x5b\x46\x82\x94\xa6\xb1\x07\x71\xd6\x2b\x68\x12\x27\xd8\x18\xdd\xe2\x28\x0b\x31\x03\x19\x7b\x51\x18\xa4\xdc\x77\x5b\x45\x8e\x13\xc2\x29\x4e\x00\x71\xc4\x8b\x90\x60\xe3\x98\x97\x47\x49\xe2\x45\x04\x74\x11\x86\x51\xc8\x92\x11\xcf\x2b\x02\x8f\xfb\xa1\x94\x5d\x18\xc7\x98\x78\x84\x19\xed\xd8\x8b\x18\xf3\x64\xcf\x7c\x92\xa6\x39\x4e\xdd\xca\xc3\x09\x0b\x32\x8c\x21\x6c\xa6\x34\x27\xb9\x97\x19\x39\xc6\xdc\x8f\xa3\xcc\x93\x76\x8c\x03\xcc\xd2\xd0\x1d\xdd\x48\x1c\xd0\x38\x0e\xc0\x8e\xf3\x82\x72\x9e\x26\x89\x09\xb1\x1f\xa4\x5e\x9a\xa5\xd0\x33\x8e\x93\x34\xa0\x23\xe6\xe6\x27\x38\xf3\xb2\x14\x94\x92\x85\x59\x12\xb2\xc8\x37\xc6\x63\x9e\x53\xc6\x02\x08\x9b\xdc\x0f\x30\x65\x99\xdb\xdc\xc2\x34\xc9\x32\x16\x14\x72\x64\x88\x7c\xee\xc7\x46\xc4\x11\x25\x3c\x2a\x64\xb0\xca\xa3\x94\xa4\x94\xb9\x45\x11\x07\xb4\xa0\x84\x83\x83\x84\x39\x2f\x52\x62\x8e\x15\x31\x65\x61\xe4\xcb\x91\x26\xf0\x71\x4c\x8a\xc8\x6d\x15\x34\xc8\x68\x4c\xb1\xcc\x84\x70\xe1\xb1\x34\x36\x86\x4d\x9a\x65\xb1\x47\xa4\xf2\x30\x8b\x02\x3f\xe1\xee\xdc\x2d\xf1\x52\x5e\x14\x05\x93\x59\x64\xe4\x63\x4e\x8c\x56\xc1\x82\xd0\x8b\x32\x0e\x9e\x97\x73\x4a\xd2\x9c\xbb\x73\xb7\x94\x17\x09\xf3\x0b\x39\x32\x90\x2c\x8a\x13\x6c\xce\x2b\xa2\x18\xc7\xb4\x90\x43\x98\x1f\x93\xd0\x27\x6e\xe5\x65\x8c\xc4\x3e\xcf\x40\xc6\x9c\x91\x28\xc2\x89\x51\xc6\x39\xa6\x51\x4a\xe5\xd0\x44\x84\x21\x91\xee\x24\xe0\x30\x11\x61\x39\x8b\xf3\x1c\x1c\x24\xcb\xb9\xc7\x53\x6c\x0c\x9b\x45\x18\xe7\x41\x11\x17\x6a\xd0\xe5\x39\x8e\xdd\x76\xec\x45\x85\x17\xc5\x32\x5f\x88\x09\x8e\xa3\x22\x35\xba\xb4\xc7\x22\x3f\xce\x33\x70\x10\x46\x32\x9a\x50\xe6\x1e\x41\x30\xf6\x8b\x84\x7a\x81\x9a\xb8\x4b\xbc\x9c\x19\x39\xc6\x69\x8c\xbd\xd4\x97\xf1\xd8\xc7\x59\x10\x63\xb7\x8c\x09\xcd\xd3\x38\x2e\x42\x69\x15\x5e\x10\xe7\xd4\x18\x8f\x7d\x92\x31\x96\xc6\x60\x15\x81\x97\xc5\x24\x48\xdc\x0e\xe2\x67\x09\x4f\xb9\x07\xa2\xc0\x61\x96\xa4\x3c\x35\x2a\x2f\xf0\x71\x1e\xc5\x19\xf4\x2c\xc9\xb0\xe7\xe5\x81\xdb\x8e\x83\x2c\x0b\xf3\x40\x26\xde\x59\xea\xf3\x80\xa4\xc6\xa1\x49\xa4\x2b\x24\x49\x20\x58\x15\x59\x14\xc6\x5c\x84\x57\x57\xac\x28\xb2\x34\x2a\x98\x1c\x24\x59\x1e\x15\x8c\x1b\x39\x8e\xb2\x20\xc0\x09\x05\xc4\x01\x0b\xe2\x90\xe2\x58\x4d\xa2\xbe\x75\x1c\x5b\x6d\xdf\x0b\x5f\x5d\xf7\x84\xaa\xed\x1a\xb4\x57\x9d\x13\xaa\x3f\x5f\xef\x84\x6a\x88\xc9\x76\x4b\x07\x86\xe5\x88\x9b\xaf\x3e\x7a\xdd\xa5\x83\x88\x79\x09\xaf\x27\xdc\xfd\x34\xcb\x12\xcf\xb2\x74\x90\xa6\x51\xcc\xb8\x1c\x7e\x69\x90\x31\x16\x77\x53\x17\x07\x11\x3f\x8b\x78\xe1\xc7\x10\xc9\x0a\x9e\x04\x05\x15\x91\xcc\x04\xc9\xc2\xa0\x28\x42\x1f\xbc\x20\x2c\x70\xee\x47\xc5\xb6\xb3\xfa\x21\xf6\x78\x48\x64\xf0\x61\x39\x8f\x28\xc9\x2d\x4b\x07\x49\xea\x85\x11\x95\x06\x49\x52\x9f\x47\x19\x2e\xb6\x24\x82\x0b\xea\xe7\x89\xb4\xf9\x22\x0d\x70\x9a\x47\x96\x9e\x84\x29\xf7\xb2\x5c\xa6\x41\xd8\x8f\x39\xc1\x71\xb2\xcb\xd2\xc1\x4d\x9f\x23\xdd\xa6\x34\x2c\xc0\x79\xf6\xca\xaf\x8f\xb1\xbd\xf4\xeb\x63\x62\xaf\xfd\xfa\xd8\xb7\x17\x7f\x7d\x1c\xd8\xab\xbf\x3e\x0e\xed\xe5\x5f\x1f\x47\xf6\xfa\xaf\x8f\x63\x4b\x01\x58\xd9\x41\x28\x0f\x6b\xdc\x07\x2e\x9f\xcf\xe5\xf3\xe1\x61\x0f\x29\x03\x68\x6e\x3c\x02\x25\x9f\xcf\xe5\x73\x4b\x73\x02\xcd\x89\xb5\x39\x99\xcb\xe7\x96\xe6\x3e\x34\xf7\xad\xcd\xfd\xb9\x7c\x6e\x69\x1e\x40\xf3\xc0\xda\x3c\x98\xcb\xe7\x96\xe6\x21\x34\x0f\xad\xcd\xc3\xb9\x7c\x6e\x69\x1e\x41\xf3\xc8\xda\x3c\x9a\xcb\xe7\x96\xe6\x31\x34\x8f\xad\xcd\xe3\xb9\x7c\x6e\xd8\xd6\xb7\x65\xd1\x63\x69\x19\x26\xe4\x4c\x1a\x45\xbf\xe2\x1e\x6c\xb9\x95\x06\x61\x6a\x95\x4a\x5b\x30\xb5\xca\xa4\x1d\x98\x5a\x65\xd2\x04\x4c\xad\x72\xa9\x7e\x53\xab\x5c\x6a\xde\xd4\x8a\x4b\xad\x9b\x5a\x71\xa9\x70\x53\xab\x42\x2a\xdb\xd4\xaa\x90\x7a\x36\xb5\x3a\x95\x3a\x36\xb5\x3a\x95\xea\x35\xb5\x9a\x49\xd5\x9a\x5a\xcd\xa4\x56\xe7\xa6\xba\x83\xae\xa3\xbb\x5b\x5e\x87\x6a\xad\xa7\x5d\xd3\x7f\x55\xca\xda\xc3\xb6\xe3\xe6\x0f\x61\x04\xaf\x97\xcf\x86\x20\x5b\x14\x8a\x96\x64\x84\x08\x5e\x95\xf5\x69\x03\xbd\x6a\x34\xfa\x1a\x91\xb7\x00\x69\xae\xe5\xda\xe2\x98\x4b\x1c\xea\x7c\x41\x1f\x07\x9c\x9a\xbf\x56\x05\xea\xc3\x43\xf4\x1f\x50\x8d\xd8\x4e\xbc\x2e\xe9\xbc\x53\x85\xea\xcd\xac\xa9\x73\xbc\x19\x3b\x8b\xa7\xc0\xe6\x5a\x0b\xf7\x79\x3c\x09\x35\xeb\x54\xc1\x9e\xc9\xe2\xbf\x7a\xf1\xea\x39\x94\x28\xae\xcb\x01\x77\xe0\xe8\x00\x0e\x36\xbd\xbe\x43\x5d\xb0\xd8\x75\xc2\x54\x42\xce\x3b\x5c\xcc\x87\x5c\xcc\x4c\x5c\xcc\x87\x5c\xcc\x74\x2e\xba\x70\xf1\x10\xce\x52\xc9\x58\x57\xa9\xa5\x66\xce\x07\xad\xf6\xf6\x2e\xc5\xb7\x5b\x8d\xe2\xed\x34\x8a\x5b\x8d\xe2\xad\x34\x8a\x67\x9d\x02\xdf\xb3\xba\x0a\xb7\x56\x98\x7b\xae\x6a\x75\x6b\x42\xc2\x4a\xc2\x5d\x30\xd8\xc7\x9c\x68\x2a\xad\xf1\x45\xa3\x2a\xc5\xf3\x0e\x1b\x73\x03\x1b\x33\x13\x1b\xf3\x01\x1b\xb3\x0e\x1b\x5d\x84\xd1\x00\x1f\x89\x9c\x3a\xdd\xa9\x76\xb8\x2b\x94\xc4\xad\xda\x63\x97\xda\x5f\x95\xb1\x8c\x5c\xc6\x81\xb9\x07\x39\x57\x90\x8e\x33\xe1\x12\x12\x47\x5a\x20\xb1\xde\x0a\x5d\xc3\x4a\x06\xb0\x31\xb3\xe8\xc3\xce\x6b\xd8\x51\x1e\xda\x48\x33\x17\x42\x2b\xe3\xfe\xc8\xd5\x05\x6f\x43\xd9\x4c\x82\xcf\xa0\x66\x9b\xc0\x23\x34\xe9\xed\xa1\x07\xb5\x77\x36\xbf\xfc\x0f\x84\xd1\x3d\x34\xd8\x36\x3d\xe4\x43\xfc\x5b\x6b\x70\x9c\x0d\xf1\xef\x7e\xe3\x2d\x16\x2e\xf0\x75\xb9\x00\x29\x6e\xc9\x83\xd4\xce\x90\x03\xa9\x89\x01\x7d\x33\xd2\x76\x54\x7c\x55\xda\xd4\xdb\x8e\x7a\xaf\x4a\x13\x73\xf6\x9a\xf8\xaa\x28\xfe\x0c\xdd\x46\xc5\x4c\x95\xc5\x17\x5f\xcc\xe7\xf8\x64\x1b\xe9\xfb\x7c\x2e\xda\xcc\x55\x1b\xf1\xe5\x74\xee\x28\xa6\x3f\x83\x6a\xfa\x02\x75\x2a\xe9\xc0\xe7\x4c\x7e\x4e\xd5\x67\x7b\xf3\x39\x34\x17\x54\x52\x49\x12\x3e\x67\xf2\x73\xaa\x3e\xbb\x4b\xf2\xcf\x64\x4d\x7e\x15\x70\xe4\xb8\xc2\xe6\xb2\xbc\xf4\x9e\x2c\x7e\xc0\x66\x75\xc5\x7e\xf5\xb0\x53\xb3\x7f\xa6\xdd\x22\xc1\xea\x51\xc7\x59\x99\x1f\xde\xa6\x26\x0d\x22\x45\x73\xd6\xa5\x39\xef\xd0\x9c\x75\x69\xce\x75\x9a\xb3\x6d\x68\x62\xd9\x4f\xae\x86\x06\x79\xde\x84\xcb\x41\x81\xd6\x65\xff\x67\xf5\xa5\x15\xda\xc3\xa0\x7d\x28\x68\xfa\xf5\x33\x59\x86\xdb\x4d\x53\xf6\x53\x01\xd7\x34\x67\x5d\x9a\xf3\x0e\xcd\x59\x97\xe6\x5c\xa7\x39\x6b\x69\x1a\xb3\xce\xf1\x7b\x08\xcc\xbc\xfe\x08\xd5\x97\x7e\xb4\x1f\xa6\xfa\x11\x9c\xf7\xc7\xd2\x75\x8c\xea\x47\x08\x06\x3f\x96\xb6\x10\xfa\x01\x2e\x4a\x10\x30\xb3\x79\xc3\xa2\xc9\x29\x25\xa0\x20\x38\x6b\xfb\x22\xc3\x45\x85\xf5\x70\x31\xdb\x26\x56\xb5\x64\xc5\xbf\x42\x22\x6e\x9a\x15\x90\xca\x66\x26\x82\xd9\xb5\x28\xfe\x68\x0c\x3d\x7d\x8a\x3f\x96\x26\x8a\x3f\x96\xd7\xa1\x68\x0e\x76\x7d\x8a\xaf\x8c\x14\x5f\x99\x28\x9a\xad\xad\x7f\x79\x85\x85\x24\x4c\x5e\xd4\x6e\x0f\x80\x56\xee\x60\x1e\xa4\x8e\x4a\xfb\x32\x3c\x02\x8b\x44\x67\xb1\xc6\xb5\x1d\x9b\x7f\x3d\xcf\x59\xc5\xd1\xa5\xfb\x4d\x5f\xfc\xc1\xfb\xa6\xd1\xbe\xe1\x75\xf3\xd4\xc4\x36\x0c\x40\x85\xa9\x0d\xbc\xd8\x16\xa6\x36\xf0\x0e\xcd\x4d\x6d\xe0\x15\x9a\x9b\xda\xc0\x2b\xf9\x24\x9f\xc3\xf5\x1d\x73\xdb\xfd\x1d\xf0\x4e\x3f\xc9\x67\x00\x25\x45\xc7\x75\xc9\xe5\x03\xa1\x59\x6f\x02\x11\x98\x32\x13\x8f\x30\xa5\x90\x99\x78\x84\xd9\x8b\xd4\xd4\x06\x26\x2f\x52\x53\x1b\x98\x27\x61\xa6\x36\x30\x4d\x32\xb8\xcd\x40\xfc\xc1\xb4\xcb\x44\x9a\x7a\x45\xac\xc2\x80\x89\x9b\x89\x94\x83\xb0\xac\xfd\x76\xc4\x91\xd2\xa8\x86\xc9\xce\x8d\x5e\x56\xa2\xcd\x19\x42\x66\xf0\x18\xec\x9f\x0d\xb2\x81\xc7\x4d\x31\x8a\xc9\x63\xb0\x7b\x26\x99\x7d\xec\xe9\xdc\xb2\x21\xb3\x7d\x3c\xda\x2c\xa3\x24\x08\x22\x4a\x87\x04\x71\x4b\x10\xc4\x93\x2a\x82\x9d\x48\x90\x8e\x13\xd4\xe6\x25\x25\x41\x02\x21\x76\x48\x90\xb4\x04\xc9\xac\x1e\x97\x26\x00\xaf\x85\xd7\x71\x82\xda\x4c\xa6\x24\xe8\x0b\x82\xf9\x90\xa0\xdf\x12\xf4\x05\xad\x5c\x11\xf4\x47\xdc\xa1\x8f\x47\x9b\xfb\x94\x04\x03\x41\x90\x0f\x09\x06\x2d\xc1\x40\xd0\xe2\x8a\x60\xa0\x13\xe4\xe3\x04\xb5\xd9\x52\x49\x30\x14\x04\x8b\x21\xc1\xb0\x25\x18\x0a\x5a\x85\x22\x18\xea\x04\x8b\x71\x82\xda\xfc\xaa\x24\x18\xc1\x4b\xc5\x90\x60\xd4\x12\x84\xec\xfd\x54\x11\x8c\x3a\x2f\x11\xe3\x04\xb5\x19\x59\x49\x30\x16\x04\x67\x43\x82\x71\x4b\x10\x5e\x9b\xd4\x98\x2c\xe0\x5d\x49\xc0\x27\x9f\xbd\xf8\x72\x29\xce\xcd\x5d\x8a\x83\x45\x72\xaf\x6e\x36\x13\xc8\xa0\x0e\x8b\xef\xdd\xf4\xb5\x38\x66\x32\xf8\x9f\xf2\x62\x9c\xe3\xe5\xe2\x03\x5f\xc9\x2a\xbf\xa8\x5a\x22\x9f\xdc\x4d\xcb\x4a\x24\x28\x39\x62\xb0\x3f\x3b\xe5\xc5\x72\xc5\xd5\x76\xea\x81\xd6\xb4\xb3\x26\xda\xda\x5d\xb5\x7c\xed\x93\x9b\xb8\x88\xe7\x8f\x7a\x05\x8f\xce\x67\x53\x1f\xe4\x1e\xc2\x1e\x09\x0e\x7d\x55\xa7\xf8\xcb\xe9\x26\xeb\x51\xa5\x10\x93\x5d\x4f\x37\x89\x26\x23\xa7\x9b\x3a\xdb\x1a\x06\xa7\x9b\x42\x4c\xbe\x9c\x6e\xba\xe9\xd3\x4d\x42\x2b\xdb\x9d\x6e\x32\x2a\xa7\x73\xba\x49\x2a\xc8\x79\xba\x49\x9e\xa3\xdd\xf2\xf4\xb7\xff\x87\x3e\xcf\xc4\x17\xd9\xdd\x94\xad\x79\x14\xf4\x1e\x9c\xe5\x61\x1f\xf4\xc3\xf9\xfb\xbc\xe8\xfd\x98\x95\xe7\x33\xbe\xfa\x5d\x8e\x44\x69\xac\xc2\x77\xc1\xa1\x7c\x20\x19\x83\xcf\x3a\x3f\xff\x0a\x47\xa7\x5e\x6d\x75\x27\x10\x6c\x9e\x39\x86\xae\x37\x70\xda\x6f\xe3\x47\xa1\x0e\x0f\xd1\x73\xbe\x3a\x83\x51\xf4\x78\xb6\x2c\x33\x8e\x70\xff\xda\x14\xd1\xfc\xf9\x31\xee\x9e\x5d\x0a\xe3\x29\x0a\x92\x29\x0a\xf0\x14\xf9\xfe\x14\x91\x70\x8a\x70\x3c\x45\xc9\x14\x21\xac\x6d\x35\x0a\xe9\x14\x85\xde\x14\x05\x64\x8a\xfc\x60\x8a\x48\x34\x45\x98\x4e\x11\xf6\xa6\x88\xe8\x70\xc9\x14\x85\x78\x8a\x02\x7f\x8a\xfc\x70\x8a\x48\x3c\x45\x38\x99\x22\x2c\xf0\x6b\x70\x91\x37\x45\x21\x99\xa2\x20\x98\x22\x3f\x9a\xa2\xc8\x9f\xa2\x30\x9c\xa2\x20\x9e\x22\x3f\xd1\x00\x7d\x3c\x45\xc4\x9f\x22\x1c\x4e\x51\x3c\x45\x28\x22\x53\x14\x06\x53\x14\xc0\xd5\x02\x3a\xa0\xe0\x84\x4c\x11\x0e\xa6\x28\x12\x80\x78\x8a\x42\x7f\x8a\x82\x70\x8a\xfc\x58\x03\x24\xc9\x14\x11\x3c\x45\x58\x90\x9c\x22\x44\xe8\x14\x11\x6f\x8a\xb0\x60\x47\x82\xbd\x75\xc8\x95\x98\xe5\x4a\xba\x72\x15\x5c\x08\x39\x8a\x7e\x13\xf1\x79\x8a\x50\xa8\x73\xab\x08\x8b\x6e\x09\x6e\x81\x21\x4f\xe7\xd2\x57\x82\x13\x5c\x09\x80\x68\x8a\xf4\xee\xe2\x48\xca\x43\x08\x18\xb8\xf7\xbb\x8a\x10\x0a\x15\x02\x16\xf2\xf3\x63\x29\xd8\x30\xec\xc9\x2b\xf0\x94\xb6\x42\xa9\xfd\x40\xa7\x20\x54\x23\x4c\xc3\x17\x2a\x8d\xa4\xda\x43\x5d\x87\x42\x05\xc2\x1e\x84\x5d\x08\x1d\x0a\xc1\xd6\x59\x4d\xe7\x46\xa8\x8b\xb3\x8b\x39\x83\x6b\x52\x44\x52\xb9\x9e\x95\xc5\xe0\x86\x27\xf0\x82\x1f\x4e\x7e\x7e\xf9\xf8\x87\x47\xf2\x4e\x29\x21\x31\x32\x45\xd0\x79\x21\x21\x2a\x2c\x52\xa9\x09\xa4\xab\x2c\x15\x2b\x75\x12\x65\xbd\x20\x10\xaa\xd3\x7f\xf9\xdd\xb3\xd7\x7c\x8d\xd8\x22\x57\xb5\xd1\xcf\x41\xa5\xf2\x3e\x0d\x03\x1f\x02\xfe\xe7\xe7\x5d\x7d\xf6\x52\x4a\x6f\xe3\xdd\x83\x97\x11\x4a\x3c\x6f\xda\x7f\x56\xbf\x2b\x48\x10\x03\x00\xe9\x00\x50\xcf\x23\x03\x10\x5f\x03\x19\x3e\x0d\xf4\xa7\x06\x02\x61\x97\x00\x31\x10\x88\xba\x4c\x9a\x40\xe2\x5e\x3f\x0c\x84\x68\x87\x91\x21\x8a\xa4\x4f\x65\x88\x82\xe9\x20\x26\x80\xb4\x2f\xad\x21\x48\xd6\x23\x33\x00\xc8\xfb\x5d\x19\x82\x70\x0d\x64\x48\xa1\xe8\x72\x39\x6c\x4e\x5d\xad\x31\x1d\xd5\x07\xa1\x23\x04\x7c\x3a\x62\x55\x41\x9f\x88\xc1\x2e\xa8\xdb\x6e\x22\x3a\x6a\x98\x31\x75\x19\x26\xa5\xa3\xfa\x4e\xe8\x88\xbe\x59\x9f\x09\x83\x49\xf4\xc9\x0c\x39\xc9\xe8\xa8\xc6\x73\x3a\x62\x35\x9c\xba\xad\xbb\xe8\xd3\x30\x68\xde\xaa\x2e\x15\x25\xb0\x59\x90\x44\x7b\x6a\x51\xa6\xdf\x01\x31\x52\x0f\xba\x58\x4c\x7d\x0c\x75\x10\xa3\x4d\xe8\x7c\x1a\x9e\xc7\x5d\x36\x1c\xbe\x81\x1d\xe6\x9f\xf4\x39\xb5\x06\x0a\xec\xd0\x68\xda\xed\x8c\xc1\x2a\x3a\x9d\xb1\xc6\x09\xec\xb0\x5f\xde\x03\xb1\x85\x0a\x6c\x0e\x05\x74\x54\x14\x98\x8e\x8a\x82\xd0\x51\xd5\xfb\xd4\xad\xb6\xa0\x87\xc2\x16\x2b\x5c\xe2\x8e\xa8\xcb\x84\x63\x3a\xa2\x0c\x4a\x47\x24\x99\xd0\x51\xd3\x62\xd4\xad\xd0\xb4\x2f\x6f\xc3\xe0\xd1\xa7\x32\x04\xc9\xa9\x4b\xa5\x9c\x8e\xb8\x50\xd1\xd7\xa8\x7e\x47\xd5\x74\x2c\xcb\x08\x3c\x8f\x06\x1e\xb6\x46\x10\x05\x63\x4d\x33\x1a\x05\xda\x22\x48\x4d\xc4\x33\x11\x09\xba\x44\x8c\x30\x61\x17\x8f\x91\x99\xa8\x8b\xc7\x08\x13\xb7\x30\x06\x2a\x7a\xb0\x35\x36\x4f\xfa\x24\x0c\x48\x58\xbf\x3b\xf6\x84\x43\x11\x32\x20\xc9\x3a\x82\x35\x00\xe4\x2d\x80\x35\x80\x48\x16\x0c\x8d\x8b\xbe\x56\xac\x79\x97\x53\x98\x98\x8e\xf4\x82\x50\x97\xb4\xfd\x3e\x09\x93\x6d\xd0\x9e\xde\x4d\xb6\x41\xc7\x05\x1e\xd1\x11\x43\x8d\xe9\xb8\xa1\x52\x3a\xa2\x94\x84\x3a\x94\xc2\xa8\xdb\x97\xd2\x3e\x07\xf6\x40\xe2\x74\x95\x9c\x8e\x18\x31\xef\xcb\xd4\x1e\x4f\xac\x16\xa4\xbf\x80\x18\x9e\xe2\x2d\xdc\x1e\x93\x2d\x9c\x09\xfb\x5b\x38\x3e\x0e\xb6\xb0\x67\x1c\x3a\x5d\x1f\x47\x63\x2e\x89\xe3\x91\x60\xa8\xa7\xe0\x66\x0c\xc9\x58\xb8\xc4\x6c\xcc\xef\x71\xba\x45\xb4\xc4\xd9\x58\x20\xc3\xf9\x16\xc1\x12\xf3\x2d\x42\x19\x2e\xfa\x1a\x32\x9a\xcb\x58\xa8\xc0\x78\xcc\x43\x31\xd9\xc2\x41\xb0\x3f\xe2\x65\x38\xd8\x26\xb0\x85\x5b\x84\x1d\x1c\x39\xa3\x1b\x8e\xb7\x08\x4b\x98\x6e\xe1\x8b\x38\xd9\xc2\xeb\x31\xdb\x22\x9a\xe2\x74\x2c\x82\xe1\xcc\x15\xc2\x70\x3e\x16\x16\xf8\x16\x61\x14\x17\xbd\x08\xb5\x4b\xaa\x82\xbd\xc0\x12\x8c\xcc\x2c\x93\x8e\x54\xb0\x35\x45\x91\xb8\x4d\xd8\x03\xed\xb9\x67\x78\x1e\xf6\x94\x33\x84\x88\x3a\x42\x33\xd1\x88\x3b\x10\xe3\xc3\xb1\x3d\x37\x69\xa9\xd8\x32\x93\xba\xa7\xb6\xac\xa4\xe5\x62\xc8\x67\xd6\x93\xe6\x10\x22\xef\x48\xcb\x96\x9a\x00\x06\x4b\x5a\xa2\xda\x9a\x25\xe0\xea\x1e\xa6\x63\xec\x13\x6a\x37\x14\x9f\x8e\x19\x4a\x40\xc7\x14\x1d\x52\x77\xe7\x23\xea\x36\xa5\x58\x7b\x3e\x7c\x4a\xa9\x5d\x74\x09\x75\x89\x8e\xd1\x31\xf3\x4a\xa9\xdb\x09\x32\xea\x36\x9d\x9c\x8e\x19\x06\xa7\x63\x4e\x50\xd0\x31\x13\xef\xa4\x15\x16\x23\xc0\x23\xee\x8a\xc9\x88\x85\x62\x7f\x34\x64\xe0\xc0\x69\xa9\x38\x1c\x75\x78\x1c\x8d\x46\x0d\x1c\xbb\x22\x31\x1d\xf5\x44\x9c\x8c\x86\x0c\xcc\x1c\xde\x88\xd3\x91\x70\x81\xb3\xd1\xa8\x85\xf5\x70\x60\x20\xc1\x47\x62\x2f\x2e\x46\x43\x92\x4a\x2d\x9c\xdd\xc4\x4e\xbf\xc2\x64\x3c\xb4\xf8\x8e\xc8\x81\x83\x11\xb7\xc6\xe1\x68\x6c\xc1\x91\xd3\x81\x71\x3c\x1a\xdb\x30\x1d\x09\x3e\x38\x19\xf5\x40\xcc\x46\xc2\x00\x4e\x47\x63\x20\xce\x46\x43\x01\xce\x47\xe3\x11\xe6\x8e\x60\x87\x8b\x6e\x34\xda\x25\x7f\xa0\x9e\x24\x69\x8e\x2d\x75\xf6\x89\xbd\xc0\x92\x4a\xd4\x4c\x1b\x9e\xfb\x2d\x86\xc0\x6c\x88\x81\xdd\x88\xc2\xae\x44\xcc\x39\x44\x93\x1c\x9b\xc8\xc7\x5e\x27\xfd\xb3\x8f\x9f\xf5\x8a\x8a\x39\x83\x68\x75\x6b\xce\x1f\xe4\x73\x73\xee\xd0\x8a\xcf\xb6\x82\xd2\x8a\xc7\x80\x23\xd7\xbc\xd4\x92\x39\xd4\xe6\x6d\xce\x1d\x5a\x05\x5b\xfa\xef\xd4\x2f\xa6\xf6\xee\x11\x3a\xc6\xbc\x4f\xc7\x04\x10\x50\xb7\x8a\x43\x3a\xd6\x85\x88\x5a\xed\x27\xa6\x63\xc6\x47\xa9\x4b\x7e\x49\x97\xb8\x2d\x89\x70\x58\x47\x4a\x5d\xda\xcb\xe8\x98\xf5\xe5\xd4\x6d\xbf\x9c\xba\xdd\xaf\xa0\x63\x1e\x82\xbd\x11\x17\xc1\x78\xc4\x0b\x31\x19\x75\x43\xec\xbb\x46\x0a\xa7\x85\xe3\x70\xd4\x45\x70\xe4\x8d\xe9\x09\xc7\xa3\x91\x0c\xd3\x51\x6f\xc1\xc9\x68\xb8\xc0\x6c\x34\xe0\xe1\x74\x24\x66\xe2\x6c\x34\x6e\xe0\x7c\x24\x2c\x61\xee\x88\x4b\xb8\x70\x86\x0d\x99\x3d\xb8\xfb\x80\x47\xfd\x12\x13\xbb\x63\x62\x7f\xc4\xed\x71\x30\x62\xf8\x38\x1c\xf5\x1d\x1c\x8d\x47\xb7\xd8\x11\xde\x30\x1d\x77\x9e\xc4\x19\x3f\x30\x1b\x8d\x7f\x38\x1d\x0d\xa2\x38\x73\x06\x11\x9c\x8f\x46\x29\xcc\x47\xc2\x14\x2e\xba\x71\x64\xb7\xe4\xc1\x18\x53\x6a\x7e\x6d\x2b\x24\x0d\x37\xc6\x94\xe1\x9e\xb6\x5d\xc3\x98\x31\x28\x00\x98\x4f\x31\xe6\x0d\x4d\xce\x67\x78\x1e\xd5\x08\x6c\x00\x71\xcb\xa0\xe1\xa9\xae\x73\x5b\xca\xd0\xf2\x67\xc9\x19\xda\x1e\x1a\x28\xa4\x2d\x83\x66\x16\xb2\x0e\x80\x69\xe0\xb0\xfa\x1e\xd7\x95\x63\x40\x5d\x74\x84\x63\x9e\x73\x70\xb5\xc7\x74\x44\xb8\x84\x7a\x36\xc3\xf1\xa9\xdb\x70\x02\xea\x32\x9c\x90\x8e\xd8\x45\x44\x47\xa4\x16\xd3\x11\xd3\xa3\x74\x44\xb5\x09\xb5\xc9\x9d\xd1\x11\x9d\xa6\xd4\x6d\xb5\x19\x1d\xb1\x9a\x9c\x8e\x68\x8e\x53\xb7\xe1\x16\xd4\x65\xf6\xd8\x73\xba\x2d\xc6\x9e\x55\xaf\x98\x8c\xf9\x34\xf6\xc7\x7c\x12\x07\x23\x5e\x8d\xc3\x31\xa7\xc0\xd1\x58\xe4\xc0\xf1\x88\x6f\x37\xe3\x9e\x55\x8d\x38\x19\x73\x20\xcc\x46\xe2\x23\x4e\xc7\x22\x08\xce\x9c\x11\x0a\xe7\x63\x11\x06\x73\xfb\xe0\x5c\x8c\x44\x08\xc8\x0f\xdc\xba\xc2\x23\x96\x86\xc9\x88\xa7\x63\x7f\xcc\x99\x71\x30\xe6\xac\x38\x1c\x0b\x55\x91\x3d\x14\xe1\x78\x2c\x58\x60\xea\x76\x97\x64\xcc\xe1\x31\xb3\x06\x0b\x9c\x8e\xf9\x32\xce\x46\xc2\x05\xce\x9d\xc1\x12\xf3\xb1\x50\x86\x8b\x5e\xc0\xd9\x25\x2b\x50\x6c\x53\x53\x14\xa9\x71\x9a\xf2\x02\xd9\x96\x98\xfb\xec\xb7\xcf\x89\x09\x77\xd0\x4a\xc4\x88\x3f\xd4\xfb\x63\xca\x0a\x9a\xa7\x43\xdc\x71\xc7\xa0\xad\xa3\xa2\x31\x1b\xd0\x98\x1a\x22\x66\x35\x59\x23\xcb\xa9\x32\x50\x53\x06\xa0\xc9\x6a\xf8\x3c\xd7\xd0\x0e\x9f\xf2\xa6\xaf\xc3\x67\x45\x47\xca\xa6\x9e\x3a\x95\x84\xa9\x5b\x49\x84\x5a\x7a\xe4\x53\x97\x76\x02\xea\xea\x4f\x48\xdd\x56\x17\x51\xb7\x65\xc4\xd4\x2e\x0f\x4a\x5d\x76\x91\x50\xbb\x3d\x33\xea\x56\x7d\x4a\xdd\x3a\xcc\xa8\xc5\xa6\x72\xea\x56\x11\xa7\x2e\x9b\x2a\xa8\xdb\x94\xb1\x37\xe2\x47\x18\x8f\x18\x1f\x26\x23\x9e\x8a\x7d\x87\x01\xe2\xc0\xe9\xa7\x38\x1c\x71\x45\x1c\x79\x23\x31\x28\x76\xfa\x5c\x93\xc1\x5a\x78\x4f\xac\x51\x9b\xd9\xbc\x15\xa7\x23\xa1\x0d\x67\x8e\xb8\x88\xf3\x91\x18\x82\xf9\x88\xcf\xe2\xc2\x19\xdc\xc4\x88\x6e\x61\x1c\x3b\x4d\x09\x13\xa7\xd3\x62\x7f\xc4\x2f\x71\x30\xe2\x98\x38\x74\x78\x26\x8e\x46\x62\x0d\x8e\x47\x83\xd5\x88\x27\xe1\x64\xc4\x47\x31\x73\x04\x00\x9c\x3a\xa3\x16\xce\x9c\xa1\x05\xe7\x36\xff\xc7\x7c\xcc\x85\x8b\x6e\xe8\xd9\x7d\xe8\x36\xd8\x48\xcd\x6a\xe0\x61\xc3\xd0\xad\x52\x0d\xc3\xa0\xad\x90\x9a\x9a\x05\x4d\x92\x63\x7a\x1a\x5a\xba\x1f\x49\x94\x86\x31\xba\x4d\x99\x86\x4f\xa9\xd6\x01\xd3\x30\xdd\xf4\x7d\xd8\x94\x69\x46\x3e\x7c\x9a\x6a\x9d\x30\xbd\xaa\x6b\x79\x9c\x61\x98\x96\x72\x1b\x62\xe5\xad\xdc\x4c\x2f\xe9\x5a\xe6\x3b\xec\xa9\x4b\x0c\x98\x9a\x85\x4a\xa8\x4b\xbf\x3e\x75\xf5\x31\xa0\x0e\xc3\x09\xa9\x4b\x78\x11\x75\xf5\x24\xa6\x36\xf1\x50\xea\x30\xab\x84\xba\x54\xcd\xa8\x4b\x23\x29\x75\x18\x42\x46\x6d\x66\x9e\x53\x97\x25\x73\x6a\xb6\xd8\x82\x3a\x94\x8c\x3d\xa7\x96\x31\x76\xba\x2b\x71\xfa\x2b\xf6\x9d\xbe\x82\x03\x97\x3b\xe0\xd0\xe9\x4a\x38\x72\x3a\x04\x8e\x5d\x11\x41\x8d\x37\xc6\x47\x89\x33\x5a\x60\xe6\xf2\x18\x9c\x5a\x82\x06\xce\x6c\x41\x36\x77\x7a\x2e\xe6\xce\xa0\x80\x0b\x6b\x44\xc4\x9e\x53\xeb\xd8\xe9\x88\x98\xb8\xbd\xdb\xb7\x58\x1a\x0e\x9c\x8e\x86\x43\x97\x0b\xe3\xc8\xea\x87\x38\x76\x46\x06\x4c\x9d\xde\x8f\x13\xa7\x2f\x62\x66\x09\x56\x38\x75\xba\x1b\xce\x5c\xd1\x01\xe7\x56\x2f\xc6\xdc\x19\x39\x70\xa1\x05\x87\x5d\xc6\x54\x2a\x06\x78\x62\x40\xd8\x08\x67\x18\x8f\xef\xb5\x8b\x1b\xc3\x70\x2c\xdb\x0d\x03\xb1\xc2\x67\x78\x14\x4a\x7c\xc4\xc8\x47\xd4\x3c\x34\x05\x61\xc5\x89\x79\x9c\xa1\x9e\x99\xff\xa4\xe9\xb7\x29\x04\x4b\x3e\x4d\x8f\xd2\x06\xa9\x81\xcf\xec\x9e\x3c\xec\x31\x0c\xbf\x66\x3b\xe1\x8d\x10\x0d\x6d\x0a\xc5\x84\xe1\x51\xbd\xa8\x64\xed\xb9\x7c\x8c\x5d\x32\x55\x30\xc4\xa5\x7f\x05\xe3\xbb\x74\xad\x7e\x0f\x5c\xc2\x56\x30\xa1\x5d\xac\x0a\x22\x1a\xed\x73\x6c\x31\x2d\xf5\x98\xba\x24\xaa\x60\x12\x9b\x96\xd4\x73\x66\xb7\x52\x05\x91\xba\xec\x51\xc1\x64\x66\x95\xab\xa7\xb9\xcb\x8c\x14\x0c\x77\x99\xa8\x82\x29\xec\x1e\x5a\x67\xc4\x46\xc7\xc6\xae\x1e\x60\x62\x11\x32\xf6\x6d\x16\x87\x03\x17\xb3\x38\x74\xa9\x05\x47\x2e\x61\xe0\xd8\xd1\x45\x5b\xfc\x4d\xec\x2a\xc4\xcc\x65\xa9\x38\x75\xc6\xc3\xcc\xe5\x51\x38\xb7\xdb\x37\xe6\x36\xa3\xc3\xc5\xb8\x77\xb5\x2f\x37\x56\x08\xec\x8e\x05\x98\x8c\x1b\x1c\xf6\xc7\xbc\x0f\x07\x4e\xef\xc3\xe1\x78\x10\xa8\x95\xed\xec\x6e\x3c\x1e\x94\x30\x1d\x0f\x6e\x38\x19\x8f\x06\xb5\x39\xb8\xbc\x4c\x1a\x85\xf5\x69\x36\x16\xd6\xa4\x61\x38\xf8\xe4\x63\x11\xa7\x36\x12\xa0\xa2\x8d\xec\xf2\xa3\x5e\xd7\xe0\x29\x5b\xbf\x5f\xa3\x6a\xc6\x2a\xb4\xe6\x73\x9e\x55\x50\x8f\xe8\xe5\x77\xcf\x5e\xa3\x72\x71\x5e\x5f\x13\xd1\x54\x34\x78\xfa\xed\xcb\xde\xc5\xc5\xed\xc1\xc4\x29\x6a\x37\xfe\xc3\x05\x8a\xea\x0b\x7c\x56\x5f\xa6\x7a\x43\x4f\xfd\x2a\x01\xe4\x97\xfa\xb3\xf8\x32\xd5\xfa\xd3\xe7\x5c\xab\xaa\xf4\xfd\xc3\x97\xb2\x30\x16\x92\x85\x5f\xdc\x77\x54\x09\xe8\xe6\x82\x2a\xf9\x45\xab\x92\x72\xdd\x2b\xaa\xdc\xa5\xf5\xde\xf3\xab\xa6\x04\xd8\x7b\x7e\x65\x28\x7d\xf7\x9e\x5f\xd5\x75\xf5\xde\xf3\x2b\x73\x59\x3d\x41\x43\xaa\x28\x8c\x50\x5a\x56\x6b\xc4\xb2\x6c\xb9\xca\xcb\xc5\x29\xaa\x96\xe8\xf9\x31\x36\xe2\xfd\xae\x84\x52\x40\x6f\xfa\x35\x90\x4d\x77\x87\x84\x91\xfd\xee\x90\x16\xdd\xf3\xa5\x40\xf8\xfc\x18\xbf\x29\xdf\xa2\xbb\x08\x1b\x6a\x94\x2a\xba\xb2\x3c\xff\xa4\xee\xdd\x9b\xb6\xbd\x2a\xc7\x27\xfe\x33\xf1\x31\xba\xab\xa1\x86\x3a\x7c\x7b\xe8\xf6\x00\xb1\xa1\x60\xe9\xb7\xeb\x35\x3f\x4b\xe7\x1c\xe1\x08\xad\x2f\xd2\xf7\xfc\xca\x20\xfe\xf5\x45\xfa\x23\xbf\x5a\x37\x2a\x68\xbf\xdb\x85\xb2\x78\x09\x40\x52\x34\xf5\x97\x07\x08\x47\xcd\x37\xfb\x15\x2b\xc7\x50\x71\x4a\xf1\x63\x16\xe4\xba\xc6\xae\x78\x79\xa3\x90\xbe\x55\x4c\x19\xf1\xba\xaf\x6e\x49\xcb\xea\x25\x54\x45\x39\xd2\x8a\xa0\x34\x78\x6d\x28\xa5\x41\x05\xd4\x68\x50\x64\xd8\xc6\x64\x35\x24\xb0\x5b\x4d\x97\x4e\xb1\x5a\x9e\x41\x80\x99\xf3\xa2\x42\x84\x82\x67\x08\xca\xe6\x86\x52\x38\x6f\x26\x25\x3a\x94\x77\x43\x78\x50\xc0\xb1\x36\xae\xc9\xe4\xf9\x31\x51\x36\xb8\x87\xf6\x1b\x09\xec\xa1\xbf\x20\x42\xdf\x42\x8d\x47\xb0\xad\x12\xfd\x05\xee\xb8\xd8\x9a\xbd\x55\x79\x3a\xdb\x9e\xbf\x00\xca\x77\xb6\x4c\xee\x75\xb8\x24\x14\x1e\x4b\x5e\xd1\x3e\x22\x81\x85\xe1\x3d\x03\xc7\x03\xb2\xa6\xca\xfe\xa2\x03\xe5\x22\xe3\x88\xb3\x6c\xa6\xcc\x0e\x95\x6b\xc4\xce\xcf\xe7\x25\xcf\x85\x2e\xd9\x02\xf1\xcd\x39\x5b\xe4\x3c\xaf\xeb\x32\x42\x78\x9f\x1a\xb1\x09\x11\x28\x34\x19\x5b\xa0\x94\xa3\x74\xb5\x7c\xcf\x17\xa8\x5c\x54\x4b\x44\x65\x51\xe0\x35\x5a\x67\x6c\x2e\xd1\x4b\x94\x6b\x33\xb6\xcb\x59\x99\xcd\x10\x9b\xcf\x97\x97\x6b\x40\x2d\xf0\x56\x4b\x81\xf6\x62\xcd\x73\x74\x59\x56\xb3\xe5\x45\x25\x19\x5c\x97\xcb\xc5\x10\x8b\x12\x34\x94\xd7\x9c\xb4\x5f\x1e\x3c\x50\xd7\xca\xb4\x3f\x89\x80\xe2\x63\x93\xe4\x3a\x96\x8b\xa5\xe5\xc6\x6e\xc3\x55\x68\x21\x88\xb5\x9f\x21\x66\x4d\x4a\xa9\xc4\xaf\x91\xd0\xbe\x6f\x56\x95\xad\x1f\xb1\xde\x8f\xf8\xad\x2a\xec\xf9\xab\xfe\x13\x5c\x0a\x30\xb8\x6a\xc7\x10\x01\x8f\x65\xe1\x4b\x54\x2e\x3e\xf0\xd5\x9a\xdb\xa3\x60\xb9\xf8\xf0\xb2\x17\x08\x3b\x3f\x6d\x35\x40\x60\xc7\x00\xd1\x62\xd3\x25\xb6\x7e\x83\x43\x61\xd0\x7d\xec\x1f\x3b\x13\x0e\xed\x17\xbe\xc8\x56\x57\xe7\xd5\x0e\x57\x01\xaa\x8a\xb5\xcb\xe3\xa6\x5d\x0b\x3c\xed\x86\x7c\x6b\x09\xdd\x9c\x7f\x0e\xaa\xad\x44\x5c\xb5\x7b\x8f\xdd\x94\xa7\xb5\x20\x4d\x49\xc7\x7f\xf0\x4a\xcf\xd3\xba\xcc\xcd\x01\xa9\x76\x35\x56\x5f\x07\x12\x6c\xd5\x07\x83\x9b\xb3\x0c\xd9\xc7\x0f\x8b\xb2\x2a\xd9\x5c\x2f\x7d\xd5\x85\xe1\x9b\x6c\xc6\x16\xa7\xfc\xc9\x8b\xb6\x2c\xaa\xac\x3c\xe6\x6d\xbc\x42\xfe\xaf\x6f\xd2\xe6\x36\xf2\x7e\x6a\x78\x63\x2d\x0a\x6b\x9b\x17\x4f\xf4\x36\x04\xe8\xf8\xea\x6f\xbb\x36\x54\xf2\xe6\x15\x85\xf8\xff\x96\xbc\x41\x9b\x50\xfd\x19\x2b\xd3\xba\xae\x6a\x93\xe5\xc3\xc0\xa3\xe4\x47\xe9\x55\xf0\x79\xfc\xda\x36\xc3\x48\x64\xcc\x27\x00\x9d\xed\xda\x8b\xc6\x30\x74\x3b\xb1\xc0\xae\xba\xb0\x2b\x05\x6b\x64\xf2\x11\x2f\xd7\x15\x9f\x37\x56\x6c\xc6\x58\x40\xe7\xb7\x4b\x2d\xa8\x3b\x40\x17\x62\xa0\x95\xa5\xd6\xde\x94\x6f\xdf\x4c\x26\x8a\xdb\x77\x6d\xb8\x16\x89\x64\xf3\xea\x02\xdf\xa1\xac\xb6\x49\x34\x86\x80\xdd\x73\xa4\x95\x4d\x52\x3d\x4f\x9a\xd7\x6c\x14\xe3\x01\xfc\xaf\x8b\x7c\x89\xd6\x97\xec\x5c\xa6\x1f\x73\xb6\xae\xa4\x31\x0c\x43\x78\xe5\x56\x59\x8f\xd9\xae\xc2\x5c\x8e\x5f\x19\x6c\x18\x2a\x8a\xef\xea\xea\x03\xd7\xb8\x31\x17\xbc\x8e\xab\x5f\x27\xa4\x8c\x84\x2e\xc3\x1b\x59\x85\x96\x17\xd5\x20\x02\x37\x21\xd7\xad\xb2\x4e\xc8\xb5\xeb\xac\x33\x64\xbc\xe7\x57\xb2\x04\x74\x14\x1c\xfa\x44\x7f\x52\x7e\xb0\x3c\xd0\xea\x46\x47\xc6\xaa\xd1\x87\xe8\xa5\xb0\x40\xf5\x12\xb0\x5a\xae\xd7\x6d\x9a\x0e\x35\x0f\x21\x21\x86\xd7\x52\xd9\xa2\x19\xa8\x5a\xc1\x4d\xea\xf1\xea\x8c\xad\xdf\x77\x5c\xb6\xb6\xdd\xc9\xa4\x63\xa2\xc2\x11\xeb\xd1\xf5\x5d\xa7\xeb\xc2\x69\x05\x16\x4d\x04\x1d\x93\x7d\x07\x36\xfb\x95\xd1\xf0\xc5\x33\x91\x51\x49\xcc\x0a\xaa\xf6\xbb\x01\xdb\x2f\x9e\x6c\xcf\xf6\xca\xce\xf6\xdc\xcd\xf6\xdc\xc1\xf6\x6a\x0b\xb6\x9d\x45\xa4\xd7\x75\x15\x69\x39\xfd\xb1\x5d\x1d\xe9\xb1\x22\xcc\x12\x57\xc5\x37\x95\x5e\x8a\xf9\xfb\x87\x2f\x0f\x54\x82\xd6\xa9\xc5\x3c\x45\x59\x71\x6a\x28\xae\x7d\x3e\x67\x82\x89\x4d\x85\xfa\x58\x54\xc2\x35\x69\xe9\x98\x10\x35\x95\x9d\x87\x13\x35\xdd\xa2\xdb\xdf\x3f\x7c\x69\xac\xb8\x7d\xb2\x2a\xcf\xe7\xfc\xee\x6e\x53\x44\xb2\x51\x67\xa2\x48\xff\xe9\x8f\x33\x5d\xa4\x26\x22\x04\xdb\x25\x54\x28\xcd\xfa\xd7\x03\xa9\x2c\x96\xaf\x31\x3a\x12\x70\x07\x52\xaa\x0f\xa5\x8e\x97\xab\x49\x7b\xcf\xba\xba\x38\xbe\x26\x7d\xb0\x9e\x97\x19\x9f\x78\x53\x44\xf6\x06\x77\x61\x34\x68\xc9\x35\xd1\x92\x29\x0a\x1c\x68\xfd\x6b\xa2\x0d\xa6\x28\xda\xb3\x5f\xa4\x71\xed\x77\x0f\xbe\xc6\x07\x7a\x63\xad\x85\x55\x32\x07\xfa\x3b\xc7\x16\x0d\xfc\x2d\x28\xdc\xcc\x3b\x8d\xa0\xb5\x23\x73\x64\xd7\xee\xe3\x2d\x28\x98\x47\x3d\x9c\x90\x1b\x1b\xf6\xfe\x49\xc2\x6a\x13\x5d\x6e\x20\xb8\xb6\xb8\x76\x0c\xb1\xb6\x10\xd7\x0d\xb4\x0d\x94\xb3\x7e\x7e\x03\xd5\x2b\xa1\xaf\x15\x66\xbf\x17\x92\x69\xaf\xaa\xbe\x56\xdc\xfd\x5e\x18\x4c\xdb\xaa\xee\xf7\xc2\x68\xaa\x8a\xbd\xdf\x8b\xf0\xc7\xb7\x53\x1a\x7c\x52\xc1\xfd\xdf\xb3\xd2\xfe\x67\xab\x87\xff\xdf\x53\xd9\x1e\x6e\x2a\x28\x17\x3c\xbf\xd9\x12\xf7\xdf\xb1\x35\x6f\xab\xd6\xb3\x35\xd7\x9e\xbd\xf6\x89\xb3\x02\xfe\xd0\x97\x37\x51\x80\x16\xec\x8c\xaf\xcf\x75\x2f\x3d\xd4\xd9\x10\x20\x82\x0d\xf9\xdf\x7f\x7c\x34\xa1\xf9\x16\x45\x41\x73\x85\x8d\x09\xcd\xeb\x28\x10\x7c\x00\x53\x9b\x28\x38\x50\x5f\x04\xff\x86\xcc\xa0\x45\x2d\xd1\xab\xe9\x94\xf2\xef\x7c\x8d\x18\x5a\xf0\xcb\xf9\x15\x92\xbe\x96\x9b\x08\xeb\x01\x05\x75\x6e\xf3\x58\x5c\x9c\xa5\x7c\xf5\x11\xc1\xad\x52\x70\xab\x8a\xf8\xe0\x13\x48\xe7\x0f\x9c\x4d\xe6\xcb\x4b\x68\x21\xfe\x6b\x6a\xd0\x6d\xdc\x8d\x6e\x43\x80\x5a\x2e\x9b\x56\x2e\x75\x44\xa8\xc5\x53\x0f\xcc\x72\xf5\xcf\x23\x9e\x0f\x6f\x65\x81\x17\x7a\x91\xd7\x9d\xef\xac\x25\x0d\x21\x7e\x51\x76\x32\x2a\xd1\xc3\xa9\xe0\xda\x3c\x86\xa9\xfb\xb5\x0c\xb7\x7a\xc2\x63\xd1\xdb\x23\xd4\xbd\x7d\x5b\x7f\x33\xef\x6b\xea\xbb\xb2\xba\x2c\xd7\x1c\xfd\xf4\xec\x64\x0d\x18\xc6\x14\x53\x5f\x94\xa2\x0c\xe4\x23\xfa\x56\xe8\x57\xc8\xe5\x2e\x08\x46\x8d\x24\xac\xa8\xf8\x0a\x2d\xf8\x29\xab\xca\xc5\xe9\x0d\x08\x1e\x50\x71\x21\x78\xa5\x82\x83\xc5\xb2\x9a\x58\xa5\x7a\x78\x88\x16\xcb\xd1\x4c\x15\xee\x64\x91\x02\xfd\xad\x91\xee\x7d\x23\x98\x14\xec\x6f\xb5\x90\x0d\x29\xa9\x92\x8c\x12\x4c\x6d\x0d\xad\x3a\xef\x77\xb8\xeb\x64\x00\x36\xad\x7c\xfb\xd3\xf7\x9a\x56\x60\x39\x01\xc6\xed\x73\xb6\x86\xe5\x85\xad\x7c\xa8\xd1\x14\xe0\x10\x2e\xd1\x28\xab\x5a\x0a\x12\x35\xde\x1b\x56\xfe\xb7\x3f\x7d\x7f\x33\xaa\x97\x6b\x3b\xad\xe2\xd9\x22\x9f\xb0\xc5\xb2\x9a\xf1\x95\x62\xc4\x65\x06\x6c\x91\xeb\x66\x20\x7a\x38\x62\x0a\xad\x9f\xdd\x96\x02\x19\xb3\x8a\xc6\xf3\x14\xfc\xef\x66\x1f\xcf\x5e\x7c\x6e\xf3\x78\xf6\xe2\x33\x59\xc7\xb3\x17\x37\x63\x1c\xcb\x55\xc7\x36\x96\xab\x1d\x4c\x63\xb9\xba\xb6\x65\xfc\xba\xa3\x65\xfc\xfa\x3b\x5b\xc6\xeb\xcf\x6f\x1a\xaf\x3f\x9b\x6d\xbc\xbe\x29\xe3\xd8\xf4\xac\x63\xb3\x93\x79\x6c\x3e\xc1\x3e\xde\xed\x68\x1f\xef\x7e\x27\xfb\x80\x45\x79\xdd\x32\x16\x72\x66\x54\xbd\x10\xce\x79\x51\x6d\x9f\x95\x2d\xc0\x26\xe4\x37\xb4\x2c\x1a\x4c\x70\x85\xcd\x4d\x19\x03\x20\xbb\x19\x73\x00\x54\x1d\x83\x80\x5f\x9e\x4c\x48\xe8\xb2\x03\x09\xa4\x9b\xc2\xc2\x64\x07\xe2\x15\x68\x81\x1e\x20\x9f\xd8\x56\xba\x34\x4b\x99\xb4\xa6\xf2\xe0\x01\x5a\xc0\x12\x79\x63\x0c\x72\xeb\x10\x41\x77\xd1\xc2\x78\x59\xbd\xd9\x84\x04\x9e\xa1\xad\x7d\x44\xf5\xcb\x93\x9b\x21\x1d\xcd\x64\x81\xee\x1a\x6e\x0c\x1d\x90\xee\x2f\x75\x09\x72\xff\x9d\xd6\x0b\x53\xf9\xff\x76\xe6\xfb\x62\x62\x7f\xb9\xa8\xad\xf7\xc5\x0d\x59\xaf\xd4\x7b\xd7\x52\x35\xe3\xad\xed\x79\x0b\xe3\x1d\x44\x4c\x40\x75\x0d\xfb\xd5\xbc\xa0\xc1\x33\x6e\xc0\x8a\xfc\xef\x6e\xc1\x2f\x96\x15\xab\xf8\xe7\x0e\xc0\x2b\xa0\x72\x53\x26\x0c\xd8\x6e\xc6\x84\x25\x63\xba\x09\xaf\x96\xa3\xf1\x57\x80\x8c\xda\xaf\xea\x11\xd8\x81\x8a\xea\x8b\x3d\x91\x0e\xb6\xbf\xbc\x98\x44\xc1\xc0\x2c\x3f\x55\x61\x37\x14\x73\xfe\x58\x1a\x1b\x09\x39\x02\x62\x77\x85\xbd\x18\x28\xec\xc9\x75\x14\xf6\x6d\x9e\x7f\xee\xcc\x97\xe5\xf9\x67\xca\x7c\xe5\x95\xdf\x37\xf1\xce\x9c\xf7\xde\x99\xf3\x9d\xde\x99\xf3\xad\xdf\x99\xfb\x23\xc2\x7e\x93\xc8\xc2\x86\x51\x73\xf2\x9b\xb1\xd5\xea\x4a\x34\xab\xc7\x10\x79\x31\x7c\x67\x58\x69\xaf\x87\x37\xe3\x18\x26\x52\xfb\x6d\xce\x8d\xf6\x25\x0d\xc5\xc3\xa7\x46\x74\xf9\xcd\xbc\xba\xf2\xed\x42\x5d\x01\xbe\x2c\xf4\xb9\xcd\xb5\xe9\x86\xe3\xd5\xf2\x9c\xaf\xaa\x2b\xf4\x0f\x75\xc5\x30\x00\x82\x79\x35\x28\x06\xd3\x8a\xca\x40\xd6\x07\x26\x3c\x75\x58\x69\xee\x44\xef\x46\x97\x75\x79\xba\x28\x8b\x32\x63\x8b\x0a\xa5\xf0\xbc\x5c\x68\xbe\x01\x44\x1d\xb3\xbf\xed\xbc\x74\xcd\x4c\xfd\xcb\x0d\xcc\x03\x0f\x39\xb0\xbb\x63\x47\x5c\x93\x67\xe7\xc2\x2c\xd9\x7c\xaf\x23\xfb\x51\xc1\x21\x63\x40\x6e\x24\xa7\xa1\xdd\x4a\x88\xbc\xab\xe6\x4f\xf0\xd5\x4b\x5d\xd4\xfd\x5e\x74\xd6\x7c\xbb\x3e\xfb\x89\xc8\xde\x0c\xda\x8b\xbf\x5d\xa7\xb5\xa7\xbb\x62\xc1\x14\x27\x98\xe1\x14\xce\xd4\x64\x38\xc7\x1c\x17\x7b\x03\x24\x6f\xff\x8d\xba\x3a\x45\xd8\xdb\x7a\x79\x00\x8c\x6e\xda\x98\xed\x20\x2c\x5f\xaa\xcd\x13\x10\x16\xeb\x2f\xf2\xbf\xbf\xfe\x6a\x38\x80\x21\xf2\xfe\xc6\x07\xfe\x74\x84\x86\xab\x60\xfa\x9f\x1c\x9b\x6b\xf0\xa3\x86\x8d\xfe\x5e\x40\x6b\xd2\xde\x47\x20\x7d\x68\xce\x17\xa7\xd5\x0c\x7d\x8d\xe8\x96\x5b\xa9\xfb\x81\xe6\x78\xb9\xf8\xc0\x57\xf5\xab\xa1\x16\x86\x55\x7c\x10\x83\x76\x7d\x3a\x60\xab\xc0\x53\x8f\xda\x8d\x76\x3b\x2b\x73\x1f\xd1\x49\x37\x88\xde\x59\xa3\x9c\x55\x0c\xb1\xf5\x8e\x74\xb6\x9e\xc9\xea\xae\x14\x6e\xb4\x00\x7d\x50\x2d\x5f\xfb\xc4\xbe\x14\x02\x8f\x3f\x61\xcf\x8e\xa2\xd5\x35\x2a\xc3\xce\x9d\x1a\xee\x89\x54\x66\xc3\x64\xad\x5e\xd3\x2e\x1e\xa9\x36\x03\x2e\xd9\xdd\xad\x37\xef\x77\x69\xbb\x4f\x7a\xb5\x4b\x78\x75\xab\x37\x83\x2d\xfc\xe2\xaf\xe6\xe1\xe0\xfc\x62\x3d\x9b\xd4\x89\x94\xc8\x11\x4c\xef\x95\x66\xe8\x5e\x2e\x81\x0c\xfb\x64\xeb\x54\x44\x53\x70\x1d\x41\x6a\x9c\xd3\xae\xdb\x58\x37\x92\x0c\xbc\x02\xd0\x08\x93\xcc\x96\xe7\x30\x48\x5a\xc6\x7e\x34\x9a\xb6\x36\x66\xcf\x51\x36\x5f\x2e\x5c\x6f\x2a\xdb\x9a\x34\xe0\xe9\xdb\x32\xfc\x68\xb7\x65\x78\xec\xb4\x65\x1d\x33\x64\x29\x92\xdd\x66\xe7\xab\x69\xa7\xeb\x31\xc0\xff\x19\x0c\xfb\xcf\x52\x32\x43\xa4\x75\x2c\x95\xf8\x86\x61\xb6\xde\x35\x66\x27\x00\x67\x98\xea\x85\x75\x99\x9c\x58\xc8\x34\x2e\x74\xd9\xf1\x9f\x51\x37\xb8\xdc\xc6\x07\x2e\x95\xc9\xd7\xe8\xdf\x94\x6f\x4d\x62\xb7\x9b\x2a\x00\x77\xd6\x97\x9b\xf4\xd8\xba\x6f\xa6\xb7\x5b\x46\x6d\x8d\xf9\xf8\x76\x4a\xc3\x6d\xf6\xbb\x1c\x7e\xfd\x27\x34\xab\xaa\xf3\xf5\xbd\xc3\xc3\xb3\x6a\xb6\x3e\x48\xf9\xe1\x45\x55\xd0\x5f\xd6\xe8\x03\x39\xc0\x07\x04\xa5\x57\xe8\x7f\x9e\xb1\x6a\x56\xb2\xb5\xb0\x98\x76\x83\x0c\xec\x0a\x91\x9b\x3d\x0e\x0f\xd1\xf7\xbc\x92\xc7\xe1\x38\x17\xe2\x2e\x59\x3a\xe7\x6b\xf4\x37\x45\xe9\x6f\xb7\xbe\x82\x6d\xfc\x2b\xce\x1f\x36\xfb\x5f\x06\x3b\x69\xd0\x1d\xa9\xbc\x3b\xe8\xf6\xed\xfa\xe7\xfb\x76\xf4\xe8\x6f\xb2\x3b\x1a\xf2\xa7\xf0\x43\x8b\xfb\x4c\x7d\xef\xa2\x56\xbf\xde\xbe\x6d\xd8\x9f\x73\xd4\x61\xb2\x01\x76\xb2\x71\x0a\x3b\x67\xfe\x36\x95\xbb\xf1\x7f\x5a\xe6\xfc\xe0\x97\x35\x5a\xae\xd0\x77\x72\x2b\x4d\x59\x94\x3c\x47\xd9\x32\xe7\x53\xc0\xc2\x16\x39\xba\x58\x73\x54\x56\x62\x5c\xfb\x9b\x90\xa3\xd6\x07\xb5\x0f\xa7\xe9\xc3\xa9\xfa\xde\xed\x83\xfc\xf5\xbe\xdc\x93\xd4\x36\x3b\x68\xa0\x8f\x74\x64\xbf\xfe\xaa\x7d\x3b\xb8\x2c\x17\xb9\x78\xbb\xec\xc0\xc8\xad\x43\x82\x17\xa4\xff\x0c\x9b\x7d\x6e\x7d\x75\xf8\xf5\xdd\x1b\xfb\xfb\xfa\xf0\x96\xec\xed\xba\x5a\x95\x8b\xd3\x47\xab\xe5\xd9\xf1\x8c\xad\x8e\x97\xb9\xd0\xdc\x4b\xf8\xf1\xa0\xd0\x7e\x55\xc2\x3f\x61\xef\xf9\x42\xca\xb8\x6f\xb2\xe7\x17\x8b\x2b\x21\xdf\x5b\x5f\x35\x11\xec\x22\x5b\x93\x9c\x8b\x1f\x27\x92\x8e\xec\x20\x2c\x6d\xc2\xe6\xfb\x7a\x08\x84\x9f\xb2\xe5\xc5\xa2\xe2\x2b\x35\x73\x09\x3f\xcd\xeb\x58\x21\x9b\xb7\xc1\x02\x9e\xc2\x79\xc6\xfa\x0b\xdf\x54\x2b\x26\xbe\x5c\xce\xca\x39\x47\x93\x1a\xdb\x03\x85\x44\x92\xfe\x0a\xda\xb4\x08\x33\xd5\xbd\x6f\xab\xba\xc1\xfe\xbe\x70\xf5\xaf\x40\xa7\x12\xf8\x9b\x23\xe4\x6d\xbe\xa7\x9e\x27\x74\x2e\x7f\x7a\x00\x3f\x7d\xf7\xe8\x91\xf8\xc9\x42\x49\x88\x0b\x5e\xd7\xd7\x17\xab\xd5\xf2\x94\x55\x7c\x0a\x56\x57\xcd\xf8\x8a\xc3\x39\x4f\xb4\xe0\x9b\x0a\x09\x16\x58\x56\xf1\x15\x34\x82\x6e\x6c\xc3\x1f\x30\x38\x91\xe0\xb7\x91\xb7\x79\x74\xec\x79\x7b\xc2\x42\xbd\xcd\xf7\xf0\xf1\x1f\x22\x38\xcf\x97\x97\x2d\x7d\x68\xf6\x95\x94\xbc\x1c\xca\x27\xaa\x8b\x02\x81\xff\xe8\xd1\x1e\x1c\xcd\xf4\xf6\xd0\x3e\xd2\x30\xc3\x83\xfd\xba\xe2\x90\xa2\xde\x66\xc1\xaa\xab\x17\x8b\x33\x56\x65\x33\x9e\xb7\xf4\xee\xa3\xe5\x62\x7e\x85\xd8\xf9\x39\x87\x7e\x97\x6b\x70\x40\x74\xb1\x28\xab\xa9\x78\xd1\xcc\xd8\x9a\xc3\xdb\xa6\x10\x44\x83\xa9\x81\x11\x42\xaa\xea\x7d\x51\x0d\x56\x31\xd4\x33\xed\xeb\x39\x2b\x57\xc3\x9e\x41\xbf\x14\xaf\x5f\x29\xd1\xdd\xbd\xab\x78\xbf\xd5\xef\x80\xa5\xa5\x00\x14\xff\x57\xf1\x5e\x42\xd5\xde\x78\x1d\x67\xe0\x0b\x70\x06\x18\x85\x5b\x5f\x68\xac\x5c\xe6\x2d\x5d\x23\x2f\x17\x39\xdf\xa0\x23\x74\x17\x1b\xcd\xbe\xf1\xa3\x3b\x77\x34\xe3\xdf\xdf\x97\xcd\x2c\xc6\x0f\x74\xde\x00\xc8\xdb\xbe\xb1\x0b\x53\x7a\x24\x34\x2e\x25\x23\x7f\xbd\x7b\x54\xab\xff\xbe\x26\x2f\xb4\x7f\x64\x88\x1f\x35\xa2\x6f\xbe\x41\xd8\xab\x0d\x08\xfd\xaa\x7c\x48\xa9\xa4\xe6\x44\x1a\x2b\xfa\x15\x75\xec\xb0\x11\xfe\x16\x84\x00\xa1\x4d\x49\x8d\xf0\xb3\x19\xcf\xde\xbf\xcc\xd8\x9c\xad\xfe\xb7\x68\x35\x11\x7a\x78\xbe\x2c\x17\x72\x37\x35\x08\xa0\xf9\xa9\xeb\xf1\xed\xcf\xd2\xeb\x5b\xe1\x54\xb3\xd5\xf2\x12\x3d\x5c\xad\x96\xab\x09\xf4\xea\xce\x13\x91\x0a\xb5\xa6\xf9\xd7\xfd\x3b\x68\xbf\x45\x70\x50\x2d\x65\x64\x9d\xe0\x68\xef\xa0\x5a\xfe\xf5\xfc\x9c\xaf\x8e\xd9\x9a\x4f\xf6\xd0\xbe\x44\x20\x4c\x7e\xb1\xac\x84\x81\x03\xb3\x52\x2e\x77\xc4\xc3\xba\xa3\x1f\x3f\xc3\x48\xd0\xca\x09\xb2\x6a\x91\x89\xb7\xe2\x98\xca\x65\x36\x35\x38\x49\x29\x1b\xb4\x31\xd1\x05\xf8\x4d\xdd\x46\x6a\x14\xa6\x2a\x37\xd4\xdb\xeb\xeb\x45\x3a\xc4\x71\xdd\xd0\xa4\x16\x0d\xed\x6d\x65\x9c\x8f\x1e\x51\x15\xeb\x54\x98\xc3\x77\xd3\xab\x8a\xa3\x35\xff\xaf\x0b\xbe\xc8\x20\xd0\xd9\x19\x6d\x69\xd4\xa6\x03\x03\xe1\xd5\x59\xba\x9c\x37\x8e\x64\xa3\x4c\xbd\x2e\x65\x32\xa4\xdc\x60\x1a\x17\x52\x24\x05\x84\x95\x80\x8e\xbd\x86\xa5\x66\xe3\xb1\x81\x09\x08\xc3\x3a\x13\xfe\x90\x09\x87\xc1\xdf\xdf\x91\x49\x4c\x24\x97\x9e\xe2\xf2\xa1\xd7\x41\xb1\x7f\x64\xb1\x9a\x68\x8b\xce\x3c\xf4\x06\x9d\x09\x3e\x49\xa2\x98\x2a\x66\x63\xc9\xec\xa3\x2d\x99\xc5\x64\xd7\x4e\xb5\x90\x26\xae\xba\x1d\xed\x7a\x40\x63\x9b\x80\xa1\xef\x12\x22\xf5\x57\xe3\x44\x3f\x69\x6a\x90\x8a\xd4\x7d\x98\x5c\x0d\xb2\xa6\x16\x7e\x74\x50\x69\x40\xeb\x1f\x84\x12\x64\xb4\xda\x72\x70\x69\x7b\xac\x13\xd6\x47\x19\x0d\xe5\xfe\x91\xc3\xf5\x7b\x11\xbd\x6d\xf6\xb9\x12\xe1\x46\xf6\x2b\xce\xf2\xe3\xe5\xa2\x2a\x17\x17\x70\x78\x16\xb4\xdf\x86\x22\xc1\xc9\x0f\xd0\xf7\x6f\x8e\x80\xad\x63\x91\x58\x18\x46\x83\x3b\x3f\x2c\x3e\xb0\x79\x99\x03\x90\x94\xf6\x1d\xd5\xad\x46\xde\x5d\x2a\x48\x22\x84\x89\x82\x37\x0d\x9d\xb7\xca\x4d\x44\xd3\xe6\xc7\xfd\x7d\x91\x8c\xd7\x11\xaa\x87\xe6\xb6\x0c\x23\x32\x11\x14\x51\xf2\x1f\x5a\x30\x34\x42\xfb\x8f\x1a\xc6\x0e\x0f\xd1\x0f\x05\xba\xe4\x48\xe4\x6b\x17\xe7\x48\x64\xaa\x53\x54\x56\xff\xef\xff\xfc\xdf\x7a\x58\xd2\x51\x00\xc7\xb7\x2c\x3d\x1f\x00\xde\x19\x04\x7f\x69\xbd\x2f\xc1\x0b\x26\xad\x95\x0b\x60\xac\x9b\x21\xd1\xbf\xf8\xfa\x97\xc0\x60\xbe\x43\x5d\x7d\x82\xaa\xba\x98\x8e\x86\x5a\x57\x92\x2d\xd8\x1c\x0e\x3f\x34\x72\x7c\xc1\x59\x8e\x8a\x72\xb5\xae\x6a\x29\x41\xb7\x76\x57\xf3\x70\x74\x43\x93\xc5\x72\x28\xde\xf5\x5e\x6d\x13\x92\xd0\x6d\xa5\x7f\x15\x59\x35\x5e\x1b\xf9\xd6\xbc\x0e\xc7\xb0\x1e\x9e\x87\xb5\x41\x1d\xd7\xa8\x40\x2d\xe8\xc8\xe2\x30\xf7\xfb\xf1\x40\x47\x86\xe5\x6b\x06\xd4\xdc\x69\xb4\x6b\x4a\xc0\x1a\xeb\x6d\xcd\x57\x8b\x51\xdd\x04\x7e\x07\x13\xac\xd3\x7a\xd9\x77\xbf\x2f\xdb\x33\x76\x85\xca\x45\x36\xbf\x80\x97\x10\xf1\x72\xa1\xbf\xd2\x98\xa4\xfc\xa8\x96\xce\xc3\x1d\xa4\x03\xa6\x7c\x3d\x01\x7a\xea\x3d\x8d\xc0\xde\x24\x49\x4b\x17\xa8\x6f\x13\xa8\x07\xc9\x8b\x14\xd8\x58\x7e\xf0\x39\x65\x3e\x1c\xe1\xfb\x12\xa5\x4a\xa2\x8f\x6e\x56\xa2\x10\x32\xae\x29\xf4\x18\x84\xee\x6d\xfa\x62\xf7\x36\xde\xf1\x1e\xfa\x15\x24\x32\x91\x3c\xc8\x5f\x1b\x7d\x04\x56\x7d\xc0\x1b\x95\xe1\x1d\x03\x7b\xfa\x2b\x98\x59\x13\xb5\x3c\x8d\x5a\xf8\xeb\xc9\xa3\xbb\x14\xe5\x30\x53\xc6\xf3\x26\xf2\xd6\x61\x53\x9d\xc0\x6a\xbe\x43\x40\xd3\xbe\x43\xfc\xb9\xdf\xcb\x49\x54\xae\xd1\x8e\xc6\x92\xbf\x06\x5f\x37\x25\xd1\xc0\xea\xa8\x06\x54\xf4\x00\xa8\x25\x25\x5a\x8c\x6d\x67\x7f\x3a\xe9\x4e\x3b\x4f\x54\x9d\x9d\x6b\xd9\xc8\xa4\x3a\x3b\x47\x47\xbd\xb1\x64\x0f\xfd\xe9\xe8\x48\x06\xe5\x7e\x76\xa2\x16\x31\xaa\xb3\xf3\x7e\x9e\xa1\xbd\xa0\xb7\xd0\x7b\x9f\x73\xf2\x4d\x88\x15\x1d\x01\x83\x77\x3e\xf0\xd5\xba\x5c\x2e\xee\xdc\x43\x77\x60\xd2\xf7\xce\x54\xfc\x2a\xf9\xb9\x73\x4f\xcb\x0a\xe1\x77\xd9\x5d\xf5\xbb\xfc\x72\xeb\xab\x8f\x6a\x92\xee\xe5\xf2\x8c\xa3\x6f\x9f\x7e\x8f\xd2\x8b\x72\x9e\xa3\xe5\x79\x55\x9e\x95\x7f\xe7\xab\xf5\x14\xcd\xcb\xf7\x1c\xad\x0e\x7e\x59\x4f\xe5\x2b\x31\xcc\xb4\xaf\xcf\x79\x56\x16\x65\x26\x9c\x37\x2f\x41\xe1\xe7\xac\xaa\xf8\x6a\xb1\x06\x7c\xd0\xa8\x9a\x71\x54\x2c\xe7\xf3\xe5\x65\xb9\x38\xbd\x27\xe7\x3c\x85\xf9\xf5\xce\x45\xa2\x3b\xb5\xd1\xdc\x91\x93\xbb\x1d\x80\x03\x76\x96\xf7\x66\x51\x9b\x23\x92\xe2\xd9\xad\xaf\xa4\xba\xd4\xa1\xc9\x66\x9a\xbb\x3b\x80\x89\x3e\x83\xee\x40\x39\xed\xdb\x45\x6f\xd6\xf8\x4f\xda\xf7\x83\xc5\x32\xe7\x27\x57\xe7\xbc\x4d\xe6\xda\xb9\x6a\xf5\xe2\x51\x2e\xf4\x79\xe3\x17\xe5\xe2\x74\xf9\xbf\x5e\xa2\x0f\xde\x01\x3d\xf0\xe0\xf5\xbc\x6d\xa1\x9d\x25\x6d\x98\x51\xa1\xb1\xc6\xc4\x56\x97\x33\x36\xef\x61\x8a\x0f\xbc\xbb\x72\x22\x66\x55\xef\x8d\x92\xa7\x18\xd5\x6f\x33\xb6\x7e\x76\xb9\x78\x5e\x6f\x81\x39\x52\x40\x07\xdd\xdf\x01\xbc\x59\x22\x81\xaa\x71\x52\x28\x75\xc4\xe8\x82\xcb\xf5\x21\xf1\x1c\x0e\x12\xef\x09\xd9\xe8\xb2\x7a\xf3\x5e\x16\x30\x14\x10\xf0\xb9\x33\xf9\xd5\xeb\xd7\x8b\x59\xb9\x58\x8a\x5e\x31\x74\xc9\x53\xa4\x0e\xaa\xaa\x59\xeb\x03\x65\xd0\x4a\x26\x1f\x6f\xa9\x23\xaa\xb0\x6c\xf2\x71\xfa\x8f\x8f\x6f\xa7\x34\xda\x66\x49\x64\x70\x62\xf7\xf5\xd3\x27\x8f\xab\xea\xfc\x85\x18\x32\xd6\x55\x83\xed\xcf\x69\x79\x2a\x37\xb3\x1c\xfc\xb2\xfe\xf3\x36\x98\xef\x5c\xac\x39\xbc\xb0\x65\xd5\x9d\xfb\xb7\x86\x84\xbe\x2b\x4f\x7f\x02\x84\xf7\x45\x87\x7f\x59\xcf\x44\x50\x2e\x4f\x17\xcb\x15\xbf\x37\x2f\x17\xfc\x56\x43\xfa\x92\xa7\xfe\x56\x24\x85\x92\x5e\xf1\x54\x8e\x4d\xf2\x98\xf1\x9d\x83\xc3\x79\x99\x1e\x0a\x14\x22\x38\xdf\x3a\x3c\x44\xf9\x72\x71\xa7\x42\xcb\x0f\x7c\xb5\x2a\x73\x5e\xaf\x38\xd4\x0b\x1c\xb7\xb4\x33\xc8\x6a\xe9\x40\x44\xb8\x3b\xcd\x8e\x06\x58\x90\xe8\x00\x1c\x48\x9a\x5d\x28\x61\x21\xb0\x4e\xa6\x83\x00\x77\xf7\x6f\x7d\x34\x88\x43\x3e\x51\x2b\x5b\x35\xcb\x7f\xbe\x47\xc8\xc7\xb7\x42\x0c\xd3\x37\x52\x0c\x6f\xf7\x6e\xdd\xfa\xff\x01\x00\x00\xff\xff\x02\x09\x77\x52\x22\x24\x06\x00") func web3JsBytes() ([]byte, error) { return bindataRead( @@ -106,7 +106,7 @@ func web3Js() (*asset, error) { } info := bindataFileInfo{name: "web3.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4c, 0xb2, 0xb5, 0x69, 0x9e, 0x5e, 0xe3, 0x56, 0x47, 0x6, 0x96, 0x4a, 0x7a, 0xcd, 0xdf, 0x79, 0xc5, 0xf2, 0x71, 0x64, 0x77, 0x8a, 0x53, 0x58, 0x6, 0xb1, 0xff, 0x4f, 0x0, 0xd6, 0x7f, 0x61}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x12, 0x22, 0x81, 0x1, 0xe2, 0x72, 0xd3, 0xd5, 0x4d, 0x2d, 0x30, 0xa5, 0x3, 0x90, 0x3a, 0xf8, 0x17, 0x2d, 0xe3, 0x5, 0x44, 0x21, 0x63, 0xba, 0x1a, 0x37, 0x3f, 0x3f, 0xa5, 0x30, 0x5e, 0x6f}} return a, nil } diff --git a/internal/jsre/deps/web3.js b/internal/jsre/deps/web3.js index 3c0b9b3d07..cd9c9fbda2 100644 --- a/internal/jsre/deps/web3.js +++ b/internal/jsre/deps/web3.js @@ -3949,10 +3949,18 @@ var outputSyncingFormatter = function(result) { result.startingBlock = utils.toDecimal(result.startingBlock); result.currentBlock = utils.toDecimal(result.currentBlock); result.highestBlock = utils.toDecimal(result.highestBlock); - if (result.knownStates) { - result.knownStates = utils.toDecimal(result.knownStates); - result.pulledStates = utils.toDecimal(result.pulledStates); - } + result.syncedAccounts = utils.toDecimal(result.syncedAccounts); + result.syncedAccountBytes = utils.toDecimal(result.syncedAccountBytes); + result.syncedBytecodes = utils.toDecimal(result.syncedBytecodes); + result.syncedBytecodeBytes = utils.toDecimal(result.syncedBytecodeBytes); + result.syncedStorage = utils.toDecimal(result.syncedStorage); + result.syncedStorageBytes = utils.toDecimal(result.syncedStorageBytes); + result.healedTrienodes = utils.toDecimal(result.healedTrienodes); + result.healedTrienodeBytes = utils.toDecimal(result.healedTrienodeBytes); + result.healedBytecodes = utils.toDecimal(result.healedBytecodes); + result.healedBytecodeBytes = utils.toDecimal(result.healedBytecodeBytes); + result.healingTrienodes = utils.toDecimal(result.healingTrienodes); + result.healingBytecode = utils.toDecimal(result.healingBytecode); return result; }; diff --git a/internal/jsre/jsre.go b/internal/jsre/jsre.go index bc8869b254..24fedd8d28 100644 --- a/internal/jsre/jsre.go +++ b/internal/jsre/jsre.go @@ -20,6 +20,7 @@ package jsre import ( crand "crypto/rand" "encoding/binary" + "errors" "fmt" "io" "io/ioutil" @@ -220,19 +221,33 @@ loop: } // Do executes the given function on the JS event loop. +// When the runtime is stopped, fn will not execute. func (re *JSRE) Do(fn func(*goja.Runtime)) { done := make(chan bool) req := &evalReq{fn, done} - re.evalQueue <- req - <-done + select { + case re.evalQueue <- req: + <-done + case <-re.closed: + } } -// stops the event loop before exit, optionally waits for all timers to expire +// Stop terminates the event loop, optionally waiting for all timers to expire. func (re *JSRE) Stop(waitForCallbacks bool) { - select { - case <-re.closed: - case re.stopEventLoop <- waitForCallbacks: - <-re.closed + timeout := time.NewTimer(10 * time.Millisecond) + defer timeout.Stop() + + for { + select { + case <-re.closed: + return + case re.stopEventLoop <- waitForCallbacks: + <-re.closed + return + case <-timeout.C: + // JS is blocked, interrupt and try again. + re.vm.Interrupt(errors.New("JS runtime stopped")) + } } } @@ -282,6 +297,19 @@ func (re *JSRE) Evaluate(code string, w io.Writer) { }) } +// Interrupt stops the current JS evaluation. +func (re *JSRE) Interrupt(v interface{}) { + done := make(chan bool) + noop := func(*goja.Runtime) {} + + select { + case re.evalQueue <- &evalReq{noop, done}: + // event loop is not blocked. + default: + re.vm.Interrupt(v) + } +} + // Compile compiles and then runs a piece of JS code. func (re *JSRE) Compile(filename string, src string) (err error) { re.Do(func(vm *goja.Runtime) { _, err = compileAndRun(vm, filename, src) }) diff --git a/internal/shutdowncheck/shutdown_tracker.go b/internal/shutdowncheck/shutdown_tracker.go new file mode 100644 index 0000000000..c95b4f02f4 --- /dev/null +++ b/internal/shutdowncheck/shutdown_tracker.go @@ -0,0 +1,85 @@ +// Copyright 2021 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 . + +package shutdowncheck + +import ( + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" +) + +// ShutdownTracker is a service that reports previous unclean shutdowns +// upon start. It needs to be started after a successful start-up and stopped +// after a successful shutdown, just before the db is closed. +type ShutdownTracker struct { + db ethdb.Database + stopCh chan struct{} +} + +// NewShutdownTracker creates a new ShutdownTracker instance and has +// no other side-effect. +func NewShutdownTracker(db ethdb.Database) *ShutdownTracker { + return &ShutdownTracker{ + db: db, + stopCh: make(chan struct{}), + } +} + +// MarkStartup is to be called in the beginning when the node starts. It will: +// - Push a new startup marker to the db +// - Report previous unclean shutdowns +func (t *ShutdownTracker) MarkStartup() { + if uncleanShutdowns, discards, err := rawdb.PushUncleanShutdownMarker(t.db); err != nil { + log.Error("Could not update unclean-shutdown-marker list", "error", err) + } else { + if discards > 0 { + log.Warn("Old unclean shutdowns found", "count", discards) + } + for _, tstamp := range uncleanShutdowns { + t := time.Unix(int64(tstamp), 0) + log.Warn("Unclean shutdown detected", "booted", t, + "age", common.PrettyAge(t)) + } + } +} + +// Start runs an event loop that updates the current marker's timestamp every 5 minutes. +func (t *ShutdownTracker) Start() { + go func() { + ticker := time.NewTicker(5 * time.Minute) + defer ticker.Stop() + for { + select { + case <-ticker.C: + rawdb.UpdateUncleanShutdownMarker(t.db) + case <-t.stopCh: + return + } + } + }() +} + +// Stop will stop the update loop and clear the current marker. +func (t *ShutdownTracker) Stop() { + // Stop update loop. + t.stopCh <- struct{}{} + // Clear last marker. + rawdb.PopUncleanShutdownMarker(t.db) +} diff --git a/les/api_backend.go b/les/api_backend.go index 2861e2f9c5..e9e51c4ecc 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -324,7 +324,7 @@ func (b *LesApiBackend) CurrentHeader() *types.Header { return b.eth.blockchain.CurrentHeader() } -func (b *LesApiBackend) StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive bool) (*state.StateDB, error) { +func (b *LesApiBackend) StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (*state.StateDB, error) { return b.eth.stateAtBlock(ctx, block, reexec) } diff --git a/les/client.go b/les/client.go index aa3d4cf468..13000488b3 100644 --- a/les/client.go +++ b/les/client.go @@ -35,6 +35,7 @@ import ( "github.com/ethereum/go-ethereum/eth/gasprice" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/internal/shutdowncheck" "github.com/ethereum/go-ethereum/les/downloader" "github.com/ethereum/go-ethereum/les/vflux" vfc "github.com/ethereum/go-ethereum/les/vflux/client" @@ -63,6 +64,7 @@ type LightEthereum struct { serverPool *vfc.ServerPool serverPoolIterator enode.Iterator pruner *pruner + merger *consensus.Merger bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests bloomIndexer *core.ChainIndexer // Bloom indexer operating during block imports @@ -76,6 +78,8 @@ type LightEthereum struct { p2pServer *p2p.Server p2pConfig *p2p.Config udpEnabled bool + + shutdownTracker *shutdowncheck.ShutdownTracker // Tracks if and when the node has shutdown ungracefully } // New creates an instance of the light client. @@ -88,13 +92,14 @@ func New(stack *node.Node, config *ethconfig.Config) (*LightEthereum, error) { if err != nil { return nil, err } - chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, config.Genesis, config.OverrideLondon) + chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, config.Genesis, config.OverrideArrowGlacier, config.OverrideTerminalTotalDifficulty) if _, isCompat := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !isCompat { return nil, genesisErr } log.Info("Initialised chain configuration", "config", chainConfig) peers := newServerPeerSet() + merger := consensus.NewMerger(chainDb) leth := &LightEthereum{ lesCommons: lesCommons{ genesis: genesisHash, @@ -105,16 +110,18 @@ func New(stack *node.Node, config *ethconfig.Config) (*LightEthereum, error) { lesDb: lesDb, closeCh: make(chan struct{}), }, - peers: peers, - eventMux: stack.EventMux(), - reqDist: newRequestDistributor(peers, &mclock.System{}), - accountManager: stack.AccountManager(), - engine: nil, - bloomRequests: make(chan chan *bloombits.Retrieval), - bloomIndexer: core.NewBloomIndexer(chainDb, params.BloomBitsBlocksClient, params.HelperTrieConfirmations), - p2pServer: stack.Server(), - p2pConfig: &stack.Config().P2P, - udpEnabled: stack.Config().P2P.DiscoveryV5, + peers: peers, + eventMux: stack.EventMux(), + reqDist: newRequestDistributor(peers, &mclock.System{}), + accountManager: stack.AccountManager(), + merger: merger, + engine: nil, + bloomRequests: make(chan chan *bloombits.Retrieval), + bloomIndexer: core.NewBloomIndexer(chainDb, params.BloomBitsBlocksClient, params.HelperTrieConfirmations), + p2pServer: stack.Server(), + p2pConfig: &stack.Config().P2P, + udpEnabled: stack.Config().P2P.DiscoveryV5, + shutdownTracker: shutdowncheck.NewShutdownTracker(chainDb), } var prenegQuery vfc.QueryFunc @@ -182,19 +189,9 @@ func New(stack *node.Node, config *ethconfig.Config) (*LightEthereum, error) { stack.RegisterProtocols(leth.Protocols()) stack.RegisterLifecycle(leth) - // Check for unclean shutdown - if uncleanShutdowns, discards, err := rawdb.PushUncleanShutdownMarker(chainDb); err != nil { - log.Error("Could not update unclean-shutdown-marker list", "error", err) - } else { - if discards > 0 { - log.Warn("Old unclean shutdowns found", "count", discards) - } - for _, tstamp := range uncleanShutdowns { - t := time.Unix(int64(tstamp), 0) - log.Warn("Unclean shutdown detected", "booted", t, - "age", common.PrettyAge(t)) - } - } + // Successful startup; push a marker and check previous unclean shutdowns. + leth.shutdownTracker.MarkStartup() + return leth, nil } @@ -332,6 +329,7 @@ func (s *LightEthereum) Engine() consensus.Engine { return s.engine } func (s *LightEthereum) LesVersion() int { return int(ClientProtocolVersions[0]) } func (s *LightEthereum) Downloader() *downloader.Downloader { return s.handler.downloader } func (s *LightEthereum) EventMux() *event.TypeMux { return s.eventMux } +func (s *LightEthereum) Merger() *consensus.Merger { return s.merger } // Protocols returns all the currently configured network protocols to start. func (s *LightEthereum) Protocols() []p2p.Protocol { @@ -348,6 +346,9 @@ func (s *LightEthereum) Protocols() []p2p.Protocol { func (s *LightEthereum) Start() error { log.Warn("Light client mode is an experimental feature") + // Regularly update shutdown marker + s.shutdownTracker.Start() + if s.udpEnabled && s.p2pServer.DiscV5 == nil { s.udpEnabled = false log.Error("Discovery v5 is not initialized") @@ -383,7 +384,9 @@ func (s *LightEthereum) Stop() error { s.engine.Close() s.pruner.close() s.eventMux.Stop() - rawdb.PopUncleanShutdownMarker(s.chainDb) + // Clean shutdown marker as the last thing before closing db + s.shutdownTracker.Stop() + s.chainDb.Close() s.lesDb.Close() s.wg.Wait() diff --git a/les/client_handler.go b/les/client_handler.go index 9583bd57ca..e416f92e29 100644 --- a/les/client_handler.go +++ b/les/client_handler.go @@ -74,7 +74,7 @@ func newClientHandler(ulcServers []string, ulcFraction int, checkpoint *params.T height = (checkpoint.SectionIndex+1)*params.CHTFrequency - 1 } handler.fetcher = newLightFetcher(backend.blockchain, backend.engine, backend.peers, handler.ulc, backend.chainDb, backend.reqDist, handler.synchronise) - handler.downloader = downloader.New(height, backend.chainDb, nil, backend.eventMux, nil, backend.blockchain, handler.removePeer) + handler.downloader = downloader.New(height, backend.chainDb, backend.eventMux, nil, backend.blockchain, handler.removePeer) handler.backend.peers.subscribe((*downloaderPeerNotify)(handler)) return handler } @@ -143,11 +143,13 @@ func (h *clientHandler) handle(p *serverPeer, noInitAnnounce bool) error { connectionTimer.Update(time.Duration(mclock.Now() - connectedAt)) serverConnectionGauge.Update(int64(h.backend.peers.len())) }() - // It's mainly used in testing which requires discarding initial - // signal to prevent syncing. - if !noInitAnnounce { + + // Discard all the announces after the transition + // Also discarding initial signal to prevent syncing during testing. + if !(noInitAnnounce || h.backend.merger.TDDReached()) { h.fetcher.announce(p, &announceData{Hash: p.headInfo.Hash, Number: p.headInfo.Number, Td: p.headInfo.Td}) } + // Mark the peer starts to be served. atomic.StoreUint32(&p.serving, 1) defer atomic.StoreUint32(&p.serving, 0) @@ -212,7 +214,11 @@ func (h *clientHandler) handleMsg(p *serverPeer) error { // Update peer head information first and then notify the announcement p.updateHead(req.Hash, req.Number, req.Td) - h.fetcher.announce(p, &req) + + // Discard all the announces after the transition + if !h.backend.merger.TDDReached() { + h.fetcher.announce(p, &req) + } } case msg.Code == BlockHeadersMsg: p.Log().Trace("Received block header response message") diff --git a/les/downloader/downloader.go b/les/downloader/downloader.go index e7dfc4158e..448a94192b 100644 --- a/les/downloader/downloader.go +++ b/les/downloader/downloader.go @@ -40,7 +40,6 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" ) var ( @@ -97,8 +96,7 @@ type Downloader struct { queue *queue // Scheduler for selecting the hashes to download peers *peerSet // Set of active peers from which download can proceed - stateDB ethdb.Database // Database to state sync into (and deduplicate via) - stateBloom *trie.SyncBloom // Bloom filter for fast trie node and contract code existence checks + stateDB ethdb.Database // Database to state sync into (and deduplicate via) // Statistics syncStatsChainOrigin uint64 // Origin block number where syncing started at @@ -207,13 +205,12 @@ type BlockChain interface { } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(checkpoint uint64, stateDb ethdb.Database, stateBloom *trie.SyncBloom, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { +func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { if lightchain == nil { lightchain = chain } dl := &Downloader{ stateDB: stateDb, - stateBloom: stateBloom, mux: mux, checkpoint: checkpoint, queue: newQueue(blockCacheMaxItems, blockCacheInitialItems), @@ -231,9 +228,9 @@ func New(checkpoint uint64, stateDb ethdb.Database, stateBloom *trie.SyncBloom, stateCh: make(chan dataPack), SnapSyncer: snap.NewSyncer(stateDb), stateSyncStart: make(chan *stateSync), - syncStatsState: stateSyncStats{ - processed: rawdb.ReadFastTrieProgress(stateDb), - }, + //syncStatsState: stateSyncStats{ + // processed: rawdb.ReadFastTrieProgress(stateDb), + //}, trackStateReq: make(chan *stateReq), } go dl.stateFetcher() @@ -268,8 +265,8 @@ func (d *Downloader) Progress() ethereum.SyncProgress { StartingBlock: d.syncStatsChainOrigin, CurrentBlock: current, HighestBlock: d.syncStatsChainHeight, - PulledStates: d.syncStatsState.processed, - KnownStates: d.syncStatsState.processed + d.syncStatsState.pending, + //PulledStates: d.syncStatsState.processed, + //KnownStates: d.syncStatsState.processed + d.syncStatsState.pending, } } @@ -367,12 +364,6 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode if atomic.CompareAndSwapInt32(&d.notified, 0, 1) { log.Info("Block synchronisation started") } - // If we are already full syncing, but have a fast-sync bloom filter laying - // around, make sure it doesn't use memory any more. This is a special case - // when the user attempts to fast sync a new empty network. - if mode == FullSync && d.stateBloom != nil { - d.stateBloom.Close() - } // If snap sync was requested, create the snap scheduler and switch to fast // sync mode. Long term we could drop fast sync or merge the two together, // but until snap becomes prevalent, we should support both. TODO(karalabe). @@ -628,9 +619,6 @@ func (d *Downloader) Terminate() { default: close(d.quitCh) } - if d.stateBloom != nil { - d.stateBloom.Close() - } d.quitLock.Unlock() // Cancel any pending download requests @@ -1930,15 +1918,6 @@ func (d *Downloader) commitPivotBlock(result *fetchResult) error { return err } atomic.StoreInt32(&d.committed, 1) - - // If we had a bloom filter for the state sync, deallocate it now. Note, we only - // deallocate internally, but keep the empty wrapper. This ensures that if we do - // a rollback after committing the pivot and restarting fast sync, we don't end - // up using a nil bloom. Empty bloom is fine, it just returns that it does not - // have the info we need, so reach down to the database instead. - if d.stateBloom != nil { - d.stateBloom.Close() - } return nil } diff --git a/les/downloader/downloader_test.go b/les/downloader/downloader_test.go index 17cd3630c9..69bdb90ed2 100644 --- a/les/downloader/downloader_test.go +++ b/les/downloader/downloader_test.go @@ -89,7 +89,7 @@ func newTester() *downloadTester { tester.stateDb = rawdb.NewMemoryDatabase() tester.stateDb.Put(testGenesis.Root().Bytes(), []byte{0x00}) - tester.downloader = New(0, tester.stateDb, trie.NewSyncBloom(1, tester.stateDb), new(event.TypeMux), tester, nil, tester.dropPeer) + tester.downloader = New(0, tester.stateDb, new(event.TypeMux), tester, nil, tester.dropPeer) return tester } @@ -1207,8 +1207,8 @@ func checkProgress(t *testing.T, d *Downloader, stage string, want ethereum.Sync t.Helper() p := d.Progress() - p.KnownStates, p.PulledStates = 0, 0 - want.KnownStates, want.PulledStates = 0, 0 + //p.KnownStates, p.PulledStates = 0, 0 + //want.KnownStates, want.PulledStates = 0, 0 if p != want { t.Fatalf("%s progress mismatch:\nhave %+v\nwant %+v", stage, p, want) } diff --git a/les/downloader/statesync.go b/les/downloader/statesync.go index 6c53e5577a..2b32788229 100644 --- a/les/downloader/statesync.go +++ b/les/downloader/statesync.go @@ -22,7 +22,6 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" @@ -298,7 +297,7 @@ func newStateSync(d *Downloader, root common.Hash) *stateSync { return &stateSync{ d: d, root: root, - sched: state.NewStateSync(root, d.stateDB, d.stateBloom, nil), + sched: state.NewStateSync(root, d.stateDB, nil), keccak: sha3.NewLegacyKeccak256().(crypto.KeccakState), trieTasks: make(map[common.Hash]*trieTask), codeTasks: make(map[common.Hash]*codeTask), @@ -610,6 +609,6 @@ func (s *stateSync) updateStats(written, duplicate, unexpected int, duration tim log.Info("Imported new state entries", "count", written, "elapsed", common.PrettyDuration(duration), "processed", s.d.syncStatsState.processed, "pending", s.d.syncStatsState.pending, "trieretry", len(s.trieTasks), "coderetry", len(s.codeTasks), "duplicate", s.d.syncStatsState.duplicate, "unexpected", s.d.syncStatsState.unexpected) } if written > 0 { - rawdb.WriteFastTrieProgress(s.d.stateDB, s.d.syncStatsState.processed) + //rawdb.WriteFastTrieProgress(s.d.stateDB, s.d.syncStatsState.processed) } } diff --git a/les/fetcher.go b/les/fetcher.go index d944d32858..bfe3aa16ec 100644 --- a/les/fetcher.go +++ b/les/fetcher.go @@ -71,8 +71,8 @@ type fetcherPeer struct { // These following two fields can track the latest announces // from the peer with limited size for caching. We hold the // assumption that all enqueued announces are td-monotonic. - announces map[common.Hash]*announce // Announcement map - announcesList []common.Hash // FIFO announces list + announces map[common.Hash]*announce // Announcement map + fifo []common.Hash // FIFO announces list } // addAnno enqueues an new trusted announcement. If the queued announces overflow, @@ -87,15 +87,15 @@ func (fp *fetcherPeer) addAnno(anno *announce) { return } fp.announces[hash] = anno - fp.announcesList = append(fp.announcesList, hash) + fp.fifo = append(fp.fifo, hash) // Evict oldest if the announces are oversized. - if len(fp.announcesList)-cachedAnnosThreshold > 0 { - for i := 0; i < len(fp.announcesList)-cachedAnnosThreshold; i++ { - delete(fp.announces, fp.announcesList[i]) + if len(fp.fifo)-cachedAnnosThreshold > 0 { + for i := 0; i < len(fp.fifo)-cachedAnnosThreshold; i++ { + delete(fp.announces, fp.fifo[i]) } - copy(fp.announcesList, fp.announcesList[len(fp.announcesList)-cachedAnnosThreshold:]) - fp.announcesList = fp.announcesList[:cachedAnnosThreshold] + copy(fp.fifo, fp.fifo[len(fp.fifo)-cachedAnnosThreshold:]) + fp.fifo = fp.fifo[:cachedAnnosThreshold] } } @@ -106,8 +106,8 @@ func (fp *fetcherPeer) forwardAnno(td *big.Int) []*announce { cutset int evicted []*announce ) - for ; cutset < len(fp.announcesList); cutset++ { - anno := fp.announces[fp.announcesList[cutset]] + for ; cutset < len(fp.fifo); cutset++ { + anno := fp.announces[fp.fifo[cutset]] if anno == nil { continue // In theory it should never ever happen } @@ -118,8 +118,8 @@ func (fp *fetcherPeer) forwardAnno(td *big.Int) []*announce { delete(fp.announces, anno.data.Hash) } if cutset > 0 { - copy(fp.announcesList, fp.announcesList[cutset:]) - fp.announcesList = fp.announcesList[:len(fp.announcesList)-cutset] + copy(fp.fifo, fp.fifo[cutset:]) + fp.fifo = fp.fifo[:len(fp.fifo)-cutset] } return evicted } diff --git a/les/fetcher/block_fetcher_test.go b/les/fetcher/block_fetcher_test.go index b6d1125b56..de066ac26b 100644 --- a/les/fetcher/block_fetcher_test.go +++ b/les/fetcher/block_fetcher_test.go @@ -60,8 +60,8 @@ func makeChain(n int, seed byte, parent *types.Block) ([]common.Hash, map[common block.AddTx(tx) } // If the block number is a multiple of 5, add a bonus uncle to the block - if i%5 == 0 { - block.AddUncle(&types.Header{ParentHash: block.PrevBlock(i - 1).Hash(), Number: big.NewInt(int64(i - 1))}) + if i > 0 && i%5 == 0 { + block.AddUncle(&types.Header{ParentHash: block.PrevBlock(i - 2).Hash(), Number: big.NewInt(int64(i - 1))}) } }) hashes := make([]common.Hash, n+1) diff --git a/les/fetcher_test.go b/les/fetcher_test.go index ef700651e3..a922ab0f83 100644 --- a/les/fetcher_test.go +++ b/les/fetcher_test.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" ) // verifyImportEvent verifies that one single event arrive on an import channel. @@ -247,7 +248,7 @@ func testInvalidAnnounces(t *testing.T, protocol int) { // Prepare announcement by latest header. headerOne := s.backend.Blockchain().GetHeaderByNumber(1) hash, number := headerOne.Hash(), headerOne.Number.Uint64() - td := big.NewInt(200) // bad td + td := big.NewInt(params.GenesisDifficulty.Int64() + 200) // bad td // Sign the announcement if necessary. announce := announceData{hash, number, td, 0, nil} diff --git a/les/server_handler.go b/les/server_handler.go index f36a87a513..da06ac315e 100644 --- a/les/server_handler.go +++ b/les/server_handler.go @@ -421,7 +421,10 @@ func (h *serverHandler) broadcastLoop() { } var reorg uint64 if lastHead != nil { - reorg = lastHead.Number.Uint64() - rawdb.FindCommonAncestor(h.chainDb, header, lastHead).Number.Uint64() + // If a setHead has been performed, the common ancestor can be nil. + if ancestor := rawdb.FindCommonAncestor(h.chainDb, header, lastHead); ancestor != nil { + reorg = lastHead.Number.Uint64() - ancestor.Number.Uint64() + } } lastHead, lastTd = header, td log.Debug("Announcing block to peers", "number", number, "hash", hash, "td", td, "reorg", reorg) diff --git a/les/test_helper.go b/les/test_helper.go index 21d0f191c9..10367ea800 100644 --- a/les/test_helper.go +++ b/les/test_helper.go @@ -33,6 +33,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" "github.com/ethereum/go-ethereum/core" @@ -239,6 +240,7 @@ func newTestClientHandler(backend *backends.SimulatedBackend, odr *LesOdr, index engine: engine, blockchain: chain, eventMux: evmux, + merger: consensus.NewMerger(rawdb.NewMemoryDatabase()), } client.handler = newClientHandler(ulcServers, ulcFraction, nil, client) diff --git a/les/vflux/client/serverpool.go b/les/vflux/client/serverpool.go index cc0254c127..9703bf4c8d 100644 --- a/les/vflux/client/serverpool.go +++ b/les/vflux/client/serverpool.go @@ -44,7 +44,7 @@ const ( queryWaitStep = 1.02 // exponential multiplier of redial wait time when no value was provided by the server waitThreshold = time.Hour * 2000 // drop node if waiting time is over the threshold nodeWeightMul = 1000000 // multiplier constant for node weight calculation - nodeWeightThreshold = 100 // minimum weight for keeping a node in the the known (valuable) set + nodeWeightThreshold = 100 // minimum weight for keeping a node in the known (valuable) set minRedialWait = 10 // minimum redial wait time in seconds preNegLimit = 5 // maximum number of simultaneous pre-negotiation queries warnQueryFails = 20 // number of consecutive UDP query failures before we print a warning diff --git a/les/vflux/client/serverpool_test.go b/les/vflux/client/serverpool_test.go index c777d6c16d..c7d0245ef2 100644 --- a/les/vflux/client/serverpool_test.go +++ b/les/vflux/client/serverpool_test.go @@ -19,6 +19,7 @@ package client import ( "math/rand" "strconv" + "sync" "sync/atomic" "testing" "time" @@ -52,7 +53,7 @@ func testNodeIndex(id enode.ID) int { type ServerPoolTest struct { db ethdb.KeyValueStore clock *mclock.Simulated - quit chan struct{} + quit chan chan struct{} preNeg, preNegFail bool vt *ValueTracker sp *ServerPool @@ -62,6 +63,12 @@ type ServerPoolTest struct { trusted []string waitCount, waitEnded int32 + // preNegLock protects the cycle counter, testNodes list and its connected field + // (accessed from both the main thread and the preNeg callback) + preNegLock sync.Mutex + queryWg *sync.WaitGroup // a new wait group is created each time the simulation is started + stopping bool // stopping avoid callind queryWg.Add after queryWg.Wait + cycle, conn, servedConn int serviceCycles, dialCount int disconnect map[int][]int @@ -108,11 +115,21 @@ func (s *ServerPoolTest) addTrusted(i int) { func (s *ServerPoolTest) start() { var testQuery QueryFunc + s.queryWg = new(sync.WaitGroup) if s.preNeg { testQuery = func(node *enode.Node) int { + s.preNegLock.Lock() + if s.stopping { + s.preNegLock.Unlock() + return 0 + } + s.queryWg.Add(1) idx := testNodeIndex(node.ID()) n := &s.testNodes[idx] canConnect := !n.connected && n.connectCycles != 0 && s.cycle >= n.nextConnCycle + s.preNegLock.Unlock() + defer s.queryWg.Done() + if s.preNegFail { // simulate a scenario where UDP queries never work s.beginWait() @@ -155,7 +172,7 @@ func (s *ServerPoolTest) start() { s.sp.unixTime = func() int64 { return int64(s.clock.Now()) / int64(time.Second) } s.disconnect = make(map[int][]int) s.sp.Start() - s.quit = make(chan struct{}) + s.quit = make(chan chan struct{}) go func() { last := int32(-1) for { @@ -167,7 +184,8 @@ func (s *ServerPoolTest) start() { s.clock.Run(time.Second) } last = c - case <-s.quit: + case quit := <-s.quit: + close(quit) return } } @@ -175,9 +193,20 @@ func (s *ServerPoolTest) start() { } func (s *ServerPoolTest) stop() { - close(s.quit) + // disable further queries and wait if one is currently running + s.preNegLock.Lock() + s.stopping = true + s.preNegLock.Unlock() + s.queryWg.Wait() + + quit := make(chan struct{}) + s.quit <- quit + <-quit s.sp.Stop() s.spi.Close() + s.preNegLock.Lock() + s.stopping = false + s.preNegLock.Unlock() for i := range s.testNodes { n := &s.testNodes[i] if n.connected { @@ -197,7 +226,9 @@ func (s *ServerPoolTest) run() { n := &s.testNodes[idx] s.sp.UnregisterNode(n.node) n.totalConn += s.cycle + s.preNegLock.Lock() n.connected = false + s.preNegLock.Unlock() n.node = nil s.conn-- if n.service { @@ -222,7 +253,9 @@ func (s *ServerPoolTest) run() { s.servedConn++ } n.totalConn -= s.cycle + s.preNegLock.Lock() n.connected = true + s.preNegLock.Unlock() dc := s.cycle + n.connectCycles s.disconnect[dc] = append(s.disconnect[dc], idx) n.node = dial @@ -234,7 +267,9 @@ func (s *ServerPoolTest) run() { } s.serviceCycles += s.servedConn s.clock.Run(time.Second) + s.preNegLock.Lock() s.cycle++ + s.preNegLock.Unlock() } } @@ -245,11 +280,13 @@ func (s *ServerPoolTest) setNodes(count, conn, wait int, service, trusted bool) idx = rand.Intn(spTestNodes) } res = append(res, idx) + s.preNegLock.Lock() s.testNodes[idx] = spTestNode{ connectCycles: conn, waitCycles: wait, service: service, } + s.preNegLock.Unlock() if trusted { s.addTrusted(idx) } @@ -263,7 +300,9 @@ func (s *ServerPoolTest) resetNodes() { n.totalConn += s.cycle s.sp.UnregisterNode(n.node) } + s.preNegLock.Lock() s.testNodes[i] = spTestNode{totalConn: n.totalConn} + s.preNegLock.Unlock() } s.conn, s.servedConn = 0, 0 s.disconnect = make(map[int][]int) diff --git a/les/vflux/client/valuetracker.go b/les/vflux/client/valuetracker.go index f5390d0920..dcd2fcdfd9 100644 --- a/les/vflux/client/valuetracker.go +++ b/les/vflux/client/valuetracker.go @@ -50,7 +50,7 @@ type NodeValueTracker struct { lastTransfer mclock.AbsTime basket serverBasket reqCosts []uint64 - reqValues *[]float64 + reqValues []float64 } // UpdateCosts updates the node value tracker's request cost table @@ -58,14 +58,14 @@ func (nv *NodeValueTracker) UpdateCosts(reqCosts []uint64) { nv.vt.lock.Lock() defer nv.vt.lock.Unlock() - nv.updateCosts(reqCosts, &nv.vt.refBasket.reqValues, nv.vt.refBasket.reqValueFactor(reqCosts)) + nv.updateCosts(reqCosts, nv.vt.refBasket.reqValues, nv.vt.refBasket.reqValueFactor(reqCosts)) } // updateCosts updates the request cost table of the server. The request value factor // is also updated based on the given cost table and the current reference basket. // Note that the contents of the referenced reqValues slice will not change; a new // reference is passed if the values are updated by ValueTracker. -func (nv *NodeValueTracker) updateCosts(reqCosts []uint64, reqValues *[]float64, rvFactor float64) { +func (nv *NodeValueTracker) updateCosts(reqCosts []uint64, reqValues []float64, rvFactor float64) { nv.lock.Lock() defer nv.lock.Unlock() @@ -112,7 +112,7 @@ func (nv *NodeValueTracker) Served(reqs []ServedRequest, respTime time.Duration) var value float64 for _, r := range reqs { nv.basket.add(r.ReqType, r.Amount, nv.reqCosts[r.ReqType]*uint64(r.Amount), expFactor) - value += (*nv.reqValues)[r.ReqType] * float64(r.Amount) + value += nv.reqValues[r.ReqType] * float64(r.Amount) } nv.rtStats.Add(respTime, value, expFactor) } @@ -356,7 +356,7 @@ func (vt *ValueTracker) Register(id enode.ID) *NodeValueTracker { reqTypeCount := len(vt.refBasket.reqValues) nv.reqCosts = make([]uint64, reqTypeCount) nv.lastTransfer = vt.clock.Now() - nv.reqValues = &vt.refBasket.reqValues + nv.reqValues = vt.refBasket.reqValues nv.basket.init(reqTypeCount) vt.connected[id] = nv @@ -476,7 +476,7 @@ func (vt *ValueTracker) periodicUpdate() { vt.refBasket.normalize() vt.refBasket.updateReqValues() for _, nv := range vt.connected { - nv.updateCosts(nv.reqCosts, &vt.refBasket.reqValues, vt.refBasket.reqValueFactor(nv.reqCosts)) + nv.updateCosts(nv.reqCosts, vt.refBasket.reqValues, vt.refBasket.reqValueFactor(nv.reqCosts)) } vt.saveToDb() } diff --git a/les/vflux/server/balance_tracker.go b/les/vflux/server/balance_tracker.go index 746697a8c7..9695e79638 100644 --- a/les/vflux/server/balance_tracker.go +++ b/les/vflux/server/balance_tracker.go @@ -223,8 +223,9 @@ func (bt *balanceTracker) BalanceOperation(id enode.ID, connAddress string, cb f var nb *nodeBalance if node := bt.ns.GetNode(id); node != nil { nb, _ = bt.ns.GetField(node, bt.setup.balanceField).(*nodeBalance) - } else { - node = enode.SignNull(&enr.Record{}, id) + } + if nb == nil { + node := enode.SignNull(&enr.Record{}, id) nb = bt.newNodeBalance(node, connAddress, false) } cb(nb) diff --git a/light/lightchain.go b/light/lightchain.go index 92e0e6637f..be558e7a56 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -59,6 +59,7 @@ type LightChain struct { chainHeadFeed event.Feed scope event.SubscriptionScope genesisBlock *types.Block + forker *core.ForkChoice bodyCache *lru.Cache // Cache for the most recent block bodies bodyRLPCache *lru.Cache // Cache for the most recent block bodies in RLP encoded format @@ -92,6 +93,7 @@ func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus. blockCache: blockCache, engine: engine, } + bc.forker = core.NewForkChoice(bc, nil) var err error bc.hc, err = core.NewHeaderChain(odr.Database(), config, bc.engine, bc.getProcInterrupt) if err != nil { @@ -369,6 +371,42 @@ func (lc *LightChain) postChainEvents(events []interface{}) { } } +func (lc *LightChain) InsertHeader(header *types.Header) error { + // Verify the header first before obtaining the lock + headers := []*types.Header{header} + if _, err := lc.hc.ValidateHeaderChain(headers, 100); err != nil { + return err + } + // Make sure only one thread manipulates the chain at once + lc.chainmu.Lock() + defer lc.chainmu.Unlock() + + lc.wg.Add(1) + defer lc.wg.Done() + + _, err := lc.hc.WriteHeaders(headers) + log.Info("Inserted header", "number", header.Number, "hash", header.Hash()) + return err +} + +func (lc *LightChain) SetChainHead(header *types.Header) error { + lc.chainmu.Lock() + defer lc.chainmu.Unlock() + + lc.wg.Add(1) + defer lc.wg.Done() + + if err := lc.hc.Reorg([]*types.Header{header}); err != nil { + return err + } + // Emit events + block := types.NewBlockWithHeader(header) + lc.chainFeed.Send(core.ChainEvent{Block: block, Hash: block.Hash()}) + lc.chainHeadFeed.Send(core.ChainHeadEvent{Block: block}) + log.Info("Set the chain head", "number", block.Number(), "hash", block.Hash()) + return nil +} + // InsertHeaderChain attempts to insert the given header chain in to the local // chain, possibly creating a reorg. If an error is returned, it will return the // index number of the failing header as well an error describing what went wrong. @@ -396,25 +434,23 @@ func (lc *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (i lc.wg.Add(1) defer lc.wg.Done() - status, err := lc.hc.InsertHeaderChain(chain, start) + status, err := lc.hc.InsertHeaderChain(chain, start, lc.forker) if err != nil || len(chain) == 0 { return 0, err } // Create chain event for the new head block of this insertion. var ( - events = make([]interface{}, 0, 1) lastHeader = chain[len(chain)-1] block = types.NewBlockWithHeader(lastHeader) ) switch status { case core.CanonStatTy: - events = append(events, core.ChainEvent{Block: block, Hash: block.Hash()}) + lc.chainFeed.Send(core.ChainEvent{Block: block, Hash: block.Hash()}) + lc.chainHeadFeed.Send(core.ChainHeadEvent{Block: block}) case core.SideStatTy: - events = append(events, core.ChainSideEvent{Block: block}) + lc.chainSideFeed.Send(core.ChainSideEvent{Block: block}) } - lc.postChainEvents(events) - return 0, err } diff --git a/miner/miner.go b/miner/miner.go index 1c33b3bd28..c8aaa5b928 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -68,7 +68,7 @@ type Miner struct { wg sync.WaitGroup } -func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, isLocalBlock func(block *types.Block) bool) *Miner { +func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, isLocalBlock func(header *types.Header) bool, merger *consensus.Merger) *Miner { miner := &Miner{ eth: eth, mux: mux, @@ -76,7 +76,7 @@ func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *even exitCh: make(chan struct{}), startCh: make(chan common.Address), stopCh: make(chan struct{}), - worker: newWorker(config, chainConfig, engine, eth, mux, isLocalBlock, true), + worker: newWorker(config, chainConfig, engine, eth, mux, isLocalBlock, true, merger), } miner.wg.Add(1) go miner.update() diff --git a/miner/miner_test.go b/miner/miner_test.go index da1e472dbd..de7ca73e26 100644 --- a/miner/miner_test.go +++ b/miner/miner_test.go @@ -22,6 +22,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" @@ -237,7 +238,7 @@ func createMiner(t *testing.T) (*Miner, *event.TypeMux) { // Create chainConfig memdb := memorydb.New() chainDB := rawdb.NewDatabase(memdb) - genesis := core.DeveloperGenesisBlock(15, common.HexToAddress("12345")) + genesis := core.DeveloperGenesisBlock(15, 11_500_000, common.HexToAddress("12345")) chainConfig, _, err := core.SetupGenesisBlock(chainDB, genesis) if err != nil { t.Fatalf("can't create new chain config: %v", err) @@ -245,6 +246,7 @@ func createMiner(t *testing.T) (*Miner, *event.TypeMux) { // Create consensus engine engine := clique.New(chainConfig.Clique, chainDB) // Create Ethereum backend + merger := consensus.NewMerger(rawdb.NewMemoryDatabase()) bc, err := core.NewBlockChain(chainDB, nil, chainConfig, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("can't create new chain %v", err) @@ -257,5 +259,5 @@ func createMiner(t *testing.T) (*Miner, *event.TypeMux) { // Create event Mux mux := new(event.TypeMux) // Create Miner - return New(backend, &config, chainConfig, mux, engine, nil), mux + return New(backend, &config, chainConfig, mux, engine, nil, merger), mux } diff --git a/miner/stress/beacon/main.go b/miner/stress/beacon/main.go new file mode 100644 index 0000000000..70005e20db --- /dev/null +++ b/miner/stress/beacon/main.go @@ -0,0 +1,521 @@ +// Copyright 2021 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 . + +// This file contains a miner stress test for the eth1/2 transition +package main + +import ( + "crypto/ecdsa" + "errors" + "io/ioutil" + "math/big" + "math/rand" + "os" + "path/filepath" + "time" + + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/fdlimit" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/catalyst" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/les" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" +) + +type nodetype int + +const ( + legacyMiningNode nodetype = iota + legacyNormalNode + eth2MiningNode + eth2NormalNode + eth2LightClient +) + +func (typ nodetype) String() string { + switch typ { + case legacyMiningNode: + return "legacyMiningNode" + case legacyNormalNode: + return "legacyNormalNode" + case eth2MiningNode: + return "eth2MiningNode" + case eth2NormalNode: + return "eth2NormalNode" + case eth2LightClient: + return "eth2LightClient" + default: + return "undefined" + } +} + +var ( + // transitionDifficulty is the target total difficulty for transition + transitionDifficulty = new(big.Int).Mul(big.NewInt(20), params.MinimumDifficulty) + + // blockInterval is the time interval for creating a new eth2 block + blockInterval = time.Second * 3 + blockIntervalInt = 3 + + // finalizationDist is the block distance for finalizing block + finalizationDist = 10 +) + +type ethNode struct { + typ nodetype + api *catalyst.ConsensusAPI + ethBackend *eth.Ethereum + lesBackend *les.LightEthereum + stack *node.Node + enode *enode.Node +} + +func newNode(typ nodetype, genesis *core.Genesis, enodes []*enode.Node) *ethNode { + var ( + err error + api *catalyst.ConsensusAPI + stack *node.Node + ethBackend *eth.Ethereum + lesBackend *les.LightEthereum + ) + // Start the node and wait until it's up + if typ == eth2LightClient { + stack, lesBackend, api, err = makeLightNode(genesis) + } else { + stack, ethBackend, api, err = makeFullNode(genesis) + } + if err != nil { + panic(err) + } + for stack.Server().NodeInfo().Ports.Listener == 0 { + time.Sleep(250 * time.Millisecond) + } + // Connect the node to all the previous ones + for _, n := range enodes { + stack.Server().AddPeer(n) + } + enode := stack.Server().Self() + + // Inject the signer key and start sealing with it + stack.AccountManager().AddBackend(keystore.NewPlaintextKeyStore("beacon-stress")) + store := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + if _, err := store.NewAccount(""); err != nil { + panic(err) + } + return ðNode{ + typ: typ, + api: api, + ethBackend: ethBackend, + lesBackend: lesBackend, + stack: stack, + enode: enode, + } +} + +func (n *ethNode) assembleBlock(parentHash common.Hash, parentTimestamp uint64) (*catalyst.ExecutableDataV1, error) { + if n.typ != eth2MiningNode { + return nil, errors.New("invalid node type") + } + payloadAttribute := catalyst.PayloadAttributesV1{ + Timestamp: uint64(time.Now().Unix()), + } + fcState := catalyst.ForkchoiceStateV1{ + HeadBlockHash: parentHash, + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + payload, err := n.api.ForkchoiceUpdatedV1(fcState, &payloadAttribute) + if err != nil { + return nil, err + } + return n.api.GetPayloadV1(*payload.PayloadID) +} + +func (n *ethNode) insertBlock(eb catalyst.ExecutableDataV1) error { + if !eth2types(n.typ) { + return errors.New("invalid node type") + } + newResp, err := n.api.ExecutePayloadV1(eb) + if err != nil { + return err + } else if newResp.Status != "VALID" { + return errors.New("failed to insert block") + } + return nil +} + +func (n *ethNode) insertBlockAndSetHead(parent *types.Header, ed catalyst.ExecutableDataV1) error { + if !eth2types(n.typ) { + return errors.New("invalid node type") + } + if err := n.insertBlock(ed); err != nil { + return err + } + block, err := catalyst.ExecutableDataToBlock(ed) + if err != nil { + return err + } + fcState := catalyst.ForkchoiceStateV1{ + HeadBlockHash: block.ParentHash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + if _, err := n.api.ForkchoiceUpdatedV1(fcState, nil); err != nil { + return err + } + return nil +} + +type nodeManager struct { + genesis *core.Genesis + genesisBlock *types.Block + nodes []*ethNode + enodes []*enode.Node + close chan struct{} +} + +func newNodeManager(genesis *core.Genesis) *nodeManager { + return &nodeManager{ + close: make(chan struct{}), + genesis: genesis, + genesisBlock: genesis.ToBlock(nil), + } +} + +func (mgr *nodeManager) createNode(typ nodetype) { + node := newNode(typ, mgr.genesis, mgr.enodes) + mgr.nodes = append(mgr.nodes, node) + mgr.enodes = append(mgr.enodes, node.enode) +} + +func (mgr *nodeManager) getNodes(typ nodetype) []*ethNode { + var ret []*ethNode + for _, node := range mgr.nodes { + if node.typ == typ { + ret = append(ret, node) + } + } + return ret +} + +func (mgr *nodeManager) startMining() { + for _, node := range append(mgr.getNodes(eth2MiningNode), mgr.getNodes(legacyMiningNode)...) { + if err := node.ethBackend.StartMining(1); err != nil { + panic(err) + } + } +} + +func (mgr *nodeManager) shutdown() { + close(mgr.close) + for _, node := range mgr.nodes { + node.stack.Close() + } +} + +func (mgr *nodeManager) run() { + if len(mgr.nodes) == 0 { + return + } + chain := mgr.nodes[0].ethBackend.BlockChain() + sink := make(chan core.ChainHeadEvent, 1024) + sub := chain.SubscribeChainHeadEvent(sink) + defer sub.Unsubscribe() + + var ( + transitioned bool + parentBlock *types.Block + waitFinalise []*types.Block + ) + timer := time.NewTimer(0) + defer timer.Stop() + <-timer.C // discard the initial tick + + // Handle the by default transition. + if transitionDifficulty.Sign() == 0 { + transitioned = true + parentBlock = mgr.genesisBlock + timer.Reset(blockInterval) + log.Info("Enable the transition by default") + } + + // Handle the block finalization. + checkFinalise := func() { + if parentBlock == nil { + return + } + if len(waitFinalise) == 0 { + return + } + oldest := waitFinalise[0] + if oldest.NumberU64() > parentBlock.NumberU64() { + return + } + distance := parentBlock.NumberU64() - oldest.NumberU64() + if int(distance) < finalizationDist { + return + } + nodes := mgr.getNodes(eth2MiningNode) + nodes = append(nodes, mgr.getNodes(eth2NormalNode)...) + nodes = append(nodes, mgr.getNodes(eth2LightClient)...) + for _, node := range append(nodes) { + fcState := catalyst.ForkchoiceStateV1{ + HeadBlockHash: oldest.Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + node.api.ForkchoiceUpdatedV1(fcState, nil) + } + log.Info("Finalised eth2 block", "number", oldest.NumberU64(), "hash", oldest.Hash()) + waitFinalise = waitFinalise[1:] + } + + for { + checkFinalise() + select { + case <-mgr.close: + return + + case ev := <-sink: + if transitioned { + continue + } + td := chain.GetTd(ev.Block.Hash(), ev.Block.NumberU64()) + if td.Cmp(transitionDifficulty) < 0 { + continue + } + transitioned, parentBlock = true, ev.Block + timer.Reset(blockInterval) + log.Info("Transition difficulty reached", "td", td, "target", transitionDifficulty, "number", ev.Block.NumberU64(), "hash", ev.Block.Hash()) + + case <-timer.C: + producers := mgr.getNodes(eth2MiningNode) + if len(producers) == 0 { + continue + } + hash, timestamp := parentBlock.Hash(), parentBlock.Time() + if parentBlock.NumberU64() == 0 { + timestamp = uint64(time.Now().Unix()) - uint64(blockIntervalInt) + } + ed, err := producers[0].assembleBlock(hash, timestamp) + if err != nil { + log.Error("Failed to assemble the block", "err", err) + continue + } + block, _ := catalyst.ExecutableDataToBlock(*ed) + + nodes := mgr.getNodes(eth2MiningNode) + nodes = append(nodes, mgr.getNodes(eth2NormalNode)...) + nodes = append(nodes, mgr.getNodes(eth2LightClient)...) + + for _, node := range nodes { + if err := node.insertBlockAndSetHead(parentBlock.Header(), *ed); err != nil { + log.Error("Failed to insert block", "type", node.typ, "err", err) + } + } + log.Info("Create and insert eth2 block", "number", ed.Number) + parentBlock = block + waitFinalise = append(waitFinalise, block) + timer.Reset(blockInterval) + } + } +} + +func main() { + log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) + fdlimit.Raise(2048) + + // Generate a batch of accounts to seal and fund with + faucets := make([]*ecdsa.PrivateKey, 16) + for i := 0; i < len(faucets); i++ { + faucets[i], _ = crypto.GenerateKey() + } + // Pre-generate the ethash mining DAG so we don't race + ethash.MakeDataset(1, filepath.Join(os.Getenv("HOME"), ".ethash")) + + // Create an Ethash network based off of the Ropsten config + genesis := makeGenesis(faucets) + manager := newNodeManager(genesis) + defer manager.shutdown() + + manager.createNode(eth2NormalNode) + manager.createNode(eth2MiningNode) + manager.createNode(legacyMiningNode) + manager.createNode(legacyNormalNode) + manager.createNode(eth2LightClient) + + // Iterate over all the nodes and start mining + time.Sleep(3 * time.Second) + if transitionDifficulty.Sign() != 0 { + manager.startMining() + } + go manager.run() + + // Start injecting transactions from the faucets like crazy + time.Sleep(3 * time.Second) + nonces := make([]uint64, len(faucets)) + for { + // Pick a random mining node + nodes := manager.getNodes(eth2MiningNode) + + index := rand.Intn(len(faucets)) + node := nodes[index%len(nodes)] + + // Create a self transaction and inject into the pool + tx, err := types.SignTx(types.NewTransaction(nonces[index], crypto.PubkeyToAddress(faucets[index].PublicKey), new(big.Int), 21000, big.NewInt(100000000000+rand.Int63n(65536)), nil), types.HomesteadSigner{}, faucets[index]) + if err != nil { + panic(err) + } + if err := node.ethBackend.TxPool().AddLocal(tx); err != nil { + panic(err) + } + nonces[index]++ + + // Wait if we're too saturated + if pend, _ := node.ethBackend.TxPool().Stats(); pend > 2048 { + time.Sleep(100 * time.Millisecond) + } + } +} + +// makeGenesis creates a custom Ethash genesis block based on some pre-defined +// faucet accounts. +func makeGenesis(faucets []*ecdsa.PrivateKey) *core.Genesis { + genesis := core.DefaultRopstenGenesisBlock() + genesis.Difficulty = params.MinimumDifficulty + genesis.GasLimit = 25000000 + + genesis.Config.ChainID = big.NewInt(18) + genesis.Config.EIP150Hash = common.Hash{} + genesis.BaseFee = big.NewInt(params.InitialBaseFee) + genesis.Config.TerminalTotalDifficulty = transitionDifficulty + + genesis.Alloc = core.GenesisAlloc{} + for _, faucet := range faucets { + genesis.Alloc[crypto.PubkeyToAddress(faucet.PublicKey)] = core.GenesisAccount{ + Balance: new(big.Int).Exp(big.NewInt(2), big.NewInt(128), nil), + } + } + return genesis +} + +func makeFullNode(genesis *core.Genesis) (*node.Node, *eth.Ethereum, *catalyst.ConsensusAPI, error) { + // Define the basic configurations for the Ethereum node + datadir, _ := ioutil.TempDir("", "") + + config := &node.Config{ + Name: "geth", + Version: params.Version, + DataDir: datadir, + P2P: p2p.Config{ + ListenAddr: "0.0.0.0:0", + NoDiscovery: true, + MaxPeers: 25, + }, + UseLightweightKDF: true, + } + // Create the node and configure a full Ethereum node on it + stack, err := node.New(config) + if err != nil { + return nil, nil, nil, err + } + econfig := ðconfig.Config{ + Genesis: genesis, + NetworkId: genesis.Config.ChainID.Uint64(), + SyncMode: downloader.FullSync, + DatabaseCache: 256, + DatabaseHandles: 256, + TxPool: core.DefaultTxPoolConfig, + GPO: ethconfig.Defaults.GPO, + Ethash: ethconfig.Defaults.Ethash, + Miner: miner.Config{ + GasFloor: genesis.GasLimit * 9 / 10, + GasCeil: genesis.GasLimit * 11 / 10, + GasPrice: big.NewInt(1), + Recommit: 10 * time.Second, // Disable the recommit + }, + LightServ: 100, + LightPeers: 10, + LightNoSyncServe: true, + } + ethBackend, err := eth.New(stack, econfig) + if err != nil { + return nil, nil, nil, err + } + _, err = les.NewLesServer(stack, ethBackend, econfig) + if err != nil { + log.Crit("Failed to create the LES server", "err", err) + } + err = stack.Start() + return stack, ethBackend, catalyst.NewConsensusAPI(ethBackend, nil), err +} + +func makeLightNode(genesis *core.Genesis) (*node.Node, *les.LightEthereum, *catalyst.ConsensusAPI, error) { + // Define the basic configurations for the Ethereum node + datadir, _ := ioutil.TempDir("", "") + + config := &node.Config{ + Name: "geth", + Version: params.Version, + DataDir: datadir, + P2P: p2p.Config{ + ListenAddr: "0.0.0.0:0", + NoDiscovery: true, + MaxPeers: 25, + }, + UseLightweightKDF: true, + } + // Create the node and configure a full Ethereum node on it + stack, err := node.New(config) + if err != nil { + return nil, nil, nil, err + } + lesBackend, err := les.New(stack, ðconfig.Config{ + Genesis: genesis, + NetworkId: genesis.Config.ChainID.Uint64(), + SyncMode: downloader.LightSync, + DatabaseCache: 256, + DatabaseHandles: 256, + TxPool: core.DefaultTxPoolConfig, + GPO: ethconfig.Defaults.GPO, + Ethash: ethconfig.Defaults.Ethash, + LightPeers: 10, + }) + if err != nil { + return nil, nil, nil, err + } + err = stack.Start() + return stack, lesBackend, catalyst.NewConsensusAPI(nil, lesBackend), err +} + +func eth2types(typ nodetype) bool { + if typ == eth2LightClient || typ == eth2NormalNode || typ == eth2MiningNode { + return true + } + return false +} diff --git a/miner/worker.go b/miner/worker.go index 8654e439c4..5be6aea3fb 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -128,6 +128,7 @@ type worker struct { engine consensus.Engine eth Backend chain *core.BlockChain + merger *consensus.Merger // Feeds pendingLogsFeed event.Feed @@ -181,7 +182,7 @@ type worker struct { noempty uint32 // External functions - isLocalBlock func(block *types.Block) bool // Function used to determine whether the specified block is mined by local miner. + isLocalBlock func(header *types.Header) bool // Function used to determine whether the specified block is mined by local miner. // Test hooks newTaskHook func(*task) // Method to call upon receiving a new sealing task. @@ -190,7 +191,7 @@ type worker struct { resubmitHook func(time.Duration, time.Duration) // Method to call upon updating resubmitting interval. } -func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus.Engine, eth Backend, mux *event.TypeMux, isLocalBlock func(*types.Block) bool, init bool) *worker { +func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus.Engine, eth Backend, mux *event.TypeMux, isLocalBlock func(header *types.Header) bool, init bool, merger *consensus.Merger) *worker { worker := &worker{ config: config, chainConfig: chainConfig, @@ -198,6 +199,7 @@ func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus eth: eth, mux: mux, chain: eth.BlockChain(), + merger: merger, isLocalBlock: isLocalBlock, localUncles: make(map[common.Hash]*types.Block), remoteUncles: make(map[common.Hash]*types.Block), @@ -472,7 +474,7 @@ func (w *worker) mainLoop() { continue } // Add side block to possible uncle block set depending on the author. - if w.isLocalBlock != nil && w.isLocalBlock(ev.Block) { + if w.isLocalBlock != nil && w.isLocalBlock(ev.Block.Header()) { w.localUncles[ev.Block.Hash()] = ev.Block } else { w.remoteUncles[ev.Block.Hash()] = ev.Block @@ -593,6 +595,9 @@ func (w *worker) taskLoop() { if err := w.engine.Seal(w.chain, task.block, w.resultCh, stopCh); err != nil { log.Warn("Block sealing failed", "err", err) + w.pendingMu.Lock() + delete(w.pendingTasks, sealHash) + w.pendingMu.Unlock() } case <-w.exitCh: interrupt() @@ -641,23 +646,29 @@ func (w *worker) resultLoop() { receipts = make([]*types.Receipt, len(task.receipts)) logs []*types.Log ) - for i, receipt := range task.receipts { + for i, taskReceipt := range task.receipts { + receipt := new(types.Receipt) + receipts[i] = receipt + *receipt = *taskReceipt + // add block location fields receipt.BlockHash = hash receipt.BlockNumber = block.Number() receipt.TransactionIndex = uint(i) - receipts[i] = new(types.Receipt) - *receipts[i] = *receipt // Update the block hash in all logs since it is now available and not when the // receipt/log of individual transactions were created. - for _, log := range receipt.Logs { + receipt.Logs = make([]*types.Log, len(taskReceipt.Logs)) + for i, taskLog := range taskReceipt.Logs { + log := new(types.Log) + receipt.Logs[i] = log + *log = *taskLog log.BlockHash = hash } logs = append(logs, receipt.Logs...) } // Commit block and state to database. - _, err := w.chain.WriteBlockWithState(block, receipts, logs, task.state, true) + _, err := w.chain.WriteBlockAndSetHead(block, receipts, logs, task.state, true) if err != nil { log.Error("Failed writing block to chain", "err", err) continue @@ -1041,6 +1052,11 @@ func (w *worker) commit(uncles []*types.Header, interval func(), update bool, st if interval != nil { interval() } + // If we're post merge, just ignore + td, ttd := w.chain.GetTd(block.ParentHash(), block.NumberU64()-1), w.chain.Config().TerminalTotalDifficulty + if td != nil && ttd != nil && td.Cmp(ttd) >= 0 { + return nil + } select { case w.taskCh <- &task{receipts: receipts, state: s, block: block, createdAt: time.Now()}: w.unconfirmed.Shift(block.NumberU64() - 1) diff --git a/miner/worker_test.go b/miner/worker_test.go index 5b35c66dce..c8ddd2c320 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -197,7 +197,7 @@ func (b *testWorkerBackend) newRandomTx(creation bool) *types.Transaction { func newTestWorker(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, db ethdb.Database, blocks int) (*worker, *testWorkerBackend) { backend := newTestWorkerBackend(t, chainConfig, engine, db, blocks) backend.txPool.AddLocals(pendingTxs) - w := newWorker(testConfig, chainConfig, engine, backend, new(event.TypeMux), nil, false) + w := newWorker(testConfig, chainConfig, engine, backend, new(event.TypeMux), nil, false, consensus.NewMerger(rawdb.NewMemoryDatabase())) w.setEtherbase(testBankAddress) return w, backend } diff --git a/mobile/ethereum.go b/mobile/ethereum.go index 97c46ddca7..d5058e4e20 100644 --- a/mobile/ethereum.go +++ b/mobile/ethereum.go @@ -78,11 +78,21 @@ type SyncProgress struct { progress ethereum.SyncProgress } -func (p *SyncProgress) GetStartingBlock() int64 { return int64(p.progress.StartingBlock) } -func (p *SyncProgress) GetCurrentBlock() int64 { return int64(p.progress.CurrentBlock) } -func (p *SyncProgress) GetHighestBlock() int64 { return int64(p.progress.HighestBlock) } -func (p *SyncProgress) GetPulledStates() int64 { return int64(p.progress.PulledStates) } -func (p *SyncProgress) GetKnownStates() int64 { return int64(p.progress.KnownStates) } +func (p *SyncProgress) GetStartingBlock() int64 { return int64(p.progress.StartingBlock) } +func (p *SyncProgress) GetCurrentBlock() int64 { return int64(p.progress.CurrentBlock) } +func (p *SyncProgress) GetHighestBlock() int64 { return int64(p.progress.HighestBlock) } +func (p *SyncProgress) GetSyncedAccounts() int64 { return int64(p.progress.SyncedAccounts) } +func (p *SyncProgress) GetSyncedAccountBytes() int64 { return int64(p.progress.SyncedAccountBytes) } +func (p *SyncProgress) GetSyncedBytecodes() int64 { return int64(p.progress.SyncedBytecodes) } +func (p *SyncProgress) GetSyncedBytecodeBytes() int64 { return int64(p.progress.SyncedBytecodeBytes) } +func (p *SyncProgress) GetSyncedStorage() int64 { return int64(p.progress.SyncedStorage) } +func (p *SyncProgress) GetSyncedStorageBytes() int64 { return int64(p.progress.SyncedStorageBytes) } +func (p *SyncProgress) GetHealedTrienodes() int64 { return int64(p.progress.HealedTrienodes) } +func (p *SyncProgress) GetHealedTrienodeBytes() int64 { return int64(p.progress.HealedTrienodeBytes) } +func (p *SyncProgress) GetHealedBytecodes() int64 { return int64(p.progress.HealedBytecodes) } +func (p *SyncProgress) GetHealedBytecodeBytes() int64 { return int64(p.progress.HealedBytecodeBytes) } +func (p *SyncProgress) GetHealingTrienodes() int64 { return int64(p.progress.HealingTrienodes) } +func (p *SyncProgress) GetHealingBytecode() int64 { return int64(p.progress.HealingBytecode) } // Topics is a set of topic lists to filter events with. type Topics struct{ topics [][]common.Hash } diff --git a/mobile/geth.go b/mobile/geth.go index 6a9d75c35b..0118f6fc21 100644 --- a/mobile/geth.go +++ b/mobile/geth.go @@ -165,6 +165,13 @@ func NewNode(datadir string, config *NodeConfig) (stack *Node, _ error) { config.EthereumNetworkID = 3 } } + // If we have the Sepolia testnet, hard code the chain configs too + if config.EthereumGenesis == SepoliaGenesis() { + genesis.Config = params.SepoliaChainConfig + if config.EthereumNetworkID == 1 { + config.EthereumNetworkID = 11155111 + } + } // If we have the Rinkeby testnet, hard code the chain configs too if config.EthereumGenesis == RinkebyGenesis() { genesis.Config = params.RinkebyChainConfig diff --git a/mobile/params.go b/mobile/params.go index 71ab014a27..9d68567dbd 100644 --- a/mobile/params.go +++ b/mobile/params.go @@ -41,6 +41,15 @@ func RopstenGenesis() string { return string(enc) } +// SepoliaGenesis returns the JSON spec to use for the Sepolia test network. +func SepoliaGenesis() string { + enc, err := json.Marshal(core.DefaultSepoliaGenesisBlock()) + if err != nil { + panic(err) + } + return string(enc) +} + // RinkebyGenesis returns the JSON spec to use for the Rinkeby test network func RinkebyGenesis() string { enc, err := json.Marshal(core.DefaultRinkebyGenesisBlock()) diff --git a/oss-fuzz.sh b/oss-fuzz.sh index 9a24f6b175..745a5ba7c7 100644 --- a/oss-fuzz.sh +++ b/oss-fuzz.sh @@ -120,5 +120,10 @@ compile_fuzzer tests/fuzzers/bls12381 FuzzCrossG1MultiExp fuzz_cross_g1_multiex compile_fuzzer tests/fuzzers/bls12381 FuzzCrossG2Add fuzz_cross_g2_add compile_fuzzer tests/fuzzers/bls12381 FuzzCrossPairing fuzz_cross_pairing +compile_fuzzer tests/fuzzers/snap FuzzARange fuzz_account_range +compile_fuzzer tests/fuzzers/snap FuzzSRange fuzz_storage_range +compile_fuzzer tests/fuzzers/snap FuzzByteCodes fuzz_byte_codes +compile_fuzzer tests/fuzzers/snap FuzzTrieNodes fuzz_trie_nodes + #TODO: move this to tests/fuzzers, if possible compile_fuzzer crypto/blake2b Fuzz fuzzBlake2b diff --git a/p2p/discover/v4wire/v4wire.go b/p2p/discover/v4wire/v4wire.go index 23e7134414..bc537a4cf7 100644 --- a/p2p/discover/v4wire/v4wire.go +++ b/p2p/discover/v4wire/v4wire.go @@ -102,7 +102,7 @@ type ( } ) -// This number is the maximum number of neighbor nodes in a Neigbors packet. +// This number is the maximum number of neighbor nodes in a Neighbors packet. const MaxNeighbors = 12 // This code computes the MaxNeighbors constant value. diff --git a/p2p/discover/v5wire/encoding_test.go b/p2p/discover/v5wire/encoding_test.go index b13041d1b9..355a8f6913 100644 --- a/p2p/discover/v5wire/encoding_test.go +++ b/p2p/discover/v5wire/encoding_test.go @@ -20,13 +20,13 @@ import ( "bytes" "crypto/ecdsa" "encoding/hex" + "errors" "flag" "fmt" "io/ioutil" "net" "os" "path/filepath" - "reflect" "strings" "testing" @@ -555,7 +555,7 @@ func (n *handshakeTestNode) expectDecode(t *testing.T, ptype byte, p []byte) Pac func (n *handshakeTestNode) expectDecodeErr(t *testing.T, wantErr error, p []byte) { t.Helper() - if _, err := n.decode(p); !reflect.DeepEqual(err, wantErr) { + if _, err := n.decode(p); !errors.Is(err, wantErr) { t.Fatal(fmt.Errorf("(%s) got err %q, want %q", n.ln.ID().TerminalString(), err, wantErr)) } } diff --git a/p2p/discover/v5wire/msg.go b/p2p/discover/v5wire/msg.go index 7c3686111b..c049668477 100644 --- a/p2p/discover/v5wire/msg.go +++ b/p2p/discover/v5wire/msg.go @@ -84,7 +84,7 @@ type ( ReqID []byte ENRSeq uint64 ToIP net.IP // These fields should mirror the UDP envelope address of the ping - ToPort uint16 // packet, which provides a way to discover the the external address (after NAT). + ToPort uint16 // packet, which provides a way to discover the external address (after NAT). } // FINDNODE is a query for nodes in the given bucket. diff --git a/p2p/enode/localnode.go b/p2p/enode/localnode.go index 4827b6c0ae..a18204e752 100644 --- a/p2p/enode/localnode.go +++ b/p2p/enode/localnode.go @@ -63,7 +63,7 @@ type LocalNode struct { type lnEndpoint struct { track *netutil.IPTracker staticIP, fallbackIP net.IP - fallbackUDP int + fallbackUDP uint16 // port } // NewLocalNode creates a local node. @@ -208,8 +208,8 @@ func (ln *LocalNode) SetFallbackUDP(port int) { ln.mu.Lock() defer ln.mu.Unlock() - ln.endpoint4.fallbackUDP = port - ln.endpoint6.fallbackUDP = port + ln.endpoint4.fallbackUDP = uint16(port) + ln.endpoint6.fallbackUDP = uint16(port) ln.updateEndpoints() } @@ -261,7 +261,7 @@ func (ln *LocalNode) updateEndpoints() { } // get returns the endpoint with highest precedence. -func (e *lnEndpoint) get() (newIP net.IP, newPort int) { +func (e *lnEndpoint) get() (newIP net.IP, newPort uint16) { newPort = e.fallbackUDP if e.fallbackIP != nil { newIP = e.fallbackIP @@ -277,15 +277,18 @@ func (e *lnEndpoint) get() (newIP net.IP, newPort int) { // predictAddr wraps IPTracker.PredictEndpoint, converting from its string-based // endpoint representation to IP and port types. -func predictAddr(t *netutil.IPTracker) (net.IP, int) { +func predictAddr(t *netutil.IPTracker) (net.IP, uint16) { ep := t.PredictEndpoint() if ep == "" { return nil, 0 } ipString, portString, _ := net.SplitHostPort(ep) ip := net.ParseIP(ipString) - port, _ := strconv.Atoi(portString) - return ip, port + port, err := strconv.ParseUint(portString, 10, 16) + if err != nil { + return nil, 0 + } + return ip, uint16(port) } func (ln *LocalNode) invalidate() { diff --git a/p2p/enr/enr.go b/p2p/enr/enr.go index 05e43fd805..15891813b4 100644 --- a/p2p/enr/enr.go +++ b/p2p/enr/enr.go @@ -304,7 +304,7 @@ func (r *Record) AppendElements(list []interface{}) []interface{} { } func (r *Record) encode(sig []byte) (raw []byte, err error) { - list := make([]interface{}, 1, 2*len(r.pairs)+1) + list := make([]interface{}, 1, 2*len(r.pairs)+2) list[0] = sig list = r.AppendElements(list) if raw, err = rlp.EncodeToBytes(list); err != nil { diff --git a/p2p/nodestate/nodestate.go b/p2p/nodestate/nodestate.go index 9323d53cbd..2af0d0a6bd 100644 --- a/p2p/nodestate/nodestate.go +++ b/p2p/nodestate/nodestate.go @@ -808,7 +808,14 @@ func (ns *NodeStateMachine) addTimeout(n *enode.Node, mask bitMask, timeout time ns.removeTimeouts(node, mask) t := &nodeStateTimeout{mask: mask} t.timer = ns.clock.AfterFunc(timeout, func() { - ns.SetState(n, Flags{}, Flags{mask: t.mask, setup: ns.setup}, 0) + ns.lock.Lock() + defer ns.lock.Unlock() + + if !ns.opStart() { + return + } + ns.setState(n, Flags{}, Flags{mask: t.mask, setup: ns.setup}, 0) + ns.opFinish() }) node.timeouts = append(node.timeouts, t) if mask&ns.saveFlags != 0 { diff --git a/p2p/peer.go b/p2p/peer.go index b6d0dbd1ae..8f564e776d 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -121,10 +121,18 @@ type Peer struct { // NewPeer returns a peer for testing purposes. func NewPeer(id enode.ID, name string, caps []Cap) *Peer { + // Generate a fake set of local protocols to match as running caps. Almost + // no fields needs to be meaningful here as we're only using it to cross- + // check with the "remote" caps array. + protos := make([]Protocol, len(caps)) + for i, cap := range caps { + protos[i].Name = cap.Name + protos[i].Version = cap.Version + } pipe, _ := net.Pipe() node := enode.SignNull(new(enr.Record), id) conn := &conn{fd: pipe, transport: nil, node: node, caps: caps, name: name} - peer := newPeer(log.Root(), conn, nil) + peer := newPeer(log.Root(), conn, protos) close(peer.closed) // ensures Disconnect doesn't block return peer } diff --git a/p2p/server_test.go b/p2p/server_test.go index a5b3190aed..f6f5700c5e 100644 --- a/p2p/server_test.go +++ b/p2p/server_test.go @@ -370,6 +370,8 @@ func TestServerSetupConn(t *testing.T) { clientkey, srvkey = newkey(), newkey() clientpub = &clientkey.PublicKey srvpub = &srvkey.PublicKey + fooErr = errors.New("foo") + readErr = errors.New("read error") ) tests := []struct { dontstart bool @@ -387,10 +389,10 @@ func TestServerSetupConn(t *testing.T) { wantCloseErr: errServerStopped, }, { - tt: &setupTransport{pubkey: clientpub, encHandshakeErr: errors.New("read error")}, + tt: &setupTransport{pubkey: clientpub, encHandshakeErr: readErr}, flags: inboundConn, wantCalls: "doEncHandshake,close,", - wantCloseErr: errors.New("read error"), + wantCloseErr: readErr, }, { tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: randomID().Bytes()}}, @@ -400,11 +402,11 @@ func TestServerSetupConn(t *testing.T) { wantCloseErr: DiscUnexpectedIdentity, }, { - tt: &setupTransport{pubkey: clientpub, protoHandshakeErr: errors.New("foo")}, + tt: &setupTransport{pubkey: clientpub, protoHandshakeErr: fooErr}, dialDest: enode.NewV4(clientpub, nil, 0, 0), flags: dynDialedConn, wantCalls: "doEncHandshake,doProtoHandshake,close,", - wantCloseErr: errors.New("foo"), + wantCloseErr: fooErr, }, { tt: &setupTransport{pubkey: srvpub, phs: protoHandshake{ID: crypto.FromECDSAPub(srvpub)[1:]}}, @@ -443,7 +445,7 @@ func TestServerSetupConn(t *testing.T) { } p1, _ := net.Pipe() srv.SetupConn(p1, test.flags, test.dialDest) - if !reflect.DeepEqual(test.tt.closeErr, test.wantCloseErr) { + if !errors.Is(test.tt.closeErr, test.wantCloseErr) { t.Errorf("test %d: close error mismatch: got %q, want %q", i, test.tt.closeErr, test.wantCloseErr) } if test.tt.calls != test.wantCalls { diff --git a/p2p/simulations/README.md b/p2p/simulations/README.md index 871d71b2c7..023f73a098 100644 --- a/p2p/simulations/README.md +++ b/p2p/simulations/README.md @@ -1,7 +1,7 @@ # devp2p Simulations -The `p2p/simulations` package implements a simulation framework which supports -creating a collection of devp2p nodes, connecting them together to form a +The `p2p/simulations` package implements a simulation framework that supports +creating a collection of devp2p nodes, connecting them to form a simulation network, performing simulation actions in that network and then extracting useful information. @@ -65,10 +65,10 @@ localhost ports. ## Network -A simulation network is created with an ID and default service (which is used -if a node is created without an explicit service), exposes methods for -creating, starting, stopping, connecting and disconnecting nodes, and emits -events when certain actions occur. +A simulation network is created with an ID and default service. The default +service is used if a node is created without an explicit service. The +network has exposed methods for creating, starting, stopping, connecting +and disconnecting nodes. It also emits events when certain actions occur. ### Events @@ -80,7 +80,7 @@ A simulation network emits the following events: The events have a "control" flag which when set indicates that the event is the outcome of a controlled simulation action (e.g. creating a node or explicitly -connecting two nodes together). +connecting two nodes). This is in contrast to a non-control event, otherwise called a "live" event, which is the outcome of something happening in the network as a result of a @@ -98,12 +98,12 @@ network and then wait for expectations to be met. With a running simulation network, the `Simulation.Run` method can be called with a `Step` which has the following fields: -* `Action` - a function which performs some action in the network +* `Action` - a function that performs some action in the network * `Expect` - an expectation function which returns whether or not a given node meets the expectation -* `Trigger` - a channel which receives node IDs which then trigger a check +* `Trigger` - a channel that receives node IDs which then trigger a check of the expectation function to be performed against that node As a concrete example, consider a simulated network of Ethereum nodes. An @@ -116,7 +116,7 @@ the expectation and what network events were emitted during the step run. ## HTTP API -The simulation framework includes a HTTP API which can be used to control the +The simulation framework includes a HTTP API that can be used to control the simulation. The API is initialised with a particular node adapter and has the following diff --git a/p2p/simulations/adapters/types.go b/p2p/simulations/adapters/types.go index 1da464a10d..aeb8ef7772 100644 --- a/p2p/simulations/adapters/types.go +++ b/p2p/simulations/adapters/types.go @@ -242,7 +242,7 @@ func assignTCPPort() (uint16, error) { if err != nil { return 0, err } - p, err := strconv.ParseInt(port, 10, 32) + p, err := strconv.ParseUint(port, 10, 16) if err != nil { return 0, err } diff --git a/p2p/simulations/network.go b/p2p/simulations/network.go index 9b5e2c37f5..962910dd25 100644 --- a/p2p/simulations/network.go +++ b/p2p/simulations/network.go @@ -22,7 +22,6 @@ import ( "encoding/json" "errors" "fmt" - "io" "math/rand" "sync" "time" @@ -695,12 +694,6 @@ func (net *Network) Shutdown() { if err := node.Stop(); err != nil { log.Warn("Can't stop node", "id", node.ID(), "err", err) } - // If the node has the close method, call it. - if closer, ok := node.Node.(io.Closer); ok { - if err := closer.Close(); err != nil { - log.Warn("Can't close node", "id", node.ID(), "err", err) - } - } } close(net.quitc) } diff --git a/params/bootnodes.go b/params/bootnodes.go index 67adcf0464..5460246626 100644 --- a/params/bootnodes.go +++ b/params/bootnodes.go @@ -41,6 +41,15 @@ var RopstenBootnodes = []string{ "enode://94c15d1b9e2fe7ce56e458b9a3b672ef11894ddedd0c6f247e0f1d3487f52b66208fb4aeb8179fce6e3a749ea93ed147c37976d67af557508d199d9594c35f09@192.81.208.223:30303", // @gpip } +// SepoliaBootnodes are the enode URLs of the P2P bootstrap nodes running on the +// Sepolia test network. +var SepoliaBootnodes = []string{ + // geth + "enode://9246d00bc8fd1742e5ad2428b80fc4dc45d786283e05ef6edbd9002cbc335d40998444732fbe921cb88e1d2c73d1b1de53bae6a2237996e9bfe14f871baf7066@18.168.182.86:30303", + // besu + "enode://ec66ddcf1a974950bd4c782789a7e04f8aa7110a72569b6e65fcd51e937e74eed303b1ea734e4d19cfaec9fbff9b6ee65bf31dcb50ba79acce9dd63a6aca61c7@52.14.151.177:30303", +} + // RinkebyBootnodes are the enode URLs of the P2P bootstrap nodes running on the // Rinkeby test network. var RinkebyBootnodes = []string{ diff --git a/params/config.go b/params/config.go index c01076d28d..a7bc6fde31 100644 --- a/params/config.go +++ b/params/config.go @@ -35,13 +35,14 @@ var ( GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") MumbaiGenesisHash = common.HexToHash("0x7b66506a9ebdbf30d32b43c5f15a3b1216269a1ec3a75aa3182b86176a2b1ca7") BorMainnetGenesisHash = common.HexToHash("0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b") + SepoliaGenesisHash = common.HexToHash("0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9") ) // TrustedCheckpoints associates each known checkpoint with the genesis hash of -// the chain it belongs to. var TrustedCheckpoints = map[common.Hash]*TrustedCheckpoint{ MainnetGenesisHash: MainnetTrustedCheckpoint, RopstenGenesisHash: RopstenTrustedCheckpoint, + SepoliaGenesisHash: SepoliaTrustedCheckpoint, RinkebyGenesisHash: RinkebyTrustedCheckpoint, GoerliGenesisHash: GoerliTrustedCheckpoint, } @@ -73,15 +74,16 @@ var ( MuirGlacierBlock: big.NewInt(9_200_000), BerlinBlock: big.NewInt(12_244_000), LondonBlock: big.NewInt(12_965_000), + ArrowGlacierBlock: big.NewInt(13_773_000), Ethash: new(EthashConfig), } // MainnetTrustedCheckpoint contains the light client trusted checkpoint for the main network. MainnetTrustedCheckpoint = &TrustedCheckpoint{ - SectionIndex: 395, - SectionHead: common.HexToHash("0xbfca95b8c1de014e252288e9c32029825fadbff58285f5b54556525e480dbb5b"), - CHTRoot: common.HexToHash("0x2ccf3dbb58eb6375e037fdd981ca5778359e4b8fa0270c2878b14361e64161e7"), - BloomRoot: common.HexToHash("0x2d46ec65a6941a2dc1e682f8f81f3d24192021f492fdf6ef0fdd51acb0f4ba0f"), + SectionIndex: 413, + SectionHead: common.HexToHash("0x8aa8e64ceadcdc5f23bc41d2acb7295a261a5cf680bb00a34f0e01af08200083"), + CHTRoot: common.HexToHash("0x008af584d385a2610706c5a439d39f15ddd4b691c5d42603f65ae576f703f477"), + BloomRoot: common.HexToHash("0x5a081af71a588f4d90bced242545b08904ad4fb92f7effff2ceb6e50e6dec157"), } // MainnetCheckpointOracle contains a set of configs for the main network oracle. @@ -119,10 +121,10 @@ var ( // RopstenTrustedCheckpoint contains the light client trusted checkpoint for the Ropsten test network. RopstenTrustedCheckpoint = &TrustedCheckpoint{ - SectionIndex: 329, - SectionHead: common.HexToHash("0xe66f7038333a01fb95dc9ea03e5a2bdaf4b833cdcb9e393b9127e013bd64d39b"), - CHTRoot: common.HexToHash("0x1b0c883338ac0d032122800c155a2e73105fbfebfaa50436893282bc2d9feec5"), - BloomRoot: common.HexToHash("0x3cc98c88d283bf002378246f22c653007655cbcea6ed89f98d739f73bd341a01"), + SectionIndex: 346, + SectionHead: common.HexToHash("0xafa0384ebd13a751fb7475aaa7fc08ac308925c8b2e2195bca2d4ab1878a7a84"), + CHTRoot: common.HexToHash("0x522ae1f334bfa36033b2315d0b9954052780700b69448ecea8d5877e0f7ee477"), + BloomRoot: common.HexToHash("0x4093fd53b0d2cc50181dca353fe66f03ae113e7cb65f869a4dfb5905de6a0493"), } // RopstenCheckpointOracle contains a set of configs for the Ropsten test network oracle. @@ -138,6 +140,33 @@ var ( Threshold: 2, } + // SepoliaChainConfig contains the chain parameters to run a node on the Sepolia test network. + SepoliaChainConfig = &ChainConfig{ + ChainID: big.NewInt(11155111), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: true, + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(0), + Ethash: new(EthashConfig), + } + + // SepoliaTrustedCheckpoint contains the light client trusted checkpoint for the Sepolia test network. + SepoliaTrustedCheckpoint = &TrustedCheckpoint{ + SectionIndex: 1, + SectionHead: common.HexToHash("0x5dde65e28745b10ff9e9b86499c3a3edc03587b27a06564a4342baf3a37de869"), + CHTRoot: common.HexToHash("0x042a0d914f7baa4f28f14d12291e5f346e88c5b9d95127bf5422a8afeacd27e8"), + BloomRoot: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"), + } + // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network. RinkebyChainConfig = &ChainConfig{ ChainID: big.NewInt(4), @@ -155,6 +184,7 @@ var ( MuirGlacierBlock: nil, BerlinBlock: big.NewInt(8_290_928), LondonBlock: big.NewInt(8_897_988), + ArrowGlacierBlock: nil, Clique: &CliqueConfig{ Period: 15, Epoch: 30000, @@ -163,10 +193,10 @@ var ( // RinkebyTrustedCheckpoint contains the light client trusted checkpoint for the Rinkeby test network. RinkebyTrustedCheckpoint = &TrustedCheckpoint{ - SectionIndex: 276, - SectionHead: common.HexToHash("0xea89a4b04e3da9bd688e316f8de669396b6d4a38a19d2cd96a00b70d58b836aa"), - CHTRoot: common.HexToHash("0xd6889d0bf6673c0d2c1cf6e9098a6fe5b30888a115b6112796aa8ee8efc4a723"), - BloomRoot: common.HexToHash("0x6009a9256b34b8bde3a3f094afb647ba5d73237546017b9025d64ac1ff54c47c"), + SectionIndex: 292, + SectionHead: common.HexToHash("0x4185c2f1bb85ecaa04409d1008ff0761092ea2e94e8a71d64b1a5abc37b81414"), + CHTRoot: common.HexToHash("0x03b0191e6140effe0b88bb7c97bfb794a275d3543cb3190662fb72d9beea423c"), + BloomRoot: common.HexToHash("0x3d5f6edccc87536dcbc0dd3aae97a318205c617dd3957b4261470c71481629e2"), } // RinkebyCheckpointOracle contains a set of configs for the Rinkeby test network oracle. @@ -197,6 +227,7 @@ var ( MuirGlacierBlock: nil, BerlinBlock: big.NewInt(4_460_644), LondonBlock: big.NewInt(5_062_605), + ArrowGlacierBlock: nil, Clique: &CliqueConfig{ Period: 15, Epoch: 30000, @@ -205,10 +236,10 @@ var ( // GoerliTrustedCheckpoint contains the light client trusted checkpoint for the Görli test network. GoerliTrustedCheckpoint = &TrustedCheckpoint{ - SectionIndex: 160, - SectionHead: common.HexToHash("0xb5a666c790dc35a5613d04ebba8ba47a850b45a15d9b95ad7745c35ae034b5a5"), - CHTRoot: common.HexToHash("0x6b4e00df52bdc38fa6c26c8ef595c2ad6184963ea36ab08ee744af460aa735e1"), - BloomRoot: common.HexToHash("0x8fa88f5e50190cb25243aeee262a1a9e4434a06f8d455885dcc1b5fc48c33836"), + SectionIndex: 176, + SectionHead: common.HexToHash("0x2de018858528434f93adb40b1f03f2304a86d31b4ef2b1f930da0134f5c32427"), + CHTRoot: common.HexToHash("0x8c17e497d38088321c147abe4acbdfb3c0cab7d7a2b97e07404540f04d12747e"), + BloomRoot: common.HexToHash("0x02a41b6606bd3f741bd6ae88792d75b1ad8cf0ea5e28fbaa03bc8b95cbd20034"), } // GoerliCheckpointOracle contains a set of configs for the Goerli test network oracle. @@ -360,16 +391,16 @@ var ( // // This configuration is intentionally not using keyed fields to force anyone // adding flags to the config to also have to set these fields. - AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil, nil} + AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil, nil} // AllCliqueProtocolChanges contains every protocol change (EIPs) introduced // and accepted by the Ethereum core developers into the Clique consensus. // // This configuration is intentionally not using keyed fields to force anyone // adding flags to the config to also have to set these fields. - AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, nil, &CliqueConfig{Period: 0, Epoch: 30000}, nil} + AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, nil, nil, &CliqueConfig{Period: 0, Epoch: 30000}, nil} - TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil, nil} + TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil, nil} TestRules = TestChainConfig.Rules(new(big.Int)) ) @@ -448,6 +479,8 @@ type ChainConfig struct { MuirGlacierBlock *big.Int `json:"muirGlacierBlock,omitempty"` // Eip-2384 (bomb delay) switch block (nil = no fork, 0 = already activated) BerlinBlock *big.Int `json:"berlinBlock,omitempty"` // Berlin switch block (nil = no fork, 0 = already on berlin) LondonBlock *big.Int `json:"londonBlock,omitempty"` // London switch block (nil = no fork, 0 = already on london) + ArrowGlacierBlock *big.Int `json:"arrowGlacierBlock,omitempty"` // Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated) + MergeForkBlock *big.Int `json:"mergeForkBlock,omitempty"` // EIP-3675 (TheMerge) switch block (nil = no fork, 0 = already in merge proceedings) // TerminalTotalDifficulty is the amount of total difficulty reached by // the network that triggers the consensus upgrade. @@ -554,7 +587,7 @@ func (c *ChainConfig) String() string { default: engine = "unknown" } - return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Berlin: %v, London: %v, Engine: %v}", + return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, MergeFork: %v, Engine: %v}", c.ChainID, c.HomesteadBlock, c.DAOForkBlock, @@ -569,6 +602,8 @@ func (c *ChainConfig) String() string { c.MuirGlacierBlock, c.BerlinBlock, c.LondonBlock, + c.ArrowGlacierBlock, + c.MergeForkBlock, engine, ) } @@ -635,6 +670,11 @@ func (c *ChainConfig) IsLondon(num *big.Int) bool { return isForked(c.LondonBlock, num) } +// IsArrowGlacier returns whether num is either equal to the Arrow Glacier (EIP-4345) fork block or greater. +func (c *ChainConfig) IsArrowGlacier(num *big.Int) bool { + return isForked(c.ArrowGlacierBlock, num) +} + // IsTerminalPoWBlock returns whether the given block is the last block of PoW stage. func (c *ChainConfig) IsTerminalPoWBlock(parentTotalDiff *big.Int, totalDiff *big.Int) bool { if c.TerminalTotalDifficulty == nil { @@ -683,6 +723,8 @@ func (c *ChainConfig) CheckConfigForkOrder() error { {name: "muirGlacierBlock", block: c.MuirGlacierBlock, optional: true}, {name: "berlinBlock", block: c.BerlinBlock}, {name: "londonBlock", block: c.LondonBlock}, + {name: "arrowGlacierBlock", block: c.ArrowGlacierBlock, optional: true}, + {name: "mergeStartBlock", block: c.MergeForkBlock, optional: true}, } { if lastFork.name != "" { // Next one must be higher number @@ -752,6 +794,12 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi if isForkIncompatible(c.LondonBlock, newcfg.LondonBlock, head) { return newCompatError("London fork block", c.LondonBlock, newcfg.LondonBlock) } + if isForkIncompatible(c.ArrowGlacierBlock, newcfg.ArrowGlacierBlock, head) { + return newCompatError("Arrow Glacier fork block", c.ArrowGlacierBlock, newcfg.ArrowGlacierBlock) + } + if isForkIncompatible(c.MergeForkBlock, newcfg.MergeForkBlock, head) { + return newCompatError("Merge Start fork block", c.MergeForkBlock, newcfg.MergeForkBlock) + } return nil } diff --git a/params/protocol_params.go b/params/protocol_params.go index 7abb2441bf..5f154597a7 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -19,9 +19,10 @@ package params import "math/big" const ( - GasLimitBoundDivisor uint64 = 1024 // The bound divisor of the gas limit, used in update calculations. - MinGasLimit uint64 = 5000 // Minimum the gas limit may ever be. - GenesisGasLimit uint64 = 4712388 // Gas limit of the Genesis block. + GasLimitBoundDivisor uint64 = 1024 // The bound divisor of the gas limit, used in update calculations. + MinGasLimit uint64 = 5000 // Minimum the gas limit may ever be. + MaxGasLimit uint64 = 0x7fffffffffffffff // Maximum the gas limit (2^63-1). + GenesisGasLimit uint64 = 4712388 // Gas limit of the Genesis block. MaximumExtraDataSize uint64 = 32 // Maximum size extra data may be after Genesis. ExpByteGas uint64 = 10 // Times ceil(log256(exponent)) for the EXP instruction. @@ -35,8 +36,8 @@ const ( LogDataGas uint64 = 8 // Per byte in a LOG* operation's data. CallStipend uint64 = 2300 // Free gas given at beginning of call. - Sha3Gas uint64 = 30 // Once per SHA3 operation. - Sha3WordGas uint64 = 6 // Once per word of the SHA3 operation's data. + Keccak256Gas uint64 = 30 // Once per KECCAK256 operation. + Keccak256WordGas uint64 = 6 // Once per word of the KECCAK256 operation's data. SstoreSetGas uint64 = 20000 // Once per SSTORE operation. SstoreResetGas uint64 = 5000 // Once per SSTORE operation if the zeroness changes from zero. diff --git a/params/version.go b/params/version.go index c9f0f7c956..8b8531046f 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 0 // Major version component of the current release - VersionMinor = 2 // Minor version component of the current release - VersionPatch = 13 // Patch version component of the current release - VersionMeta = "stable" // Version metadata to append to the version string + VersionMajor = 0 // Major version component of the current release + VersionMinor = 2 // Minor version component of the current release + VersionPatch = 14 // Patch version component of the current release + VersionMeta = "beta-1" // Version metadata to append to the version string ) // Version holds the textual version string. diff --git a/rlp/raw_test.go b/rlp/raw_test.go index 185e269d07..46adff22c5 100644 --- a/rlp/raw_test.go +++ b/rlp/raw_test.go @@ -18,8 +18,8 @@ package rlp import ( "bytes" + "errors" "io" - "reflect" "testing" "testing/quick" ) @@ -54,7 +54,7 @@ func TestCountValues(t *testing.T) { if count != test.count { t.Errorf("test %d: count mismatch, got %d want %d\ninput: %s", i, count, test.count, test.input) } - if !reflect.DeepEqual(err, test.err) { + if !errors.Is(err, test.err) { t.Errorf("test %d: err mismatch, got %q want %q\ninput: %s", i, err, test.err, test.input) } } diff --git a/rpc/client.go b/rpc/client.go index e9deb3f6db..e43760c22c 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -17,7 +17,6 @@ package rpc import ( - "bytes" "context" "encoding/json" "errors" @@ -360,7 +359,10 @@ func (c *Client) BatchCall(b []BatchElem) error { // // Note that batch calls may not be executed atomically on the server side. func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { - msgs := make([]*jsonrpcMessage, len(b)) + var ( + msgs = make([]*jsonrpcMessage, len(b)) + byID = make(map[string]int, len(b)) + ) op := &requestOp{ ids: make([]json.RawMessage, len(b)), resp: make(chan *jsonrpcMessage, len(b)), @@ -372,6 +374,7 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { } msgs[i] = msg op.ids[i] = msg.ID + byID[string(msg.ID)] = i } var err error @@ -391,13 +394,7 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { // Find the element corresponding to this response. // The element is guaranteed to be present because dispatch // only sends valid IDs to our channel. - var elem *BatchElem - for i := range msgs { - if bytes.Equal(msgs[i].ID, resp.ID) { - elem = &b[i] - break - } - } + elem := &b[byID[string(resp.ID)]] if resp.Error != nil { elem.Error = resp.Error continue @@ -426,12 +423,12 @@ func (c *Client) Notify(ctx context.Context, method string, args ...interface{}) return c.send(ctx, op, msg) } -// EthSubscribe registers a subscripion under the "eth" namespace. +// EthSubscribe registers a subscription under the "eth" namespace. func (c *Client) EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { return c.Subscribe(ctx, "eth", channel, args...) } -// ShhSubscribe registers a subscripion under the "shh" namespace. +// ShhSubscribe registers a subscription under the "shh" namespace. // Deprecated: use Subscribe(ctx, "shh", ...). func (c *Client) ShhSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { return c.Subscribe(ctx, "shh", channel, args...) diff --git a/rpc/errors.go b/rpc/errors.go index 4c06a745fb..75425b925a 100644 --- a/rpc/errors.go +++ b/rpc/errors.go @@ -54,6 +54,7 @@ var ( _ Error = new(invalidRequestError) _ Error = new(invalidMessageError) _ Error = new(invalidParamsError) + _ Error = new(CustomError) ) const defaultErrorCode = -32000 @@ -101,3 +102,12 @@ type invalidParamsError struct{ message string } func (e *invalidParamsError) ErrorCode() int { return -32602 } func (e *invalidParamsError) Error() string { return e.message } + +type CustomError struct { + Code int + ValidationError string +} + +func (e *CustomError) ErrorCode() int { return e.Code } + +func (e *CustomError) Error() string { return e.ValidationError } diff --git a/rpc/handler.go b/rpc/handler.go index 85f774a1b7..488a29300a 100644 --- a/rpc/handler.go +++ b/rpc/handler.go @@ -240,7 +240,7 @@ func (h *handler) handleImmediate(msg *jsonrpcMessage) bool { return false case msg.isResponse(): h.handleResponse(msg) - h.log.Trace("Handled RPC response", "reqid", idForLog{msg.ID}, "t", time.Since(start)) + h.log.Trace("Handled RPC response", "reqid", idForLog{msg.ID}, "duration", time.Since(start)) return true default: return false @@ -292,12 +292,12 @@ func (h *handler) handleCallMsg(ctx *callProc, msg *jsonrpcMessage) *jsonrpcMess switch { case msg.isNotification(): h.handleCall(ctx, msg) - h.log.Debug("Served "+msg.Method, "t", time.Since(start)) + h.log.Debug("Served "+msg.Method, "duration", time.Since(start)) return nil case msg.isCall(): resp := h.handleCall(ctx, msg) var ctx []interface{} - ctx = append(ctx, "reqid", idForLog{msg.ID}, "t", time.Since(start)) + ctx = append(ctx, "reqid", idForLog{msg.ID}, "duration", time.Since(start)) if resp.Error != nil { ctx = append(ctx, "err", resp.Error.Message) if resp.Error.Data != nil { diff --git a/rpc/types.go b/rpc/types.go index d9c2317a78..ca52d474d9 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -186,6 +186,16 @@ func (bnh *BlockNumberOrHash) Number() (BlockNumber, bool) { return BlockNumber(0), false } +func (bnh *BlockNumberOrHash) String() string { + if bnh.BlockNumber != nil { + return strconv.Itoa(int(*bnh.BlockNumber)) + } + if bnh.BlockHash != nil { + return bnh.BlockHash.String() + } + return "nil" +} + func (bnh *BlockNumberOrHash) Hash() (common.Hash, bool) { if bnh.BlockHash != nil { return *bnh.BlockHash, true diff --git a/rpc/websocket_test.go b/rpc/websocket_test.go index 2486092836..cf83b621f1 100644 --- a/rpc/websocket_test.go +++ b/rpc/websocket_test.go @@ -18,13 +18,13 @@ package rpc import ( "context" + "errors" "io" "net" "net/http" "net/http/httptest" "net/http/httputil" "net/url" - "reflect" "strings" "sync/atomic" "testing" @@ -69,7 +69,7 @@ func TestWebsocketOriginCheck(t *testing.T) { t.Fatal("no error for wrong origin") } wantErr := wsHandshakeError{websocket.ErrBadHandshake, "403 Forbidden"} - if !reflect.DeepEqual(err, wantErr) { + if !errors.Is(err, wantErr) { t.Fatalf("wrong error for wrong origin: %q", err) } diff --git a/signer/core/api.go b/signer/core/api.go index fb68018a6b..48b54b8f43 100644 --- a/signer/core/api.go +++ b/signer/core/api.go @@ -57,7 +57,7 @@ type ExternalAPI interface { // SignData - request to sign the given data (plus prefix) SignData(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (hexutil.Bytes, error) // SignTypedData - request to sign the given structured data (plus prefix) - SignTypedData(ctx context.Context, addr common.MixedcaseAddress, data TypedData) (hexutil.Bytes, error) + SignTypedData(ctx context.Context, addr common.MixedcaseAddress, data apitypes.TypedData) (hexutil.Bytes, error) // EcRecover - recover public key from given message and signature EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error) // Version info about the APIs @@ -235,7 +235,7 @@ type ( ContentType string `json:"content_type"` Address common.MixedcaseAddress `json:"address"` Rawdata []byte `json:"raw_data"` - Messages []*NameValueType `json:"messages"` + Messages []*apitypes.NameValueType `json:"messages"` Callinfo []apitypes.ValidationInfo `json:"call_info"` Hash hexutil.Bytes `json:"hash"` Meta Metadata `json:"meta"` diff --git a/signer/core/signed_data_internal_test.go b/signer/core/apitypes/signed_data_internal_test.go similarity index 99% rename from signer/core/signed_data_internal_test.go rename to signer/core/apitypes/signed_data_internal_test.go index 9768ee0b3f..121cc00dec 100644 --- a/signer/core/signed_data_internal_test.go +++ b/signer/core/apitypes/signed_data_internal_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package core +package apitypes import ( "bytes" diff --git a/signer/core/apitypes/types.go b/signer/core/apitypes/types.go index 625959219f..15ab153416 100644 --- a/signer/core/apitypes/types.go +++ b/signer/core/apitypes/types.go @@ -17,16 +17,29 @@ package apitypes import ( + "bytes" "encoding/json" + "errors" "fmt" "math/big" + "reflect" + "regexp" + "sort" + "strconv" "strings" + "unicode" + "unicode/utf8" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" ) +var typedDataReferenceTypeRegexp = regexp.MustCompile(`^[A-Z](\w*)(\[\])?$`) + type ValidationInfo struct { Typ string `json:"type"` Message string `json:"message"` @@ -154,3 +167,708 @@ func (args *SendTxArgs) ToTransaction() *types.Transaction { } return types.NewTx(data) } + +type SigFormat struct { + Mime string + ByteVersion byte +} + +var ( + IntendedValidator = SigFormat{ + accounts.MimetypeDataWithValidator, + 0x00, + } + DataTyped = SigFormat{ + accounts.MimetypeTypedData, + 0x01, + } + ApplicationClique = SigFormat{ + accounts.MimetypeClique, + 0x02, + } + TextPlain = SigFormat{ + accounts.MimetypeTextPlain, + 0x45, + } +) + +type ValidatorData struct { + Address common.Address + Message hexutil.Bytes +} + +// TypedData is a type to encapsulate EIP-712 typed messages +type TypedData struct { + Types Types `json:"types"` + PrimaryType string `json:"primaryType"` + Domain TypedDataDomain `json:"domain"` + Message TypedDataMessage `json:"message"` +} + +// Type is the inner type of an EIP-712 message +type Type struct { + Name string `json:"name"` + Type string `json:"type"` +} + +func (t *Type) isArray() bool { + return strings.HasSuffix(t.Type, "[]") +} + +// typeName returns the canonical name of the type. If the type is 'Person[]', then +// this method returns 'Person' +func (t *Type) typeName() string { + if strings.HasSuffix(t.Type, "[]") { + return strings.TrimSuffix(t.Type, "[]") + } + return t.Type +} + +func (t *Type) isReferenceType() bool { + if len(t.Type) == 0 { + return false + } + // Reference types must have a leading uppercase character + r, _ := utf8.DecodeRuneInString(t.Type) + return unicode.IsUpper(r) +} + +type Types map[string][]Type + +type TypePriority struct { + Type string + Value uint +} + +type TypedDataMessage = map[string]interface{} + +// TypedDataDomain represents the domain part of an EIP-712 message. +type TypedDataDomain struct { + Name string `json:"name"` + Version string `json:"version"` + ChainId *math.HexOrDecimal256 `json:"chainId"` + VerifyingContract string `json:"verifyingContract"` + Salt string `json:"salt"` +} + +// HashStruct generates a keccak256 hash of the encoding of the provided data +func (typedData *TypedData) HashStruct(primaryType string, data TypedDataMessage) (hexutil.Bytes, error) { + encodedData, err := typedData.EncodeData(primaryType, data, 1) + if err != nil { + return nil, err + } + return crypto.Keccak256(encodedData), nil +} + +// Dependencies returns an array of custom types ordered by their hierarchical reference tree +func (typedData *TypedData) Dependencies(primaryType string, found []string) []string { + includes := func(arr []string, str string) bool { + for _, obj := range arr { + if obj == str { + return true + } + } + return false + } + + if includes(found, primaryType) { + return found + } + if typedData.Types[primaryType] == nil { + return found + } + found = append(found, primaryType) + for _, field := range typedData.Types[primaryType] { + for _, dep := range typedData.Dependencies(field.Type, found) { + if !includes(found, dep) { + found = append(found, dep) + } + } + } + return found +} + +// EncodeType generates the following encoding: +// `name ‖ "(" ‖ member₁ ‖ "," ‖ member₂ ‖ "," ‖ … ‖ memberₙ ")"` +// +// each member is written as `type ‖ " " ‖ name` encodings cascade down and are sorted by name +func (typedData *TypedData) EncodeType(primaryType string) hexutil.Bytes { + // Get dependencies primary first, then alphabetical + deps := typedData.Dependencies(primaryType, []string{}) + if len(deps) > 0 { + slicedDeps := deps[1:] + sort.Strings(slicedDeps) + deps = append([]string{primaryType}, slicedDeps...) + } + + // Format as a string with fields + var buffer bytes.Buffer + for _, dep := range deps { + buffer.WriteString(dep) + buffer.WriteString("(") + for _, obj := range typedData.Types[dep] { + buffer.WriteString(obj.Type) + buffer.WriteString(" ") + buffer.WriteString(obj.Name) + buffer.WriteString(",") + } + buffer.Truncate(buffer.Len() - 1) + buffer.WriteString(")") + } + return buffer.Bytes() +} + +// TypeHash creates the keccak256 hash of the data +func (typedData *TypedData) TypeHash(primaryType string) hexutil.Bytes { + return crypto.Keccak256(typedData.EncodeType(primaryType)) +} + +// EncodeData generates the following encoding: +// `enc(value₁) ‖ enc(value₂) ‖ … ‖ enc(valueₙ)` +// +// each encoded member is 32-byte long +func (typedData *TypedData) EncodeData(primaryType string, data map[string]interface{}, depth int) (hexutil.Bytes, error) { + if err := typedData.validate(); err != nil { + return nil, err + } + + buffer := bytes.Buffer{} + + // Verify extra data + if exp, got := len(typedData.Types[primaryType]), len(data); exp < got { + return nil, fmt.Errorf("there is extra data provided in the message (%d < %d)", exp, got) + } + + // Add typehash + buffer.Write(typedData.TypeHash(primaryType)) + + // Add field contents. Structs and arrays have special handlers. + for _, field := range typedData.Types[primaryType] { + encType := field.Type + encValue := data[field.Name] + if encType[len(encType)-1:] == "]" { + arrayValue, ok := encValue.([]interface{}) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + + arrayBuffer := bytes.Buffer{} + parsedType := strings.Split(encType, "[")[0] + for _, item := range arrayValue { + if typedData.Types[parsedType] != nil { + mapValue, ok := item.(map[string]interface{}) + if !ok { + return nil, dataMismatchError(parsedType, item) + } + encodedData, err := typedData.EncodeData(parsedType, mapValue, depth+1) + if err != nil { + return nil, err + } + arrayBuffer.Write(encodedData) + } else { + bytesValue, err := typedData.EncodePrimitiveValue(parsedType, item, depth) + if err != nil { + return nil, err + } + arrayBuffer.Write(bytesValue) + } + } + + buffer.Write(crypto.Keccak256(arrayBuffer.Bytes())) + } else if typedData.Types[field.Type] != nil { + mapValue, ok := encValue.(map[string]interface{}) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + encodedData, err := typedData.EncodeData(field.Type, mapValue, depth+1) + if err != nil { + return nil, err + } + buffer.Write(crypto.Keccak256(encodedData)) + } else { + byteValue, err := typedData.EncodePrimitiveValue(encType, encValue, depth) + if err != nil { + return nil, err + } + buffer.Write(byteValue) + } + } + return buffer.Bytes(), nil +} + +// Attempt to parse bytes in different formats: byte array, hex string, hexutil.Bytes. +func parseBytes(encType interface{}) ([]byte, bool) { + switch v := encType.(type) { + case []byte: + return v, true + case hexutil.Bytes: + return v, true + case string: + bytes, err := hexutil.Decode(v) + if err != nil { + return nil, false + } + return bytes, true + default: + return nil, false + } +} + +func parseInteger(encType string, encValue interface{}) (*big.Int, error) { + var ( + length int + signed = strings.HasPrefix(encType, "int") + b *big.Int + ) + if encType == "int" || encType == "uint" { + length = 256 + } else { + lengthStr := "" + if strings.HasPrefix(encType, "uint") { + lengthStr = strings.TrimPrefix(encType, "uint") + } else { + lengthStr = strings.TrimPrefix(encType, "int") + } + atoiSize, err := strconv.Atoi(lengthStr) + if err != nil { + return nil, fmt.Errorf("invalid size on integer: %v", lengthStr) + } + length = atoiSize + } + switch v := encValue.(type) { + case *math.HexOrDecimal256: + b = (*big.Int)(v) + case string: + var hexIntValue math.HexOrDecimal256 + if err := hexIntValue.UnmarshalText([]byte(v)); err != nil { + return nil, err + } + b = (*big.Int)(&hexIntValue) + case float64: + // JSON parses non-strings as float64. Fail if we cannot + // convert it losslessly + if float64(int64(v)) == v { + b = big.NewInt(int64(v)) + } else { + return nil, fmt.Errorf("invalid float value %v for type %v", v, encType) + } + } + if b == nil { + return nil, fmt.Errorf("invalid integer value %v/%v for type %v", encValue, reflect.TypeOf(encValue), encType) + } + if b.BitLen() > length { + return nil, fmt.Errorf("integer larger than '%v'", encType) + } + if !signed && b.Sign() == -1 { + return nil, fmt.Errorf("invalid negative value for unsigned type %v", encType) + } + return b, nil +} + +// EncodePrimitiveValue deals with the primitive values found +// while searching through the typed data +func (typedData *TypedData) EncodePrimitiveValue(encType string, encValue interface{}, depth int) ([]byte, error) { + switch encType { + case "address": + stringValue, ok := encValue.(string) + if !ok || !common.IsHexAddress(stringValue) { + return nil, dataMismatchError(encType, encValue) + } + retval := make([]byte, 32) + copy(retval[12:], common.HexToAddress(stringValue).Bytes()) + return retval, nil + case "bool": + boolValue, ok := encValue.(bool) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + if boolValue { + return math.PaddedBigBytes(common.Big1, 32), nil + } + return math.PaddedBigBytes(common.Big0, 32), nil + case "string": + strVal, ok := encValue.(string) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + return crypto.Keccak256([]byte(strVal)), nil + case "bytes": + bytesValue, ok := parseBytes(encValue) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + return crypto.Keccak256(bytesValue), nil + } + if strings.HasPrefix(encType, "bytes") { + lengthStr := strings.TrimPrefix(encType, "bytes") + length, err := strconv.Atoi(lengthStr) + if err != nil { + return nil, fmt.Errorf("invalid size on bytes: %v", lengthStr) + } + if length < 0 || length > 32 { + return nil, fmt.Errorf("invalid size on bytes: %d", length) + } + if byteValue, ok := parseBytes(encValue); !ok || len(byteValue) != length { + return nil, dataMismatchError(encType, encValue) + } else { + // Right-pad the bits + dst := make([]byte, 32) + copy(dst, byteValue) + return dst, nil + } + } + if strings.HasPrefix(encType, "int") || strings.HasPrefix(encType, "uint") { + b, err := parseInteger(encType, encValue) + if err != nil { + return nil, err + } + return math.U256Bytes(b), nil + } + return nil, fmt.Errorf("unrecognized type '%s'", encType) + +} + +// dataMismatchError generates an error for a mismatch between +// the provided type and data +func dataMismatchError(encType string, encValue interface{}) error { + return fmt.Errorf("provided data '%v' doesn't match type '%s'", encValue, encType) +} + +// validate makes sure the types are sound +func (typedData *TypedData) validate() error { + if err := typedData.Types.validate(); err != nil { + return err + } + if err := typedData.Domain.validate(); err != nil { + return err + } + return nil +} + +// Map generates a map version of the typed data +func (typedData *TypedData) Map() map[string]interface{} { + dataMap := map[string]interface{}{ + "types": typedData.Types, + "domain": typedData.Domain.Map(), + "primaryType": typedData.PrimaryType, + "message": typedData.Message, + } + return dataMap +} + +// Format returns a representation of typedData, which can be easily displayed by a user-interface +// without in-depth knowledge about 712 rules +func (typedData *TypedData) Format() ([]*NameValueType, error) { + domain, err := typedData.formatData("EIP712Domain", typedData.Domain.Map()) + if err != nil { + return nil, err + } + ptype, err := typedData.formatData(typedData.PrimaryType, typedData.Message) + if err != nil { + return nil, err + } + var nvts []*NameValueType + nvts = append(nvts, &NameValueType{ + Name: "EIP712Domain", + Value: domain, + Typ: "domain", + }) + nvts = append(nvts, &NameValueType{ + Name: typedData.PrimaryType, + Value: ptype, + Typ: "primary type", + }) + return nvts, nil +} + +func (typedData *TypedData) formatData(primaryType string, data map[string]interface{}) ([]*NameValueType, error) { + var output []*NameValueType + + // Add field contents. Structs and arrays have special handlers. + for _, field := range typedData.Types[primaryType] { + encName := field.Name + encValue := data[encName] + item := &NameValueType{ + Name: encName, + Typ: field.Type, + } + if field.isArray() { + arrayValue, _ := encValue.([]interface{}) + parsedType := field.typeName() + for _, v := range arrayValue { + if typedData.Types[parsedType] != nil { + mapValue, _ := v.(map[string]interface{}) + mapOutput, err := typedData.formatData(parsedType, mapValue) + if err != nil { + return nil, err + } + item.Value = mapOutput + } else { + primitiveOutput, err := formatPrimitiveValue(field.Type, encValue) + if err != nil { + return nil, err + } + item.Value = primitiveOutput + } + } + } else if typedData.Types[field.Type] != nil { + if mapValue, ok := encValue.(map[string]interface{}); ok { + mapOutput, err := typedData.formatData(field.Type, mapValue) + if err != nil { + return nil, err + } + item.Value = mapOutput + } else { + item.Value = "" + } + } else { + primitiveOutput, err := formatPrimitiveValue(field.Type, encValue) + if err != nil { + return nil, err + } + item.Value = primitiveOutput + } + output = append(output, item) + } + return output, nil +} + +func formatPrimitiveValue(encType string, encValue interface{}) (string, error) { + switch encType { + case "address": + if stringValue, ok := encValue.(string); !ok { + return "", fmt.Errorf("could not format value %v as address", encValue) + } else { + return common.HexToAddress(stringValue).String(), nil + } + case "bool": + if boolValue, ok := encValue.(bool); !ok { + return "", fmt.Errorf("could not format value %v as bool", encValue) + } else { + return fmt.Sprintf("%t", boolValue), nil + } + case "bytes", "string": + return fmt.Sprintf("%s", encValue), nil + } + if strings.HasPrefix(encType, "bytes") { + return fmt.Sprintf("%s", encValue), nil + + } + if strings.HasPrefix(encType, "uint") || strings.HasPrefix(encType, "int") { + if b, err := parseInteger(encType, encValue); err != nil { + return "", err + } else { + return fmt.Sprintf("%d (0x%x)", b, b), nil + } + } + return "", fmt.Errorf("unhandled type %v", encType) +} + +// Validate checks if the types object is conformant to the specs +func (t Types) validate() error { + for typeKey, typeArr := range t { + if len(typeKey) == 0 { + return fmt.Errorf("empty type key") + } + for i, typeObj := range typeArr { + if len(typeObj.Type) == 0 { + return fmt.Errorf("type %q:%d: empty Type", typeKey, i) + } + if len(typeObj.Name) == 0 { + return fmt.Errorf("type %q:%d: empty Name", typeKey, i) + } + if typeKey == typeObj.Type { + return fmt.Errorf("type %q cannot reference itself", typeObj.Type) + } + if typeObj.isReferenceType() { + if _, exist := t[typeObj.typeName()]; !exist { + return fmt.Errorf("reference type %q is undefined", typeObj.Type) + } + if !typedDataReferenceTypeRegexp.MatchString(typeObj.Type) { + return fmt.Errorf("unknown reference type %q", typeObj.Type) + } + } else if !isPrimitiveTypeValid(typeObj.Type) { + return fmt.Errorf("unknown type %q", typeObj.Type) + } + } + } + return nil +} + +// Checks if the primitive value is valid +func isPrimitiveTypeValid(primitiveType string) bool { + if primitiveType == "address" || + primitiveType == "address[]" || + primitiveType == "bool" || + primitiveType == "bool[]" || + primitiveType == "string" || + primitiveType == "string[]" { + return true + } + if primitiveType == "bytes" || + primitiveType == "bytes[]" || + primitiveType == "bytes1" || + primitiveType == "bytes1[]" || + primitiveType == "bytes2" || + primitiveType == "bytes2[]" || + primitiveType == "bytes3" || + primitiveType == "bytes3[]" || + primitiveType == "bytes4" || + primitiveType == "bytes4[]" || + primitiveType == "bytes5" || + primitiveType == "bytes5[]" || + primitiveType == "bytes6" || + primitiveType == "bytes6[]" || + primitiveType == "bytes7" || + primitiveType == "bytes7[]" || + primitiveType == "bytes8" || + primitiveType == "bytes8[]" || + primitiveType == "bytes9" || + primitiveType == "bytes9[]" || + primitiveType == "bytes10" || + primitiveType == "bytes10[]" || + primitiveType == "bytes11" || + primitiveType == "bytes11[]" || + primitiveType == "bytes12" || + primitiveType == "bytes12[]" || + primitiveType == "bytes13" || + primitiveType == "bytes13[]" || + primitiveType == "bytes14" || + primitiveType == "bytes14[]" || + primitiveType == "bytes15" || + primitiveType == "bytes15[]" || + primitiveType == "bytes16" || + primitiveType == "bytes16[]" || + primitiveType == "bytes17" || + primitiveType == "bytes17[]" || + primitiveType == "bytes18" || + primitiveType == "bytes18[]" || + primitiveType == "bytes19" || + primitiveType == "bytes19[]" || + primitiveType == "bytes20" || + primitiveType == "bytes20[]" || + primitiveType == "bytes21" || + primitiveType == "bytes21[]" || + primitiveType == "bytes22" || + primitiveType == "bytes22[]" || + primitiveType == "bytes23" || + primitiveType == "bytes23[]" || + primitiveType == "bytes24" || + primitiveType == "bytes24[]" || + primitiveType == "bytes25" || + primitiveType == "bytes25[]" || + primitiveType == "bytes26" || + primitiveType == "bytes26[]" || + primitiveType == "bytes27" || + primitiveType == "bytes27[]" || + primitiveType == "bytes28" || + primitiveType == "bytes28[]" || + primitiveType == "bytes29" || + primitiveType == "bytes29[]" || + primitiveType == "bytes30" || + primitiveType == "bytes30[]" || + primitiveType == "bytes31" || + primitiveType == "bytes31[]" || + primitiveType == "bytes32" || + primitiveType == "bytes32[]" { + return true + } + if primitiveType == "int" || + primitiveType == "int[]" || + primitiveType == "int8" || + primitiveType == "int8[]" || + primitiveType == "int16" || + primitiveType == "int16[]" || + primitiveType == "int32" || + primitiveType == "int32[]" || + primitiveType == "int64" || + primitiveType == "int64[]" || + primitiveType == "int128" || + primitiveType == "int128[]" || + primitiveType == "int256" || + primitiveType == "int256[]" { + return true + } + if primitiveType == "uint" || + primitiveType == "uint[]" || + primitiveType == "uint8" || + primitiveType == "uint8[]" || + primitiveType == "uint16" || + primitiveType == "uint16[]" || + primitiveType == "uint32" || + primitiveType == "uint32[]" || + primitiveType == "uint64" || + primitiveType == "uint64[]" || + primitiveType == "uint128" || + primitiveType == "uint128[]" || + primitiveType == "uint256" || + primitiveType == "uint256[]" { + return true + } + return false +} + +// validate checks if the given domain is valid, i.e. contains at least +// the minimum viable keys and values +func (domain *TypedDataDomain) validate() error { + if domain.ChainId == nil && len(domain.Name) == 0 && len(domain.Version) == 0 && len(domain.VerifyingContract) == 0 && len(domain.Salt) == 0 { + return errors.New("domain is undefined") + } + + return nil +} + +// Map is a helper function to generate a map version of the domain +func (domain *TypedDataDomain) Map() map[string]interface{} { + dataMap := map[string]interface{}{} + + if domain.ChainId != nil { + dataMap["chainId"] = domain.ChainId + } + + if len(domain.Name) > 0 { + dataMap["name"] = domain.Name + } + + if len(domain.Version) > 0 { + dataMap["version"] = domain.Version + } + + if len(domain.VerifyingContract) > 0 { + dataMap["verifyingContract"] = domain.VerifyingContract + } + + if len(domain.Salt) > 0 { + dataMap["salt"] = domain.Salt + } + return dataMap +} + +// NameValueType is a very simple struct with Name, Value and Type. It's meant for simple +// json structures used to communicate signing-info about typed data with the UI +type NameValueType struct { + Name string `json:"name"` + Value interface{} `json:"value"` + Typ string `json:"type"` +} + +// Pprint returns a pretty-printed version of nvt +func (nvt *NameValueType) Pprint(depth int) string { + output := bytes.Buffer{} + output.WriteString(strings.Repeat("\u00a0", depth*2)) + output.WriteString(fmt.Sprintf("%s [%s]: ", nvt.Name, nvt.Typ)) + if nvts, ok := nvt.Value.([]*NameValueType); ok { + output.WriteString("\n") + for _, next := range nvts { + sublevel := next.Pprint(depth + 1) + output.WriteString(sublevel) + } + } else { + if nvt.Value != nil { + output.WriteString(fmt.Sprintf("%q\n", nvt.Value)) + } else { + output.WriteString("\n") + } + } + return output.String() +} diff --git a/signer/core/auditlog.go b/signer/core/auditlog.go index 84877ee712..663d6d1317 100644 --- a/signer/core/auditlog.go +++ b/signer/core/auditlog.go @@ -89,7 +89,7 @@ func (l *AuditLogger) SignGnosisSafeTx(ctx context.Context, addr common.Mixedcas return res, e } -func (l *AuditLogger) SignTypedData(ctx context.Context, addr common.MixedcaseAddress, data TypedData) (hexutil.Bytes, error) { +func (l *AuditLogger) SignTypedData(ctx context.Context, addr common.MixedcaseAddress, data apitypes.TypedData) (hexutil.Bytes, error) { l.log.Info("SignTypedData", "type", "request", "metadata", MetadataFromContext(ctx).String(), "addr", addr.String(), "data", data) b, e := l.api.SignTypedData(ctx, addr, data) diff --git a/signer/core/gnosis_safe.go b/signer/core/gnosis_safe.go index bdf7f837a0..016b1fff3e 100644 --- a/signer/core/gnosis_safe.go +++ b/signer/core/gnosis_safe.go @@ -34,15 +34,15 @@ type GnosisSafeTx struct { } // ToTypedData converts the tx to a EIP-712 Typed Data structure for signing -func (tx *GnosisSafeTx) ToTypedData() TypedData { +func (tx *GnosisSafeTx) ToTypedData() apitypes.TypedData { var data hexutil.Bytes if tx.Data != nil { data = *tx.Data } - gnosisTypedData := TypedData{ - Types: Types{ - "EIP712Domain": []Type{{Name: "verifyingContract", Type: "address"}}, - "SafeTx": []Type{ + gnosisTypedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{{Name: "verifyingContract", Type: "address"}}, + "SafeTx": []apitypes.Type{ {Name: "to", Type: "address"}, {Name: "value", Type: "uint256"}, {Name: "data", Type: "bytes"}, @@ -55,11 +55,11 @@ func (tx *GnosisSafeTx) ToTypedData() TypedData { {Name: "nonce", Type: "uint256"}, }, }, - Domain: TypedDataDomain{ + Domain: apitypes.TypedDataDomain{ VerifyingContract: tx.Safe.Address().Hex(), }, PrimaryType: "SafeTx", - Message: TypedDataMessage{ + Message: apitypes.TypedDataMessage{ "to": tx.To.Address().Hex(), "value": tx.Value.String(), "data": data, diff --git a/signer/core/signed_data.go b/signer/core/signed_data.go index 26fd2ec8dc..03494c098d 100644 --- a/signer/core/signed_data.go +++ b/signer/core/signed_data.go @@ -17,24 +17,14 @@ package core import ( - "bytes" "context" "errors" "fmt" - "math/big" "mime" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "unicode" - "unicode/utf8" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -42,92 +32,6 @@ import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" ) -type SigFormat struct { - Mime string - ByteVersion byte -} - -var ( - IntendedValidator = SigFormat{ - accounts.MimetypeDataWithValidator, - 0x00, - } - DataTyped = SigFormat{ - accounts.MimetypeTypedData, - 0x01, - } - ApplicationClique = SigFormat{ - accounts.MimetypeClique, - 0x02, - } - ApplicationBor = SigFormat{ - accounts.MimetypeBor, - 0x10, - } - TextPlain = SigFormat{ - accounts.MimetypeTextPlain, - 0x45, - } -) - -type ValidatorData struct { - Address common.Address - Message hexutil.Bytes -} - -type TypedData struct { - Types Types `json:"types"` - PrimaryType string `json:"primaryType"` - Domain TypedDataDomain `json:"domain"` - Message TypedDataMessage `json:"message"` -} - -type Type struct { - Name string `json:"name"` - Type string `json:"type"` -} - -func (t *Type) isArray() bool { - return strings.HasSuffix(t.Type, "[]") -} - -// typeName returns the canonical name of the type. If the type is 'Person[]', then -// this method returns 'Person' -func (t *Type) typeName() string { - if strings.HasSuffix(t.Type, "[]") { - return strings.TrimSuffix(t.Type, "[]") - } - return t.Type -} - -func (t *Type) isReferenceType() bool { - if len(t.Type) == 0 { - return false - } - // Reference types must have a leading uppercase character - r, _ := utf8.DecodeRuneInString(t.Type) - return unicode.IsUpper(r) -} - -type Types map[string][]Type - -type TypePriority struct { - Type string - Value uint -} - -type TypedDataMessage = map[string]interface{} - -type TypedDataDomain struct { - Name string `json:"name"` - Version string `json:"version"` - ChainId *math.HexOrDecimal256 `json:"chainId"` - VerifyingContract string `json:"verifyingContract"` - Salt string `json:"salt"` -} - -var typedDataReferenceTypeRegexp = regexp.MustCompile(`^[A-Z](\w*)(\[\])?$`) - // sign receives a request and produces a signature // // Note, the produced signature conforms to the secp256k1 curve R, S and V values, @@ -199,14 +103,14 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType } switch mediaType { - case IntendedValidator.Mime: + case apitypes.IntendedValidator.Mime: // Data with an intended validator validatorData, err := UnmarshalValidatorData(data) if err != nil { return nil, useEthereumV, err } sighash, msg := SignTextValidator(validatorData) - messages := []*NameValueType{ + messages := []*apitypes.NameValueType{ { Name: "This is a request to sign data intended for a particular validator (see EIP 191 version 0)", Typ: "description", @@ -229,11 +133,11 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType }, } req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Messages: messages, Hash: sighash} - case ApplicationClique.Mime: + case apitypes.ApplicationClique.Mime: // Clique is the Ethereum PoA standard stringData, ok := data.(string) if !ok { - return nil, useEthereumV, fmt.Errorf("input for %v must be an hex-encoded string", ApplicationClique.Mime) + return nil, useEthereumV, fmt.Errorf("input for %v must be an hex-encoded string", apitypes.ApplicationClique.Mime) } cliqueData, err := hexutil.Decode(stringData) if err != nil { @@ -255,7 +159,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType if err != nil { return nil, useEthereumV, err } - messages := []*NameValueType{ + messages := []*apitypes.NameValueType{ { Name: "Clique header", Typ: "clique", @@ -276,7 +180,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType return nil, useEthereumV, err } else { sighash, msg := accounts.TextAndHash(textData) - messages := []*NameValueType{ + messages := []*apitypes.NameValueType{ { Name: "message", Typ: accounts.MimetypeTextPlain, @@ -295,7 +199,7 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType // SignTextWithValidator signs the given message which can be further recovered // with the given validator. // hash = keccak256("\x19\x00"${address}${data}). -func SignTextValidator(validatorData ValidatorData) (hexutil.Bytes, string) { +func SignTextValidator(validatorData apitypes.ValidatorData) (hexutil.Bytes, string) { msg := fmt.Sprintf("\x19\x00%s%s", string(validatorData.Address.Bytes()), string(validatorData.Message)) return crypto.Keccak256([]byte(msg)), msg } @@ -322,7 +226,7 @@ func cliqueHeaderHashAndRlp(header *types.Header) (hash, rlp []byte, err error) // It returns // - the signature, // - and/or any error -func (api *SignerAPI) SignTypedData(ctx context.Context, addr common.MixedcaseAddress, typedData TypedData) (hexutil.Bytes, error) { +func (api *SignerAPI) SignTypedData(ctx context.Context, addr common.MixedcaseAddress, typedData apitypes.TypedData) (hexutil.Bytes, error) { signature, _, err := api.signTypedData(ctx, addr, typedData, nil) return signature, err } @@ -330,7 +234,7 @@ func (api *SignerAPI) SignTypedData(ctx context.Context, addr common.MixedcaseAd // signTypedData is identical to the capitalized version, except that it also returns the hash (preimage) // - the signature preimage (hash) func (api *SignerAPI) signTypedData(ctx context.Context, addr common.MixedcaseAddress, - typedData TypedData, validationMessages *apitypes.ValidationMessages) (hexutil.Bytes, hexutil.Bytes, error) { + typedData apitypes.TypedData, validationMessages *apitypes.ValidationMessages) (hexutil.Bytes, hexutil.Bytes, error) { domainSeparator, err := typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) if err != nil { return nil, nil, err @@ -346,7 +250,7 @@ func (api *SignerAPI) signTypedData(ctx context.Context, addr common.MixedcaseAd return nil, nil, err } req := &SignDataRequest{ - ContentType: DataTyped.Mime, + ContentType: apitypes.DataTyped.Mime, Rawdata: rawData, Messages: messages, Hash: sighash, @@ -362,289 +266,6 @@ func (api *SignerAPI) signTypedData(ctx context.Context, addr common.MixedcaseAd return signature, sighash, nil } -// HashStruct generates a keccak256 hash of the encoding of the provided data -func (typedData *TypedData) HashStruct(primaryType string, data TypedDataMessage) (hexutil.Bytes, error) { - encodedData, err := typedData.EncodeData(primaryType, data, 1) - if err != nil { - return nil, err - } - return crypto.Keccak256(encodedData), nil -} - -// Dependencies returns an array of custom types ordered by their hierarchical reference tree -func (typedData *TypedData) Dependencies(primaryType string, found []string) []string { - includes := func(arr []string, str string) bool { - for _, obj := range arr { - if obj == str { - return true - } - } - return false - } - - if includes(found, primaryType) { - return found - } - if typedData.Types[primaryType] == nil { - return found - } - found = append(found, primaryType) - for _, field := range typedData.Types[primaryType] { - for _, dep := range typedData.Dependencies(field.Type, found) { - if !includes(found, dep) { - found = append(found, dep) - } - } - } - return found -} - -// EncodeType generates the following encoding: -// `name ‖ "(" ‖ member₁ ‖ "," ‖ member₂ ‖ "," ‖ … ‖ memberₙ ")"` -// -// each member is written as `type ‖ " " ‖ name` encodings cascade down and are sorted by name -func (typedData *TypedData) EncodeType(primaryType string) hexutil.Bytes { - // Get dependencies primary first, then alphabetical - deps := typedData.Dependencies(primaryType, []string{}) - if len(deps) > 0 { - slicedDeps := deps[1:] - sort.Strings(slicedDeps) - deps = append([]string{primaryType}, slicedDeps...) - } - - // Format as a string with fields - var buffer bytes.Buffer - for _, dep := range deps { - buffer.WriteString(dep) - buffer.WriteString("(") - for _, obj := range typedData.Types[dep] { - buffer.WriteString(obj.Type) - buffer.WriteString(" ") - buffer.WriteString(obj.Name) - buffer.WriteString(",") - } - buffer.Truncate(buffer.Len() - 1) - buffer.WriteString(")") - } - return buffer.Bytes() -} - -// TypeHash creates the keccak256 hash of the data -func (typedData *TypedData) TypeHash(primaryType string) hexutil.Bytes { - return crypto.Keccak256(typedData.EncodeType(primaryType)) -} - -// EncodeData generates the following encoding: -// `enc(value₁) ‖ enc(value₂) ‖ … ‖ enc(valueₙ)` -// -// each encoded member is 32-byte long -func (typedData *TypedData) EncodeData(primaryType string, data map[string]interface{}, depth int) (hexutil.Bytes, error) { - if err := typedData.validate(); err != nil { - return nil, err - } - - buffer := bytes.Buffer{} - - // Verify extra data - if exp, got := len(typedData.Types[primaryType]), len(data); exp < got { - return nil, fmt.Errorf("there is extra data provided in the message (%d < %d)", exp, got) - } - - // Add typehash - buffer.Write(typedData.TypeHash(primaryType)) - - // Add field contents. Structs and arrays have special handlers. - for _, field := range typedData.Types[primaryType] { - encType := field.Type - encValue := data[field.Name] - if encType[len(encType)-1:] == "]" { - arrayValue, ok := encValue.([]interface{}) - if !ok { - return nil, dataMismatchError(encType, encValue) - } - - arrayBuffer := bytes.Buffer{} - parsedType := strings.Split(encType, "[")[0] - for _, item := range arrayValue { - if typedData.Types[parsedType] != nil { - mapValue, ok := item.(map[string]interface{}) - if !ok { - return nil, dataMismatchError(parsedType, item) - } - encodedData, err := typedData.EncodeData(parsedType, mapValue, depth+1) - if err != nil { - return nil, err - } - arrayBuffer.Write(encodedData) - } else { - bytesValue, err := typedData.EncodePrimitiveValue(parsedType, item, depth) - if err != nil { - return nil, err - } - arrayBuffer.Write(bytesValue) - } - } - - buffer.Write(crypto.Keccak256(arrayBuffer.Bytes())) - } else if typedData.Types[field.Type] != nil { - mapValue, ok := encValue.(map[string]interface{}) - if !ok { - return nil, dataMismatchError(encType, encValue) - } - encodedData, err := typedData.EncodeData(field.Type, mapValue, depth+1) - if err != nil { - return nil, err - } - buffer.Write(crypto.Keccak256(encodedData)) - } else { - byteValue, err := typedData.EncodePrimitiveValue(encType, encValue, depth) - if err != nil { - return nil, err - } - buffer.Write(byteValue) - } - } - return buffer.Bytes(), nil -} - -// Attempt to parse bytes in different formats: byte array, hex string, hexutil.Bytes. -func parseBytes(encType interface{}) ([]byte, bool) { - switch v := encType.(type) { - case []byte: - return v, true - case hexutil.Bytes: - return v, true - case string: - bytes, err := hexutil.Decode(v) - if err != nil { - return nil, false - } - return bytes, true - default: - return nil, false - } -} - -func parseInteger(encType string, encValue interface{}) (*big.Int, error) { - var ( - length int - signed = strings.HasPrefix(encType, "int") - b *big.Int - ) - if encType == "int" || encType == "uint" { - length = 256 - } else { - lengthStr := "" - if strings.HasPrefix(encType, "uint") { - lengthStr = strings.TrimPrefix(encType, "uint") - } else { - lengthStr = strings.TrimPrefix(encType, "int") - } - atoiSize, err := strconv.Atoi(lengthStr) - if err != nil { - return nil, fmt.Errorf("invalid size on integer: %v", lengthStr) - } - length = atoiSize - } - switch v := encValue.(type) { - case *math.HexOrDecimal256: - b = (*big.Int)(v) - case string: - var hexIntValue math.HexOrDecimal256 - if err := hexIntValue.UnmarshalText([]byte(v)); err != nil { - return nil, err - } - b = (*big.Int)(&hexIntValue) - case float64: - // JSON parses non-strings as float64. Fail if we cannot - // convert it losslessly - if float64(int64(v)) == v { - b = big.NewInt(int64(v)) - } else { - return nil, fmt.Errorf("invalid float value %v for type %v", v, encType) - } - } - if b == nil { - return nil, fmt.Errorf("invalid integer value %v/%v for type %v", encValue, reflect.TypeOf(encValue), encType) - } - if b.BitLen() > length { - return nil, fmt.Errorf("integer larger than '%v'", encType) - } - if !signed && b.Sign() == -1 { - return nil, fmt.Errorf("invalid negative value for unsigned type %v", encType) - } - return b, nil -} - -// EncodePrimitiveValue deals with the primitive values found -// while searching through the typed data -func (typedData *TypedData) EncodePrimitiveValue(encType string, encValue interface{}, depth int) ([]byte, error) { - switch encType { - case "address": - stringValue, ok := encValue.(string) - if !ok || !common.IsHexAddress(stringValue) { - return nil, dataMismatchError(encType, encValue) - } - retval := make([]byte, 32) - copy(retval[12:], common.HexToAddress(stringValue).Bytes()) - return retval, nil - case "bool": - boolValue, ok := encValue.(bool) - if !ok { - return nil, dataMismatchError(encType, encValue) - } - if boolValue { - return math.PaddedBigBytes(common.Big1, 32), nil - } - return math.PaddedBigBytes(common.Big0, 32), nil - case "string": - strVal, ok := encValue.(string) - if !ok { - return nil, dataMismatchError(encType, encValue) - } - return crypto.Keccak256([]byte(strVal)), nil - case "bytes": - bytesValue, ok := parseBytes(encValue) - if !ok { - return nil, dataMismatchError(encType, encValue) - } - return crypto.Keccak256(bytesValue), nil - } - if strings.HasPrefix(encType, "bytes") { - lengthStr := strings.TrimPrefix(encType, "bytes") - length, err := strconv.Atoi(lengthStr) - if err != nil { - return nil, fmt.Errorf("invalid size on bytes: %v", lengthStr) - } - if length < 0 || length > 32 { - return nil, fmt.Errorf("invalid size on bytes: %d", length) - } - if byteValue, ok := parseBytes(encValue); !ok || len(byteValue) != length { - return nil, dataMismatchError(encType, encValue) - } else { - // Right-pad the bits - dst := make([]byte, 32) - copy(dst, byteValue) - return dst, nil - } - } - if strings.HasPrefix(encType, "int") || strings.HasPrefix(encType, "uint") { - b, err := parseInteger(encType, encValue) - if err != nil { - return nil, err - } - return math.U256Bytes(b), nil - } - return nil, fmt.Errorf("unrecognized type '%s'", encType) - -} - -// dataMismatchError generates an error for a mismatch between -// the provided type and data -func dataMismatchError(encType string, encValue interface{}) error { - return fmt.Errorf("provided data '%v' doesn't match type '%s'", encValue, encType) -} - // EcRecover recovers the address associated with the given sig. // Only compatible with `text/plain` func (api *SignerAPI) EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error) { @@ -675,376 +296,37 @@ func (api *SignerAPI) EcRecover(ctx context.Context, data hexutil.Bytes, sig hex } // UnmarshalValidatorData converts the bytes input to typed data -func UnmarshalValidatorData(data interface{}) (ValidatorData, error) { +func UnmarshalValidatorData(data interface{}) (apitypes.ValidatorData, error) { raw, ok := data.(map[string]interface{}) if !ok { - return ValidatorData{}, errors.New("validator input is not a map[string]interface{}") + return apitypes.ValidatorData{}, errors.New("validator input is not a map[string]interface{}") } addr, ok := raw["address"].(string) if !ok { - return ValidatorData{}, errors.New("validator address is not sent as a string") + return apitypes.ValidatorData{}, errors.New("validator address is not sent as a string") } addrBytes, err := hexutil.Decode(addr) if err != nil { - return ValidatorData{}, err + return apitypes.ValidatorData{}, err } if !ok || len(addrBytes) == 0 { - return ValidatorData{}, errors.New("validator address is undefined") + return apitypes.ValidatorData{}, errors.New("validator address is undefined") } message, ok := raw["message"].(string) if !ok { - return ValidatorData{}, errors.New("message is not sent as a string") + return apitypes.ValidatorData{}, errors.New("message is not sent as a string") } messageBytes, err := hexutil.Decode(message) if err != nil { - return ValidatorData{}, err + return apitypes.ValidatorData{}, err } if !ok || len(messageBytes) == 0 { - return ValidatorData{}, errors.New("message is undefined") + return apitypes.ValidatorData{}, errors.New("message is undefined") } - return ValidatorData{ + return apitypes.ValidatorData{ Address: common.BytesToAddress(addrBytes), Message: messageBytes, }, nil } - -// validate makes sure the types are sound -func (typedData *TypedData) validate() error { - if err := typedData.Types.validate(); err != nil { - return err - } - if err := typedData.Domain.validate(); err != nil { - return err - } - return nil -} - -// Map generates a map version of the typed data -func (typedData *TypedData) Map() map[string]interface{} { - dataMap := map[string]interface{}{ - "types": typedData.Types, - "domain": typedData.Domain.Map(), - "primaryType": typedData.PrimaryType, - "message": typedData.Message, - } - return dataMap -} - -// Format returns a representation of typedData, which can be easily displayed by a user-interface -// without in-depth knowledge about 712 rules -func (typedData *TypedData) Format() ([]*NameValueType, error) { - domain, err := typedData.formatData("EIP712Domain", typedData.Domain.Map()) - if err != nil { - return nil, err - } - ptype, err := typedData.formatData(typedData.PrimaryType, typedData.Message) - if err != nil { - return nil, err - } - var nvts []*NameValueType - nvts = append(nvts, &NameValueType{ - Name: "EIP712Domain", - Value: domain, - Typ: "domain", - }) - nvts = append(nvts, &NameValueType{ - Name: typedData.PrimaryType, - Value: ptype, - Typ: "primary type", - }) - return nvts, nil -} - -func (typedData *TypedData) formatData(primaryType string, data map[string]interface{}) ([]*NameValueType, error) { - var output []*NameValueType - - // Add field contents. Structs and arrays have special handlers. - for _, field := range typedData.Types[primaryType] { - encName := field.Name - encValue := data[encName] - item := &NameValueType{ - Name: encName, - Typ: field.Type, - } - if field.isArray() { - arrayValue, _ := encValue.([]interface{}) - parsedType := field.typeName() - for _, v := range arrayValue { - if typedData.Types[parsedType] != nil { - mapValue, _ := v.(map[string]interface{}) - mapOutput, err := typedData.formatData(parsedType, mapValue) - if err != nil { - return nil, err - } - item.Value = mapOutput - } else { - primitiveOutput, err := formatPrimitiveValue(field.Type, encValue) - if err != nil { - return nil, err - } - item.Value = primitiveOutput - } - } - } else if typedData.Types[field.Type] != nil { - if mapValue, ok := encValue.(map[string]interface{}); ok { - mapOutput, err := typedData.formatData(field.Type, mapValue) - if err != nil { - return nil, err - } - item.Value = mapOutput - } else { - item.Value = "" - } - } else { - primitiveOutput, err := formatPrimitiveValue(field.Type, encValue) - if err != nil { - return nil, err - } - item.Value = primitiveOutput - } - output = append(output, item) - } - return output, nil -} - -func formatPrimitiveValue(encType string, encValue interface{}) (string, error) { - switch encType { - case "address": - if stringValue, ok := encValue.(string); !ok { - return "", fmt.Errorf("could not format value %v as address", encValue) - } else { - return common.HexToAddress(stringValue).String(), nil - } - case "bool": - if boolValue, ok := encValue.(bool); !ok { - return "", fmt.Errorf("could not format value %v as bool", encValue) - } else { - return fmt.Sprintf("%t", boolValue), nil - } - case "bytes", "string": - return fmt.Sprintf("%s", encValue), nil - } - if strings.HasPrefix(encType, "bytes") { - return fmt.Sprintf("%s", encValue), nil - - } - if strings.HasPrefix(encType, "uint") || strings.HasPrefix(encType, "int") { - if b, err := parseInteger(encType, encValue); err != nil { - return "", err - } else { - return fmt.Sprintf("%d (0x%x)", b, b), nil - } - } - return "", fmt.Errorf("unhandled type %v", encType) -} - -// NameValueType is a very simple struct with Name, Value and Type. It's meant for simple -// json structures used to communicate signing-info about typed data with the UI -type NameValueType struct { - Name string `json:"name"` - Value interface{} `json:"value"` - Typ string `json:"type"` -} - -// Pprint returns a pretty-printed version of nvt -func (nvt *NameValueType) Pprint(depth int) string { - output := bytes.Buffer{} - output.WriteString(strings.Repeat("\u00a0", depth*2)) - output.WriteString(fmt.Sprintf("%s [%s]: ", nvt.Name, nvt.Typ)) - if nvts, ok := nvt.Value.([]*NameValueType); ok { - output.WriteString("\n") - for _, next := range nvts { - sublevel := next.Pprint(depth + 1) - output.WriteString(sublevel) - } - } else { - if nvt.Value != nil { - output.WriteString(fmt.Sprintf("%q\n", nvt.Value)) - } else { - output.WriteString("\n") - } - } - return output.String() -} - -// Validate checks if the types object is conformant to the specs -func (t Types) validate() error { - for typeKey, typeArr := range t { - if len(typeKey) == 0 { - return fmt.Errorf("empty type key") - } - for i, typeObj := range typeArr { - if len(typeObj.Type) == 0 { - return fmt.Errorf("type %q:%d: empty Type", typeKey, i) - } - if len(typeObj.Name) == 0 { - return fmt.Errorf("type %q:%d: empty Name", typeKey, i) - } - if typeKey == typeObj.Type { - return fmt.Errorf("type %q cannot reference itself", typeObj.Type) - } - if typeObj.isReferenceType() { - if _, exist := t[typeObj.typeName()]; !exist { - return fmt.Errorf("reference type %q is undefined", typeObj.Type) - } - if !typedDataReferenceTypeRegexp.MatchString(typeObj.Type) { - return fmt.Errorf("unknown reference type %q", typeObj.Type) - } - } else if !isPrimitiveTypeValid(typeObj.Type) { - return fmt.Errorf("unknown type %q", typeObj.Type) - } - } - } - return nil -} - -// Checks if the primitive value is valid -func isPrimitiveTypeValid(primitiveType string) bool { - if primitiveType == "address" || - primitiveType == "address[]" || - primitiveType == "bool" || - primitiveType == "bool[]" || - primitiveType == "string" || - primitiveType == "string[]" { - return true - } - if primitiveType == "bytes" || - primitiveType == "bytes[]" || - primitiveType == "bytes1" || - primitiveType == "bytes1[]" || - primitiveType == "bytes2" || - primitiveType == "bytes2[]" || - primitiveType == "bytes3" || - primitiveType == "bytes3[]" || - primitiveType == "bytes4" || - primitiveType == "bytes4[]" || - primitiveType == "bytes5" || - primitiveType == "bytes5[]" || - primitiveType == "bytes6" || - primitiveType == "bytes6[]" || - primitiveType == "bytes7" || - primitiveType == "bytes7[]" || - primitiveType == "bytes8" || - primitiveType == "bytes8[]" || - primitiveType == "bytes9" || - primitiveType == "bytes9[]" || - primitiveType == "bytes10" || - primitiveType == "bytes10[]" || - primitiveType == "bytes11" || - primitiveType == "bytes11[]" || - primitiveType == "bytes12" || - primitiveType == "bytes12[]" || - primitiveType == "bytes13" || - primitiveType == "bytes13[]" || - primitiveType == "bytes14" || - primitiveType == "bytes14[]" || - primitiveType == "bytes15" || - primitiveType == "bytes15[]" || - primitiveType == "bytes16" || - primitiveType == "bytes16[]" || - primitiveType == "bytes17" || - primitiveType == "bytes17[]" || - primitiveType == "bytes18" || - primitiveType == "bytes18[]" || - primitiveType == "bytes19" || - primitiveType == "bytes19[]" || - primitiveType == "bytes20" || - primitiveType == "bytes20[]" || - primitiveType == "bytes21" || - primitiveType == "bytes21[]" || - primitiveType == "bytes22" || - primitiveType == "bytes22[]" || - primitiveType == "bytes23" || - primitiveType == "bytes23[]" || - primitiveType == "bytes24" || - primitiveType == "bytes24[]" || - primitiveType == "bytes25" || - primitiveType == "bytes25[]" || - primitiveType == "bytes26" || - primitiveType == "bytes26[]" || - primitiveType == "bytes27" || - primitiveType == "bytes27[]" || - primitiveType == "bytes28" || - primitiveType == "bytes28[]" || - primitiveType == "bytes29" || - primitiveType == "bytes29[]" || - primitiveType == "bytes30" || - primitiveType == "bytes30[]" || - primitiveType == "bytes31" || - primitiveType == "bytes31[]" || - primitiveType == "bytes32" || - primitiveType == "bytes32[]" { - return true - } - if primitiveType == "int" || - primitiveType == "int[]" || - primitiveType == "int8" || - primitiveType == "int8[]" || - primitiveType == "int16" || - primitiveType == "int16[]" || - primitiveType == "int32" || - primitiveType == "int32[]" || - primitiveType == "int64" || - primitiveType == "int64[]" || - primitiveType == "int128" || - primitiveType == "int128[]" || - primitiveType == "int256" || - primitiveType == "int256[]" { - return true - } - if primitiveType == "uint" || - primitiveType == "uint[]" || - primitiveType == "uint8" || - primitiveType == "uint8[]" || - primitiveType == "uint16" || - primitiveType == "uint16[]" || - primitiveType == "uint32" || - primitiveType == "uint32[]" || - primitiveType == "uint64" || - primitiveType == "uint64[]" || - primitiveType == "uint128" || - primitiveType == "uint128[]" || - primitiveType == "uint256" || - primitiveType == "uint256[]" { - return true - } - return false -} - -// validate checks if the given domain is valid, i.e. contains at least -// the minimum viable keys and values -func (domain *TypedDataDomain) validate() error { - if domain.ChainId == nil && len(domain.Name) == 0 && len(domain.Version) == 0 && len(domain.VerifyingContract) == 0 && len(domain.Salt) == 0 { - return errors.New("domain is undefined") - } - - return nil -} - -// Map is a helper function to generate a map version of the domain -func (domain *TypedDataDomain) Map() map[string]interface{} { - dataMap := map[string]interface{}{} - - if domain.ChainId != nil { - dataMap["chainId"] = domain.ChainId - } - - if len(domain.Name) > 0 { - dataMap["name"] = domain.Name - } - - if len(domain.Version) > 0 { - dataMap["version"] = domain.Version - } - - if len(domain.VerifyingContract) > 0 { - dataMap["verifyingContract"] = domain.VerifyingContract - } - - if len(domain.Salt) > 0 { - dataMap["salt"] = domain.Salt - } - return dataMap -} diff --git a/signer/core/signed_data_test.go b/signer/core/signed_data_test.go index 23b7b9897b..1d972d2961 100644 --- a/signer/core/signed_data_test.go +++ b/signer/core/signed_data_test.go @@ -32,9 +32,10 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/signer/core" + "github.com/ethereum/go-ethereum/signer/core/apitypes" ) -var typesStandard = core.Types{ +var typesStandard = apitypes.Types{ "EIP712Domain": { { Name: "name", @@ -153,12 +154,12 @@ var jsonTypedData = ` const primaryType = "Mail" -var domainStandard = core.TypedDataDomain{ - "Ether Mail", - "1", - math.NewHexOrDecimal256(1), - "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", - "", +var domainStandard = apitypes.TypedDataDomain{ + Name: "Ether Mail", + Version: "1", + ChainId: math.NewHexOrDecimal256(1), + VerifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", + Salt: "", } var messageStandard = map[string]interface{}{ @@ -173,7 +174,7 @@ var messageStandard = map[string]interface{}{ "contents": "Hello, Bob!", } -var typedData = core.TypedData{ +var typedData = apitypes.TypedData{ Types: typesStandard, PrimaryType: primaryType, Domain: domainStandard, @@ -194,7 +195,7 @@ func TestSignData(t *testing.T) { control.approveCh <- "Y" control.inputCh <- "wrongpassword" - signature, err := api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + signature, err := api.SignData(context.Background(), apitypes.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) if signature != nil { t.Errorf("Expected nil-data, got %x", signature) } @@ -202,7 +203,7 @@ func TestSignData(t *testing.T) { t.Errorf("Expected ErrLocked! '%v'", err) } control.approveCh <- "No way" - signature, err = api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + signature, err = api.SignData(context.Background(), apitypes.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) if signature != nil { t.Errorf("Expected nil-data, got %x", signature) } @@ -212,7 +213,7 @@ func TestSignData(t *testing.T) { // text/plain control.approveCh <- "Y" control.inputCh <- "a_long_password" - signature, err = api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + signature, err = api.SignData(context.Background(), apitypes.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) if err != nil { t.Fatal(err) } @@ -232,13 +233,13 @@ func TestSignData(t *testing.T) { } func TestDomainChainId(t *testing.T) { - withoutChainID := core.TypedData{ - Types: core.Types{ - "EIP712Domain": []core.Type{ + withoutChainID := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ {Name: "name", Type: "string"}, }, }, - Domain: core.TypedDataDomain{ + Domain: apitypes.TypedDataDomain{ Name: "test", }, } @@ -250,14 +251,14 @@ func TestDomainChainId(t *testing.T) { if _, err := withoutChainID.HashStruct("EIP712Domain", withoutChainID.Domain.Map()); err != nil { t.Errorf("Expected the typedData to encode the domain successfully, got %v", err) } - withChainID := core.TypedData{ - Types: core.Types{ - "EIP712Domain": []core.Type{ + withChainID := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ {Name: "name", Type: "string"}, {Name: "chainId", Type: "uint256"}, }, }, - Domain: core.TypedDataDomain{ + Domain: apitypes.TypedDataDomain{ Name: "test", ChainId: math.NewHexOrDecimal256(1), }, @@ -323,7 +324,7 @@ func TestEncodeData(t *testing.T) { } func TestFormatter(t *testing.T) { - var d core.TypedData + var d apitypes.TypedData err := json.Unmarshal([]byte(jsonTypedData), &d) if err != nil { t.Fatalf("unmarshalling failed '%v'", err) @@ -337,7 +338,7 @@ func TestFormatter(t *testing.T) { t.Logf("'%v'\n", string(j)) } -func sign(typedData core.TypedData) ([]byte, []byte, error) { +func sign(typedData apitypes.TypedData) ([]byte, []byte, error) { domainSeparator, err := typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) if err != nil { return nil, nil, err @@ -366,7 +367,7 @@ func TestJsonFiles(t *testing.T) { t.Errorf("Failed to read file %v: %v", fInfo.Name(), err) continue } - var typedData core.TypedData + var typedData apitypes.TypedData err = json.Unmarshal(data, &typedData) if err != nil { t.Errorf("Test %d, file %v, json unmarshalling failed: %v", i, fInfo.Name(), err) @@ -398,7 +399,7 @@ func TestFuzzerFiles(t *testing.T) { t.Errorf("Failed to read file %v: %v", fInfo.Name(), err) continue } - var typedData core.TypedData + var typedData apitypes.TypedData err = json.Unmarshal(data, &typedData) if err != nil { t.Errorf("Test %d, file %v, json unmarshalling failed: %v", i, fInfo.Name(), err) @@ -498,7 +499,7 @@ var gnosisTx = ` // TestGnosisTypedData tests the scenario where a user submits a full EIP-712 // struct without using the gnosis-specific endpoint func TestGnosisTypedData(t *testing.T) { - var td core.TypedData + var td apitypes.TypedData err := json.Unmarshal([]byte(gnosisTypedData), &td) if err != nil { t.Fatalf("unmarshalling failed '%v'", err) diff --git a/signer/rules/rules_test.go b/signer/rules/rules_test.go index d506ef2db0..0ab246eeaf 100644 --- a/signer/rules/rules_test.go +++ b/signer/rules/rules_test.go @@ -605,7 +605,7 @@ function ApproveSignData(r){ t.Logf("address %v %v\n", addr.String(), addr.Original()) - nvt := []*core.NameValueType{ + nvt := []*apitypes.NameValueType{ { Name: "message", Typ: "text/plain", diff --git a/tests/difficulty_test.go b/tests/difficulty_test.go index acbf96e712..192dff12cc 100644 --- a/tests/difficulty_test.go +++ b/tests/difficulty_test.go @@ -76,6 +76,9 @@ func TestDifficulty(t *testing.T) { dt.config("EIP2384", params.ChainConfig{ MuirGlacierBlock: big.NewInt(0), }) + dt.config("EIP4345", params.ChainConfig{ + ArrowGlacierBlock: big.NewInt(0), + }) dt.config("difficulty.json", mainnetChainConfig) dt.walk(t, difficultyTestDir, func(t *testing.T, name string, test *DifficultyTest) { diff --git a/tests/fuzzers/snap/debug/main.go b/tests/fuzzers/snap/debug/main.go new file mode 100644 index 0000000000..d0d1b49307 --- /dev/null +++ b/tests/fuzzers/snap/debug/main.go @@ -0,0 +1,39 @@ +// Copyright 2021 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 . + +package main + +import ( + "fmt" + "io/ioutil" + "os" + + "github.com/ethereum/go-ethereum/tests/fuzzers/snap" +) + +func main() { + if len(os.Args) != 2 { + fmt.Fprintf(os.Stderr, "Usage: debug \n") + os.Exit(1) + } + crasher := os.Args[1] + data, err := ioutil.ReadFile(crasher) + if err != nil { + fmt.Fprintf(os.Stderr, "error loading crasher %v: %v", crasher, err) + os.Exit(1) + } + snap.FuzzTrieNodes(data) +} diff --git a/tests/fuzzers/snap/fuzz_handler.go b/tests/fuzzers/snap/fuzz_handler.go new file mode 100644 index 0000000000..1ae61df29d --- /dev/null +++ b/tests/fuzzers/snap/fuzz_handler.go @@ -0,0 +1,164 @@ +// Copyright 2021 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 . + +package snap + +import ( + "bytes" + "encoding/binary" + "fmt" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/protocols/snap" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + fuzz "github.com/google/gofuzz" +) + +var trieRoot common.Hash + +func getChain() *core.BlockChain { + db := rawdb.NewMemoryDatabase() + ga := make(core.GenesisAlloc, 1000) + var a = make([]byte, 20) + var mkStorage = func(k, v int) (common.Hash, common.Hash) { + var kB = make([]byte, 32) + var vB = make([]byte, 32) + binary.LittleEndian.PutUint64(kB, uint64(k)) + binary.LittleEndian.PutUint64(vB, uint64(v)) + return common.BytesToHash(kB), common.BytesToHash(vB) + } + storage := make(map[common.Hash]common.Hash) + for i := 0; i < 10; i++ { + k, v := mkStorage(i, i) + storage[k] = v + } + for i := 0; i < 1000; i++ { + binary.LittleEndian.PutUint64(a, uint64(i+0xff)) + acc := core.GenesisAccount{Balance: big.NewInt(int64(i))} + if i%2 == 1 { + acc.Storage = storage + } + ga[common.BytesToAddress(a)] = acc + } + gspec := core.Genesis{ + Config: params.TestChainConfig, + Alloc: ga, + } + genesis := gspec.MustCommit(db) + blocks, _ := core.GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, 2, + func(i int, gen *core.BlockGen) {}) + cacheConf := &core.CacheConfig{ + TrieCleanLimit: 0, + TrieDirtyLimit: 0, + TrieTimeLimit: 5 * time.Minute, + TrieCleanNoPrefetch: true, + TrieCleanRejournal: 0, + SnapshotLimit: 100, + SnapshotWait: true, + } + trieRoot = blocks[len(blocks)-1].Root() + bc, _ := core.NewBlockChain(db, cacheConf, gspec.Config, ethash.NewFaker(), vm.Config{}, nil, nil) + if _, err := bc.InsertChain(blocks); err != nil { + panic(err) + } + return bc +} + +type dummyBackend struct { + chain *core.BlockChain +} + +func (d *dummyBackend) Chain() *core.BlockChain { return d.chain } +func (d *dummyBackend) RunPeer(*snap.Peer, snap.Handler) error { return nil } +func (d *dummyBackend) PeerInfo(enode.ID) interface{} { return "Foo" } +func (d *dummyBackend) Handle(*snap.Peer, snap.Packet) error { return nil } + +type dummyRW struct { + code uint64 + data []byte + writeCount int +} + +func (d *dummyRW) ReadMsg() (p2p.Msg, error) { + return p2p.Msg{ + Code: d.code, + Payload: bytes.NewReader(d.data), + ReceivedAt: time.Now(), + Size: uint32(len(d.data)), + }, nil +} + +func (d *dummyRW) WriteMsg(msg p2p.Msg) error { + d.writeCount++ + return nil +} + +func doFuzz(input []byte, obj interface{}, code int) int { + if len(input) > 1024*4 { + return -1 + } + bc := getChain() + defer bc.Stop() + backend := &dummyBackend{bc} + fuzz.NewFromGoFuzz(input).Fuzz(obj) + var data []byte + switch p := obj.(type) { + case *snap.GetTrieNodesPacket: + p.Root = trieRoot + data, _ = rlp.EncodeToBytes(obj) + default: + data, _ = rlp.EncodeToBytes(obj) + } + cli := &dummyRW{ + code: uint64(code), + data: data, + } + peer := snap.NewFakePeer(65, "gazonk01", cli) + err := snap.HandleMessage(backend, peer) + switch { + case err == nil && cli.writeCount != 1: + panic(fmt.Sprintf("Expected 1 response, got %d", cli.writeCount)) + case err != nil && cli.writeCount != 0: + panic(fmt.Sprintf("Expected 0 response, got %d", cli.writeCount)) + } + return 1 +} + +// To run a fuzzer, do +// $ CGO_ENABLED=0 go-fuzz-build -func FuzzTrieNodes +// $ go-fuzz + +func FuzzARange(input []byte) int { + return doFuzz(input, &snap.GetAccountRangePacket{}, snap.GetAccountRangeMsg) +} +func FuzzSRange(input []byte) int { + return doFuzz(input, &snap.GetStorageRangesPacket{}, snap.GetStorageRangesMsg) +} +func FuzzByteCodes(input []byte) int { + return doFuzz(input, &snap.GetByteCodesPacket{}, snap.GetByteCodesMsg) +} +func FuzzTrieNodes(input []byte) int { + return doFuzz(input, &snap.GetTrieNodesPacket{}, snap.GetTrieNodesMsg) +} diff --git a/tests/init.go b/tests/init.go index b0a38e68b0..d6b5b3043d 100644 --- a/tests/init.go +++ b/tests/init.go @@ -151,6 +151,7 @@ var Forks = map[string]*params.ChainConfig{ ConstantinopleBlock: big.NewInt(0), PetersburgBlock: big.NewInt(0), IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), BerlinBlock: big.NewInt(0), }, "BerlinToLondonAt5": { @@ -163,6 +164,7 @@ var Forks = map[string]*params.ChainConfig{ ConstantinopleBlock: big.NewInt(0), PetersburgBlock: big.NewInt(0), IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), BerlinBlock: big.NewInt(0), LondonBlock: big.NewInt(5), }, @@ -176,10 +178,11 @@ var Forks = map[string]*params.ChainConfig{ ConstantinopleBlock: big.NewInt(0), PetersburgBlock: big.NewInt(0), IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), BerlinBlock: big.NewInt(0), LondonBlock: big.NewInt(0), }, - "Aleut": { + "ArrowGlacier": { ChainID: big.NewInt(1), HomesteadBlock: big.NewInt(0), EIP150Block: big.NewInt(0), @@ -189,8 +192,10 @@ var Forks = map[string]*params.ChainConfig{ ConstantinopleBlock: big.NewInt(0), PetersburgBlock: big.NewInt(0), IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), BerlinBlock: big.NewInt(0), LondonBlock: big.NewInt(0), + ArrowGlacierBlock: big.NewInt(0), }, } diff --git a/tests/solidity/contracts/OpCodes.sol b/tests/solidity/contracts/OpCodes.sol index 9e3a0ebb02..2a41a5fc28 100644 --- a/tests/solidity/contracts/OpCodes.sol +++ b/tests/solidity/contracts/OpCodes.sol @@ -206,7 +206,7 @@ contract OpCodes { assembly { let x := mload(0x40) //Find empty storage location using "free memory pointer" - mstore(x,sig) //Place signature at begining of empty storage + mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. @@ -225,7 +225,7 @@ contract OpCodes { //callcode assembly { let x := mload(0x40) //Find empty storage location using "free memory pointer" - mstore(x,sig) //Place signature at begining of empty storage + mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. @@ -244,7 +244,7 @@ contract OpCodes { //delegatecall assembly { let x := mload(0x40) //Find empty storage location using "free memory pointer" - mstore(x,sig) //Place signature at begining of empty storage + mstore(x,sig) //Place signature at beginning of empty storage mstore(add(x,0x04),a) // first address parameter. just after signature mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. diff --git a/tests/state_test.go b/tests/state_test.go index 9554e75630..78ecda0409 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -24,6 +24,7 @@ import ( "testing" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers/logger" ) func TestState(t *testing.T) { @@ -115,7 +116,7 @@ func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { } buf := new(bytes.Buffer) w := bufio.NewWriter(buf) - tracer := vm.NewJSONLogger(&vm.LogConfig{}, w) + tracer := logger.NewJSONLogger(&logger.Config{}, w) config.Debug, config.Tracer = true, tracer err2 := test(config) if !reflect.DeepEqual(err, err2) { diff --git a/trie/database.go b/trie/database.go index f140a56642..58ca4e6f3c 100644 --- a/trie/database.go +++ b/trie/database.go @@ -794,8 +794,8 @@ type cleaner struct { // Put reacts to database writes and implements dirty data uncaching. This is the // post-processing step of a commit operation where the already persisted trie is // removed from the dirty cache and moved into the clean cache. The reason behind -// the two-phase commit is to ensure ensure data availability while moving from -// memory to disk. +// the two-phase commit is to ensure data availability while moving from memory +// to disk. func (c *cleaner) Put(key []byte, rlp []byte) error { hash := common.BytesToHash(key) diff --git a/trie/iterator.go b/trie/iterator.go index 406f216c22..654772aa13 100644 --- a/trie/iterator.go +++ b/trie/iterator.go @@ -275,7 +275,7 @@ func (it *nodeIterator) seek(prefix []byte) error { } } -// init initializes the the iterator. +// init initializes the iterator. func (it *nodeIterator) init() (*nodeIteratorState, error) { root := it.trie.Hash() state := &nodeIteratorState{node: it.trie.root, index: -1} diff --git a/trie/proof.go b/trie/proof.go index 08a9e40422..51ecea0c39 100644 --- a/trie/proof.go +++ b/trie/proof.go @@ -472,12 +472,17 @@ func VerifyRangeProof(rootHash common.Hash, firstKey []byte, lastKey []byte, key if len(keys) != len(values) { return false, fmt.Errorf("inconsistent proof data, keys: %d, values: %d", len(keys), len(values)) } - // Ensure the received batch is monotonic increasing. + // Ensure the received batch is monotonic increasing and contains no deletions for i := 0; i < len(keys)-1; i++ { if bytes.Compare(keys[i], keys[i+1]) >= 0 { return false, errors.New("range is not monotonically increasing") } } + for _, value := range values { + if len(value) == 0 { + return false, errors.New("range contains deletion") + } + } // Special case, there is no edge proof at all. The given range is expected // to be the whole leaf-set in the trie. if proof == nil { diff --git a/trie/proof_test.go b/trie/proof_test.go index a35b7144c0..95ad6169c3 100644 --- a/trie/proof_test.go +++ b/trie/proof_test.go @@ -813,6 +813,85 @@ func TestBloatedProof(t *testing.T) { } } +// TestEmptyValueRangeProof tests normal range proof with both edge proofs +// as the existent proof, but with an extra empty value included, which is a +// noop technically, but practically should be rejected. +func TestEmptyValueRangeProof(t *testing.T) { + trie, values := randomTrie(512) + var entries entrySlice + for _, kv := range values { + entries = append(entries, kv) + } + sort.Sort(entries) + + // Create a new entry with a slightly modified key + mid := len(entries) / 2 + key := common.CopyBytes(entries[mid-1].k) + for n := len(key) - 1; n >= 0; n-- { + if key[n] < 0xff { + key[n]++ + break + } + } + noop := &kv{key, []byte{}, false} + entries = append(append(append([]*kv{}, entries[:mid]...), noop), entries[mid:]...) + + start, end := 1, len(entries)-1 + + proof := memorydb.New() + if err := trie.Prove(entries[start].k, 0, proof); err != nil { + t.Fatalf("Failed to prove the first node %v", err) + } + if err := trie.Prove(entries[end-1].k, 0, proof); err != nil { + t.Fatalf("Failed to prove the last node %v", err) + } + var keys [][]byte + var vals [][]byte + for i := start; i < end; i++ { + keys = append(keys, entries[i].k) + vals = append(vals, entries[i].v) + } + _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof) + if err == nil { + t.Fatalf("Expected failure on noop entry") + } +} + +// TestAllElementsEmptyValueRangeProof tests the range proof with all elements, +// but with an extra empty value included, which is a noop technically, but +// practically should be rejected. +func TestAllElementsEmptyValueRangeProof(t *testing.T) { + trie, values := randomTrie(512) + var entries entrySlice + for _, kv := range values { + entries = append(entries, kv) + } + sort.Sort(entries) + + // Create a new entry with a slightly modified key + mid := len(entries) / 2 + key := common.CopyBytes(entries[mid-1].k) + for n := len(key) - 1; n >= 0; n-- { + if key[n] < 0xff { + key[n]++ + break + } + } + noop := &kv{key, []byte{}, false} + entries = append(append(append([]*kv{}, entries[:mid]...), noop), entries[mid:]...) + + var keys [][]byte + var vals [][]byte + for i := 0; i < len(entries); i++ { + keys = append(keys, entries[i].k) + vals = append(vals, entries[i].v) + } + _, err := VerifyRangeProof(trie.Hash(), nil, nil, keys, vals, nil) + if err == nil { + t.Fatalf("Expected failure on noop entry") + } +} + // mutateByte changes one byte in b. func mutateByte(b []byte) { for r := mrand.Intn(len(b)); ; { diff --git a/trie/stacktrie.go b/trie/stacktrie.go index f9ff10b62d..76258c3112 100644 --- a/trie/stacktrie.go +++ b/trie/stacktrie.go @@ -54,12 +54,11 @@ func returnToPool(st *StackTrie) { // in order. Once it determines that a subtree will no longer be inserted // into, it will hash it and free up the memory it uses. type StackTrie struct { - nodeType uint8 // node type (as in branch, ext, leaf) - val []byte // value contained by this node if it's a leaf - key []byte // key chunk covered by this (full|ext) node - keyOffset int // offset of the key chunk inside a full key - children [16]*StackTrie // list of children (for fullnodes and exts) - db ethdb.KeyValueWriter // Pointer to the commit db, can be nil + nodeType uint8 // node type (as in branch, ext, leaf) + val []byte // value contained by this node if it's a leaf + key []byte // key chunk covered by this (leaf|ext) node + children [16]*StackTrie // list of children (for branch and exts) + db ethdb.KeyValueWriter // Pointer to the commit db, can be nil } // NewStackTrie allocates and initializes an empty trie. @@ -90,15 +89,13 @@ func (st *StackTrie) MarshalBinary() (data []byte, err error) { w = bufio.NewWriter(&b) ) if err := gob.NewEncoder(w).Encode(struct { - Nodetype uint8 - Val []byte - Key []byte - KeyOffset uint8 + Nodetype uint8 + Val []byte + Key []byte }{ st.nodeType, st.val, st.key, - uint8(st.keyOffset), }); err != nil { return nil, err } @@ -126,16 +123,14 @@ func (st *StackTrie) UnmarshalBinary(data []byte) error { func (st *StackTrie) unmarshalBinary(r io.Reader) error { var dec struct { - Nodetype uint8 - Val []byte - Key []byte - KeyOffset uint8 + Nodetype uint8 + Val []byte + Key []byte } gob.NewDecoder(r).Decode(&dec) st.nodeType = dec.Nodetype st.val = dec.Val st.key = dec.Key - st.keyOffset = int(dec.KeyOffset) var hasChild = make([]byte, 1) for i := range st.children { @@ -160,20 +155,18 @@ func (st *StackTrie) setDb(db ethdb.KeyValueWriter) { } } -func newLeaf(ko int, key, val []byte, db ethdb.KeyValueWriter) *StackTrie { +func newLeaf(key, val []byte, db ethdb.KeyValueWriter) *StackTrie { st := stackTrieFromPool(db) st.nodeType = leafNode - st.keyOffset = ko - st.key = append(st.key, key[ko:]...) + st.key = append(st.key, key...) st.val = val return st } -func newExt(ko int, key []byte, child *StackTrie, db ethdb.KeyValueWriter) *StackTrie { +func newExt(key []byte, child *StackTrie, db ethdb.KeyValueWriter) *StackTrie { st := stackTrieFromPool(db) st.nodeType = extNode - st.keyOffset = ko - st.key = append(st.key, key[ko:]...) + st.key = append(st.key, key...) st.children[0] = child return st } @@ -211,17 +204,18 @@ func (st *StackTrie) Reset() { st.children[i] = nil } st.nodeType = emptyNode - st.keyOffset = 0 } // Helper function that, given a full key, determines the index // at which the chunk pointed by st.keyOffset is different from // the same chunk in the full key. func (st *StackTrie) getDiffIndex(key []byte) int { - diffindex := 0 - for ; diffindex < len(st.key) && st.key[diffindex] == key[st.keyOffset+diffindex]; diffindex++ { + for idx, nibble := range st.key { + if nibble != key[idx] { + return idx + } } - return diffindex + return len(st.key) } // Helper function to that inserts a (key, value) pair into @@ -229,7 +223,7 @@ func (st *StackTrie) getDiffIndex(key []byte) int { func (st *StackTrie) insert(key, value []byte) { switch st.nodeType { case branchNode: /* Branch */ - idx := int(key[st.keyOffset]) + idx := int(key[0]) // Unresolve elder siblings for i := idx - 1; i >= 0; i-- { if st.children[i] != nil { @@ -241,10 +235,10 @@ func (st *StackTrie) insert(key, value []byte) { } // Add new child if st.children[idx] == nil { - st.children[idx] = stackTrieFromPool(st.db) - st.children[idx].keyOffset = st.keyOffset + 1 + st.children[idx] = newLeaf(key[1:], value, st.db) + } else { + st.children[idx].insert(key[1:], value) } - st.children[idx].insert(key, value) case extNode: /* Ext */ // Compare both key chunks and see where they differ diffidx := st.getDiffIndex(key) @@ -257,7 +251,7 @@ func (st *StackTrie) insert(key, value []byte) { if diffidx == len(st.key) { // Ext key and key segment are identical, recurse into // the child node. - st.children[0].insert(key, value) + st.children[0].insert(key[diffidx:], value) return } // Save the original part. Depending if the break is @@ -266,7 +260,7 @@ func (st *StackTrie) insert(key, value []byte) { // node directly. var n *StackTrie if diffidx < len(st.key)-1 { - n = newExt(diffidx+1, st.key, st.children[0], st.db) + n = newExt(st.key[diffidx+1:], st.children[0], st.db) } else { // Break on the last byte, no need to insert // an extension node: reuse the current node @@ -288,15 +282,14 @@ func (st *StackTrie) insert(key, value []byte) { // node. st.children[0] = stackTrieFromPool(st.db) st.children[0].nodeType = branchNode - st.children[0].keyOffset = st.keyOffset + diffidx p = st.children[0] } // Create a leaf for the inserted part - o := newLeaf(st.keyOffset+diffidx+1, key, value, st.db) + o := newLeaf(key[diffidx+1:], value, st.db) // Insert both child leaves where they belong: origIdx := st.key[diffidx] - newIdx := key[diffidx+st.keyOffset] + newIdx := key[diffidx] p.children[origIdx] = n p.children[newIdx] = o st.key = st.key[:diffidx] @@ -330,7 +323,6 @@ func (st *StackTrie) insert(key, value []byte) { st.nodeType = extNode st.children[0] = NewStackTrie(st.db) st.children[0].nodeType = branchNode - st.children[0].keyOffset = st.keyOffset + diffidx p = st.children[0] } @@ -339,11 +331,11 @@ func (st *StackTrie) insert(key, value []byte) { // The child leave will be hashed directly in order to // free up some memory. origIdx := st.key[diffidx] - p.children[origIdx] = newLeaf(diffidx+1, st.key, st.val, st.db) + p.children[origIdx] = newLeaf(st.key[diffidx+1:], st.val, st.db) p.children[origIdx].hash() - newIdx := key[diffidx+st.keyOffset] - p.children[newIdx] = newLeaf(p.keyOffset+1, key, value, st.db) + newIdx := key[diffidx] + p.children[newIdx] = newLeaf(key[diffidx+1:], value, st.db) // Finally, cut off the key part that has been passed // over to the children. @@ -351,7 +343,7 @@ func (st *StackTrie) insert(key, value []byte) { st.val = nil case emptyNode: /* Empty */ st.nodeType = leafNode - st.key = key[st.keyOffset:] + st.key = key st.val = value case hashedNode: panic("trying to insert into hash") diff --git a/trie/stacktrie_test.go b/trie/stacktrie_test.go index bd2574d5d1..fb39e42525 100644 --- a/trie/stacktrie_test.go +++ b/trie/stacktrie_test.go @@ -26,6 +26,166 @@ import ( "github.com/ethereum/go-ethereum/ethdb/memorydb" ) +func TestStackTrieInsertAndHash(t *testing.T) { + type KeyValueHash struct { + K string // Hex string for key. + V string // Value, directly converted to bytes. + H string // Expected root hash after insert of (K, V) to an existing trie. + } + tests := [][]KeyValueHash{ + { // {0:0, 7:0, f:0} + {"00", "v_______________________0___0", "5cb26357b95bb9af08475be00243ceb68ade0b66b5cd816b0c18a18c612d2d21"}, + {"70", "v_______________________0___1", "8ff64309574f7a437a7ad1628e690eb7663cfde10676f8a904a8c8291dbc1603"}, + {"f0", "v_______________________0___2", "9e3a01bd8d43efb8e9d4b5506648150b8e3ed1caea596f84ee28e01a72635470"}, + }, + { // {1:0cc, e:{1:fc, e:fc}} + {"10cc", "v_______________________1___0", "233e9b257843f3dfdb1cce6676cdaf9e595ac96ee1b55031434d852bc7ac9185"}, + {"e1fc", "v_______________________1___1", "39c5e908ae83d0c78520c7c7bda0b3782daf594700e44546e93def8f049cca95"}, + {"eefc", "v_______________________1___2", "d789567559fd76fe5b7d9cc42f3750f942502ac1c7f2a466e2f690ec4b6c2a7c"}, + }, + { // {b:{a:ac, b:ac}, d:acc} + {"baac", "v_______________________2___0", "8be1c86ba7ec4c61e14c1a9b75055e0464c2633ae66a055a24e75450156a5d42"}, + {"bbac", "v_______________________2___1", "8495159b9895a7d88d973171d737c0aace6fe6ac02a4769fff1bc43bcccce4cc"}, + {"dacc", "v_______________________2___2", "9bcfc5b220a27328deb9dc6ee2e3d46c9ebc9c69e78acda1fa2c7040602c63ca"}, + }, + { // {0:0cccc, 2:456{0:0, 2:2} + {"00cccc", "v_______________________3___0", "e57dc2785b99ce9205080cb41b32ebea7ac3e158952b44c87d186e6d190a6530"}, + {"245600", "v_______________________3___1", "0335354adbd360a45c1871a842452287721b64b4234dfe08760b243523c998db"}, + {"245622", "v_______________________3___2", "9e6832db0dca2b5cf81c0e0727bfde6afc39d5de33e5720bccacc183c162104e"}, + }, + { // {1:4567{1:1c, 3:3c}, 3:0cccccc} + {"1456711c", "v_______________________4___0", "f2389e78d98fed99f3e63d6d1623c1d4d9e8c91cb1d585de81fbc7c0e60d3529"}, + {"1456733c", "v_______________________4___1", "101189b3fab852be97a0120c03d95eefcf984d3ed639f2328527de6def55a9c0"}, + {"30cccccc", "v_______________________4___2", "3780ce111f98d15751dfde1eb21080efc7d3914b429e5c84c64db637c55405b3"}, + }, + { // 8800{1:f, 2:e, 3:d} + {"88001f", "v_______________________5___0", "e817db50d84f341d443c6f6593cafda093fc85e773a762421d47daa6ac993bd5"}, + {"88002e", "v_______________________5___1", "d6e3e6047bdc110edd296a4d63c030aec451bee9d8075bc5a198eee8cda34f68"}, + {"88003d", "v_______________________5___2", "b6bdf8298c703342188e5f7f84921a402042d0e5fb059969dd53a6b6b1fb989e"}, + }, + { // 0{1:fc, 2:ec, 4:dc} + {"01fc", "v_______________________6___0", "693268f2ca80d32b015f61cd2c4dba5a47a6b52a14c34f8e6945fad684e7a0d5"}, + {"02ec", "v_______________________6___1", "e24ddd44469310c2b785a2044618874bf486d2f7822603a9b8dce58d6524d5de"}, + {"04dc", "v_______________________6___2", "33fc259629187bbe54b92f82f0cd8083b91a12e41a9456b84fc155321e334db7"}, + }, + { // f{0:fccc, f:ff{0:f, f:f}} + {"f0fccc", "v_______________________7___0", "b0966b5aa469a3e292bc5fcfa6c396ae7a657255eef552ea7e12f996de795b90"}, + {"ffff0f", "v_______________________7___1", "3b1ca154ec2a3d96d8d77bddef0abfe40a53a64eb03cecf78da9ec43799fa3d0"}, + {"ffffff", "v_______________________7___2", "e75463041f1be8252781be0ace579a44ea4387bf5b2739f4607af676f7719678"}, + }, + { // ff{0:f{0:f, f:f}, f:fcc} + {"ff0f0f", "v_______________________8___0", "0928af9b14718ec8262ab89df430f1e5fbf66fac0fed037aff2b6767ae8c8684"}, + {"ff0fff", "v_______________________8___1", "d870f4d3ce26b0bf86912810a1960693630c20a48ba56be0ad04bc3e9ddb01e6"}, + {"ffffcc", "v_______________________8___2", "4239f10dd9d9915ecf2e047d6a576bdc1733ed77a30830f1bf29deaf7d8e966f"}, + }, + { + {"123d", "x___________________________0", "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0"}, + {"123e", "x___________________________1", "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec"}, + {"123f", "x___________________________2", "1164d7299964e74ac40d761f9189b2a3987fae959800d0f7e29d3aaf3eae9e15"}, + }, + { + {"123d", "x___________________________0", "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0"}, + {"123e", "x___________________________1", "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec"}, + {"124a", "x___________________________2", "661a96a669869d76b7231380da0649d013301425fbea9d5c5fae6405aa31cfce"}, + }, + { + {"123d", "x___________________________0", "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0"}, + {"123e", "x___________________________1", "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec"}, + {"13aa", "x___________________________2", "6590120e1fd3ffd1a90e8de5bb10750b61079bb0776cca4414dd79a24e4d4356"}, + }, + { + {"123d", "x___________________________0", "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0"}, + {"123e", "x___________________________1", "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec"}, + {"2aaa", "x___________________________2", "f869b40e0c55eace1918332ef91563616fbf0755e2b946119679f7ef8e44b514"}, + }, + { + {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"}, + {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"}, + {"1234fa", "x___________________________2", "4f4e368ab367090d5bc3dbf25f7729f8bd60df84de309b4633a6b69ab66142c0"}, + }, + { + {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"}, + {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"}, + {"1235aa", "x___________________________2", "21840121d11a91ac8bbad9a5d06af902a5c8d56a47b85600ba813814b7bfcb9b"}, + }, + { + {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"}, + {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"}, + {"124aaa", "x___________________________2", "ea4040ddf6ae3fbd1524bdec19c0ab1581015996262006632027fa5cf21e441e"}, + }, + { + {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"}, + {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"}, + {"13aaaa", "x___________________________2", "e4beb66c67e44f2dd8ba36036e45a44ff68f8d52942472b1911a45f886a34507"}, + }, + { + {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"}, + {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"}, + {"2aaaaa", "x___________________________2", "5f5989b820ff5d76b7d49e77bb64f26602294f6c42a1a3becc669cd9e0dc8ec9"}, + }, + { + {"000000", "x___________________________0", "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a"}, + {"1234da", "x___________________________1", "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2"}, + {"1234ea", "x___________________________2", "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8"}, + {"1234fa", "x___________________________3", "65bb3aafea8121111d693ffe34881c14d27b128fd113fa120961f251fe28428d"}, + }, + { + {"000000", "x___________________________0", "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a"}, + {"1234da", "x___________________________1", "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2"}, + {"1234ea", "x___________________________2", "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8"}, + {"1235aa", "x___________________________3", "f670e4d2547c533c5f21e0045442e2ecb733f347ad6d29ef36e0f5ba31bb11a8"}, + }, + { + {"000000", "x___________________________0", "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a"}, + {"1234da", "x___________________________1", "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2"}, + {"1234ea", "x___________________________2", "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8"}, + {"124aaa", "x___________________________3", "c17464123050a9a6f29b5574bb2f92f6d305c1794976b475b7fb0316b6335598"}, + }, + { + {"000000", "x___________________________0", "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a"}, + {"1234da", "x___________________________1", "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2"}, + {"1234ea", "x___________________________2", "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8"}, + {"13aaaa", "x___________________________3", "aa8301be8cb52ea5cd249f5feb79fb4315ee8de2140c604033f4b3fff78f0105"}, + }, + { + {"0000", "x___________________________0", "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2"}, + {"123d", "x___________________________1", "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31"}, + {"123e", "x___________________________2", "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80"}, + {"123f", "x___________________________3", "80f7bad1893ca57e3443bb3305a517723a74d3ba831bcaca22a170645eb7aafb"}, + }, + { + {"0000", "x___________________________0", "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2"}, + {"123d", "x___________________________1", "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31"}, + {"123e", "x___________________________2", "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80"}, + {"124a", "x___________________________3", "383bc1bb4f019e6bc4da3751509ea709b58dd1ac46081670834bae072f3e9557"}, + }, + { + {"0000", "x___________________________0", "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2"}, + {"123d", "x___________________________1", "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31"}, + {"123e", "x___________________________2", "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80"}, + {"13aa", "x___________________________3", "ff0dc70ce2e5db90ee42a4c2ad12139596b890e90eb4e16526ab38fa465b35cf"}, + }, + } + st := NewStackTrie(nil) + for i, test := range tests { + // The StackTrie does not allow Insert(), Hash(), Insert(), ... + // so we will create new trie for every sequence length of inserts. + for l := 1; l <= len(test); l++ { + st.Reset() + for j := 0; j < l; j++ { + kv := &test[j] + if err := st.TryUpdate(common.FromHex(kv.K), []byte(kv.V)); err != nil { + t.Fatal(err) + } + } + expected := common.HexToHash(test[l-1].H) + if h := st.Hash(); h != expected { + t.Errorf("%d(%d): root hash mismatch: %x, expected %x", i, l, h, expected) + } + } + } +} + func TestSizeBug(t *testing.T) { st := NewStackTrie(nil) nt, _ := New(common.Hash{}, NewDatabase(memorydb.New())) diff --git a/trie/sync.go b/trie/sync.go index 3a6076ff8f..81d38ee3a6 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -128,11 +128,10 @@ type Sync struct { codeReqs map[common.Hash]*request // Pending requests pertaining to a code hash queue *prque.Prque // Priority queue with the pending requests fetches map[int]int // Number of active fetches per trie node depth - bloom *SyncBloom // Bloom filter for fast state existence checks } // NewSync creates a new trie data download scheduler. -func NewSync(root common.Hash, database ethdb.KeyValueReader, callback LeafCallback, bloom *SyncBloom) *Sync { +func NewSync(root common.Hash, database ethdb.KeyValueReader, callback LeafCallback) *Sync { ts := &Sync{ database: database, membatch: newSyncMemBatch(), @@ -140,7 +139,6 @@ func NewSync(root common.Hash, database ethdb.KeyValueReader, callback LeafCallb codeReqs: make(map[common.Hash]*request), queue: prque.New(nil), fetches: make(map[int]int), - bloom: bloom, } ts.AddSubTrie(root, nil, common.Hash{}, callback) return ts @@ -155,16 +153,11 @@ func (s *Sync) AddSubTrie(root common.Hash, path []byte, parent common.Hash, cal if s.membatch.hasNode(root) { return } - if s.bloom == nil || s.bloom.Contains(root[:]) { - // Bloom filter says this might be a duplicate, double check. - // If database says yes, then at least the trie node is present - // and we hold the assumption that it's NOT legacy contract code. - blob := rawdb.ReadTrieNode(s.database, root) - if len(blob) > 0 { - return - } - // False positive, bump fault meter - bloomFaultMeter.Mark(1) + // If database says this is a duplicate, then at least the trie node is + // present, and we hold the assumption that it's NOT legacy contract code. + blob := rawdb.ReadTrieNode(s.database, root) + if len(blob) > 0 { + return } // Assemble the new sub-trie sync request req := &request{ @@ -195,18 +188,13 @@ func (s *Sync) AddCodeEntry(hash common.Hash, path []byte, parent common.Hash) { if s.membatch.hasCode(hash) { return } - if s.bloom == nil || s.bloom.Contains(hash[:]) { - // Bloom filter says this might be a duplicate, double check. - // If database says yes, the blob is present for sure. - // Note we only check the existence with new code scheme, fast - // sync is expected to run with a fresh new node. Even there - // exists the code with legacy format, fetch and store with - // new scheme anyway. - if blob := rawdb.ReadCodeWithPrefix(s.database, hash); len(blob) > 0 { - return - } - // False positive, bump fault meter - bloomFaultMeter.Mark(1) + // If database says duplicate, the blob is present for sure. + // Note we only check the existence with new code scheme, fast + // sync is expected to run with a fresh new node. Even there + // exists the code with legacy format, fetch and store with + // new scheme anyway. + if blob := rawdb.ReadCodeWithPrefix(s.database, hash); len(blob) > 0 { + return } // Assemble the new sub-trie sync request req := &request{ @@ -236,7 +224,7 @@ func (s *Sync) Missing(max int) (nodes []common.Hash, paths []SyncPath, codes [] codeHashes []common.Hash ) for !s.queue.Empty() && (max == 0 || len(nodeHashes)+len(codeHashes) < max) { - // Retrieve th enext item in line + // Retrieve the next item in line item, prio := s.queue.Peek() // If we have too many already-pending tasks for this depth, throttle @@ -313,15 +301,9 @@ func (s *Sync) Commit(dbw ethdb.Batch) error { // Dump the membatch into a database dbw for key, value := range s.membatch.nodes { rawdb.WriteTrieNode(dbw, key, value) - if s.bloom != nil { - s.bloom.Add(key[:]) - } } for key, value := range s.membatch.codes { rawdb.WriteCode(dbw, key, value) - if s.bloom != nil { - s.bloom.Add(key[:]) - } } // Drop the membatch data and return s.membatch = newSyncMemBatch() @@ -417,15 +399,10 @@ func (s *Sync) children(req *request, object node) ([]*request, error) { if s.membatch.hasNode(hash) { continue } - if s.bloom == nil || s.bloom.Contains(node) { - // Bloom filter says this might be a duplicate, double check. - // If database says yes, then at least the trie node is present - // and we hold the assumption that it's NOT legacy contract code. - if blob := rawdb.ReadTrieNode(s.database, hash); len(blob) > 0 { - continue - } - // False positive, bump fault meter - bloomFaultMeter.Mark(1) + // If database says duplicate, then at least the trie node is present + // and we hold the assumption that it's NOT legacy contract code. + if blob := rawdb.ReadTrieNode(s.database, hash); len(blob) > 0 { + continue } // Locally unknown node, schedule for retrieval requests = append(requests, &request{ diff --git a/trie/sync_bloom.go b/trie/sync_bloom.go deleted file mode 100644 index 91e5e6711d..0000000000 --- a/trie/sync_bloom.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2019 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 . - -package trie - -import ( - "encoding/binary" - "fmt" - "sync" - "sync/atomic" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/rawdb" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - bloomfilter "github.com/holiman/bloomfilter/v2" -) - -var ( - bloomAddMeter = metrics.NewRegisteredMeter("trie/bloom/add", nil) - bloomLoadMeter = metrics.NewRegisteredMeter("trie/bloom/load", nil) - bloomTestMeter = metrics.NewRegisteredMeter("trie/bloom/test", nil) - bloomMissMeter = metrics.NewRegisteredMeter("trie/bloom/miss", nil) - bloomFaultMeter = metrics.NewRegisteredMeter("trie/bloom/fault", nil) - bloomErrorGauge = metrics.NewRegisteredGauge("trie/bloom/error", nil) -) - -// SyncBloom is a bloom filter used during fast sync to quickly decide if a trie -// node or contract code already exists on disk or not. It self populates from the -// provided disk database on creation in a background thread and will only start -// returning live results once that's finished. -type SyncBloom struct { - bloom *bloomfilter.Filter - inited uint32 - closer sync.Once - closed uint32 - pend sync.WaitGroup - closeCh chan struct{} -} - -// NewSyncBloom creates a new bloom filter of the given size (in megabytes) and -// initializes it from the database. The bloom is hard coded to use 3 filters. -func NewSyncBloom(memory uint64, database ethdb.Iteratee) *SyncBloom { - // Create the bloom filter to track known trie nodes - bloom, err := bloomfilter.New(memory*1024*1024*8, 4) - if err != nil { - panic(fmt.Sprintf("failed to create bloom: %v", err)) - } - log.Info("Allocated fast sync bloom", "size", common.StorageSize(memory*1024*1024)) - - // Assemble the fast sync bloom and init it from previous sessions - b := &SyncBloom{ - bloom: bloom, - closeCh: make(chan struct{}), - } - b.pend.Add(2) - go func() { - defer b.pend.Done() - b.init(database) - }() - go func() { - defer b.pend.Done() - b.meter() - }() - return b -} - -// init iterates over the database, pushing every trie hash into the bloom filter. -func (b *SyncBloom) init(database ethdb.Iteratee) { - // Iterate over the database, but restart every now and again to avoid holding - // a persistent snapshot since fast sync can push a ton of data concurrently, - // bloating the disk. - // - // Note, this is fine, because everything inserted into leveldb by fast sync is - // also pushed into the bloom directly, so we're not missing anything when the - // iterator is swapped out for a new one. - it := database.NewIterator(nil, nil) - - var ( - start = time.Now() - swap = time.Now() - ) - for it.Next() && atomic.LoadUint32(&b.closed) == 0 { - // If the database entry is a trie node, add it to the bloom - key := it.Key() - if len(key) == common.HashLength { - b.bloom.AddHash(binary.BigEndian.Uint64(key)) - bloomLoadMeter.Mark(1) - } else if ok, hash := rawdb.IsCodeKey(key); ok { - // If the database entry is a contract code, add it to the bloom - b.bloom.AddHash(binary.BigEndian.Uint64(hash)) - bloomLoadMeter.Mark(1) - } - // If enough time elapsed since the last iterator swap, restart - if time.Since(swap) > 8*time.Second { - key := common.CopyBytes(it.Key()) - - it.Release() - it = database.NewIterator(nil, key) - - log.Info("Initializing state bloom", "items", b.bloom.N(), "errorrate", b.bloom.FalsePosititveProbability(), "elapsed", common.PrettyDuration(time.Since(start))) - swap = time.Now() - } - } - it.Release() - - // Mark the bloom filter inited and return - log.Info("Initialized state bloom", "items", b.bloom.N(), "errorrate", b.bloom.FalsePosititveProbability(), "elapsed", common.PrettyDuration(time.Since(start))) - atomic.StoreUint32(&b.inited, 1) -} - -// meter periodically recalculates the false positive error rate of the bloom -// filter and reports it in a metric. -func (b *SyncBloom) meter() { - // check every second - tick := time.NewTicker(1 * time.Second) - defer tick.Stop() - - for { - select { - case <-tick.C: - // Report the current error ration. No floats, lame, scale it up. - bloomErrorGauge.Update(int64(b.bloom.FalsePosititveProbability() * 100000)) - case <-b.closeCh: - return - } - } -} - -// Close terminates any background initializer still running and releases all the -// memory allocated for the bloom. -func (b *SyncBloom) Close() error { - b.closer.Do(func() { - // Ensure the initializer is stopped - atomic.StoreUint32(&b.closed, 1) - close(b.closeCh) - b.pend.Wait() - - // Wipe the bloom, but mark it "uninited" just in case someone attempts an access - log.Info("Deallocated state bloom", "items", b.bloom.N(), "errorrate", b.bloom.FalsePosititveProbability()) - - atomic.StoreUint32(&b.inited, 0) - b.bloom = nil - }) - return nil -} - -// Add inserts a new trie node hash into the bloom filter. -func (b *SyncBloom) Add(hash []byte) { - if atomic.LoadUint32(&b.closed) == 1 { - return - } - b.bloom.AddHash(binary.BigEndian.Uint64(hash)) - bloomAddMeter.Mark(1) -} - -// Contains tests if the bloom filter contains the given hash: -// - false: the bloom definitely does not contain hash -// - true: the bloom maybe contains hash -// -// While the bloom is being initialized, any query will return true. -func (b *SyncBloom) Contains(hash []byte) bool { - bloomTestMeter.Mark(1) - if atomic.LoadUint32(&b.inited) == 0 { - // We didn't load all the trie nodes from the previous run of Geth yet. As - // such, we can't say for sure if a hash is not present for anything. Until - // the init is done, we're faking "possible presence" for everything. - return true - } - // Bloom initialized, check the real one and report any successful misses - maybe := b.bloom.ContainsHash(binary.BigEndian.Uint64(hash)) - if !maybe { - bloomMissMeter.Mark(1) - } - return maybe -} diff --git a/trie/sync_test.go b/trie/sync_test.go index cb3283875d..970730b671 100644 --- a/trie/sync_test.go +++ b/trie/sync_test.go @@ -95,7 +95,7 @@ func TestEmptySync(t *testing.T) { emptyB, _ := New(emptyRoot, dbB) for i, trie := range []*Trie{emptyA, emptyB} { - sync := NewSync(trie.Hash(), memorydb.New(), nil, NewSyncBloom(1, memorydb.New())) + sync := NewSync(trie.Hash(), memorydb.New(), nil) if nodes, paths, codes := sync.Missing(1); len(nodes) != 0 || len(paths) != 0 || len(codes) != 0 { t.Errorf("test %d: content requested for empty trie: %v, %v, %v", i, nodes, paths, codes) } @@ -116,7 +116,7 @@ func testIterativeSync(t *testing.T, count int, bypath bool) { // Create a destination trie and sync with the scheduler diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) + sched := NewSync(srcTrie.Hash(), diskdb, nil) nodes, paths, codes := sched.Missing(count) var ( @@ -177,7 +177,7 @@ func TestIterativeDelayedSync(t *testing.T) { // Create a destination trie and sync with the scheduler diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) + sched := NewSync(srcTrie.Hash(), diskdb, nil) nodes, _, codes := sched.Missing(10000) queue := append(append([]common.Hash{}, nodes...), codes...) @@ -223,7 +223,7 @@ func testIterativeRandomSync(t *testing.T, count int) { // Create a destination trie and sync with the scheduler diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) + sched := NewSync(srcTrie.Hash(), diskdb, nil) queue := make(map[common.Hash]struct{}) nodes, _, codes := sched.Missing(count) @@ -271,7 +271,7 @@ func TestIterativeRandomDelayedSync(t *testing.T) { // Create a destination trie and sync with the scheduler diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) + sched := NewSync(srcTrie.Hash(), diskdb, nil) queue := make(map[common.Hash]struct{}) nodes, _, codes := sched.Missing(10000) @@ -324,7 +324,7 @@ func TestDuplicateAvoidanceSync(t *testing.T) { // Create a destination trie and sync with the scheduler diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) + sched := NewSync(srcTrie.Hash(), diskdb, nil) nodes, _, codes := sched.Missing(0) queue := append(append([]common.Hash{}, nodes...), codes...) @@ -371,7 +371,7 @@ func TestIncompleteSync(t *testing.T) { // Create a destination trie and sync with the scheduler diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) + sched := NewSync(srcTrie.Hash(), diskdb, nil) var added []common.Hash @@ -431,7 +431,7 @@ func TestSyncOrdering(t *testing.T) { // Create a destination trie and sync with the scheduler, tracking the requests diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) + sched := NewSync(srcTrie.Hash(), diskdb, nil) nodes, paths, _ := sched.Missing(1) queue := append([]common.Hash{}, nodes...) From 371a411eb405c14b79b38efb8633dc7095063c88 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 2 Feb 2022 12:22:02 +0530 Subject: [PATCH 002/190] fix: Removed FastSync from cli server --- command/server/config.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/command/server/config.go b/command/server/config.go index c9ffff481d..dfb5909d5f 100644 --- a/command/server/config.go +++ b/command/server/config.go @@ -710,8 +710,6 @@ func (c *Config) buildEth() (*ethconfig.Config, error) { // sync mode. It can either be "fast", "full" or "snap". We disable // for now the "light" mode. switch c.SyncMode { - case "fast": - n.SyncMode = downloader.FastSync case "full": n.SyncMode = downloader.FullSync case "snap": From 2111d4ccdba424b3081cad78c97e4ec145962e62 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 2 Feb 2022 12:23:05 +0530 Subject: [PATCH 003/190] fix: TestHeadersRLPStorage --- core/rawdb/accessors_chain_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/rawdb/accessors_chain_test.go b/core/rawdb/accessors_chain_test.go index d57b9899bf..5d0b257aff 100644 --- a/core/rawdb/accessors_chain_test.go +++ b/core/rawdb/accessors_chain_test.go @@ -913,8 +913,10 @@ func TestHeadersRLPStorage(t *testing.T) { pHash = block.Hash() } var receipts []types.Receipts = make([]types.Receipts, 100) + var borReceipts []types.Receipts = make([]types.Receipts, 100) + // Write first half to ancients - WriteAncientBlocks(db, chain[:50], receipts[:50], big.NewInt(100)) + WriteAncientBlocks(db, chain[:50], receipts[:50], borReceipts[:50], big.NewInt(100)) // Write second half to db for i := 50; i < 100; i++ { WriteCanonicalHash(db, chain[i].Hash(), chain[i].NumberU64()) From 672a15e339808fa716567618351a2e28630ee721 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 2 Feb 2022 15:49:57 +0530 Subject: [PATCH 004/190] Added t.skip(ETH2 in bor) --- eth/catalyst/api_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/eth/catalyst/api_test.go b/eth/catalyst/api_test.go index 6e52c4fea2..1f1f017e5e 100644 --- a/eth/catalyst/api_test.go +++ b/eth/catalyst/api_test.go @@ -44,6 +44,27 @@ var ( testBalance = big.NewInt(2e18) ) +func generateTestChain() (*core.Genesis, []*types.Block) { + db := rawdb.NewMemoryDatabase() + config := params.AllEthashProtocolChanges + genesis := &core.Genesis{ + Config: config, + Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, + ExtraData: []byte("test genesis"), + Timestamp: 9000, + BaseFee: big.NewInt(params.InitialBaseFee), + } + generate := func(i int, g *core.BlockGen) { + g.OffsetTime(5) + g.SetExtra([]byte("test")) + } + gblock := genesis.ToBlock(db) + engine := ethash.NewFaker() + blocks, _ := core.GenerateChain(config, gblock, engine, db, 10, generate) + blocks = append([]*types.Block{gblock}, blocks...) + return genesis, blocks +} + func generatePreMergeChain(n int) (*core.Genesis, []*types.Block) { db := rawdb.NewMemoryDatabase() config := params.AllEthashProtocolChanges @@ -74,6 +95,8 @@ func generatePreMergeChain(n int) (*core.Genesis, []*types.Block) { } func TestEth2AssembleBlock(t *testing.T) { + t.Skip("bor due to burn contract") + genesis, blocks := generatePreMergeChain(10) n, ethservice := startEthService(t, genesis, blocks) defer n.Close() @@ -98,6 +121,8 @@ func TestEth2AssembleBlock(t *testing.T) { } func TestEth2AssembleBlockWithAnotherBlocksTxs(t *testing.T) { + t.Skip("bor due to burn contract") + genesis, blocks := generatePreMergeChain(10) n, ethservice := startEthService(t, genesis, blocks[:9]) defer n.Close() @@ -186,6 +211,8 @@ func checkLogEvents(t *testing.T, logsCh <-chan []*types.Log, rmLogsCh <-chan co } func TestEth2NewBlock(t *testing.T) { + t.Skip("ETH2 in Bor") + genesis, preMergeBlocks := generatePreMergeChain(10) n, ethservice := startEthService(t, genesis, preMergeBlocks) ethservice.Merger().ReachTTD() @@ -357,6 +384,8 @@ func startEthService(t *testing.T, genesis *core.Genesis, blocks []*types.Block) } func TestFullAPI(t *testing.T) { + t.Skip("ETH2 in Bor") + genesis, preMergeBlocks := generatePreMergeChain(10) n, ethservice := startEthService(t, genesis, preMergeBlocks) ethservice.Merger().ReachTTD() From 08509c6882c7bdb0cbbaee896e929d0fb387ba8c Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Wed, 2 Feb 2022 16:42:22 +0530 Subject: [PATCH 005/190] fix: flow in create consensus engine --- eth/ethconfig/config.go | 32 +++++--------------------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 898f28d564..1572377f89 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -227,38 +227,17 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et noverify := ethConfig.Miner.Noverify // If proof-of-authority is requested, set it up - var engine consensus.Engine if chainConfig.Clique != nil { - engine = clique.New(chainConfig.Clique, db) - } else { - switch config.PowMode { - case ethash.ModeFake: - log.Warn("Ethash used in fake mode") - case ethash.ModeTest: - log.Warn("Ethash used in test mode") - case ethash.ModeShared: - log.Warn("Ethash used in shared mode") - } - engine = ethash.New(ethash.Config{ - PowMode: config.PowMode, - CacheDir: stack.ResolvePath(config.CacheDir), - CachesInMem: config.CachesInMem, - CachesOnDisk: config.CachesOnDisk, - CachesLockMmap: config.CachesLockMmap, - DatasetDir: config.DatasetDir, - DatasetsInMem: config.DatasetsInMem, - DatasetsOnDisk: config.DatasetsOnDisk, - DatasetsLockMmap: config.DatasetsLockMmap, - NotifyFull: config.NotifyFull, - }, notify, noverify) - engine.(*ethash.Ethash).SetThreads(-1) // Disable CPU mining + return clique.New(chainConfig.Clique, db) } + // If Matic bor consensus is requested, set it up // In order to pass the ethereum transaction tests, we need to set the burn contract which is in the bor config // Then, bor != nil will also be enabled for ethash and clique. Only enable Bor for real if there is a validator contract present. if chainConfig.Bor != nil && chainConfig.Bor.ValidatorContract != "" { return bor.New(chainConfig, db, blockchainAPI, ethConfig.HeimdallURL, ethConfig.WithoutHeimdall) } + // Otherwise assume proof-of-work switch config.PowMode { case ethash.ModeFake: @@ -268,7 +247,7 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et case ethash.ModeShared: log.Warn("Ethash used in shared mode") } - engine = ethash.New(ethash.Config{ + engine := ethash.New(ethash.Config{ PowMode: config.PowMode, CacheDir: stack.ResolvePath(config.CacheDir), CachesInMem: config.CachesInMem, @@ -280,7 +259,6 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et DatasetsLockMmap: config.DatasetsLockMmap, NotifyFull: config.NotifyFull, }, notify, noverify) - // TODO - Check this - // engine.SetThreads(-1) // Disable CPU mining + engine.SetThreads(-1) // Disable CPU mining return engine } From c8587b0668230c3a549480dc4005f39af26d7a74 Mon Sep 17 00:00:00 2001 From: Sandeep Sreenath Date: Fri, 11 Feb 2022 16:59:24 +0530 Subject: [PATCH 006/190] bumped version --- params/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/params/version.go b/params/version.go index 8b8531046f..fb54d1ace9 100644 --- a/params/version.go +++ b/params/version.go @@ -23,7 +23,7 @@ import ( const ( VersionMajor = 0 // Major version component of the current release VersionMinor = 2 // Minor version component of the current release - VersionPatch = 14 // Patch version component of the current release + VersionPatch = 15 // Patch version component of the current release VersionMeta = "beta-1" // Version metadata to append to the version string ) From 51d17ea43fe7d549e71969a74f8abc049aa2c207 Mon Sep 17 00:00:00 2001 From: Victor Castell Date: Wed, 2 Feb 2022 11:59:17 +0100 Subject: [PATCH 007/190] Fix typo --- .../files/{genesys-testnet-v4.json => genesis-testnet-v4.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename builder/files/{genesys-testnet-v4.json => genesis-testnet-v4.json} (100%) diff --git a/builder/files/genesys-testnet-v4.json b/builder/files/genesis-testnet-v4.json similarity index 100% rename from builder/files/genesys-testnet-v4.json rename to builder/files/genesis-testnet-v4.json From 555e2381882c692f1925494717f2a8428edba67d Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 24 Feb 2022 18:03:32 +0530 Subject: [PATCH 008/190] increase block time --- builder/files/genesis-testnet-v4.json | 6 +- builder/files/genesys-testnet-v4.json | 82 +++++++++++++++++++++++++++ internal/cli/server/chains/mumbai.go | 6 +- params/config.go | 6 +- params/version.go | 2 +- 5 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 builder/files/genesys-testnet-v4.json diff --git a/builder/files/genesis-testnet-v4.json b/builder/files/genesis-testnet-v4.json index 1d68659bdc..0215aee246 100644 --- a/builder/files/genesis-testnet-v4.json +++ b/builder/files/genesis-testnet-v4.json @@ -16,12 +16,14 @@ "bor": { "jaipurBlock": 22770000, "period": { - "0": 2 + "0": 2, + "25275000": 5 }, "producerDelay": 6, "sprint": 64, "backupMultiplier": { - "0": 2 + "0": 2, + "25275000": 5 }, "validatorContract": "0x0000000000000000000000000000000000001000", "stateReceiverContract": "0x0000000000000000000000000000000000001001", diff --git a/builder/files/genesys-testnet-v4.json b/builder/files/genesys-testnet-v4.json new file mode 100644 index 0000000000..0215aee246 --- /dev/null +++ b/builder/files/genesys-testnet-v4.json @@ -0,0 +1,82 @@ +{ + "config": { + "chainId": 80001, + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 2722000, + "muirGlacierBlock": 2722000, + "berlinBlock": 13996000, + "londonBlock": 22640000, + "bor": { + "jaipurBlock": 22770000, + "period": { + "0": 2, + "25275000": 5 + }, + "producerDelay": 6, + "sprint": 64, + "backupMultiplier": { + "0": 2, + "25275000": 5 + }, + "validatorContract": "0x0000000000000000000000000000000000001000", + "stateReceiverContract": "0x0000000000000000000000000000000000001001", + "burntContract": { + "22640000": "0x70bcA57F4579f58670aB2d18Ef16e02C17553C38" + }, + "blockAlloc": { + "22244000": { + "0000000000000000000000000000000000001010": { + "balance": "0x0", + "code": "0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610caa565b005b3480156103eb57600080fd5b506103f4610dfc565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e05565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fc1565b005b3480156104e857600080fd5b506104f1611090565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b506105486110b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110dc565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b506106046110fd565b005b34801561061257600080fd5b5061061b6111cd565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506111d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b50610758611358565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af611381565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de6113d8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e611411565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061144e565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b50610964611474565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b8101908080359060200190929190505050611501565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611521565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a65611541565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a90611548565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb61154e565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115db565b005b348015610b2e57600080fd5b50610b376115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b60003390506000610cba826110dc565b9050610cd18360065461161e90919063ffffffff16565b600681905550600083118015610ce657508234145b610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610dd4876110dc565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610e0d611381565b610e1657600080fd5b600081118015610e535750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611da96023913960400191505060405180910390fd5b6000610eb3836110dc565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610f00573d6000803e3d6000fd5b50610f168360065461163e90919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f68585610f98896110dc565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611027576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611d866023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061108c8261165d565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b611105611381565b61110e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b60008060008060418551146111ee5760009350505050611352565b602085015192506040850151915060ff6041860151169050601b8160ff16101561121957601b810190505b601b8160ff16141580156112315750601c8160ff1614155b156112425760009350505050611352565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561129f573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b6000813414611460576000905061146e565b61146b338484611755565b90505b92915050565b6040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b602083106114c357805182526020820191506020810190506020830392506114a0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061153761153286868686611b12565b611be8565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611dcc605291396040516020018082805190602001908083835b6020831061159d578051825260208201915060208101905060208303925061157a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b6115e3611381565b6115ec57600080fd5b6115f58161165d565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282111561162d57600080fd5b600082840390508091505092915050565b60008082840190508381101561165357600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561169757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b810190808051906020019092919050505090506118d9868686611c32565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d6020811015611a0b57600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b6000806040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b60208310611b645780518252602082019150602081019050602083039250611b41565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e27742073656e6420746f204d524332300000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d1a573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a72315820ccd6c2a9c259832bbb367986ee06cd87af23022681b0cb22311a864b701d939564736f6c63430005100032" + } + } + } + } + }, + "nonce": "0x0", + "timestamp": "0x5ce28211", + "extraData": "", + "gasLimit": "0x989680", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0000000000000000000000000000000000001000": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806360c8614d1161010f578063af26aa96116100a2578063d5b844eb11610071578063d5b844eb14610666578063dcf2793a14610684578063e3b7c924146106b6578063f59cf565146106d4576101f0565b8063af26aa96146105c7578063b71d7a69146105e7578063b7ab4db514610617578063c1b3c91914610636576101f0565b806370ba5707116100de57806370ba57071461052b57806398ab2b621461055b5780639d11b80714610579578063ae756451146105a9576101f0565b806360c8614d1461049c57806365b3a1e2146104bc57806366332354146104db578063687a9bd6146104f9576101f0565b80633434735f1161018757806344d6528f1161015657806344d6528f146103ee5780634dbc959f1461041e57806355614fcc1461043c578063582a8d081461046c576101f0565b80633434735f1461035257806335ddfeea1461037057806343ee8213146103a057806344c15cb1146103be576101f0565b806323f2a73f116101c357806323f2a73f146102a45780632bc06564146102d45780632de3a180146102f25780632eddf35214610322576101f0565b8063047a6c5b146101f55780630c35b1cb146102275780631270b5741461025857806323c2a2b414610288575b600080fd5b61020f600480360361020a9190810190612b24565b610706565b60405161021e93929190613463565b60405180910390f35b610241600480360361023c9190810190612b24565b61075d565b60405161024f929190613284565b60405180910390f35b610272600480360361026d9190810190612b4d565b610939565b60405161027f91906132bb565b60405180910390f35b6102a2600480360361029d9190810190612c2c565b610a91565b005b6102be60048036036102b99190810190612b4d565b61112a565b6040516102cb91906132bb565b60405180910390f35b6102dc611281565b6040516102e99190613411565b60405180910390f35b61030c60048036036103079190810190612a81565b611286565b60405161031991906132d6565b60405180910390f35b61033c60048036036103379190810190612b24565b611307565b6040516103499190613411565b60405180910390f35b61035a611437565b6040516103679190613269565b60405180910390f35b61038a60048036036103859190810190612abd565b61144f565b60405161039791906132bb565b60405180910390f35b6103a861151a565b6040516103b591906132d6565b60405180910390f35b6103d860048036036103d39190810190612b89565b611531565b6040516103e59190613411565b60405180910390f35b61040860048036036104039190810190612b4d565b611619565b60405161041591906133f6565b60405180910390f35b610426611781565b6040516104339190613411565b60405180910390f35b61045660048036036104519190810190612a06565b611791565b60405161046391906132bb565b60405180910390f35b61048660048036036104819190810190612a2f565b6117ab565b60405161049391906132d6565b60405180910390f35b6104a4611829565b6040516104b393929190613463565b60405180910390f35b6104c461189d565b6040516104d2929190613284565b60405180910390f35b6104e3611b6e565b6040516104f09190613411565b60405180910390f35b610513600480360361050e9190810190612bf0565b611b73565b6040516105229392919061342c565b60405180910390f35b61054560048036036105409190810190612a06565b611bd7565b60405161055291906132bb565b60405180910390f35b610563611bf1565b60405161057091906132d6565b60405180910390f35b610593600480360361058e9190810190612b24565b611c08565b6040516105a09190613411565b60405180910390f35b6105b1611d39565b6040516105be91906132d6565b60405180910390f35b6105cf611d50565b6040516105de93929190613463565b60405180910390f35b61060160048036036105fc9190810190612b24565b611db1565b60405161060e9190613411565b60405180910390f35b61061f611eb1565b60405161062d929190613284565b60405180910390f35b610650600480360361064b9190810190612b24565b611ec5565b60405161065d9190613411565b60405180910390f35b61066e611ee6565b60405161067b919061349a565b60405180910390f35b61069e60048036036106999190810190612bf0565b611eeb565b6040516106ad9392919061342c565b60405180910390f35b6106be611f4f565b6040516106cb9190613411565b60405180910390f35b6106ee60048036036106e99190810190612b24565b611f61565b6040516106fd93929190613463565b60405180910390f35b60008060006002600085815260200190815260200160002060000154600260008681526020019081526020016000206001015460026000878152602001908152602001600020600201549250925092509193909250565b60608060ff83116107795761077061189d565b91509150610934565b600061078484611db1565b9050606060016000838152602001908152602001600020805490506040519080825280602002602001820160405280156107cd5781602001602082028038833980820191505090505b509050606060016000848152602001908152602001600020805490506040519080825280602002602001820160405280156108175781602001602082028038833980820191505090505b50905060008090505b60016000858152602001908152602001600020805490508110156109295760016000858152602001908152602001600020818154811061085c57fe5b906000526020600020906003020160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061089a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600085815260200190815260200160002081815481106108f257fe5b90600052602060002090600302016001015482828151811061091057fe5b6020026020010181815250508080600101915050610820565b508181945094505050505b915091565b6000606060016000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a0c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190610970565b50505050905060008090505b8151811015610a84578373ffffffffffffffffffffffffffffffffffffffff16828281518110610a4457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff161415610a7757600192505050610a8b565b8080600101915050610a18565b5060009150505b92915050565b73fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906133d6565b60405180910390fd5b6000610b1d611781565b90506000811415610b3157610b30611f8b565b5b610b456001826122ac90919063ffffffff16565b8814610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90613356565b60405180910390fd5b868611610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906133b6565b60405180910390fd5b6000604060018989030181610bd957fe5b0614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613396565b60405180910390fd5b8660026000838152602001908152602001600020600101541115610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90613336565b60405180910390fd5b6000600260008a81526020019081526020016000206000015414610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613376565b60405180910390fd5b604051806060016040528089815260200188815260200187815250600260008a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600388908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008a815260200190815260200160002081610d669190612800565b506000600160008a815260200190815260200160002081610d879190612800565b506060610ddf610dda87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b8151811015610f51576060610e0e838381518110610e0157fe5b60200260200101516122f9565b90506000808c81526020019081526020016000208054809190600101610e349190612800565b506040518060600160405280610e5d83600081518110610e5057fe5b60200260200101516123d6565b8152602001610e7f83600181518110610e7257fe5b60200260200101516123d6565b8152602001610ea183600281518110610e9457fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff168152506000808d81526020019081526020016000208381548110610ed757fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610de7565b506060610fa9610fa486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b815181101561111d576060610fd8838381518110610fcb57fe5b60200260200101516122f9565b9050600160008d81526020019081526020016000208054809190600101610fff9190612800565b5060405180606001604052806110288360008151811061101b57fe5b60200260200101516123d6565b815260200161104a8360018151811061103d57fe5b60200260200101516123d6565b815260200161106c8360028151811061105f57fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff16815250600160008e815260200190815260200160002083815481106110a357fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610fb1565b5050505050505050505050565b60006060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156111fc578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611160565b50505050905060008090505b8151811015611274578373ffffffffffffffffffffffffffffffffffffffff1682828151811061123457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff1614156112675760019250505061127b565b8080600101915050611208565b5060009150505b92915050565b604081565b60006002600160f81b84846040516020016112a3939291906131d6565b6040516020818303038152906040526040516112bf9190613213565b602060405180830381855afa1580156112dc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506112ff9190810190612a58565b905092915050565b60006060600080848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156113d9578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508152602001906001019061133d565b505050509050600080905060008090505b825181101561142c5761141d83828151811061140257fe5b602002602001015160200151836122ac90919063ffffffff16565b915080806001019150506113ea565b508092505050919050565b73fffffffffffffffffffffffffffffffffffffffe81565b600080600080859050600060218087518161146657fe5b04029050600081111561147f5761147c876117ab565b91505b6000602190505b818111611509576000600182038801519050818801519550806000602081106114ab57fe5b1a60f81b9450600060f81b857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156114f0576114e98685611286565b93506114fd565b6114fa8487611286565b93505b50602181019050611486565b508782149450505050509392505050565b60405161152690613254565b604051809103902081565b60008060009050600080905060008090505b84518167ffffffffffffffff16101561160c57606061156e868367ffffffffffffffff16604161246a565b9050600061158582896124f690919063ffffffff16565b905061158f612832565b6115998a83611619565b90506115a58a8361112a565b80156115dc57508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16115b156115fe578194506115fb8160200151876122ac90919063ffffffff16565b95505b505050604181019050611543565b5081925050509392505050565b611621612832565b6060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156116f1578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611655565b50505050905060008090505b8151811015611779578373ffffffffffffffffffffffffffffffffffffffff1682828151811061172957fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff16141561176c5781818151811061175d57fe5b60200260200101519250611779565b80806001019150506116fd565b505092915050565b600061178c43611db1565b905090565b60006117a461179e611781565b8361112a565b9050919050565b60006002600060f81b836040516020016117c69291906131aa565b6040516020818303038152906040526040516117e29190613213565b602060405180830381855afa1580156117ff573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506118229190810190612a58565b9050919050565b60008060008061184a600161183c611781565b6122ac90919063ffffffff16565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b606080606060056040519080825280602002602001820160405280156118d25781602001602082028038833980820191505090505b50905073c26880a0af2ea0c7e8130e6ec47af756465452e8816000815181106118f757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073be188d6641e8b680743a4815dfa0f6208038960f8160018151811061195357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c275dc8be39f50d12f66b6a63629c39da5bae5bd816002815181106119af57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073f903ba9e006193c1527bfbe65fe2123704ea3f9981600381518110611a0b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073928ed6a3e94437bbd316ccad78479f1d163a6a8c81600481518110611a6757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606005604051908082528060200260200182016040528015611ad35781602001602082028038833980820191505090505b50905061271081600081518110611ae657fe5b60200260200101818152505061271081600181518110611b0257fe5b60200260200101818152505061271081600281518110611b1e57fe5b60200260200101818152505061271081600381518110611b3a57fe5b60200260200101818152505061271081600481518110611b5657fe5b60200260200101818152505081819350935050509091565b60ff81565b60016020528160005260406000208181548110611b8c57fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b6000611bea611be4611781565b83610939565b9050919050565b604051611bfd9061322a565b604051809103902081565b6000606060016000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611cdb578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611c3f565b505050509050600080905060008090505b8251811015611d2e57611d1f838281518110611d0457fe5b602002602001015160200151836122ac90919063ffffffff16565b91508080600101915050611cec565b508092505050919050565b604051611d459061323f565b604051809103902081565b600080600080611d5e611781565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b60008060038054905090505b6000811115611e7157611dce612869565b6002600060036001850381548110611de257fe5b906000526020600020015481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905083816020015111158015611e3f57506000816040015114155b8015611e4f575080604001518411155b15611e6257806000015192505050611eac565b50808060019003915050611dbd565b5060006003805490501115611ea757600360016003805490500381548110611e9557fe5b90600052602060002001549050611eac565b600090505b919050565b606080611ebd4361075d565b915091509091565b60038181548110611ed257fe5b906000526020600020016000915090505481565b600281565b60006020528160005260406000208181548110611f0457fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b600060404381611f5b57fe5b04905090565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b606080611f9661189d565b8092508193505050600080905060405180606001604052808281526020016000815260200160ff81525060026000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600381908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008381526020019081526020016000208161203f9190612800565b50600060016000838152602001908152602001600020816120609190612800565b5060008090505b83518110156121825760008083815260200190815260200160002080548091906001016120949190612800565b5060405180606001604052808281526020018483815181106120b257fe5b602002602001015181526020018583815181106120cb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815250600080848152602001908152602001600020828154811061210957fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612067565b5060008090505b83518110156122a6576001600083815260200190815260200160002080548091906001016121b79190612800565b5060405180606001604052808281526020018483815181106121d557fe5b602002602001015181526020018583815181106121ee57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681525060016000848152602001908152602001600020828154811061222d57fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612189565b50505050565b6000808284019050838110156122c157600080fd5b8091505092915050565b6122d361288a565b600060208301905060405180604001604052808451815260200182815250915050919050565b606061230482612600565b61230d57600080fd5b60006123188361264e565b905060608160405190808252806020026020018201604052801561235657816020015b6123436128a4565b81526020019060019003908161233b5790505b509050600061236885602001516126bf565b8560200151019050600080600090505b848110156123c95761238983612748565b91506040518060400160405280838152602001848152508482815181106123ac57fe5b602002602001018190525081830192508080600101915050612378565b5082945050505050919050565b60008082600001511180156123f057506021826000015111155b6123f957600080fd5b600061240883602001516126bf565b9050600081846000015103905060008083866020015101905080519150602083101561243b57826020036101000a820491505b81945050505050919050565b6000601582600001511461245a57600080fd5b612463826123d6565b9050919050565b60608183018451101561247c57600080fd5b6060821560008114612499576040519150602082016040526124ea565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156124d757805183526020830192506020810190506124ba565b50868552601f19601f8301166040525050505b50809150509392505050565b600080600080604185511461251157600093505050506125fa565b602085015192506040850151915060ff6041860151169050601b8160ff16101561253c57601b810190505b601b8160ff16141580156125545750601c8160ff1614155b1561256557600093505050506125fa565b60006001878386866040516000815260200160405260405161258a94939291906132f1565b6020604051602081039080840390855afa1580156125ac573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125f257600080fd5b809450505050505b92915050565b600080826000015114156126175760009050612649565b60008083602001519050805160001a915060c060ff168260ff16101561264257600092505050612649565b6001925050505b919050565b6000808260000151141561266557600090506126ba565b6000809050600061267984602001516126bf565b84602001510190506000846000015185602001510190505b808210156126b3576126a282612748565b820191508280600101935050612691565b8293505050505b919050565b600080825160001a9050608060ff168110156126df576000915050612743565b60b860ff16811080612704575060c060ff168110158015612703575060f860ff1681105b5b15612713576001915050612743565b60c060ff168110156127335760018060b80360ff16820301915050612743565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561276957600191506127f6565b60b860ff16811015612786576001608060ff1682030191506127f5565b60c060ff168110156127b65760b78103600185019450806020036101000a855104600182018101935050506127f4565b60f860ff168110156127d357600160c060ff1682030191506127f3565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b81548183558181111561282d5760030281600302836000526020600020918201910161282c91906128be565b5b505050565b60405180606001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180606001604052806000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604051806040016040528060008152602001600081525090565b61291191905b8082111561290d5760008082016000905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506003016128c4565b5090565b90565b60008135905061292381613693565b92915050565b600081359050612938816136aa565b92915050565b60008151905061294d816136aa565b92915050565b60008083601f84011261296557600080fd5b8235905067ffffffffffffffff81111561297e57600080fd5b60208301915083600182028301111561299657600080fd5b9250929050565b600082601f8301126129ae57600080fd5b81356129c16129bc826134e2565b6134b5565b915080825260208301602083018583830111156129dd57600080fd5b6129e883828461363d565b50505092915050565b600081359050612a00816136c1565b92915050565b600060208284031215612a1857600080fd5b6000612a2684828501612914565b91505092915050565b600060208284031215612a4157600080fd5b6000612a4f84828501612929565b91505092915050565b600060208284031215612a6a57600080fd5b6000612a788482850161293e565b91505092915050565b60008060408385031215612a9457600080fd5b6000612aa285828601612929565b9250506020612ab385828601612929565b9150509250929050565b600080600060608486031215612ad257600080fd5b6000612ae086828701612929565b9350506020612af186828701612929565b925050604084013567ffffffffffffffff811115612b0e57600080fd5b612b1a8682870161299d565b9150509250925092565b600060208284031215612b3657600080fd5b6000612b44848285016129f1565b91505092915050565b60008060408385031215612b6057600080fd5b6000612b6e858286016129f1565b9250506020612b7f85828601612914565b9150509250929050565b600080600060608486031215612b9e57600080fd5b6000612bac868287016129f1565b9350506020612bbd86828701612929565b925050604084013567ffffffffffffffff811115612bda57600080fd5b612be68682870161299d565b9150509250925092565b60008060408385031215612c0357600080fd5b6000612c11858286016129f1565b9250506020612c22858286016129f1565b9150509250929050565b600080600080600080600060a0888a031215612c4757600080fd5b6000612c558a828b016129f1565b9750506020612c668a828b016129f1565b9650506040612c778a828b016129f1565b955050606088013567ffffffffffffffff811115612c9457600080fd5b612ca08a828b01612953565b9450945050608088013567ffffffffffffffff811115612cbf57600080fd5b612ccb8a828b01612953565b925092505092959891949750929550565b6000612ce88383612d0c565b60208301905092915050565b6000612d00838361317d565b60208301905092915050565b612d15816135b2565b82525050565b612d24816135b2565b82525050565b6000612d358261352e565b612d3f8185613569565b9350612d4a8361350e565b8060005b83811015612d7b578151612d628882612cdc565b9750612d6d8361354f565b925050600181019050612d4e565b5085935050505092915050565b6000612d9382613539565b612d9d818561357a565b9350612da88361351e565b8060005b83811015612dd9578151612dc08882612cf4565b9750612dcb8361355c565b925050600181019050612dac565b5085935050505092915050565b612def816135c4565b82525050565b612e06612e01826135d0565b61367f565b82525050565b612e15816135fc565b82525050565b612e2c612e27826135fc565b613689565b82525050565b6000612e3d82613544565b612e47818561358b565b9350612e5781856020860161364c565b80840191505092915050565b6000612e706004836135a7565b91507f766f7465000000000000000000000000000000000000000000000000000000006000830152600482019050919050565b6000612eb0602d83613596565b91507f537461727420626c6f636b206d7573742062652067726561746572207468616e60008301527f2063757272656e74207370616e000000000000000000000000000000000000006020830152604082019050919050565b6000612f16600f83613596565b91507f496e76616c6964207370616e20696400000000000000000000000000000000006000830152602082019050919050565b6000612f56601383613596565b91507f5370616e20616c726561647920657869737473000000000000000000000000006000830152602082019050919050565b6000612f96604583613596565b91507f446966666572656e6365206265747765656e20737461727420616e6420656e6460008301527f20626c6f636b206d75737420626520696e206d756c7469706c6573206f66207360208301527f7072696e740000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613022602a83613596565b91507f456e6420626c6f636b206d7573742062652067726561746572207468616e207360008301527f7461727420626c6f636b000000000000000000000000000000000000000000006020830152604082019050919050565b6000613088601283613596565b91507f4e6f742053797374656d204164646573732100000000000000000000000000006000830152602082019050919050565b60006130c86005836135a7565b91507f38303030310000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613108600e836135a7565b91507f6865696d64616c6c2d38303030310000000000000000000000000000000000006000830152600e82019050919050565b606082016000820151613151600085018261317d565b506020820151613164602085018261317d565b5060408201516131776040850182612d0c565b50505050565b61318681613626565b82525050565b61319581613626565b82525050565b6131a481613630565b82525050565b60006131b68285612df5565b6001820191506131c68284612e1b565b6020820191508190509392505050565b60006131e28286612df5565b6001820191506131f28285612e1b565b6020820191506132028284612e1b565b602082019150819050949350505050565b600061321f8284612e32565b915081905092915050565b600061323582612e63565b9150819050919050565b600061324a826130bb565b9150819050919050565b600061325f826130fb565b9150819050919050565b600060208201905061327e6000830184612d1b565b92915050565b6000604082019050818103600083015261329e8185612d2a565b905081810360208301526132b28184612d88565b90509392505050565b60006020820190506132d06000830184612de6565b92915050565b60006020820190506132eb6000830184612e0c565b92915050565b60006080820190506133066000830187612e0c565b613313602083018661319b565b6133206040830185612e0c565b61332d6060830184612e0c565b95945050505050565b6000602082019050818103600083015261334f81612ea3565b9050919050565b6000602082019050818103600083015261336f81612f09565b9050919050565b6000602082019050818103600083015261338f81612f49565b9050919050565b600060208201905081810360008301526133af81612f89565b9050919050565b600060208201905081810360008301526133cf81613015565b9050919050565b600060208201905081810360008301526133ef8161307b565b9050919050565b600060608201905061340b600083018461313b565b92915050565b6000602082019050613426600083018461318c565b92915050565b6000606082019050613441600083018661318c565b61344e602083018561318c565b61345b6040830184612d1b565b949350505050565b6000606082019050613478600083018661318c565b613485602083018561318c565b613492604083018461318c565b949350505050565b60006020820190506134af600083018461319b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156134d857600080fd5b8060405250919050565b600067ffffffffffffffff8211156134f957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006135bd82613606565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561366a57808201518184015260208101905061364f565b83811115613679576000848401525b50505050565b6000819050919050565b6000819050919050565b61369c816135b2565b81146136a757600080fd5b50565b6136b3816135fc565b81146136be57600080fd5b50565b6136ca81613626565b81146136d557600080fd5b5056fea365627a7a723158208f52ee07630ffe523cc6ad3e15f437f973dcfa36729cd697f9b0fc4a145a48f06c6578706572696d656e74616cf564736f6c634300050b0040" + }, + "0000000000000000000000000000000000001001": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806319494a17146100465780633434735f146100e15780635407ca671461012b575b600080fd5b6100c76004803603604081101561005c57600080fd5b81019080803590602001909291908035906020019064010000000081111561008357600080fd5b82018360208201111561009557600080fd5b803590602001918460018302840111640100000000831117156100b757600080fd5b9091929391929390505050610149565b604051808215151515815260200191505060405180910390f35b6100e961047a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610133610492565b6040518082815260200191505060405180910390f35b600073fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f742053797374656d2041646465737321000000000000000000000000000081525060200191505060405180910390fd5b606061025761025285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610498565b6104c6565b905060006102788260008151811061026b57fe5b60200260200101516105a3565b905080600160005401146102f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f537461746549647320617265206e6f742073657175656e7469616c000000000081525060200191505060405180910390fd5b600080815480929190600101919050555060006103248360018151811061031757fe5b6020026020010151610614565b905060606103458460028151811061033857fe5b6020026020010151610637565b9050610350826106c3565b1561046f576000624c4b409050606084836040516024018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103aa57808201518184015260208101905061038f565b50505050905090810190601f1680156103d75780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f26c53bea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008082516020840160008887f1965050505b505050509392505050565b73fffffffffffffffffffffffffffffffffffffffe81565b60005481565b6104a0610943565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606104d1826106dc565b6104da57600080fd5b60006104e58361072a565b905060608160405190808252806020026020018201604052801561052357816020015b61051061095d565b8152602001906001900390816105085790505b5090506000610535856020015161079b565b8560200151019050600080600090505b848110156105965761055683610824565b915060405180604001604052808381526020018481525084828151811061057957fe5b602002602001018190525081830192508080600101915050610545565b5082945050505050919050565b60008082600001511180156105bd57506021826000015111155b6105c657600080fd5b60006105d5836020015161079b565b9050600081846000015103905060008083866020015101905080519150602083101561060857826020036101000a820491505b81945050505050919050565b6000601582600001511461062757600080fd5b610630826105a3565b9050919050565b6060600082600001511161064a57600080fd5b6000610659836020015161079b565b905060008184600001510390506060816040519080825280601f01601f19166020018201604052801561069b5781602001600182028038833980820191505090505b50905060008160200190506106b78487602001510182856108dc565b81945050505050919050565b600080823b905060008163ffffffff1611915050919050565b600080826000015114156106f35760009050610725565b60008083602001519050805160001a915060c060ff168260ff16101561071e57600092505050610725565b6001925050505b919050565b600080826000015114156107415760009050610796565b60008090506000610755846020015161079b565b84602001510190506000846000015185602001510190505b8082101561078f5761077e82610824565b82019150828060010193505061076d565b8293505050505b919050565b600080825160001a9050608060ff168110156107bb57600091505061081f565b60b860ff168110806107e0575060c060ff1681101580156107df575060f860ff1681105b5b156107ef57600191505061081f565b60c060ff1681101561080f5760018060b80360ff1682030191505061081f565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561084557600191506108d2565b60b860ff16811015610862576001608060ff1682030191506108d1565b60c060ff168110156108925760b78103600185019450806020036101000a855104600182018101935050506108d0565b60f860ff168110156108af57600160c060ff1682030191506108cf565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156108ea5761093e565b5b602060ff16811061091a5782518252602060ff1683019250602060ff1682019150602060ff16810390506108eb565b6000600182602060ff16036101000a03905080198451168184511681811785525050505b505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fea265627a7a7231582083fbdacb76f32b4112d0f7db9a596937925824798a0026ba0232322390b5263764736f6c634300050b0032" + }, + "0000000000000000000000000000000000001010": { + "balance": "0x204fcd4f31349d83b6e00000", + "code": "0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610e06565b005b3480156103eb57600080fd5b506103f4610f58565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f61565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061111d565b005b3480156104e857600080fd5b506104f16111ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b50610548611212565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611238565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b50610604611259565b005b34801561061257600080fd5b5061061b611329565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061132f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b506107586114b4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af6114dd565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de611534565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e61156d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115aa565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b506109646115d0565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b810190808035906020019092919050505061165d565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061167d565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a6561169d565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a906116a4565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb6116aa565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611737565b005b348015610b2e57600080fd5b50610b37611754565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b6000808511610c4857600080fd5b6000831480610c575750824311155b610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5369676e6174757265206973206578706972656400000000000000000000000081525060200191505060405180910390fd5b6000610cd73387878761167d565b9050600015156005600083815260200190815260200160002060009054906101000a900460ff16151514610d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f536967206465616374697661746564000000000000000000000000000000000081525060200191505060405180910390fd5b60016005600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610ded8189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061132f565b9150610dfa82848861177a565b50509695505050505050565b60003390506000610e1682611238565b9050610e2d83600654611b3790919063ffffffff16565b600681905550600083118015610e4257508234145b610eb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610f3087611238565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610f696114dd565b610f7257600080fd5b600081118015610faf5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e636023913960400191505060405180910390fd5b600061100f83611238565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561105c573d6000803e3d6000fd5b5061107283600654611b5790919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f685856110f489611238565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611183576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e406023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111e882611b76565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b6112616114dd565b61126a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b600080600080604185511461134a57600093505050506114ae565b602085015192506040850151915060ff6041860151169050601b8160ff16101561137557601b810190505b601b8160ff161415801561138d5750601c8160ff1614155b1561139e57600093505050506114ae565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113fb573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b60008134146115bc57600090506115ca565b6115c733848461177a565b90505b92915050565b6040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b6020831061161f57805182526020820191506020810190506020830392506115fc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061169361168e86868686611c6e565b611d44565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611e86605291396040516020018082805190602001908083835b602083106116f957805182526020820191506020810190506020830392506116d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b61173f6114dd565b61174857600080fd5b61175181611b76565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117fa57600080fd5b505afa15801561180e573d6000803e3d6000fd5b505050506040513d602081101561182457600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118b657600080fd5b505afa1580156118ca573d6000803e3d6000fd5b505050506040513d60208110156118e057600080fd5b810190808051906020019092919050505090506118fe868686611d8e565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d6020811015611a3057600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611abe57600080fd5b505afa158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b600082821115611b4657600080fd5b600082840390508091505092915050565b600080828401905083811015611b6c57600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bb057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b60208310611cc05780518252602082019150602081019050602083039250611c9d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611dd4573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a723158208f81700133738d766ae3d68af591ad588b0125bd91449192179f460893f79f6b64736f6c634300050b0032" + }, + "C26880A0AF2EA0c7E8130e6EC47Af756465452E8": { + "balance": "0x3635c9adc5dea00000" + }, + "be188D6641E8b680743A4815dFA0f6208038960F": { + "balance": "0x3635c9adc5dea00000" + }, + "c275DC8bE39f50D12F66B6a63629C39dA5BAe5bd": { + "balance": "0x3635c9adc5dea00000" + }, + "F903ba9E006193c1527BfBe65fe2123704EA3F99": { + "balance": "0x3635c9adc5dea00000" + }, + "928Ed6A3e94437bbd316cCAD78479f1d163A6A8C": { + "balance": "0x3635c9adc5dea00000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} diff --git a/internal/cli/server/chains/mumbai.go b/internal/cli/server/chains/mumbai.go index 4d250dbf2b..1343230b95 100644 --- a/internal/cli/server/chains/mumbai.go +++ b/internal/cli/server/chains/mumbai.go @@ -31,12 +31,14 @@ var mumbaiTestnet = &Chain{ Bor: ¶ms.BorConfig{ JaipurBlock: 22770000, Period: map[string]uint64{ - "0": 2, + "0": 2, + "25275000": 5, }, ProducerDelay: 6, Sprint: 64, BackupMultiplier: map[string]uint64{ - "0": 2, + "0": 2, + "25275000": 5, }, ValidatorContract: "0x0000000000000000000000000000000000001000", StateReceiverContract: "0x0000000000000000000000000000000000001001", diff --git a/params/config.go b/params/config.go index 3c461a8e57..16bac00ddf 100644 --- a/params/config.go +++ b/params/config.go @@ -309,12 +309,14 @@ var ( Bor: &BorConfig{ JaipurBlock: 22770000, Period: map[string]uint64{ - "0": 2, + "0": 2, + "25275000": 5, }, ProducerDelay: 6, Sprint: 64, BackupMultiplier: map[string]uint64{ - "0": 2, + "0": 2, + "25275000": 5, }, ValidatorContract: "0x0000000000000000000000000000000000001000", StateReceiverContract: "0x0000000000000000000000000000000000001001", diff --git a/params/version.go b/params/version.go index fb54d1ace9..c9261a745d 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ const ( VersionMajor = 0 // Major version component of the current release VersionMinor = 2 // Minor version component of the current release VersionPatch = 15 // Patch version component of the current release - VersionMeta = "beta-1" // Version metadata to append to the version string + VersionMeta = "beta-2" // Version metadata to append to the version string ) // Version holds the textual version string. From 111a204bbaa0d6b1e94fa58a56c00dab8adc1652 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 24 Feb 2022 18:04:00 +0530 Subject: [PATCH 009/190] remove file --- builder/files/genesys-testnet-v4.json | 82 --------------------------- 1 file changed, 82 deletions(-) delete mode 100644 builder/files/genesys-testnet-v4.json diff --git a/builder/files/genesys-testnet-v4.json b/builder/files/genesys-testnet-v4.json deleted file mode 100644 index 0215aee246..0000000000 --- a/builder/files/genesys-testnet-v4.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "config": { - "chainId": 80001, - "homesteadBlock": 0, - "eip150Block": 0, - "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 2722000, - "muirGlacierBlock": 2722000, - "berlinBlock": 13996000, - "londonBlock": 22640000, - "bor": { - "jaipurBlock": 22770000, - "period": { - "0": 2, - "25275000": 5 - }, - "producerDelay": 6, - "sprint": 64, - "backupMultiplier": { - "0": 2, - "25275000": 5 - }, - "validatorContract": "0x0000000000000000000000000000000000001000", - "stateReceiverContract": "0x0000000000000000000000000000000000001001", - "burntContract": { - "22640000": "0x70bcA57F4579f58670aB2d18Ef16e02C17553C38" - }, - "blockAlloc": { - "22244000": { - "0000000000000000000000000000000000001010": { - "balance": "0x0", - "code": "0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610caa565b005b3480156103eb57600080fd5b506103f4610dfc565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e05565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fc1565b005b3480156104e857600080fd5b506104f1611090565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b506105486110b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110dc565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b506106046110fd565b005b34801561061257600080fd5b5061061b6111cd565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506111d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b50610758611358565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af611381565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de6113d8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e611411565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061144e565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b50610964611474565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b8101908080359060200190929190505050611501565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611521565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a65611541565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a90611548565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb61154e565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115db565b005b348015610b2e57600080fd5b50610b376115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b60003390506000610cba826110dc565b9050610cd18360065461161e90919063ffffffff16565b600681905550600083118015610ce657508234145b610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610dd4876110dc565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610e0d611381565b610e1657600080fd5b600081118015610e535750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611da96023913960400191505060405180910390fd5b6000610eb3836110dc565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610f00573d6000803e3d6000fd5b50610f168360065461163e90919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f68585610f98896110dc565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611027576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611d866023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061108c8261165d565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b611105611381565b61110e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b60008060008060418551146111ee5760009350505050611352565b602085015192506040850151915060ff6041860151169050601b8160ff16101561121957601b810190505b601b8160ff16141580156112315750601c8160ff1614155b156112425760009350505050611352565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561129f573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b6000813414611460576000905061146e565b61146b338484611755565b90505b92915050565b6040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b602083106114c357805182526020820191506020810190506020830392506114a0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061153761153286868686611b12565b611be8565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611dcc605291396040516020018082805190602001908083835b6020831061159d578051825260208201915060208101905060208303925061157a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b6115e3611381565b6115ec57600080fd5b6115f58161165d565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282111561162d57600080fd5b600082840390508091505092915050565b60008082840190508381101561165357600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561169757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b810190808051906020019092919050505090506118d9868686611c32565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d6020811015611a0b57600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b6000806040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b60208310611b645780518252602082019150602081019050602083039250611b41565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e27742073656e6420746f204d524332300000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d1a573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a72315820ccd6c2a9c259832bbb367986ee06cd87af23022681b0cb22311a864b701d939564736f6c63430005100032" - } - } - } - } - }, - "nonce": "0x0", - "timestamp": "0x5ce28211", - "extraData": "", - "gasLimit": "0x989680", - "difficulty": "0x1", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "0000000000000000000000000000000000001000": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806360c8614d1161010f578063af26aa96116100a2578063d5b844eb11610071578063d5b844eb14610666578063dcf2793a14610684578063e3b7c924146106b6578063f59cf565146106d4576101f0565b8063af26aa96146105c7578063b71d7a69146105e7578063b7ab4db514610617578063c1b3c91914610636576101f0565b806370ba5707116100de57806370ba57071461052b57806398ab2b621461055b5780639d11b80714610579578063ae756451146105a9576101f0565b806360c8614d1461049c57806365b3a1e2146104bc57806366332354146104db578063687a9bd6146104f9576101f0565b80633434735f1161018757806344d6528f1161015657806344d6528f146103ee5780634dbc959f1461041e57806355614fcc1461043c578063582a8d081461046c576101f0565b80633434735f1461035257806335ddfeea1461037057806343ee8213146103a057806344c15cb1146103be576101f0565b806323f2a73f116101c357806323f2a73f146102a45780632bc06564146102d45780632de3a180146102f25780632eddf35214610322576101f0565b8063047a6c5b146101f55780630c35b1cb146102275780631270b5741461025857806323c2a2b414610288575b600080fd5b61020f600480360361020a9190810190612b24565b610706565b60405161021e93929190613463565b60405180910390f35b610241600480360361023c9190810190612b24565b61075d565b60405161024f929190613284565b60405180910390f35b610272600480360361026d9190810190612b4d565b610939565b60405161027f91906132bb565b60405180910390f35b6102a2600480360361029d9190810190612c2c565b610a91565b005b6102be60048036036102b99190810190612b4d565b61112a565b6040516102cb91906132bb565b60405180910390f35b6102dc611281565b6040516102e99190613411565b60405180910390f35b61030c60048036036103079190810190612a81565b611286565b60405161031991906132d6565b60405180910390f35b61033c60048036036103379190810190612b24565b611307565b6040516103499190613411565b60405180910390f35b61035a611437565b6040516103679190613269565b60405180910390f35b61038a60048036036103859190810190612abd565b61144f565b60405161039791906132bb565b60405180910390f35b6103a861151a565b6040516103b591906132d6565b60405180910390f35b6103d860048036036103d39190810190612b89565b611531565b6040516103e59190613411565b60405180910390f35b61040860048036036104039190810190612b4d565b611619565b60405161041591906133f6565b60405180910390f35b610426611781565b6040516104339190613411565b60405180910390f35b61045660048036036104519190810190612a06565b611791565b60405161046391906132bb565b60405180910390f35b61048660048036036104819190810190612a2f565b6117ab565b60405161049391906132d6565b60405180910390f35b6104a4611829565b6040516104b393929190613463565b60405180910390f35b6104c461189d565b6040516104d2929190613284565b60405180910390f35b6104e3611b6e565b6040516104f09190613411565b60405180910390f35b610513600480360361050e9190810190612bf0565b611b73565b6040516105229392919061342c565b60405180910390f35b61054560048036036105409190810190612a06565b611bd7565b60405161055291906132bb565b60405180910390f35b610563611bf1565b60405161057091906132d6565b60405180910390f35b610593600480360361058e9190810190612b24565b611c08565b6040516105a09190613411565b60405180910390f35b6105b1611d39565b6040516105be91906132d6565b60405180910390f35b6105cf611d50565b6040516105de93929190613463565b60405180910390f35b61060160048036036105fc9190810190612b24565b611db1565b60405161060e9190613411565b60405180910390f35b61061f611eb1565b60405161062d929190613284565b60405180910390f35b610650600480360361064b9190810190612b24565b611ec5565b60405161065d9190613411565b60405180910390f35b61066e611ee6565b60405161067b919061349a565b60405180910390f35b61069e60048036036106999190810190612bf0565b611eeb565b6040516106ad9392919061342c565b60405180910390f35b6106be611f4f565b6040516106cb9190613411565b60405180910390f35b6106ee60048036036106e99190810190612b24565b611f61565b6040516106fd93929190613463565b60405180910390f35b60008060006002600085815260200190815260200160002060000154600260008681526020019081526020016000206001015460026000878152602001908152602001600020600201549250925092509193909250565b60608060ff83116107795761077061189d565b91509150610934565b600061078484611db1565b9050606060016000838152602001908152602001600020805490506040519080825280602002602001820160405280156107cd5781602001602082028038833980820191505090505b509050606060016000848152602001908152602001600020805490506040519080825280602002602001820160405280156108175781602001602082028038833980820191505090505b50905060008090505b60016000858152602001908152602001600020805490508110156109295760016000858152602001908152602001600020818154811061085c57fe5b906000526020600020906003020160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061089a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600085815260200190815260200160002081815481106108f257fe5b90600052602060002090600302016001015482828151811061091057fe5b6020026020010181815250508080600101915050610820565b508181945094505050505b915091565b6000606060016000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a0c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190610970565b50505050905060008090505b8151811015610a84578373ffffffffffffffffffffffffffffffffffffffff16828281518110610a4457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff161415610a7757600192505050610a8b565b8080600101915050610a18565b5060009150505b92915050565b73fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906133d6565b60405180910390fd5b6000610b1d611781565b90506000811415610b3157610b30611f8b565b5b610b456001826122ac90919063ffffffff16565b8814610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90613356565b60405180910390fd5b868611610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906133b6565b60405180910390fd5b6000604060018989030181610bd957fe5b0614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613396565b60405180910390fd5b8660026000838152602001908152602001600020600101541115610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90613336565b60405180910390fd5b6000600260008a81526020019081526020016000206000015414610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613376565b60405180910390fd5b604051806060016040528089815260200188815260200187815250600260008a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600388908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008a815260200190815260200160002081610d669190612800565b506000600160008a815260200190815260200160002081610d879190612800565b506060610ddf610dda87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b8151811015610f51576060610e0e838381518110610e0157fe5b60200260200101516122f9565b90506000808c81526020019081526020016000208054809190600101610e349190612800565b506040518060600160405280610e5d83600081518110610e5057fe5b60200260200101516123d6565b8152602001610e7f83600181518110610e7257fe5b60200260200101516123d6565b8152602001610ea183600281518110610e9457fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff168152506000808d81526020019081526020016000208381548110610ed757fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610de7565b506060610fa9610fa486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b815181101561111d576060610fd8838381518110610fcb57fe5b60200260200101516122f9565b9050600160008d81526020019081526020016000208054809190600101610fff9190612800565b5060405180606001604052806110288360008151811061101b57fe5b60200260200101516123d6565b815260200161104a8360018151811061103d57fe5b60200260200101516123d6565b815260200161106c8360028151811061105f57fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff16815250600160008e815260200190815260200160002083815481106110a357fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610fb1565b5050505050505050505050565b60006060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156111fc578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611160565b50505050905060008090505b8151811015611274578373ffffffffffffffffffffffffffffffffffffffff1682828151811061123457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff1614156112675760019250505061127b565b8080600101915050611208565b5060009150505b92915050565b604081565b60006002600160f81b84846040516020016112a3939291906131d6565b6040516020818303038152906040526040516112bf9190613213565b602060405180830381855afa1580156112dc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506112ff9190810190612a58565b905092915050565b60006060600080848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156113d9578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508152602001906001019061133d565b505050509050600080905060008090505b825181101561142c5761141d83828151811061140257fe5b602002602001015160200151836122ac90919063ffffffff16565b915080806001019150506113ea565b508092505050919050565b73fffffffffffffffffffffffffffffffffffffffe81565b600080600080859050600060218087518161146657fe5b04029050600081111561147f5761147c876117ab565b91505b6000602190505b818111611509576000600182038801519050818801519550806000602081106114ab57fe5b1a60f81b9450600060f81b857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156114f0576114e98685611286565b93506114fd565b6114fa8487611286565b93505b50602181019050611486565b508782149450505050509392505050565b60405161152690613254565b604051809103902081565b60008060009050600080905060008090505b84518167ffffffffffffffff16101561160c57606061156e868367ffffffffffffffff16604161246a565b9050600061158582896124f690919063ffffffff16565b905061158f612832565b6115998a83611619565b90506115a58a8361112a565b80156115dc57508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16115b156115fe578194506115fb8160200151876122ac90919063ffffffff16565b95505b505050604181019050611543565b5081925050509392505050565b611621612832565b6060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156116f1578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611655565b50505050905060008090505b8151811015611779578373ffffffffffffffffffffffffffffffffffffffff1682828151811061172957fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff16141561176c5781818151811061175d57fe5b60200260200101519250611779565b80806001019150506116fd565b505092915050565b600061178c43611db1565b905090565b60006117a461179e611781565b8361112a565b9050919050565b60006002600060f81b836040516020016117c69291906131aa565b6040516020818303038152906040526040516117e29190613213565b602060405180830381855afa1580156117ff573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506118229190810190612a58565b9050919050565b60008060008061184a600161183c611781565b6122ac90919063ffffffff16565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b606080606060056040519080825280602002602001820160405280156118d25781602001602082028038833980820191505090505b50905073c26880a0af2ea0c7e8130e6ec47af756465452e8816000815181106118f757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073be188d6641e8b680743a4815dfa0f6208038960f8160018151811061195357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c275dc8be39f50d12f66b6a63629c39da5bae5bd816002815181106119af57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073f903ba9e006193c1527bfbe65fe2123704ea3f9981600381518110611a0b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073928ed6a3e94437bbd316ccad78479f1d163a6a8c81600481518110611a6757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606005604051908082528060200260200182016040528015611ad35781602001602082028038833980820191505090505b50905061271081600081518110611ae657fe5b60200260200101818152505061271081600181518110611b0257fe5b60200260200101818152505061271081600281518110611b1e57fe5b60200260200101818152505061271081600381518110611b3a57fe5b60200260200101818152505061271081600481518110611b5657fe5b60200260200101818152505081819350935050509091565b60ff81565b60016020528160005260406000208181548110611b8c57fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b6000611bea611be4611781565b83610939565b9050919050565b604051611bfd9061322a565b604051809103902081565b6000606060016000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611cdb578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611c3f565b505050509050600080905060008090505b8251811015611d2e57611d1f838281518110611d0457fe5b602002602001015160200151836122ac90919063ffffffff16565b91508080600101915050611cec565b508092505050919050565b604051611d459061323f565b604051809103902081565b600080600080611d5e611781565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b60008060038054905090505b6000811115611e7157611dce612869565b6002600060036001850381548110611de257fe5b906000526020600020015481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905083816020015111158015611e3f57506000816040015114155b8015611e4f575080604001518411155b15611e6257806000015192505050611eac565b50808060019003915050611dbd565b5060006003805490501115611ea757600360016003805490500381548110611e9557fe5b90600052602060002001549050611eac565b600090505b919050565b606080611ebd4361075d565b915091509091565b60038181548110611ed257fe5b906000526020600020016000915090505481565b600281565b60006020528160005260406000208181548110611f0457fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b600060404381611f5b57fe5b04905090565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b606080611f9661189d565b8092508193505050600080905060405180606001604052808281526020016000815260200160ff81525060026000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600381908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008381526020019081526020016000208161203f9190612800565b50600060016000838152602001908152602001600020816120609190612800565b5060008090505b83518110156121825760008083815260200190815260200160002080548091906001016120949190612800565b5060405180606001604052808281526020018483815181106120b257fe5b602002602001015181526020018583815181106120cb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815250600080848152602001908152602001600020828154811061210957fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612067565b5060008090505b83518110156122a6576001600083815260200190815260200160002080548091906001016121b79190612800565b5060405180606001604052808281526020018483815181106121d557fe5b602002602001015181526020018583815181106121ee57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681525060016000848152602001908152602001600020828154811061222d57fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612189565b50505050565b6000808284019050838110156122c157600080fd5b8091505092915050565b6122d361288a565b600060208301905060405180604001604052808451815260200182815250915050919050565b606061230482612600565b61230d57600080fd5b60006123188361264e565b905060608160405190808252806020026020018201604052801561235657816020015b6123436128a4565b81526020019060019003908161233b5790505b509050600061236885602001516126bf565b8560200151019050600080600090505b848110156123c95761238983612748565b91506040518060400160405280838152602001848152508482815181106123ac57fe5b602002602001018190525081830192508080600101915050612378565b5082945050505050919050565b60008082600001511180156123f057506021826000015111155b6123f957600080fd5b600061240883602001516126bf565b9050600081846000015103905060008083866020015101905080519150602083101561243b57826020036101000a820491505b81945050505050919050565b6000601582600001511461245a57600080fd5b612463826123d6565b9050919050565b60608183018451101561247c57600080fd5b6060821560008114612499576040519150602082016040526124ea565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156124d757805183526020830192506020810190506124ba565b50868552601f19601f8301166040525050505b50809150509392505050565b600080600080604185511461251157600093505050506125fa565b602085015192506040850151915060ff6041860151169050601b8160ff16101561253c57601b810190505b601b8160ff16141580156125545750601c8160ff1614155b1561256557600093505050506125fa565b60006001878386866040516000815260200160405260405161258a94939291906132f1565b6020604051602081039080840390855afa1580156125ac573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125f257600080fd5b809450505050505b92915050565b600080826000015114156126175760009050612649565b60008083602001519050805160001a915060c060ff168260ff16101561264257600092505050612649565b6001925050505b919050565b6000808260000151141561266557600090506126ba565b6000809050600061267984602001516126bf565b84602001510190506000846000015185602001510190505b808210156126b3576126a282612748565b820191508280600101935050612691565b8293505050505b919050565b600080825160001a9050608060ff168110156126df576000915050612743565b60b860ff16811080612704575060c060ff168110158015612703575060f860ff1681105b5b15612713576001915050612743565b60c060ff168110156127335760018060b80360ff16820301915050612743565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561276957600191506127f6565b60b860ff16811015612786576001608060ff1682030191506127f5565b60c060ff168110156127b65760b78103600185019450806020036101000a855104600182018101935050506127f4565b60f860ff168110156127d357600160c060ff1682030191506127f3565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b81548183558181111561282d5760030281600302836000526020600020918201910161282c91906128be565b5b505050565b60405180606001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180606001604052806000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604051806040016040528060008152602001600081525090565b61291191905b8082111561290d5760008082016000905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506003016128c4565b5090565b90565b60008135905061292381613693565b92915050565b600081359050612938816136aa565b92915050565b60008151905061294d816136aa565b92915050565b60008083601f84011261296557600080fd5b8235905067ffffffffffffffff81111561297e57600080fd5b60208301915083600182028301111561299657600080fd5b9250929050565b600082601f8301126129ae57600080fd5b81356129c16129bc826134e2565b6134b5565b915080825260208301602083018583830111156129dd57600080fd5b6129e883828461363d565b50505092915050565b600081359050612a00816136c1565b92915050565b600060208284031215612a1857600080fd5b6000612a2684828501612914565b91505092915050565b600060208284031215612a4157600080fd5b6000612a4f84828501612929565b91505092915050565b600060208284031215612a6a57600080fd5b6000612a788482850161293e565b91505092915050565b60008060408385031215612a9457600080fd5b6000612aa285828601612929565b9250506020612ab385828601612929565b9150509250929050565b600080600060608486031215612ad257600080fd5b6000612ae086828701612929565b9350506020612af186828701612929565b925050604084013567ffffffffffffffff811115612b0e57600080fd5b612b1a8682870161299d565b9150509250925092565b600060208284031215612b3657600080fd5b6000612b44848285016129f1565b91505092915050565b60008060408385031215612b6057600080fd5b6000612b6e858286016129f1565b9250506020612b7f85828601612914565b9150509250929050565b600080600060608486031215612b9e57600080fd5b6000612bac868287016129f1565b9350506020612bbd86828701612929565b925050604084013567ffffffffffffffff811115612bda57600080fd5b612be68682870161299d565b9150509250925092565b60008060408385031215612c0357600080fd5b6000612c11858286016129f1565b9250506020612c22858286016129f1565b9150509250929050565b600080600080600080600060a0888a031215612c4757600080fd5b6000612c558a828b016129f1565b9750506020612c668a828b016129f1565b9650506040612c778a828b016129f1565b955050606088013567ffffffffffffffff811115612c9457600080fd5b612ca08a828b01612953565b9450945050608088013567ffffffffffffffff811115612cbf57600080fd5b612ccb8a828b01612953565b925092505092959891949750929550565b6000612ce88383612d0c565b60208301905092915050565b6000612d00838361317d565b60208301905092915050565b612d15816135b2565b82525050565b612d24816135b2565b82525050565b6000612d358261352e565b612d3f8185613569565b9350612d4a8361350e565b8060005b83811015612d7b578151612d628882612cdc565b9750612d6d8361354f565b925050600181019050612d4e565b5085935050505092915050565b6000612d9382613539565b612d9d818561357a565b9350612da88361351e565b8060005b83811015612dd9578151612dc08882612cf4565b9750612dcb8361355c565b925050600181019050612dac565b5085935050505092915050565b612def816135c4565b82525050565b612e06612e01826135d0565b61367f565b82525050565b612e15816135fc565b82525050565b612e2c612e27826135fc565b613689565b82525050565b6000612e3d82613544565b612e47818561358b565b9350612e5781856020860161364c565b80840191505092915050565b6000612e706004836135a7565b91507f766f7465000000000000000000000000000000000000000000000000000000006000830152600482019050919050565b6000612eb0602d83613596565b91507f537461727420626c6f636b206d7573742062652067726561746572207468616e60008301527f2063757272656e74207370616e000000000000000000000000000000000000006020830152604082019050919050565b6000612f16600f83613596565b91507f496e76616c6964207370616e20696400000000000000000000000000000000006000830152602082019050919050565b6000612f56601383613596565b91507f5370616e20616c726561647920657869737473000000000000000000000000006000830152602082019050919050565b6000612f96604583613596565b91507f446966666572656e6365206265747765656e20737461727420616e6420656e6460008301527f20626c6f636b206d75737420626520696e206d756c7469706c6573206f66207360208301527f7072696e740000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613022602a83613596565b91507f456e6420626c6f636b206d7573742062652067726561746572207468616e207360008301527f7461727420626c6f636b000000000000000000000000000000000000000000006020830152604082019050919050565b6000613088601283613596565b91507f4e6f742053797374656d204164646573732100000000000000000000000000006000830152602082019050919050565b60006130c86005836135a7565b91507f38303030310000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613108600e836135a7565b91507f6865696d64616c6c2d38303030310000000000000000000000000000000000006000830152600e82019050919050565b606082016000820151613151600085018261317d565b506020820151613164602085018261317d565b5060408201516131776040850182612d0c565b50505050565b61318681613626565b82525050565b61319581613626565b82525050565b6131a481613630565b82525050565b60006131b68285612df5565b6001820191506131c68284612e1b565b6020820191508190509392505050565b60006131e28286612df5565b6001820191506131f28285612e1b565b6020820191506132028284612e1b565b602082019150819050949350505050565b600061321f8284612e32565b915081905092915050565b600061323582612e63565b9150819050919050565b600061324a826130bb565b9150819050919050565b600061325f826130fb565b9150819050919050565b600060208201905061327e6000830184612d1b565b92915050565b6000604082019050818103600083015261329e8185612d2a565b905081810360208301526132b28184612d88565b90509392505050565b60006020820190506132d06000830184612de6565b92915050565b60006020820190506132eb6000830184612e0c565b92915050565b60006080820190506133066000830187612e0c565b613313602083018661319b565b6133206040830185612e0c565b61332d6060830184612e0c565b95945050505050565b6000602082019050818103600083015261334f81612ea3565b9050919050565b6000602082019050818103600083015261336f81612f09565b9050919050565b6000602082019050818103600083015261338f81612f49565b9050919050565b600060208201905081810360008301526133af81612f89565b9050919050565b600060208201905081810360008301526133cf81613015565b9050919050565b600060208201905081810360008301526133ef8161307b565b9050919050565b600060608201905061340b600083018461313b565b92915050565b6000602082019050613426600083018461318c565b92915050565b6000606082019050613441600083018661318c565b61344e602083018561318c565b61345b6040830184612d1b565b949350505050565b6000606082019050613478600083018661318c565b613485602083018561318c565b613492604083018461318c565b949350505050565b60006020820190506134af600083018461319b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156134d857600080fd5b8060405250919050565b600067ffffffffffffffff8211156134f957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006135bd82613606565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561366a57808201518184015260208101905061364f565b83811115613679576000848401525b50505050565b6000819050919050565b6000819050919050565b61369c816135b2565b81146136a757600080fd5b50565b6136b3816135fc565b81146136be57600080fd5b50565b6136ca81613626565b81146136d557600080fd5b5056fea365627a7a723158208f52ee07630ffe523cc6ad3e15f437f973dcfa36729cd697f9b0fc4a145a48f06c6578706572696d656e74616cf564736f6c634300050b0040" - }, - "0000000000000000000000000000000000001001": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806319494a17146100465780633434735f146100e15780635407ca671461012b575b600080fd5b6100c76004803603604081101561005c57600080fd5b81019080803590602001909291908035906020019064010000000081111561008357600080fd5b82018360208201111561009557600080fd5b803590602001918460018302840111640100000000831117156100b757600080fd5b9091929391929390505050610149565b604051808215151515815260200191505060405180910390f35b6100e961047a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610133610492565b6040518082815260200191505060405180910390f35b600073fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f742053797374656d2041646465737321000000000000000000000000000081525060200191505060405180910390fd5b606061025761025285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610498565b6104c6565b905060006102788260008151811061026b57fe5b60200260200101516105a3565b905080600160005401146102f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f537461746549647320617265206e6f742073657175656e7469616c000000000081525060200191505060405180910390fd5b600080815480929190600101919050555060006103248360018151811061031757fe5b6020026020010151610614565b905060606103458460028151811061033857fe5b6020026020010151610637565b9050610350826106c3565b1561046f576000624c4b409050606084836040516024018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103aa57808201518184015260208101905061038f565b50505050905090810190601f1680156103d75780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f26c53bea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008082516020840160008887f1965050505b505050509392505050565b73fffffffffffffffffffffffffffffffffffffffe81565b60005481565b6104a0610943565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606104d1826106dc565b6104da57600080fd5b60006104e58361072a565b905060608160405190808252806020026020018201604052801561052357816020015b61051061095d565b8152602001906001900390816105085790505b5090506000610535856020015161079b565b8560200151019050600080600090505b848110156105965761055683610824565b915060405180604001604052808381526020018481525084828151811061057957fe5b602002602001018190525081830192508080600101915050610545565b5082945050505050919050565b60008082600001511180156105bd57506021826000015111155b6105c657600080fd5b60006105d5836020015161079b565b9050600081846000015103905060008083866020015101905080519150602083101561060857826020036101000a820491505b81945050505050919050565b6000601582600001511461062757600080fd5b610630826105a3565b9050919050565b6060600082600001511161064a57600080fd5b6000610659836020015161079b565b905060008184600001510390506060816040519080825280601f01601f19166020018201604052801561069b5781602001600182028038833980820191505090505b50905060008160200190506106b78487602001510182856108dc565b81945050505050919050565b600080823b905060008163ffffffff1611915050919050565b600080826000015114156106f35760009050610725565b60008083602001519050805160001a915060c060ff168260ff16101561071e57600092505050610725565b6001925050505b919050565b600080826000015114156107415760009050610796565b60008090506000610755846020015161079b565b84602001510190506000846000015185602001510190505b8082101561078f5761077e82610824565b82019150828060010193505061076d565b8293505050505b919050565b600080825160001a9050608060ff168110156107bb57600091505061081f565b60b860ff168110806107e0575060c060ff1681101580156107df575060f860ff1681105b5b156107ef57600191505061081f565b60c060ff1681101561080f5760018060b80360ff1682030191505061081f565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561084557600191506108d2565b60b860ff16811015610862576001608060ff1682030191506108d1565b60c060ff168110156108925760b78103600185019450806020036101000a855104600182018101935050506108d0565b60f860ff168110156108af57600160c060ff1682030191506108cf565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156108ea5761093e565b5b602060ff16811061091a5782518252602060ff1683019250602060ff1682019150602060ff16810390506108eb565b6000600182602060ff16036101000a03905080198451168184511681811785525050505b505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fea265627a7a7231582083fbdacb76f32b4112d0f7db9a596937925824798a0026ba0232322390b5263764736f6c634300050b0032" - }, - "0000000000000000000000000000000000001010": { - "balance": "0x204fcd4f31349d83b6e00000", - "code": "0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610e06565b005b3480156103eb57600080fd5b506103f4610f58565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f61565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061111d565b005b3480156104e857600080fd5b506104f16111ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b50610548611212565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611238565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b50610604611259565b005b34801561061257600080fd5b5061061b611329565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061132f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b506107586114b4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af6114dd565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de611534565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e61156d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115aa565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b506109646115d0565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b810190808035906020019092919050505061165d565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061167d565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a6561169d565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a906116a4565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb6116aa565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611737565b005b348015610b2e57600080fd5b50610b37611754565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b6000808511610c4857600080fd5b6000831480610c575750824311155b610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5369676e6174757265206973206578706972656400000000000000000000000081525060200191505060405180910390fd5b6000610cd73387878761167d565b9050600015156005600083815260200190815260200160002060009054906101000a900460ff16151514610d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f536967206465616374697661746564000000000000000000000000000000000081525060200191505060405180910390fd5b60016005600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610ded8189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061132f565b9150610dfa82848861177a565b50509695505050505050565b60003390506000610e1682611238565b9050610e2d83600654611b3790919063ffffffff16565b600681905550600083118015610e4257508234145b610eb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610f3087611238565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610f696114dd565b610f7257600080fd5b600081118015610faf5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e636023913960400191505060405180910390fd5b600061100f83611238565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561105c573d6000803e3d6000fd5b5061107283600654611b5790919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f685856110f489611238565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611183576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e406023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111e882611b76565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b6112616114dd565b61126a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b600080600080604185511461134a57600093505050506114ae565b602085015192506040850151915060ff6041860151169050601b8160ff16101561137557601b810190505b601b8160ff161415801561138d5750601c8160ff1614155b1561139e57600093505050506114ae565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113fb573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b60008134146115bc57600090506115ca565b6115c733848461177a565b90505b92915050565b6040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b6020831061161f57805182526020820191506020810190506020830392506115fc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061169361168e86868686611c6e565b611d44565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611e86605291396040516020018082805190602001908083835b602083106116f957805182526020820191506020810190506020830392506116d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b61173f6114dd565b61174857600080fd5b61175181611b76565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117fa57600080fd5b505afa15801561180e573d6000803e3d6000fd5b505050506040513d602081101561182457600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118b657600080fd5b505afa1580156118ca573d6000803e3d6000fd5b505050506040513d60208110156118e057600080fd5b810190808051906020019092919050505090506118fe868686611d8e565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d6020811015611a3057600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611abe57600080fd5b505afa158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b600082821115611b4657600080fd5b600082840390508091505092915050565b600080828401905083811015611b6c57600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bb057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b60208310611cc05780518252602082019150602081019050602083039250611c9d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611dd4573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a723158208f81700133738d766ae3d68af591ad588b0125bd91449192179f460893f79f6b64736f6c634300050b0032" - }, - "C26880A0AF2EA0c7E8130e6EC47Af756465452E8": { - "balance": "0x3635c9adc5dea00000" - }, - "be188D6641E8b680743A4815dFA0f6208038960F": { - "balance": "0x3635c9adc5dea00000" - }, - "c275DC8bE39f50D12F66B6a63629C39dA5BAe5bd": { - "balance": "0x3635c9adc5dea00000" - }, - "F903ba9E006193c1527BfBe65fe2123704EA3F99": { - "balance": "0x3635c9adc5dea00000" - }, - "928Ed6A3e94437bbd316cCAD78479f1d163A6A8C": { - "balance": "0x3635c9adc5dea00000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" -} From ebf95b98d076572e5f42dfff3277c27d9907f184 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Wed, 30 Mar 2022 21:04:24 +0530 Subject: [PATCH 010/190] bumped version --- params/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/params/version.go b/params/version.go index c9261a745d..2fea76942d 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ const ( VersionMajor = 0 // Major version component of the current release VersionMinor = 2 // Minor version component of the current release VersionPatch = 15 // Patch version component of the current release - VersionMeta = "beta-2" // Version metadata to append to the version string + VersionMeta = "beta-3" // Version metadata to append to the version string ) // Version holds the textual version string. From a551f01ab85287a24ae98a0fbd3e91b56a745a1a Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Mon, 4 Apr 2022 16:39:55 +0530 Subject: [PATCH 011/190] merge gethv1.10.17 --- .gitmodules | 4 + .golangci.yml | 2 +- .travis.yml | 24 +- Dockerfile.alltools | 2 +- SECURITY.md | 2 +- accounts/abi/argument.go | 8 +- accounts/abi/bind/backends/simulated.go | 10 +- accounts/abi/bind/util.go | 11 +- accounts/abi/selector_parser.go | 152 +++ accounts/abi/selector_parser_test.go | 54 + accounts/accounts.go | 10 +- accounts/errors.go | 2 +- accounts/scwallet/wallet.go | 2 +- accounts/usbwallet/wallet.go | 2 +- appveyor.yml | 2 +- build/checksums.txt | 89 +- build/ci.go | 38 +- cmd/clef/main.go | 2 +- cmd/devp2p/internal/ethtest/chain.go | 8 + cmd/devp2p/internal/ethtest/helpers.go | 44 +- cmd/devp2p/internal/ethtest/snap.go | 675 +++++++++++ cmd/devp2p/internal/ethtest/snapTypes.go | 36 + cmd/devp2p/internal/ethtest/suite.go | 10 + cmd/devp2p/internal/ethtest/suite_test.go | 21 + cmd/devp2p/internal/ethtest/types.go | 58 +- cmd/devp2p/rlpxcmd.go | 23 + cmd/ethkey/utils.go | 2 +- cmd/evm/internal/t8ntool/execution.go | 7 + cmd/evm/internal/t8ntool/gen_stenv.go | 6 + cmd/evm/internal/t8ntool/transition.go | 4 + cmd/evm/testdata/15/exp3.json | 10 +- cmd/geth/accountcmd_test.go | 2 +- cmd/geth/config.go | 19 +- cmd/geth/dbcmd.go | 174 ++- cmd/geth/main.go | 12 +- cmd/geth/snapshot.go | 16 +- cmd/geth/usage.go | 10 +- cmd/geth/version_check_test.go | 38 + cmd/utils/flags.go | 143 ++- consensus/beacon/consensus.go | 6 +- consensus/ethash/ethash.go | 5 + core/beacon/errors.go | 50 + .../beacon}/gen_blockparams.go | 8 +- {eth/catalyst => core/beacon}/gen_ed.go | 12 +- core/beacon/types.go | 194 +++ core/blockchain.go | 89 +- core/blockchain_insert.go | 9 +- core/blockchain_repair_test.go | 19 +- core/blockchain_test.go | 4 +- core/evm.go | 5 + core/genesis.go | 122 +- core/genesis_alloc.go | 865 ++++++++++++++ core/genesis_test.go | 60 + core/rawdb/accessors_chain.go | 4 +- core/rawdb/accessors_metadata.go | 13 + core/rawdb/accessors_snapshot.go | 2 +- core/rawdb/accessors_state.go | 84 +- core/rawdb/accessors_sync.go | 80 ++ core/rawdb/database.go | 30 +- core/rawdb/freezer.go | 212 +++- core/rawdb/freezer_batch.go | 2 +- core/rawdb/freezer_meta.go | 109 ++ core/rawdb/freezer_meta_test.go | 61 + core/rawdb/freezer_table.go | 389 ++++-- core/rawdb/freezer_table_test.go | 543 ++++++++- core/rawdb/freezer_test.go | 134 ++- core/rawdb/freezer_utils.go | 120 ++ core/rawdb/freezer_utils_test.go | 76 ++ core/rawdb/key_length_iterator.go | 47 + core/rawdb/key_length_iterator_test.go | 60 + core/rawdb/schema.go | 19 +- core/rawdb/table.go | 36 +- core/state/pruner/pruner.go | 4 +- core/state/snapshot/journal.go | 23 + core/state/snapshot/snapshot.go | 25 +- core/state/state_object.go | 35 +- core/state/statedb.go | 23 +- core/state_transition.go | 2 +- core/types/access_list_tx.go | 2 +- core/types/block.go | 3 +- core/types/block_test.go | 6 +- core/types/gen_account_rlp.go | 27 + core/types/gen_header_rlp.go | 56 + core/types/gen_log_rlp.go | 23 + core/types/legacy.go | 53 + core/types/log.go | 19 +- core/types/receipt.go | 48 +- core/types/receipt_test.go | 2 +- core/types/state_account.go | 2 + core/types/transaction.go | 10 +- core/types/transaction_test.go | 2 +- core/vm/evm.go | 3 +- core/vm/instructions.go | 6 + core/vm/instructions_test.go | 34 + core/vm/interpreter.go | 2 + core/vm/jump_table.go | 12 + core/vm/opcodes.go | 3 +- core/vm/operations_acl.go | 2 +- core/vm/runtime/runtime.go | 6 +- crypto/bls12381/bls12_381.go | 48 +- crypto/bls12381/isogeny.go | 176 +-- crypto/bls12381/swu.go | 2 +- crypto/bn256/cloudflare/gfp_amd64.s | 14 +- crypto/bn256/cloudflare/mul_amd64.h | 6 +- crypto/bn256/cloudflare/mul_bmi2_amd64.h | 12 +- crypto/ecies/ecies_test.go | 2 +- crypto/ecies/params.go | 10 +- crypto/signature_nocgo.go | 70 +- .../2021-08-22-split-postmortem.md | 4 +- eth/backend.go | 24 +- eth/catalyst/api.go | 689 ++++------- eth/catalyst/api_test.go | 248 ++-- eth/catalyst/api_types.go | 114 -- eth/catalyst/gen_payload.go | 36 - eth/catalyst/queue.go | 135 +++ eth/downloader/beaconsync.go | 308 +++++ eth/downloader/downloader.go | 306 +++-- eth/downloader/downloader_test.go | 6 +- eth/downloader/fetchers_concurrent.go | 6 +- eth/downloader/peer.go | 12 +- eth/downloader/skeleton.go | 1063 +++++++++++++++++ eth/downloader/skeleton_test.go | 896 ++++++++++++++ eth/ethconfig/config.go | 59 +- eth/ethconfig/gen_config.go | 10 +- eth/fetcher/block_fetcher_test.go | 4 +- eth/gasprice/feehistory.go | 2 +- eth/handler.go | 65 +- eth/handler_eth_test.go | 2 +- eth/peerset.go | 2 +- eth/protocols/eth/handler_test.go | 22 +- eth/protocols/eth/peer.go | 10 +- eth/protocols/snap/handler.go | 7 +- eth/protocols/snap/sync.go | 11 +- eth/protocols/snap/sync_test.go | 10 +- eth/sync.go | 39 +- eth/tracers/api.go | 5 +- .../internal/tracetest/calltrace_test.go | 4 - eth/tracers/js/internal/tracers/assets.go | 93 +- .../js/internal/tracers/noop_tracer_legacy.js | 29 + .../js/internal/tracers/prestate_tracer.js | 9 +- .../tracers/prestate_tracer_legacy.js | 115 ++ eth/tracers/js/tracer.go | 2 +- eth/tracers/native/4byte.go | 2 +- eth/tracers/native/call.go | 3 +- eth/tracers/native/noop.go | 2 +- eth/tracers/native/prestate.go | 186 +++ ethclient/ethclient.go | 11 + ethclient/ethclient_test.go | 30 + ethdb/batch.go | 3 + ethdb/database.go | 23 +- ethdb/dbtest/testsuite.go | 62 + ethdb/leveldb/leveldb.go | 44 + ethdb/memorydb/memorydb.go | 76 +- ethdb/snapshot.go | 41 + go.mod | 25 +- go.sum | 96 +- graphql/graphql.go | 53 + graphql/graphql_test.go | 1 + graphql/schema.go | 26 +- graphql/service.go | 2 +- internal/build/azure.go | 90 +- internal/build/download.go | 2 +- internal/build/util.go | 36 +- internal/cli/server/config.go | 4 +- internal/ethapi/api.go | 13 +- internal/ethapi/transaction_args.go | 16 +- internal/flags/helpers.go | 5 +- internal/jsre/jsre_test.go | 8 +- internal/web3ext/web3ext.go | 5 + les/catalyst/api.go | 189 +++ les/catalyst/api_test.go | 244 ++++ les/client.go | 2 +- les/peer.go | 6 +- les/test_helper.go | 4 +- les/vflux/client/fillset_test.go | 12 +- les/vflux/server/clientpool.go | 4 +- light/lightchain.go | 3 + miner/miner.go | 14 +- miner/miner_test.go | 41 +- miner/stress/beacon/main.go | 103 +- miner/worker.go | 572 +++++---- miner/worker_test.go | 148 ++- mobile/geth.go | 8 - node/api.go | 5 +- node/config.go | 16 +- node/defaults.go | 13 + node/endpoints.go | 6 +- node/jwt_handler.go | 78 ++ node/node.go | 164 ++- node/node_test.go | 6 +- node/rpcstack.go | 28 +- node/rpcstack_test.go | 95 +- p2p/peer.go | 6 +- p2p/peer_error.go | 2 +- p2p/server.go | 3 +- p2p/simulations/http_test.go | 2 +- params/bootnodes.go | 11 +- params/config.go | 10 +- params/version.go | 4 +- rlp/decode.go | 180 ++- rlp/decode_test.go | 43 +- rlp/encbuffer.go | 382 ++++++ rlp/encbuffer_example_test.go | 45 + rlp/encode.go | 356 +----- rlp/encode_test.go | 18 +- rlp/encoder_example_test.go | 10 +- rlp/internal/rlpstruct/rlpstruct.go | 213 ++++ rlp/rlpgen/gen.go | 735 ++++++++++++ rlp/rlpgen/gen_test.go | 92 ++ rlp/rlpgen/main.go | 148 +++ rlp/rlpgen/testdata/bigint.in.txt | 10 + rlp/rlpgen/testdata/bigint.out.txt | 49 + rlp/rlpgen/testdata/nil.in.txt | 30 + rlp/rlpgen/testdata/nil.out.txt | 289 +++++ rlp/rlpgen/testdata/optional.in.txt | 17 + rlp/rlpgen/testdata/optional.out.txt | 153 +++ rlp/rlpgen/testdata/rawvalue.in.txt | 11 + rlp/rlpgen/testdata/rawvalue.out.txt | 64 + rlp/rlpgen/testdata/uints.in.txt | 10 + rlp/rlpgen/testdata/uints.out.txt | 53 + rlp/rlpgen/types.go | 98 ++ rlp/typecache.go | 191 ++- rpc/client.go | 56 +- rpc/client_test.go | 1 + rpc/http.go | 31 +- rpc/http_test.go | 36 + rpc/json.go | 5 + rpc/server.go | 36 + rpc/server_test.go | 6 +- rpc/subscription.go | 2 +- rpc/testservice_test.go | 4 + rpc/types.go | 11 +- rpc/websocket.go | 20 +- rpc/websocket_test.go | 37 +- signer/core/api.go | 26 +- signer/core/api_test.go | 3 + signer/core/apitypes/types.go | 3 +- signer/core/gnosis_safe.go | 10 +- signer/core/signed_data_test.go | 280 +++++ signer/fourbyte/abi.go | 36 +- tests/evm-benchmarks | 1 + tests/fuzzers/bn256/bn256_fuzz.go | 1 + tests/fuzzers/secp256k1/secp_fuzzer.go | 2 +- tests/fuzzers/stacktrie/trie_fuzzer.go | 2 + tests/fuzzers/vflux/clientpool-fuzzer.go | 4 +- tests/gen_stenv.go | 15 +- tests/init_test.go | 1 + tests/state_test.go | 121 ++ tests/state_test_util.go | 20 +- trie/committer.go | 2 - trie/database.go | 19 +- trie/hasher.go | 56 +- trie/iterator.go | 61 +- trie/iterator_test.go | 74 +- trie/node.go | 16 +- trie/node_enc.go | 87 ++ trie/proof.go | 9 +- trie/proof_test.go | 33 + trie/stacktrie.go | 194 +-- trie/sync.go | 7 +- trie/trie.go | 9 + trie/trie_test.go | 10 +- 262 files changed, 14621 insertions(+), 2910 deletions(-) create mode 100644 accounts/abi/selector_parser.go create mode 100644 accounts/abi/selector_parser_test.go create mode 100644 cmd/devp2p/internal/ethtest/snap.go create mode 100644 cmd/devp2p/internal/ethtest/snapTypes.go create mode 100644 core/beacon/errors.go rename {eth/catalyst => core/beacon}/gen_blockparams.go (85%) rename {eth/catalyst => core/beacon}/gen_ed.go (93%) create mode 100644 core/beacon/types.go create mode 100644 core/rawdb/accessors_sync.go create mode 100644 core/rawdb/freezer_meta.go create mode 100644 core/rawdb/freezer_meta_test.go create mode 100644 core/rawdb/freezer_utils.go create mode 100644 core/rawdb/freezer_utils_test.go create mode 100644 core/rawdb/key_length_iterator.go create mode 100644 core/rawdb/key_length_iterator_test.go create mode 100644 core/types/gen_account_rlp.go create mode 100644 core/types/gen_header_rlp.go create mode 100644 core/types/gen_log_rlp.go create mode 100644 core/types/legacy.go delete mode 100644 eth/catalyst/api_types.go delete mode 100644 eth/catalyst/gen_payload.go create mode 100644 eth/catalyst/queue.go create mode 100644 eth/downloader/beaconsync.go create mode 100644 eth/downloader/skeleton.go create mode 100644 eth/downloader/skeleton_test.go create mode 100644 eth/tracers/js/internal/tracers/noop_tracer_legacy.js create mode 100644 eth/tracers/js/internal/tracers/prestate_tracer_legacy.js create mode 100644 eth/tracers/native/prestate.go create mode 100644 ethdb/snapshot.go create mode 100644 les/catalyst/api.go create mode 100644 les/catalyst/api_test.go create mode 100644 node/jwt_handler.go create mode 100644 rlp/encbuffer.go create mode 100644 rlp/encbuffer_example_test.go create mode 100644 rlp/internal/rlpstruct/rlpstruct.go create mode 100644 rlp/rlpgen/gen.go create mode 100644 rlp/rlpgen/gen_test.go create mode 100644 rlp/rlpgen/main.go create mode 100644 rlp/rlpgen/testdata/bigint.in.txt create mode 100644 rlp/rlpgen/testdata/bigint.out.txt create mode 100644 rlp/rlpgen/testdata/nil.in.txt create mode 100644 rlp/rlpgen/testdata/nil.out.txt create mode 100644 rlp/rlpgen/testdata/optional.in.txt create mode 100644 rlp/rlpgen/testdata/optional.out.txt create mode 100644 rlp/rlpgen/testdata/rawvalue.in.txt create mode 100644 rlp/rlpgen/testdata/rawvalue.out.txt create mode 100644 rlp/rlpgen/testdata/uints.in.txt create mode 100644 rlp/rlpgen/testdata/uints.out.txt create mode 100644 rlp/rlpgen/types.go create mode 160000 tests/evm-benchmarks create mode 100644 trie/node_enc.go diff --git a/.gitmodules b/.gitmodules index 90d1be0a3d..241c169c47 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,7 @@ path = tests/testdata url = https://github.com/ethereum/tests shallow = true +[submodule "evm-benchmarks"] + path = tests/evm-benchmarks + url = https://github.com/ipsilon/evm-benchmarks + shallow = true diff --git a/.golangci.yml b/.golangci.yml index 395a91fe1b..4950b98c21 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,7 +1,7 @@ # This file configures github.com/golangci/golangci-lint. run: - timeout: 5m + timeout: 20m tests: true # default is true. Enables skipping of directories: # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ diff --git a/.travis.yml b/.travis.yml index 3f92221758..5bd7beed83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ jobs: - stage: lint os: linux dist: bionic - go: 1.17.x + go: 1.18.x env: - lint git: @@ -31,7 +31,7 @@ jobs: os: linux arch: amd64 dist: bionic - go: 1.17.x + go: 1.18.x env: - docker services: @@ -48,7 +48,7 @@ jobs: os: linux arch: arm64 dist: bionic - go: 1.17.x + go: 1.18.x env: - docker services: @@ -65,7 +65,7 @@ jobs: if: type = push os: linux dist: bionic - go: 1.17.x + go: 1.18.x env: - ubuntu-ppa - GO111MODULE=on @@ -90,7 +90,7 @@ jobs: os: linux dist: bionic sudo: required - go: 1.17.x + go: 1.18.x env: - azure-linux - GO111MODULE=on @@ -148,7 +148,7 @@ jobs: - sdkmanager "platform-tools" "platforms;android-15" "platforms;android-19" "platforms;android-24" "ndk-bundle" # Install Go to allow building with - - curl https://dl.google.com/go/go1.16.linux-amd64.tar.gz | tar -xz + - curl https://dl.google.com/go/go1.18.linux-amd64.tar.gz | tar -xz - export PATH=`pwd`/go/bin:$PATH - export GOROOT=`pwd`/go - export GOPATH=$HOME/go @@ -162,7 +162,7 @@ jobs: - stage: build if: type = push os: osx - go: 1.17.x + go: 1.18.x env: - azure-osx - azure-ios @@ -194,7 +194,7 @@ jobs: os: linux arch: amd64 dist: bionic - go: 1.17.x + go: 1.18.x env: - GO111MODULE=on script: @@ -205,7 +205,7 @@ jobs: os: linux arch: arm64 dist: bionic - go: 1.17.x + go: 1.18.x env: - GO111MODULE=on script: @@ -214,7 +214,7 @@ jobs: - stage: build os: linux dist: bionic - go: 1.16.x + go: 1.17.x env: - GO111MODULE=on script: @@ -225,7 +225,7 @@ jobs: if: type = cron os: linux dist: bionic - go: 1.17.x + go: 1.18.x env: - azure-purge - GO111MODULE=on @@ -239,7 +239,7 @@ jobs: if: type = cron os: linux dist: bionic - go: 1.17.x + go: 1.18.x env: - GO111MODULE=on script: diff --git a/Dockerfile.alltools b/Dockerfile.alltools index 53be8bc950..b702d332b9 100644 --- a/Dockerfile.alltools +++ b/Dockerfile.alltools @@ -1,5 +1,5 @@ # Build Geth in a stock Go builder container -FROM golang:1.17-alpine as builder +FROM golang:1.18-alpine as builder RUN apk add --no-cache make gcc musl-dev linux-headers git diff --git a/SECURITY.md b/SECURITY.md index 88b3f8fe17..41b900d5e9 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -19,7 +19,7 @@ Audit reports are published in the `docs` folder: https://github.com/ethereum/go **Please do not file a public ticket** mentioning the vulnerability. -To find out how to disclose a vulnerability in Ethereum visit [https://bounty.ethereum.org](https://bounty.ethereum.org) or email bounty@ethereum.org. Please read the [disclosure page](https://github.com/ethereum/go-ethereum/security/advisories?state=published) for more information about publically disclosed security vulnerabilities. +To find out how to disclose a vulnerability in Ethereum visit [https://bounty.ethereum.org](https://bounty.ethereum.org) or email bounty@ethereum.org. Please read the [disclosure page](https://github.com/ethereum/go-ethereum/security/advisories?state=published) for more information about publicly disclosed security vulnerabilities. Use the built-in `geth version-check` feature to check whether the software is affected by any known vulnerability. This command will fetch the latest [`vulnerabilities.json`](https://geth.ethereum.org/docs/vulnerabilities/vulnerabilities.json) file which contains known security vulnerabilities concerning `geth`, and cross-check the data against its own version number. diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go index 261b4d1b86..e6c117fe5f 100644 --- a/accounts/abi/argument.go +++ b/accounts/abi/argument.go @@ -81,13 +81,7 @@ func (arguments Arguments) Unpack(data []byte) ([]interface{}, error) { if len(arguments) != 0 { return nil, fmt.Errorf("abi: attempting to unmarshall an empty string while arguments are expected") } - // Nothing to unmarshal, return default variables - nonIndexedArgs := arguments.NonIndexed() - defaultVars := make([]interface{}, len(nonIndexedArgs)) - for index, arg := range nonIndexedArgs { - defaultVars[index] = reflect.New(arg.Type.GetType()) - } - return defaultVars, nil + return make([]interface{}, 0), nil } return arguments.UnpackValues(data) } diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 27d40f1d66..ac696f446b 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -230,6 +230,9 @@ func (b *SimulatedBackend) TransactionReceipt(ctx context.Context, txHash common defer b.mu.Unlock() receipt, _, _, _ := rawdb.ReadReceipt(b.database, txHash, b.config) + if receipt == nil { + return nil, ethereum.NotFound + } return receipt, nil } @@ -639,7 +642,6 @@ func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallM } // SendTransaction updates the pending block to include the given transaction. -// It panics if the transaction is invalid. func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transaction) error { b.mu.Lock() defer b.mu.Unlock() @@ -647,17 +649,17 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transa // Get the last block block, err := b.blockByHash(ctx, b.pendingBlock.ParentHash()) if err != nil { - panic("could not fetch parent") + return fmt.Errorf("could not fetch parent") } // Check transaction validity signer := types.MakeSigner(b.blockchain.Config(), block.Number()) sender, err := types.Sender(signer, tx) if err != nil { - panic(fmt.Errorf("invalid transaction: %v", err)) + return fmt.Errorf("invalid transaction: %v", err) } nonce := b.pendingState.GetNonce(sender) if tx.Nonce() != nonce { - panic(fmt.Errorf("invalid transaction nonce: got %d, want %d", tx.Nonce(), nonce)) + return fmt.Errorf("invalid transaction nonce: got %d, want %d", tx.Nonce(), nonce) } // Include tx in chain blocks, _ := core.GenerateChain(b.config, block, ethash.NewFaker(), b.database, 1, func(number int, block *core.BlockGen) { diff --git a/accounts/abi/bind/util.go b/accounts/abi/bind/util.go index 118abc59a7..b931fbb04d 100644 --- a/accounts/abi/bind/util.go +++ b/accounts/abi/bind/util.go @@ -21,6 +21,7 @@ import ( "errors" "time" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" @@ -35,14 +36,16 @@ func WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*ty logger := log.New("hash", tx.Hash()) for { receipt, err := b.TransactionReceipt(ctx, tx.Hash()) - if receipt != nil { + if err == nil { return receipt, nil } - if err != nil { - logger.Trace("Receipt retrieval failed", "err", err) - } else { + + if errors.Is(err, ethereum.NotFound) { logger.Trace("Transaction not yet mined") + } else { + logger.Trace("Receipt retrieval failed", "err", err) } + // Wait for the next round. select { case <-ctx.Done(): diff --git a/accounts/abi/selector_parser.go b/accounts/abi/selector_parser.go new file mode 100644 index 0000000000..75609b28a6 --- /dev/null +++ b/accounts/abi/selector_parser.go @@ -0,0 +1,152 @@ +package abi + +import ( + "fmt" +) + +type SelectorMarshaling struct { + Name string `json:"name"` + Type string `json:"type"` + Inputs []ArgumentMarshaling `json:"inputs"` +} + +func isDigit(c byte) bool { + return c >= '0' && c <= '9' +} + +func isAlpha(c byte) bool { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') +} + +func isIdentifierSymbol(c byte) bool { + return c == '$' || c == '_' +} + +func parseToken(unescapedSelector string, isIdent bool) (string, string, error) { + if len(unescapedSelector) == 0 { + return "", "", fmt.Errorf("empty token") + } + firstChar := unescapedSelector[0] + position := 1 + if !(isAlpha(firstChar) || (isIdent && isIdentifierSymbol(firstChar))) { + return "", "", fmt.Errorf("invalid token start: %c", firstChar) + } + for position < len(unescapedSelector) { + char := unescapedSelector[position] + if !(isAlpha(char) || isDigit(char) || (isIdent && isIdentifierSymbol(char))) { + break + } + position++ + } + return unescapedSelector[:position], unescapedSelector[position:], nil +} + +func parseIdentifier(unescapedSelector string) (string, string, error) { + return parseToken(unescapedSelector, true) +} + +func parseElementaryType(unescapedSelector string) (string, string, error) { + parsedType, rest, err := parseToken(unescapedSelector, false) + if err != nil { + return "", "", fmt.Errorf("failed to parse elementary type: %v", err) + } + // handle arrays + for len(rest) > 0 && rest[0] == '[' { + parsedType = parsedType + string(rest[0]) + rest = rest[1:] + for len(rest) > 0 && isDigit(rest[0]) { + parsedType = parsedType + string(rest[0]) + rest = rest[1:] + } + if len(rest) == 0 || rest[0] != ']' { + return "", "", fmt.Errorf("failed to parse array: expected ']', got %c", unescapedSelector[0]) + } + parsedType = parsedType + string(rest[0]) + rest = rest[1:] + } + return parsedType, rest, nil +} + +func parseCompositeType(unescapedSelector string) ([]interface{}, string, error) { + if len(unescapedSelector) == 0 || unescapedSelector[0] != '(' { + return nil, "", fmt.Errorf("expected '(', got %c", unescapedSelector[0]) + } + parsedType, rest, err := parseType(unescapedSelector[1:]) + if err != nil { + return nil, "", fmt.Errorf("failed to parse type: %v", err) + } + result := []interface{}{parsedType} + for len(rest) > 0 && rest[0] != ')' { + parsedType, rest, err = parseType(rest[1:]) + if err != nil { + return nil, "", fmt.Errorf("failed to parse type: %v", err) + } + result = append(result, parsedType) + } + if len(rest) == 0 || rest[0] != ')' { + return nil, "", fmt.Errorf("expected ')', got '%s'", rest) + } + return result, rest[1:], nil +} + +func parseType(unescapedSelector string) (interface{}, string, error) { + if len(unescapedSelector) == 0 { + return nil, "", fmt.Errorf("empty type") + } + if unescapedSelector[0] == '(' { + return parseCompositeType(unescapedSelector) + } else { + return parseElementaryType(unescapedSelector) + } +} + +func assembleArgs(args []interface{}) ([]ArgumentMarshaling, error) { + arguments := make([]ArgumentMarshaling, 0) + for i, arg := range args { + // generate dummy name to avoid unmarshal issues + name := fmt.Sprintf("name%d", i) + if s, ok := arg.(string); ok { + arguments = append(arguments, ArgumentMarshaling{name, s, s, nil, false}) + } else if components, ok := arg.([]interface{}); ok { + subArgs, err := assembleArgs(components) + if err != nil { + return nil, fmt.Errorf("failed to assemble components: %v", err) + } + arguments = append(arguments, ArgumentMarshaling{name, "tuple", "tuple", subArgs, false}) + } else { + return nil, fmt.Errorf("failed to assemble args: unexpected type %T", arg) + } + } + return arguments, nil +} + +// ParseSelector converts a method selector into a struct that can be JSON encoded +// and consumed by other functions in this package. +// Note, although uppercase letters are not part of the ABI spec, this function +// still accepts it as the general format is valid. +func ParseSelector(unescapedSelector string) (SelectorMarshaling, error) { + name, rest, err := parseIdentifier(unescapedSelector) + if err != nil { + return SelectorMarshaling{}, fmt.Errorf("failed to parse selector '%s': %v", unescapedSelector, err) + } + args := []interface{}{} + if len(rest) >= 2 && rest[0] == '(' && rest[1] == ')' { + rest = rest[2:] + } else { + args, rest, err = parseCompositeType(rest) + if err != nil { + return SelectorMarshaling{}, fmt.Errorf("failed to parse selector '%s': %v", unescapedSelector, err) + } + } + if len(rest) > 0 { + return SelectorMarshaling{}, fmt.Errorf("failed to parse selector '%s': unexpected string '%s'", unescapedSelector, rest) + } + + // Reassemble the fake ABI and constuct the JSON + fakeArgs, err := assembleArgs(args) + if err != nil { + return SelectorMarshaling{}, fmt.Errorf("failed to parse selector: %v", err) + } + + return SelectorMarshaling{name, "function", fakeArgs}, nil +} diff --git a/accounts/abi/selector_parser_test.go b/accounts/abi/selector_parser_test.go new file mode 100644 index 0000000000..9720c9d530 --- /dev/null +++ b/accounts/abi/selector_parser_test.go @@ -0,0 +1,54 @@ +package abi + +import ( + "fmt" + "log" + "reflect" + "testing" +) + +func TestParseSelector(t *testing.T) { + mkType := func(types ...interface{}) []ArgumentMarshaling { + var result []ArgumentMarshaling + for i, typeOrComponents := range types { + name := fmt.Sprintf("name%d", i) + if typeName, ok := typeOrComponents.(string); ok { + result = append(result, ArgumentMarshaling{name, typeName, typeName, nil, false}) + } else if components, ok := typeOrComponents.([]ArgumentMarshaling); ok { + result = append(result, ArgumentMarshaling{name, "tuple", "tuple", components, false}) + } else { + log.Fatalf("unexpected type %T", typeOrComponents) + } + } + return result + } + tests := []struct { + input string + name string + args []ArgumentMarshaling + }{ + {"noargs()", "noargs", []ArgumentMarshaling{}}, + {"simple(uint256,uint256,uint256)", "simple", mkType("uint256", "uint256", "uint256")}, + {"other(uint256,address)", "other", mkType("uint256", "address")}, + {"withArray(uint256[],address[2],uint8[4][][5])", "withArray", mkType("uint256[]", "address[2]", "uint8[4][][5]")}, + {"singleNest(bytes32,uint8,(uint256,uint256),address)", "singleNest", mkType("bytes32", "uint8", mkType("uint256", "uint256"), "address")}, + {"multiNest(address,(uint256[],uint256),((address,bytes32),uint256))", "multiNest", + mkType("address", mkType("uint256[]", "uint256"), mkType(mkType("address", "bytes32"), "uint256"))}, + } + for i, tt := range tests { + selector, err := ParseSelector(tt.input) + if err != nil { + t.Errorf("test %d: failed to parse selector '%v': %v", i, tt.input, err) + } + if selector.Name != tt.name { + t.Errorf("test %d: unexpected function name: '%s' != '%s'", i, selector.Name, tt.name) + } + + if selector.Type != "function" { + t.Errorf("test %d: unexpected type: '%s' != '%s'", i, selector.Type, "function") + } + if !reflect.DeepEqual(selector.Inputs, tt.args) { + t.Errorf("test %d: unexpected args: '%v' != '%v'", i, selector.Inputs, tt.args) + } + } +} diff --git a/accounts/accounts.go b/accounts/accounts.go index c1b5f31235..4b10f3332e 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -47,7 +47,7 @@ const ( // accounts (derived from the same seed). type Wallet interface { // URL retrieves the canonical path under which this wallet is reachable. It is - // user by upper layers to define a sorting order over all wallets from multiple + // used by upper layers to define a sorting order over all wallets from multiple // backends. URL() URL @@ -90,7 +90,7 @@ type Wallet interface { // accounts. // // Note, self derivation will increment the last component of the specified path - // opposed to decending into a child path to allow discovering accounts starting + // opposed to descending into a child path to allow discovering accounts starting // from non zero components. // // Some hardware wallets switched derivation paths through their evolution, so @@ -106,7 +106,7 @@ type Wallet interface { // or optionally with the aid of any location metadata from the embedded URL field. // // If the wallet requires additional authentication to sign the request (e.g. - // a password to decrypt the account, or a PIN code o verify the transaction), + // a password to decrypt the account, or a PIN code to verify the transaction), // an AuthNeededError instance will be returned, containing infos for the user // about which fields or actions are needed. The user may retry by providing // the needed details via SignDataWithPassphrase, or by other means (e.g. unlock @@ -125,13 +125,13 @@ type Wallet interface { // or optionally with the aid of any location metadata from the embedded URL field. // // If the wallet requires additional authentication to sign the request (e.g. - // a password to decrypt the account, or a PIN code o verify the transaction), + // a password to decrypt the account, or a PIN code to verify the transaction), // an AuthNeededError instance will be returned, containing infos for the user // about which fields or actions are needed. The user may retry by providing // the needed details via SignTextWithPassphrase, or by other means (e.g. unlock // the account in a keystore). // - // This method should return the signature in 'canonical' format, with v 0 or 1 + // This method should return the signature in 'canonical' format, with v 0 or 1. SignText(account Account, text []byte) ([]byte, error) // SignTextWithPassphrase is identical to Signtext, but also takes a password diff --git a/accounts/errors.go b/accounts/errors.go index 2fed35f9d0..727e5329be 100644 --- a/accounts/errors.go +++ b/accounts/errors.go @@ -42,7 +42,7 @@ var ErrInvalidPassphrase = errors.New("invalid password") var ErrWalletAlreadyOpen = errors.New("wallet already open") // ErrWalletClosed is returned if a wallet is attempted to be opened the -// secodn time. +// second time. var ErrWalletClosed = errors.New("wallet closed") // AuthNeededError is returned by backends for signing requests where the user diff --git a/accounts/scwallet/wallet.go b/accounts/scwallet/wallet.go index b4d229bc0b..2a2b83bd1b 100644 --- a/accounts/scwallet/wallet.go +++ b/accounts/scwallet/wallet.go @@ -638,7 +638,7 @@ func (w *Wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Accoun // accounts. // // Note, self derivation will increment the last component of the specified path -// opposed to decending into a child path to allow discovering accounts starting +// opposed to descending into a child path to allow discovering accounts starting // from non zero components. // // Some hardware wallets switched derivation paths through their evolution, so diff --git a/accounts/usbwallet/wallet.go b/accounts/usbwallet/wallet.go index b6f1814488..382f3ddaee 100644 --- a/accounts/usbwallet/wallet.go +++ b/accounts/usbwallet/wallet.go @@ -496,7 +496,7 @@ func (w *wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Accoun // accounts. // // Note, self derivation will increment the last component of the specified path -// opposed to decending into a child path to allow discovering accounts starting +// opposed to descending into a child path to allow discovering accounts starting // from non zero components. // // Some hardware wallets switched derivation paths through their evolution, so diff --git a/appveyor.yml b/appveyor.yml index 65b5f96841..d477e6db9f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,7 @@ environment: GETH_MINGW: 'C:\msys64\mingw32' install: - - git submodule update --init --depth 1 + - git submodule update --init --depth 1 --recursive - go version for: diff --git a/build/checksums.txt b/build/checksums.txt index 5df27bbf61..6e43e9cbe0 100644 --- a/build/checksums.txt +++ b/build/checksums.txt @@ -1,37 +1,58 @@ # This file contains sha256 checksums of optional build dependencies. -3defb9a09bed042403195e872dcbc8c6fae1485963332279668ec52e80a95a2d go1.17.5.src.tar.gz -2db6a5d25815b56072465a2cacc8ed426c18f1d5fc26c1fc8c4f5a7188658264 go1.17.5.darwin-amd64.tar.gz -111f71166de0cb8089bb3e8f9f5b02d76e1bf1309256824d4062a47b0e5f98e0 go1.17.5.darwin-arm64.tar.gz -443c1cd9768df02085014f1eb034ebc7dbe032ffc8a9bb9f2e6617d037eee23c go1.17.5.freebsd-386.tar.gz -17180bdc4126acffd0ebf86d66ef5cbc3488b6734e93374fb00eb09494e006d3 go1.17.5.freebsd-amd64.tar.gz -4f4914303bc18f24fd137a97e595735308f5ce81323c7224c12466fd763fc59f go1.17.5.linux-386.tar.gz -bd78114b0d441b029c8fe0341f4910370925a4d270a6a590668840675b0c653e go1.17.5.linux-amd64.tar.gz -6f95ce3da40d9ce1355e48f31f4eb6508382415ca4d7413b1e7a3314e6430e7e go1.17.5.linux-arm64.tar.gz -aa1fb6c53b4fe72f159333362a10aca37ae938bde8adc9c6eaf2a8e87d1e47de go1.17.5.linux-armv6l.tar.gz -3d4be616e568f0a02cb7f7769bcaafda4b0969ed0f9bb4277619930b96847e70 go1.17.5.linux-ppc64le.tar.gz -8087d4fe991e82804e6485c26568c2e0ee0bfde00ceb9015dc86cb6bf84ef40b go1.17.5.linux-s390x.tar.gz -6d7b9948ee14a906b14f5cbebdfab63cd6828b0b618160847ecd3cc3470a26fe go1.17.5.windows-386.zip -671faf99cd5d81cd7e40936c0a94363c64d654faa0148d2af4bbc262555620b9 go1.17.5.windows-amd64.zip -45e88676b68e9cf364be469b5a27965397f4e339aa622c2f52c10433c56e5030 go1.17.5.windows-arm64.zip +38f423db4cc834883f2b52344282fa7a39fbb93650dc62a11fdf0be6409bdad6 go1.18.src.tar.gz +70bb4a066997535e346c8bfa3e0dfe250d61100b17ccc5676274642447834969 go1.18.darwin-amd64.tar.gz +9cab6123af9ffade905525d79fc9ee76651e716c85f1f215872b5f2976782480 go1.18.darwin-arm64.tar.gz +e63492d4f38487331518eb4b50e670d853bb8d67e88596269af84bb9aca0b381 go1.18.freebsd-386.tar.gz +01cd67bbc12e659ff236ecebde1806f76452f7ca145c172d5ecdbf4f4803daae go1.18.freebsd-amd64.tar.gz +1c04cf4440b323a66328e0df95d409f955b9b475e58eae235fdd3d1f1cf02f4f go1.18.linux-386.tar.gz +e85278e98f57cdb150fe8409e6e5df5343ecb13cebf03a5d5ff12bd55a80264f go1.18.linux-amd64.tar.gz +7ac7b396a691e588c5fb57687759e6c4db84a2a3bbebb0765f4b38e5b1c5b00e go1.18.linux-arm64.tar.gz +a80fa43d1f4575fb030adbfbaa94acd860c6847820764eecb06c63b7c103612b go1.18.linux-armv6l.tar.gz +070351edac192483c074b38d08ec19251a83f8210765a532a84c3dcf8aec04d8 go1.18.linux-ppc64le.tar.gz +ea265f5e62fcaf941d53f0cdb81222d9668e1672a0d39d992f16ff0e87c0ee6b go1.18.linux-s390x.tar.gz +e23fd2a0509690fe7e63b2b1bcd4c39ed57b46ccde76f35dc0d16ca7fdbc5aaa go1.18.windows-386.zip +65c5c0c709a7ca1b357091b10b795b439d8b50e579d3893edab4c7e9b384f435 go1.18.windows-amd64.zip +1c454eb60c64d481965a165c623ff1ed6cf32d68c6b31f36069c8768d908f093 go1.18.windows-arm64.zip -d4bd25b9814eeaa2134197dd2c7671bb791eae786d42010d9d788af20dee4bfa golangci-lint-1.42.0-darwin-amd64.tar.gz -e56859c04a2ad5390c6a497b1acb1cc9329ecb1010260c6faae9b5a4c35b35ea golangci-lint-1.42.0-darwin-arm64.tar.gz -14d912a3fa856830339472fc4dc341933adf15f37bdb7130bbbfcf960ecf4809 golangci-lint-1.42.0-freebsd-386.tar.gz -337257fccc9baeb5ee1cd7e70c153e9d9f59d3afde46d631659500048afbdf80 golangci-lint-1.42.0-freebsd-amd64.tar.gz -6debcc266b629359fdd8eef4f4abb05a621604079d27016265afb5b4593b0eff golangci-lint-1.42.0-freebsd-armv6.tar.gz -878f0e190169db2ce9dde8cefbd99adc4fe28b90b68686bbfcfcc2085e6d693e golangci-lint-1.42.0-freebsd-armv7.tar.gz -42c78e31faf62b225363eff1b1d2aa74f9dbcb75686c8914aa3e90d6af65cece golangci-lint-1.42.0-linux-386.tar.gz -6937f62f8e2329e94822dc11c10b871ace5557ae1fcc4ee2f9980cd6aecbc159 golangci-lint-1.42.0-linux-amd64.tar.gz -2cf8d23d96cd854a537b355dab2962b960b88a06b615232599f066afd233f246 golangci-lint-1.42.0-linux-arm64.tar.gz -08b003d1ed61367473886defc957af5301066e62338e5d96a319c34dadc4c1d1 golangci-lint-1.42.0-linux-armv6.tar.gz -c7c00ec4845e806a1f32685f5b150219e180bd6d6a9d584be8d27f0c41d7a1bf golangci-lint-1.42.0-linux-armv7.tar.gz -3650fcf29eb3d8ee326d77791a896b15259eb2d5bf77437dc72e7efe5af6bd40 golangci-lint-1.42.0-linux-mips64.tar.gz -f51ae003fdbca4fef78ba73e2eb736a939c8eaa178cd452234213b489da5a420 golangci-lint-1.42.0-linux-mips64le.tar.gz -1b0bb7b8b22cc4ea7da44fd5ad5faaf6111d0677e01cc6f961b62a96537de2c6 golangci-lint-1.42.0-linux-ppc64le.tar.gz -8cb56927eb75e572450efbe0ff0f9cf3f56dc9faa81d9e8d30d6559fc1d06e6d golangci-lint-1.42.0-linux-riscv64.tar.gz -5ac41cd31825a176b21505a371a7b307cd9cdf17df0f35bbb3bf1466f9356ccc golangci-lint-1.42.0-linux-s390x.tar.gz -e1cebd2af621ac4b64c20937df92c3819264f2174c92f51e196db1e64ae097e0 golangci-lint-1.42.0-windows-386.zip -7e70fcde8e87a17cae0455df07d257ebc86669f3968d568e12727fa24bbe9883 golangci-lint-1.42.0-windows-amd64.zip -59da7ce1bda432616bfc28ae663e52c3675adee8d9bf5959fafd657c159576ab golangci-lint-1.42.0-windows-armv6.zip -65f62dda937bfcede0326ac77abe947ce1548931e6e13298ca036cb31f224db5 golangci-lint-1.42.0-windows-armv7.zip +03c181fc1bb29ea3e73cbb23399c43b081063833a7cf7554b94e5a98308df53e golangci-lint-1.45.2-linux-riscv64.deb +08a50bbbf451ede6d5354179eb3e14a5634e156dfa92cb9a2606f855a637e35b golangci-lint-1.45.2-linux-ppc64le.rpm +0d12f6ec1296b5a70e392aa88cd2295cceef266165eb7028e675f455515dd1c9 golangci-lint-1.45.2-linux-armv7.deb +10f2846e2e50e4ea8ae426ee62dcd2227b23adddd8e991aa3c065927ac948735 golangci-lint-1.45.2-linux-ppc64le.deb +1463049b744871168095e3e8f687247d6040eeb895955b869889ea151e0603ab golangci-lint-1.45.2-linux-arm64.tar.gz +15720f9c4c6f9324af695f081dc189adc7751b255759e78d7b2df1d7e9192533 golangci-lint-1.45.2-linux-amd64.deb +166d922e4d3cfe3d47786c590154a9c8ea689dff0aa92b73d2f5fc74fc570c29 golangci-lint-1.45.2-linux-arm64.rpm +1a3754c69f7cc19ab89cbdcc2550da4cf9abb3120383c6b3bd440c1ec22da2e6 golangci-lint-1.45.2-freebsd-386.tar.gz +1dec0aa46d4f0d241863b573f70129bdf1de9c595cf51172a840a588a4cd9fc5 golangci-lint-1.45.2-windows-amd64.zip +3198453806517c1ad988229f5e758ef850e671203f46d6905509df5bdf4dc24b golangci-lint-1.45.2-freebsd-armv7.tar.gz +46a3cd1749d7b98adc2dc01510ddbe21abe42689c8a53fb0e81662713629f215 golangci-lint-1.45.2-linux-386.deb +4e28bfb593d464b9e160f2acd5b71993836a183270bf8299b78ad31f7a168c0d golangci-lint-1.45.2-linux-arm64.deb +5157a58c8f9ab85c33af2e46f0d7c57a3b1e8953b81d61130e292e09f545cfab golangci-lint-1.45.2-linux-mips64le.tar.gz +518cd027644129fbf8ec4f02bd6f9ad7278aae826f92b63c80d4d0819ddde49a golangci-lint-1.45.2-linux-armv6.rpm +595ad6c6dade4c064351bc309f411703e457f8ffbb7a1806b3d8ee713333427f golangci-lint-1.45.2-linux-amd64.tar.gz +6994d6c80f0730751090986184a3481b4be2e6b6e84416238a2b857910045a4f golangci-lint-1.45.2-windows-arm64.zip +6c81652fc340118811b487f713c441fc6f527800bf5fd11b8929d08124efa015 golangci-lint-1.45.2-linux-armv7.tar.gz +726cb045559b7518bafdd3459de70a0647c087eb1b4634627a4b2e95b1258580 golangci-lint-1.45.2-freebsd-amd64.tar.gz +77df3774cdfda49b956d4a0e676da9a9b883f496ee37293c530770fef6b1d24e golangci-lint-1.45.2-linux-mips64.deb +7a9840f279a7d5d405bb434e101c2290964b3729630ac2add29280b962b7b9a5 golangci-lint-1.45.2-windows-armv6.zip +7d4bf9a5d80ec467aaaf66e78dbdcab567bbc6ba8151334c714eee58766aae32 golangci-lint-1.45.2-windows-armv7.zip +7e5f8821d39bb11d273b0841b34355f56bd5a45a2d5179f0d09e614e0efc0482 golangci-lint-1.45.2-linux-s390x.rpm +828de1bde796b23d8656b17a8885fbd879ef612795d62d1e4618126b419728b5 golangci-lint-1.45.2-linux-mips64.rpm +879a52107a797678a03c175cc7cf441411a14a01f66dc87f70bdfa304a4129a6 golangci-lint-1.45.2-windows-386.zip +87b6c7e3a3769f7d9abeb3bb82119b3c91e3c975300f6834fdeef8b2e37c98ff golangci-lint-1.45.2-linux-amd64.rpm +8b605c6d686c8af53ecc4ef39544541eeb1644d34cc10f9ffc5087808210c4ff golangci-lint-1.45.2-linux-s390x.deb +9427dbf51d0ac6f73a0f992838bd40c817470cc5bf6c8e2e2bea6fac46d7af6e golangci-lint-1.45.2-linux-ppc64le.tar.gz +995e509e895ca6a64ffc7395ac884d5961bdec98423cb896b17f345a9b4a19cf golangci-lint-1.45.2-darwin-amd64.tar.gz +a3f36278f2ea5516341e9071a2df6e65df272be80230b5406a12b72c6d425bee golangci-lint-1.45.2-linux-armv7.rpm +a5e12c50c23e87ac1deffc872f92ae85427b1198604969399805ae47cfe43f08 golangci-lint-1.45.2-linux-riscv64.tar.gz +aa8fa1be0729dbc2fbc4e01e82027097613eee74bd686ebef20f860b01fff8b3 golangci-lint-1.45.2-freebsd-armv6.tar.gz +c2b9669decc1b638cf2ee9060571af4e255f6dfcbb225c293e3a7ee4bb2c7217 golangci-lint-1.45.2-darwin-arm64.tar.gz +dfa8bdaf0387aec1cd5c1aa8857f67b2bbdfc2e42efce540c8fb9bbe3e8af302 golangci-lint-1.45.2-linux-armv6.tar.gz +eb8b8539dd017eee5c131ea9b875893ab2cebeeca41e8c6624907fb02224d643 golangci-lint-1.45.2-linux-386.rpm +ed6c7e17a857f30d715c5302fa250d95936936b277024bffea201187a257d7a7 golangci-lint-1.45.2-linux-armv6.deb +ef4d0154ace4001f01b288baeb118176242efb4fd163e178763e3213b77ef30b golangci-lint-1.45.2-linux-mips64le.deb +ef7002a2229f5ff5ba201a715fcf877664ea88decbe58e69d163293913024955 golangci-lint-1.45.2-linux-s390x.tar.gz +f13ecbd09228632e6bbe91a8324bd675c406eed22eb6d2c1e8192eed9ec4f914 golangci-lint-1.45.2-linux-386.tar.gz +f4cd9cfb09252f51699407277512263cae8409b665dd764f55a34738d0e89edc golangci-lint-1.45.2-linux-riscv64.rpm +fb1945dc59d37c9d14bf0a4aea11ea8651fa0e1d582ea80c4c44d0a536c08893 golangci-lint-1.45.2-linux-mips64.tar.gz +fe542c22738010f453c735a3c410decfd3784d1bd394b395c298ee298fc4c606 golangci-lint-1.45.2-linux-mips64le.rpm diff --git a/build/ci.go b/build/ci.go index 8b302511a7..c3dccfc588 100644 --- a/build/ci.go +++ b/build/ci.go @@ -130,13 +130,14 @@ var ( // Distros for which packages are created. // Note: vivid is unsupported because there is no golang-1.6 package for it. // Note: the following Ubuntu releases have been officially deprecated on Launchpad: - // wily, yakkety, zesty, artful, cosmic, disco, eoan, groovy + // wily, yakkety, zesty, artful, cosmic, disco, eoan, groovy, hirsuite debDistroGoBoots = map[string]string{ - "trusty": "golang-1.11", - "xenial": "golang-go", - "bionic": "golang-go", - "focal": "golang-go", - "hirsute": "golang-go", + "trusty": "golang-1.11", // EOL: 04/2024 + "xenial": "golang-go", // EOL: 04/2026 + "bionic": "golang-go", // EOL: 04/2028 + "focal": "golang-go", // EOL: 04/2030 + "impish": "golang-go", // EOL: 07/2022 + // "jammy": "golang-go", // EOL: 04/2027 } debGoBootPaths = map[string]string{ @@ -147,7 +148,7 @@ var ( // This is the version of go that will be downloaded by // // go run ci.go install -dlgo - dlgoVersion = "1.17.5" + dlgoVersion = "1.18" ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) @@ -331,12 +332,21 @@ func doLint(cmdline []string) { // downloadLinter downloads and unpacks golangci-lint. func downloadLinter(cachedir string) string { - const version = "1.42.0" + const version = "1.45.2" csdb := build.MustLoadChecksums("build/checksums.txt") - base := fmt.Sprintf("golangci-lint-%s-%s-%s", version, runtime.GOOS, runtime.GOARCH) - url := fmt.Sprintf("https://github.com/golangci/golangci-lint/releases/download/v%s/%s.tar.gz", version, base) - archivePath := filepath.Join(cachedir, base+".tar.gz") + arch := runtime.GOARCH + ext := ".tar.gz" + + if runtime.GOOS == "windows" { + ext = ".zip" + } + if arch == "arm" { + arch += "v" + os.Getenv("GOARM") + } + base := fmt.Sprintf("golangci-lint-%s-%s-%s", version, runtime.GOOS, arch) + url := fmt.Sprintf("https://github.com/golangci/golangci-lint/releases/download/v%s/%s%s", version, base, ext) + archivePath := filepath.Join(cachedir, base+ext) if err := csdb.DownloadFile(url, archivePath); err != nil { log.Fatal(err) } @@ -1233,21 +1243,21 @@ func doPurge(cmdline []string) { // Iterate over the blobs, collect and sort all unstable builds for i := 0; i < len(blobs); i++ { - if !strings.Contains(blobs[i].Name, "unstable") { + if !strings.Contains(*blobs[i].Name, "unstable") { blobs = append(blobs[:i], blobs[i+1:]...) i-- } } for i := 0; i < len(blobs); i++ { for j := i + 1; j < len(blobs); j++ { - if blobs[i].Properties.LastModified.After(blobs[j].Properties.LastModified) { + if blobs[i].Properties.LastModified.After(*blobs[j].Properties.LastModified) { blobs[i], blobs[j] = blobs[j], blobs[i] } } } // Filter out all archives more recent that the given threshold for i, blob := range blobs { - if time.Since(blob.Properties.LastModified) < time.Duration(*limit)*24*time.Hour { + if time.Since(*blob.Properties.LastModified) < time.Duration(*limit)*24*time.Hour { blobs = blobs[:i] break } diff --git a/cmd/clef/main.go b/cmd/clef/main.go index 3aaf898db2..f7c3adebc4 100644 --- a/cmd/clef/main.go +++ b/cmd/clef/main.go @@ -661,7 +661,7 @@ func signer(c *cli.Context) error { if err != nil { utils.Fatalf("Could not register API: %w", err) } - handler := node.NewHTTPHandlerStack(srv, cors, vhosts) + handler := node.NewHTTPHandlerStack(srv, cors, vhosts, nil) // set port port := c.Int(rpcPortFlag.Name) diff --git a/cmd/devp2p/internal/ethtest/chain.go b/cmd/devp2p/internal/ethtest/chain.go index 7dcb412b53..d0d55a455d 100644 --- a/cmd/devp2p/internal/ethtest/chain.go +++ b/cmd/devp2p/internal/ethtest/chain.go @@ -26,6 +26,7 @@ import ( "os" "strings" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/go-ethereum/core/types" @@ -67,6 +68,13 @@ func (c *Chain) TotalDifficultyAt(height int) *big.Int { return sum } +func (c *Chain) RootAt(height int) common.Hash { + if height < c.Len() { + return c.blocks[height].Root() + } + return common.Hash{} +} + // ForkID gets the fork id of the chain. func (c *Chain) ForkID() forkid.ID { return forkid.NewID(c.chainConfig, c.blocks[0].Hash(), uint64(c.Len())) diff --git a/cmd/devp2p/internal/ethtest/helpers.go b/cmd/devp2p/internal/ethtest/helpers.go index e695cd42d6..dd9dfd8619 100644 --- a/cmd/devp2p/internal/ethtest/helpers.go +++ b/cmd/devp2p/internal/ethtest/helpers.go @@ -96,6 +96,19 @@ func (s *Suite) dial66() (*Conn, error) { return conn, nil } +// dial66 attempts to dial the given node and perform a handshake, +// returning the created Conn with additional snap/1 capabilities if +// successful. +func (s *Suite) dialSnap() (*Conn, error) { + conn, err := s.dial66() + if err != nil { + return nil, fmt.Errorf("dial failed: %v", err) + } + conn.caps = append(conn.caps, p2p.Cap{Name: "snap", Version: 1}) + conn.ourHighestSnapProtoVersion = 1 + return conn, nil +} + // peer performs both the protocol handshake and the status message // exchange with the node in order to peer with it. func (c *Conn) peer(chain *Chain, status *Status) error { @@ -131,7 +144,11 @@ func (c *Conn) handshake() error { } c.negotiateEthProtocol(msg.Caps) if c.negotiatedProtoVersion == 0 { - return fmt.Errorf("could not negotiate protocol (remote caps: %v, local eth version: %v)", msg.Caps, c.ourHighestProtoVersion) + return fmt.Errorf("could not negotiate eth protocol (remote caps: %v, local eth version: %v)", msg.Caps, c.ourHighestProtoVersion) + } + // If we require snap, verify that it was negotiated + if c.ourHighestSnapProtoVersion != c.negotiatedSnapProtoVersion { + return fmt.Errorf("could not negotiate snap protocol (remote caps: %v, local snap version: %v)", msg.Caps, c.ourHighestSnapProtoVersion) } return nil default: @@ -143,15 +160,21 @@ func (c *Conn) handshake() error { // advertised capability from peer. func (c *Conn) negotiateEthProtocol(caps []p2p.Cap) { var highestEthVersion uint + var highestSnapVersion uint for _, capability := range caps { - if capability.Name != "eth" { - continue - } - if capability.Version > highestEthVersion && capability.Version <= c.ourHighestProtoVersion { - highestEthVersion = capability.Version + switch capability.Name { + case "eth": + if capability.Version > highestEthVersion && capability.Version <= c.ourHighestProtoVersion { + highestEthVersion = capability.Version + } + case "snap": + if capability.Version > highestSnapVersion && capability.Version <= c.ourHighestSnapProtoVersion { + highestSnapVersion = capability.Version + } } } c.negotiatedProtoVersion = highestEthVersion + c.negotiatedSnapProtoVersion = highestSnapVersion } // statusExchange performs a `Status` message exchange with the given node. @@ -325,6 +348,15 @@ func (c *Conn) headersRequest(request *GetBlockHeaders, chain *Chain, isEth66 bo } } +func (c *Conn) snapRequest(msg Message, id uint64, chain *Chain) (Message, error) { + defer c.SetReadDeadline(time.Time{}) + c.SetReadDeadline(time.Now().Add(5 * time.Second)) + if err := c.Write(msg); err != nil { + return nil, fmt.Errorf("could not write to connection: %v", err) + } + return c.ReadSnap(id) +} + // getBlockHeaders66 executes the given `GetBlockHeaders` request over the eth66 protocol. func getBlockHeaders66(chain *Chain, conn *Conn, request *GetBlockHeaders, id uint64) (BlockHeaders, error) { // write request diff --git a/cmd/devp2p/internal/ethtest/snap.go b/cmd/devp2p/internal/ethtest/snap.go new file mode 100644 index 0000000000..95dd90fd3b --- /dev/null +++ b/cmd/devp2p/internal/ethtest/snap.go @@ -0,0 +1,675 @@ +// Copyright 2014 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 . + +package ethtest + +import ( + "bytes" + "errors" + "fmt" + "math/rand" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/protocols/snap" + "github.com/ethereum/go-ethereum/internal/utesting" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/trie" + "golang.org/x/crypto/sha3" +) + +func (s *Suite) TestSnapStatus(t *utesting.T) { + conn, err := s.dialSnap() + if err != nil { + t.Fatalf("dial failed: %v", err) + } + defer conn.Close() + if err := conn.peer(s.chain, nil); err != nil { + t.Fatalf("peering failed: %v", err) + } +} + +type accRangeTest struct { + nBytes uint64 + root common.Hash + origin common.Hash + limit common.Hash + + expAccounts int + expFirst common.Hash + expLast common.Hash +} + +// TestSnapGetAccountRange various forms of GetAccountRange requests. +func (s *Suite) TestSnapGetAccountRange(t *utesting.T) { + var ( + root = s.chain.RootAt(999) + ffHash = common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") + zero = common.Hash{} + firstKeyMinus1 = common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf29") + firstKey = common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a") + firstKeyPlus1 = common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2b") + secondKey = common.HexToHash("0x09e47cd5056a689e708f22fe1f932709a320518e444f5f7d8d46a3da523d6606") + storageRoot = common.HexToHash("0xbe3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790") + ) + for i, tc := range []accRangeTest{ + // Tests decreasing the number of bytes + {4000, root, zero, ffHash, 76, firstKey, common.HexToHash("0xd2669dcf3858e7f1eecb8b5fedbf22fbea3e9433848a75035f79d68422c2dcda")}, + {3000, root, zero, ffHash, 57, firstKey, common.HexToHash("0x9b63fa753ece5cb90657d02ecb15df4dc1508d8c1d187af1bf7f1a05e747d3c7")}, + {2000, root, zero, ffHash, 38, firstKey, common.HexToHash("0x5e6140ecae4354a9e8f47559a8c6209c1e0e69cb077b067b528556c11698b91f")}, + {1, root, zero, ffHash, 1, firstKey, firstKey}, + + // Tests variations of the range + // + // [00b to firstkey]: should return [firstkey, secondkey], where secondkey is out of bounds + {4000, root, common.HexToHash("0x00bf000000000000000000000000000000000000000000000000000000000000"), common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2b"), 2, firstKey, secondKey}, + // [00b0 to 0bf0]: where both are before firstkey. Should return firstKey (even though it's out of bounds) + {4000, root, common.HexToHash("0x00b0000000000000000000000000000000000000000000000000000000000000"), common.HexToHash("0x00bf100000000000000000000000000000000000000000000000000000000000"), 1, firstKey, firstKey}, + {4000, root, zero, zero, 1, firstKey, firstKey}, + {4000, root, firstKey, ffHash, 76, firstKey, common.HexToHash("0xd2669dcf3858e7f1eecb8b5fedbf22fbea3e9433848a75035f79d68422c2dcda")}, + {4000, root, firstKeyPlus1, ffHash, 76, secondKey, common.HexToHash("0xd28f55d3b994f16389f36944ad685b48e0fc3f8fbe86c3ca92ebecadf16a783f")}, + + // Test different root hashes + // + // A stateroot that does not exist + {4000, common.Hash{0x13, 37}, zero, ffHash, 0, zero, zero}, + // The genesis stateroot (we expect it to not be served) + {4000, s.chain.RootAt(0), zero, ffHash, 0, zero, zero}, + // A 127 block old stateroot, expected to be served + {4000, s.chain.RootAt(999 - 127), zero, ffHash, 77, firstKey, common.HexToHash("0xe4c6fdef5dd4e789a2612390806ee840b8ec0fe52548f8b4efe41abb20c37aac")}, + // A root which is not actually an account root, but a storage orot + {4000, storageRoot, zero, ffHash, 0, zero, zero}, + + // And some non-sensical requests + // + // range from [0xFF to 0x00], wrong order. Expect not to be serviced + {4000, root, ffHash, zero, 0, zero, zero}, + // range from [firstkey, firstkey-1], wrong order. Expect to get first key. + {4000, root, firstKey, firstKeyMinus1, 1, firstKey, firstKey}, + // range from [firstkey, 0], wrong order. Expect to get first key. + {4000, root, firstKey, zero, 1, firstKey, firstKey}, + // Max bytes: 0. Expect to deliver one account. + {0, root, zero, ffHash, 1, firstKey, firstKey}, + } { + if err := s.snapGetAccountRange(t, &tc); err != nil { + t.Errorf("test %d \n root: %x\n range: %#x - %#x\n bytes: %d\nfailed: %v", i, tc.root, tc.origin, tc.limit, tc.nBytes, err) + } + } +} + +type stRangesTest struct { + root common.Hash + accounts []common.Hash + origin []byte + limit []byte + nBytes uint64 + + expSlots int +} + +// TestSnapGetStorageRange various forms of GetStorageRanges requests. +func (s *Suite) TestSnapGetStorageRanges(t *utesting.T) { + var ( + ffHash = common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") + zero = common.Hash{} + firstKey = common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a") + secondKey = common.HexToHash("0x09e47cd5056a689e708f22fe1f932709a320518e444f5f7d8d46a3da523d6606") + ) + for i, tc := range []stRangesTest{ + { + root: s.chain.RootAt(999), + accounts: []common.Hash{secondKey, firstKey}, + origin: zero[:], + limit: ffHash[:], + nBytes: 500, + expSlots: 0, + }, + + /* + Some tests against this account: + { + "balance": "0", + "nonce": 1, + "root": "0xbe3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "storage": { + "0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace": "02", + "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6": "01", + "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "03" + }, + "key": "0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844" + } + */ + { // [:] -> [slot1, slot2, slot3] + root: s.chain.RootAt(999), + accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")}, + origin: zero[:], + limit: ffHash[:], + nBytes: 500, + expSlots: 3, + }, + { // [slot1:] -> [slot1, slot2, slot3] + root: s.chain.RootAt(999), + accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")}, + origin: common.FromHex("0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace"), + limit: ffHash[:], + nBytes: 500, + expSlots: 3, + }, + { // [slot1+ :] -> [slot2, slot3] + root: s.chain.RootAt(999), + accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")}, + origin: common.FromHex("0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf"), + limit: ffHash[:], + nBytes: 500, + expSlots: 2, + }, + { // [slot1:slot2] -> [slot1, slot2] + root: s.chain.RootAt(999), + accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")}, + origin: common.FromHex("0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace"), + limit: common.FromHex("0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6"), + nBytes: 500, + expSlots: 2, + }, + { // [slot1+:slot2+] -> [slot2, slot3] + root: s.chain.RootAt(999), + accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")}, + origin: common.FromHex("0x4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + limit: common.FromHex("0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7"), + nBytes: 500, + expSlots: 2, + }, + } { + if err := s.snapGetStorageRanges(t, &tc); err != nil { + t.Errorf("test %d \n root: %x\n range: %#x - %#x\n bytes: %d\n #accounts: %d\nfailed: %v", + i, tc.root, tc.origin, tc.limit, tc.nBytes, len(tc.accounts), err) + } + } +} + +type byteCodesTest struct { + nBytes uint64 + hashes []common.Hash + + expHashes int +} + +var ( + // emptyRoot is the known root hash of an empty trie. + emptyRoot = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") + // emptyCode is the known hash of the empty EVM bytecode. + emptyCode = common.HexToHash("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470") +) + +// TestSnapGetByteCodes various forms of GetByteCodes requests. +func (s *Suite) TestSnapGetByteCodes(t *utesting.T) { + // The halfchain import should yield these bytecodes + var hcBytecodes []common.Hash + for _, s := range []string{ + "0x200c90460d8b0063210d5f5b9918e053c8f2c024485e0f1b48be8b1fc71b1317", + "0x20ba67ed4ac6aff626e0d1d4db623e2fada9593daeefc4a6eb4b70e6cff986f3", + "0x24b5b4902cb3d897c1cee9f16be8e897d8fa277c04c6dc8214f18295fca5de44", + "0x320b9d0a2be39b8a1c858f9f8cb96b1df0983071681de07ded3a7c0d05db5fd6", + "0x48cb0d5275936a24632babc7408339f9f7b051274809de565b8b0db76e97e03c", + "0x67c7a6f5cdaa43b4baa0e15b2be63346d1b9ce9f2c3d7e5804e0cacd44ee3b04", + "0x6d8418059bdc8c3fabf445e6bfc662af3b6a4ae45999b953996e42c7ead2ab49", + "0x7043422e5795d03f17ee0463a37235258e609fdd542247754895d72695e3e142", + "0x727f9e6f0c4bac1ff8d72c2972122d9c8d37ccb37e04edde2339e8da193546f1", + "0x86ccd5e23c78568a8334e0cebaf3e9f48c998307b0bfb1c378cee83b4bfb29cb", + "0x8fc89b00d6deafd4c4279531e743365626dbfa28845ec697919d305c2674302d", + "0x92cfc353bcb9746bb6f9996b6b9df779c88af2e9e0eeac44879ca19887c9b732", + "0x941b4872104f0995a4898fcf0f615ea6bf46bfbdfcf63ea8f2fd45b3f3286b77", + "0xa02fe8f41159bb39d2b704c633c3d6389cf4bfcb61a2539a9155f60786cf815f", + "0xa4b94e0afdffcb0af599677709dac067d3145489ea7aede57672bee43e3b7373", + "0xaf4e64edd3234c1205b725e42963becd1085f013590bd7ed93f8d711c5eb65fb", + "0xb69a18fa855b742031420081999086f6fb56c3930ae8840944e8b8ae9931c51e", + "0xc246c217bc73ce6666c93a93a94faa5250564f50a3fdc27ea74c231c07fe2ca6", + "0xcd6e4ab2c3034df2a8a1dfaaeb1c4baecd162a93d22de35e854ee2945cbe0c35", + "0xe24b692d09d6fc2f3d1a6028c400a27c37d7cbb11511907c013946d6ce263d3b", + "0xe440c5f0e8603fd1ed25976eee261ccee8038cf79d6a4c0eb31b2bf883be737f", + "0xe6eacbc509203d21ac814b350e72934fde686b7f673c19be8cf956b0c70078ce", + "0xe8530de4371467b5be7ea0e69e675ab36832c426d6c1ce9513817c0f0ae1486b", + "0xe85d487abbbc83bf3423cf9731360cf4f5a37220e18e5add54e72ee20861196a", + "0xf195ea389a5eea28db0be93660014275b158963dec44af1dfa7d4743019a9a49", + } { + hcBytecodes = append(hcBytecodes, common.HexToHash(s)) + } + + for i, tc := range []byteCodesTest{ + // A few stateroots + { + nBytes: 10000, hashes: []common.Hash{s.chain.RootAt(0), s.chain.RootAt(999)}, + expHashes: 0, + }, + { + nBytes: 10000, hashes: []common.Hash{s.chain.RootAt(0), s.chain.RootAt(0)}, + expHashes: 0, + }, + // Empties + { + nBytes: 10000, hashes: []common.Hash{emptyRoot}, + expHashes: 0, + }, + { + nBytes: 10000, hashes: []common.Hash{emptyCode}, + expHashes: 1, + }, + { + nBytes: 10000, hashes: []common.Hash{emptyCode, emptyCode, emptyCode}, + expHashes: 3, + }, + // The existing bytecodes + { + nBytes: 10000, hashes: hcBytecodes, + expHashes: len(hcBytecodes), + }, + // The existing, with limited byte arg + { + nBytes: 1, hashes: hcBytecodes, + expHashes: 1, + }, + { + nBytes: 0, hashes: hcBytecodes, + expHashes: 1, + }, + { + nBytes: 1000, hashes: []common.Hash{hcBytecodes[0], hcBytecodes[0], hcBytecodes[0], hcBytecodes[0]}, + expHashes: 4, + }, + } { + if err := s.snapGetByteCodes(t, &tc); err != nil { + t.Errorf("test %d \n bytes: %d\n #hashes: %d\nfailed: %v", i, tc.nBytes, len(tc.hashes), err) + } + } +} + +type trieNodesTest struct { + root common.Hash + paths []snap.TrieNodePathSet + nBytes uint64 + + expHashes []common.Hash + expReject bool +} + +func decodeNibbles(nibbles []byte, bytes []byte) { + for bi, ni := 0, 0; ni < len(nibbles); bi, ni = bi+1, ni+2 { + bytes[bi] = nibbles[ni]<<4 | nibbles[ni+1] + } +} + +// hasTerm returns whether a hex key has the terminator flag. +func hasTerm(s []byte) bool { + return len(s) > 0 && s[len(s)-1] == 16 +} + +func keybytesToHex(str []byte) []byte { + l := len(str)*2 + 1 + var nibbles = make([]byte, l) + for i, b := range str { + nibbles[i*2] = b / 16 + nibbles[i*2+1] = b % 16 + } + nibbles[l-1] = 16 + return nibbles +} + +func hexToCompact(hex []byte) []byte { + terminator := byte(0) + if hasTerm(hex) { + terminator = 1 + hex = hex[:len(hex)-1] + } + buf := make([]byte, len(hex)/2+1) + buf[0] = terminator << 5 // the flag byte + if len(hex)&1 == 1 { + buf[0] |= 1 << 4 // odd flag + buf[0] |= hex[0] // first nibble is contained in the first byte + hex = hex[1:] + } + decodeNibbles(hex, buf[1:]) + return buf +} + +// TestSnapTrieNodes various forms of GetTrieNodes requests. +func (s *Suite) TestSnapTrieNodes(t *utesting.T) { + + key := common.FromHex("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a") + // helper function to iterate the key, and generate the compact-encoded + // trie paths along the way. + pathTo := func(length int) snap.TrieNodePathSet { + hex := keybytesToHex(key)[:length] + hex[len(hex)-1] = 0 // remove term flag + hKey := hexToCompact(hex) + return snap.TrieNodePathSet{hKey} + } + var accPaths []snap.TrieNodePathSet + for i := 1; i <= 65; i++ { + accPaths = append(accPaths, pathTo(i)) + } + empty := emptyCode + for i, tc := range []trieNodesTest{ + { + root: s.chain.RootAt(999), + paths: nil, + nBytes: 500, + expHashes: nil, + }, + { + root: s.chain.RootAt(999), + paths: []snap.TrieNodePathSet{ + snap.TrieNodePathSet{}, // zero-length pathset should 'abort' and kick us off + snap.TrieNodePathSet{[]byte{0}}, + }, + nBytes: 5000, + expHashes: []common.Hash{}, + expReject: true, + }, + { + root: s.chain.RootAt(999), + paths: []snap.TrieNodePathSet{ + snap.TrieNodePathSet{[]byte{0}}, + snap.TrieNodePathSet{[]byte{1}, []byte{0}}, + }, + nBytes: 5000, + //0x6b3724a41b8c38b46d4d02fba2bb2074c47a507eb16a9a4b978f91d32e406faf + expHashes: []common.Hash{s.chain.RootAt(999)}, + }, + { // nonsensically long path + root: s.chain.RootAt(999), + paths: []snap.TrieNodePathSet{ + snap.TrieNodePathSet{[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8}}, + }, + nBytes: 5000, + expHashes: []common.Hash{common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470")}, + }, + { + root: s.chain.RootAt(0), + paths: []snap.TrieNodePathSet{ + snap.TrieNodePathSet{[]byte{0}}, + snap.TrieNodePathSet{[]byte{1}, []byte{0}}, + }, + nBytes: 5000, + expHashes: []common.Hash{}, + }, + { + // The leaf is only a couple of levels down, so the continued trie traversal causes lookup failures. + root: s.chain.RootAt(999), + paths: accPaths, + nBytes: 5000, + expHashes: []common.Hash{ + common.HexToHash("0xbcefee69b37cca1f5bf3a48aebe08b35f2ea1864fa958bb0723d909a0e0d28d8"), + common.HexToHash("0x4fb1e4e2391e4b4da471d59641319b8fa25d76c973d4bec594d7b00a69ae5135"), + empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, + empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, + empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, + empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, + empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, + empty, empty, empty}, + }, + { + // Basically the same as above, with different ordering + root: s.chain.RootAt(999), + paths: []snap.TrieNodePathSet{ + accPaths[10], accPaths[1], accPaths[0], + }, + nBytes: 5000, + expHashes: []common.Hash{ + empty, + common.HexToHash("0x4fb1e4e2391e4b4da471d59641319b8fa25d76c973d4bec594d7b00a69ae5135"), + common.HexToHash("0xbcefee69b37cca1f5bf3a48aebe08b35f2ea1864fa958bb0723d909a0e0d28d8"), + }, + }, + } { + if err := s.snapGetTrieNodes(t, &tc); err != nil { + t.Errorf("test %d \n #hashes %x\n root: %#x\n bytes: %d\nfailed: %v", i, len(tc.expHashes), tc.root, tc.nBytes, err) + } + } +} + +func (s *Suite) snapGetAccountRange(t *utesting.T, tc *accRangeTest) error { + conn, err := s.dialSnap() + if err != nil { + t.Fatalf("dial failed: %v", err) + } + defer conn.Close() + if err = conn.peer(s.chain, nil); err != nil { + t.Fatalf("peering failed: %v", err) + } + // write request + req := &GetAccountRange{ + ID: uint64(rand.Int63()), + Root: tc.root, + Origin: tc.origin, + Limit: tc.limit, + Bytes: tc.nBytes, + } + resp, err := conn.snapRequest(req, req.ID, s.chain) + if err != nil { + return fmt.Errorf("account range request failed: %v", err) + } + var res *snap.AccountRangePacket + if r, ok := resp.(*AccountRange); !ok { + return fmt.Errorf("account range response wrong: %T %v", resp, resp) + } else { + res = (*snap.AccountRangePacket)(r) + } + if exp, got := tc.expAccounts, len(res.Accounts); exp != got { + return fmt.Errorf("expected %d accounts, got %d", exp, got) + } + // Check that the encoding order is correct + for i := 1; i < len(res.Accounts); i++ { + if bytes.Compare(res.Accounts[i-1].Hash[:], res.Accounts[i].Hash[:]) >= 0 { + return fmt.Errorf("accounts not monotonically increasing: #%d [%x] vs #%d [%x]", i-1, res.Accounts[i-1].Hash[:], i, res.Accounts[i].Hash[:]) + } + } + var ( + hashes []common.Hash + accounts [][]byte + proof = res.Proof + ) + hashes, accounts, err = res.Unpack() + if err != nil { + return err + } + if len(hashes) == 0 && len(accounts) == 0 && len(proof) == 0 { + return nil + } + if len(hashes) > 0 { + if exp, got := tc.expFirst, res.Accounts[0].Hash; exp != got { + return fmt.Errorf("expected first account 0x%x, got 0x%x", exp, got) + } + if exp, got := tc.expLast, res.Accounts[len(res.Accounts)-1].Hash; exp != got { + return fmt.Errorf("expected last account 0x%x, got 0x%x", exp, got) + } + } + // Reconstruct a partial trie from the response and verify it + keys := make([][]byte, len(hashes)) + for i, key := range hashes { + keys[i] = common.CopyBytes(key[:]) + } + nodes := make(light.NodeList, len(proof)) + for i, node := range proof { + nodes[i] = node + } + proofdb := nodes.NodeSet() + + var end []byte + if len(keys) > 0 { + end = keys[len(keys)-1] + } + _, err = trie.VerifyRangeProof(tc.root, tc.origin[:], end, keys, accounts, proofdb) + return err +} + +func (s *Suite) snapGetStorageRanges(t *utesting.T, tc *stRangesTest) error { + conn, err := s.dialSnap() + if err != nil { + t.Fatalf("dial failed: %v", err) + } + defer conn.Close() + if err = conn.peer(s.chain, nil); err != nil { + t.Fatalf("peering failed: %v", err) + } + // write request + req := &GetStorageRanges{ + ID: uint64(rand.Int63()), + Root: tc.root, + Accounts: tc.accounts, + Origin: tc.origin, + Limit: tc.limit, + Bytes: tc.nBytes, + } + resp, err := conn.snapRequest(req, req.ID, s.chain) + if err != nil { + return fmt.Errorf("account range request failed: %v", err) + } + var res *snap.StorageRangesPacket + if r, ok := resp.(*StorageRanges); !ok { + return fmt.Errorf("account range response wrong: %T %v", resp, resp) + } else { + res = (*snap.StorageRangesPacket)(r) + } + gotSlots := 0 + // Ensure the ranges are monotonically increasing + for i, slots := range res.Slots { + gotSlots += len(slots) + for j := 1; j < len(slots); j++ { + if bytes.Compare(slots[j-1].Hash[:], slots[j].Hash[:]) >= 0 { + return fmt.Errorf("storage slots not monotonically increasing for account #%d: #%d [%x] vs #%d [%x]", i, j-1, slots[j-1].Hash[:], j, slots[j].Hash[:]) + } + } + } + if exp, got := tc.expSlots, gotSlots; exp != got { + return fmt.Errorf("expected %d slots, got %d", exp, got) + } + return nil +} + +func (s *Suite) snapGetByteCodes(t *utesting.T, tc *byteCodesTest) error { + conn, err := s.dialSnap() + if err != nil { + t.Fatalf("dial failed: %v", err) + } + defer conn.Close() + if err = conn.peer(s.chain, nil); err != nil { + t.Fatalf("peering failed: %v", err) + } + // write request + req := &GetByteCodes{ + ID: uint64(rand.Int63()), + Hashes: tc.hashes, + Bytes: tc.nBytes, + } + resp, err := conn.snapRequest(req, req.ID, s.chain) + if err != nil { + return fmt.Errorf("getBytecodes request failed: %v", err) + } + var res *snap.ByteCodesPacket + if r, ok := resp.(*ByteCodes); !ok { + return fmt.Errorf("bytecodes response wrong: %T %v", resp, resp) + } else { + res = (*snap.ByteCodesPacket)(r) + } + if exp, got := tc.expHashes, len(res.Codes); exp != got { + for i, c := range res.Codes { + fmt.Printf("%d. %#x\n", i, c) + } + return fmt.Errorf("expected %d bytecodes, got %d", exp, got) + } + // Cross reference the requested bytecodes with the response to find gaps + // that the serving node is missing + var ( + bytecodes = res.Codes + hasher = sha3.NewLegacyKeccak256().(crypto.KeccakState) + hash = make([]byte, 32) + codes = make([][]byte, len(req.Hashes)) + ) + + for i, j := 0, 0; i < len(bytecodes); i++ { + // Find the next hash that we've been served, leaving misses with nils + hasher.Reset() + hasher.Write(bytecodes[i]) + hasher.Read(hash) + + for j < len(req.Hashes) && !bytes.Equal(hash, req.Hashes[j][:]) { + j++ + } + if j < len(req.Hashes) { + codes[j] = bytecodes[i] + j++ + continue + } + // We've either ran out of hashes, or got unrequested data + return errors.New("unexpected bytecode") + } + + return nil +} + +func (s *Suite) snapGetTrieNodes(t *utesting.T, tc *trieNodesTest) error { + conn, err := s.dialSnap() + if err != nil { + t.Fatalf("dial failed: %v", err) + } + defer conn.Close() + if err = conn.peer(s.chain, nil); err != nil { + t.Fatalf("peering failed: %v", err) + } + // write request + req := &GetTrieNodes{ + ID: uint64(rand.Int63()), + Root: tc.root, + Paths: tc.paths, + Bytes: tc.nBytes, + } + resp, err := conn.snapRequest(req, req.ID, s.chain) + if err != nil { + if tc.expReject { + return nil + } + return fmt.Errorf("trienodes request failed: %v", err) + } + var res *snap.TrieNodesPacket + if r, ok := resp.(*TrieNodes); !ok { + return fmt.Errorf("trienodes response wrong: %T %v", resp, resp) + } else { + res = (*snap.TrieNodesPacket)(r) + } + + // Check the correctness + + // Cross reference the requested trienodes with the response to find gaps + // that the serving node is missing + hasher := sha3.NewLegacyKeccak256().(crypto.KeccakState) + hash := make([]byte, 32) + trienodes := res.Nodes + if got, want := len(trienodes), len(tc.expHashes); got != want { + return fmt.Errorf("wrong trienode count, got %d, want %d\n", got, want) + } + for i, trienode := range trienodes { + hasher.Reset() + hasher.Write(trienode) + hasher.Read(hash) + if got, want := hash, tc.expHashes[i]; !bytes.Equal(got, want[:]) { + fmt.Printf("hash %d wrong, got %#x, want %#x\n", i, got, want) + err = fmt.Errorf("hash %d wrong, got %#x, want %#x", i, got, want) + } + } + return err +} diff --git a/cmd/devp2p/internal/ethtest/snapTypes.go b/cmd/devp2p/internal/ethtest/snapTypes.go new file mode 100644 index 0000000000..bb8638c3d8 --- /dev/null +++ b/cmd/devp2p/internal/ethtest/snapTypes.go @@ -0,0 +1,36 @@ +package ethtest + +import "github.com/ethereum/go-ethereum/eth/protocols/snap" + +// GetAccountRange represents an account range query. +type GetAccountRange snap.GetAccountRangePacket + +func (g GetAccountRange) Code() int { return 33 } + +type AccountRange snap.AccountRangePacket + +func (g AccountRange) Code() int { return 34 } + +type GetStorageRanges snap.GetStorageRangesPacket + +func (g GetStorageRanges) Code() int { return 35 } + +type StorageRanges snap.StorageRangesPacket + +func (g StorageRanges) Code() int { return 36 } + +type GetByteCodes snap.GetByteCodesPacket + +func (g GetByteCodes) Code() int { return 37 } + +type ByteCodes snap.ByteCodesPacket + +func (g ByteCodes) Code() int { return 38 } + +type GetTrieNodes snap.GetTrieNodesPacket + +func (g GetTrieNodes) Code() int { return 39 } + +type TrieNodes snap.TrieNodesPacket + +func (g TrieNodes) Code() int { return 40 } diff --git a/cmd/devp2p/internal/ethtest/suite.go b/cmd/devp2p/internal/ethtest/suite.go index 28ba4aa767..dee59bc579 100644 --- a/cmd/devp2p/internal/ethtest/suite.go +++ b/cmd/devp2p/internal/ethtest/suite.go @@ -125,6 +125,16 @@ func (s *Suite) Eth66Tests() []utesting.Test { } } +func (s *Suite) SnapTests() []utesting.Test { + return []utesting.Test{ + {Name: "TestSnapStatus", Fn: s.TestSnapStatus}, + {Name: "TestSnapAccountRange", Fn: s.TestSnapGetAccountRange}, + {Name: "TestSnapGetByteCodes", Fn: s.TestSnapGetByteCodes}, + {Name: "TestSnapGetTrieNodes", Fn: s.TestSnapTrieNodes}, + {Name: "TestSnapGetStorageRanges", Fn: s.TestSnapGetStorageRanges}, + } +} + var ( eth66 = true // indicates whether suite should negotiate eth66 connection eth65 = false // indicates whether suite should negotiate eth65 connection or below. diff --git a/cmd/devp2p/internal/ethtest/suite_test.go b/cmd/devp2p/internal/ethtest/suite_test.go index 6d14404e66..9bc55bc0ab 100644 --- a/cmd/devp2p/internal/ethtest/suite_test.go +++ b/cmd/devp2p/internal/ethtest/suite_test.go @@ -55,6 +55,27 @@ func TestEthSuite(t *testing.T) { } } +func TestSnapSuite(t *testing.T) { + geth, err := runGeth() + if err != nil { + t.Fatalf("could not run geth: %v", err) + } + defer geth.Close() + + suite, err := NewSuite(geth.Server().Self(), fullchainFile, genesisFile) + if err != nil { + t.Fatalf("could not create new test suite: %v", err) + } + for _, test := range suite.SnapTests() { + t.Run(test.Name, func(t *testing.T) { + result := utesting.RunTAP([]utesting.Test{{Name: test.Name, Fn: test.Fn}}, os.Stdout) + if result[0].Failed { + t.Fatal() + } + }) + } +} + // runGeth creates and starts a geth node func runGeth() (*node.Node, error) { stack, err := node.New(&node.Config{ diff --git a/cmd/devp2p/internal/ethtest/types.go b/cmd/devp2p/internal/ethtest/types.go index e49ea284e9..09bb218d51 100644 --- a/cmd/devp2p/internal/ethtest/types.go +++ b/cmd/devp2p/internal/ethtest/types.go @@ -19,6 +19,7 @@ package ethtest import ( "crypto/ecdsa" "fmt" + "time" "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/p2p" @@ -126,10 +127,12 @@ func (pt PooledTransactions) Code() int { return 26 } // Conn represents an individual connection with a peer type Conn struct { *rlpx.Conn - ourKey *ecdsa.PrivateKey - negotiatedProtoVersion uint - ourHighestProtoVersion uint - caps []p2p.Cap + ourKey *ecdsa.PrivateKey + negotiatedProtoVersion uint + negotiatedSnapProtoVersion uint + ourHighestProtoVersion uint + ourHighestSnapProtoVersion uint + caps []p2p.Cap } // Read reads an eth packet from the connection. @@ -259,12 +262,7 @@ func (c *Conn) Read66() (uint64, Message) { // Write writes a eth packet to the connection. func (c *Conn) Write(msg Message) error { - // check if message is eth protocol message - var ( - payload []byte - err error - ) - payload, err = rlp.EncodeToBytes(msg) + payload, err := rlp.EncodeToBytes(msg) if err != nil { return err } @@ -281,3 +279,43 @@ func (c *Conn) Write66(req eth.Packet, code int) error { _, err = c.Conn.Write(uint64(code), payload) return err } + +// ReadSnap reads a snap/1 response with the given id from the connection. +func (c *Conn) ReadSnap(id uint64) (Message, error) { + respId := id + 1 + start := time.Now() + for respId != id && time.Since(start) < timeout { + code, rawData, _, err := c.Conn.Read() + if err != nil { + return nil, fmt.Errorf("could not read from connection: %v", err) + } + var snpMsg interface{} + switch int(code) { + case (GetAccountRange{}).Code(): + snpMsg = new(GetAccountRange) + case (AccountRange{}).Code(): + snpMsg = new(AccountRange) + case (GetStorageRanges{}).Code(): + snpMsg = new(GetStorageRanges) + case (StorageRanges{}).Code(): + snpMsg = new(StorageRanges) + case (GetByteCodes{}).Code(): + snpMsg = new(GetByteCodes) + case (ByteCodes{}).Code(): + snpMsg = new(ByteCodes) + case (GetTrieNodes{}).Code(): + snpMsg = new(GetTrieNodes) + case (TrieNodes{}).Code(): + snpMsg = new(TrieNodes) + default: + //return nil, fmt.Errorf("invalid message code: %d", code) + continue + } + if err := rlp.DecodeBytes(rawData, snpMsg); err != nil { + return nil, fmt.Errorf("could not rlp decode message: %v", err) + } + return snpMsg.(Message), nil + + } + return nil, fmt.Errorf("request timed out") +} diff --git a/cmd/devp2p/rlpxcmd.go b/cmd/devp2p/rlpxcmd.go index 24a16f0b3c..6557a239da 100644 --- a/cmd/devp2p/rlpxcmd.go +++ b/cmd/devp2p/rlpxcmd.go @@ -36,6 +36,7 @@ var ( Subcommands: []cli.Command{ rlpxPingCommand, rlpxEthTestCommand, + rlpxSnapTestCommand, }, } rlpxPingCommand = cli.Command{ @@ -53,6 +54,16 @@ var ( testTAPFlag, }, } + rlpxSnapTestCommand = cli.Command{ + Name: "snap-test", + Usage: "Runs tests against a node", + ArgsUsage: " ", + Action: rlpxSnapTest, + Flags: []cli.Flag{ + testPatternFlag, + testTAPFlag, + }, + } ) func rlpxPing(ctx *cli.Context) error { @@ -106,3 +117,15 @@ func rlpxEthTest(ctx *cli.Context) error { } return runTests(ctx, suite.AllEthTests()) } + +// rlpxSnapTest runs the snap protocol test suite. +func rlpxSnapTest(ctx *cli.Context) error { + if ctx.NArg() < 3 { + exit("missing path to chain.rlp as command-line argument") + } + suite, err := ethtest.NewSuite(getNodeArg(ctx), ctx.Args()[1], ctx.Args()[2]) + if err != nil { + exit(err) + } + return runTests(ctx, suite.SnapTests()) +} diff --git a/cmd/ethkey/utils.go b/cmd/ethkey/utils.go index f2986e8ee9..70baae92f4 100644 --- a/cmd/ethkey/utils.go +++ b/cmd/ethkey/utils.go @@ -49,7 +49,7 @@ func getPassphrase(ctx *cli.Context, confirmation bool) string { // signHash is a helper function that calculates a hash for the given message // that can be safely used to calculate a signature from. // -// The hash is calulcated as +// The hash is calculated as // keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). // // This gives context to the signed message and prevents signing of transactions. diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index dfdde42173..874685f15e 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -67,6 +67,7 @@ type ommer struct { type stEnv struct { Coinbase common.Address `json:"currentCoinbase" gencodec:"required"` Difficulty *big.Int `json:"currentDifficulty"` + Random *big.Int `json:"currentRandom"` ParentDifficulty *big.Int `json:"parentDifficulty"` GasLimit uint64 `json:"currentGasLimit" gencodec:"required"` Number uint64 `json:"currentNumber" gencodec:"required"` @@ -81,6 +82,7 @@ type stEnv struct { type stEnvMarshaling struct { Coinbase common.UnprefixedAddress Difficulty *math.HexOrDecimal256 + Random *math.HexOrDecimal256 ParentDifficulty *math.HexOrDecimal256 GasLimit math.HexOrDecimal64 Number math.HexOrDecimal64 @@ -139,6 +141,11 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, if pre.Env.BaseFee != nil { vmContext.BaseFee = new(big.Int).Set(pre.Env.BaseFee) } + // If random is defined, add it to the vmContext. + if pre.Env.Random != nil { + rnd := common.BigToHash(pre.Env.Random) + vmContext.Random = &rnd + } // If DAO is supported/enabled, we need to handle it here. In geth 'proper', it's // done in StateProcessor.Process(block, ...), right before transactions are applied. if chainConfig.DAOForkSupport && diff --git a/cmd/evm/internal/t8ntool/gen_stenv.go b/cmd/evm/internal/t8ntool/gen_stenv.go index 1bb3c6a46b..a6d774cdab 100644 --- a/cmd/evm/internal/t8ntool/gen_stenv.go +++ b/cmd/evm/internal/t8ntool/gen_stenv.go @@ -18,6 +18,7 @@ func (s stEnv) MarshalJSON() ([]byte, error) { type stEnv struct { Coinbase common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"` Difficulty *math.HexOrDecimal256 `json:"currentDifficulty"` + Random *math.HexOrDecimal256 `json:"currentRandom"` ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` GasLimit math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"` Number math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"` @@ -31,6 +32,7 @@ func (s stEnv) MarshalJSON() ([]byte, error) { var enc stEnv enc.Coinbase = common.UnprefixedAddress(s.Coinbase) enc.Difficulty = (*math.HexOrDecimal256)(s.Difficulty) + enc.Random = (*math.HexOrDecimal256)(s.Random) enc.ParentDifficulty = (*math.HexOrDecimal256)(s.ParentDifficulty) enc.GasLimit = math.HexOrDecimal64(s.GasLimit) enc.Number = math.HexOrDecimal64(s.Number) @@ -48,6 +50,7 @@ func (s *stEnv) UnmarshalJSON(input []byte) error { type stEnv struct { Coinbase *common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"` Difficulty *math.HexOrDecimal256 `json:"currentDifficulty"` + Random *math.HexOrDecimal256 `json:"currentRandom"` ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` GasLimit *math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"` Number *math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"` @@ -69,6 +72,9 @@ func (s *stEnv) UnmarshalJSON(input []byte) error { if dec.Difficulty != nil { s.Difficulty = (*big.Int)(dec.Difficulty) } + if dec.Random != nil { + s.Random = (*big.Int)(dec.Random) + } if dec.ParentDifficulty != nil { s.ParentDifficulty = (*big.Int)(dec.ParentDifficulty) } diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 11d71e4ce5..097f9ce65c 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -252,6 +252,10 @@ func Transition(ctx *cli.Context) error { return NewError(ErrorConfig, errors.New("EIP-1559 config but missing 'currentBaseFee' in env section")) } } + // Sanity check, to not `panic` in state_transition + if prestate.Env.Random != nil && !chainConfig.IsLondon(big.NewInt(int64(prestate.Env.Number))) { + return NewError(ErrorConfig, errors.New("can only apply RANDOM on top of London chainrules")) + } if env := prestate.Env; env.Difficulty == nil { // If difficulty was not provided by caller, we need to calculate it. switch { diff --git a/cmd/evm/testdata/15/exp3.json b/cmd/evm/testdata/15/exp3.json index 6c46d267cf..d7606a2073 100644 --- a/cmd/evm/testdata/15/exp3.json +++ b/cmd/evm/testdata/15/exp3.json @@ -21,19 +21,19 @@ "error": "transaction type not supported" }, { - "error": "rlp: expected List" + "error": "typed transaction too short" }, { - "error": "rlp: expected List" + "error": "typed transaction too short" }, { - "error": "rlp: expected List" + "error": "typed transaction too short" }, { - "error": "rlp: expected List" + "error": "typed transaction too short" }, { - "error": "rlp: expected List" + "error": "typed transaction too short" }, { "error": "rlp: expected input list for types.AccessListTx" diff --git a/cmd/geth/accountcmd_test.go b/cmd/geth/accountcmd_test.go index 9455eeda36..3a71b85716 100644 --- a/cmd/geth/accountcmd_test.go +++ b/cmd/geth/accountcmd_test.go @@ -120,7 +120,7 @@ func importAccountWithExpect(t *testing.T, key string, expected string) { if err := ioutil.WriteFile(passwordFile, []byte("foobar"), 0600); err != nil { t.Error(err) } - geth := runGeth(t, "account", "import", keyfile, "-password", passwordFile) + geth := runGeth(t, "--lightkdf", "account", "import", keyfile, "-password", passwordFile) defer geth.ExpectExit() geth.Expect(expected) } diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 6be6480a09..d8ba5366fe 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -33,6 +33,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/scwallet" "github.com/ethereum/go-ethereum/accounts/usbwallet" "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/internal/ethapi" @@ -174,7 +175,23 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { if ctx.GlobalIsSet(utils.OverrideTerminalTotalDifficulty.Name) { cfg.Eth.OverrideTerminalTotalDifficulty = new(big.Int).SetUint64(ctx.GlobalUint64(utils.OverrideTerminalTotalDifficulty.Name)) } - backend, _ := utils.RegisterEthService(stack, &cfg.Eth, ctx.GlobalBool(utils.CatalystFlag.Name)) + backend, eth := utils.RegisterEthService(stack, &cfg.Eth) + // Warn users to migrate if they have a legacy freezer format. + if eth != nil { + firstIdx := uint64(0) + // Hack to speed up check for mainnet because we know + // the first non-empty block. + ghash := rawdb.ReadCanonicalHash(eth.ChainDb(), 0) + if cfg.Eth.NetworkId == 1 && ghash == params.MainnetGenesisHash { + firstIdx = 46147 + } + isLegacy, _, err := dbHasLegacyReceipts(eth.ChainDb(), firstIdx) + if err != nil { + log.Error("Failed to check db for legacy receipts", "err", err) + } else if isLegacy { + log.Warn("Database has receipts with a legacy format. Please run `geth db freezer-migrate`.") + } + } // Configure GraphQL if requested if ctx.GlobalIsSet(utils.GraphQLEnabledFlag.Name) { diff --git a/cmd/geth/dbcmd.go b/cmd/geth/dbcmd.go index 37ed0dcc69..9784a3efb9 100644 --- a/cmd/geth/dbcmd.go +++ b/cmd/geth/dbcmd.go @@ -34,9 +34,12 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/console/prompt" "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state/snapshot" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/trie" + "github.com/olekukonko/tablewriter" "gopkg.in/urfave/cli.v1" ) @@ -69,6 +72,8 @@ Remove blockchain and state databases`, dbDumpFreezerIndex, dbImportCmd, dbExportCmd, + dbMetadataCmd, + dbMigrateFreezerCmd, }, } dbInspectCmd = cli.Command{ @@ -249,6 +254,38 @@ WARNING: This is a low-level operation which may cause database corruption!`, }, Description: "Exports the specified chain data to an RLP encoded stream, optionally gzip-compressed.", } + dbMetadataCmd = cli.Command{ + Action: utils.MigrateFlags(showMetaData), + Name: "metadata", + Usage: "Shows metadata about the chain status.", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.SyncModeFlag, + utils.MainnetFlag, + utils.RopstenFlag, + utils.SepoliaFlag, + utils.RinkebyFlag, + utils.GoerliFlag, + }, + Description: "Shows metadata about the chain status.", + } + dbMigrateFreezerCmd = cli.Command{ + Action: utils.MigrateFlags(freezerMigrate), + Name: "freezer-migrate", + Usage: "Migrate legacy parts of the freezer. (WARNING: may take a long time)", + ArgsUsage: "", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.SyncModeFlag, + utils.MainnetFlag, + utils.RopstenFlag, + utils.SepoliaFlag, + utils.RinkebyFlag, + utils.GoerliFlag, + }, + Description: `The freezer-migrate command checks your database for receipts in a legacy format and updates those. +WARNING: please back-up the receipt files in your ancients before running this command.`, + } ) func removeDB(ctx *cli.Context) error { @@ -555,7 +592,7 @@ func freezerInspect(ctx *cli.Context) error { defer stack.Close() path := filepath.Join(stack.ResolvePath("chaindata"), "ancient") log.Info("Opening freezer", "location", path, "name", kind) - if f, err := rawdb.NewFreezerTable(path, kind, disableSnappy); err != nil { + if f, err := rawdb.NewFreezerTable(path, kind, disableSnappy, true); err != nil { return err } else { f.DumpIndex(start, end) @@ -701,3 +738,138 @@ func exportChaindata(ctx *cli.Context) error { db := utils.MakeChainDatabase(ctx, stack, true) return utils.ExportChaindata(ctx.Args().Get(1), kind, exporter(db), stop) } + +func showMetaData(ctx *cli.Context) error { + stack, _ := makeConfigNode(ctx) + defer stack.Close() + db := utils.MakeChainDatabase(ctx, stack, true) + ancients, err := db.Ancients() + if err != nil { + fmt.Fprintf(os.Stderr, "Error accessing ancients: %v", err) + } + pp := func(val *uint64) string { + if val == nil { + return "" + } + return fmt.Sprintf("%d (0x%x)", *val, *val) + } + data := [][]string{ + {"databaseVersion", pp(rawdb.ReadDatabaseVersion(db))}, + {"headBlockHash", fmt.Sprintf("%v", rawdb.ReadHeadBlockHash(db))}, + {"headFastBlockHash", fmt.Sprintf("%v", rawdb.ReadHeadFastBlockHash(db))}, + {"headHeaderHash", fmt.Sprintf("%v", rawdb.ReadHeadHeaderHash(db))}} + if b := rawdb.ReadHeadBlock(db); b != nil { + data = append(data, []string{"headBlock.Hash", fmt.Sprintf("%v", b.Hash())}) + data = append(data, []string{"headBlock.Root", fmt.Sprintf("%v", b.Root())}) + data = append(data, []string{"headBlock.Number", fmt.Sprintf("%d (0x%x)", b.Number(), b.Number())}) + } + if b := rawdb.ReadSkeletonSyncStatus(db); b != nil { + data = append(data, []string{"SkeletonSyncStatus", string(b)}) + } + if h := rawdb.ReadHeadHeader(db); h != nil { + data = append(data, []string{"headHeader.Hash", fmt.Sprintf("%v", h.Hash())}) + data = append(data, []string{"headHeader.Root", fmt.Sprintf("%v", h.Root)}) + data = append(data, []string{"headHeader.Number", fmt.Sprintf("%d (0x%x)", h.Number, h.Number)}) + } + data = append(data, [][]string{{"frozen", fmt.Sprintf("%d items", ancients)}, + {"lastPivotNumber", pp(rawdb.ReadLastPivotNumber(db))}, + {"len(snapshotSyncStatus)", fmt.Sprintf("%d bytes", len(rawdb.ReadSnapshotSyncStatus(db)))}, + {"snapshotGenerator", snapshot.ParseGeneratorStatus(rawdb.ReadSnapshotGenerator(db))}, + {"snapshotDisabled", fmt.Sprintf("%v", rawdb.ReadSnapshotDisabled(db))}, + {"snapshotJournal", fmt.Sprintf("%d bytes", len(rawdb.ReadSnapshotJournal(db)))}, + {"snapshotRecoveryNumber", pp(rawdb.ReadSnapshotRecoveryNumber(db))}, + {"snapshotRoot", fmt.Sprintf("%v", rawdb.ReadSnapshotRoot(db))}, + {"txIndexTail", pp(rawdb.ReadTxIndexTail(db))}, + {"fastTxLookupLimit", pp(rawdb.ReadFastTxLookupLimit(db))}, + }...) + table := tablewriter.NewWriter(os.Stdout) + table.SetHeader([]string{"Field", "Value"}) + table.AppendBulk(data) + table.Render() + return nil +} + +func freezerMigrate(ctx *cli.Context) error { + stack, _ := makeConfigNode(ctx) + defer stack.Close() + + db := utils.MakeChainDatabase(ctx, stack, false) + defer db.Close() + + // Check first block for legacy receipt format + numAncients, err := db.Ancients() + if err != nil { + return err + } + if numAncients < 1 { + log.Info("No receipts in freezer to migrate") + return nil + } + + isFirstLegacy, firstIdx, err := dbHasLegacyReceipts(db, 0) + if err != nil { + return err + } + if !isFirstLegacy { + log.Info("No legacy receipts to migrate") + return nil + } + + log.Info("Starting migration", "ancients", numAncients, "firstLegacy", firstIdx) + start := time.Now() + if err := db.MigrateTable("receipts", types.ConvertLegacyStoredReceipts); err != nil { + return err + } + if err := db.Close(); err != nil { + return err + } + log.Info("Migration finished", "duration", time.Since(start)) + + return nil +} + +// dbHasLegacyReceipts checks freezer entries for legacy receipts. It stops at the first +// non-empty receipt and checks its format. The index of this first non-empty element is +// the second return parameter. +func dbHasLegacyReceipts(db ethdb.Database, firstIdx uint64) (bool, uint64, error) { + // Check first block for legacy receipt format + numAncients, err := db.Ancients() + if err != nil { + return false, 0, err + } + if numAncients < 1 { + return false, 0, nil + } + if firstIdx >= numAncients { + return false, firstIdx, nil + } + var ( + legacy bool + blob []byte + emptyRLPList = []byte{192} + ) + // Find first block with non-empty receipt, only if + // the index is not already provided. + if firstIdx == 0 { + for i := uint64(0); i < numAncients; i++ { + blob, err = db.Ancient("receipts", i) + if err != nil { + return false, 0, err + } + if len(blob) == 0 { + continue + } + if !bytes.Equal(blob, emptyRLPList) { + firstIdx = i + break + } + } + } + // Is first non-empty receipt legacy? + first, err := db.Ancient("receipts", firstIdx) + if err != nil { + return false, 0, err + } + legacy, err = types.IsLegacyStoredReceipts(first) + return legacy, firstIdx, err +} diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 756a397d32..600e929706 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -109,7 +109,8 @@ var ( utils.UltraLightFractionFlag, utils.UltraLightOnlyAnnounceFlag, utils.LightNoSyncServeFlag, - utils.WhitelistFlag, + utils.EthPeerRequiredBlocksFlag, + utils.LegacyWhitelistFlag, utils.BloomFilterSizeFlag, utils.CacheFlag, utils.CacheDatabaseFlag, @@ -120,6 +121,7 @@ var ( utils.CacheSnapshotFlag, utils.CacheNoPrefetchFlag, utils.CachePreimagesFlag, + utils.FDLimitFlag, utils.ListenPortFlag, utils.MaxPeersFlag, utils.MaxPendingPeersFlag, @@ -150,6 +152,7 @@ var ( utils.GoerliFlag, utils.MumbaiFlag, utils.BorMainnetFlag, + utils.KilnFlag, utils.VMEnableDebugFlag, utils.NetworkIdFlag, utils.EthStatsURLFlag, @@ -161,7 +164,6 @@ var ( utils.GpoIgnoreGasPriceFlag, utils.MinerNotifyFullFlag, configFileFlag, - utils.CatalystFlag, } rpcFlags = []cli.Flag{ @@ -169,6 +171,10 @@ var ( utils.HTTPListenAddrFlag, utils.HTTPPortFlag, utils.HTTPCORSDomainFlag, + utils.AuthListenFlag, + utils.AuthPortFlag, + utils.AuthVirtualHostsFlag, + utils.JWTSecretFlag, utils.HTTPVirtualHostsFlag, utils.GraphQLEnabledFlag, utils.GraphQLCORSDomainFlag, @@ -212,7 +218,7 @@ func init() { // Initialize the CLI app and start Geth app.Action = geth app.HideVersion = true // we have a command to print the version - app.Copyright = "Copyright 2013-2021 The go-ethereum Authors" + app.Copyright = "Copyright 2013-2022 The go-ethereum Authors" app.Commands = []cli.Command{ // See chaincmd.go: initCommand, diff --git a/cmd/geth/snapshot.go b/cmd/geth/snapshot.go index 6ca8b768a3..d8bdd3769d 100644 --- a/cmd/geth/snapshot.go +++ b/cmd/geth/snapshot.go @@ -324,8 +324,7 @@ func traverseState(ctx *cli.Context) error { } } if !bytes.Equal(acc.CodeHash, emptyCode) { - code := rawdb.ReadCode(chaindb, common.BytesToHash(acc.CodeHash)) - if len(code) == 0 { + if !rawdb.HasCode(chaindb, common.BytesToHash(acc.CodeHash)) { log.Error("Code is missing", "hash", common.BytesToHash(acc.CodeHash)) return errors.New("missing code") } @@ -396,11 +395,10 @@ func traverseRawState(ctx *cli.Context) error { nodes += 1 node := accIter.Hash() + // Check the present for non-empty hash node(embedded node doesn't + // have their own hash). if node != (common.Hash{}) { - // Check the present for non-empty hash node(embedded node doesn't - // have their own hash). - blob := rawdb.ReadTrieNode(chaindb, node) - if len(blob) == 0 { + if !rawdb.HasTrieNode(chaindb, node) { log.Error("Missing trie node(account)", "hash", node) return errors.New("missing account") } @@ -428,8 +426,7 @@ func traverseRawState(ctx *cli.Context) error { // Check the present for non-empty hash node(embedded node doesn't // have their own hash). if node != (common.Hash{}) { - blob := rawdb.ReadTrieNode(chaindb, node) - if len(blob) == 0 { + if !rawdb.HasTrieNode(chaindb, node) { log.Error("Missing trie node(storage)", "hash", node) return errors.New("missing storage") } @@ -445,8 +442,7 @@ func traverseRawState(ctx *cli.Context) error { } } if !bytes.Equal(acc.CodeHash, emptyCode) { - code := rawdb.ReadCode(chaindb, common.BytesToHash(acc.CodeHash)) - if len(code) == 0 { + if !rawdb.HasCode(chaindb, common.BytesToHash(acc.CodeHash)) { log.Error("Code is missing", "account", common.BytesToHash(accIter.LeafKey())) return errors.New("missing code") } diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 17d93f06e0..af5175cd63 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -48,6 +48,7 @@ var AppHelpFlagGroups = []flags.FlagGroup{ utils.RinkebyFlag, utils.RopstenFlag, utils.SepoliaFlag, + utils.KilnFlag, utils.SyncModeFlag, utils.ExitWhenSyncedFlag, utils.GCModeFlag, @@ -55,7 +56,7 @@ var AppHelpFlagGroups = []flags.FlagGroup{ utils.EthStatsURLFlag, utils.IdentityFlag, utils.LightKDFFlag, - utils.WhitelistFlag, + utils.EthPeerRequiredBlocksFlag, }, }, { @@ -121,6 +122,7 @@ var AppHelpFlagGroups = []flags.FlagGroup{ utils.CacheSnapshotFlag, utils.CacheNoPrefetchFlag, utils.CachePreimagesFlag, + utils.FDLimitFlag, }, }, { @@ -150,6 +152,10 @@ var AppHelpFlagGroups = []flags.FlagGroup{ utils.WSApiFlag, utils.WSPathPrefixFlag, utils.WSAllowedOriginsFlag, + utils.JWTSecretFlag, + utils.AuthListenFlag, + utils.AuthPortFlag, + utils.AuthVirtualHostsFlag, utils.GraphQLEnabledFlag, utils.GraphQLCORSDomainFlag, utils.GraphQLVirtualHostsFlag, @@ -223,6 +229,7 @@ var AppHelpFlagGroups = []flags.FlagGroup{ Name: "ALIASED (deprecated)", Flags: []cli.Flag{ utils.NoUSBFlag, + utils.LegacyWhitelistFlag, }, }, { @@ -231,7 +238,6 @@ var AppHelpFlagGroups = []flags.FlagGroup{ utils.SnapshotFlag, utils.BloomFilterSizeFlag, cli.HelpFlag, - utils.CatalystFlag, }, }, } diff --git a/cmd/geth/version_check_test.go b/cmd/geth/version_check_test.go index 0f056d1967..4be32d5e4f 100644 --- a/cmd/geth/version_check_test.go +++ b/cmd/geth/version_check_test.go @@ -25,6 +25,8 @@ import ( "strconv" "strings" "testing" + + "github.com/jedisct1/go-minisign" ) func TestVerification(t *testing.T) { @@ -128,3 +130,39 @@ func TestMatching(t *testing.T) { } } } + +func TestGethPubKeysParseable(t *testing.T) { + for _, pubkey := range gethPubKeys { + _, err := minisign.NewPublicKey(pubkey) + if err != nil { + t.Errorf("Should be parseable") + } + } +} + +func TestKeyID(t *testing.T) { + type args struct { + id [8]byte + } + tests := []struct { + name string + args args + want string + }{ + {"@holiman key", args{id: extractKeyId(gethPubKeys[0])}, "FB1D084D39BAEC24"}, + {"second key", args{id: extractKeyId(gethPubKeys[1])}, "138B1CA303E51687"}, + {"third key", args{id: extractKeyId(gethPubKeys[2])}, "FD9813B2D2098484"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := keyID(tt.args.id); got != tt.want { + t.Errorf("keyID() = %v, want %v", got, tt.want) + } + }) + } +} + +func extractKeyId(pubkey string) [8]byte { + p, _ := minisign.NewPublicKey(pubkey) + return p.KeyId +} diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 40c8db4cc2..fc5c300ab4 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -45,7 +45,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/eth/catalyst" + ethcatalyst "github.com/ethereum/go-ethereum/eth/catalyst" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/eth/gasprice" @@ -56,6 +56,7 @@ import ( "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/internal/flags" "github.com/ethereum/go-ethereum/les" + lescatalyst "github.com/ethereum/go-ethereum/les/catalyst" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/metrics/exp" @@ -168,6 +169,10 @@ var ( Name: "sepolia", Usage: "Sepolia network: pre-configured proof-of-work test network", } + KilnFlag = cli.BoolFlag{ + Name: "kiln", + Usage: "Kiln network: pre-configured proof-of-work to proof-of-stake test network", + } DeveloperFlag = cli.BoolFlag{ Name: "dev", Usage: "Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled", @@ -244,9 +249,13 @@ var ( Name: "lightkdf", Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", } - WhitelistFlag = cli.StringFlag{ + EthPeerRequiredBlocksFlag = cli.StringFlag{ + Name: "eth.requiredblocks", + Usage: "Comma separated block number-to-hash mappings to require for peering (=)", + } + LegacyWhitelistFlag = cli.StringFlag{ Name: "whitelist", - Usage: "Comma separated block number-to-hash mappings to enforce (=)", + Usage: "Comma separated block number-to-hash mappings to enforce (=) (deprecated in favor of --peer.requiredblocks)", } BloomFilterSizeFlag = cli.Uint64Flag{ Name: "bloomfilter.size", @@ -444,6 +453,10 @@ var ( Name: "cache.preimages", Usage: "Enable recording the SHA3/keccak preimages of trie keys", } + FDLimitFlag = cli.IntFlag{ + Name: "fdlimit", + Usage: "Raise the open file descriptor resource limit (default = system fd limit)", + } // Miner settings MiningEnabledFlag = cli.BoolFlag{ Name: "mine", @@ -529,6 +542,26 @@ var ( Usage: "Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap)", Value: ethconfig.Defaults.RPCTxFeeCap, } + // Authenticated RPC HTTP settings + AuthListenFlag = cli.StringFlag{ + Name: "authrpc.addr", + Usage: "Listening address for authenticated APIs", + Value: node.DefaultConfig.AuthAddr, + } + AuthPortFlag = cli.IntFlag{ + Name: "authrpc.port", + Usage: "Listening port for authenticated APIs", + Value: node.DefaultConfig.AuthPort, + } + AuthVirtualHostsFlag = cli.StringFlag{ + Name: "authrpc.vhosts", + Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", + Value: strings.Join(node.DefaultConfig.AuthVirtualHosts, ","), + } + JWTSecretFlag = cli.StringFlag{ + Name: "authrpc.jwtsecret", + Usage: "Path to a JWT secret to use for authenticated RPC endpoints", + } // Logging and debug settings EthStatsURLFlag = cli.StringFlag{ Name: "ethstats", @@ -801,11 +834,6 @@ var ( Usage: "InfluxDB organization name (v2 only)", Value: metrics.DefaultConfig.InfluxDBOrganization, } - - CatalystFlag = cli.BoolFlag{ - Name: "catalyst", - Usage: "Catalyst mode (eth2 integration testing)", - } ) // MakeDataDir retrieves the currently requested data directory, terminating @@ -831,6 +859,9 @@ func MakeDataDir(ctx *cli.Context) string { if ctx.GlobalBool(SepoliaFlag.Name) { return filepath.Join(path, "sepolia") } + if ctx.GlobalBool(KilnFlag.Name) { + return filepath.Join(path, "kiln") + } return path } Fatalf("Cannot determine default data directory, please set manually (--datadir)") @@ -889,6 +920,8 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { urls = params.MumbaiBootnodes case ctx.GlobalBool(BorMainnetFlag.Name): urls = params.BorMainnetBootnodes + case ctx.GlobalBool(KilnFlag.Name): + urls = params.KilnBootnodes case cfg.BootstrapNodes != nil: return // already set, don't apply defaults. } @@ -975,6 +1008,18 @@ func setHTTP(ctx *cli.Context, cfg *node.Config) { cfg.HTTPPort = ctx.GlobalInt(HTTPPortFlag.Name) } + if ctx.GlobalIsSet(AuthListenFlag.Name) { + cfg.AuthAddr = ctx.GlobalString(AuthListenFlag.Name) + } + + if ctx.GlobalIsSet(AuthPortFlag.Name) { + cfg.AuthPort = ctx.GlobalInt(AuthPortFlag.Name) + } + + if ctx.GlobalIsSet(AuthVirtualHostsFlag.Name) { + cfg.AuthVirtualHosts = SplitAndTrim(ctx.GlobalString(AuthVirtualHostsFlag.Name)) + } + if ctx.GlobalIsSet(HTTPCORSDomainFlag.Name) { cfg.HTTPCors = SplitAndTrim(ctx.GlobalString(HTTPCORSDomainFlag.Name)) } @@ -1081,11 +1126,24 @@ func setLes(ctx *cli.Context, cfg *ethconfig.Config) { // MakeDatabaseHandles raises out the number of allowed file handles per process // for Geth and returns half of the allowance to assign to the database. -func MakeDatabaseHandles() int { +func MakeDatabaseHandles(max int) int { limit, err := fdlimit.Maximum() if err != nil { Fatalf("Failed to retrieve file descriptor allowance: %v", err) } + switch { + case max == 0: + // User didn't specify a meaningful value, use system limits + case max < 128: + // User specified something unhealthy, just use system defaults + log.Error("File descriptor limit invalid (<128)", "had", max, "updated", limit) + case max > limit: + // User requested more than the OS allows, notify that we can't allocate it + log.Warn("Requested file descriptors denied by OS", "req", max, "limit", limit) + default: + // User limit is meaningful and within allowed range, use that + limit = max + } raised, err := fdlimit.Raise(uint64(limit)) if err != nil { Fatalf("Failed to raise file descriptor allowance: %v", err) @@ -1242,6 +1300,10 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { setDataDir(ctx, cfg) setSmartCard(ctx, cfg) + if ctx.GlobalIsSet(JWTSecretFlag.Name) { + cfg.JWTSecret = ctx.GlobalString(JWTSecretFlag.Name) + } + if ctx.GlobalIsSet(ExternalSignerFlag.Name) { cfg.ExternalSigner = ctx.GlobalString(ExternalSignerFlag.Name) } @@ -1316,6 +1378,8 @@ func setDataDir(ctx *cli.Context, cfg *node.Config) { cfg.DataDir = filepath.Join(homeDir, "/.bor/data") case ctx.GlobalBool(SepoliaFlag.Name) && cfg.DataDir == node.DefaultDataDir(): cfg.DataDir = filepath.Join(node.DefaultDataDir(), "sepolia") + case ctx.GlobalBool(KilnFlag.Name) && cfg.DataDir == node.DefaultDataDir(): + cfg.DataDir = filepath.Join(node.DefaultDataDir(), "kiln") } } @@ -1434,26 +1498,33 @@ func setMiner(ctx *cli.Context, cfg *miner.Config) { } } -func setWhitelist(ctx *cli.Context, cfg *ethconfig.Config) { - whitelist := ctx.GlobalString(WhitelistFlag.Name) - if whitelist == "" { - return +func setPeerRequiredBlocks(ctx *cli.Context, cfg *ethconfig.Config) { + peerRequiredBlocks := ctx.GlobalString(EthPeerRequiredBlocksFlag.Name) + + if peerRequiredBlocks == "" { + if ctx.GlobalIsSet(LegacyWhitelistFlag.Name) { + log.Warn("The flag --rpc is deprecated and will be removed, please use --peer.requiredblocks") + peerRequiredBlocks = ctx.GlobalString(LegacyWhitelistFlag.Name) + } else { + return + } } - cfg.Whitelist = make(map[uint64]common.Hash) - for _, entry := range strings.Split(whitelist, ",") { + + cfg.PeerRequiredBlocks = make(map[uint64]common.Hash) + for _, entry := range strings.Split(peerRequiredBlocks, ",") { parts := strings.Split(entry, "=") if len(parts) != 2 { - Fatalf("Invalid whitelist entry: %s", entry) + Fatalf("Invalid peer required block entry: %s", entry) } number, err := strconv.ParseUint(parts[0], 0, 64) if err != nil { - Fatalf("Invalid whitelist block number %s: %v", parts[0], err) + Fatalf("Invalid peer required block number %s: %v", parts[0], err) } var hash common.Hash if err = hash.UnmarshalText([]byte(parts[1])); err != nil { - Fatalf("Invalid whitelist hash %s: %v", parts[1], err) + Fatalf("Invalid peer required block hash %s: %v", parts[1], err) } - cfg.Whitelist[number] = hash + cfg.PeerRequiredBlocks[number] = hash } } @@ -1501,7 +1572,7 @@ func CheckExclusive(ctx *cli.Context, args ...interface{}) { // SetEthConfig applies eth-related command line flags to the config. func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { // Avoid conflicting network flags - CheckExclusive(ctx, MainnetFlag, DeveloperFlag, RopstenFlag, RinkebyFlag, GoerliFlag, MumbaiFlag, BorMainnetFlag, SepoliaFlag) + CheckExclusive(ctx, MainnetFlag, DeveloperFlag, RopstenFlag, RinkebyFlag, GoerliFlag, MumbaiFlag, BorMainnetFlag, SepoliaFlag, KilnFlag) CheckExclusive(ctx, LightServeFlag, SyncModeFlag, "light") CheckExclusive(ctx, DeveloperFlag, ExternalSignerFlag) // Can't use both ephemeral unlocked and external signer if ctx.GlobalString(GCModeFlag.Name) == "archive" && ctx.GlobalUint64(TxLookupLimitFlag.Name) != 0 { @@ -1520,7 +1591,7 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { setTxPool(ctx, &cfg.TxPool) setEthash(ctx, cfg) setMiner(ctx, &cfg.Miner) - setWhitelist(ctx, cfg) + setPeerRequiredBlocks(ctx, cfg) setLes(ctx, cfg) if ctx.GlobalIsSet(BorLogsFlag.Name) { @@ -1556,7 +1627,7 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheDatabaseFlag.Name) { cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100 } - cfg.DatabaseHandles = MakeDatabaseHandles() + cfg.DatabaseHandles = MakeDatabaseHandles(ctx.GlobalInt(FDLimitFlag.Name)) if ctx.GlobalIsSet(AncientFlag.Name) { cfg.DatabaseFreezer = ctx.GlobalString(AncientFlag.Name) } @@ -1677,6 +1748,12 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { cfg.NetworkId = 137 } cfg.Genesis = core.DefaultBorMainnetGenesisBlock() + case ctx.GlobalBool(KilnFlag.Name): + if !ctx.GlobalIsSet(NetworkIdFlag.Name) { + cfg.NetworkId = 1337802 + } + cfg.Genesis = core.DefaultKilnGenesisBlock() + SetDNSDiscoveryDefaults(cfg, params.KilnGenesisHash) case ctx.GlobalBool(DeveloperFlag.Name): if !ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = 1337 @@ -1713,9 +1790,15 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { // Create a new developer genesis block or reuse existing one cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), ctx.GlobalUint64(DeveloperGasLimitFlag.Name), developer.Address) if ctx.GlobalIsSet(DataDirFlag.Name) { + // If datadir doesn't exist we need to open db in write-mode + // so leveldb can create files. + readonly := true + if !common.FileExist(stack.ResolvePath("chaindata")) { + readonly = false + } // Check if we have an already initialized chain and fall back to // that if so. Otherwise we need to generate a new genesis spec. - chaindb := MakeChainDatabase(ctx, stack, false) // TODO (MariusVanDerWijden) make this read only + chaindb := MakeChainDatabase(ctx, stack, readonly) if rawdb.ReadCanonicalHash(chaindb, 0) != (common.Hash{}) { cfg.Genesis = nil // fallback to db content } @@ -1750,15 +1833,15 @@ func SetDNSDiscoveryDefaults(cfg *ethconfig.Config, genesis common.Hash) { // RegisterEthService adds an Ethereum client to the stack. // The second return value is the full node instance, which may be nil if the // node is running as a light client. -func RegisterEthService(stack *node.Node, cfg *ethconfig.Config, isCatalyst bool) (ethapi.Backend, *eth.Ethereum) { +func RegisterEthService(stack *node.Node, cfg *ethconfig.Config) (ethapi.Backend, *eth.Ethereum) { if cfg.SyncMode == downloader.LightSync { backend, err := les.New(stack, cfg) if err != nil { Fatalf("Failed to register the Ethereum service: %v", err) } stack.RegisterAPIs(tracers.APIs(backend.ApiBackend)) - if isCatalyst { - if err := catalyst.RegisterLight(stack, backend); err != nil { + if backend.BlockChain().Config().TerminalTotalDifficulty != nil { + if err := lescatalyst.Register(stack, backend); err != nil { Fatalf("Failed to register the catalyst service: %v", err) } } @@ -1774,8 +1857,8 @@ func RegisterEthService(stack *node.Node, cfg *ethconfig.Config, isCatalyst bool Fatalf("Failed to create the LES server: %v", err) } } - if isCatalyst { - if err := catalyst.Register(stack, backend); err != nil { + if backend.BlockChain().Config().TerminalTotalDifficulty != nil { + if err := ethcatalyst.Register(stack, backend); err != nil { Fatalf("Failed to register the catalyst service: %v", err) } } @@ -1878,7 +1961,7 @@ func SplitTagsFlag(tagsFlag string) map[string]string { func MakeChainDatabase(ctx *cli.Context, stack *node.Node, readonly bool) ethdb.Database { var ( cache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100 - handles = MakeDatabaseHandles() + handles = MakeDatabaseHandles(ctx.GlobalInt(FDLimitFlag.Name)) err error chainDb ethdb.Database @@ -1913,6 +1996,8 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { genesis = core.DefaultMumbaiGenesisBlock() case ctx.GlobalBool(BorMainnetFlag.Name): genesis = core.DefaultBorMainnetGenesisBlock() + case ctx.GlobalBool(KilnFlag.Name): + genesis = core.DefaultKilnGenesisBlock() case ctx.GlobalBool(DeveloperFlag.Name): Fatalf("Developer chains are ephemeral") } diff --git a/consensus/beacon/consensus.go b/consensus/beacon/consensus.go index 9467fea67b..1fd7deb872 100644 --- a/consensus/beacon/consensus.go +++ b/consensus/beacon/consensus.go @@ -43,7 +43,6 @@ var ( // error types into the consensus package. var ( errTooManyUncles = errors.New("too many uncles") - errInvalidMixDigest = errors.New("invalid mix digest") errInvalidNonce = errors.New("invalid nonce") errInvalidUncleHash = errors.New("invalid uncle hash") ) @@ -182,10 +181,7 @@ func (beacon *Beacon) verifyHeader(chain consensus.ChainHeaderReader, header, pa if len(header.Extra) > 32 { return fmt.Errorf("extra-data longer than 32 bytes (%d)", len(header.Extra)) } - // Verify the seal parts. Ensure the mixhash, nonce and uncle hash are the expected value. - if header.MixDigest != (common.Hash{}) { - return errInvalidMixDigest - } + // Verify the seal parts. Ensure the nonce and uncle hash are the expected value. if header.Nonce != beaconNonce { return errInvalidNonce } diff --git a/consensus/ethash/ethash.go b/consensus/ethash/ethash.go index 4e33d99c8d..c196ad0621 100644 --- a/consensus/ethash/ethash.go +++ b/consensus/ethash/ethash.go @@ -549,6 +549,11 @@ func NewShared() *Ethash { // Close closes the exit channel to notify all backend threads exiting. func (ethash *Ethash) Close() error { + return ethash.StopRemoteSealer() +} + +// StopRemoteSealer stops the remote sealer +func (ethash *Ethash) StopRemoteSealer() error { ethash.closeOnce.Do(func() { // Short circuit if the exit channel is not allocated. if ethash.remote == nil { diff --git a/core/beacon/errors.go b/core/beacon/errors.go new file mode 100644 index 0000000000..83d5eebd5f --- /dev/null +++ b/core/beacon/errors.go @@ -0,0 +1,50 @@ +// Copyright 2022 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 + +package beacon + +import "github.com/ethereum/go-ethereum/rpc" + +var ( + // VALID is returned by the engine API in the following calls: + // - newPayloadV1: if the payload was already known or was just validated and executed + // - forkchoiceUpdateV1: if the chain accepted the reorg (might ignore if it's stale) + VALID = "VALID" + + // INVALID is returned by the engine API in the following calls: + // - newPayloadV1: if the payload failed to execute on top of the local chain + // - forkchoiceUpdateV1: if the new head is unknown, pre-merge, or reorg to it fails + INVALID = "INVALID" + + // SYNCING is returned by the engine API in the following calls: + // - newPayloadV1: if the payload was accepted on top of an active sync + // - forkchoiceUpdateV1: if the new head was seen before, but not part of the chain + SYNCING = "SYNCING" + + // ACCEPTED is returned by the engine API in the following calls: + // - newPayloadV1: if the payload was accepted, but not processed (side chain) + ACCEPTED = "ACCEPTED" + + INVALIDBLOCKHASH = "INVALID_BLOCK_HASH" + INVALIDTERMINALBLOCK = "INVALID_TERMINAL_BLOCK" + + GenericServerError = rpc.CustomError{Code: -32000, ValidationError: "Server error"} + UnknownPayload = rpc.CustomError{Code: -32001, ValidationError: "Unknown payload"} + InvalidTB = rpc.CustomError{Code: -32002, ValidationError: "Invalid terminal block"} + + STATUS_INVALID = ForkChoiceResponse{PayloadStatus: PayloadStatusV1{Status: INVALID}, PayloadID: nil} + STATUS_SYNCING = ForkChoiceResponse{PayloadStatus: PayloadStatusV1{Status: SYNCING}, PayloadID: nil} +) diff --git a/eth/catalyst/gen_blockparams.go b/core/beacon/gen_blockparams.go similarity index 85% rename from eth/catalyst/gen_blockparams.go rename to core/beacon/gen_blockparams.go index ccf5c327ff..0e2ea4bb13 100644 --- a/eth/catalyst/gen_blockparams.go +++ b/core/beacon/gen_blockparams.go @@ -1,6 +1,6 @@ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. -package catalyst +package beacon import ( "encoding/json" @@ -16,7 +16,7 @@ var _ = (*payloadAttributesMarshaling)(nil) func (p PayloadAttributesV1) MarshalJSON() ([]byte, error) { type PayloadAttributesV1 struct { Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` - Random common.Hash `json:"random" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` } var enc PayloadAttributesV1 @@ -30,7 +30,7 @@ func (p PayloadAttributesV1) MarshalJSON() ([]byte, error) { func (p *PayloadAttributesV1) UnmarshalJSON(input []byte) error { type PayloadAttributesV1 struct { Timestamp *hexutil.Uint64 `json:"timestamp" gencodec:"required"` - Random *common.Hash `json:"random" gencodec:"required"` + Random *common.Hash `json:"prevRandao" gencodec:"required"` SuggestedFeeRecipient *common.Address `json:"suggestedFeeRecipient" gencodec:"required"` } var dec PayloadAttributesV1 @@ -42,7 +42,7 @@ func (p *PayloadAttributesV1) UnmarshalJSON(input []byte) error { } p.Timestamp = uint64(*dec.Timestamp) if dec.Random == nil { - return errors.New("missing required field 'random' for PayloadAttributesV1") + return errors.New("missing required field 'prevRandao' for PayloadAttributesV1") } p.Random = *dec.Random if dec.SuggestedFeeRecipient == nil { diff --git a/eth/catalyst/gen_ed.go b/core/beacon/gen_ed.go similarity index 93% rename from eth/catalyst/gen_ed.go rename to core/beacon/gen_ed.go index 46eb45808b..dcee3bf18c 100644 --- a/eth/catalyst/gen_ed.go +++ b/core/beacon/gen_ed.go @@ -1,6 +1,6 @@ // Code generated by github.com/fjl/gencodec. DO NOT EDIT. -package catalyst +package beacon import ( "encoding/json" @@ -19,9 +19,9 @@ func (e ExecutableDataV1) MarshalJSON() ([]byte, error) { ParentHash common.Hash `json:"parentHash" gencodec:"required"` FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` StateRoot common.Hash `json:"stateRoot" gencodec:"required"` - ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` LogsBloom hexutil.Bytes `json:"logsBloom" gencodec:"required"` - Random common.Hash `json:"random" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` Number hexutil.Uint64 `json:"blockNumber" gencodec:"required"` GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` @@ -60,9 +60,9 @@ func (e *ExecutableDataV1) UnmarshalJSON(input []byte) error { ParentHash *common.Hash `json:"parentHash" gencodec:"required"` FeeRecipient *common.Address `json:"feeRecipient" gencodec:"required"` StateRoot *common.Hash `json:"stateRoot" gencodec:"required"` - ReceiptsRoot *common.Hash `json:"receiptsRoot" gencodec:"required"` + ReceiptsRoot *common.Hash `json:"receiptsRoot" gencodec:"required"` LogsBloom *hexutil.Bytes `json:"logsBloom" gencodec:"required"` - Random *common.Hash `json:"random" gencodec:"required"` + Random *common.Hash `json:"prevRandao" gencodec:"required"` Number *hexutil.Uint64 `json:"blockNumber" gencodec:"required"` GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` @@ -97,7 +97,7 @@ func (e *ExecutableDataV1) UnmarshalJSON(input []byte) error { } e.LogsBloom = *dec.LogsBloom if dec.Random == nil { - return errors.New("missing required field 'random' for ExecutableDataV1") + return errors.New("missing required field 'prevRandao' for ExecutableDataV1") } e.Random = *dec.Random if dec.Number == nil { diff --git a/core/beacon/types.go b/core/beacon/types.go new file mode 100644 index 0000000000..18d5d2ab78 --- /dev/null +++ b/core/beacon/types.go @@ -0,0 +1,194 @@ +// Copyright 2022 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 . + +package beacon + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/trie" +) + +//go:generate go run github.com/fjl/gencodec -type PayloadAttributesV1 -field-override payloadAttributesMarshaling -out gen_blockparams.go + +// PayloadAttributesV1 structure described at https://github.com/ethereum/execution-apis/pull/74 +type PayloadAttributesV1 struct { + Timestamp uint64 `json:"timestamp" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` +} + +// JSON type overrides for PayloadAttributesV1. +type payloadAttributesMarshaling struct { + Timestamp hexutil.Uint64 +} + +//go:generate go run github.com/fjl/gencodec -type ExecutableDataV1 -field-override executableDataMarshaling -out gen_ed.go + +// ExecutableDataV1 structure described at https://github.com/ethereum/execution-apis/src/engine/specification.md +type ExecutableDataV1 struct { + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom []byte `json:"logsBloom" gencodec:"required"` + Random common.Hash `json:"prevRandao" gencodec:"required"` + Number uint64 `json:"blockNumber" gencodec:"required"` + GasLimit uint64 `json:"gasLimit" gencodec:"required"` + GasUsed uint64 `json:"gasUsed" gencodec:"required"` + Timestamp uint64 `json:"timestamp" gencodec:"required"` + ExtraData []byte `json:"extraData" gencodec:"required"` + BaseFeePerGas *big.Int `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions [][]byte `json:"transactions" gencodec:"required"` +} + +// JSON type overrides for executableData. +type executableDataMarshaling struct { + Number hexutil.Uint64 + GasLimit hexutil.Uint64 + GasUsed hexutil.Uint64 + Timestamp hexutil.Uint64 + BaseFeePerGas *hexutil.Big + ExtraData hexutil.Bytes + LogsBloom hexutil.Bytes + Transactions []hexutil.Bytes +} + +type PayloadStatusV1 struct { + Status string `json:"status"` + LatestValidHash *common.Hash `json:"latestValidHash"` + ValidationError *string `json:"validationError"` +} + +type TransitionConfigurationV1 struct { + TerminalTotalDifficulty *hexutil.Big `json:"terminalTotalDifficulty"` + TerminalBlockHash common.Hash `json:"terminalBlockHash"` + TerminalBlockNumber hexutil.Uint64 `json:"terminalBlockNumber"` +} + +// PayloadID is an identifier of the payload build process +type PayloadID [8]byte + +func (b PayloadID) String() string { + return hexutil.Encode(b[:]) +} + +func (b PayloadID) MarshalText() ([]byte, error) { + return hexutil.Bytes(b[:]).MarshalText() +} + +func (b *PayloadID) UnmarshalText(input []byte) error { + err := hexutil.UnmarshalFixedText("PayloadID", input, b[:]) + if err != nil { + return fmt.Errorf("invalid payload id %q: %w", input, err) + } + return nil +} + +type ForkChoiceResponse struct { + PayloadStatus PayloadStatusV1 `json:"payloadStatus"` + PayloadID *PayloadID `json:"payloadId"` +} + +type ForkchoiceStateV1 struct { + HeadBlockHash common.Hash `json:"headBlockHash"` + SafeBlockHash common.Hash `json:"safeBlockHash"` + FinalizedBlockHash common.Hash `json:"finalizedBlockHash"` +} + +func encodeTransactions(txs []*types.Transaction) [][]byte { + var enc = make([][]byte, len(txs)) + for i, tx := range txs { + enc[i], _ = tx.MarshalBinary() + } + return enc +} + +func decodeTransactions(enc [][]byte) ([]*types.Transaction, error) { + var txs = make([]*types.Transaction, len(enc)) + for i, encTx := range enc { + var tx types.Transaction + if err := tx.UnmarshalBinary(encTx); err != nil { + return nil, fmt.Errorf("invalid transaction %d: %v", i, err) + } + txs[i] = &tx + } + return txs, nil +} + +// ExecutableDataToBlock constructs a block from executable data. +// It verifies that the following fields: +// len(extraData) <= 32 +// uncleHash = emptyUncleHash +// difficulty = 0 +// and that the blockhash of the constructed block matches the parameters. +func ExecutableDataToBlock(params ExecutableDataV1) (*types.Block, error) { + txs, err := decodeTransactions(params.Transactions) + if err != nil { + return nil, err + } + if len(params.ExtraData) > 32 { + return nil, fmt.Errorf("invalid extradata length: %v", len(params.ExtraData)) + } + header := &types.Header{ + ParentHash: params.ParentHash, + UncleHash: types.EmptyUncleHash, + Coinbase: params.FeeRecipient, + Root: params.StateRoot, + TxHash: types.DeriveSha(types.Transactions(txs), trie.NewStackTrie(nil)), + ReceiptHash: params.ReceiptsRoot, + Bloom: types.BytesToBloom(params.LogsBloom), + Difficulty: common.Big0, + Number: new(big.Int).SetUint64(params.Number), + GasLimit: params.GasLimit, + GasUsed: params.GasUsed, + Time: params.Timestamp, + BaseFee: params.BaseFeePerGas, + Extra: params.ExtraData, + MixDigest: params.Random, + } + block := types.NewBlockWithHeader(header).WithBody(txs, nil /* uncles */) + if block.Hash() != params.BlockHash { + return nil, fmt.Errorf("blockhash mismatch, want %x, got %x", params.BlockHash, block.Hash()) + } + return block, nil +} + +// BlockToExecutableData constructs the executableDataV1 structure by filling the +// fields from the given block. It assumes the given block is post-merge block. +func BlockToExecutableData(block *types.Block) *ExecutableDataV1 { + return &ExecutableDataV1{ + BlockHash: block.Hash(), + ParentHash: block.ParentHash(), + FeeRecipient: block.Coinbase(), + StateRoot: block.Root(), + Number: block.NumberU64(), + GasLimit: block.GasLimit(), + GasUsed: block.GasUsed(), + BaseFeePerGas: block.BaseFee(), + Timestamp: block.Time(), + ReceiptsRoot: block.ReceiptHash(), + LogsBloom: block.Bloom().Bytes(), + Transactions: encodeTransactions(block.Transactions()), + Random: block.MixDigest(), + ExtraData: block.Extra(), + } +} diff --git a/core/blockchain.go b/core/blockchain.go index 6ee62a5d52..a57a2f7f78 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -552,6 +552,19 @@ func (bc *BlockChain) setHeadBeyondRoot(head uint64, root common.Hash, repair bo } } if beyondRoot || newHeadBlock.NumberU64() == 0 { + if newHeadBlock.NumberU64() == 0 { + // Recommit the genesis state into disk in case the rewinding destination + // is genesis block and the relevant state is gone. In the future this + // rewinding destination can be the earliest block stored in the chain + // if the historical chain pruning is enabled. In that case the logic + // needs to be improved here. + if !bc.HasState(bc.genesisBlock.Root()) { + if err := CommitGenesisState(bc.db, bc.genesisBlock.Hash()); err != nil { + log.Crit("Failed to commit genesis state", "err", err) + } + log.Debug("Recommitted genesis state to disk") + } + } log.Debug("Rewound to block with state", "number", newHeadBlock.NumberU64(), "hash", newHeadBlock.Hash()) break } @@ -564,7 +577,7 @@ func (bc *BlockChain) setHeadBeyondRoot(head uint64, root common.Hash, repair bo // Degrade the chain markers if they are explicitly reverted. // In theory we should update all in-memory markers in the // last step, however the direction of SetHead is from high - // to low, so it's safe the update in-memory markers directly. + // to low, so it's safe to update in-memory markers directly. bc.currentBlock.Store(newHeadBlock) headBlockGauge.Update(int64(newHeadBlock.NumberU64())) } @@ -602,7 +615,7 @@ func (bc *BlockChain) setHeadBeyondRoot(head uint64, root common.Hash, repair bo if num+1 <= frozen { // Truncate all relative data(header, total difficulty, body, receipt // and canonical hash) from ancient store. - if err := bc.db.TruncateAncients(num); err != nil { + if err := bc.db.TruncateHead(num); err != nil { log.Crit("Failed to truncate ancient data", "number", num, "err", err) } // Remove the hash <-> number mapping from the active store. @@ -998,38 +1011,37 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ // range. In this case, all tx indices of newly imported blocks should be // generated. var batch = bc.db.NewBatch() - for _, block := range blockChain { + for i, block := range blockChain { if bc.txLookupLimit == 0 || ancientLimit <= bc.txLookupLimit || block.NumberU64() >= ancientLimit-bc.txLookupLimit { rawdb.WriteTxLookupEntriesByBlock(batch, block) } else if rawdb.ReadTxIndexTail(bc.db) != nil { rawdb.WriteTxLookupEntriesByBlock(batch, block) } stats.processed++ - } - // Flush all tx-lookup index data. - size += int64(batch.ValueSize()) - if err := batch.Write(); err != nil { - // The tx index data could not be written. - // Roll back the ancient store update. - fastBlock := bc.CurrentFastBlock().NumberU64() - if err := bc.db.TruncateAncients(fastBlock + 1); err != nil { - log.Error("Can't truncate ancient store after failed insert", "err", err) + if batch.ValueSize() > ethdb.IdealBatchSize || i == len(blockChain)-1 { + size += int64(batch.ValueSize()) + if err = batch.Write(); err != nil { + fastBlock := bc.CurrentFastBlock().NumberU64() + if err := bc.db.TruncateHead(fastBlock + 1); err != nil { + log.Error("Can't truncate ancient store after failed insert", "err", err) + } + return 0, err + } + batch.Reset() } - return 0, err } // Sync the ancient store explicitly to ensure all data has been flushed to disk. if err := bc.db.Sync(); err != nil { return 0, err } - // Update the current fast block because all block data is now present in DB. previousFastBlock := bc.CurrentFastBlock().NumberU64() if !updateHead(blockChain[len(blockChain)-1]) { // We end up here if the header chain has reorg'ed, and the blocks/receipts // don't match the canonical chain. - if err := bc.db.TruncateAncients(previousFastBlock + 1); err != nil { + if err := bc.db.TruncateHead(previousFastBlock + 1); err != nil { log.Error("Can't truncate ancient store after failed insert", "err", err) } return 0, errSideChainReceipts @@ -1733,12 +1745,16 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals, setHead bool) blockWriteTimer.Update(time.Since(substart) - statedb.AccountCommits - statedb.StorageCommits - statedb.SnapshotCommits) blockInsertTimer.UpdateSince(start) + // Report the import stats before returning the various results + stats.processed++ + stats.usedGas += usedGas + + dirty, _ := bc.stateCache.TrieDB().Size() + stats.report(chain, it.index, dirty, setHead) + if !setHead { - // We did not setHead, so we don't have any stats to update - log.Info("Inserted block", "number", block.Number(), "hash", block.Hash(), "txs", len(block.Transactions()), "elapsed", common.PrettyDuration(time.Since(start))) - return it.index, nil + return it.index, nil // Direct block insertion of a single block } - switch status { case CanonStatTy: log.Debug("Inserted new block", "number", block.Number(), "hash", block.Hash(), @@ -1765,11 +1781,6 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals, setHead bool) "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()), "root", block.Root()) } - stats.processed++ - stats.usedGas += usedGas - - dirty, _ := bc.stateCache.TrieDB().Size() - stats.report(chain, it.index, dirty) } // Any blocks remaining here? The only ones we care about are the future ones @@ -2179,28 +2190,39 @@ func (bc *BlockChain) InsertBlockWithoutSetHead(block *types.Block) error { // block. It's possible that after the reorg the relevant state of head // is missing. It can be fixed by inserting a new block which triggers // the re-execution. -func (bc *BlockChain) SetChainHead(newBlock *types.Block) error { +func (bc *BlockChain) SetChainHead(head *types.Block) error { if !bc.chainmu.TryLock() { return errChainStopped } defer bc.chainmu.Unlock() // Run the reorg if necessary and set the given block as new head. - if newBlock.ParentHash() != bc.CurrentBlock().Hash() { - if err := bc.reorg(bc.CurrentBlock(), newBlock); err != nil { + start := time.Now() + if head.ParentHash() != bc.CurrentBlock().Hash() { + if err := bc.reorg(bc.CurrentBlock(), head); err != nil { return err } } - bc.writeHeadBlock(newBlock) + bc.writeHeadBlock(head) // Emit events - logs := bc.collectLogs(newBlock.Hash(), false) - bc.chainFeed.Send(ChainEvent{Block: newBlock, Hash: newBlock.Hash(), Logs: logs}) + logs := bc.collectLogs(head.Hash(), false) + bc.chainFeed.Send(ChainEvent{Block: head, Hash: head.Hash(), Logs: logs}) if len(logs) > 0 { bc.logsFeed.Send(logs) } - bc.chainHeadFeed.Send(ChainHeadEvent{Block: newBlock}) - log.Info("Set the chain head", "number", newBlock.Number(), "hash", newBlock.Hash()) + bc.chainHeadFeed.Send(ChainHeadEvent{Block: head}) + + context := []interface{}{ + "number", head.Number(), + "hash", head.Hash(), + "root", head.Root(), + "elapsed", time.Since(start), + } + if timestamp := time.Unix(int64(head.Time()), 0); time.Since(timestamp) > time.Minute { + context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) + } + log.Info("Chain head was updated", context...) return nil } @@ -2386,6 +2408,9 @@ Error: %v // of the header retrieval mechanisms already need to verify nonces, as well as // because nonces can be verified sparsely, not needing to check each. func (bc *BlockChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) { + if len(chain) == 0 { + return 0, nil + } start := time.Now() if i, err := bc.hc.ValidateHeaderChain(chain, checkFreq); err != nil { return i, err diff --git a/core/blockchain_insert.go b/core/blockchain_insert.go index 4464870279..479eccc83e 100644 --- a/core/blockchain_insert.go +++ b/core/blockchain_insert.go @@ -39,7 +39,7 @@ const statsReportLimit = 8 * time.Second // report prints statistics if some number of blocks have been processed // or more than a few seconds have passed since the last message. -func (st *insertStats) report(chain []*types.Block, index int, dirty common.StorageSize) { +func (st *insertStats) report(chain []*types.Block, index int, dirty common.StorageSize, setHead bool) { // Fetch the timings for the batch var ( now = mclock.Now() @@ -71,8 +71,11 @@ func (st *insertStats) report(chain []*types.Block, index int, dirty common.Stor if st.ignored > 0 { context = append(context, []interface{}{"ignored", st.ignored}...) } - log.Info("Imported new chain segment", context...) - + if setHead { + log.Info("Imported new chain segment", context...) + } else { + log.Info("Imported new potential chain segment", context...) + } // Bump the stats reported to the next section *st = insertStats{startTime: now, lastIndex: index + 1} } diff --git a/core/blockchain_repair_test.go b/core/blockchain_repair_test.go index eb5025ed55..9133671796 100644 --- a/core/blockchain_repair_test.go +++ b/core/blockchain_repair_test.go @@ -1779,6 +1779,7 @@ func testRepair(t *testing.T, tt *rewindTest, snapshots bool) { SnapshotLimit: 0, // Disable snapshot by default } ) + defer engine.Close() if snapshots { config.SnapshotLimit = 256 config.SnapshotWait = true @@ -1836,25 +1837,25 @@ func testRepair(t *testing.T, tt *rewindTest, snapshots bool) { } defer db.Close() - chain, err = NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + newChain, err := NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } - defer chain.Stop() + defer newChain.Stop() // Iterate over all the remaining blocks and ensure there are no gaps - verifyNoGaps(t, chain, true, canonblocks) - verifyNoGaps(t, chain, false, sideblocks) - verifyCutoff(t, chain, true, canonblocks, tt.expCanonicalBlocks) - verifyCutoff(t, chain, false, sideblocks, tt.expSidechainBlocks) + verifyNoGaps(t, newChain, true, canonblocks) + verifyNoGaps(t, newChain, false, sideblocks) + verifyCutoff(t, newChain, true, canonblocks, tt.expCanonicalBlocks) + verifyCutoff(t, newChain, false, sideblocks, tt.expSidechainBlocks) - if head := chain.CurrentHeader(); head.Number.Uint64() != tt.expHeadHeader { + if head := newChain.CurrentHeader(); head.Number.Uint64() != tt.expHeadHeader { t.Errorf("Head header mismatch: have %d, want %d", head.Number, tt.expHeadHeader) } - if head := chain.CurrentFastBlock(); head.NumberU64() != tt.expHeadFastBlock { + if head := newChain.CurrentFastBlock(); head.NumberU64() != tt.expHeadFastBlock { t.Errorf("Head fast block mismatch: have %d, want %d", head.NumberU64(), tt.expHeadFastBlock) } - if head := chain.CurrentBlock(); head.NumberU64() != tt.expHeadBlock { + if head := newChain.CurrentBlock(); head.NumberU64() != tt.expHeadBlock { t.Errorf("Head block mismatch: have %d, want %d", head.NumberU64(), tt.expHeadBlock) } if frozen, err := db.(freezer).Ancients(); err != nil { diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 6e542fe2f4..37a1a42d0c 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -2987,10 +2987,10 @@ func TestDeleteRecreateSlots(t *testing.T) { initCode := []byte{ byte(vm.PUSH1), 0x3, // value byte(vm.PUSH1), 0x3, // location - byte(vm.SSTORE), // Set slot[3] = 1 + byte(vm.SSTORE), // Set slot[3] = 3 byte(vm.PUSH1), 0x4, // value byte(vm.PUSH1), 0x4, // location - byte(vm.SSTORE), // Set slot[4] = 1 + byte(vm.SSTORE), // Set slot[4] = 4 // Slots are set, now return the code byte(vm.PUSH2), byte(vm.PC), byte(vm.SELFDESTRUCT), // Push code on stack byte(vm.PUSH1), 0x0, // memory start on stack diff --git a/core/evm.go b/core/evm.go index 4d2c11f4f0..bb3afc0006 100644 --- a/core/evm.go +++ b/core/evm.go @@ -40,6 +40,7 @@ func NewEVMBlockContext(header *types.Header, chain ChainContext, author *common var ( beneficiary common.Address baseFee *big.Int + random *common.Hash ) // If we don't have an explicit author (i.e. not mining), extract from the header @@ -51,6 +52,9 @@ func NewEVMBlockContext(header *types.Header, chain ChainContext, author *common if header.BaseFee != nil { baseFee = new(big.Int).Set(header.BaseFee) } + if header.Difficulty.Cmp(common.Big0) == 0 { + random = &header.MixDigest + } return vm.BlockContext{ CanTransfer: CanTransfer, Transfer: Transfer, @@ -61,6 +65,7 @@ func NewEVMBlockContext(header *types.Header, chain ChainContext, author *common Difficulty: new(big.Int).Set(header.Difficulty), BaseFee: baseFee, GasLimit: header.GasLimit, + Random: random, } } diff --git a/core/genesis.go b/core/genesis.go index 49c3e47298..1314463ea0 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -84,6 +84,81 @@ func (ga *GenesisAlloc) UnmarshalJSON(data []byte) error { return nil } +// flush adds allocated genesis accounts into a fresh new statedb and +// commit the state changes into the given database handler. +func (ga *GenesisAlloc) flush(db ethdb.Database) (common.Hash, error) { + statedb, err := state.New(common.Hash{}, state.NewDatabase(db), nil) + if err != nil { + return common.Hash{}, err + } + for addr, account := range *ga { + statedb.AddBalance(addr, account.Balance) + statedb.SetCode(addr, account.Code) + statedb.SetNonce(addr, account.Nonce) + for key, value := range account.Storage { + statedb.SetState(addr, key, value) + } + } + root, err := statedb.Commit(false) + if err != nil { + return common.Hash{}, err + } + err = statedb.Database().TrieDB().Commit(root, true, nil) + if err != nil { + return common.Hash{}, err + } + return root, nil +} + +// write writes the json marshaled genesis state into database +// with the given block hash as the unique identifier. +func (ga *GenesisAlloc) write(db ethdb.KeyValueWriter, hash common.Hash) error { + blob, err := json.Marshal(ga) + if err != nil { + return err + } + rawdb.WriteGenesisState(db, hash, blob) + return nil +} + +// CommitGenesisState loads the stored genesis state with the given block +// hash and commits them into the given database handler. +func CommitGenesisState(db ethdb.Database, hash common.Hash) error { + var alloc GenesisAlloc + blob := rawdb.ReadGenesisState(db, hash) + if len(blob) != 0 { + if err := alloc.UnmarshalJSON(blob); err != nil { + return err + } + } else { + // Genesis allocation is missing and there are several possibilities: + // the node is legacy which doesn't persist the genesis allocation or + // the persisted allocation is just lost. + // - supported networks(mainnet, testnets), recover with defined allocations + // - private network, can't recover + var genesis *Genesis + switch hash { + case params.MainnetGenesisHash: + genesis = DefaultGenesisBlock() + case params.RopstenGenesisHash: + genesis = DefaultRopstenGenesisBlock() + case params.RinkebyGenesisHash: + genesis = DefaultRinkebyGenesisBlock() + case params.GoerliGenesisHash: + genesis = DefaultGoerliGenesisBlock() + case params.SepoliaGenesisHash: + genesis = DefaultSepoliaGenesisBlock() + } + if genesis != nil { + alloc = genesis.Alloc + } else { + return errors.New("not found") + } + } + _, err := alloc.flush(db) + return err +} + // GenesisAccount is an account in the state of the genesis block. type GenesisAccount struct { Code []byte `json:"code,omitempty"` @@ -224,11 +299,19 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, override rawdb.WriteChainConfig(db, stored, newcfg) return newcfg, stored, nil } - // Special case: don't change the existing config of a non-mainnet chain if no new - // config is supplied. These chains would get AllProtocolChanges (and a compat error) - // if we just continued here. + // Special case: if a private network is being used (no genesis and also no + // mainnet hash in the database), we must not apply the `configOrDefault` + // chain config as that would be AllProtocolChanges (applying any new fork + // on top of an existing private network genesis block). In that case, only + // apply the overrides. if genesis == nil && stored != params.MainnetGenesisHash { - return storedcfg, stored, nil + newcfg = storedcfg + if overrideArrowGlacier != nil { + newcfg.ArrowGlacierBlock = overrideArrowGlacier + } + if overrideTerminalTotalDifficulty != nil { + newcfg.TerminalTotalDifficulty = overrideTerminalTotalDifficulty + } } // Check config compatibility and write the config. Compatibility errors // are returned to the caller unless we're already at block zero. @@ -263,6 +346,8 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { return params.MumbaiChainConfig case ghash == params.BorMainnetGenesisHash: return params.BorMainnetChainConfig + case ghash == params.KilnGenesisHash: + return DefaultKilnGenesisBlock().Config default: return params.AllEthashProtocolChanges } @@ -274,20 +359,10 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { if db == nil { db = rawdb.NewMemoryDatabase() } - statedb, err := state.New(common.Hash{}, state.NewDatabase(db), nil) + root, err := g.Alloc.flush(db) if err != nil { panic(err) } - for addr, account := range g.Alloc { - statedb.AddBalance(addr, account.Balance) - statedb.SetCode(addr, account.Code) - statedb.SetNonce(addr, account.Nonce) - for key, value := range account.Storage { - statedb.SetState(addr, key, value) - } - } - - root := statedb.IntermediateRoot(false) head := &types.Header{ Number: new(big.Int).SetUint64(g.Number), Nonce: types.EncodeNonce(g.Nonce), @@ -305,7 +380,7 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { if g.GasLimit == 0 { head.GasLimit = params.GenesisGasLimit } - if g.Difficulty == nil { + if g.Difficulty == nil && g.Mixhash == (common.Hash{}) { head.Difficulty = params.GenesisDifficulty } if g.Config != nil && g.Config.IsLondon(common.Big0) { @@ -315,9 +390,6 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { head.BaseFee = new(big.Int).SetUint64(params.InitialBaseFee) } } - statedb.Commit(false) - statedb.Database().TrieDB().Commit(root, true, nil) - return types.NewBlock(head, nil, nil, nil, trie.NewStackTrie(nil)) } @@ -338,6 +410,9 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { if config.Clique != nil && len(block.Extra()) == 0 { return nil, errors.New("can't start clique chain without signers") } + if err := g.Alloc.write(db, block.Hash()); err != nil { + return nil, err + } rawdb.WriteTd(db, block.Hash(), block.NumberU64(), block.Difficulty()) rawdb.WriteBlock(db, block) rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil) @@ -457,6 +532,15 @@ func DefaultSepoliaGenesisBlock() *Genesis { } } +func DefaultKilnGenesisBlock() *Genesis { + g := new(Genesis) + reader := strings.NewReader(KilnAllocData) + if err := json.NewDecoder(reader).Decode(g); err != nil { + panic(err) + } + return g +} + // DeveloperGenesisBlock returns the 'geth --dev' genesis block. func DeveloperGenesisBlock(period uint64, gasLimit uint64, faucet common.Address) *Genesis { // Override the default period to the user requested one diff --git a/core/genesis_alloc.go b/core/genesis_alloc.go index 3d053904e7..041c554242 100644 --- a/core/genesis_alloc.go +++ b/core/genesis_alloc.go @@ -27,3 +27,868 @@ const rinkebyAllocData = "\xf9\x03\xb7\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03 const goerliAllocData = "\xf9\x04\x06\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xc2\x05\x01\xc2\x06\x01\xc2\a\x01\xc2\b\x01\xc2\t\x01\xc2\n\x01\xc2\v\x01\xc2\f\x01\xc2\r\x01\xc2\x0e\x01\xc2\x0f\x01\xc2\x10\x01\xc2\x11\x01\xc2\x12\x01\xc2\x13\x01\xc2\x14\x01\xc2\x15\x01\xc2\x16\x01\xc2\x17\x01\xc2\x18\x01\xc2\x19\x01\xc2\x1a\x01\xc2\x1b\x01\xc2\x1c\x01\xc2\x1d\x01\xc2\x1e\x01\xc2\x1f\x01\xc2 \x01\xc2!\x01\xc2\"\x01\xc2#\x01\xc2$\x01\xc2%\x01\xc2&\x01\xc2'\x01\xc2(\x01\xc2)\x01\xc2*\x01\xc2+\x01\xc2,\x01\xc2-\x01\xc2.\x01\xc2/\x01\xc20\x01\xc21\x01\xc22\x01\xc23\x01\xc24\x01\xc25\x01\xc26\x01\xc27\x01\xc28\x01\xc29\x01\xc2:\x01\xc2;\x01\xc2<\x01\xc2=\x01\xc2>\x01\xc2?\x01\xc2@\x01\xc2A\x01\xc2B\x01\xc2C\x01\xc2D\x01\xc2E\x01\xc2F\x01\xc2G\x01\xc2H\x01\xc2I\x01\xc2J\x01\xc2K\x01\xc2L\x01\xc2M\x01\xc2N\x01\xc2O\x01\xc2P\x01\xc2Q\x01\xc2R\x01\xc2S\x01\xc2T\x01\xc2U\x01\xc2V\x01\xc2W\x01\xc2X\x01\xc2Y\x01\xc2Z\x01\xc2[\x01\xc2\\\x01\xc2]\x01\xc2^\x01\xc2_\x01\xc2`\x01\xc2a\x01\xc2b\x01\xc2c\x01\xc2d\x01\xc2e\x01\xc2f\x01\xc2g\x01\xc2h\x01\xc2i\x01\xc2j\x01\xc2k\x01\xc2l\x01\xc2m\x01\xc2n\x01\xc2o\x01\xc2p\x01\xc2q\x01\xc2r\x01\xc2s\x01\xc2t\x01\xc2u\x01\xc2v\x01\xc2w\x01\xc2x\x01\xc2y\x01\xc2z\x01\xc2{\x01\xc2|\x01\xc2}\x01\xc2~\x01\xc2\u007f\x01\u00c1\x80\x01\u00c1\x81\x01\u00c1\x82\x01\u00c1\x83\x01\u00c1\x84\x01\u00c1\x85\x01\u00c1\x86\x01\u00c1\x87\x01\u00c1\x88\x01\u00c1\x89\x01\u00c1\x8a\x01\u00c1\x8b\x01\u00c1\x8c\x01\u00c1\x8d\x01\u00c1\x8e\x01\u00c1\x8f\x01\u00c1\x90\x01\u00c1\x91\x01\u00c1\x92\x01\u00c1\x93\x01\u00c1\x94\x01\u00c1\x95\x01\u00c1\x96\x01\u00c1\x97\x01\u00c1\x98\x01\u00c1\x99\x01\u00c1\x9a\x01\u00c1\x9b\x01\u00c1\x9c\x01\u00c1\x9d\x01\u00c1\x9e\x01\u00c1\x9f\x01\u00c1\xa0\x01\u00c1\xa1\x01\u00c1\xa2\x01\u00c1\xa3\x01\u00c1\xa4\x01\u00c1\xa5\x01\u00c1\xa6\x01\u00c1\xa7\x01\u00c1\xa8\x01\u00c1\xa9\x01\u00c1\xaa\x01\u00c1\xab\x01\u00c1\xac\x01\u00c1\xad\x01\u00c1\xae\x01\u00c1\xaf\x01\u00c1\xb0\x01\u00c1\xb1\x01\u00c1\xb2\x01\u00c1\xb3\x01\u00c1\xb4\x01\u00c1\xb5\x01\u00c1\xb6\x01\u00c1\xb7\x01\u00c1\xb8\x01\u00c1\xb9\x01\u00c1\xba\x01\u00c1\xbb\x01\u00c1\xbc\x01\u00c1\xbd\x01\u00c1\xbe\x01\u00c1\xbf\x01\u00c1\xc0\x01\u00c1\xc1\x01\u00c1\xc2\x01\u00c1\xc3\x01\u00c1\xc4\x01\u00c1\xc5\x01\u00c1\xc6\x01\u00c1\xc7\x01\u00c1\xc8\x01\u00c1\xc9\x01\u00c1\xca\x01\u00c1\xcb\x01\u00c1\xcc\x01\u00c1\xcd\x01\u00c1\xce\x01\u00c1\xcf\x01\u00c1\xd0\x01\u00c1\xd1\x01\u00c1\xd2\x01\u00c1\xd3\x01\u00c1\xd4\x01\u00c1\xd5\x01\u00c1\xd6\x01\u00c1\xd7\x01\u00c1\xd8\x01\u00c1\xd9\x01\u00c1\xda\x01\u00c1\xdb\x01\u00c1\xdc\x01\u00c1\xdd\x01\u00c1\xde\x01\u00c1\xdf\x01\u00c1\xe0\x01\u00c1\xe1\x01\u00c1\xe2\x01\u00c1\xe3\x01\u00c1\xe4\x01\u00c1\xe5\x01\u00c1\xe6\x01\u00c1\xe7\x01\u00c1\xe8\x01\u00c1\xe9\x01\u00c1\xea\x01\u00c1\xeb\x01\u00c1\xec\x01\u00c1\xed\x01\u00c1\xee\x01\u00c1\xef\x01\u00c1\xf0\x01\u00c1\xf1\x01\u00c1\xf2\x01\u00c1\xf3\x01\u00c1\xf4\x01\u00c1\xf5\x01\u00c1\xf6\x01\u00c1\xf7\x01\u00c1\xf8\x01\u00c1\xf9\x01\u00c1\xfa\x01\u00c1\xfb\x01\u00c1\xfc\x01\u00c1\xfd\x01\u00c1\xfe\x01\u00c1\xff\x01\xe0\x94L*\xe4\x82Y5\x05\xf0\x16<\xde\xfc\a>\x81\xc6<\xdaA\a\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\xa8\xe8\xf1G2e\x8eKQ\xe8q\x191\x05:\x8ai\xba\xf2\xb1\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe1\x94\u0665\x17\x9f\t\x1d\x85\x05\x1d<\x98'\x85\xef\xd1E\\\uc199\x8b\bE\x95\x16\x14\x01HJ\x00\x00\x00\xe1\x94\u08bdBX\xd2v\x887\xba\xa2j(\xfeq\xdc\a\x9f\x84\u01cbJG\xe3\xc1$H\xf4\xad\x00\x00\x00" const calaverasAllocData = "\xf9\x06\x14\u0080\x01\xc2\x01\x01\xc2\x02\x01\xc2\x03\x01\xc2\x04\x01\xc2\x05\x01\xc2\x06\x01\xc2\a\x01\xc2\b\x01\xc2\t\x01\xc2\n\x01\xc2\v\x01\xc2\f\x01\xc2\r\x01\xc2\x0e\x01\xc2\x0f\x01\xc2\x10\x01\xc2\x11\x01\xc2\x12\x01\xc2\x13\x01\xc2\x14\x01\xc2\x15\x01\xc2\x16\x01\xc2\x17\x01\xc2\x18\x01\xc2\x19\x01\xc2\x1a\x01\xc2\x1b\x01\xc2\x1c\x01\xc2\x1d\x01\xc2\x1e\x01\xc2\x1f\x01\xc2 \x01\xc2!\x01\xc2\"\x01\xc2#\x01\xc2$\x01\xc2%\x01\xc2&\x01\xc2'\x01\xc2(\x01\xc2)\x01\xc2*\x01\xc2+\x01\xc2,\x01\xc2-\x01\xc2.\x01\xc2/\x01\xc20\x01\xc21\x01\xc22\x01\xc23\x01\xc24\x01\xc25\x01\xc26\x01\xc27\x01\xc28\x01\xc29\x01\xc2:\x01\xc2;\x01\xc2<\x01\xc2=\x01\xc2>\x01\xc2?\x01\xc2@\x01\xc2A\x01\xc2B\x01\xc2C\x01\xc2D\x01\xc2E\x01\xc2F\x01\xc2G\x01\xc2H\x01\xc2I\x01\xc2J\x01\xc2K\x01\xc2L\x01\xc2M\x01\xc2N\x01\xc2O\x01\xc2P\x01\xc2Q\x01\xc2R\x01\xc2S\x01\xc2T\x01\xc2U\x01\xc2V\x01\xc2W\x01\xc2X\x01\xc2Y\x01\xc2Z\x01\xc2[\x01\xc2\\\x01\xc2]\x01\xc2^\x01\xc2_\x01\xc2`\x01\xc2a\x01\xc2b\x01\xc2c\x01\xc2d\x01\xc2e\x01\xc2f\x01\xc2g\x01\xc2h\x01\xc2i\x01\xc2j\x01\xc2k\x01\xc2l\x01\xc2m\x01\xc2n\x01\xc2o\x01\xc2p\x01\xc2q\x01\xc2r\x01\xc2s\x01\xc2t\x01\xc2u\x01\xc2v\x01\xc2w\x01\xc2x\x01\xc2y\x01\xc2z\x01\xc2{\x01\xc2|\x01\xc2}\x01\xc2~\x01\xc2\u007f\x01\u00c1\x80\x01\u00c1\x81\x01\u00c1\x82\x01\u00c1\x83\x01\u00c1\x84\x01\u00c1\x85\x01\u00c1\x86\x01\u00c1\x87\x01\u00c1\x88\x01\u00c1\x89\x01\u00c1\x8a\x01\u00c1\x8b\x01\u00c1\x8c\x01\u00c1\x8d\x01\u00c1\x8e\x01\u00c1\x8f\x01\u00c1\x90\x01\u00c1\x91\x01\u00c1\x92\x01\u00c1\x93\x01\u00c1\x94\x01\u00c1\x95\x01\u00c1\x96\x01\u00c1\x97\x01\u00c1\x98\x01\u00c1\x99\x01\u00c1\x9a\x01\u00c1\x9b\x01\u00c1\x9c\x01\u00c1\x9d\x01\u00c1\x9e\x01\u00c1\x9f\x01\u00c1\xa0\x01\u00c1\xa1\x01\u00c1\xa2\x01\u00c1\xa3\x01\u00c1\xa4\x01\u00c1\xa5\x01\u00c1\xa6\x01\u00c1\xa7\x01\u00c1\xa8\x01\u00c1\xa9\x01\u00c1\xaa\x01\u00c1\xab\x01\u00c1\xac\x01\u00c1\xad\x01\u00c1\xae\x01\u00c1\xaf\x01\u00c1\xb0\x01\u00c1\xb1\x01\u00c1\xb2\x01\u00c1\xb3\x01\u00c1\xb4\x01\u00c1\xb5\x01\u00c1\xb6\x01\u00c1\xb7\x01\u00c1\xb8\x01\u00c1\xb9\x01\u00c1\xba\x01\u00c1\xbb\x01\u00c1\xbc\x01\u00c1\xbd\x01\u00c1\xbe\x01\u00c1\xbf\x01\u00c1\xc0\x01\u00c1\xc1\x01\u00c1\xc2\x01\u00c1\xc3\x01\u00c1\xc4\x01\u00c1\xc5\x01\u00c1\xc6\x01\u00c1\xc7\x01\u00c1\xc8\x01\u00c1\xc9\x01\u00c1\xca\x01\u00c1\xcb\x01\u00c1\xcc\x01\u00c1\xcd\x01\u00c1\xce\x01\u00c1\xcf\x01\u00c1\xd0\x01\u00c1\xd1\x01\u00c1\xd2\x01\u00c1\xd3\x01\u00c1\xd4\x01\u00c1\xd5\x01\u00c1\xd6\x01\u00c1\xd7\x01\u00c1\xd8\x01\u00c1\xd9\x01\u00c1\xda\x01\u00c1\xdb\x01\u00c1\xdc\x01\u00c1\xdd\x01\u00c1\xde\x01\u00c1\xdf\x01\u00c1\xe0\x01\u00c1\xe1\x01\u00c1\xe2\x01\u00c1\xe3\x01\u00c1\xe4\x01\u00c1\xe5\x01\u00c1\xe6\x01\u00c1\xe7\x01\u00c1\xe8\x01\u00c1\xe9\x01\u00c1\xea\x01\u00c1\xeb\x01\u00c1\xec\x01\u00c1\xed\x01\u00c1\xee\x01\u00c1\xef\x01\u00c1\xf0\x01\u00c1\xf1\x01\u00c1\xf2\x01\u00c1\xf3\x01\u00c1\xf4\x01\u00c1\xf5\x01\u00c1\xf6\x01\u00c1\xf7\x01\u00c1\xf8\x01\u00c1\xf9\x01\u00c1\xfa\x01\u00c1\xfb\x01\u00c1\xfc\x01\u00c1\xfd\x01\u00c1\xfe\x01\u00c1\xff\x01\xf6\x94\x0e\x89\xe2\xae\xdb\x1c\xfc\u06d4$\xd4\x1a\x1f!\x8fA2s\x81r\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\x10A\xaf\xbc\xb3Y\u0568\xdcX\xc1[/\xf5\x13T\xff\x8a!}\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94#o\xf1\xe9t\x19\xae\x93\xad\x80\xca\xfb\xaa!\"\f]x\xfb}\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94`\xad\xc0\xf8\x9aA\xaf#|\xe75T\xed\xe1p\xd73\xec\x14\xe0\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94y\x9d2\x9e_X4\x19\x16|\xd7\"\x96$\x85\x92n3\x8fJ\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94|\xf5\xb7\x9b\xfe)\x1ag\xab\x02\xb3\x93\xe4V\xcc\xc4\xc2f\xf7S\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\x8a\x8e\xaf\xb1\xcfb\xbf\xbe\xb1t\x17i\xda\xe1\xa9\xddG\x99a\x92\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\x8b\xa1\xf1\tU\x1b\xd42\x800\x12dZ\xc16\xdd\xd6M\xbar\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\xb0*.\xda\x1b1\u007f\xbd\x16v\x01(\x83k\n\u015bV\x0e\x9d\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\xba\xdc\r\xe9\xe0yK\x04\x9b^\xa6<>\x1ei\x8a4v\xc1r\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\xf00\v\ue24a\xe2r\xeb4~\x83i\xac\fv\xdfB\xc9?\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x94\xfe;U~\x8f\xb6+\x89\xf4\x91kr\x1b\xe5\\\ub08d\xbds\xa0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" const sepoliaAllocData = "\xf9\x01\xee\u0791i\x16\xa8{\x823?BE\x04f#\xb27\x94\xc6\\\x8b\bE\x95\x16\x14\x01HJ\x00\x00\x00\xe1\x94\x10\xf5\xd4XT\xe08\a\x14\x85\xac\x9e@#\b\u03c0\xd2\xd2\xfe\x8bR\xb7\xd2\xdc\xc8\f\xd2\xe4\x00\x00\x00\u0794y\x9d2\x9e_X4\x19\x16|\xd7\"\x96$\x85\x92n3\x8fJ\x88\r\u0db3\xa7d\x00\x00\xe0\x94|\xf5\xb7\x9b\xfe)\x1ag\xab\x02\xb3\x93\xe4V\xcc\xc4\xc2f\xf7S\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\x8b\u007f\tw\xbbO\x0f\xbepv\xfa\"\xbc$\xac\xa0CX?^\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xa2\xa6\xd949\x14O\xfeM'\xc9\xe0\x88\xdc\u0637\x83\x94bc\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xaa\xec\x869DA\xf9\x15\xbc\xe3\xe6\xab9\x99w\xe9\x90o;i\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\u1532\x1c3\xde\x1f\xab?\xa1T\x99\xc6+Y\xfe\f\xc3%\x00 \u044bR\xb7\xd2\xdc\xc8\f\xd2\xe4\x00\x00\x00\xe0\x94\xbc\x11)Y6\xaay\u0554\x13\x9d\xe1\xb2\xe1&)AO;\u06ca\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xbe\xef2\xca[\x9a\x19\x8d'\xb4\xe0/LpC\x9f\xe6\x03V\u03ca\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe1\x94\xd7\xd7lX\xb3\xa5\x19\xe9\xfal\xc4\xd2-\xc0\x17%\x9b\u011f\x1e\x8bR\xb7\xd2\xdc\xc8\f\xd2\xe4\x00\x00\x00\xe0\x94\xd7\xed\xdbx\xed)[<\x96)$\x0e\x89$\xfb\x8d\x88t\xdd\u060a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\u0665\x17\x9f\t\x1d\x85\x05\x1d<\x98'\x85\xef\xd1E\\\uc199\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xe2\xe2e\x90(\x147\x84\xd5W\xbc\xeco\xf3\xa0r\x10H\x88\n\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00\xe0\x94\xf4|\xae\x1c\xf7\x9c\xa6u\x8b\xfcx}\xbd!\u6f7eq\x12\xb8\x8a\xd3\xc2\x1b\xce\xcc\xed\xa1\x00\x00\x00" +const KilnAllocData = `{ + "config": { + "chainId": 1337802, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "mergeForkBlock": 1000, + "terminalTotalDifficulty": 20000000000000 + }, + "alloc": { + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x4242424242424242424242424242424242424242": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134": { + "balance": "10000000000000000000000000" + }, + "0x2cA5F489CC1Fd1CEC24747B64E8dE0F4A6A850E1": { + "balance": "10000000000000000000000000" + }, + "0x7203bd333a874D9d329050ecE393820fCD501eaA": { + "balance": "10000000000000000000000000" + }, + "0xA51918aA40D78Ff8be939bf0E8404252875c6aDF": { + "balance": "10000000000000000000000000" + }, + "0xAA81078e6b2121dd7A846690DFdD6b10d7658d8B": { + "balance": "10000000000000000000000000" + }, + "0xFA2d31D8f21c1D1633E9BEB641dF77D21D63ccDd": { + "balance": "10000000000000000000000000" + }, + "0xf751C9c6d60614226fE57D2cAD6e10C856a2ddA3": { + "balance": "10000000000000000000000000" + }, + "0x9cD16887f6A808AEaa65D3c840f059EeA4ca1319": { + "balance": "10000000000000000000000000" + }, + "0x2E07043584F11BFF0AC39c927665DF6c6ebaffFB": { + "balance": "10000000000000000000000000" + }, + "0x60e771E5eCA8E26690920de669520Da210D64A9B": { + "balance": "10000000000000000000000000" + }, + "0xFC4db92C2Cf77CE02fBfd7Da0346d2CbFA66aD59": { + "balance": "10000000000000000000000000" + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x01", + "extraData": "", + "gasLimit": "0x400000", + "nonce": "0x1234", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0" + }` diff --git a/core/genesis_test.go b/core/genesis_test.go index f3d6b23e5f..cf49de7ff1 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -213,3 +213,63 @@ func TestGenesis_Commit(t *testing.T) { t.Errorf("inequal difficulty; stored: %v, genesisBlock: %v", stored, genesisBlock.Difficulty()) } } + +func TestReadWriteGenesisAlloc(t *testing.T) { + var ( + db = rawdb.NewMemoryDatabase() + alloc = &GenesisAlloc{ + {1}: {Balance: big.NewInt(1), Storage: map[common.Hash]common.Hash{{1}: {1}}}, + {2}: {Balance: big.NewInt(2), Storage: map[common.Hash]common.Hash{{2}: {2}}}, + } + hash = common.HexToHash("0xdeadbeef") + ) + alloc.write(db, hash) + + var reload GenesisAlloc + err := reload.UnmarshalJSON(rawdb.ReadGenesisState(db, hash)) + if err != nil { + t.Fatalf("Failed to load genesis state %v", err) + } + if len(reload) != len(*alloc) { + t.Fatal("Unexpected genesis allocation") + } + for addr, account := range reload { + want, ok := (*alloc)[addr] + if !ok { + t.Fatal("Account is not found") + } + if !reflect.DeepEqual(want, account) { + t.Fatal("Unexpected account") + } + } +} + +func TestGenesis_Commit(t *testing.T) { + genesis := &Genesis{ + BaseFee: big.NewInt(params.InitialBaseFee), + Config: params.TestChainConfig, + // difficulty is nil + } + + db := rawdb.NewMemoryDatabase() + genesisBlock, err := genesis.Commit(db) + if err != nil { + t.Fatal(err) + } + + if genesis.Difficulty != nil { + t.Fatalf("assumption wrong") + } + + // This value should have been set as default in the ToBlock method. + if genesisBlock.Difficulty().Cmp(params.GenesisDifficulty) != 0 { + t.Errorf("assumption wrong: want: %d, got: %v", params.GenesisDifficulty, genesisBlock.Difficulty()) + } + + // Expect the stored total difficulty to be the difficulty of the genesis block. + stored := rawdb.ReadTd(db, genesisBlock.Hash(), genesisBlock.NumberU64()) + + if stored.Cmp(genesisBlock.Difficulty()) != 0 { + t.Errorf("inequal difficulty; stored: %v, genesisBlock: %v", stored, genesisBlock.Difficulty()) + } +} diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index 2c285c60e7..9dcdd43430 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -83,8 +83,8 @@ type NumberHash struct { Hash common.Hash } -// ReadAllHashes retrieves all the hashes assigned to blocks at a certain heights, -// both canonical and reorged forks included. +// ReadAllHashesInRange retrieves all the hashes assigned to blocks at certain +// heights, both canonical and reorged forks included. // This method considers both limits to be _inclusive_. func ReadAllHashesInRange(db ethdb.Iteratee, first, last uint64) []*NumberHash { var ( diff --git a/core/rawdb/accessors_metadata.go b/core/rawdb/accessors_metadata.go index 3b0fcf0f2d..f5a161adb6 100644 --- a/core/rawdb/accessors_metadata.go +++ b/core/rawdb/accessors_metadata.go @@ -81,6 +81,19 @@ func WriteChainConfig(db ethdb.KeyValueWriter, hash common.Hash, cfg *params.Cha } } +// ReadGenesisState retrieves the genesis state based on the given genesis hash. +func ReadGenesisState(db ethdb.KeyValueReader, hash common.Hash) []byte { + data, _ := db.Get(genesisKey(hash)) + return data +} + +// WriteGenesisState writes the genesis state into the disk. +func WriteGenesisState(db ethdb.KeyValueWriter, hash common.Hash, data []byte) { + if err := db.Put(genesisKey(hash), data); err != nil { + log.Crit("Failed to store genesis state", "err", err) + } +} + // crashList is a list of unclean-shutdown-markers, for rlp-encoding to the // database type crashList struct { diff --git a/core/rawdb/accessors_snapshot.go b/core/rawdb/accessors_snapshot.go index 1c828662c1..3c82b3f731 100644 --- a/core/rawdb/accessors_snapshot.go +++ b/core/rawdb/accessors_snapshot.go @@ -115,7 +115,7 @@ func DeleteStorageSnapshot(db ethdb.KeyValueWriter, accountHash, storageHash com // IterateStorageSnapshots returns an iterator for walking the entire storage // space of a specific account. func IterateStorageSnapshots(db ethdb.Iteratee, accountHash common.Hash) ethdb.Iterator { - return db.NewIterator(storageSnapshotsKey(accountHash), nil) + return NewKeyLengthIterator(db.NewIterator(storageSnapshotsKey(accountHash), nil), len(SnapshotStoragePrefix)+2*common.HashLength) } // ReadSnapshotJournal retrieves the serialized in-memory diff layers saved at diff --git a/core/rawdb/accessors_state.go b/core/rawdb/accessors_state.go index 6112de03ad..41e21b6ca4 100644 --- a/core/rawdb/accessors_state.go +++ b/core/rawdb/accessors_state.go @@ -28,29 +28,16 @@ func ReadPreimage(db ethdb.KeyValueReader, hash common.Hash) []byte { return data } -// WritePreimages writes the provided set of preimages to the database. -func WritePreimages(db ethdb.KeyValueWriter, preimages map[common.Hash][]byte) { - for hash, preimage := range preimages { - if err := db.Put(preimageKey(hash), preimage); err != nil { - log.Crit("Failed to store trie preimage", "err", err) - } - } - preimageCounter.Inc(int64(len(preimages))) - preimageHitCounter.Inc(int64(len(preimages))) -} - // ReadCode retrieves the contract code of the provided code hash. func ReadCode(db ethdb.KeyValueReader, hash common.Hash) []byte { - // Try with the legacy code scheme first, if not then try with current - // scheme. Since most of the code will be found with legacy scheme. - // - // todo(rjl493456442) change the order when we forcibly upgrade the code - // scheme with snapshot. - data, _ := db.Get(hash[:]) + // Try with the prefixed code scheme first, if not then try with legacy + // scheme. + data := ReadCodeWithPrefix(db, hash) if len(data) != 0 { return data } - return ReadCodeWithPrefix(db, hash) + data, _ = db.Get(hash.Bytes()) + return data } // ReadCodeWithPrefix retrieves the contract code of the provided code hash. @@ -61,24 +48,54 @@ func ReadCodeWithPrefix(db ethdb.KeyValueReader, hash common.Hash) []byte { return data } -// WriteCode writes the provided contract code database. -func WriteCode(db ethdb.KeyValueWriter, hash common.Hash, code []byte) { - if err := db.Put(codeKey(hash), code); err != nil { - log.Crit("Failed to store contract code", "err", err) +// ReadTrieNode retrieves the trie node of the provided hash. +func ReadTrieNode(db ethdb.KeyValueReader, hash common.Hash) []byte { + data, _ := db.Get(hash.Bytes()) + return data +} + +// HasCode checks if the contract code corresponding to the +// provided code hash is present in the db. +func HasCode(db ethdb.KeyValueReader, hash common.Hash) bool { + // Try with the prefixed code scheme first, if not then try with legacy + // scheme. + if ok := HasCodeWithPrefix(db, hash); ok { + return true } + ok, _ := db.Has(hash.Bytes()) + return ok } -// DeleteCode deletes the specified contract code from the database. -func DeleteCode(db ethdb.KeyValueWriter, hash common.Hash) { - if err := db.Delete(codeKey(hash)); err != nil { - log.Crit("Failed to delete contract code", "err", err) +// HasCodeWithPrefix checks if the contract code corresponding to the +// provided code hash is present in the db. This function will only check +// presence using the prefix-scheme. +func HasCodeWithPrefix(db ethdb.KeyValueReader, hash common.Hash) bool { + ok, _ := db.Has(codeKey(hash)) + return ok +} + +// HasTrieNode checks if the trie node with the provided hash is present in db. +func HasTrieNode(db ethdb.KeyValueReader, hash common.Hash) bool { + ok, _ := db.Has(hash.Bytes()) + return ok +} + +// WritePreimages writes the provided set of preimages to the database. +func WritePreimages(db ethdb.KeyValueWriter, preimages map[common.Hash][]byte) { + for hash, preimage := range preimages { + if err := db.Put(preimageKey(hash), preimage); err != nil { + log.Crit("Failed to store trie preimage", "err", err) + } } + preimageCounter.Inc(int64(len(preimages))) + preimageHitCounter.Inc(int64(len(preimages))) } -// ReadTrieNode retrieves the trie node of the provided hash. -func ReadTrieNode(db ethdb.KeyValueReader, hash common.Hash) []byte { - data, _ := db.Get(hash.Bytes()) - return data +// WriteCode writes the provided contract code database. +func WriteCode(db ethdb.KeyValueWriter, hash common.Hash, code []byte) { + if err := db.Put(codeKey(hash), code); err != nil { + log.Crit("Failed to store contract code", "err", err) + } } // WriteTrieNode writes the provided trie node database. @@ -88,6 +105,13 @@ func WriteTrieNode(db ethdb.KeyValueWriter, hash common.Hash, node []byte) { } } +// DeleteCode deletes the specified contract code from the database. +func DeleteCode(db ethdb.KeyValueWriter, hash common.Hash) { + if err := db.Delete(codeKey(hash)); err != nil { + log.Crit("Failed to delete contract code", "err", err) + } +} + // DeleteTrieNode deletes the specified trie node from the database. func DeleteTrieNode(db ethdb.KeyValueWriter, hash common.Hash) { if err := db.Delete(hash.Bytes()); err != nil { diff --git a/core/rawdb/accessors_sync.go b/core/rawdb/accessors_sync.go new file mode 100644 index 0000000000..50dfb848e4 --- /dev/null +++ b/core/rawdb/accessors_sync.go @@ -0,0 +1,80 @@ +// Copyright 2021 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 . + +package rawdb + +import ( + "bytes" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" +) + +// ReadSkeletonSyncStatus retrieves the serialized sync status saved at shutdown. +func ReadSkeletonSyncStatus(db ethdb.KeyValueReader) []byte { + data, _ := db.Get(skeletonSyncStatusKey) + return data +} + +// WriteSkeletonSyncStatus stores the serialized sync status to save at shutdown. +func WriteSkeletonSyncStatus(db ethdb.KeyValueWriter, status []byte) { + if err := db.Put(skeletonSyncStatusKey, status); err != nil { + log.Crit("Failed to store skeleton sync status", "err", err) + } +} + +// DeleteSkeletonSyncStatus deletes the serialized sync status saved at the last +// shutdown +func DeleteSkeletonSyncStatus(db ethdb.KeyValueWriter) { + if err := db.Delete(skeletonSyncStatusKey); err != nil { + log.Crit("Failed to remove skeleton sync status", "err", err) + } +} + +// ReadSkeletonHeader retrieves a block header from the skeleton sync store, +func ReadSkeletonHeader(db ethdb.KeyValueReader, number uint64) *types.Header { + data, _ := db.Get(skeletonHeaderKey(number)) + if len(data) == 0 { + return nil + } + header := new(types.Header) + if err := rlp.Decode(bytes.NewReader(data), header); err != nil { + log.Error("Invalid skeleton header RLP", "number", number, "err", err) + return nil + } + return header +} + +// WriteSkeletonHeader stores a block header into the skeleton sync store. +func WriteSkeletonHeader(db ethdb.KeyValueWriter, header *types.Header) { + data, err := rlp.EncodeToBytes(header) + if err != nil { + log.Crit("Failed to RLP encode header", "err", err) + } + key := skeletonHeaderKey(header.Number.Uint64()) + if err := db.Put(key, data); err != nil { + log.Crit("Failed to store skeleton header", "err", err) + } +} + +// DeleteSkeletonHeader removes all block header data associated with a hash. +func DeleteSkeletonHeader(db ethdb.KeyValueWriter, number uint64) { + if err := db.Delete(skeletonHeaderKey(number)); err != nil { + log.Crit("Failed to delete skeleton header", "err", err) + } +} diff --git a/core/rawdb/database.go b/core/rawdb/database.go index 5ef64d26a2..5d645b61db 100644 --- a/core/rawdb/database.go +++ b/core/rawdb/database.go @@ -99,6 +99,11 @@ func (db *nofreezedb) Ancients() (uint64, error) { return 0, errNotSupported } +// Tail returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) Tail() (uint64, error) { + return 0, errNotSupported +} + // AncientSize returns an error as we don't have a backing chain freezer. func (db *nofreezedb) AncientSize(kind string) (uint64, error) { return 0, errNotSupported @@ -109,8 +114,13 @@ func (db *nofreezedb) ModifyAncients(func(ethdb.AncientWriteOp) error) (int64, e return 0, errNotSupported } -// TruncateAncients returns an error as we don't have a backing chain freezer. -func (db *nofreezedb) TruncateAncients(items uint64) error { +// TruncateHead returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) TruncateHead(items uint64) error { + return errNotSupported +} + +// TruncateTail returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) TruncateTail(items uint64) error { return errNotSupported } @@ -135,6 +145,12 @@ func (db *nofreezedb) ReadAncients(fn func(reader ethdb.AncientReader) error) (e return fn(db) } +// MigrateTable processes the entries in a given table in sequence +// converting them to a new format if they're of an old format. +func (db *nofreezedb) MigrateTable(kind string, convert convertLegacyFn) error { + return errNotSupported +} + // NewDatabase creates a high level database on top of a given key-value data // store without a freezer moving immutable chain segments into cold storage. func NewDatabase(db ethdb.KeyValueStore) ethdb.Database { @@ -211,7 +227,7 @@ func NewDatabaseWithFreezer(db ethdb.KeyValueStore, freezer string, namespace st // Block #1 is still in the database, we're allowed to init a new feezer } // Otherwise, the head header is still the genesis, we're allowed to init a new - // feezer. + // freezer. } } // Freezer is consistent with the key-value database, permit combining the two @@ -321,6 +337,7 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte) error { storageSnaps stat preimages stat bloomBits stat + beaconHeaders stat cliqueSnaps stat // Ancient store statistics @@ -375,10 +392,14 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte) error { preimages.Add(size) case bytes.HasPrefix(key, configPrefix) && len(key) == (len(configPrefix)+common.HashLength): metadata.Add(size) + case bytes.HasPrefix(key, genesisPrefix) && len(key) == (len(genesisPrefix)+common.HashLength): + metadata.Add(size) case bytes.HasPrefix(key, bloomBitsPrefix) && len(key) == (len(bloomBitsPrefix)+10+common.HashLength): bloomBits.Add(size) case bytes.HasPrefix(key, BloomBitsIndexPrefix): bloomBits.Add(size) + case bytes.HasPrefix(key, skeletonHeaderPrefix) && len(key) == (len(skeletonHeaderPrefix)+8): + beaconHeaders.Add(size) case bytes.HasPrefix(key, []byte("clique-")) && len(key) == 7+common.HashLength: cliqueSnaps.Add(size) case bytes.HasPrefix(key, []byte("cht-")) || @@ -395,7 +416,7 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte) error { databaseVersionKey, headHeaderKey, headBlockKey, headFastBlockKey, lastPivotKey, fastTrieProgressKey, snapshotDisabledKey, SnapshotRootKey, snapshotJournalKey, snapshotGeneratorKey, snapshotRecoveryKey, txIndexTailKey, fastTxLookupLimitKey, - uncleanShutdownKey, badBlockKey, transitionStatusKey, + uncleanShutdownKey, badBlockKey, transitionStatusKey, skeletonSyncStatusKey, } { if bytes.Equal(key, meta) { metadata.Add(size) @@ -441,6 +462,7 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte) error { {"Key-Value store", "Trie preimages", preimages.Size(), preimages.Count()}, {"Key-Value store", "Account snapshot", accountSnaps.Size(), accountSnaps.Count()}, {"Key-Value store", "Storage snapshot", storageSnaps.Size(), storageSnaps.Count()}, + {"Key-Value store", "Beacon sync headers", beaconHeaders.Size(), beaconHeaders.Count()}, {"Key-Value store", "Clique snapshots", cliqueSnaps.Size(), cliqueSnaps.Count()}, {"Key-Value store", "Singleton metadata", metadata.Size(), metadata.Count()}, {"Ancient store", "Headers", ancientHeadersSize.String(), ancients.String()}, diff --git a/core/rawdb/freezer.go b/core/rawdb/freezer.go index 9eb3bfeea5..b0cfeb679f 100644 --- a/core/rawdb/freezer.go +++ b/core/rawdb/freezer.go @@ -19,6 +19,7 @@ package rawdb import ( "errors" "fmt" + "io/ioutil" "math" "os" "path/filepath" @@ -66,7 +67,7 @@ const ( freezerTableSize = 2 * 1000 * 1000 * 1000 ) -// freezer is an memory mapped append-only database to store immutable chain data +// freezer is a memory mapped append-only database to store immutable chain data // into flat files: // // - The append only nature ensures that disk writes are minimized. @@ -78,6 +79,7 @@ type freezer struct { // 64-bit aligned fields can be atomic. The struct is guaranteed to be so aligned, // so take advantage of that (https://golang.org/pkg/sync/atomic/#pkg-note-BUG). frozen uint64 // Number of blocks already frozen + tail uint64 // Number of the first stored item in the freezer threshold uint64 // Number of recent blocks not to freeze (params.FullImmutabilityThreshold apart from tests) // This lock synchronizes writers and the truncate operation, as well as @@ -133,7 +135,7 @@ func newFreezer(datadir string, namespace string, readonly bool, maxTableSize ui // Create the tables. for name, disableSnappy := range tables { - table, err := newTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy) + table, err := newTable(datadir, name, readMeter, writeMeter, sizeGauge, maxTableSize, disableSnappy, readonly) if err != nil { for _, table := range freezer.tables { table.Close() @@ -157,9 +159,15 @@ func newFreezer(datadir string, namespace string, readonly bool, maxTableSize ui return nil, err } } - - // Truncate all tables to common length. - if err := freezer.repair(); err != nil { + if freezer.readonly { + // In readonly mode only validate, don't truncate. + // validate also sets `freezer.frozen`. + err = freezer.validate() + } else { + // Truncate all tables to common length. + err = freezer.repair() + } + if err != nil { for _, table := range freezer.tables { table.Close() } @@ -233,6 +241,11 @@ func (f *freezer) Ancients() (uint64, error) { return atomic.LoadUint64(&f.frozen), nil } +// Tail returns the number of first stored item in the freezer. +func (f *freezer) Tail() (uint64, error) { + return atomic.LoadUint64(&f.tail), nil +} + // AncientSize returns the ancient size of the specified category. func (f *freezer) AncientSize(kind string) (uint64, error) { // This needs the write lock to avoid data races on table fields. @@ -268,7 +281,7 @@ func (f *freezer) ModifyAncients(fn func(ethdb.AncientWriteOp) error) (writeSize if err != nil { // The write operation has failed. Go back to the previous item position. for name, table := range f.tables { - err := table.truncate(prevItem) + err := table.truncateHead(prevItem) if err != nil { log.Error("Freezer table roll-back failed", "table", name, "index", prevItem, "err", err) } @@ -288,8 +301,8 @@ func (f *freezer) ModifyAncients(fn func(ethdb.AncientWriteOp) error) (writeSize return writeSize, nil } -// TruncateAncients discards any recent data above the provided threshold number. -func (f *freezer) TruncateAncients(items uint64) error { +// TruncateHead discards any recent data above the provided threshold number. +func (f *freezer) TruncateHead(items uint64) error { if f.readonly { return errReadOnly } @@ -300,7 +313,7 @@ func (f *freezer) TruncateAncients(items uint64) error { return nil } for _, table := range f.tables { - if err := table.truncate(items); err != nil { + if err := table.truncateHead(items); err != nil { return err } } @@ -308,6 +321,26 @@ func (f *freezer) TruncateAncients(items uint64) error { return nil } +// TruncateTail discards any recent data below the provided threshold number. +func (f *freezer) TruncateTail(tail uint64) error { + if f.readonly { + return errReadOnly + } + f.writeLock.Lock() + defer f.writeLock.Unlock() + + if atomic.LoadUint64(&f.tail) >= tail { + return nil + } + for _, table := range f.tables { + if err := table.truncateTail(tail); err != nil { + return err + } + } + atomic.StoreUint64(&f.tail, tail) + return nil +} + // Sync flushes all data tables to disk. func (f *freezer) Sync() error { var errs []error @@ -322,21 +355,59 @@ func (f *freezer) Sync() error { return nil } +// validate checks that every table has the same length. +// Used instead of `repair` in readonly mode. +func (f *freezer) validate() error { + if len(f.tables) == 0 { + return nil + } + var ( + length uint64 + name string + ) + // Hack to get length of any table + for kind, table := range f.tables { + length = atomic.LoadUint64(&table.items) + name = kind + break + } + // Now check every table against that length + for kind, table := range f.tables { + items := atomic.LoadUint64(&table.items) + if length != items { + return fmt.Errorf("freezer tables %s and %s have differing lengths: %d != %d", kind, name, items, length) + } + } + atomic.StoreUint64(&f.frozen, length) + return nil +} + // repair truncates all data tables to the same length. func (f *freezer) repair() error { - min := uint64(math.MaxUint64) + var ( + head = uint64(math.MaxUint64) + tail = uint64(0) + ) for _, table := range f.tables { items := atomic.LoadUint64(&table.items) - if min > items { - min = items + if head > items { + head = items + } + hidden := atomic.LoadUint64(&table.itemHidden) + if hidden > tail { + tail = hidden } } for _, table := range f.tables { - if err := table.truncate(min); err != nil { + if err := table.truncateHead(head); err != nil { + return err + } + if err := table.truncateTail(tail); err != nil { return err } } - atomic.StoreUint64(&f.frozen, min) + atomic.StoreUint64(&f.frozen, head) + atomic.StoreUint64(&f.tail, tail) return nil } @@ -566,3 +637,116 @@ func (f *freezer) freezeRange(nfdb *nofreezedb, number, limit uint64) (hashes [] return hashes, err } + +// convertLegacyFn takes a raw freezer entry in an older format and +// returns it in the new format. +type convertLegacyFn = func([]byte) ([]byte, error) + +// MigrateTable processes the entries in a given table in sequence +// converting them to a new format if they're of an old format. +func (f *freezer) MigrateTable(kind string, convert convertLegacyFn) error { + if f.readonly { + return errReadOnly + } + f.writeLock.Lock() + defer f.writeLock.Unlock() + + table, ok := f.tables[kind] + if !ok { + return errUnknownTable + } + // forEach iterates every entry in the table serially and in order, calling `fn` + // with the item as argument. If `fn` returns an error the iteration stops + // and that error will be returned. + forEach := func(t *freezerTable, offset uint64, fn func(uint64, []byte) error) error { + var ( + items = atomic.LoadUint64(&t.items) + batchSize = uint64(1024) + maxBytes = uint64(1024 * 1024) + ) + for i := offset; i < items; { + if i+batchSize > items { + batchSize = items - i + } + data, err := t.RetrieveItems(i, batchSize, maxBytes) + if err != nil { + return err + } + for j, item := range data { + if err := fn(i+uint64(j), item); err != nil { + return err + } + } + i += uint64(len(data)) + } + return nil + } + // TODO(s1na): This is a sanity-check since as of now no process does tail-deletion. But the migration + // process assumes no deletion at tail and needs to be modified to account for that. + if table.itemOffset > 0 || table.itemHidden > 0 { + return fmt.Errorf("migration not supported for tail-deleted freezers") + } + ancientsPath := filepath.Dir(table.index.Name()) + // Set up new dir for the migrated table, the content of which + // we'll at the end move over to the ancients dir. + migrationPath := filepath.Join(ancientsPath, "migration") + newTable, err := NewFreezerTable(migrationPath, kind, FreezerNoSnappy[kind], false) + if err != nil { + return err + } + var ( + batch = newTable.newBatch() + out []byte + start = time.Now() + logged = time.Now() + offset = newTable.items + ) + if offset > 0 { + log.Info("found previous migration attempt", "migrated", offset) + } + // Iterate through entries and transform them + if err := forEach(table, offset, func(i uint64, blob []byte) error { + if i%10000 == 0 && time.Since(logged) > 16*time.Second { + log.Info("Processing legacy elements", "count", i, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + out, err = convert(blob) + if err != nil { + return err + } + if err := batch.AppendRaw(i, out); err != nil { + return err + } + return nil + }); err != nil { + return err + } + if err := batch.commit(); err != nil { + return err + } + log.Info("Replacing old table files with migrated ones", "elapsed", common.PrettyDuration(time.Since(start))) + // Release and delete old table files. Note this won't + // delete the index file. + table.releaseFilesAfter(0, true) + + if err := newTable.Close(); err != nil { + return err + } + files, err := ioutil.ReadDir(migrationPath) + if err != nil { + return err + } + // Move migrated files to ancients dir. + for _, f := range files { + // This will replace the old index file as a side-effect. + if err := os.Rename(filepath.Join(migrationPath, f.Name()), filepath.Join(ancientsPath, f.Name())); err != nil { + return err + } + } + // Delete by now empty dir. + if err := os.Remove(migrationPath); err != nil { + return err + } + + return nil +} diff --git a/core/rawdb/freezer_batch.go b/core/rawdb/freezer_batch.go index 762fa8f25f..864a7f5e98 100644 --- a/core/rawdb/freezer_batch.go +++ b/core/rawdb/freezer_batch.go @@ -191,7 +191,7 @@ func (batch *freezerTableBatch) commit() error { dataSize := int64(len(batch.dataBuffer)) batch.dataBuffer = batch.dataBuffer[:0] - // Write index. + // Write indices. _, err = batch.t.index.Write(batch.indexBuffer) if err != nil { return err diff --git a/core/rawdb/freezer_meta.go b/core/rawdb/freezer_meta.go new file mode 100644 index 0000000000..d0bd2f9544 --- /dev/null +++ b/core/rawdb/freezer_meta.go @@ -0,0 +1,109 @@ +// Copyright 2022 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 + +package rawdb + +import ( + "io" + "os" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" +) + +const freezerVersion = 1 // The initial version tag of freezer table metadata + +// freezerTableMeta wraps all the metadata of the freezer table. +type freezerTableMeta struct { + // Version is the versioning descriptor of the freezer table. + Version uint16 + + // VirtualTail indicates how many items have been marked as deleted. + // Its value is equal to the number of items removed from the table + // plus the number of items hidden in the table, so it should never + // be lower than the "actual tail". + VirtualTail uint64 +} + +// newMetadata initializes the metadata object with the given virtual tail. +func newMetadata(tail uint64) *freezerTableMeta { + return &freezerTableMeta{ + Version: freezerVersion, + VirtualTail: tail, + } +} + +// readMetadata reads the metadata of the freezer table from the +// given metadata file. +func readMetadata(file *os.File) (*freezerTableMeta, error) { + _, err := file.Seek(0, io.SeekStart) + if err != nil { + return nil, err + } + var meta freezerTableMeta + if err := rlp.Decode(file, &meta); err != nil { + return nil, err + } + return &meta, nil +} + +// writeMetadata writes the metadata of the freezer table into the +// given metadata file. +func writeMetadata(file *os.File, meta *freezerTableMeta) error { + _, err := file.Seek(0, io.SeekStart) + if err != nil { + return err + } + return rlp.Encode(file, meta) +} + +// loadMetadata loads the metadata from the given metadata file. +// Initializes the metadata file with the given "actual tail" if +// it's empty. +func loadMetadata(file *os.File, tail uint64) (*freezerTableMeta, error) { + stat, err := file.Stat() + if err != nil { + return nil, err + } + // Write the metadata with the given actual tail into metadata file + // if it's non-existent. There are two possible scenarios here: + // - the freezer table is empty + // - the freezer table is legacy + // In both cases, write the meta into the file with the actual tail + // as the virtual tail. + if stat.Size() == 0 { + m := newMetadata(tail) + if err := writeMetadata(file, m); err != nil { + return nil, err + } + return m, nil + } + m, err := readMetadata(file) + if err != nil { + return nil, err + } + // Update the virtual tail with the given actual tail if it's even + // lower than it. Theoretically it shouldn't happen at all, print + // a warning here. + if m.VirtualTail < tail { + log.Warn("Updated virtual tail", "have", m.VirtualTail, "now", tail) + m.VirtualTail = tail + if err := writeMetadata(file, m); err != nil { + return nil, err + } + } + return m, nil +} diff --git a/core/rawdb/freezer_meta_test.go b/core/rawdb/freezer_meta_test.go new file mode 100644 index 0000000000..191744a754 --- /dev/null +++ b/core/rawdb/freezer_meta_test.go @@ -0,0 +1,61 @@ +// Copyright 2022 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 + +package rawdb + +import ( + "io/ioutil" + "os" + "testing" +) + +func TestReadWriteFreezerTableMeta(t *testing.T) { + f, err := ioutil.TempFile(os.TempDir(), "*") + if err != nil { + t.Fatalf("Failed to create file %v", err) + } + err = writeMetadata(f, newMetadata(100)) + if err != nil { + t.Fatalf("Failed to write metadata %v", err) + } + meta, err := readMetadata(f) + if err != nil { + t.Fatalf("Failed to read metadata %v", err) + } + if meta.Version != freezerVersion { + t.Fatalf("Unexpected version field") + } + if meta.VirtualTail != uint64(100) { + t.Fatalf("Unexpected virtual tail field") + } +} + +func TestInitializeFreezerTableMeta(t *testing.T) { + f, err := ioutil.TempFile(os.TempDir(), "*") + if err != nil { + t.Fatalf("Failed to create file %v", err) + } + meta, err := loadMetadata(f, uint64(100)) + if err != nil { + t.Fatalf("Failed to read metadata %v", err) + } + if meta.Version != freezerVersion { + t.Fatalf("Unexpected version field") + } + if meta.VirtualTail != uint64(100) { + t.Fatalf("Unexpected virtual tail field") + } +} diff --git a/core/rawdb/freezer_table.go b/core/rawdb/freezer_table.go index 44aaadc2a9..a076ded067 100644 --- a/core/rawdb/freezer_table.go +++ b/core/rawdb/freezer_table.go @@ -47,20 +47,19 @@ var ( ) // indexEntry contains the number/id of the file that the data resides in, aswell as the -// offset within the file to the end of the data +// offset within the file to the end of the data. // In serialized form, the filenum is stored as uint16. type indexEntry struct { - filenum uint32 // stored as uint16 ( 2 bytes) - offset uint32 // stored as uint32 ( 4 bytes) + filenum uint32 // stored as uint16 ( 2 bytes ) + offset uint32 // stored as uint32 ( 4 bytes ) } const indexEntrySize = 6 // unmarshalBinary deserializes binary b into the rawIndex entry. -func (i *indexEntry) unmarshalBinary(b []byte) error { +func (i *indexEntry) unmarshalBinary(b []byte) { i.filenum = uint32(binary.BigEndian.Uint16(b[:2])) i.offset = binary.BigEndian.Uint32(b[2:6]) - return nil } // append adds the encoded entry to the end of b. @@ -75,14 +74,14 @@ func (i *indexEntry) append(b []byte) []byte { // bounds returns the start- and end- offsets, and the file number of where to // read there data item marked by the two index entries. The two entries are // assumed to be sequential. -func (start *indexEntry) bounds(end *indexEntry) (startOffset, endOffset, fileId uint32) { - if start.filenum != end.filenum { +func (i *indexEntry) bounds(end *indexEntry) (startOffset, endOffset, fileId uint32) { + if i.filenum != end.filenum { // If a piece of data 'crosses' a data-file, // it's actually in one piece on the second data-file. // We return a zero-indexEntry for the second file as start return 0, end.offset, end.filenum } - return start.offset, end.offset, end.filenum + return i.offset, end.offset, end.filenum } // freezerTable represents a single chained data table within the freezer (e.g. blocks). @@ -92,22 +91,28 @@ type freezerTable struct { // WARNING: The `items` field is accessed atomically. On 32 bit platforms, only // 64-bit aligned fields can be atomic. The struct is guaranteed to be so aligned, // so take advantage of that (https://golang.org/pkg/sync/atomic/#pkg-note-BUG). - items uint64 // Number of items stored in the table (including items removed from tail) - - noCompression bool // if true, disables snappy compression. Note: does not work retroactively + items uint64 // Number of items stored in the table (including items removed from tail) + itemOffset uint64 // Number of items removed from the table + + // itemHidden is the number of items marked as deleted. Tail deletion is + // only supported at file level which means the actual deletion will be + // delayed until the entire data file is marked as deleted. Before that + // these items will be hidden to prevent being visited again. The value + // should never be lower than itemOffset. + itemHidden uint64 + + noCompression bool // if true, disables snappy compression. Note: does not work retroactively + readonly bool maxFileSize uint32 // Max file size for data-files name string path string head *os.File // File descriptor for the data head of the table + index *os.File // File descriptor for the indexEntry file of the table + meta *os.File // File descriptor for metadata of the table files map[uint32]*os.File // open files headId uint32 // number of the currently active head file tailId uint32 // number of the earliest file - index *os.File // File descriptor for the indexEntry file of the table - - // In the case that old items are deleted (from the tail), we use itemOffset - // to count how many historic items have gone missing. - itemOffset uint32 // Offset (number of discarded items) headBytes int64 // Number of bytes written to the head file readMeter metrics.Meter // Meter for measuring the effective amount of data read @@ -119,71 +124,61 @@ type freezerTable struct { } // NewFreezerTable opens the given path as a freezer table. -func NewFreezerTable(path, name string, disableSnappy bool) (*freezerTable, error) { - return newTable(path, name, metrics.NilMeter{}, metrics.NilMeter{}, metrics.NilGauge{}, freezerTableSize, disableSnappy) -} - -// openFreezerFileForAppend opens a freezer table file and seeks to the end -func openFreezerFileForAppend(filename string) (*os.File, error) { - // Open the file without the O_APPEND flag - // because it has differing behaviour during Truncate operations - // on different OS's - file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0644) - if err != nil { - return nil, err - } - // Seek to end for append - if _, err = file.Seek(0, io.SeekEnd); err != nil { - return nil, err - } - return file, nil -} - -// openFreezerFileForReadOnly opens a freezer table file for read only access -func openFreezerFileForReadOnly(filename string) (*os.File, error) { - return os.OpenFile(filename, os.O_RDONLY, 0644) -} - -// openFreezerFileTruncated opens a freezer table making sure it is truncated -func openFreezerFileTruncated(filename string) (*os.File, error) { - return os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) -} - -// truncateFreezerFile resizes a freezer table file and seeks to the end -func truncateFreezerFile(file *os.File, size int64) error { - if err := file.Truncate(size); err != nil { - return err - } - // Seek to end for append - if _, err := file.Seek(0, io.SeekEnd); err != nil { - return err - } - return nil +func NewFreezerTable(path, name string, disableSnappy, readonly bool) (*freezerTable, error) { + return newTable(path, name, metrics.NilMeter{}, metrics.NilMeter{}, metrics.NilGauge{}, freezerTableSize, disableSnappy, readonly) } // newTable opens a freezer table, creating the data and index files if they are -// non existent. Both files are truncated to the shortest common length to ensure +// non-existent. Both files are truncated to the shortest common length to ensure // they don't go out of sync. -func newTable(path string, name string, readMeter metrics.Meter, writeMeter metrics.Meter, sizeGauge metrics.Gauge, maxFilesize uint32, noCompression bool) (*freezerTable, error) { +func newTable(path string, name string, readMeter metrics.Meter, writeMeter metrics.Meter, sizeGauge metrics.Gauge, maxFilesize uint32, noCompression, readonly bool) (*freezerTable, error) { // Ensure the containing directory exists and open the indexEntry file if err := os.MkdirAll(path, 0755); err != nil { return nil, err } var idxName string if noCompression { - // Raw idx - idxName = fmt.Sprintf("%s.ridx", name) + idxName = fmt.Sprintf("%s.ridx", name) // raw index file } else { - // Compressed idx - idxName = fmt.Sprintf("%s.cidx", name) + idxName = fmt.Sprintf("%s.cidx", name) // compressed index file } - offsets, err := openFreezerFileForAppend(filepath.Join(path, idxName)) - if err != nil { - return nil, err + var ( + err error + index *os.File + meta *os.File + ) + if readonly { + // Will fail if table doesn't exist + index, err = openFreezerFileForReadOnly(filepath.Join(path, idxName)) + if err != nil { + return nil, err + } + // TODO(rjl493456442) change it to read-only mode. Open the metadata file + // in rw mode. It's a temporary solution for now and should be changed + // whenever the tail deletion is actually used. The reason for this hack is + // the additional meta file for each freezer table is added in order to support + // tail deletion, but for most legacy nodes this file is missing. This check + // will suddenly break lots of database relevant commands. So the metadata file + // is always opened for mutation and nothing else will be written except + // the initialization. + meta, err = openFreezerFileForAppend(filepath.Join(path, fmt.Sprintf("%s.meta", name))) + if err != nil { + return nil, err + } + } else { + index, err = openFreezerFileForAppend(filepath.Join(path, idxName)) + if err != nil { + return nil, err + } + meta, err = openFreezerFileForAppend(filepath.Join(path, fmt.Sprintf("%s.meta", name))) + if err != nil { + return nil, err + } } // Create the table and repair any past inconsistency tab := &freezerTable{ - index: offsets, + index: index, + meta: meta, files: make(map[uint32]*os.File), readMeter: readMeter, writeMeter: writeMeter, @@ -192,6 +187,7 @@ func newTable(path string, name string, readMeter metrics.Meter, writeMeter metr path: path, logger: log.New("database", path, "table", name), noCompression: noCompression, + readonly: readonly, maxFileSize: maxFilesize, } if err := tab.repair(); err != nil { @@ -209,7 +205,7 @@ func newTable(path string, name string, readMeter metrics.Meter, writeMeter metr return tab, nil } -// repair cross checks the head and the index file and truncates them to +// repair cross-checks the head and the index file and truncates them to // be in sync with each other after a potential crash / data loss. func (t *freezerTable) repair() error { // Create a temporary offset buffer to init files with and read indexEntry into @@ -247,12 +243,32 @@ func (t *freezerTable) repair() error { t.index.ReadAt(buffer, 0) firstIndex.unmarshalBinary(buffer) + // Assign the tail fields with the first stored index. + // The total removed items is represented with an uint32, + // which is not enough in theory but enough in practice. + // TODO: use uint64 to represent total removed items. t.tailId = firstIndex.filenum - t.itemOffset = firstIndex.offset + t.itemOffset = uint64(firstIndex.offset) - t.index.ReadAt(buffer, offsetsSize-indexEntrySize) - lastIndex.unmarshalBinary(buffer) - t.head, err = t.openFile(lastIndex.filenum, openFreezerFileForAppend) + // Load metadata from the file + meta, err := loadMetadata(t.meta, t.itemOffset) + if err != nil { + return err + } + t.itemHidden = meta.VirtualTail + + // Read the last index, use the default value in case the freezer is empty + if offsetsSize == indexEntrySize { + lastIndex = indexEntry{filenum: t.tailId, offset: 0} + } else { + t.index.ReadAt(buffer, offsetsSize-indexEntrySize) + lastIndex.unmarshalBinary(buffer) + } + if t.readonly { + t.head, err = t.openFile(lastIndex.filenum, openFreezerFileForReadOnly) + } else { + t.head, err = t.openFile(lastIndex.filenum, openFreezerFileForAppend) + } if err != nil { return err } @@ -263,7 +279,6 @@ func (t *freezerTable) repair() error { // Keep truncating both files until they come in sync contentExp = int64(lastIndex.offset) - for contentExp != contentSize { // Truncate the head file to the last offset pointer if contentExp < contentSize { @@ -280,9 +295,16 @@ func (t *freezerTable) repair() error { return err } offsetsSize -= indexEntrySize - t.index.ReadAt(buffer, offsetsSize-indexEntrySize) + + // Read the new head index, use the default value in case + // the freezer is already empty. var newLastIndex indexEntry - newLastIndex.unmarshalBinary(buffer) + if offsetsSize == indexEntrySize { + newLastIndex = indexEntry{filenum: t.tailId, offset: 0} + } else { + t.index.ReadAt(buffer, offsetsSize-indexEntrySize) + newLastIndex.unmarshalBinary(buffer) + } // We might have slipped back into an earlier head-file here if newLastIndex.filenum != lastIndex.filenum { // Release earlier opened file @@ -301,18 +323,30 @@ func (t *freezerTable) repair() error { contentExp = int64(lastIndex.offset) } } - // Ensure all reparation changes have been written to disk - if err := t.index.Sync(); err != nil { - return err - } - if err := t.head.Sync(); err != nil { - return err + // Sync() fails for read-only files on windows. + if !t.readonly { + // Ensure all reparation changes have been written to disk + if err := t.index.Sync(); err != nil { + return err + } + if err := t.head.Sync(); err != nil { + return err + } + if err := t.meta.Sync(); err != nil { + return err + } } // Update the item and byte counters and return - t.items = uint64(t.itemOffset) + uint64(offsetsSize/indexEntrySize-1) // last indexEntry points to the end of the data file + t.items = t.itemOffset + uint64(offsetsSize/indexEntrySize-1) // last indexEntry points to the end of the data file t.headBytes = contentSize t.headId = lastIndex.filenum + // Delete the leftover files because of head deletion + t.releaseFilesAfter(t.headId, true) + + // Delete the leftover files because of tail deletion + t.releaseFilesBefore(t.tailId, true) + // Close opened files and preopen all files if err := t.preopen(); err != nil { return err @@ -328,27 +362,35 @@ func (t *freezerTable) repair() error { func (t *freezerTable) preopen() (err error) { // The repair might have already opened (some) files t.releaseFilesAfter(0, false) + // Open all except head in RDONLY for i := t.tailId; i < t.headId; i++ { if _, err = t.openFile(i, openFreezerFileForReadOnly); err != nil { return err } } - // Open head in read/write - t.head, err = t.openFile(t.headId, openFreezerFileForAppend) + if t.readonly { + t.head, err = t.openFile(t.headId, openFreezerFileForReadOnly) + } else { + // Open head in read/write + t.head, err = t.openFile(t.headId, openFreezerFileForAppend) + } return err } -// truncate discards any recent data above the provided threshold number. -func (t *freezerTable) truncate(items uint64) error { +// truncateHead discards any recent data above the provided threshold number. +func (t *freezerTable) truncateHead(items uint64) error { t.lock.Lock() defer t.lock.Unlock() - // If our item count is correct, don't do anything + // Ensure the given truncate target falls in the correct range existing := atomic.LoadUint64(&t.items) if existing <= items { return nil } + if items < atomic.LoadUint64(&t.itemHidden) { + return errors.New("truncation below tail") + } // We need to truncate, save the old size for metrics tracking oldSize, err := t.sizeNolock() if err != nil { @@ -360,17 +402,24 @@ func (t *freezerTable) truncate(items uint64) error { log = t.logger.Warn // Only loud warn if we delete multiple items } log("Truncating freezer table", "items", existing, "limit", items) - if err := truncateFreezerFile(t.index, int64(items+1)*indexEntrySize); err != nil { + + // Truncate the index file first, the tail position is also considered + // when calculating the new freezer table length. + length := items - atomic.LoadUint64(&t.itemOffset) + if err := truncateFreezerFile(t.index, int64(length+1)*indexEntrySize); err != nil { return err } // Calculate the new expected size of the data file and truncate it - buffer := make([]byte, indexEntrySize) - if _, err := t.index.ReadAt(buffer, int64(items*indexEntrySize)); err != nil { - return err - } var expected indexEntry - expected.unmarshalBinary(buffer) - + if length == 0 { + expected = indexEntry{filenum: t.tailId, offset: 0} + } else { + buffer := make([]byte, indexEntrySize) + if _, err := t.index.ReadAt(buffer, int64(length*indexEntrySize)); err != nil { + return err + } + expected.unmarshalBinary(buffer) + } // We might need to truncate back to older files if expected.filenum != t.headId { // If already open for reading, force-reopen for writing @@ -399,7 +448,110 @@ func (t *freezerTable) truncate(items uint64) error { return err } t.sizeGauge.Dec(int64(oldSize - newSize)) + return nil +} +// truncateTail discards any recent data before the provided threshold number. +func (t *freezerTable) truncateTail(items uint64) error { + t.lock.Lock() + defer t.lock.Unlock() + + // Ensure the given truncate target falls in the correct range + if atomic.LoadUint64(&t.itemHidden) >= items { + return nil + } + if atomic.LoadUint64(&t.items) < items { + return errors.New("truncation above head") + } + // Load the new tail index by the given new tail position + var ( + newTailId uint32 + buffer = make([]byte, indexEntrySize) + ) + if atomic.LoadUint64(&t.items) == items { + newTailId = t.headId + } else { + offset := items - atomic.LoadUint64(&t.itemOffset) + if _, err := t.index.ReadAt(buffer, int64((offset+1)*indexEntrySize)); err != nil { + return err + } + var newTail indexEntry + newTail.unmarshalBinary(buffer) + newTailId = newTail.filenum + } + // Update the virtual tail marker and hidden these entries in table. + atomic.StoreUint64(&t.itemHidden, items) + if err := writeMetadata(t.meta, newMetadata(items)); err != nil { + return err + } + // Hidden items still fall in the current tail file, no data file + // can be dropped. + if t.tailId == newTailId { + return nil + } + // Hidden items fall in the incorrect range, returns the error. + if t.tailId > newTailId { + return fmt.Errorf("invalid index, tail-file %d, item-file %d", t.tailId, newTailId) + } + // Hidden items exceed the current tail file, drop the relevant + // data files. We need to truncate, save the old size for metrics + // tracking. + oldSize, err := t.sizeNolock() + if err != nil { + return err + } + // Count how many items can be deleted from the file. + var ( + newDeleted = items + deleted = atomic.LoadUint64(&t.itemOffset) + ) + for current := items - 1; current >= deleted; current -= 1 { + if _, err := t.index.ReadAt(buffer, int64((current-deleted+1)*indexEntrySize)); err != nil { + return err + } + var pre indexEntry + pre.unmarshalBinary(buffer) + if pre.filenum != newTailId { + break + } + newDeleted = current + } + // Commit the changes of metadata file first before manipulating + // the indexes file. + if err := t.meta.Sync(); err != nil { + return err + } + // Truncate the deleted index entries from the index file. + err = copyFrom(t.index.Name(), t.index.Name(), indexEntrySize*(newDeleted-deleted+1), func(f *os.File) error { + tailIndex := indexEntry{ + filenum: newTailId, + offset: uint32(newDeleted), + } + _, err := f.Write(tailIndex.append(nil)) + return err + }) + if err != nil { + return err + } + // Reopen the modified index file to load the changes + if err := t.index.Close(); err != nil { + return err + } + t.index, err = openFreezerFileForAppend(t.index.Name()) + if err != nil { + return err + } + // Release any files before the current tail + t.tailId = newTailId + atomic.StoreUint64(&t.itemOffset, newDeleted) + t.releaseFilesBefore(t.tailId, true) + + // Retrieve the new size and update the total size counter + newSize, err := t.sizeNolock() + if err != nil { + return err + } + t.sizeGauge.Dec(int64(oldSize - newSize)) return nil } @@ -414,6 +566,11 @@ func (t *freezerTable) Close() error { } t.index = nil + if err := t.meta.Close(); err != nil { + errs = append(errs, err) + } + t.meta = nil + for _, f := range t.files { if err := f.Close(); err != nil { errs = append(errs, err) @@ -468,6 +625,19 @@ func (t *freezerTable) releaseFilesAfter(num uint32, remove bool) { } } +// releaseFilesBefore closes all open files with a lower number, and optionally also deletes the files +func (t *freezerTable) releaseFilesBefore(num uint32, remove bool) { + for fnum, f := range t.files { + if fnum < num { + delete(t.files, fnum) + f.Close() + if remove { + os.Remove(f.Name()) + } + } + } +} + // getIndices returns the index entries for the given from-item, covering 'count' items. // N.B: The actual number of returned indices for N items will always be N+1 (unless an // error is returned). @@ -476,7 +646,7 @@ func (t *freezerTable) releaseFilesAfter(num uint32, remove bool) { // it will return error. func (t *freezerTable) getIndices(from, count uint64) ([]*indexEntry, error) { // Apply the table-offset - from = from - uint64(t.itemOffset) + from = from - t.itemOffset // For reading N items, we need N+1 indices. buffer := make([]byte, (count+1)*indexEntrySize) if _, err := t.index.ReadAt(buffer, int64(from*indexEntrySize)); err != nil { @@ -561,18 +731,21 @@ func (t *freezerTable) retrieveItems(start, count, maxBytes uint64) ([]byte, []i t.lock.RLock() defer t.lock.RUnlock() - // Ensure the table and the item is accessible + // Ensure the table and the item are accessible if t.index == nil || t.head == nil { return nil, nil, errClosed } - itemCount := atomic.LoadUint64(&t.items) // max number + var ( + items = atomic.LoadUint64(&t.items) // the total items(head + 1) + hidden = atomic.LoadUint64(&t.itemHidden) // the number of hidden items + ) // Ensure the start is written, not deleted from the tail, and that the // caller actually wants something - if itemCount <= start || uint64(t.itemOffset) > start || count == 0 { + if items <= start || hidden > start || count == 0 { return nil, nil, errOutOfBounds } - if start+count > itemCount { - count = itemCount - start + if start+count > items { + count = items - start } var ( output = make([]byte, maxBytes) // Buffer to read data into @@ -648,10 +821,10 @@ func (t *freezerTable) retrieveItems(start, count, maxBytes uint64) ([]byte, []i return output[:outputSize], sizes, nil } -// has returns an indicator whether the specified number data -// exists in the freezer table. +// has returns an indicator whether the specified number data is still accessible +// in the freezer table. func (t *freezerTable) has(number uint64) bool { - return atomic.LoadUint64(&t.items) > number + return atomic.LoadUint64(&t.items) > number && atomic.LoadUint64(&t.itemHidden) <= number } // size returns the total data size in the freezer table. @@ -705,6 +878,9 @@ func (t *freezerTable) Sync() error { if err := t.index.Sync(); err != nil { return err } + if err := t.meta.Sync(); err != nil { + return err + } return t.head.Sync() } @@ -722,13 +898,20 @@ func (t *freezerTable) dumpIndexString(start, stop int64) string { } func (t *freezerTable) dumpIndex(w io.Writer, start, stop int64) { + meta, err := readMetadata(t.meta) + if err != nil { + fmt.Fprintf(w, "Failed to decode freezer table %v\n", err) + return + } + fmt.Fprintf(w, "Version %d deleted %d, hidden %d\n", meta.Version, atomic.LoadUint64(&t.itemOffset), atomic.LoadUint64(&t.itemHidden)) + buf := make([]byte, indexEntrySize) fmt.Fprintf(w, "| number | fileno | offset |\n") fmt.Fprintf(w, "|--------|--------|--------|\n") for i := uint64(start); ; i++ { - if _, err := t.index.ReadAt(buf, int64(i*indexEntrySize)); err != nil { + if _, err := t.index.ReadAt(buf, int64((i+1)*indexEntrySize)); err != nil { break } var entry indexEntry diff --git a/core/rawdb/freezer_table_test.go b/core/rawdb/freezer_table_test.go index 803809b520..0bddcf7211 100644 --- a/core/rawdb/freezer_table_test.go +++ b/core/rawdb/freezer_table_test.go @@ -18,13 +18,18 @@ package rawdb import ( "bytes" + "encoding/binary" "fmt" "math/rand" "os" "path/filepath" + "reflect" + "sync/atomic" "testing" + "testing/quick" "time" + "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/metrics" "github.com/stretchr/testify/require" ) @@ -40,7 +45,7 @@ func TestFreezerBasics(t *testing.T) { // set cutoff at 50 bytes f, err := newTable(os.TempDir(), fmt.Sprintf("unittest-%d", rand.Uint64()), - metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true) + metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, false) if err != nil { t.Fatal(err) } @@ -85,7 +90,7 @@ func TestFreezerBasicsClosing(t *testing.T) { f *freezerTable err error ) - f, err = newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err = newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -99,7 +104,7 @@ func TestFreezerBasicsClosing(t *testing.T) { require.NoError(t, batch.commit()) f.Close() - f, err = newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err = newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -116,7 +121,7 @@ func TestFreezerBasicsClosing(t *testing.T) { t.Fatalf("test %d, got \n%x != \n%x", y, got, exp) } f.Close() - f, err = newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err = newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -131,7 +136,7 @@ func TestFreezerRepairDanglingHead(t *testing.T) { // Fill table { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -160,7 +165,7 @@ func TestFreezerRepairDanglingHead(t *testing.T) { // Now open it again { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -183,7 +188,7 @@ func TestFreezerRepairDanglingHeadLarge(t *testing.T) { // Fill a table and close it { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -204,12 +209,12 @@ func TestFreezerRepairDanglingHeadLarge(t *testing.T) { } // Remove everything but the first item, and leave data unaligned // 0-indexEntry, 1-indexEntry, corrupt-indexEntry - idxFile.Truncate(indexEntrySize + indexEntrySize + indexEntrySize/2) + idxFile.Truncate(2*indexEntrySize + indexEntrySize/2) idxFile.Close() // Now open it again { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -232,7 +237,7 @@ func TestFreezerRepairDanglingHeadLarge(t *testing.T) { // And if we open it, we should now be able to read all of them (new values) { - f, _ := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, _ := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) for y := 1; y < 255; y++ { exp := getChunk(15, ^y) got, err := f.Retrieve(uint64(y)) @@ -254,7 +259,7 @@ func TestSnappyDetection(t *testing.T) { // Open with snappy { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -265,7 +270,7 @@ func TestSnappyDetection(t *testing.T) { // Open without snappy { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, false) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, false, false) if err != nil { t.Fatal(err) } @@ -277,7 +282,7 @@ func TestSnappyDetection(t *testing.T) { // Open with snappy { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -309,7 +314,7 @@ func TestFreezerRepairDanglingIndex(t *testing.T) { // Fill a table and close it { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -345,7 +350,7 @@ func TestFreezerRepairDanglingIndex(t *testing.T) { // 45, 45, 15 // with 3+3+1 items { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -366,7 +371,7 @@ func TestFreezerTruncate(t *testing.T) { // Fill table { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -382,12 +387,12 @@ func TestFreezerTruncate(t *testing.T) { // Reopen, truncate { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } defer f.Close() - f.truncate(10) // 150 bytes + f.truncateHead(10) // 150 bytes if f.items != 10 { t.Fatalf("expected %d items, got %d", 10, f.items) } @@ -407,7 +412,7 @@ func TestFreezerRepairFirstFile(t *testing.T) { // Fill table { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -440,7 +445,7 @@ func TestFreezerRepairFirstFile(t *testing.T) { // Reopen { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -475,7 +480,7 @@ func TestFreezerReadAndTruncate(t *testing.T) { // Fill table { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -491,7 +496,7 @@ func TestFreezerReadAndTruncate(t *testing.T) { // Reopen and read all files { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -504,7 +509,7 @@ func TestFreezerReadAndTruncate(t *testing.T) { } // Now, truncate back to zero - f.truncate(0) + f.truncateHead(0) // Write the data again batch := f.newBatch() @@ -523,7 +528,7 @@ func TestFreezerOffset(t *testing.T) { // Fill table { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) if err != nil { t.Fatal(err) } @@ -565,18 +570,19 @@ func TestFreezerOffset(t *testing.T) { // Update the index file, so that we store // [ file = 2, offset = 4 ] at index zero - tailId := uint32(2) // First file is 2 - itemOffset := uint32(4) // We have removed four items zeroIndex := indexEntry{ - filenum: tailId, - offset: itemOffset, + filenum: uint32(2), // First file is 2 + offset: uint32(4), // We have removed four items } buf := zeroIndex.append(nil) + // Overwrite index zero copy(indexBuf, buf) + // Remove the four next indices by overwriting copy(indexBuf[indexEntrySize:], indexBuf[indexEntrySize*5:]) indexFile.WriteAt(indexBuf, 0) + // Need to truncate the moved index items indexFile.Truncate(indexEntrySize * (1 + 2)) indexFile.Close() @@ -584,7 +590,7 @@ func TestFreezerOffset(t *testing.T) { // Now open again { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) if err != nil { t.Fatal(err) } @@ -623,13 +629,12 @@ func TestFreezerOffset(t *testing.T) { // Update the index file, so that we store // [ file = 2, offset = 1M ] at index zero - tailId := uint32(2) // First file is 2 - itemOffset := uint32(1000000) // We have removed 1M items zeroIndex := indexEntry{ - offset: itemOffset, - filenum: tailId, + offset: uint32(1000000), // We have removed 1M items + filenum: uint32(2), // First file is 2 } buf := zeroIndex.append(nil) + // Overwrite index zero copy(indexBuf, buf) indexFile.WriteAt(indexBuf, 0) @@ -638,7 +643,7 @@ func TestFreezerOffset(t *testing.T) { // Check that existing items have been moved to index 1M. { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) if err != nil { t.Fatal(err) } @@ -659,6 +664,171 @@ func TestFreezerOffset(t *testing.T) { } } +func TestTruncateTail(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("truncate-tail-%d", rand.Uint64()) + + // Fill table + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) + if err != nil { + t.Fatal(err) + } + + // Write 7 x 20 bytes, splitting out into four files + batch := f.newBatch() + require.NoError(t, batch.AppendRaw(0, getChunk(20, 0xFF))) + require.NoError(t, batch.AppendRaw(1, getChunk(20, 0xEE))) + require.NoError(t, batch.AppendRaw(2, getChunk(20, 0xdd))) + require.NoError(t, batch.AppendRaw(3, getChunk(20, 0xcc))) + require.NoError(t, batch.AppendRaw(4, getChunk(20, 0xbb))) + require.NoError(t, batch.AppendRaw(5, getChunk(20, 0xaa))) + require.NoError(t, batch.AppendRaw(6, getChunk(20, 0x11))) + require.NoError(t, batch.commit()) + + // nothing to do, all the items should still be there. + f.truncateTail(0) + fmt.Println(f.dumpIndexString(0, 1000)) + checkRetrieve(t, f, map[uint64][]byte{ + 0: getChunk(20, 0xFF), + 1: getChunk(20, 0xEE), + 2: getChunk(20, 0xdd), + 3: getChunk(20, 0xcc), + 4: getChunk(20, 0xbb), + 5: getChunk(20, 0xaa), + 6: getChunk(20, 0x11), + }) + + // truncate single element( item 0 ), deletion is only supported at file level + f.truncateTail(1) + fmt.Println(f.dumpIndexString(0, 1000)) + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, + }) + checkRetrieve(t, f, map[uint64][]byte{ + 1: getChunk(20, 0xEE), + 2: getChunk(20, 0xdd), + 3: getChunk(20, 0xcc), + 4: getChunk(20, 0xbb), + 5: getChunk(20, 0xaa), + 6: getChunk(20, 0x11), + }) + + // Reopen the table, the deletion information should be persisted as well + f.Close() + f, err = newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) + if err != nil { + t.Fatal(err) + } + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, + }) + checkRetrieve(t, f, map[uint64][]byte{ + 1: getChunk(20, 0xEE), + 2: getChunk(20, 0xdd), + 3: getChunk(20, 0xcc), + 4: getChunk(20, 0xbb), + 5: getChunk(20, 0xaa), + 6: getChunk(20, 0x11), + }) + + // truncate two elements( item 0, item 1 ), the file 0 should be deleted + f.truncateTail(2) + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, + 1: errOutOfBounds, + }) + checkRetrieve(t, f, map[uint64][]byte{ + 2: getChunk(20, 0xdd), + 3: getChunk(20, 0xcc), + 4: getChunk(20, 0xbb), + 5: getChunk(20, 0xaa), + 6: getChunk(20, 0x11), + }) + + // Reopen the table, the above testing should still pass + f.Close() + f, err = newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) + if err != nil { + t.Fatal(err) + } + defer f.Close() + + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, + 1: errOutOfBounds, + }) + checkRetrieve(t, f, map[uint64][]byte{ + 2: getChunk(20, 0xdd), + 3: getChunk(20, 0xcc), + 4: getChunk(20, 0xbb), + 5: getChunk(20, 0xaa), + 6: getChunk(20, 0x11), + }) + + // truncate all, the entire freezer should be deleted + f.truncateTail(7) + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, + 1: errOutOfBounds, + 2: errOutOfBounds, + 3: errOutOfBounds, + 4: errOutOfBounds, + 5: errOutOfBounds, + 6: errOutOfBounds, + }) +} + +func TestTruncateHead(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("truncate-head-blow-tail-%d", rand.Uint64()) + + // Fill table + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) + if err != nil { + t.Fatal(err) + } + + // Write 7 x 20 bytes, splitting out into four files + batch := f.newBatch() + require.NoError(t, batch.AppendRaw(0, getChunk(20, 0xFF))) + require.NoError(t, batch.AppendRaw(1, getChunk(20, 0xEE))) + require.NoError(t, batch.AppendRaw(2, getChunk(20, 0xdd))) + require.NoError(t, batch.AppendRaw(3, getChunk(20, 0xcc))) + require.NoError(t, batch.AppendRaw(4, getChunk(20, 0xbb))) + require.NoError(t, batch.AppendRaw(5, getChunk(20, 0xaa))) + require.NoError(t, batch.AppendRaw(6, getChunk(20, 0x11))) + require.NoError(t, batch.commit()) + + f.truncateTail(4) // Tail = 4 + + // NewHead is required to be 3, the entire table should be truncated + f.truncateHead(4) + checkRetrieveError(t, f, map[uint64]error{ + 0: errOutOfBounds, // Deleted by tail + 1: errOutOfBounds, // Deleted by tail + 2: errOutOfBounds, // Deleted by tail + 3: errOutOfBounds, // Deleted by tail + 4: errOutOfBounds, // Deleted by Head + 5: errOutOfBounds, // Deleted by Head + 6: errOutOfBounds, // Deleted by Head + }) + + // Append new items + batch = f.newBatch() + require.NoError(t, batch.AppendRaw(4, getChunk(20, 0xbb))) + require.NoError(t, batch.AppendRaw(5, getChunk(20, 0xaa))) + require.NoError(t, batch.AppendRaw(6, getChunk(20, 0x11))) + require.NoError(t, batch.commit()) + + checkRetrieve(t, f, map[uint64][]byte{ + 4: getChunk(20, 0xbb), + 5: getChunk(20, 0xaa), + 6: getChunk(20, 0x11), + }) +} + func checkRetrieve(t *testing.T, f *freezerTable, items map[uint64][]byte) { t.Helper() @@ -726,7 +896,7 @@ func TestSequentialRead(t *testing.T) { rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() fname := fmt.Sprintf("batchread-%d", rand.Uint64()) { // Fill table - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -736,7 +906,7 @@ func TestSequentialRead(t *testing.T) { f.Close() } { // Open it, iterate, verify iteration - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 50, true, false) if err != nil { t.Fatal(err) } @@ -757,7 +927,7 @@ func TestSequentialRead(t *testing.T) { } { // Open it, iterate, verify byte limit. The byte limit is less than item // size, so each lookup should only return one item - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 40, true, false) if err != nil { t.Fatal(err) } @@ -786,7 +956,7 @@ func TestSequentialReadByteLimit(t *testing.T) { rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() fname := fmt.Sprintf("batchread-2-%d", rand.Uint64()) { // Fill table - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 100, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 100, true, false) if err != nil { t.Fatal(err) } @@ -808,7 +978,7 @@ func TestSequentialReadByteLimit(t *testing.T) { {100, 109, 10}, } { { - f, err := newTable(os.TempDir(), fname, rm, wm, sg, 100, true) + f, err := newTable(os.TempDir(), fname, rm, wm, sg, 100, true, false) if err != nil { t.Fatal(err) } @@ -829,3 +999,298 @@ func TestSequentialReadByteLimit(t *testing.T) { } } } + +func TestFreezerReadonly(t *testing.T) { + tmpdir := os.TempDir() + // Case 1: Check it fails on non-existent file. + _, err := newTable(tmpdir, + fmt.Sprintf("readonlytest-%d", rand.Uint64()), + metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, true) + if err == nil { + t.Fatal("readonly table instantiation should fail for non-existent table") + } + + // Case 2: Check that it fails on invalid index length. + fname := fmt.Sprintf("readonlytest-%d", rand.Uint64()) + idxFile, err := openFreezerFileForAppend(filepath.Join(tmpdir, fmt.Sprintf("%s.ridx", fname))) + if err != nil { + t.Errorf("Failed to open index file: %v\n", err) + } + // size should not be a multiple of indexEntrySize. + idxFile.Write(make([]byte, 17)) + idxFile.Close() + _, err = newTable(tmpdir, fname, + metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, true) + if err == nil { + t.Errorf("readonly table instantiation should fail for invalid index size") + } + + // Case 3: Open table non-readonly table to write some data. + // Then corrupt the head file and make sure opening the table + // again in readonly triggers an error. + fname = fmt.Sprintf("readonlytest-%d", rand.Uint64()) + f, err := newTable(tmpdir, fname, + metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, false) + if err != nil { + t.Fatalf("failed to instantiate table: %v", err) + } + writeChunks(t, f, 8, 32) + // Corrupt table file + if _, err := f.head.Write([]byte{1, 1}); err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } + _, err = newTable(tmpdir, fname, + metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, true) + if err == nil { + t.Errorf("readonly table instantiation should fail for corrupt table file") + } + + // Case 4: Write some data to a table and later re-open it as readonly. + // Should be successful. + fname = fmt.Sprintf("readonlytest-%d", rand.Uint64()) + f, err = newTable(tmpdir, fname, + metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, false) + if err != nil { + t.Fatalf("failed to instantiate table: %v\n", err) + } + writeChunks(t, f, 32, 128) + if err := f.Close(); err != nil { + t.Fatal(err) + } + f, err = newTable(tmpdir, fname, + metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, true) + if err != nil { + t.Fatal(err) + } + v, err := f.Retrieve(10) + if err != nil { + t.Fatal(err) + } + exp := getChunk(128, 10) + if !bytes.Equal(v, exp) { + t.Errorf("retrieved value is incorrect") + } + + // Case 5: Now write some data via a batch. + // This should fail either during AppendRaw or Commit + batch := f.newBatch() + writeErr := batch.AppendRaw(32, make([]byte, 1)) + if writeErr == nil { + writeErr = batch.commit() + } + if writeErr == nil { + t.Fatalf("Writing to readonly table should fail") + } +} + +// randTest performs random freezer table operations. +// Instances of this test are created by Generate. +type randTest []randTestStep + +type randTestStep struct { + op int + items []uint64 // for append and retrieve + blobs [][]byte // for append + target uint64 // for truncate(head/tail) + err error // for debugging +} + +const ( + opReload = iota + opAppend + opRetrieve + opTruncateHead + opTruncateHeadAll + opTruncateTail + opTruncateTailAll + opCheckAll + opMax // boundary value, not an actual op +) + +func getVals(first uint64, n int) [][]byte { + var ret [][]byte + for i := 0; i < n; i++ { + val := make([]byte, 8) + binary.BigEndian.PutUint64(val, first+uint64(i)) + ret = append(ret, val) + } + return ret +} + +func (randTest) Generate(r *rand.Rand, size int) reflect.Value { + var ( + deleted uint64 // The number of deleted items from tail + items []uint64 // The index of entries in table + + // getItems retrieves the indexes for items in table. + getItems = func(n int) []uint64 { + length := len(items) + if length == 0 { + return nil + } + var ret []uint64 + index := rand.Intn(length) + for i := index; len(ret) < n && i < length; i++ { + ret = append(ret, items[i]) + } + return ret + } + + // addItems appends the given length items into the table. + addItems = func(n int) []uint64 { + var first = deleted + if len(items) != 0 { + first = items[len(items)-1] + 1 + } + var ret []uint64 + for i := 0; i < n; i++ { + ret = append(ret, first+uint64(i)) + } + items = append(items, ret...) + return ret + } + ) + + var steps randTest + for i := 0; i < size; i++ { + step := randTestStep{op: r.Intn(opMax)} + switch step.op { + case opReload, opCheckAll: + case opAppend: + num := r.Intn(3) + step.items = addItems(num) + if len(step.items) == 0 { + step.blobs = nil + } else { + step.blobs = getVals(step.items[0], num) + } + case opRetrieve: + step.items = getItems(r.Intn(3)) + case opTruncateHead: + if len(items) == 0 { + step.target = deleted + } else { + index := r.Intn(len(items)) + items = items[:index] + step.target = deleted + uint64(index) + } + case opTruncateHeadAll: + step.target = deleted + items = items[:0] + case opTruncateTail: + if len(items) == 0 { + step.target = deleted + } else { + index := r.Intn(len(items)) + items = items[index:] + deleted += uint64(index) + step.target = deleted + } + case opTruncateTailAll: + step.target = deleted + uint64(len(items)) + items = items[:0] + deleted = step.target + } + steps = append(steps, step) + } + return reflect.ValueOf(steps) +} + +func runRandTest(rt randTest) bool { + fname := fmt.Sprintf("randtest-%d", rand.Uint64()) + f, err := newTable(os.TempDir(), fname, metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, false) + if err != nil { + panic("failed to initialize table") + } + var values [][]byte + for i, step := range rt { + switch step.op { + case opReload: + f.Close() + f, err = newTable(os.TempDir(), fname, metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true, false) + if err != nil { + rt[i].err = fmt.Errorf("failed to reload table %v", err) + } + case opCheckAll: + tail := atomic.LoadUint64(&f.itemHidden) + head := atomic.LoadUint64(&f.items) + + if tail == head { + continue + } + got, err := f.RetrieveItems(atomic.LoadUint64(&f.itemHidden), head-tail, 100000) + if err != nil { + rt[i].err = err + } else { + if !reflect.DeepEqual(got, values) { + rt[i].err = fmt.Errorf("mismatch on retrieved values %v %v", got, values) + } + } + + case opAppend: + batch := f.newBatch() + for i := 0; i < len(step.items); i++ { + batch.AppendRaw(step.items[i], step.blobs[i]) + } + batch.commit() + values = append(values, step.blobs...) + + case opRetrieve: + var blobs [][]byte + if len(step.items) == 0 { + continue + } + tail := atomic.LoadUint64(&f.itemHidden) + for i := 0; i < len(step.items); i++ { + blobs = append(blobs, values[step.items[i]-tail]) + } + got, err := f.RetrieveItems(step.items[0], uint64(len(step.items)), 100000) + if err != nil { + rt[i].err = err + } else { + if !reflect.DeepEqual(got, blobs) { + rt[i].err = fmt.Errorf("mismatch on retrieved values %v %v %v", got, blobs, step.items) + } + } + + case opTruncateHead: + f.truncateHead(step.target) + + length := atomic.LoadUint64(&f.items) - atomic.LoadUint64(&f.itemHidden) + values = values[:length] + + case opTruncateHeadAll: + f.truncateHead(step.target) + values = nil + + case opTruncateTail: + prev := atomic.LoadUint64(&f.itemHidden) + f.truncateTail(step.target) + + truncated := atomic.LoadUint64(&f.itemHidden) - prev + values = values[truncated:] + + case opTruncateTailAll: + f.truncateTail(step.target) + values = nil + } + // Abort the test on error. + if rt[i].err != nil { + return false + } + } + f.Close() + return true +} + +func TestRandom(t *testing.T) { + if err := quick.Check(runRandTest, nil); err != nil { + if cerr, ok := err.(*quick.CheckError); ok { + t.Fatalf("random test iteration %d failed: %s", cerr.Count, spew.Sdump(cerr.In)) + } + t.Fatal(err) + } +} diff --git a/core/rawdb/freezer_test.go b/core/rawdb/freezer_test.go index fa84f80306..b3fd3059e7 100644 --- a/core/rawdb/freezer_test.go +++ b/core/rawdb/freezer_test.go @@ -24,6 +24,7 @@ import ( "math/big" "math/rand" "os" + "path" "sync" "testing" @@ -186,7 +187,7 @@ func TestFreezerConcurrentModifyRetrieve(t *testing.T) { wg.Wait() } -// This test runs ModifyAncients and TruncateAncients concurrently with each other. +// This test runs ModifyAncients and TruncateHead concurrently with each other. func TestFreezerConcurrentModifyTruncate(t *testing.T) { f, dir := newFreezerForTesting(t, freezerTestTableDef) defer os.RemoveAll(dir) @@ -196,7 +197,7 @@ func TestFreezerConcurrentModifyTruncate(t *testing.T) { for i := 0; i < 1000; i++ { // First reset and write 100 items. - if err := f.TruncateAncients(0); err != nil { + if err := f.TruncateHead(0); err != nil { t.Fatal("truncate failed:", err) } _, err := f.ModifyAncients(func(op ethdb.AncientWriteOp) error { @@ -231,7 +232,7 @@ func TestFreezerConcurrentModifyTruncate(t *testing.T) { wg.Done() }() go func() { - truncateErr = f.TruncateAncients(10) + truncateErr = f.TruncateHead(10) wg.Done() }() go func() { @@ -253,6 +254,44 @@ func TestFreezerConcurrentModifyTruncate(t *testing.T) { } } +func TestFreezerReadonlyValidate(t *testing.T) { + tables := map[string]bool{"a": true, "b": true} + dir, err := ioutil.TempDir("", "freezer") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + // Open non-readonly freezer and fill individual tables + // with different amount of data. + f, err := newFreezer(dir, "", false, 2049, tables) + if err != nil { + t.Fatal("can't open freezer", err) + } + var item = make([]byte, 1024) + aBatch := f.tables["a"].newBatch() + require.NoError(t, aBatch.AppendRaw(0, item)) + require.NoError(t, aBatch.AppendRaw(1, item)) + require.NoError(t, aBatch.AppendRaw(2, item)) + require.NoError(t, aBatch.commit()) + bBatch := f.tables["b"].newBatch() + require.NoError(t, bBatch.AppendRaw(0, item)) + require.NoError(t, bBatch.commit()) + if f.tables["a"].items != 3 { + t.Fatalf("unexpected number of items in table") + } + if f.tables["b"].items != 1 { + t.Fatalf("unexpected number of items in table") + } + require.NoError(t, f.Close()) + + // Re-openening as readonly should fail when validating + // table lengths. + f, err = newFreezer(dir, "", true, 2049, tables) + if err == nil { + t.Fatal("readonly freezer should fail with differing table lengths") + } +} + func newFreezerForTesting(t *testing.T, tables map[string]bool) (*freezer, string) { t.Helper() @@ -299,3 +338,92 @@ func checkAncientCount(t *testing.T, f *freezer, kind string, n uint64) { t.Errorf("Ancient(%q, %d) returned unexpected error %q", kind, index, err) } } + +func TestRenameWindows(t *testing.T) { + var ( + fname = "file.bin" + fname2 = "file2.bin" + data = []byte{1, 2, 3, 4} + data2 = []byte{2, 3, 4, 5} + data3 = []byte{3, 5, 6, 7} + dataLen = 4 + ) + + // Create 2 temp dirs + dir1, err := os.MkdirTemp("", "rename-test") + if err != nil { + t.Fatal(err) + } + defer os.Remove(dir1) + dir2, err := os.MkdirTemp("", "rename-test") + if err != nil { + t.Fatal(err) + } + defer os.Remove(dir2) + + // Create file in dir1 and fill with data + f, err := os.Create(path.Join(dir1, fname)) + if err != nil { + t.Fatal(err) + } + f2, err := os.Create(path.Join(dir1, fname2)) + if err != nil { + t.Fatal(err) + } + f3, err := os.Create(path.Join(dir2, fname2)) + if err != nil { + t.Fatal(err) + } + if _, err := f.Write(data); err != nil { + t.Fatal(err) + } + if _, err := f2.Write(data2); err != nil { + t.Fatal(err) + } + if _, err := f3.Write(data3); err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } + if err := f2.Close(); err != nil { + t.Fatal(err) + } + if err := f3.Close(); err != nil { + t.Fatal(err) + } + if err := os.Rename(f.Name(), path.Join(dir2, fname)); err != nil { + t.Fatal(err) + } + if err := os.Rename(f2.Name(), path.Join(dir2, fname2)); err != nil { + t.Fatal(err) + } + + // Check file contents + f, err = os.Open(path.Join(dir2, fname)) + if err != nil { + t.Fatal(err) + } + defer f.Close() + defer os.Remove(f.Name()) + buf := make([]byte, dataLen) + if _, err := f.Read(buf); err != nil { + t.Fatal(err) + } + if !bytes.Equal(buf, data) { + t.Errorf("unexpected file contents. Got %v\n", buf) + } + + f, err = os.Open(path.Join(dir2, fname2)) + if err != nil { + t.Fatal(err) + } + defer f.Close() + defer os.Remove(f.Name()) + if _, err := f.Read(buf); err != nil { + t.Fatal(err) + } + if !bytes.Equal(buf, data2) { + t.Errorf("unexpected file contents. Got %v\n", buf) + } +} diff --git a/core/rawdb/freezer_utils.go b/core/rawdb/freezer_utils.go new file mode 100644 index 0000000000..5695fc0fa8 --- /dev/null +++ b/core/rawdb/freezer_utils.go @@ -0,0 +1,120 @@ +// Copyright 2022 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 . + +package rawdb + +import ( + "io" + "io/ioutil" + "os" + "path/filepath" +) + +// copyFrom copies data from 'srcPath' at offset 'offset' into 'destPath'. +// The 'destPath' is created if it doesn't exist, otherwise it is overwritten. +// Before the copy is executed, there is a callback can be registered to +// manipulate the dest file. +// It is perfectly valid to have destPath == srcPath. +func copyFrom(srcPath, destPath string, offset uint64, before func(f *os.File) error) error { + // Create a temp file in the same dir where we want it to wind up + f, err := ioutil.TempFile(filepath.Dir(destPath), "*") + if err != nil { + return err + } + fname := f.Name() + + // Clean up the leftover file + defer func() { + if f != nil { + f.Close() + } + os.Remove(fname) + }() + // Apply the given function if it's not nil before we copy + // the content from the src. + if before != nil { + if err := before(f); err != nil { + return err + } + } + // Open the source file + src, err := os.Open(srcPath) + if err != nil { + return err + } + if _, err = src.Seek(int64(offset), 0); err != nil { + src.Close() + return err + } + // io.Copy uses 32K buffer internally. + _, err = io.Copy(f, src) + if err != nil { + src.Close() + return err + } + // Rename the temporary file to the specified dest name. + // src may be same as dest, so needs to be closed before + // we do the final move. + src.Close() + + if err := f.Close(); err != nil { + return err + } + f = nil + + if err := os.Rename(fname, destPath); err != nil { + return err + } + return nil +} + +// openFreezerFileForAppend opens a freezer table file and seeks to the end +func openFreezerFileForAppend(filename string) (*os.File, error) { + // Open the file without the O_APPEND flag + // because it has differing behaviour during Truncate operations + // on different OS's + file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return nil, err + } + // Seek to end for append + if _, err = file.Seek(0, io.SeekEnd); err != nil { + return nil, err + } + return file, nil +} + +// openFreezerFileForReadOnly opens a freezer table file for read only access +func openFreezerFileForReadOnly(filename string) (*os.File, error) { + return os.OpenFile(filename, os.O_RDONLY, 0644) +} + +// openFreezerFileTruncated opens a freezer table making sure it is truncated +func openFreezerFileTruncated(filename string) (*os.File, error) { + return os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) +} + +// truncateFreezerFile resizes a freezer table file and seeks to the end +func truncateFreezerFile(file *os.File, size int64) error { + if err := file.Truncate(size); err != nil { + return err + } + // Seek to end for append + if _, err := file.Seek(0, io.SeekEnd); err != nil { + return err + } + return nil +} diff --git a/core/rawdb/freezer_utils_test.go b/core/rawdb/freezer_utils_test.go new file mode 100644 index 0000000000..de8087f9b9 --- /dev/null +++ b/core/rawdb/freezer_utils_test.go @@ -0,0 +1,76 @@ +// Copyright 2022 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 . + +package rawdb + +import ( + "bytes" + "io/ioutil" + "os" + "testing" +) + +func TestCopyFrom(t *testing.T) { + var ( + content = []byte{0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8} + prefix = []byte{0x9, 0xa, 0xb, 0xc, 0xd, 0xf} + ) + var cases = []struct { + src, dest string + offset uint64 + writePrefix bool + }{ + {"foo", "bar", 0, false}, + {"foo", "bar", 1, false}, + {"foo", "bar", 8, false}, + {"foo", "foo", 0, false}, + {"foo", "foo", 1, false}, + {"foo", "foo", 8, false}, + {"foo", "bar", 0, true}, + {"foo", "bar", 1, true}, + {"foo", "bar", 8, true}, + } + for _, c := range cases { + ioutil.WriteFile(c.src, content, 0644) + + if err := copyFrom(c.src, c.dest, c.offset, func(f *os.File) error { + if !c.writePrefix { + return nil + } + f.Write(prefix) + return nil + }); err != nil { + os.Remove(c.src) + t.Fatalf("Failed to copy %v", err) + } + + blob, err := ioutil.ReadFile(c.dest) + if err != nil { + os.Remove(c.src) + os.Remove(c.dest) + t.Fatalf("Failed to read %v", err) + } + want := content[c.offset:] + if c.writePrefix { + want = append(prefix, want...) + } + if !bytes.Equal(blob, want) { + t.Fatal("Unexpected value") + } + os.Remove(c.src) + os.Remove(c.dest) + } +} diff --git a/core/rawdb/key_length_iterator.go b/core/rawdb/key_length_iterator.go new file mode 100644 index 0000000000..d1c5af269a --- /dev/null +++ b/core/rawdb/key_length_iterator.go @@ -0,0 +1,47 @@ +// Copyright 2022 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 . + +package rawdb + +import "github.com/ethereum/go-ethereum/ethdb" + +// KeyLengthIterator is a wrapper for a database iterator that ensures only key-value pairs +// with a specific key length will be returned. +type KeyLengthIterator struct { + requiredKeyLength int + ethdb.Iterator +} + +// NewKeyLengthIterator returns a wrapped version of the iterator that will only return key-value +// pairs where keys with a specific key length will be returned. +func NewKeyLengthIterator(it ethdb.Iterator, keyLen int) ethdb.Iterator { + return &KeyLengthIterator{ + Iterator: it, + requiredKeyLength: keyLen, + } +} + +func (it *KeyLengthIterator) Next() bool { + // Return true as soon as a key with the required key length is discovered + for it.Iterator.Next() { + if len(it.Iterator.Key()) == it.requiredKeyLength { + return true + } + } + + // Return false when we exhaust the keys in the underlying iterator. + return false +} diff --git a/core/rawdb/key_length_iterator_test.go b/core/rawdb/key_length_iterator_test.go new file mode 100644 index 0000000000..654efc5b55 --- /dev/null +++ b/core/rawdb/key_length_iterator_test.go @@ -0,0 +1,60 @@ +// Copyright 2022 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 . + +package rawdb + +import ( + "encoding/binary" + "testing" +) + +func TestKeyLengthIterator(t *testing.T) { + db := NewMemoryDatabase() + + keyLen := 8 + expectedKeys := make(map[string]struct{}) + for i := 0; i < 100; i++ { + key := make([]byte, keyLen) + binary.BigEndian.PutUint64(key, uint64(i)) + if err := db.Put(key, []byte{0x1}); err != nil { + t.Fatal(err) + } + expectedKeys[string(key)] = struct{}{} + + longerKey := make([]byte, keyLen*2) + binary.BigEndian.PutUint64(longerKey, uint64(i)) + if err := db.Put(longerKey, []byte{0x1}); err != nil { + t.Fatal(err) + } + } + + it := NewKeyLengthIterator(db.NewIterator(nil, nil), keyLen) + for it.Next() { + key := it.Key() + _, exists := expectedKeys[string(key)] + if !exists { + t.Fatalf("Found unexpected key %d", binary.BigEndian.Uint64(key)) + } + delete(expectedKeys, string(key)) + if len(key) != keyLen { + t.Fatalf("Found unexpected key in key length iterator with length %d", len(key)) + } + } + + if len(expectedKeys) != 0 { + t.Fatalf("Expected all keys of length %d to be removed from expected keys during iteration", keyLen) + } +} diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go index 942b8199e8..1533211fc7 100644 --- a/core/rawdb/schema.go +++ b/core/rawdb/schema.go @@ -63,6 +63,9 @@ var ( // snapshotSyncStatusKey tracks the snapshot sync status across restarts. snapshotSyncStatusKey = []byte("SnapshotSyncStatus") + // skeletonSyncStatusKey tracks the skeleton sync status across restarts. + skeletonSyncStatusKey = []byte("SkeletonSyncStatus") + // txIndexTailKey tracks the oldest block whose transactions have been indexed. txIndexTailKey = []byte("TransactionIndexTail") @@ -92,9 +95,11 @@ var ( SnapshotAccountPrefix = []byte("a") // SnapshotAccountPrefix + account hash -> account trie value SnapshotStoragePrefix = []byte("o") // SnapshotStoragePrefix + account hash + storage hash -> storage trie value CodePrefix = []byte("c") // CodePrefix + code hash -> account code + skeletonHeaderPrefix = []byte("S") // skeletonHeaderPrefix + num (uint64 big endian) -> header - PreimagePrefix = []byte("secure-key-") // PreimagePrefix + hash -> preimage - configPrefix = []byte("ethereum-config-") // config prefix for the db + PreimagePrefix = []byte("secure-key-") // PreimagePrefix + hash -> preimage + configPrefix = []byte("ethereum-config-") // config prefix for the db + genesisPrefix = []byte("ethereum-genesis-") // genesis state prefix for the db // Chain index prefixes (use `i` + single byte to avoid mixing data types). BloomBitsIndexPrefix = []byte("iB") // BloomBitsIndexPrefix is the data table of a chain indexer to track its progress @@ -211,6 +216,11 @@ func bloomBitsKey(bit uint, section uint64, hash common.Hash) []byte { return key } +// skeletonHeaderKey = skeletonHeaderPrefix + num (uint64 big endian) +func skeletonHeaderKey(number uint64) []byte { + return append(skeletonHeaderPrefix, encodeBlockNumber(number)...) +} + // preimageKey = PreimagePrefix + hash func preimageKey(hash common.Hash) []byte { return append(PreimagePrefix, hash.Bytes()...) @@ -234,3 +244,8 @@ func IsCodeKey(key []byte) (bool, []byte) { func configKey(hash common.Hash) []byte { return append(configPrefix, hash.Bytes()...) } + +// genesisKey = genesisPrefix + hash +func genesisKey(hash common.Hash) []byte { + return append(genesisPrefix, hash.Bytes()...) +} diff --git a/core/rawdb/table.go b/core/rawdb/table.go index 91fc31b660..5eadf5f7c1 100644 --- a/core/rawdb/table.go +++ b/core/rawdb/table.go @@ -74,6 +74,12 @@ func (t *table) Ancients() (uint64, error) { return t.db.Ancients() } +// Tail is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) Tail() (uint64, error) { + return t.db.Tail() +} + // AncientSize is a noop passthrough that just forwards the request to the underlying // database. func (t *table) AncientSize(kind string) (uint64, error) { @@ -89,10 +95,16 @@ func (t *table) ReadAncients(fn func(reader ethdb.AncientReader) error) (err err return t.db.ReadAncients(fn) } -// TruncateAncients is a noop passthrough that just forwards the request to the underlying +// TruncateHead is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) TruncateHead(items uint64) error { + return t.db.TruncateHead(items) +} + +// TruncateTail is a noop passthrough that just forwards the request to the underlying // database. -func (t *table) TruncateAncients(items uint64) error { - return t.db.TruncateAncients(items) +func (t *table) TruncateTail(items uint64) error { + return t.db.TruncateTail(items) } // Sync is a noop passthrough that just forwards the request to the underlying @@ -101,6 +113,12 @@ func (t *table) Sync() error { return t.db.Sync() } +// MigrateTable processes the entries in a given table in sequence +// converting them to a new format if they're of an old format. +func (t *table) MigrateTable(kind string, convert convertLegacyFn) error { + return t.db.MigrateTable(kind, convert) +} + // Put inserts the given value into the database at a prefixed version of the // provided key. func (t *table) Put(key []byte, value []byte) error { @@ -172,6 +190,18 @@ func (t *table) NewBatch() ethdb.Batch { return &tableBatch{t.db.NewBatch(), t.prefix} } +// NewBatchWithSize creates a write-only database batch with pre-allocated buffer. +func (t *table) NewBatchWithSize(size int) ethdb.Batch { + return &tableBatch{t.db.NewBatchWithSize(size), t.prefix} +} + +// NewSnapshot creates a database snapshot based on the current state. +// The created snapshot will not be affected by all following mutations +// happened on the database. +func (t *table) NewSnapshot() (ethdb.Snapshot, error) { + return t.db.NewSnapshot() +} + // tableBatch is a wrapper around a database batch that prefixes each key access // with a pre-configured string. type tableBatch struct { diff --git a/core/state/pruner/pruner.go b/core/state/pruner/pruner.go index 37772ca35c..4e3daac669 100644 --- a/core/state/pruner/pruner.go +++ b/core/state/pruner/pruner.go @@ -265,7 +265,7 @@ func (p *Pruner) Prune(root common.Hash) error { // Ensure the root is really present. The weak assumption // is the presence of root can indicate the presence of the // entire trie. - if blob := rawdb.ReadTrieNode(p.db, root); len(blob) == 0 { + if !rawdb.HasTrieNode(p.db, root) { // The special case is for clique based networks(rinkeby, goerli // and some other private networks), it's possible that two // consecutive blocks will have same root. In this case snapshot @@ -279,7 +279,7 @@ func (p *Pruner) Prune(root common.Hash) error { // as the pruning target. var found bool for i := len(layers) - 2; i >= 2; i-- { - if blob := rawdb.ReadTrieNode(p.db, layers[i].Root()); len(blob) != 0 { + if rawdb.HasTrieNode(p.db, layers[i].Root()) { root = layers[i].Root() found = true log.Info("Selecting middle-layer as the pruning target", "root", root, "depth", i) diff --git a/core/state/snapshot/journal.go b/core/state/snapshot/journal.go index 5cfb9a9f2a..6836a57409 100644 --- a/core/state/snapshot/journal.go +++ b/core/state/snapshot/journal.go @@ -66,6 +66,29 @@ type journalStorage struct { Vals [][]byte } +func ParseGeneratorStatus(generatorBlob []byte) string { + if len(generatorBlob) == 0 { + return "" + } + var generator journalGenerator + if err := rlp.DecodeBytes(generatorBlob, &generator); err != nil { + log.Warn("failed to decode snapshot generator", "err", err) + return "" + } + // Figure out whether we're after or within an account + var m string + switch marker := generator.Marker; len(marker) { + case common.HashLength: + m = fmt.Sprintf("at %#x", marker) + case 2 * common.HashLength: + m = fmt.Sprintf("in %#x at %#x", marker[:common.HashLength], marker[common.HashLength:]) + default: + m = fmt.Sprintf("%#x", marker) + } + return fmt.Sprintf(`Done: %v, Accounts: %d, Slots: %d, Storage: %d, Marker: %s`, + generator.Done, generator.Accounts, generator.Slots, generator.Storage, m) +} + // loadAndParseJournal tries to parse the snapshot journal in latest format. func loadAndParseJournal(db ethdb.KeyValueStore, base *diskLayer) (snapshot, journalGenerator, error) { // Retrieve the disk layer generator. It must exist, no matter the diff --git a/core/state/snapshot/snapshot.go b/core/state/snapshot/snapshot.go index 6ee6b06bb5..76200851e4 100644 --- a/core/state/snapshot/snapshot.go +++ b/core/state/snapshot/snapshot.go @@ -546,20 +546,19 @@ func diffToDisk(bottom *diffLayer) *diskLayer { it := rawdb.IterateStorageSnapshots(base.diskdb, hash) for it.Next() { - if key := it.Key(); len(key) == 65 { // TODO(karalabe): Yuck, we should move this into the iterator - batch.Delete(key) - base.cache.Del(key[1:]) - snapshotFlushStorageItemMeter.Mark(1) - - // Ensure we don't delete too much data blindly (contract can be - // huge). It's ok to flush, the root will go missing in case of a - // crash and we'll detect and regenerate the snapshot. - if batch.ValueSize() > ethdb.IdealBatchSize { - if err := batch.Write(); err != nil { - log.Crit("Failed to write storage deletions", "err", err) - } - batch.Reset() + key := it.Key() + batch.Delete(key) + base.cache.Del(key[1:]) + snapshotFlushStorageItemMeter.Mark(1) + + // Ensure we don't delete too much data blindly (contract can be + // huge). It's ok to flush, the root will go missing in case of a + // crash and we'll detect and regenerate the snapshot. + if batch.ValueSize() > ethdb.IdealBatchSize { + if err := batch.Write(); err != nil { + log.Crit("Failed to write storage deletions", "err", err) } + batch.Reset() } } it.Release() diff --git a/core/state/state_object.go b/core/state/state_object.go index 138fcbdecd..bcb6dca4f5 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -198,25 +198,10 @@ func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Has } // If no live objects are available, attempt to use snapshots var ( - enc []byte - err error - meter *time.Duration + enc []byte + err error ) - readStart := time.Now() - if metrics.EnabledExpensive { - // If the snap is 'under construction', the first lookup may fail. If that - // happens, we don't want to double-count the time elapsed. Thus this - // dance with the metering. - defer func() { - if meter != nil { - *meter += time.Since(readStart) - } - }() - } if s.db.snap != nil { - if metrics.EnabledExpensive { - meter = &s.db.SnapshotStorageReads - } // If the object was destructed in *this* block (and potentially resurrected), // the storage has been cleared out, and we should *not* consult the previous // snapshot about any storage values. The only possible alternatives are: @@ -226,20 +211,20 @@ func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Has if _, destructed := s.db.snapDestructs[s.addrHash]; destructed { return common.Hash{} } + start := time.Now() enc, err = s.db.snap.Storage(s.addrHash, crypto.Keccak256Hash(key.Bytes())) + if metrics.EnabledExpensive { + s.db.SnapshotStorageReads += time.Since(start) + } } // If the snapshot is unavailable or reading from it fails, load from the database. if s.db.snap == nil || err != nil { - if meter != nil { - // If we already spent time checking the snapshot, account for it - // and reset the readStart - *meter += time.Since(readStart) - readStart = time.Now() - } + start := time.Now() + enc, err = s.getTrie(db).TryGet(key.Bytes()) if metrics.EnabledExpensive { - meter = &s.db.StorageReads + s.db.StorageReads += time.Since(start) } - if enc, err = s.getTrie(db).TryGet(key.Bytes()); err != nil { + if err != nil { s.setError(err) return common.Hash{} } diff --git a/core/state/statedb.go b/core/state/statedb.go index e3541339ea..1d31cf470b 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -506,16 +506,14 @@ func (s *StateDB) getDeletedStateObject(addr common.Address) *stateObject { return obj } // If no live objects are available, attempt to use snapshots - var ( - data *types.StateAccount - err error - ) + var data *types.StateAccount if s.snap != nil { + start := time.Now() + acc, err := s.snap.Account(crypto.HashData(s.hasher, addr.Bytes())) if metrics.EnabledExpensive { - defer func(start time.Time) { s.SnapshotAccountReads += time.Since(start) }(time.Now()) + s.SnapshotAccountReads += time.Since(start) } - var acc *snapshot.Account - if acc, err = s.snap.Account(crypto.HashData(s.hasher, addr.Bytes())); err == nil { + if err == nil { if acc == nil { return nil } @@ -534,11 +532,12 @@ func (s *StateDB) getDeletedStateObject(addr common.Address) *stateObject { } } // If snapshot unavailable or reading from it failed, load from the database - if s.snap == nil || err != nil { + if data == nil { + start := time.Now() + enc, err := s.trie.TryGet(addr.Bytes()) if metrics.EnabledExpensive { - defer func(start time.Time) { s.AccountReads += time.Since(start) }(time.Now()) + s.AccountReads += time.Since(start) } - enc, err := s.trie.TryGet(addr.Bytes()) if err != nil { s.setError(fmt.Errorf("getDeleteStateObject (%x) error: %v", addr.Bytes(), err)) return nil @@ -885,7 +884,6 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash { func (s *StateDB) Prepare(thash common.Hash, ti int) { s.thash = thash s.txIndex = ti - s.accessList = newAccessList() } func (s *StateDB) clearJournalAndRefund() { @@ -995,6 +993,9 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (common.Hash, error) { // // This method should only be called if Berlin/2929+2930 is applicable at the current number. func (s *StateDB) PrepareAccessList(sender common.Address, dst *common.Address, precompiles []common.Address, list types.AccessList) { + // Clear out any leftover from previous executions + s.accessList = newAccessList() + s.AddAddressToAccessList(sender) if dst != nil { s.AddAddressToAccessList(*dst) diff --git a/core/state_transition.go b/core/state_transition.go index 81c56fb42f..e867d032bf 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -313,7 +313,7 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { } // Set up the initial access list. - if rules := st.evm.ChainConfig().Rules(st.evm.Context.BlockNumber); rules.IsBerlin { + if rules := st.evm.ChainConfig().Rules(st.evm.Context.BlockNumber, st.evm.Context.Random != nil); rules.IsBerlin { st.state.PrepareAccessList(msg.From(), msg.To(), vm.ActivePrecompiles(rules), msg.AccessList()) } var ( diff --git a/core/types/access_list_tx.go b/core/types/access_list_tx.go index ee5f194b77..8ad5e739e9 100644 --- a/core/types/access_list_tx.go +++ b/core/types/access_list_tx.go @@ -22,7 +22,7 @@ import ( "github.com/ethereum/go-ethereum/common" ) -//go:generate gencodec -type AccessTuple -out gen_access_tuple.go +//go:generate go run github.com/fjl/gencodec@latest -type AccessTuple -out gen_access_tuple.go // AccessList is an EIP-2930 access list. type AccessList []AccessTuple diff --git a/core/types/block.go b/core/types/block.go index f38c55c1ff..314990dc99 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -63,7 +63,8 @@ func (n *BlockNonce) UnmarshalText(input []byte) error { return hexutil.UnmarshalFixedText("BlockNonce", input, n[:]) } -//go:generate gencodec -type Header -field-override headerMarshaling -out gen_header_json.go +//go:generate go run github.com/fjl/gencodec@latest -type Header -field-override headerMarshaling -out gen_header_json.go +//go:generate go run ../../rlp/rlpgen -type Header -out gen_header_rlp.go // Header represents a block header in the Ethereum blockchain. type Header struct { diff --git a/core/types/block_test.go b/core/types/block_test.go index 5cdea3fc06..aa1db2f4fa 100644 --- a/core/types/block_test.go +++ b/core/types/block_test.go @@ -285,7 +285,7 @@ func makeBenchBlock() *Block { func TestRlpDecodeParentHash(t *testing.T) { // A minimum one want := common.HexToHash("0x112233445566778899001122334455667788990011223344556677889900aabb") - if rlpData, err := rlp.EncodeToBytes(Header{ParentHash: want}); err != nil { + if rlpData, err := rlp.EncodeToBytes(&Header{ParentHash: want}); err != nil { t.Fatal(err) } else { if have := HeaderParentHashFromRLP(rlpData); have != want { @@ -299,7 +299,7 @@ func TestRlpDecodeParentHash(t *testing.T) { // | BaseFee | dynamic| *big.Int | 64 bits | mainnetTd := new(big.Int) mainnetTd.SetString("5ad3c2c71bbff854908", 16) - if rlpData, err := rlp.EncodeToBytes(Header{ + if rlpData, err := rlp.EncodeToBytes(&Header{ ParentHash: want, Difficulty: mainnetTd, Number: new(big.Int).SetUint64(math.MaxUint64), @@ -316,7 +316,7 @@ func TestRlpDecodeParentHash(t *testing.T) { { // The rlp-encoding of the heder belowCauses _total_ length of 65540, // which is the first to blow the fast-path. - h := Header{ + h := &Header{ ParentHash: want, Extra: make([]byte, 65041), } diff --git a/core/types/gen_account_rlp.go b/core/types/gen_account_rlp.go new file mode 100644 index 0000000000..5181d88411 --- /dev/null +++ b/core/types/gen_account_rlp.go @@ -0,0 +1,27 @@ +// Code generated by rlpgen. DO NOT EDIT. + +//go:build !norlpgen +// +build !norlpgen + +package types + +import "github.com/ethereum/go-ethereum/rlp" +import "io" + +func (obj *StateAccount) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + _tmp0 := w.List() + w.WriteUint64(obj.Nonce) + if obj.Balance == nil { + w.Write(rlp.EmptyString) + } else { + if obj.Balance.Sign() == -1 { + return rlp.ErrNegativeBigInt + } + w.WriteBigInt(obj.Balance) + } + w.WriteBytes(obj.Root[:]) + w.WriteBytes(obj.CodeHash) + w.ListEnd(_tmp0) + return w.Flush() +} diff --git a/core/types/gen_header_rlp.go b/core/types/gen_header_rlp.go new file mode 100644 index 0000000000..e1a6873318 --- /dev/null +++ b/core/types/gen_header_rlp.go @@ -0,0 +1,56 @@ +// Code generated by rlpgen. DO NOT EDIT. + +//go:build !norlpgen +// +build !norlpgen + +package types + +import "github.com/ethereum/go-ethereum/rlp" +import "io" + +func (obj *Header) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + _tmp0 := w.List() + w.WriteBytes(obj.ParentHash[:]) + w.WriteBytes(obj.UncleHash[:]) + w.WriteBytes(obj.Coinbase[:]) + w.WriteBytes(obj.Root[:]) + w.WriteBytes(obj.TxHash[:]) + w.WriteBytes(obj.ReceiptHash[:]) + w.WriteBytes(obj.Bloom[:]) + if obj.Difficulty == nil { + w.Write(rlp.EmptyString) + } else { + if obj.Difficulty.Sign() == -1 { + return rlp.ErrNegativeBigInt + } + w.WriteBigInt(obj.Difficulty) + } + if obj.Number == nil { + w.Write(rlp.EmptyString) + } else { + if obj.Number.Sign() == -1 { + return rlp.ErrNegativeBigInt + } + w.WriteBigInt(obj.Number) + } + w.WriteUint64(obj.GasLimit) + w.WriteUint64(obj.GasUsed) + w.WriteUint64(obj.Time) + w.WriteBytes(obj.Extra) + w.WriteBytes(obj.MixDigest[:]) + w.WriteBytes(obj.Nonce[:]) + _tmp1 := obj.BaseFee != nil + if _tmp1 { + if obj.BaseFee == nil { + w.Write(rlp.EmptyString) + } else { + if obj.BaseFee.Sign() == -1 { + return rlp.ErrNegativeBigInt + } + w.WriteBigInt(obj.BaseFee) + } + } + w.ListEnd(_tmp0) + return w.Flush() +} diff --git a/core/types/gen_log_rlp.go b/core/types/gen_log_rlp.go new file mode 100644 index 0000000000..4a6c6b0094 --- /dev/null +++ b/core/types/gen_log_rlp.go @@ -0,0 +1,23 @@ +// Code generated by rlpgen. DO NOT EDIT. + +//go:build !norlpgen +// +build !norlpgen + +package types + +import "github.com/ethereum/go-ethereum/rlp" +import "io" + +func (obj *rlpLog) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + _tmp0 := w.List() + w.WriteBytes(obj.Address[:]) + _tmp1 := w.List() + for _, _tmp2 := range obj.Topics { + w.WriteBytes(_tmp2[:]) + } + w.ListEnd(_tmp1) + w.WriteBytes(obj.Data) + w.ListEnd(_tmp0) + return w.Flush() +} diff --git a/core/types/legacy.go b/core/types/legacy.go new file mode 100644 index 0000000000..9254381b1e --- /dev/null +++ b/core/types/legacy.go @@ -0,0 +1,53 @@ +// Copyright 2021 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 . + +package types + +import ( + "errors" + + "github.com/ethereum/go-ethereum/rlp" +) + +// IsLegacyStoredReceipts tries to parse the RLP-encoded blob +// first as an array of v3 stored receipt, then v4 stored receipt and +// returns true if successful. +func IsLegacyStoredReceipts(raw []byte) (bool, error) { + var v3 []v3StoredReceiptRLP + if err := rlp.DecodeBytes(raw, &v3); err == nil { + return true, nil + } + var v4 []v4StoredReceiptRLP + if err := rlp.DecodeBytes(raw, &v4); err == nil { + return true, nil + } + var v5 []storedReceiptRLP + // Check to see valid fresh stored receipt + if err := rlp.DecodeBytes(raw, &v5); err == nil { + return false, nil + } + return false, errors.New("value is not a valid receipt encoding") +} + +// ConvertLegacyStoredReceipts takes the RLP encoding of an array of legacy +// stored receipts and returns a fresh RLP-encoded stored receipt. +func ConvertLegacyStoredReceipts(raw []byte) ([]byte, error) { + var receipts []ReceiptForStorage + if err := rlp.DecodeBytes(raw, &receipts); err != nil { + return nil, err + } + return rlp.EncodeToBytes(&receipts) +} diff --git a/core/types/log.go b/core/types/log.go index 88274e39da..b27c7ccbd3 100644 --- a/core/types/log.go +++ b/core/types/log.go @@ -24,7 +24,7 @@ import ( "github.com/ethereum/go-ethereum/rlp" ) -//go:generate gencodec -type Log -field-override logMarshaling -out gen_log_json.go +//go:generate go run github.com/fjl/gencodec@latest -type Log -field-override logMarshaling -out gen_log_json.go // Log represents a contract log event. These events are generated by the LOG opcode and // stored/indexed by the node. @@ -62,15 +62,14 @@ type logMarshaling struct { Index hexutil.Uint } +//go:generate go run ../../rlp/rlpgen -type rlpLog -out gen_log_rlp.go + type rlpLog struct { Address common.Address Topics []common.Hash Data []byte } -// rlpStorageLog is the storage encoding of a log. -type rlpStorageLog rlpLog - // legacyRlpStorageLog is the previous storage encoding of a log including some redundant fields. type legacyRlpStorageLog struct { Address common.Address @@ -85,7 +84,8 @@ type legacyRlpStorageLog struct { // EncodeRLP implements rlp.Encoder. func (l *Log) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, rlpLog{Address: l.Address, Topics: l.Topics, Data: l.Data}) + rl := rlpLog{Address: l.Address, Topics: l.Topics, Data: l.Data} + return rlp.Encode(w, &rl) } // DecodeRLP implements rlp.Decoder. @@ -104,11 +104,8 @@ type LogForStorage Log // EncodeRLP implements rlp.Encoder. func (l *LogForStorage) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, rlpStorageLog{ - Address: l.Address, - Topics: l.Topics, - Data: l.Data, - }) + rl := rlpLog{Address: l.Address, Topics: l.Topics, Data: l.Data} + return rlp.Encode(w, &rl) } // DecodeRLP implements rlp.Decoder. @@ -119,7 +116,7 @@ func (l *LogForStorage) DecodeRLP(s *rlp.Stream) error { if err != nil { return err } - var dec rlpStorageLog + var dec rlpLog err = rlp.DecodeBytes(blob, &dec) if err == nil { *l = LogForStorage{ diff --git a/core/types/receipt.go b/core/types/receipt.go index c3588990c0..03e2d7500e 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -31,15 +31,14 @@ import ( "github.com/ethereum/go-ethereum/rlp" ) -//go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go +//go:generate go run github.com/fjl/gencodec@latest -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go var ( receiptStatusFailedRLP = []byte{} receiptStatusSuccessfulRLP = []byte{0x01} ) -// This error is returned when a typed receipt is decoded, but the string is empty. -var errEmptyTypedReceipt = errors.New("empty typed receipt bytes") +var errShortTypedReceipt = errors.New("typed receipt too short") const ( // ReceiptStatusFailed is the status code of a transaction if execution failed. @@ -182,26 +181,13 @@ func (r *Receipt) DecodeRLP(s *rlp.Stream) error { } r.Type = LegacyTxType return r.setFromRLP(dec) - case kind == rlp.String: + default: // It's an EIP-2718 typed tx receipt. b, err := s.Bytes() if err != nil { return err } - if len(b) == 0 { - return errEmptyTypedReceipt - } - r.Type = b[0] - if r.Type == AccessListTxType || r.Type == DynamicFeeTxType { - var dec receiptRLP - if err := rlp.DecodeBytes(b[1:], &dec); err != nil { - return err - } - return r.setFromRLP(dec) - } - return ErrTxTypeNotSupported - default: - return rlp.ErrExpectedList + return r.decodeTyped(b) } } @@ -224,8 +210,8 @@ func (r *Receipt) UnmarshalBinary(b []byte) error { // decodeTyped decodes a typed receipt from the canonical format. func (r *Receipt) decodeTyped(b []byte) error { - if len(b) == 0 { - return errEmptyTypedReceipt + if len(b) <= 1 { + return errShortTypedReceipt } switch b[0] { case DynamicFeeTxType, AccessListTxType: @@ -287,16 +273,20 @@ type ReceiptForStorage Receipt // EncodeRLP implements rlp.Encoder, and flattens all content fields of a receipt // into an RLP stream. -func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { - enc := &storedReceiptRLP{ - PostStateOrStatus: (*Receipt)(r).statusEncoding(), - CumulativeGasUsed: r.CumulativeGasUsed, - Logs: make([]*LogForStorage, len(r.Logs)), - } - for i, log := range r.Logs { - enc.Logs[i] = (*LogForStorage)(log) +func (r *ReceiptForStorage) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + outerList := w.List() + w.WriteBytes((*Receipt)(r).statusEncoding()) + w.WriteUint64(r.CumulativeGasUsed) + logList := w.List() + for _, log := range r.Logs { + if err := rlp.Encode(w, log); err != nil { + return err + } } - return rlp.Encode(w, enc) + w.ListEnd(logList) + w.ListEnd(outerList) + return w.Flush() } // DecodeRLP implements rlp.Decoder, and loads both consensus and implementation diff --git a/core/types/receipt_test.go b/core/types/receipt_test.go index 613559a658..bba18d2a7b 100644 --- a/core/types/receipt_test.go +++ b/core/types/receipt_test.go @@ -86,7 +86,7 @@ func TestDecodeEmptyTypedReceipt(t *testing.T) { input := []byte{0x80} var r Receipt err := rlp.DecodeBytes(input, &r) - if err != errEmptyTypedReceipt { + if err != errShortTypedReceipt { t.Fatal("wrong error:", err) } } diff --git a/core/types/state_account.go b/core/types/state_account.go index 68804bf311..3b01be4519 100644 --- a/core/types/state_account.go +++ b/core/types/state_account.go @@ -22,6 +22,8 @@ import ( "github.com/ethereum/go-ethereum/common" ) +//go:generate go run ../../rlp/rlpgen -type StateAccount -out gen_account_rlp.go + // StateAccount is the Ethereum consensus representation of accounts. // These objects are stored in the main account trie. type StateAccount struct { diff --git a/core/types/transaction.go b/core/types/transaction.go index 83f1766e67..29820a0d78 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -37,7 +37,7 @@ var ( ErrInvalidTxType = errors.New("transaction type not valid in this context") ErrTxTypeNotSupported = errors.New("transaction type not supported") ErrGasFeeCapTooLow = errors.New("fee cap less than base fee") - errEmptyTypedTx = errors.New("empty typed transaction bytes") + errShortTypedTx = errors.New("typed transaction too short") ) // Transaction types. @@ -134,7 +134,7 @@ func (tx *Transaction) DecodeRLP(s *rlp.Stream) error { tx.setDecoded(&inner, int(rlp.ListSize(size))) } return err - case kind == rlp.String: + default: // It's an EIP-2718 typed TX envelope. var b []byte if b, err = s.Bytes(); err != nil { @@ -145,8 +145,6 @@ func (tx *Transaction) DecodeRLP(s *rlp.Stream) error { tx.setDecoded(inner, len(b)) } return err - default: - return rlp.ErrExpectedList } } @@ -174,8 +172,8 @@ func (tx *Transaction) UnmarshalBinary(b []byte) error { // decodeTyped decodes a typed transaction from the canonical format. func (tx *Transaction) decodeTyped(b []byte) (TxData, error) { - if len(b) == 0 { - return nil, errEmptyTypedTx + if len(b) <= 1 { + return nil, errShortTypedTx } switch b[0] { case AccessListTxType: diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index 58c95071b2..a4755675cd 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -76,7 +76,7 @@ func TestDecodeEmptyTypedTx(t *testing.T) { input := []byte{0x80} var tx Transaction err := rlp.DecodeBytes(input, &tx) - if err != errEmptyTypedTx { + if err != errShortTypedTx { t.Fatal("wrong error:", err) } } diff --git a/core/vm/evm.go b/core/vm/evm.go index 2c7880b3bf..dd55618bf8 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -75,6 +75,7 @@ type BlockContext struct { Time *big.Int // Provides information for TIME Difficulty *big.Int // Provides information for DIFFICULTY BaseFee *big.Int // Provides information for BASEFEE + Random *common.Hash // Provides information for RANDOM } // TxContext provides the EVM with information about a transaction. @@ -131,7 +132,7 @@ func NewEVM(blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig StateDB: statedb, Config: config, chainConfig: chainConfig, - chainRules: chainConfig.Rules(blockCtx.BlockNumber), + chainRules: chainConfig.Rules(blockCtx.BlockNumber, blockCtx.Random != nil), } evm.interpreter = NewEVMInterpreter(evm, config) return evm diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 4eda3bf531..db507c4811 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -477,6 +477,12 @@ func opDifficulty(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) return nil, nil } +func opRandom(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v := new(uint256.Int).SetBytes((interpreter.evm.Context.Random.Bytes())) + scope.Stack.push(v) + return nil, nil +} + func opGasLimit(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { scope.Stack.push(new(uint256.Int).SetUint64(interpreter.evm.Context.GasLimit)) return nil, nil diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go index e67acd8327..36589a1269 100644 --- a/core/vm/instructions_test.go +++ b/core/vm/instructions_test.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" @@ -654,3 +655,36 @@ func TestCreate2Addreses(t *testing.T) { } } } + +func TestRandom(t *testing.T) { + type testcase struct { + name string + random common.Hash + } + + for _, tt := range []testcase{ + {name: "empty hash", random: common.Hash{}}, + {name: "1", random: common.Hash{0}}, + {name: "emptyCodeHash", random: emptyCodeHash}, + {name: "hash(0x010203)", random: crypto.Keccak256Hash([]byte{0x01, 0x02, 0x03})}, + } { + var ( + env = NewEVM(BlockContext{Random: &tt.random}, TxContext{}, nil, params.TestChainConfig, Config{}) + stack = newstack() + pc = uint64(0) + evmInterpreter = env.interpreter + ) + opRandom(&pc, evmInterpreter, &ScopeContext{nil, stack, nil}) + if len(stack.data) != 1 { + t.Errorf("Expected one item on stack after %v, got %d: ", tt.name, len(stack.data)) + } + actual := stack.pop() + expected, overflow := uint256.FromBig(new(big.Int).SetBytes(tt.random.Bytes())) + if overflow { + t.Errorf("Testcase %v: invalid overflow", tt.name) + } + if actual.Cmp(expected) != 0 { + t.Errorf("Testcase %v: expected %x, got %x", tt.name, expected, actual) + } + } +} diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 1660e3ce0f..21e3c914e1 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -69,6 +69,8 @@ func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { // If jump table was not initialised we set the default one. if cfg.JumpTable == nil { switch { + case evm.chainRules.IsMerge: + cfg.JumpTable = &mergeInstructionSet case evm.chainRules.IsLondon: cfg.JumpTable = &londonInstructionSet case evm.chainRules.IsBerlin: diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 6dea5d81f3..eef3b53d8c 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -54,6 +54,7 @@ var ( istanbulInstructionSet = newIstanbulInstructionSet() berlinInstructionSet = newBerlinInstructionSet() londonInstructionSet = newLondonInstructionSet() + mergeInstructionSet = newMergeInstructionSet() ) // JumpTable contains the EVM opcodes supported at a given fork. @@ -77,6 +78,17 @@ func validate(jt JumpTable) JumpTable { return jt } +func newMergeInstructionSet() JumpTable { + instructionSet := newLondonInstructionSet() + instructionSet[RANDOM] = &operation{ + execute: opRandom, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + } + return validate(instructionSet) +} + // newLondonInstructionSet returns the frontier, homestead, byzantium, // contantinople, istanbul, petersburg, berlin and london instructions. func newLondonInstructionSet() JumpTable { diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index a1833e5109..ba70fa09d4 100644 --- a/core/vm/opcodes.go +++ b/core/vm/opcodes.go @@ -95,6 +95,7 @@ const ( TIMESTAMP OpCode = 0x42 NUMBER OpCode = 0x43 DIFFICULTY OpCode = 0x44 + RANDOM OpCode = 0x44 // Same as DIFFICULTY GASLIMIT OpCode = 0x45 CHAINID OpCode = 0x46 SELFBALANCE OpCode = 0x47 @@ -275,7 +276,7 @@ var opCodeToString = map[OpCode]string{ COINBASE: "COINBASE", TIMESTAMP: "TIMESTAMP", NUMBER: "NUMBER", - DIFFICULTY: "DIFFICULTY", + DIFFICULTY: "DIFFICULTY", // TODO (MariusVanDerWijden) rename to RANDOM post merge GASLIMIT: "GASLIMIT", CHAINID: "CHAINID", SELFBALANCE: "SELFBALANCE", diff --git a/core/vm/operations_acl.go b/core/vm/operations_acl.go index 483226eefa..551e1f5f11 100644 --- a/core/vm/operations_acl.go +++ b/core/vm/operations_acl.go @@ -214,7 +214,7 @@ var ( // see gasSStoreEIP2200(...) in core/vm/gas_table.go for more info about how EIP 2200 is specified gasSStoreEIP2929 = makeGasSStoreFunc(params.SstoreClearsScheduleRefundEIP2200) - // gasSStoreEIP2539 implements gas cost for SSTORE according to EPI-2539 + // gasSStoreEIP2539 implements gas cost for SSTORE according to EIP-2539 // Replace `SSTORE_CLEARS_SCHEDULE` with `SSTORE_RESET_GAS + ACCESS_LIST_STORAGE_KEY_COST` (4,800) gasSStoreEIP3529 = makeGasSStoreFunc(params.SstoreClearsScheduleRefundEIP3529) ) diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index 103ce3e175..7861fb92db 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -118,7 +118,7 @@ func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) { vmenv = NewEnv(cfg) sender = vm.AccountRef(cfg.Origin) ) - if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber); rules.IsBerlin { + if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber, vmenv.Context.Random != nil); rules.IsBerlin { cfg.State.PrepareAccessList(cfg.Origin, &address, vm.ActivePrecompiles(rules), nil) } cfg.State.CreateAccount(address) @@ -150,7 +150,7 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { vmenv = NewEnv(cfg) sender = vm.AccountRef(cfg.Origin) ) - if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber); rules.IsBerlin { + if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber, vmenv.Context.Random != nil); rules.IsBerlin { cfg.State.PrepareAccessList(cfg.Origin, nil, vm.ActivePrecompiles(rules), nil) } // Call the code with the given configuration. @@ -176,7 +176,7 @@ func Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, er sender := cfg.State.GetOrNewStateObject(cfg.Origin) statedb := cfg.State - if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber); rules.IsBerlin { + if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber, vmenv.Context.Random != nil); rules.IsBerlin { statedb.PrepareAccessList(cfg.Origin, &address, vm.ActivePrecompiles(rules), nil) } // Call the code with the given configuration. diff --git a/crypto/bls12381/bls12_381.go b/crypto/bls12381/bls12_381.go index e204a927d1..1c1c97765f 100644 --- a/crypto/bls12381/bls12_381.go +++ b/crypto/bls12381/bls12_381.go @@ -119,105 +119,105 @@ var g2One = PointG2{ */ var frobeniusCoeffs61 = [6]fe2{ - fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, fe{0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741}, }, - fe2{ + { fe{0x30f1361b798a64e8, 0xf3b8ddab7ece5a2a, 0x16a8ca3ac61577f7, 0xc26a2ff874fd029b, 0x3636b76660701c6e, 0x051ba4ab241b6160}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, }, - fe2{ + { fe{0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, fe{0x30f1361b798a64e8, 0xf3b8ddab7ece5a2a, 0x16a8ca3ac61577f7, 0xc26a2ff874fd029b, 0x3636b76660701c6e, 0x051ba4ab241b6160}, }, } var frobeniusCoeffs62 = [6]fe2{ - fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x890dc9e4867545c3, 0x2af322533285a5d5, 0x50880866309b7e2c, 0xa20d1b8c7e881024, 0x14e4f04fe2db9068, 0x14e56d3f1564853a}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x43f5fffffffcaaae, 0x32b7fff2ed47fffd, 0x07e83a49a2e99d69, 0xeca8f3318332bb7a, 0xef148d1ea0f4c069, 0x040ab3263eff0206}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x30f1361b798a64e8, 0xf3b8ddab7ece5a2a, 0x16a8ca3ac61577f7, 0xc26a2ff874fd029b, 0x3636b76660701c6e, 0x051ba4ab241b6160}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0xecfb361b798dba3a, 0xc100ddb891865a2c, 0x0ec08ff1232bda8e, 0xd5c13cc6f1ca4721, 0x47222a47bf7b5c04, 0x0110f184e51c5f59}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, } var frobeniusCoeffs12 = [12]fe2{ - fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x07089552b319d465, 0xc6695f92b50a8313, 0x97e83cccd117228f, 0xa35baecab2dc29ee, 0x1ce393ea5daace4d, 0x08f2220fb0fb66eb}, fe{0xb2f66aad4ce5d646, 0x5842a06bfc497cec, 0xcf4895d42599d394, 0xc11b9cba40a8e8d0, 0x2e3813cbe5a0de89, 0x110eefda88847faf}, }, - fe2{ + { fe{0xecfb361b798dba3a, 0xc100ddb891865a2c, 0x0ec08ff1232bda8e, 0xd5c13cc6f1ca4721, 0x47222a47bf7b5c04, 0x0110f184e51c5f59}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x3e2f585da55c9ad1, 0x4294213d86c18183, 0x382844c88b623732, 0x92ad2afd19103e18, 0x1d794e4fac7cf0b9, 0x0bd592fc7d825ec8}, fe{0x7bcfa7a25aa30fda, 0xdc17dec12a927e7c, 0x2f088dd86b4ebef1, 0xd1ca2087da74d4a7, 0x2da2596696cebc1d, 0x0e2b7eedbbfd87d2}, }, - fe2{ + { fe{0x30f1361b798a64e8, 0xf3b8ddab7ece5a2a, 0x16a8ca3ac61577f7, 0xc26a2ff874fd029b, 0x3636b76660701c6e, 0x051ba4ab241b6160}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x3726c30af242c66c, 0x7c2ac1aad1b6fe70, 0xa04007fbba4b14a2, 0xef517c3266341429, 0x0095ba654ed2226b, 0x02e370eccc86f7dd}, fe{0x82d83cf50dbce43f, 0xa2813e53df9d018f, 0xc6f0caa53c65e181, 0x7525cf528d50fe95, 0x4a85ed50f4798a6b, 0x171da0fd6cf8eebd}, }, - fe2{ + { fe{0x43f5fffffffcaaae, 0x32b7fff2ed47fffd, 0x07e83a49a2e99d69, 0xeca8f3318332bb7a, 0xef148d1ea0f4c069, 0x040ab3263eff0206}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0xb2f66aad4ce5d646, 0x5842a06bfc497cec, 0xcf4895d42599d394, 0xc11b9cba40a8e8d0, 0x2e3813cbe5a0de89, 0x110eefda88847faf}, fe{0x07089552b319d465, 0xc6695f92b50a8313, 0x97e83cccd117228f, 0xa35baecab2dc29ee, 0x1ce393ea5daace4d, 0x08f2220fb0fb66eb}, }, - fe2{ + { fe{0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x7bcfa7a25aa30fda, 0xdc17dec12a927e7c, 0x2f088dd86b4ebef1, 0xd1ca2087da74d4a7, 0x2da2596696cebc1d, 0x0e2b7eedbbfd87d2}, fe{0x3e2f585da55c9ad1, 0x4294213d86c18183, 0x382844c88b623732, 0x92ad2afd19103e18, 0x1d794e4fac7cf0b9, 0x0bd592fc7d825ec8}, }, - fe2{ + { fe{0x890dc9e4867545c3, 0x2af322533285a5d5, 0x50880866309b7e2c, 0xa20d1b8c7e881024, 0x14e4f04fe2db9068, 0x14e56d3f1564853a}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x82d83cf50dbce43f, 0xa2813e53df9d018f, 0xc6f0caa53c65e181, 0x7525cf528d50fe95, 0x4a85ed50f4798a6b, 0x171da0fd6cf8eebd}, fe{0x3726c30af242c66c, 0x7c2ac1aad1b6fe70, 0xa04007fbba4b14a2, 0xef517c3266341429, 0x0095ba654ed2226b, 0x02e370eccc86f7dd}, }, diff --git a/crypto/bls12381/isogeny.go b/crypto/bls12381/isogeny.go index 91e03936d5..c3cb0a6f7b 100644 --- a/crypto/bls12381/isogeny.go +++ b/crypto/bls12381/isogeny.go @@ -77,149 +77,149 @@ func isogenyMapG2(e *fp2, x, y *fe2) { } var isogenyConstansG1 = [4][16]*fe{ - [16]*fe{ - &fe{0x4d18b6f3af00131c, 0x19fa219793fee28c, 0x3f2885f1467f19ae, 0x23dcea34f2ffb304, 0xd15b58d2ffc00054, 0x0913be200a20bef4}, - &fe{0x898985385cdbbd8b, 0x3c79e43cc7d966aa, 0x1597e193f4cd233a, 0x8637ef1e4d6623ad, 0x11b22deed20d827b, 0x07097bc5998784ad}, - &fe{0xa542583a480b664b, 0xfc7169c026e568c6, 0x5ba2ef314ed8b5a6, 0x5b5491c05102f0e7, 0xdf6e99707d2a0079, 0x0784151ed7605524}, - &fe{0x494e212870f72741, 0xab9be52fbda43021, 0x26f5577994e34c3d, 0x049dfee82aefbd60, 0x65dadd7828505289, 0x0e93d431ea011aeb}, - &fe{0x90ee774bd6a74d45, 0x7ada1c8a41bfb185, 0x0f1a8953b325f464, 0x104c24211be4805c, 0x169139d319ea7a8f, 0x09f20ead8e532bf6}, - &fe{0x6ddd93e2f43626b7, 0xa5482c9aa1ccd7bd, 0x143245631883f4bd, 0x2e0a94ccf77ec0db, 0xb0282d480e56489f, 0x18f4bfcbb4368929}, - &fe{0x23c5f0c953402dfd, 0x7a43ff6958ce4fe9, 0x2c390d3d2da5df63, 0xd0df5c98e1f9d70f, 0xffd89869a572b297, 0x1277ffc72f25e8fe}, - &fe{0x79f4f0490f06a8a6, 0x85f894a88030fd81, 0x12da3054b18b6410, 0xe2a57f6505880d65, 0xbba074f260e400f1, 0x08b76279f621d028}, - &fe{0xe67245ba78d5b00b, 0x8456ba9a1f186475, 0x7888bff6e6b33bb4, 0xe21585b9a30f86cb, 0x05a69cdcef55feee, 0x09e699dd9adfa5ac}, - &fe{0x0de5c357bff57107, 0x0a0db4ae6b1a10b2, 0xe256bb67b3b3cd8d, 0x8ad456574e9db24f, 0x0443915f50fd4179, 0x098c4bf7de8b6375}, - &fe{0xe6b0617e7dd929c7, 0xfe6e37d442537375, 0x1dafdeda137a489e, 0xe4efd1ad3f767ceb, 0x4a51d8667f0fe1cf, 0x054fdf4bbf1d821c}, - &fe{0x72db2a50658d767b, 0x8abf91faa257b3d5, 0xe969d6833764ab47, 0x464170142a1009eb, 0xb14f01aadb30be2f, 0x18ae6a856f40715d}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, + { + {0x4d18b6f3af00131c, 0x19fa219793fee28c, 0x3f2885f1467f19ae, 0x23dcea34f2ffb304, 0xd15b58d2ffc00054, 0x0913be200a20bef4}, + {0x898985385cdbbd8b, 0x3c79e43cc7d966aa, 0x1597e193f4cd233a, 0x8637ef1e4d6623ad, 0x11b22deed20d827b, 0x07097bc5998784ad}, + {0xa542583a480b664b, 0xfc7169c026e568c6, 0x5ba2ef314ed8b5a6, 0x5b5491c05102f0e7, 0xdf6e99707d2a0079, 0x0784151ed7605524}, + {0x494e212870f72741, 0xab9be52fbda43021, 0x26f5577994e34c3d, 0x049dfee82aefbd60, 0x65dadd7828505289, 0x0e93d431ea011aeb}, + {0x90ee774bd6a74d45, 0x7ada1c8a41bfb185, 0x0f1a8953b325f464, 0x104c24211be4805c, 0x169139d319ea7a8f, 0x09f20ead8e532bf6}, + {0x6ddd93e2f43626b7, 0xa5482c9aa1ccd7bd, 0x143245631883f4bd, 0x2e0a94ccf77ec0db, 0xb0282d480e56489f, 0x18f4bfcbb4368929}, + {0x23c5f0c953402dfd, 0x7a43ff6958ce4fe9, 0x2c390d3d2da5df63, 0xd0df5c98e1f9d70f, 0xffd89869a572b297, 0x1277ffc72f25e8fe}, + {0x79f4f0490f06a8a6, 0x85f894a88030fd81, 0x12da3054b18b6410, 0xe2a57f6505880d65, 0xbba074f260e400f1, 0x08b76279f621d028}, + {0xe67245ba78d5b00b, 0x8456ba9a1f186475, 0x7888bff6e6b33bb4, 0xe21585b9a30f86cb, 0x05a69cdcef55feee, 0x09e699dd9adfa5ac}, + {0x0de5c357bff57107, 0x0a0db4ae6b1a10b2, 0xe256bb67b3b3cd8d, 0x8ad456574e9db24f, 0x0443915f50fd4179, 0x098c4bf7de8b6375}, + {0xe6b0617e7dd929c7, 0xfe6e37d442537375, 0x1dafdeda137a489e, 0xe4efd1ad3f767ceb, 0x4a51d8667f0fe1cf, 0x054fdf4bbf1d821c}, + {0x72db2a50658d767b, 0x8abf91faa257b3d5, 0xe969d6833764ab47, 0x464170142a1009eb, 0xb14f01aadb30be2f, 0x18ae6a856f40715d}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, }, - [16]*fe{ - &fe{0xb962a077fdb0f945, 0xa6a9740fefda13a0, 0xc14d568c3ed6c544, 0xb43fc37b908b133e, 0x9c0b3ac929599016, 0x0165aa6c93ad115f}, - &fe{0x23279a3ba506c1d9, 0x92cfca0a9465176a, 0x3b294ab13755f0ff, 0x116dda1c5070ae93, 0xed4530924cec2045, 0x083383d6ed81f1ce}, - &fe{0x9885c2a6449fecfc, 0x4a2b54ccd37733f0, 0x17da9ffd8738c142, 0xa0fba72732b3fafd, 0xff364f36e54b6812, 0x0f29c13c660523e2}, - &fe{0xe349cc118278f041, 0xd487228f2f3204fb, 0xc9d325849ade5150, 0x43a92bd69c15c2df, 0x1c2c7844bc417be4, 0x12025184f407440c}, - &fe{0x587f65ae6acb057b, 0x1444ef325140201f, 0xfbf995e71270da49, 0xccda066072436a42, 0x7408904f0f186bb2, 0x13b93c63edf6c015}, - &fe{0xfb918622cd141920, 0x4a4c64423ecaddb4, 0x0beb232927f7fb26, 0x30f94df6f83a3dc2, 0xaeedd424d780f388, 0x06cc402dd594bbeb}, - &fe{0xd41f761151b23f8f, 0x32a92465435719b3, 0x64f436e888c62cb9, 0xdf70a9a1f757c6e4, 0x6933a38d5b594c81, 0x0c6f7f7237b46606}, - &fe{0x693c08747876c8f7, 0x22c9850bf9cf80f0, 0x8e9071dab950c124, 0x89bc62d61c7baf23, 0xbc6be2d8dad57c23, 0x17916987aa14a122}, - &fe{0x1be3ff439c1316fd, 0x9965243a7571dfa7, 0xc7f7f62962f5cd81, 0x32c6aa9af394361c, 0xbbc2ee18e1c227f4, 0x0c102cbac531bb34}, - &fe{0x997614c97bacbf07, 0x61f86372b99192c0, 0x5b8c95fc14353fc3, 0xca2b066c2a87492f, 0x16178f5bbf698711, 0x12a6dcd7f0f4e0e8}, - &fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, + { + {0xb962a077fdb0f945, 0xa6a9740fefda13a0, 0xc14d568c3ed6c544, 0xb43fc37b908b133e, 0x9c0b3ac929599016, 0x0165aa6c93ad115f}, + {0x23279a3ba506c1d9, 0x92cfca0a9465176a, 0x3b294ab13755f0ff, 0x116dda1c5070ae93, 0xed4530924cec2045, 0x083383d6ed81f1ce}, + {0x9885c2a6449fecfc, 0x4a2b54ccd37733f0, 0x17da9ffd8738c142, 0xa0fba72732b3fafd, 0xff364f36e54b6812, 0x0f29c13c660523e2}, + {0xe349cc118278f041, 0xd487228f2f3204fb, 0xc9d325849ade5150, 0x43a92bd69c15c2df, 0x1c2c7844bc417be4, 0x12025184f407440c}, + {0x587f65ae6acb057b, 0x1444ef325140201f, 0xfbf995e71270da49, 0xccda066072436a42, 0x7408904f0f186bb2, 0x13b93c63edf6c015}, + {0xfb918622cd141920, 0x4a4c64423ecaddb4, 0x0beb232927f7fb26, 0x30f94df6f83a3dc2, 0xaeedd424d780f388, 0x06cc402dd594bbeb}, + {0xd41f761151b23f8f, 0x32a92465435719b3, 0x64f436e888c62cb9, 0xdf70a9a1f757c6e4, 0x6933a38d5b594c81, 0x0c6f7f7237b46606}, + {0x693c08747876c8f7, 0x22c9850bf9cf80f0, 0x8e9071dab950c124, 0x89bc62d61c7baf23, 0xbc6be2d8dad57c23, 0x17916987aa14a122}, + {0x1be3ff439c1316fd, 0x9965243a7571dfa7, 0xc7f7f62962f5cd81, 0x32c6aa9af394361c, 0xbbc2ee18e1c227f4, 0x0c102cbac531bb34}, + {0x997614c97bacbf07, 0x61f86372b99192c0, 0x5b8c95fc14353fc3, 0xca2b066c2a87492f, 0x16178f5bbf698711, 0x12a6dcd7f0f4e0e8}, + {0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, }, - [16]*fe{ - &fe{0x2b567ff3e2837267, 0x1d4d9e57b958a767, 0xce028fea04bd7373, 0xcc31a30a0b6cd3df, 0x7d7b18a682692693, 0x0d300744d42a0310}, - &fe{0x99c2555fa542493f, 0xfe7f53cc4874f878, 0x5df0608b8f97608a, 0x14e03832052b49c8, 0x706326a6957dd5a4, 0x0a8dadd9c2414555}, - &fe{0x13d942922a5cf63a, 0x357e33e36e261e7d, 0xcf05a27c8456088d, 0x0000bd1de7ba50f0, 0x83d0c7532f8c1fde, 0x13f70bf38bbf2905}, - &fe{0x5c57fd95bfafbdbb, 0x28a359a65e541707, 0x3983ceb4f6360b6d, 0xafe19ff6f97e6d53, 0xb3468f4550192bf7, 0x0bb6cde49d8ba257}, - &fe{0x590b62c7ff8a513f, 0x314b4ce372cacefd, 0x6bef32ce94b8a800, 0x6ddf84a095713d5f, 0x64eace4cb0982191, 0x0386213c651b888d}, - &fe{0xa5310a31111bbcdd, 0xa14ac0f5da148982, 0xf9ad9cc95423d2e9, 0xaa6ec095283ee4a7, 0xcf5b1f022e1c9107, 0x01fddf5aed881793}, - &fe{0x65a572b0d7a7d950, 0xe25c2d8183473a19, 0xc2fcebe7cb877dbd, 0x05b2d36c769a89b0, 0xba12961be86e9efb, 0x07eb1b29c1dfde1f}, - &fe{0x93e09572f7c4cd24, 0x364e929076795091, 0x8569467e68af51b5, 0xa47da89439f5340f, 0xf4fa918082e44d64, 0x0ad52ba3e6695a79}, - &fe{0x911429844e0d5f54, 0xd03f51a3516bb233, 0x3d587e5640536e66, 0xfa86d2a3a9a73482, 0xa90ed5adf1ed5537, 0x149c9c326a5e7393}, - &fe{0x462bbeb03c12921a, 0xdc9af5fa0a274a17, 0x9a558ebde836ebed, 0x649ef8f11a4fae46, 0x8100e1652b3cdc62, 0x1862bd62c291dacb}, - &fe{0x05c9b8ca89f12c26, 0x0194160fa9b9ac4f, 0x6a643d5a6879fa2c, 0x14665bdd8846e19d, 0xbb1d0d53af3ff6bf, 0x12c7e1c3b28962e5}, - &fe{0xb55ebf900b8a3e17, 0xfedc77ec1a9201c4, 0x1f07db10ea1a4df4, 0x0dfbd15dc41a594d, 0x389547f2334a5391, 0x02419f98165871a4}, - &fe{0xb416af000745fc20, 0x8e563e9d1ea6d0f5, 0x7c763e17763a0652, 0x01458ef0159ebbef, 0x8346fe421f96bb13, 0x0d2d7b829ce324d2}, - &fe{0x93096bb538d64615, 0x6f2a2619951d823a, 0x8f66b3ea59514fa4, 0xf563e63704f7092f, 0x724b136c4cf2d9fa, 0x046959cfcfd0bf49}, - &fe{0xea748d4b6e405346, 0x91e9079c2c02d58f, 0x41064965946d9b59, 0xa06731f1d2bbe1ee, 0x07f897e267a33f1b, 0x1017290919210e5f}, - &fe{0x872aa6c17d985097, 0xeecc53161264562a, 0x07afe37afff55002, 0x54759078e5be6838, 0xc4b92d15db8acca8, 0x106d87d1b51d13b9}, + { + {0x2b567ff3e2837267, 0x1d4d9e57b958a767, 0xce028fea04bd7373, 0xcc31a30a0b6cd3df, 0x7d7b18a682692693, 0x0d300744d42a0310}, + {0x99c2555fa542493f, 0xfe7f53cc4874f878, 0x5df0608b8f97608a, 0x14e03832052b49c8, 0x706326a6957dd5a4, 0x0a8dadd9c2414555}, + {0x13d942922a5cf63a, 0x357e33e36e261e7d, 0xcf05a27c8456088d, 0x0000bd1de7ba50f0, 0x83d0c7532f8c1fde, 0x13f70bf38bbf2905}, + {0x5c57fd95bfafbdbb, 0x28a359a65e541707, 0x3983ceb4f6360b6d, 0xafe19ff6f97e6d53, 0xb3468f4550192bf7, 0x0bb6cde49d8ba257}, + {0x590b62c7ff8a513f, 0x314b4ce372cacefd, 0x6bef32ce94b8a800, 0x6ddf84a095713d5f, 0x64eace4cb0982191, 0x0386213c651b888d}, + {0xa5310a31111bbcdd, 0xa14ac0f5da148982, 0xf9ad9cc95423d2e9, 0xaa6ec095283ee4a7, 0xcf5b1f022e1c9107, 0x01fddf5aed881793}, + {0x65a572b0d7a7d950, 0xe25c2d8183473a19, 0xc2fcebe7cb877dbd, 0x05b2d36c769a89b0, 0xba12961be86e9efb, 0x07eb1b29c1dfde1f}, + {0x93e09572f7c4cd24, 0x364e929076795091, 0x8569467e68af51b5, 0xa47da89439f5340f, 0xf4fa918082e44d64, 0x0ad52ba3e6695a79}, + {0x911429844e0d5f54, 0xd03f51a3516bb233, 0x3d587e5640536e66, 0xfa86d2a3a9a73482, 0xa90ed5adf1ed5537, 0x149c9c326a5e7393}, + {0x462bbeb03c12921a, 0xdc9af5fa0a274a17, 0x9a558ebde836ebed, 0x649ef8f11a4fae46, 0x8100e1652b3cdc62, 0x1862bd62c291dacb}, + {0x05c9b8ca89f12c26, 0x0194160fa9b9ac4f, 0x6a643d5a6879fa2c, 0x14665bdd8846e19d, 0xbb1d0d53af3ff6bf, 0x12c7e1c3b28962e5}, + {0xb55ebf900b8a3e17, 0xfedc77ec1a9201c4, 0x1f07db10ea1a4df4, 0x0dfbd15dc41a594d, 0x389547f2334a5391, 0x02419f98165871a4}, + {0xb416af000745fc20, 0x8e563e9d1ea6d0f5, 0x7c763e17763a0652, 0x01458ef0159ebbef, 0x8346fe421f96bb13, 0x0d2d7b829ce324d2}, + {0x93096bb538d64615, 0x6f2a2619951d823a, 0x8f66b3ea59514fa4, 0xf563e63704f7092f, 0x724b136c4cf2d9fa, 0x046959cfcfd0bf49}, + {0xea748d4b6e405346, 0x91e9079c2c02d58f, 0x41064965946d9b59, 0xa06731f1d2bbe1ee, 0x07f897e267a33f1b, 0x1017290919210e5f}, + {0x872aa6c17d985097, 0xeecc53161264562a, 0x07afe37afff55002, 0x54759078e5be6838, 0xc4b92d15db8acca8, 0x106d87d1b51d13b9}, }, - [16]*fe{ - &fe{0xeb6c359d47e52b1c, 0x18ef5f8a10634d60, 0xddfa71a0889d5b7e, 0x723e71dcc5fc1323, 0x52f45700b70d5c69, 0x0a8b981ee47691f1}, - &fe{0x616a3c4f5535b9fb, 0x6f5f037395dbd911, 0xf25f4cc5e35c65da, 0x3e50dffea3c62658, 0x6a33dca523560776, 0x0fadeff77b6bfe3e}, - &fe{0x2be9b66df470059c, 0x24a2c159a3d36742, 0x115dbe7ad10c2a37, 0xb6634a652ee5884d, 0x04fe8bb2b8d81af4, 0x01c2a7a256fe9c41}, - &fe{0xf27bf8ef3b75a386, 0x898b367476c9073f, 0x24482e6b8c2f4e5f, 0xc8e0bbd6fe110806, 0x59b0c17f7631448a, 0x11037cd58b3dbfbd}, - &fe{0x31c7912ea267eec6, 0x1dbf6f1c5fcdb700, 0xd30d4fe3ba86fdb1, 0x3cae528fbee9a2a4, 0xb1cce69b6aa9ad9a, 0x044393bb632d94fb}, - &fe{0xc66ef6efeeb5c7e8, 0x9824c289dd72bb55, 0x71b1a4d2f119981d, 0x104fc1aafb0919cc, 0x0e49df01d942a628, 0x096c3a09773272d4}, - &fe{0x9abc11eb5fadeff4, 0x32dca50a885728f0, 0xfb1fa3721569734c, 0xc4b76271ea6506b3, 0xd466a75599ce728e, 0x0c81d4645f4cb6ed}, - &fe{0x4199f10e5b8be45b, 0xda64e495b1e87930, 0xcb353efe9b33e4ff, 0x9e9efb24aa6424c6, 0xf08d33680a237465, 0x0d3378023e4c7406}, - &fe{0x7eb4ae92ec74d3a5, 0xc341b4aa9fac3497, 0x5be603899e907687, 0x03bfd9cca75cbdeb, 0x564c2935a96bfa93, 0x0ef3c33371e2fdb5}, - &fe{0x7ee91fd449f6ac2e, 0xe5d5bd5cb9357a30, 0x773a8ca5196b1380, 0xd0fda172174ed023, 0x6cb95e0fa776aead, 0x0d22d5a40cec7cff}, - &fe{0xf727e09285fd8519, 0xdc9d55a83017897b, 0x7549d8bd057894ae, 0x178419613d90d8f8, 0xfce95ebdeb5b490a, 0x0467ffaef23fc49e}, - &fe{0xc1769e6a7c385f1b, 0x79bc930deac01c03, 0x5461c75a23ede3b5, 0x6e20829e5c230c45, 0x828e0f1e772a53cd, 0x116aefa749127bff}, - &fe{0x101c10bf2744c10a, 0xbbf18d053a6a3154, 0xa0ecf39ef026f602, 0xfc009d4996dc5153, 0xb9000209d5bd08d3, 0x189e5fe4470cd73c}, - &fe{0x7ebd546ca1575ed2, 0xe47d5a981d081b55, 0x57b2b625b6d4ca21, 0xb0a1ba04228520cc, 0x98738983c2107ff3, 0x13dddbc4799d81d6}, - &fe{0x09319f2e39834935, 0x039e952cbdb05c21, 0x55ba77a9a2f76493, 0xfd04e3dfc6086467, 0xfb95832e7d78742e, 0x0ef9c24eccaf5e0e}, - &fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, + { + {0xeb6c359d47e52b1c, 0x18ef5f8a10634d60, 0xddfa71a0889d5b7e, 0x723e71dcc5fc1323, 0x52f45700b70d5c69, 0x0a8b981ee47691f1}, + {0x616a3c4f5535b9fb, 0x6f5f037395dbd911, 0xf25f4cc5e35c65da, 0x3e50dffea3c62658, 0x6a33dca523560776, 0x0fadeff77b6bfe3e}, + {0x2be9b66df470059c, 0x24a2c159a3d36742, 0x115dbe7ad10c2a37, 0xb6634a652ee5884d, 0x04fe8bb2b8d81af4, 0x01c2a7a256fe9c41}, + {0xf27bf8ef3b75a386, 0x898b367476c9073f, 0x24482e6b8c2f4e5f, 0xc8e0bbd6fe110806, 0x59b0c17f7631448a, 0x11037cd58b3dbfbd}, + {0x31c7912ea267eec6, 0x1dbf6f1c5fcdb700, 0xd30d4fe3ba86fdb1, 0x3cae528fbee9a2a4, 0xb1cce69b6aa9ad9a, 0x044393bb632d94fb}, + {0xc66ef6efeeb5c7e8, 0x9824c289dd72bb55, 0x71b1a4d2f119981d, 0x104fc1aafb0919cc, 0x0e49df01d942a628, 0x096c3a09773272d4}, + {0x9abc11eb5fadeff4, 0x32dca50a885728f0, 0xfb1fa3721569734c, 0xc4b76271ea6506b3, 0xd466a75599ce728e, 0x0c81d4645f4cb6ed}, + {0x4199f10e5b8be45b, 0xda64e495b1e87930, 0xcb353efe9b33e4ff, 0x9e9efb24aa6424c6, 0xf08d33680a237465, 0x0d3378023e4c7406}, + {0x7eb4ae92ec74d3a5, 0xc341b4aa9fac3497, 0x5be603899e907687, 0x03bfd9cca75cbdeb, 0x564c2935a96bfa93, 0x0ef3c33371e2fdb5}, + {0x7ee91fd449f6ac2e, 0xe5d5bd5cb9357a30, 0x773a8ca5196b1380, 0xd0fda172174ed023, 0x6cb95e0fa776aead, 0x0d22d5a40cec7cff}, + {0xf727e09285fd8519, 0xdc9d55a83017897b, 0x7549d8bd057894ae, 0x178419613d90d8f8, 0xfce95ebdeb5b490a, 0x0467ffaef23fc49e}, + {0xc1769e6a7c385f1b, 0x79bc930deac01c03, 0x5461c75a23ede3b5, 0x6e20829e5c230c45, 0x828e0f1e772a53cd, 0x116aefa749127bff}, + {0x101c10bf2744c10a, 0xbbf18d053a6a3154, 0xa0ecf39ef026f602, 0xfc009d4996dc5153, 0xb9000209d5bd08d3, 0x189e5fe4470cd73c}, + {0x7ebd546ca1575ed2, 0xe47d5a981d081b55, 0x57b2b625b6d4ca21, 0xb0a1ba04228520cc, 0x98738983c2107ff3, 0x13dddbc4799d81d6}, + {0x09319f2e39834935, 0x039e952cbdb05c21, 0x55ba77a9a2f76493, 0xfd04e3dfc6086467, 0xfb95832e7d78742e, 0x0ef9c24eccaf5e0e}, + {0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, }, } var isogenyConstantsG2 = [4][4]*fe2{ - [4]*fe2{ - &fe2{ + { + { fe{0x47f671c71ce05e62, 0x06dd57071206393e, 0x7c80cd2af3fd71a2, 0x048103ea9e6cd062, 0xc54516acc8d037f6, 0x13808f550920ea41}, fe{0x47f671c71ce05e62, 0x06dd57071206393e, 0x7c80cd2af3fd71a2, 0x048103ea9e6cd062, 0xc54516acc8d037f6, 0x13808f550920ea41}, }, - &fe2{ + { fe{0, 0, 0, 0, 0, 0}, fe{0x5fe55555554c71d0, 0x873fffdd236aaaa3, 0x6a6b4619b26ef918, 0x21c2888408874945, 0x2836cda7028cabc5, 0x0ac73310a7fd5abd}, }, - &fe2{ + { fe{0x0a0c5555555971c3, 0xdb0c00101f9eaaae, 0xb1fb2f941d797997, 0xd3960742ef416e1c, 0xb70040e2c20556f4, 0x149d7861e581393b}, fe{0xaff2aaaaaaa638e8, 0x439fffee91b55551, 0xb535a30cd9377c8c, 0x90e144420443a4a2, 0x941b66d3814655e2, 0x0563998853fead5e}, }, - &fe2{ + { fe{0x40aac71c71c725ed, 0x190955557a84e38e, 0xd817050a8f41abc3, 0xd86485d4c87f6fb1, 0x696eb479f885d059, 0x198e1a74328002d2}, fe{0, 0, 0, 0, 0, 0}, }, }, - [4]*fe2{ - &fe2{ + { + { fe{0, 0, 0, 0, 0, 0}, fe{0x1f3affffff13ab97, 0xf25bfc611da3ff3e, 0xca3757cb3819b208, 0x3e6427366f8cec18, 0x03977bc86095b089, 0x04f69db13f39a952}, }, - &fe2{ + { fe{0x447600000027552e, 0xdcb8009a43480020, 0x6f7ee9ce4a6e8b59, 0xb10330b7c0a95bc6, 0x6140b1fcfb1e54b7, 0x0381be097f0bb4e1}, fe{0x7588ffffffd8557d, 0x41f3ff646e0bffdf, 0xf7b1e8d2ac426aca, 0xb3741acd32dbb6f8, 0xe9daf5b9482d581f, 0x167f53e0ba7431b8}, }, - &fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0, 0, 0, 0, 0, 0}, }, - &fe2{ + { fe{0, 0, 0, 0, 0, 0}, fe{0, 0, 0, 0, 0, 0}, }, }, - [4]*fe2{ - &fe2{ + { + { fe{0x96d8f684bdfc77be, 0xb530e4f43b66d0e2, 0x184a88ff379652fd, 0x57cb23ecfae804e1, 0x0fd2e39eada3eba9, 0x08c8055e31c5d5c3}, fe{0x96d8f684bdfc77be, 0xb530e4f43b66d0e2, 0x184a88ff379652fd, 0x57cb23ecfae804e1, 0x0fd2e39eada3eba9, 0x08c8055e31c5d5c3}, }, - &fe2{ + { fe{0, 0, 0, 0, 0, 0}, fe{0xbf0a71c71c91b406, 0x4d6d55d28b7638fd, 0x9d82f98e5f205aee, 0xa27aa27b1d1a18d5, 0x02c3b2b2d2938e86, 0x0c7d13420b09807f}, }, - &fe2{ + { fe{0xd7f9555555531c74, 0x21cffff748daaaa8, 0x5a9ad1866c9bbe46, 0x4870a2210221d251, 0x4a0db369c0a32af1, 0x02b1ccc429ff56af}, fe{0xe205aaaaaaac8e37, 0xfcdc000768795556, 0x0c96011a8a1537dd, 0x1c06a963f163406e, 0x010df44c82a881e6, 0x174f45260f808feb}, }, - &fe2{ + { fe{0xa470bda12f67f35c, 0xc0fe38e23327b425, 0xc9d3d0f2c6f0678d, 0x1c55c9935b5a982e, 0x27f6c0e2f0746764, 0x117c5e6e28aa9054}, fe{0, 0, 0, 0, 0, 0}, }, }, - [4]*fe2{ - &fe2{ + { + { fe{0x0162fffffa765adf, 0x8f7bea480083fb75, 0x561b3c2259e93611, 0x11e19fc1a9c875d5, 0xca713efc00367660, 0x03c6a03d41da1151}, fe{0x0162fffffa765adf, 0x8f7bea480083fb75, 0x561b3c2259e93611, 0x11e19fc1a9c875d5, 0xca713efc00367660, 0x03c6a03d41da1151}, }, - &fe2{ + { fe{0, 0, 0, 0, 0, 0}, fe{0x5db0fffffd3b02c5, 0xd713f52358ebfdba, 0x5ea60761a84d161a, 0xbb2c75a34ea6c44a, 0x0ac6735921c1119b, 0x0ee3d913bdacfbf6}, }, - &fe2{ + { fe{0x66b10000003affc5, 0xcb1400e764ec0030, 0xa73e5eb56fa5d106, 0x8984c913a0fe09a9, 0x11e10afb78ad7f13, 0x05429d0e3e918f52}, fe{0x534dffffffc4aae6, 0x5397ff174c67ffcf, 0xbff273eb870b251d, 0xdaf2827152870915, 0x393a9cbaca9e2dc3, 0x14be74dbfaee5748}, }, - &fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0, 0, 0, 0, 0, 0}, }, diff --git a/crypto/bls12381/swu.go b/crypto/bls12381/swu.go index 40d8c9154d..e78753b240 100644 --- a/crypto/bls12381/swu.go +++ b/crypto/bls12381/swu.go @@ -17,7 +17,7 @@ package bls12381 // swuMapG1 is implementation of Simplified Shallue-van de Woestijne-Ulas Method -// follows the implmentation at draft-irtf-cfrg-hash-to-curve-06. +// follows the implementation at draft-irtf-cfrg-hash-to-curve-06. func swuMapG1(u *fe) (*fe, *fe) { var params = swuParamsForG1 var tv [4]*fe diff --git a/crypto/bn256/cloudflare/gfp_amd64.s b/crypto/bn256/cloudflare/gfp_amd64.s index bdb4ffb787..64c97eaed9 100644 --- a/crypto/bn256/cloudflare/gfp_amd64.s +++ b/crypto/bn256/cloudflare/gfp_amd64.s @@ -49,7 +49,7 @@ TEXT ·gfpNeg(SB),0,$0-16 SBBQ 24(DI), R11 MOVQ $0, AX - gfpCarry(R8,R9,R10,R11,AX, R12,R13,R14,R15,BX) + gfpCarry(R8,R9,R10,R11,AX, R12,R13,R14,CX,BX) MOVQ c+0(FP), DI storeBlock(R8,R9,R10,R11, 0(DI)) @@ -68,7 +68,7 @@ TEXT ·gfpAdd(SB),0,$0-24 ADCQ 24(SI), R11 ADCQ $0, R12 - gfpCarry(R8,R9,R10,R11,R12, R13,R14,R15,AX,BX) + gfpCarry(R8,R9,R10,R11,R12, R13,R14,CX,AX,BX) MOVQ c+0(FP), DI storeBlock(R8,R9,R10,R11, 0(DI)) @@ -83,7 +83,7 @@ TEXT ·gfpSub(SB),0,$0-24 MOVQ ·p2+0(SB), R12 MOVQ ·p2+8(SB), R13 MOVQ ·p2+16(SB), R14 - MOVQ ·p2+24(SB), R15 + MOVQ ·p2+24(SB), CX MOVQ $0, AX SUBQ 0(SI), R8 @@ -94,12 +94,12 @@ TEXT ·gfpSub(SB),0,$0-24 CMOVQCC AX, R12 CMOVQCC AX, R13 CMOVQCC AX, R14 - CMOVQCC AX, R15 + CMOVQCC AX, CX ADDQ R12, R8 ADCQ R13, R9 ADCQ R14, R10 - ADCQ R15, R11 + ADCQ CX, R11 MOVQ c+0(FP), DI storeBlock(R8,R9,R10,R11, 0(DI)) @@ -115,7 +115,7 @@ TEXT ·gfpMul(SB),0,$160-24 mulBMI2(0(DI),8(DI),16(DI),24(DI), 0(SI)) storeBlock( R8, R9,R10,R11, 0(SP)) - storeBlock(R12,R13,R14,R15, 32(SP)) + storeBlock(R12,R13,R14,CX, 32(SP)) gfpReduceBMI2() JMP end @@ -125,5 +125,5 @@ nobmi2Mul: end: MOVQ c+0(FP), DI - storeBlock(R12,R13,R14,R15, 0(DI)) + storeBlock(R12,R13,R14,CX, 0(DI)) RET diff --git a/crypto/bn256/cloudflare/mul_amd64.h b/crypto/bn256/cloudflare/mul_amd64.h index bab5da8313..9d8e4b37db 100644 --- a/crypto/bn256/cloudflare/mul_amd64.h +++ b/crypto/bn256/cloudflare/mul_amd64.h @@ -165,7 +165,7 @@ \ \ // Add the 512-bit intermediate to m*N loadBlock(96+stack, R8,R9,R10,R11) \ - loadBlock(128+stack, R12,R13,R14,R15) \ + loadBlock(128+stack, R12,R13,R14,CX) \ \ MOVQ $0, AX \ ADDQ 0+stack, R8 \ @@ -175,7 +175,7 @@ ADCQ 32+stack, R12 \ ADCQ 40+stack, R13 \ ADCQ 48+stack, R14 \ - ADCQ 56+stack, R15 \ + ADCQ 56+stack, CX \ ADCQ $0, AX \ \ - gfpCarry(R12,R13,R14,R15,AX, R8,R9,R10,R11,BX) + gfpCarry(R12,R13,R14,CX,AX, R8,R9,R10,R11,BX) diff --git a/crypto/bn256/cloudflare/mul_bmi2_amd64.h b/crypto/bn256/cloudflare/mul_bmi2_amd64.h index 71ad0499af..403566c6fa 100644 --- a/crypto/bn256/cloudflare/mul_bmi2_amd64.h +++ b/crypto/bn256/cloudflare/mul_bmi2_amd64.h @@ -29,7 +29,7 @@ ADCQ $0, R14 \ \ MOVQ a2, DX \ - MOVQ $0, R15 \ + MOVQ $0, CX \ MULXQ 0+rb, AX, BX \ ADDQ AX, R10 \ ADCQ BX, R11 \ @@ -43,7 +43,7 @@ MULXQ 24+rb, AX, BX \ ADCQ AX, R13 \ ADCQ BX, R14 \ - ADCQ $0, R15 \ + ADCQ $0, CX \ \ MOVQ a3, DX \ MULXQ 0+rb, AX, BX \ @@ -52,13 +52,13 @@ MULXQ 16+rb, AX, BX \ ADCQ AX, R13 \ ADCQ BX, R14 \ - ADCQ $0, R15 \ + ADCQ $0, CX \ MULXQ 8+rb, AX, BX \ ADDQ AX, R12 \ ADCQ BX, R13 \ MULXQ 24+rb, AX, BX \ ADCQ AX, R14 \ - ADCQ BX, R15 + ADCQ BX, CX #define gfpReduceBMI2() \ \ // m = (T * N') mod R, store m in R8:R9:R10:R11 @@ -106,7 +106,7 @@ ADCQ 32(SP), R12 \ ADCQ 40(SP), R13 \ ADCQ 48(SP), R14 \ - ADCQ 56(SP), R15 \ + ADCQ 56(SP), CX \ ADCQ $0, AX \ \ - gfpCarry(R12,R13,R14,R15,AX, R8,R9,R10,R11,BX) + gfpCarry(R12,R13,R14,CX,AX, R8,R9,R10,R11,BX) diff --git a/crypto/ecies/ecies_test.go b/crypto/ecies/ecies_test.go index 0a6aeb2b51..96e33da006 100644 --- a/crypto/ecies/ecies_test.go +++ b/crypto/ecies/ecies_test.go @@ -279,7 +279,7 @@ var testCases = []testCase{ { Curve: elliptic.P384(), Name: "P384", - Expected: ECIES_AES256_SHA384, + Expected: ECIES_AES192_SHA384, }, { Curve: elliptic.P521(), diff --git a/crypto/ecies/params.go b/crypto/ecies/params.go index 0bd3877ddd..39e7c89473 100644 --- a/crypto/ecies/params.go +++ b/crypto/ecies/params.go @@ -80,6 +80,14 @@ var ( KeyLen: 16, } + ECIES_AES192_SHA384 = &ECIESParams{ + Hash: sha512.New384, + hashAlgo: crypto.SHA384, + Cipher: aes.NewCipher, + BlockSize: aes.BlockSize, + KeyLen: 24, + } + ECIES_AES256_SHA256 = &ECIESParams{ Hash: sha256.New, hashAlgo: crypto.SHA256, @@ -108,7 +116,7 @@ var ( var paramsFromCurve = map[elliptic.Curve]*ECIESParams{ ethcrypto.S256(): ECIES_AES128_SHA256, elliptic.P256(): ECIES_AES128_SHA256, - elliptic.P384(): ECIES_AES256_SHA384, + elliptic.P384(): ECIES_AES192_SHA384, elliptic.P521(): ECIES_AES256_SHA512, } diff --git a/crypto/signature_nocgo.go b/crypto/signature_nocgo.go index fd1e66c7e6..3e48e51e84 100644 --- a/crypto/signature_nocgo.go +++ b/crypto/signature_nocgo.go @@ -24,37 +24,48 @@ import ( "crypto/elliptic" "errors" "fmt" - "math/big" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" + btc_ecdsa "github.com/btcsuite/btcd/btcec/v2/ecdsa" ) // Ecrecover returns the uncompressed public key that created the given signature. func Ecrecover(hash, sig []byte) ([]byte, error) { - pub, err := SigToPub(hash, sig) + pub, err := sigToPub(hash, sig) if err != nil { return nil, err } - bytes := (*btcec.PublicKey)(pub).SerializeUncompressed() + bytes := pub.SerializeUncompressed() return bytes, err } -// SigToPub returns the public key that created the given signature. -func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { +func sigToPub(hash, sig []byte) (*btcec.PublicKey, error) { + if len(sig) != SignatureLength { + return nil, errors.New("invalid signature") + } // Convert to btcec input format with 'recovery id' v at the beginning. btcsig := make([]byte, SignatureLength) - btcsig[0] = sig[64] + 27 + btcsig[0] = sig[RecoveryIDOffset] + 27 copy(btcsig[1:], sig) - pub, _, err := btcec.RecoverCompact(btcec.S256(), btcsig, hash) - return (*ecdsa.PublicKey)(pub), err + pub, _, err := btc_ecdsa.RecoverCompact(btcsig, hash) + return pub, err +} + +// SigToPub returns the public key that created the given signature. +func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { + pub, err := sigToPub(hash, sig) + if err != nil { + return nil, err + } + return pub.ToECDSA(), nil } // Sign calculates an ECDSA signature. // // This function is susceptible to chosen plaintext attacks that can leak // information about the private key that is used for signing. Callers must -// be aware that the given hash cannot be chosen by an adversery. Common +// be aware that the given hash cannot be chosen by an adversary. Common // solution is to hash any input before calculating the signature. // // The produced signature is in the [R || S || V] format where V is 0 or 1. @@ -65,14 +76,20 @@ func Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) { if prv.Curve != btcec.S256() { return nil, fmt.Errorf("private key curve is not secp256k1") } - sig, err := btcec.SignCompact(btcec.S256(), (*btcec.PrivateKey)(prv), hash, false) + // ecdsa.PrivateKey -> btcec.PrivateKey + var priv btcec.PrivateKey + if overflow := priv.Key.SetByteSlice(prv.D.Bytes()); overflow || priv.Key.IsZero() { + return nil, fmt.Errorf("invalid private key") + } + defer priv.Zero() + sig, err := btc_ecdsa.SignCompact(&priv, hash, false) // ref uncompressed pubkey if err != nil { return nil, err } // Convert to Ethereum signature format with 'recovery id' v at the end. v := sig[0] - 27 copy(sig, sig[1:]) - sig[64] = v + sig[RecoveryIDOffset] = v return sig, nil } @@ -83,13 +100,20 @@ func VerifySignature(pubkey, hash, signature []byte) bool { if len(signature) != 64 { return false } - sig := &btcec.Signature{R: new(big.Int).SetBytes(signature[:32]), S: new(big.Int).SetBytes(signature[32:])} - key, err := btcec.ParsePubKey(pubkey, btcec.S256()) + var r, s btcec.ModNScalar + if r.SetByteSlice(signature[:32]) { + return false // overflow + } + if s.SetByteSlice(signature[32:]) { + return false + } + sig := btc_ecdsa.NewSignature(&r, &s) + key, err := btcec.ParsePubKey(pubkey) if err != nil { return false } // Reject malleable signatures. libsecp256k1 does this check but btcec doesn't. - if sig.S.Cmp(secp256k1halfN) > 0 { + if s.IsOverHalfOrder() { return false } return sig.Verify(hash, key) @@ -100,16 +124,26 @@ func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) { if len(pubkey) != 33 { return nil, errors.New("invalid compressed public key length") } - key, err := btcec.ParsePubKey(pubkey, btcec.S256()) + key, err := btcec.ParsePubKey(pubkey) if err != nil { return nil, err } return key.ToECDSA(), nil } -// CompressPubkey encodes a public key to the 33-byte compressed format. +// CompressPubkey encodes a public key to the 33-byte compressed format. The +// provided PublicKey must be valid. Namely, the coordinates must not be larger +// than 32 bytes each, they must be less than the field prime, and it must be a +// point on the secp256k1 curve. This is the case for a PublicKey constructed by +// elliptic.Unmarshal (see UnmarshalPubkey), or by ToECDSA and ecdsa.GenerateKey +// when constructing a PrivateKey. func CompressPubkey(pubkey *ecdsa.PublicKey) []byte { - return (*btcec.PublicKey)(pubkey).SerializeCompressed() + // NOTE: the coordinates may be validated with + // btcec.ParsePubKey(FromECDSAPub(pubkey)) + var x, y btcec.FieldVal + x.SetByteSlice(pubkey.X.Bytes()) + y.SetByteSlice(pubkey.Y.Bytes()) + return btcec.NewPublicKey(&x, &y).SerializeCompressed() } // S256 returns an instance of the secp256k1 curve. diff --git a/docs/postmortems/2021-08-22-split-postmortem.md b/docs/postmortems/2021-08-22-split-postmortem.md index 429f22d70a..2004f0f287 100644 --- a/docs/postmortems/2021-08-22-split-postmortem.md +++ b/docs/postmortems/2021-08-22-split-postmortem.md @@ -5,7 +5,7 @@ This is a post-mortem concerning the minority split that occurred on Ethereum ma ## Timeline -- 2021-08-17: Guido Vranken submitted bounty report. Investigation started, root cause identified, patch variations discussed. +- 2021-08-17: Guido Vranken submitted a bounty report. Investigation started, root cause identified, patch variations discussed. - 2021-08-18: Made public announcement over twitter about upcoming security release upcoming Tuesday. Downstream projects were also notified about the upcoming patch-release. - 2021-08-24: Released [v1.10.8](https://github.com/ethereum/go-ethereum/releases/tag/v1.10.8) containing the fix on Tuesday morning (CET). Erigon released [v2021.08.04](https://github.com/ledgerwatch/erigon/releases/tag/v2021.08.04). - 2021-08-27: At 12:50:07 UTC, issue exploited. Analysis started roughly 30m later, @@ -51,7 +51,7 @@ A memory-corruption bug within the EVM can cause a consensus error, where vulner #### Handling -On the evening of 17th, we discussed options how to handle it. We made a state test to reproduce the issue, and verified that neither `openethereum`, `nethermind` nor `besu` were affected by the same vulnerability, and started a full-sync with a patched version of `geth`. +On the evening of 17th, we discussed options on how to handle it. We made a state test to reproduce the issue, and verified that neither `openethereum`, `nethermind` nor `besu` were affected by the same vulnerability, and started a full-sync with a patched version of `geth`. It was decided that in this specific instance, it would be possible to make a public announcement and a patch release: diff --git a/eth/backend.go b/eth/backend.go index f1ece4f3fe..00da02ba93 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -177,7 +177,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { // create eth api and set engine ethAPI := ethapi.NewPublicBlockChainAPI(eth.APIBackend) - eth.engine = ethconfig.CreateConsensusEngine(stack, chainConfig, config, chainDb, ethAPI) + eth.engine = ethconfig.CreateConsensusEngine(stack, chainConfig, config, config.Miner.Notify, config.Miner.Noverify, chainDb, ethAPI) // END: Bor changes bcVersion := rawdb.ReadDatabaseVersion(chainDb) @@ -243,21 +243,21 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { checkpoint = params.TrustedCheckpoints[genesisHash] } if eth.handler, err = newHandler(&handlerConfig{ - Database: chainDb, - Chain: eth.blockchain, - TxPool: eth.txPool, - Merger: merger, - Network: config.NetworkId, - Sync: config.SyncMode, - BloomCache: uint64(cacheLimit), - EventMux: eth.eventMux, - Checkpoint: checkpoint, - Whitelist: config.Whitelist, + Database: chainDb, + Chain: eth.blockchain, + TxPool: eth.txPool, + Merger: merger, + Network: config.NetworkId, + Sync: config.SyncMode, + BloomCache: uint64(cacheLimit), + EventMux: eth.eventMux, + Checkpoint: checkpoint, + PeerRequiredBlocks: config.PeerRequiredBlocks, }); err != nil { return nil, err } - eth.miner = miner.New(eth, &config.Miner, chainConfig, eth.EventMux(), eth.engine, eth.isLocalBlock, merger) + eth.miner = miner.New(eth, &config.Miner, chainConfig, eth.EventMux(), eth.engine, eth.isLocalBlock) eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) // Setup DNS discovery iterators. diff --git a/eth/catalyst/api.go b/eth/catalyst/api.go index 3c0b6d9e43..45f233df6d 100644 --- a/eth/catalyst/api.go +++ b/eth/catalyst/api.go @@ -22,35 +22,17 @@ import ( "encoding/binary" "errors" "fmt" - "math/big" "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/consensus" - "github.com/ethereum/go-ethereum/consensus/beacon" - "github.com/ethereum/go-ethereum/consensus/misc" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/beacon" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/les" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" - chainParams "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/trie" -) - -var ( - VALID = GenericStringResponse{"VALID"} - SUCCESS = GenericStringResponse{"SUCCESS"} - INVALID = ForkChoiceResponse{Status: "INVALID", PayloadID: nil} - SYNCING = ForkChoiceResponse{Status: "SYNCING", PayloadID: nil} - GenericServerError = rpc.CustomError{Code: -32000, ValidationError: "Server error"} - UnknownPayload = rpc.CustomError{Code: -32001, ValidationError: "Unknown payload"} - InvalidTB = rpc.CustomError{Code: -32002, ValidationError: "Invalid terminal block"} - InvalidPayloadID = rpc.CustomError{Code: 1, ValidationError: "invalid payload id"} ) // Register adds catalyst APIs to the full node. @@ -58,406 +40,314 @@ func Register(stack *node.Node, backend *eth.Ethereum) error { log.Warn("Catalyst mode enabled", "protocol", "eth") stack.RegisterAPIs([]rpc.API{ { - Namespace: "engine", - Version: "1.0", - Service: NewConsensusAPI(backend, nil), - Public: true, + Namespace: "engine", + Version: "1.0", + Service: NewConsensusAPI(backend), + Public: true, + Authenticated: true, }, - }) - return nil -} - -// RegisterLight adds catalyst APIs to the light client. -func RegisterLight(stack *node.Node, backend *les.LightEthereum) error { - log.Warn("Catalyst mode enabled", "protocol", "les") - stack.RegisterAPIs([]rpc.API{ { - Namespace: "engine", - Version: "1.0", - Service: NewConsensusAPI(nil, backend), - Public: true, + Namespace: "engine", + Version: "1.0", + Service: NewConsensusAPI(backend), + Public: true, + Authenticated: false, }, }) return nil } type ConsensusAPI struct { - light bool - eth *eth.Ethereum - les *les.LightEthereum - engine consensus.Engine // engine is the post-merge consensus engine, only for block creation - preparedBlocks map[uint64]*ExecutableDataV1 + eth *eth.Ethereum + remoteBlocks *headerQueue // Cache of remote payloads received + localBlocks *payloadQueue // Cache of local payloads generated } -func NewConsensusAPI(eth *eth.Ethereum, les *les.LightEthereum) *ConsensusAPI { - var engine consensus.Engine - if eth == nil { - if les.BlockChain().Config().TerminalTotalDifficulty == nil { - panic("Catalyst started without valid total difficulty") - } - if b, ok := les.Engine().(*beacon.Beacon); ok { - engine = beacon.New(b.InnerEngine()) - } else { - engine = beacon.New(les.Engine()) - } - } else { - if eth.BlockChain().Config().TerminalTotalDifficulty == nil { - panic("Catalyst started without valid total difficulty") - } - if b, ok := eth.Engine().(*beacon.Beacon); ok { - engine = beacon.New(b.InnerEngine()) - } else { - engine = beacon.New(eth.Engine()) - } +// NewConsensusAPI creates a new consensus api for the given backend. +// The underlying blockchain needs to have a valid terminal total difficulty set. +func NewConsensusAPI(eth *eth.Ethereum) *ConsensusAPI { + if eth.BlockChain().Config().TerminalTotalDifficulty == nil { + panic("Catalyst started without valid total difficulty") } return &ConsensusAPI{ - light: eth == nil, - eth: eth, - les: les, - engine: engine, - preparedBlocks: make(map[uint64]*ExecutableDataV1), + eth: eth, + remoteBlocks: newHeaderQueue(), + localBlocks: newPayloadQueue(), } } -// blockExecutionEnv gathers all the data required to execute -// a block, either when assembling it or when inserting it. -type blockExecutionEnv struct { - chain *core.BlockChain - state *state.StateDB - tcount int - gasPool *core.GasPool - - header *types.Header - txs []*types.Transaction - receipts []*types.Receipt -} - -func (env *blockExecutionEnv) commitTransaction(tx *types.Transaction, coinbase common.Address) error { - vmconfig := *env.chain.GetVMConfig() - snap := env.state.Snapshot() - receipt, err := core.ApplyTransaction(env.chain.Config(), env.chain, &coinbase, env.gasPool, env.state, env.header, tx, &env.header.GasUsed, vmconfig) - if err != nil { - env.state.RevertToSnapshot(snap) - return err +// ForkchoiceUpdatedV1 has several responsibilities: +// If the method is called with an empty head block: +// we return success, which can be used to check if the catalyst mode is enabled +// If the total difficulty was not reached: +// we return INVALID +// If the finalizedBlockHash is set: +// we check if we have the finalizedBlockHash in our db, if not we start a sync +// We try to set our blockchain to the headBlock +// If there are payloadAttributes: +// we try to assemble a block with the payloadAttributes and return its payloadID +func (api *ConsensusAPI) ForkchoiceUpdatedV1(update beacon.ForkchoiceStateV1, payloadAttributes *beacon.PayloadAttributesV1) (beacon.ForkChoiceResponse, error) { + log.Trace("Engine API request received", "method", "ForkchoiceUpdated", "head", update.HeadBlockHash, "finalized", update.FinalizedBlockHash, "safe", update.SafeBlockHash) + if update.HeadBlockHash == (common.Hash{}) { + log.Warn("Forkchoice requested update to zero hash") + return beacon.STATUS_INVALID, nil // TODO(karalabe): Why does someone send us this? + } + // Check whether we have the block yet in our database or not. If not, we'll + // need to either trigger a sync, or to reject this forkchoice update for a + // reason. + block := api.eth.BlockChain().GetBlockByHash(update.HeadBlockHash) + if block == nil { + // If the head hash is unknown (was not given to us in a newPayload request), + // we cannot resolve the header, so not much to do. This could be extended in + // the future to resolve from the `eth` network, but it's an unexpected case + // that should be fixed, not papered over. + header := api.remoteBlocks.get(update.HeadBlockHash) + if header == nil { + log.Warn("Forkchoice requested unknown head", "hash", update.HeadBlockHash) + return beacon.STATUS_SYNCING, nil + } + // Header advertised via a past newPayload request. Start syncing to it. + // Before we do however, make sure any legacy sync in switched off so we + // don't accidentally have 2 cycles running. + if merger := api.eth.Merger(); !merger.TDDReached() { + merger.ReachTTD() + api.eth.Downloader().Cancel() + } + log.Info("Forkchoice requested sync to new head", "number", header.Number, "hash", header.Hash()) + if err := api.eth.Downloader().BeaconSync(api.eth.SyncMode(), header); err != nil { + return beacon.STATUS_SYNCING, err + } + return beacon.STATUS_SYNCING, nil + } + // Block is known locally, just sanity check that the beacon client does not + // attempt to push us back to before the merge. + if block.Difficulty().BitLen() > 0 || block.NumberU64() == 0 { + var ( + td = api.eth.BlockChain().GetTd(update.HeadBlockHash, block.NumberU64()) + ptd = api.eth.BlockChain().GetTd(block.ParentHash(), block.NumberU64()-1) + ttd = api.eth.BlockChain().Config().TerminalTotalDifficulty + ) + if td == nil || (block.NumberU64() > 0 && ptd == nil) { + log.Error("TDs unavailable for TTD check", "number", block.NumberU64(), "hash", update.HeadBlockHash, "td", td, "parent", block.ParentHash(), "ptd", ptd) + return beacon.STATUS_INVALID, errors.New("TDs unavailable for TDD check") + } + if td.Cmp(ttd) < 0 || (block.NumberU64() > 0 && ptd.Cmp(ttd) > 0) { + log.Error("Refusing beacon update to pre-merge", "number", block.NumberU64(), "hash", update.HeadBlockHash, "diff", block.Difficulty(), "age", common.PrettyAge(time.Unix(int64(block.Time()), 0))) + return beacon.ForkChoiceResponse{PayloadStatus: beacon.PayloadStatusV1{Status: beacon.INVALIDTERMINALBLOCK}, PayloadID: nil}, nil + } } - env.txs = append(env.txs, tx) - env.receipts = append(env.receipts, receipt) - return nil -} -func (api *ConsensusAPI) makeEnv(parent *types.Block, header *types.Header) (*blockExecutionEnv, error) { - // The parent state might be missing. It can be the special scenario - // that consensus layer tries to build a new block based on the very - // old side chain block and the relevant state is already pruned. So - // try to retrieve the live state from the chain, if it's not existent, - // do the necessary recovery work. - var ( - err error - state *state.StateDB - ) - if api.eth.BlockChain().HasState(parent.Root()) { - state, err = api.eth.BlockChain().StateAt(parent.Root()) + if rawdb.ReadCanonicalHash(api.eth.ChainDb(), block.NumberU64()) != update.HeadBlockHash { + // Block is not canonical, set head. + if err := api.eth.BlockChain().SetChainHead(block); err != nil { + return beacon.STATUS_INVALID, err + } } else { - // The maximum acceptable reorg depth can be limited by the - // finalised block somehow. TODO(rjl493456442) fix the hard- - // coded number here later. - state, err = api.eth.StateAtBlock(parent, 1000, nil, false, false) - } - if err != nil { - return nil, err - } - env := &blockExecutionEnv{ - chain: api.eth.BlockChain(), - state: state, - header: header, - gasPool: new(core.GasPool).AddGas(header.GasLimit), - } - return env, nil -} - -func (api *ConsensusAPI) GetPayloadV1(payloadID hexutil.Bytes) (*ExecutableDataV1, error) { - hash := []byte(payloadID) - if len(hash) < 8 { - return nil, &InvalidPayloadID - } - id := binary.BigEndian.Uint64(hash[:8]) - data, ok := api.preparedBlocks[id] - if !ok { - return nil, &UnknownPayload + // If the head block is already in our canonical chain, the beacon client is + // probably resyncing. Ignore the update. + log.Info("Ignoring beacon update to old head", "number", block.NumberU64(), "hash", update.HeadBlockHash, "age", common.PrettyAge(time.Unix(int64(block.Time()), 0)), "have", api.eth.BlockChain().CurrentBlock().NumberU64()) } - return data, nil -} + api.eth.SetSynced() -func (api *ConsensusAPI) ForkchoiceUpdatedV1(heads ForkchoiceStateV1, PayloadAttributes *PayloadAttributesV1) (ForkChoiceResponse, error) { - if heads.HeadBlockHash == (common.Hash{}) { - return ForkChoiceResponse{Status: SUCCESS.Status, PayloadID: nil}, nil - } - if err := api.checkTerminalTotalDifficulty(heads.HeadBlockHash); err != nil { - if block := api.eth.BlockChain().GetBlockByHash(heads.HeadBlockHash); block == nil { - // TODO (MariusVanDerWijden) trigger sync - return SYNCING, nil + // If the beacon client also advertised a finalized block, mark the local + // chain final and completely in PoS mode. + if update.FinalizedBlockHash != (common.Hash{}) { + if merger := api.eth.Merger(); !merger.PoSFinalized() { + merger.FinalizePoS() } - return INVALID, err - } - // If the finalized block is set, check if it is in our blockchain - if heads.FinalizedBlockHash != (common.Hash{}) { - if block := api.eth.BlockChain().GetBlockByHash(heads.FinalizedBlockHash); block == nil { - // TODO (MariusVanDerWijden) trigger sync - return SYNCING, nil + // TODO (MariusVanDerWijden): If the finalized block is not in our canonical tree, somethings wrong + finalBlock := api.eth.BlockChain().GetBlockByHash(update.FinalizedBlockHash) + if finalBlock == nil { + log.Warn("Final block not available in database", "hash", update.FinalizedBlockHash) + return beacon.STATUS_INVALID, errors.New("final block not available") + } else if rawdb.ReadCanonicalHash(api.eth.ChainDb(), finalBlock.NumberU64()) != update.FinalizedBlockHash { + log.Warn("Final block not in canonical chain", "number", block.NumberU64(), "hash", update.HeadBlockHash) + return beacon.STATUS_INVALID, errors.New("final block not canonical") } } - // SetHead - if err := api.setHead(heads.HeadBlockHash); err != nil { - return INVALID, err + // TODO (MariusVanDerWijden): Check if the safe block hash is in our canonical tree, if not somethings wrong + if update.SafeBlockHash != (common.Hash{}) { + safeBlock := api.eth.BlockChain().GetBlockByHash(update.SafeBlockHash) + if safeBlock == nil { + log.Warn("Safe block not available in database") + return beacon.STATUS_INVALID, errors.New("safe head not available") + } + if rawdb.ReadCanonicalHash(api.eth.ChainDb(), safeBlock.NumberU64()) != update.SafeBlockHash { + log.Warn("Safe block not in canonical chain") + return beacon.STATUS_INVALID, errors.New("safe head not canonical") + } } - // Assemble block (if needed) - if PayloadAttributes != nil { - data, err := api.assembleBlock(heads.HeadBlockHash, PayloadAttributes) + // If payload generation was requested, create a new block to be potentially + // sealed by the beacon client. The payload will be requested later, and we + // might replace it arbitrarily many times in between. + if payloadAttributes != nil { + log.Info("Creating new payload for sealing") + start := time.Now() + + data, err := api.assembleBlock(update.HeadBlockHash, payloadAttributes) if err != nil { - return INVALID, err + log.Error("Failed to create sealing payload", "err", err) + return api.validForkChoiceResponse(nil), err // valid setHead, invalid payload } - hash := computePayloadId(heads.HeadBlockHash, PayloadAttributes) - id := binary.BigEndian.Uint64(hash) - api.preparedBlocks[id] = data - log.Info("Created payload", "payloadid", id) - // TODO (MariusVanDerWijden) do something with the payloadID? - hex := hexutil.Bytes(hash) - return ForkChoiceResponse{Status: SUCCESS.Status, PayloadID: &hex}, nil - } - return ForkChoiceResponse{Status: SUCCESS.Status, PayloadID: nil}, nil -} + id := computePayloadId(update.HeadBlockHash, payloadAttributes) + api.localBlocks.put(id, data) -func computePayloadId(headBlockHash common.Hash, params *PayloadAttributesV1) []byte { - // Hash - hasher := sha256.New() - hasher.Write(headBlockHash[:]) - binary.Write(hasher, binary.BigEndian, params.Timestamp) - hasher.Write(params.Random[:]) - hasher.Write(params.SuggestedFeeRecipient[:]) - return hasher.Sum([]byte{})[:8] + log.Info("Created payload for sealing", "id", id, "elapsed", time.Since(start)) + return api.validForkChoiceResponse(&id), nil + } + return api.validForkChoiceResponse(nil), nil } -func (api *ConsensusAPI) invalid() ExecutePayloadResponse { - if api.light { - return ExecutePayloadResponse{Status: INVALID.Status, LatestValidHash: api.les.BlockChain().CurrentHeader().Hash()} +// validForkChoiceResponse returns the ForkChoiceResponse{VALID} +// with the latest valid hash and an optional payloadID. +func (api *ConsensusAPI) validForkChoiceResponse(id *beacon.PayloadID) beacon.ForkChoiceResponse { + currentHash := api.eth.BlockChain().CurrentBlock().Hash() + return beacon.ForkChoiceResponse{ + PayloadStatus: beacon.PayloadStatusV1{Status: beacon.VALID, LatestValidHash: ¤tHash}, + PayloadID: id, } - return ExecutePayloadResponse{Status: INVALID.Status, LatestValidHash: api.eth.BlockChain().CurrentHeader().Hash()} } -// ExecutePayload creates an Eth1 block, inserts it in the chain, and returns the status of the chain. -func (api *ConsensusAPI) ExecutePayloadV1(params ExecutableDataV1) (ExecutePayloadResponse, error) { - block, err := ExecutableDataToBlock(params) - if err != nil { - return api.invalid(), err - } - if api.light { - parent := api.les.BlockChain().GetHeaderByHash(params.ParentHash) - if parent == nil { - return api.invalid(), fmt.Errorf("could not find parent %x", params.ParentHash) - } - if err = api.les.BlockChain().InsertHeader(block.Header()); err != nil { - return api.invalid(), err - } - return ExecutePayloadResponse{Status: VALID.Status, LatestValidHash: block.Hash()}, nil - } - if !api.eth.BlockChain().HasBlock(block.ParentHash(), block.NumberU64()-1) { - /* - TODO (MariusVanDerWijden) reenable once sync is merged - if err := api.eth.Downloader().BeaconSync(api.eth.SyncMode(), block.Header()); err != nil { - return SYNCING, err - } - */ - // TODO (MariusVanDerWijden) we should return nil here not empty hash - return ExecutePayloadResponse{Status: SYNCING.Status, LatestValidHash: common.Hash{}}, nil +// ExchangeTransitionConfigurationV1 checks the given configuration against +// the configuration of the node. +func (api *ConsensusAPI) ExchangeTransitionConfigurationV1(config beacon.TransitionConfigurationV1) (*beacon.TransitionConfigurationV1, error) { + if config.TerminalTotalDifficulty == nil { + return nil, errors.New("invalid terminal total difficulty") } - parent := api.eth.BlockChain().GetBlockByHash(params.ParentHash) - td := api.eth.BlockChain().GetTd(parent.Hash(), block.NumberU64()-1) ttd := api.eth.BlockChain().Config().TerminalTotalDifficulty - if td.Cmp(ttd) < 0 { - return api.invalid(), fmt.Errorf("can not execute payload on top of block with low td got: %v threshold %v", td, ttd) - } - if err := api.eth.BlockChain().InsertBlockWithoutSetHead(block); err != nil { - return api.invalid(), err - } - - if merger := api.merger(); !merger.TDDReached() { - merger.ReachTTD() + if ttd.Cmp(config.TerminalTotalDifficulty.ToInt()) != 0 { + log.Warn("Invalid TTD configured", "geth", ttd, "beacon", config.TerminalTotalDifficulty) + return nil, fmt.Errorf("invalid ttd: execution %v consensus %v", ttd, config.TerminalTotalDifficulty) + } + + if config.TerminalBlockHash != (common.Hash{}) { + if hash := api.eth.BlockChain().GetCanonicalHash(uint64(config.TerminalBlockNumber)); hash == config.TerminalBlockHash { + return &beacon.TransitionConfigurationV1{ + TerminalTotalDifficulty: (*hexutil.Big)(ttd), + TerminalBlockHash: config.TerminalBlockHash, + TerminalBlockNumber: config.TerminalBlockNumber, + }, nil + } + return nil, fmt.Errorf("invalid terminal block hash") } - return ExecutePayloadResponse{Status: VALID.Status, LatestValidHash: block.Hash()}, nil + return &beacon.TransitionConfigurationV1{TerminalTotalDifficulty: (*hexutil.Big)(ttd)}, nil } -// AssembleBlock creates a new block, inserts it into the chain, and returns the "execution -// data" required for eth2 clients to process the new block. -func (api *ConsensusAPI) assembleBlock(parentHash common.Hash, params *PayloadAttributesV1) (*ExecutableDataV1, error) { - if api.light { - return nil, errors.New("not supported") +// GetPayloadV1 returns a cached payload by id. +func (api *ConsensusAPI) GetPayloadV1(payloadID beacon.PayloadID) (*beacon.ExecutableDataV1, error) { + log.Trace("Engine API request received", "method", "GetPayload", "id", payloadID) + data := api.localBlocks.get(payloadID) + if data == nil { + return nil, &beacon.UnknownPayload } - log.Info("Producing block", "parentHash", parentHash) + return data, nil +} - bc := api.eth.BlockChain() - parent := bc.GetBlockByHash(parentHash) +// NewPayloadV1 creates an Eth1 block, inserts it in the chain, and returns the status of the chain. +func (api *ConsensusAPI) NewPayloadV1(params beacon.ExecutableDataV1) (beacon.PayloadStatusV1, error) { + log.Trace("Engine API request received", "method", "ExecutePayload", "number", params.Number, "hash", params.BlockHash) + block, err := beacon.ExecutableDataToBlock(params) + if err != nil { + log.Debug("Invalid NewPayload params", "params", params, "error", err) + return beacon.PayloadStatusV1{Status: beacon.INVALIDBLOCKHASH}, nil + } + // If we already have the block locally, ignore the entire execution and just + // return a fake success. + if block := api.eth.BlockChain().GetBlockByHash(params.BlockHash); block != nil { + log.Warn("Ignoring already known beacon payload", "number", params.Number, "hash", params.BlockHash, "age", common.PrettyAge(time.Unix(int64(block.Time()), 0))) + hash := block.Hash() + return beacon.PayloadStatusV1{Status: beacon.VALID, LatestValidHash: &hash}, nil + } + // If the parent is missing, we - in theory - could trigger a sync, but that + // would also entail a reorg. That is problematic if multiple sibling blocks + // are being fed to us, and even more so, if some semi-distant uncle shortens + // our live chain. As such, payload execution will not permit reorgs and thus + // will not trigger a sync cycle. That is fine though, if we get a fork choice + // update after legit payload executions. + parent := api.eth.BlockChain().GetBlock(block.ParentHash(), block.NumberU64()-1) if parent == nil { - log.Warn("Cannot assemble block with parent hash to unknown block", "parentHash", parentHash) - return nil, fmt.Errorf("cannot assemble block with unknown parent %s", parentHash) - } - - if params.Timestamp < parent.Time() { - return nil, fmt.Errorf("child timestamp lower than parent's: %d < %d", params.Timestamp, parent.Time()) - } - if now := uint64(time.Now().Unix()); params.Timestamp > now+1 { - diff := time.Duration(params.Timestamp-now) * time.Second - log.Warn("Producing block too far in the future", "diff", common.PrettyDuration(diff)) - } - pending := api.eth.TxPool().Pending(true) - coinbase := params.SuggestedFeeRecipient - num := parent.Number() - header := &types.Header{ - ParentHash: parent.Hash(), - Number: num.Add(num, common.Big1), - Coinbase: coinbase, - GasLimit: parent.GasLimit(), // Keep the gas limit constant in this prototype - Extra: []byte{}, // TODO (MariusVanDerWijden) properly set extra data - Time: params.Timestamp, - } - if config := api.eth.BlockChain().Config(); config.IsLondon(header.Number) { - header.BaseFee = misc.CalcBaseFee(config, parent.Header()) + // Stash the block away for a potential forced forckchoice update to it + // at a later time. + api.remoteBlocks.put(block.Hash(), block.Header()) + + // Although we don't want to trigger a sync, if there is one already in + // progress, try to extend if with the current payload request to relieve + // some strain from the forkchoice update. + if err := api.eth.Downloader().BeaconExtend(api.eth.SyncMode(), block.Header()); err == nil { + log.Debug("Payload accepted for sync extension", "number", params.Number, "hash", params.BlockHash) + return beacon.PayloadStatusV1{Status: beacon.SYNCING}, nil + } + // Either no beacon sync was started yet, or it rejected the delivered + // payload as non-integratable on top of the existing sync. We'll just + // have to rely on the beacon client to forcefully update the head with + // a forkchoice update request. + log.Warn("Ignoring payload with missing parent", "number", params.Number, "hash", params.BlockHash, "parent", params.ParentHash) + return beacon.PayloadStatusV1{Status: beacon.ACCEPTED}, nil + } + // We have an existing parent, do some sanity checks to avoid the beacon client + // triggering too early + var ( + td = api.eth.BlockChain().GetTd(parent.Hash(), parent.NumberU64()) + ttd = api.eth.BlockChain().Config().TerminalTotalDifficulty + ) + if td.Cmp(ttd) < 0 { + log.Warn("Ignoring pre-merge payload", "number", params.Number, "hash", params.BlockHash, "td", td, "ttd", ttd) + return beacon.PayloadStatusV1{Status: beacon.INVALIDTERMINALBLOCK}, nil } - if err := api.engine.Prepare(bc, header); err != nil { - return nil, err + if block.Time() <= parent.Time() { + log.Warn("Invalid timestamp", "parent", block.Time(), "block", block.Time()) + return api.invalid(errors.New("invalid timestamp")), nil } - env, err := api.makeEnv(parent, header) - if err != nil { - return nil, err + if !api.eth.BlockChain().HasBlockAndState(block.ParentHash(), block.NumberU64()-1) { + api.remoteBlocks.put(block.Hash(), block.Header()) + log.Warn("State not available, ignoring new payload") + return beacon.PayloadStatusV1{Status: beacon.ACCEPTED}, nil } - var ( - signer = types.MakeSigner(bc.Config(), header.Number) - txHeap = types.NewTransactionsByPriceAndNonce(signer, pending, nil) - transactions []*types.Transaction - ) - for { - if env.gasPool.Gas() < chainParams.TxGas { - log.Trace("Not enough gas for further transactions", "have", env.gasPool, "want", chainParams.TxGas) - break - } - tx := txHeap.Peek() - if tx == nil { - break - } - - // The sender is only for logging purposes, and it doesn't really matter if it's correct. - from, _ := types.Sender(signer, tx) - - // Execute the transaction - env.state.Prepare(tx.Hash(), env.tcount) - err = env.commitTransaction(tx, coinbase) - switch err { - case core.ErrGasLimitReached: - // Pop the current out-of-gas transaction without shifting in the next from the account - log.Trace("Gas limit exceeded for current block", "sender", from) - txHeap.Pop() - - case core.ErrNonceTooLow: - // New head notification data race between the transaction pool and miner, shift - log.Trace("Skipping transaction with low nonce", "sender", from, "nonce", tx.Nonce()) - txHeap.Shift() - - case core.ErrNonceTooHigh: - // Reorg notification data race between the transaction pool and miner, skip account = - log.Trace("Skipping account with high nonce", "sender", from, "nonce", tx.Nonce()) - txHeap.Pop() - - case nil: - // Everything ok, collect the logs and shift in the next transaction from the same account - env.tcount++ - txHeap.Shift() - transactions = append(transactions, tx) - - default: - // Strange error, discard the transaction and get the next in line (note, the - // nonce-too-high clause will prevent us from executing in vain). - log.Debug("Transaction failed, account skipped", "hash", tx.Hash(), "err", err) - txHeap.Shift() - } + log.Trace("Inserting block without sethead", "hash", block.Hash(), "number", block.Number) + if err := api.eth.BlockChain().InsertBlockWithoutSetHead(block); err != nil { + log.Warn("NewPayloadV1: inserting block failed", "error", err) + return api.invalid(err), nil } - // Create the block. - block, err := api.engine.FinalizeAndAssemble(bc, header, env.state, transactions, nil /* uncles */, env.receipts) - if err != nil { - return nil, err + // We've accepted a valid payload from the beacon client. Mark the local + // chain transitions to notify other subsystems (e.g. downloader) of the + // behavioral change. + if merger := api.eth.Merger(); !merger.TDDReached() { + merger.ReachTTD() + api.eth.Downloader().Cancel() } - return BlockToExecutableData(block, params.Random), nil + hash := block.Hash() + return beacon.PayloadStatusV1{Status: beacon.VALID, LatestValidHash: &hash}, nil } -func encodeTransactions(txs []*types.Transaction) [][]byte { - var enc = make([][]byte, len(txs)) - for i, tx := range txs { - enc[i], _ = tx.MarshalBinary() - } - return enc +// computePayloadId computes a pseudo-random payloadid, based on the parameters. +func computePayloadId(headBlockHash common.Hash, params *beacon.PayloadAttributesV1) beacon.PayloadID { + // Hash + hasher := sha256.New() + hasher.Write(headBlockHash[:]) + binary.Write(hasher, binary.BigEndian, params.Timestamp) + hasher.Write(params.Random[:]) + hasher.Write(params.SuggestedFeeRecipient[:]) + var out beacon.PayloadID + copy(out[:], hasher.Sum(nil)[:8]) + return out } -func decodeTransactions(enc [][]byte) ([]*types.Transaction, error) { - var txs = make([]*types.Transaction, len(enc)) - for i, encTx := range enc { - var tx types.Transaction - if err := tx.UnmarshalBinary(encTx); err != nil { - return nil, fmt.Errorf("invalid transaction %d: %v", i, err) - } - txs[i] = &tx - } - return txs, nil +// invalid returns a response "INVALID" with the latest valid hash set to the current head. +func (api *ConsensusAPI) invalid(err error) beacon.PayloadStatusV1 { + currentHash := api.eth.BlockChain().CurrentHeader().Hash() + errorMsg := err.Error() + return beacon.PayloadStatusV1{Status: beacon.INVALID, LatestValidHash: ¤tHash, ValidationError: &errorMsg} } -func ExecutableDataToBlock(params ExecutableDataV1) (*types.Block, error) { - txs, err := decodeTransactions(params.Transactions) +// assembleBlock creates a new block and returns the "execution +// data" required for beacon clients to process the new block. +func (api *ConsensusAPI) assembleBlock(parentHash common.Hash, params *beacon.PayloadAttributesV1) (*beacon.ExecutableDataV1, error) { + log.Info("Producing block", "parentHash", parentHash) + block, err := api.eth.Miner().GetSealingBlock(parentHash, params.Timestamp, params.SuggestedFeeRecipient, params.Random) if err != nil { return nil, err } - if len(params.ExtraData) > 32 { - return nil, fmt.Errorf("invalid extradata length: %v", len(params.ExtraData)) - } - number := big.NewInt(0) - number.SetUint64(params.Number) - header := &types.Header{ - ParentHash: params.ParentHash, - UncleHash: types.EmptyUncleHash, - Coinbase: params.FeeRecipient, - Root: params.StateRoot, - TxHash: types.DeriveSha(types.Transactions(txs), trie.NewStackTrie(nil)), - ReceiptHash: params.ReceiptsRoot, - Bloom: types.BytesToBloom(params.LogsBloom), - Difficulty: common.Big0, - Number: number, - GasLimit: params.GasLimit, - GasUsed: params.GasUsed, - Time: params.Timestamp, - BaseFee: params.BaseFeePerGas, - Extra: params.ExtraData, - // TODO (MariusVanDerWijden) add params.Random to header once required - } - block := types.NewBlockWithHeader(header).WithBody(txs, nil /* uncles */) - if block.Hash() != params.BlockHash { - return nil, fmt.Errorf("blockhash mismatch, want %x, got %x", params.BlockHash, block.Hash()) - } - return block, nil -} - -func BlockToExecutableData(block *types.Block, random common.Hash) *ExecutableDataV1 { - return &ExecutableDataV1{ - BlockHash: block.Hash(), - ParentHash: block.ParentHash(), - FeeRecipient: block.Coinbase(), - StateRoot: block.Root(), - Number: block.NumberU64(), - GasLimit: block.GasLimit(), - GasUsed: block.GasUsed(), - BaseFeePerGas: block.BaseFee(), - Timestamp: block.Time(), - ReceiptsRoot: block.ReceiptHash(), - LogsBloom: block.Bloom().Bytes(), - Transactions: encodeTransactions(block.Transactions()), - Random: random, - ExtraData: block.Extra(), - } + return beacon.BlockToExecutableData(block), nil } // Used in tests to add a the list of transactions from a block to the tx pool. @@ -467,70 +357,3 @@ func (api *ConsensusAPI) insertTransactions(txs types.Transactions) error { } return nil } - -func (api *ConsensusAPI) checkTerminalTotalDifficulty(head common.Hash) error { - // shortcut if we entered PoS already - if api.merger().PoSFinalized() { - return nil - } - // make sure the parent has enough terminal total difficulty - newHeadBlock := api.eth.BlockChain().GetBlockByHash(head) - if newHeadBlock == nil { - return &GenericServerError - } - td := api.eth.BlockChain().GetTd(newHeadBlock.Hash(), newHeadBlock.NumberU64()) - if td != nil && td.Cmp(api.eth.BlockChain().Config().TerminalTotalDifficulty) < 0 { - return &InvalidTB - } - return nil -} - -// setHead is called to perform a force choice. -func (api *ConsensusAPI) setHead(newHead common.Hash) error { - log.Info("Setting head", "head", newHead) - if api.light { - headHeader := api.les.BlockChain().CurrentHeader() - if headHeader.Hash() == newHead { - return nil - } - newHeadHeader := api.les.BlockChain().GetHeaderByHash(newHead) - if newHeadHeader == nil { - return &GenericServerError - } - if err := api.les.BlockChain().SetChainHead(newHeadHeader); err != nil { - return err - } - // Trigger the transition if it's the first `NewHead` event. - merger := api.merger() - if !merger.PoSFinalized() { - merger.FinalizePoS() - } - return nil - } - headBlock := api.eth.BlockChain().CurrentBlock() - if headBlock.Hash() == newHead { - return nil - } - newHeadBlock := api.eth.BlockChain().GetBlockByHash(newHead) - if newHeadBlock == nil { - return &GenericServerError - } - if err := api.eth.BlockChain().SetChainHead(newHeadBlock); err != nil { - return err - } - // Trigger the transition if it's the first `NewHead` event. - if merger := api.merger(); !merger.PoSFinalized() { - merger.FinalizePoS() - } - // TODO (MariusVanDerWijden) are we really synced now? - api.eth.SetSynced() - return nil -} - -// Helper function, return the merger instance. -func (api *ConsensusAPI) merger() *consensus.Merger { - if api.light { - return api.les.Merger() - } - return api.eth.Merger() -} diff --git a/eth/catalyst/api_test.go b/eth/catalyst/api_test.go index 1f1f017e5e..a9b0fd19cc 100644 --- a/eth/catalyst/api_test.go +++ b/eth/catalyst/api_test.go @@ -17,6 +17,7 @@ package catalyst import ( + "fmt" "math/big" "testing" "time" @@ -25,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/beacon" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -44,36 +46,16 @@ var ( testBalance = big.NewInt(2e18) ) -func generateTestChain() (*core.Genesis, []*types.Block) { - db := rawdb.NewMemoryDatabase() - config := params.AllEthashProtocolChanges - genesis := &core.Genesis{ - Config: config, - Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, - ExtraData: []byte("test genesis"), - Timestamp: 9000, - BaseFee: big.NewInt(params.InitialBaseFee), - } - generate := func(i int, g *core.BlockGen) { - g.OffsetTime(5) - g.SetExtra([]byte("test")) - } - gblock := genesis.ToBlock(db) - engine := ethash.NewFaker() - blocks, _ := core.GenerateChain(config, gblock, engine, db, 10, generate) - blocks = append([]*types.Block{gblock}, blocks...) - return genesis, blocks -} - func generatePreMergeChain(n int) (*core.Genesis, []*types.Block) { db := rawdb.NewMemoryDatabase() config := params.AllEthashProtocolChanges genesis := &core.Genesis{ - Config: config, - Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, - ExtraData: []byte("test genesis"), - Timestamp: 9000, - BaseFee: big.NewInt(params.InitialBaseFee), + Config: config, + Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, + ExtraData: []byte("test genesis"), + Timestamp: 9000, + BaseFee: big.NewInt(params.InitialBaseFee), + Difficulty: big.NewInt(0), } testNonce := uint64(0) generate := func(i int, g *core.BlockGen) { @@ -101,14 +83,14 @@ func TestEth2AssembleBlock(t *testing.T) { n, ethservice := startEthService(t, genesis, blocks) defer n.Close() - api := NewConsensusAPI(ethservice, nil) + api := NewConsensusAPI(ethservice) signer := types.NewEIP155Signer(ethservice.BlockChain().Config().ChainID) tx, err := types.SignTx(types.NewTransaction(uint64(10), blocks[9].Coinbase(), big.NewInt(1000), params.TxGas, big.NewInt(params.InitialBaseFee), nil), signer, testKey) if err != nil { t.Fatalf("error signing transaction, err=%v", err) } ethservice.TxPool().AddLocal(tx) - blockParams := PayloadAttributesV1{ + blockParams := beacon.PayloadAttributesV1{ Timestamp: blocks[9].Time() + 5, } execData, err := api.assembleBlock(blocks[9].Hash(), &blockParams) @@ -127,11 +109,11 @@ func TestEth2AssembleBlockWithAnotherBlocksTxs(t *testing.T) { n, ethservice := startEthService(t, genesis, blocks[:9]) defer n.Close() - api := NewConsensusAPI(ethservice, nil) + api := NewConsensusAPI(ethservice) // Put the 10th block's tx in the pool and produce a new block api.insertTransactions(blocks[9].Transactions()) - blockParams := PayloadAttributesV1{ + blockParams := beacon.PayloadAttributesV1{ Timestamp: blocks[8].Time() + 5, } execData, err := api.assembleBlock(blocks[8].Hash(), &blockParams) @@ -148,48 +130,61 @@ func TestSetHeadBeforeTotalDifficulty(t *testing.T) { n, ethservice := startEthService(t, genesis, blocks) defer n.Close() - api := NewConsensusAPI(ethservice, nil) - fcState := ForkchoiceStateV1{ + api := NewConsensusAPI(ethservice) + fcState := beacon.ForkchoiceStateV1{ HeadBlockHash: blocks[5].Hash(), SafeBlockHash: common.Hash{}, FinalizedBlockHash: common.Hash{}, } - if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err == nil { - t.Errorf("fork choice updated before total terminal difficulty should fail") + if resp, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil { + t.Errorf("fork choice updated should not error: %v", err) + } else if resp.PayloadStatus.Status != beacon.INVALIDTERMINALBLOCK { + t.Errorf("fork choice updated before total terminal difficulty should be INVALID") } } func TestEth2PrepareAndGetPayload(t *testing.T) { - genesis, blocks := generatePreMergeChain(10) - // We need to properly set the terminal total difficulty - genesis.Config.TerminalTotalDifficulty.Sub(genesis.Config.TerminalTotalDifficulty, blocks[9].Difficulty()) - n, ethservice := startEthService(t, genesis, blocks[:9]) - defer n.Close() + // TODO (MariusVanDerWijden) TestEth2PrepareAndGetPayload is currently broken, fixed in upcoming merge-kiln-v2 pr + /* + genesis, blocks := generatePreMergeChain(10) + // We need to properly set the terminal total difficulty + genesis.Config.TerminalTotalDifficulty.Sub(genesis.Config.TerminalTotalDifficulty, blocks[9].Difficulty()) + n, ethservice := startEthService(t, genesis, blocks[:9]) + defer n.Close() - api := NewConsensusAPI(ethservice, nil) + api := NewConsensusAPI(ethservice) - // Put the 10th block's tx in the pool and produce a new block - api.insertTransactions(blocks[9].Transactions()) - blockParams := PayloadAttributesV1{ - Timestamp: blocks[8].Time() + 5, - } - fcState := ForkchoiceStateV1{ - HeadBlockHash: blocks[8].Hash(), - SafeBlockHash: common.Hash{}, - FinalizedBlockHash: common.Hash{}, - } - _, err := api.ForkchoiceUpdatedV1(fcState, &blockParams) - if err != nil { - t.Fatalf("error preparing payload, err=%v", err) - } - payloadID := computePayloadId(fcState.HeadBlockHash, &blockParams) - execData, err := api.GetPayloadV1(hexutil.Bytes(payloadID)) - if err != nil { - t.Fatalf("error getting payload, err=%v", err) - } - if len(execData.Transactions) != blocks[9].Transactions().Len() { - t.Fatalf("invalid number of transactions %d != 1", len(execData.Transactions)) - } + // Put the 10th block's tx in the pool and produce a new block + api.insertTransactions(blocks[9].Transactions()) + blockParams := beacon.PayloadAttributesV1{ + Timestamp: blocks[8].Time() + 5, + } + fcState := beacon.ForkchoiceStateV1{ + HeadBlockHash: blocks[8].Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + _, err := api.ForkchoiceUpdatedV1(fcState, &blockParams) + if err != nil { + t.Fatalf("error preparing payload, err=%v", err) + } + payloadID := computePayloadId(fcState.HeadBlockHash, &blockParams) + execData, err := api.GetPayloadV1(payloadID) + if err != nil { + t.Fatalf("error getting payload, err=%v", err) + } + if len(execData.Transactions) != blocks[9].Transactions().Len() { + t.Fatalf("invalid number of transactions %d != 1", len(execData.Transactions)) + } + // Test invalid payloadID + var invPayload beacon.PayloadID + copy(invPayload[:], payloadID[:]) + invPayload[0] = ^invPayload[0] + _, err = api.GetPayloadV1(invPayload) + if err == nil { + t.Fatal("expected error retrieving invalid payload") + } + */ } func checkLogEvents(t *testing.T, logsCh <-chan []*types.Log, rmLogsCh <-chan core.RemovedLogsEvent, wantNew, wantRemoved int) { @@ -210,16 +205,60 @@ func checkLogEvents(t *testing.T, logsCh <-chan []*types.Log, rmLogsCh <-chan co } } +func TestInvalidPayloadTimestamp(t *testing.T) { + genesis, preMergeBlocks := generatePreMergeChain(10) + n, ethservice := startEthService(t, genesis, preMergeBlocks) + ethservice.Merger().ReachTTD() + defer n.Close() + var ( + api = NewConsensusAPI(ethservice) + parent = ethservice.BlockChain().CurrentBlock() + ) + tests := []struct { + time uint64 + shouldErr bool + }{ + {0, true}, + {parent.Time(), true}, + {parent.Time() - 1, true}, + + // TODO (MariusVanDerWijden) following tests are currently broken, + // fixed in upcoming merge-kiln-v2 pr + //{parent.Time() + 1, false}, + //{uint64(time.Now().Unix()) + uint64(time.Minute), false}, + } + + for i, test := range tests { + t.Run(fmt.Sprintf("Timestamp test: %v", i), func(t *testing.T) { + params := beacon.PayloadAttributesV1{ + Timestamp: test.time, + Random: crypto.Keccak256Hash([]byte{byte(123)}), + SuggestedFeeRecipient: parent.Coinbase(), + } + fcState := beacon.ForkchoiceStateV1{ + HeadBlockHash: parent.Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + _, err := api.ForkchoiceUpdatedV1(fcState, ¶ms) + if test.shouldErr && err == nil { + t.Fatalf("expected error preparing payload with invalid timestamp, err=%v", err) + } else if !test.shouldErr && err != nil { + t.Fatalf("error preparing payload with valid timestamp, err=%v", err) + } + }) + } +} + func TestEth2NewBlock(t *testing.T) { t.Skip("ETH2 in Bor") - genesis, preMergeBlocks := generatePreMergeChain(10) n, ethservice := startEthService(t, genesis, preMergeBlocks) ethservice.Merger().ReachTTD() defer n.Close() var ( - api = NewConsensusAPI(ethservice, nil) + api = NewConsensusAPI(ethservice) parent = preMergeBlocks[len(preMergeBlocks)-1] // This EVM code generates a log when the contract is created. @@ -237,17 +276,17 @@ func TestEth2NewBlock(t *testing.T) { tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey) ethservice.TxPool().AddLocal(tx) - execData, err := api.assembleBlock(parent.Hash(), &PayloadAttributesV1{ + execData, err := api.assembleBlock(parent.Hash(), &beacon.PayloadAttributesV1{ Timestamp: parent.Time() + 5, }) if err != nil { t.Fatalf("Failed to create the executable data %v", err) } - block, err := ExecutableDataToBlock(*execData) + block, err := beacon.ExecutableDataToBlock(*execData) if err != nil { t.Fatalf("Failed to convert executable data to block %v", err) } - newResp, err := api.ExecutePayloadV1(*execData) + newResp, err := api.NewPayloadV1(*execData) if err != nil || newResp.Status != "VALID" { t.Fatalf("Failed to insert block: %v", err) } @@ -255,7 +294,7 @@ func TestEth2NewBlock(t *testing.T) { t.Fatalf("Chain head shouldn't be updated") } checkLogEvents(t, newLogCh, rmLogsCh, 0, 0) - fcState := ForkchoiceStateV1{ + fcState := beacon.ForkchoiceStateV1{ HeadBlockHash: block.Hash(), SafeBlockHash: block.Hash(), FinalizedBlockHash: block.Hash(), @@ -277,17 +316,17 @@ func TestEth2NewBlock(t *testing.T) { ) parent = preMergeBlocks[len(preMergeBlocks)-1] for i := 0; i < 10; i++ { - execData, err := api.assembleBlock(parent.Hash(), &PayloadAttributesV1{ + execData, err := api.assembleBlock(parent.Hash(), &beacon.PayloadAttributesV1{ Timestamp: parent.Time() + 6, }) if err != nil { t.Fatalf("Failed to create the executable data %v", err) } - block, err := ExecutableDataToBlock(*execData) + block, err := beacon.ExecutableDataToBlock(*execData) if err != nil { t.Fatalf("Failed to convert executable data to block %v", err) } - newResp, err := api.ExecutePayloadV1(*execData) + newResp, err := api.NewPayloadV1(*execData) if err != nil || newResp.Status != "VALID" { t.Fatalf("Failed to insert block: %v", err) } @@ -295,7 +334,7 @@ func TestEth2NewBlock(t *testing.T) { t.Fatalf("Chain head shouldn't be updated") } - fcState := ForkchoiceStateV1{ + fcState := beacon.ForkchoiceStateV1{ HeadBlockHash: block.Hash(), SafeBlockHash: block.Hash(), FinalizedBlockHash: block.Hash(), @@ -391,7 +430,7 @@ func TestFullAPI(t *testing.T) { ethservice.Merger().ReachTTD() defer n.Close() var ( - api = NewConsensusAPI(ethservice, nil) + api = NewConsensusAPI(ethservice) parent = ethservice.BlockChain().CurrentBlock() // This EVM code generates a log when the contract is created. logCode = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") @@ -402,12 +441,13 @@ func TestFullAPI(t *testing.T) { tx, _ := types.SignTx(types.NewContractCreation(nonce, new(big.Int), 1000000, big.NewInt(2*params.InitialBaseFee), logCode), types.LatestSigner(ethservice.BlockChain().Config()), testKey) ethservice.TxPool().AddLocal(tx) - params := PayloadAttributesV1{ + params := beacon.PayloadAttributesV1{ Timestamp: parent.Time() + 1, Random: crypto.Keccak256Hash([]byte{byte(i)}), SuggestedFeeRecipient: parent.Coinbase(), } - fcState := ForkchoiceStateV1{ + + fcState := beacon.ForkchoiceStateV1{ HeadBlockHash: parent.Hash(), SafeBlockHash: common.Hash{}, FinalizedBlockHash: common.Hash{}, @@ -416,22 +456,21 @@ func TestFullAPI(t *testing.T) { if err != nil { t.Fatalf("error preparing payload, err=%v", err) } - if resp.Status != SUCCESS.Status { - t.Fatalf("error preparing payload, invalid status: %v", resp.Status) + if resp.PayloadStatus.Status != beacon.VALID { + t.Fatalf("error preparing payload, invalid status: %v", resp.PayloadStatus.Status) } - payloadID := computePayloadId(parent.Hash(), ¶ms) - payload, err := api.GetPayloadV1(hexutil.Bytes(payloadID)) + payload, err := api.GetPayloadV1(*resp.PayloadID) if err != nil { t.Fatalf("can't get payload: %v", err) } - execResp, err := api.ExecutePayloadV1(*payload) + execResp, err := api.NewPayloadV1(*payload) if err != nil { t.Fatalf("can't execute payload: %v", err) } - if execResp.Status != VALID.Status { + if execResp.Status != beacon.VALID { t.Fatalf("invalid status: %v", execResp.Status) } - fcState = ForkchoiceStateV1{ + fcState = beacon.ForkchoiceStateV1{ HeadBlockHash: payload.BlockHash, SafeBlockHash: payload.ParentHash, FinalizedBlockHash: payload.ParentHash, @@ -443,6 +482,51 @@ func TestFullAPI(t *testing.T) { t.Fatalf("Chain head should be updated") } parent = ethservice.BlockChain().CurrentBlock() + } +} +func TestExchangeTransitionConfig(t *testing.T) { + genesis, preMergeBlocks := generatePreMergeChain(10) + n, ethservice := startEthService(t, genesis, preMergeBlocks) + ethservice.Merger().ReachTTD() + defer n.Close() + var ( + api = NewConsensusAPI(ethservice) + ) + // invalid ttd + config := beacon.TransitionConfigurationV1{ + TerminalTotalDifficulty: (*hexutil.Big)(big.NewInt(0)), + TerminalBlockHash: common.Hash{}, + TerminalBlockNumber: 0, + } + if _, err := api.ExchangeTransitionConfigurationV1(config); err == nil { + t.Fatal("expected error on invalid config, invalid ttd") + } + // invalid terminal block hash + config = beacon.TransitionConfigurationV1{ + TerminalTotalDifficulty: (*hexutil.Big)(genesis.Config.TerminalTotalDifficulty), + TerminalBlockHash: common.Hash{1}, + TerminalBlockNumber: 0, + } + if _, err := api.ExchangeTransitionConfigurationV1(config); err == nil { + t.Fatal("expected error on invalid config, invalid hash") + } + // valid config + config = beacon.TransitionConfigurationV1{ + TerminalTotalDifficulty: (*hexutil.Big)(genesis.Config.TerminalTotalDifficulty), + TerminalBlockHash: common.Hash{}, + TerminalBlockNumber: 0, + } + if _, err := api.ExchangeTransitionConfigurationV1(config); err != nil { + t.Fatalf("expected no error on valid config, got %v", err) + } + // valid config + config = beacon.TransitionConfigurationV1{ + TerminalTotalDifficulty: (*hexutil.Big)(genesis.Config.TerminalTotalDifficulty), + TerminalBlockHash: preMergeBlocks[5].Hash(), + TerminalBlockNumber: 6, + } + if _, err := api.ExchangeTransitionConfigurationV1(config); err != nil { + t.Fatalf("expected no error on valid config, got %v", err) } } diff --git a/eth/catalyst/api_types.go b/eth/catalyst/api_types.go deleted file mode 100644 index 1f6703030a..0000000000 --- a/eth/catalyst/api_types.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2020 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 . - -package catalyst - -import ( - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" -) - -//go:generate go run github.com/fjl/gencodec -type PayloadAttributesV1 -field-override payloadAttributesMarshaling -out gen_blockparams.go - -// Structure described at https://github.com/ethereum/execution-apis/pull/74 -type PayloadAttributesV1 struct { - Timestamp uint64 `json:"timestamp" gencodec:"required"` - Random common.Hash `json:"random" gencodec:"required"` - SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` -} - -// JSON type overrides for PayloadAttributesV1. -type payloadAttributesMarshaling struct { - Timestamp hexutil.Uint64 -} - -//go:generate go run github.com/fjl/gencodec -type ExecutableDataV1 -field-override executableDataMarshaling -out gen_ed.go - -// Structure described at https://github.com/ethereum/execution-apis/src/engine/specification.md -type ExecutableDataV1 struct { - ParentHash common.Hash `json:"parentHash" gencodec:"required"` - FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` - StateRoot common.Hash `json:"stateRoot" gencodec:"required"` - ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` - LogsBloom []byte `json:"logsBloom" gencodec:"required"` - Random common.Hash `json:"random" gencodec:"required"` - Number uint64 `json:"blockNumber" gencodec:"required"` - GasLimit uint64 `json:"gasLimit" gencodec:"required"` - GasUsed uint64 `json:"gasUsed" gencodec:"required"` - Timestamp uint64 `json:"timestamp" gencodec:"required"` - ExtraData []byte `json:"extraData" gencodec:"required"` - BaseFeePerGas *big.Int `json:"baseFeePerGas" gencodec:"required"` - BlockHash common.Hash `json:"blockHash" gencodec:"required"` - Transactions [][]byte `json:"transactions" gencodec:"required"` -} - -// JSON type overrides for executableData. -type executableDataMarshaling struct { - Number hexutil.Uint64 - GasLimit hexutil.Uint64 - GasUsed hexutil.Uint64 - Timestamp hexutil.Uint64 - BaseFeePerGas *hexutil.Big - ExtraData hexutil.Bytes - LogsBloom hexutil.Bytes - Transactions []hexutil.Bytes -} - -//go:generate go run github.com/fjl/gencodec -type PayloadResponse -field-override payloadResponseMarshaling -out gen_payload.go - -type PayloadResponse struct { - PayloadID uint64 `json:"payloadId"` -} - -// JSON type overrides for payloadResponse. -type payloadResponseMarshaling struct { - PayloadID hexutil.Uint64 -} - -type NewBlockResponse struct { - Valid bool `json:"valid"` -} - -type GenericResponse struct { - Success bool `json:"success"` -} - -type GenericStringResponse struct { - Status string `json:"status"` -} - -type ExecutePayloadResponse struct { - Status string `json:"status"` - LatestValidHash common.Hash `json:"latestValidHash"` -} - -type ConsensusValidatedParams struct { - BlockHash common.Hash `json:"blockHash"` - Status string `json:"status"` -} - -type ForkChoiceResponse struct { - Status string `json:"status"` - PayloadID *hexutil.Bytes `json:"payloadId"` -} - -type ForkchoiceStateV1 struct { - HeadBlockHash common.Hash `json:"headBlockHash"` - SafeBlockHash common.Hash `json:"safeBlockHash"` - FinalizedBlockHash common.Hash `json:"finalizedBlockHash"` -} diff --git a/eth/catalyst/gen_payload.go b/eth/catalyst/gen_payload.go deleted file mode 100644 index a0b00fcfd8..0000000000 --- a/eth/catalyst/gen_payload.go +++ /dev/null @@ -1,36 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package catalyst - -import ( - "encoding/json" - - "github.com/ethereum/go-ethereum/common/hexutil" -) - -var _ = (*payloadResponseMarshaling)(nil) - -// MarshalJSON marshals as JSON. -func (p PayloadResponse) MarshalJSON() ([]byte, error) { - type PayloadResponse struct { - PayloadID hexutil.Uint64 `json:"payloadId"` - } - var enc PayloadResponse - enc.PayloadID = hexutil.Uint64(p.PayloadID) - return json.Marshal(&enc) -} - -// UnmarshalJSON unmarshals from JSON. -func (p *PayloadResponse) UnmarshalJSON(input []byte) error { - type PayloadResponse struct { - PayloadID *hexutil.Uint64 `json:"payloadId"` - } - var dec PayloadResponse - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.PayloadID != nil { - p.PayloadID = uint64(*dec.PayloadID) - } - return nil -} diff --git a/eth/catalyst/queue.go b/eth/catalyst/queue.go new file mode 100644 index 0000000000..ffb2f56bf4 --- /dev/null +++ b/eth/catalyst/queue.go @@ -0,0 +1,135 @@ +// Copyright 2022 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 . + +package catalyst + +import ( + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/beacon" + "github.com/ethereum/go-ethereum/core/types" +) + +// maxTrackedPayloads is the maximum number of prepared payloads the execution +// engine tracks before evicting old ones. Ideally we should only ever track the +// latest one; but have a slight wiggle room for non-ideal conditions. +const maxTrackedPayloads = 10 + +// maxTrackedHeaders is the maximum number of executed payloads the execution +// engine tracks before evicting old ones. Ideally we should only ever track the +// latest one; but have a slight wiggle room for non-ideal conditions. +const maxTrackedHeaders = 10 + +// payloadQueueItem represents an id->payload tuple to store until it's retrieved +// or evicted. +type payloadQueueItem struct { + id beacon.PayloadID + payload *beacon.ExecutableDataV1 +} + +// payloadQueue tracks the latest handful of constructed payloads to be retrieved +// by the beacon chain if block production is requested. +type payloadQueue struct { + payloads []*payloadQueueItem + lock sync.RWMutex +} + +// newPayloadQueue creates a pre-initialized queue with a fixed number of slots +// all containing empty items. +func newPayloadQueue() *payloadQueue { + return &payloadQueue{ + payloads: make([]*payloadQueueItem, maxTrackedPayloads), + } +} + +// put inserts a new payload into the queue at the given id. +func (q *payloadQueue) put(id beacon.PayloadID, data *beacon.ExecutableDataV1) { + q.lock.Lock() + defer q.lock.Unlock() + + copy(q.payloads[1:], q.payloads) + q.payloads[0] = &payloadQueueItem{ + id: id, + payload: data, + } +} + +// get retrieves a previously stored payload item or nil if it does not exist. +func (q *payloadQueue) get(id beacon.PayloadID) *beacon.ExecutableDataV1 { + q.lock.RLock() + defer q.lock.RUnlock() + + for _, item := range q.payloads { + if item == nil { + return nil // no more items + } + if item.id == id { + return item.payload + } + } + return nil +} + +// headerQueueItem represents an hash->header tuple to store until it's retrieved +// or evicted. +type headerQueueItem struct { + hash common.Hash + header *types.Header +} + +// headerQueue tracks the latest handful of constructed headers to be retrieved +// by the beacon chain if block production is requested. +type headerQueue struct { + headers []*headerQueueItem + lock sync.RWMutex +} + +// newHeaderQueue creates a pre-initialized queue with a fixed number of slots +// all containing empty items. +func newHeaderQueue() *headerQueue { + return &headerQueue{ + headers: make([]*headerQueueItem, maxTrackedHeaders), + } +} + +// put inserts a new header into the queue at the given hash. +func (q *headerQueue) put(hash common.Hash, data *types.Header) { + q.lock.Lock() + defer q.lock.Unlock() + + copy(q.headers[1:], q.headers) + q.headers[0] = &headerQueueItem{ + hash: hash, + header: data, + } +} + +// get retrieves a previously stored header item or nil if it does not exist. +func (q *headerQueue) get(hash common.Hash) *types.Header { + q.lock.RLock() + defer q.lock.RUnlock() + + for _, item := range q.headers { + if item == nil { + return nil // no more items + } + if item.hash == hash { + return item.header + } + } + return nil +} diff --git a/eth/downloader/beaconsync.go b/eth/downloader/beaconsync.go new file mode 100644 index 0000000000..d8ea58c239 --- /dev/null +++ b/eth/downloader/beaconsync.go @@ -0,0 +1,308 @@ +// Copyright 2021 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 . + +package downloader + +import ( + "fmt" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" +) + +// beaconBackfiller is the chain and state backfilling that can be commenced once +// the skeleton syncer has successfully reverse downloaded all the headers up to +// the genesis block or an existing header in the database. Its operation is fully +// directed by the skeleton sync's head/tail events. +type beaconBackfiller struct { + downloader *Downloader // Downloader to direct via this callback implementation + syncMode SyncMode // Sync mode to use for backfilling the skeleton chains + success func() // Callback to run on successful sync cycle completion + filling bool // Flag whether the downloader is backfilling or not + started chan struct{} // Notification channel whether the downloader inited + lock sync.Mutex // Mutex protecting the sync lock +} + +// newBeaconBackfiller is a helper method to create the backfiller. +func newBeaconBackfiller(dl *Downloader, success func()) backfiller { + return &beaconBackfiller{ + downloader: dl, + success: success, + } +} + +// suspend cancels any background downloader threads. +func (b *beaconBackfiller) suspend() { + // If no filling is running, don't waste cycles + b.lock.Lock() + filling := b.filling + started := b.started + b.lock.Unlock() + + if !filling { + return + } + // A previous filling should be running, though it may happen that it hasn't + // yet started (being done on a new goroutine). Many concurrent beacon head + // announcements can lead to sync start/stop thrashing. In that case we need + // to wait for initialization before we can safely cancel it. It is safe to + // read this channel multiple times, it gets closed on startup. + <-started + + // Now that we're sure the downloader successfully started up, we can cancel + // it safely without running the risk of data races. + b.downloader.Cancel() +} + +// resume starts the downloader threads for backfilling state and chain data. +func (b *beaconBackfiller) resume() { + b.lock.Lock() + if b.filling { + // If a previous filling cycle is still running, just ignore this start + // request. // TODO(karalabe): We should make this channel driven + b.lock.Unlock() + return + } + b.filling = true + b.started = make(chan struct{}) + mode := b.syncMode + b.lock.Unlock() + + // Start the backfilling on its own thread since the downloader does not have + // its own lifecycle runloop. + go func() { + // Set the backfiller to non-filling when download completes + defer func() { + b.lock.Lock() + b.filling = false + b.lock.Unlock() + }() + // If the downloader fails, report an error as in beacon chain mode there + // should be no errors as long as the chain we're syncing to is valid. + if err := b.downloader.synchronise("", common.Hash{}, nil, nil, mode, true, b.started); err != nil { + log.Error("Beacon backfilling failed", "err", err) + return + } + // Synchronization succeeded. Since this happens async, notify the outer + // context to disable snap syncing and enable transaction propagation. + if b.success != nil { + b.success() + } + }() +} + +// setMode updates the sync mode from the current one to the requested one. If +// there's an active sync in progress, it will be cancelled and restarted. +func (b *beaconBackfiller) setMode(mode SyncMode) { + // Update the old sync mode and track if it was changed + b.lock.Lock() + updated := b.syncMode != mode + filling := b.filling + b.syncMode = mode + b.lock.Unlock() + + // If the sync mode was changed mid-sync, restart. This should never ever + // really happen, we just handle it to detect programming errors. + if !updated || !filling { + return + } + log.Error("Downloader sync mode changed mid-run", "old", mode.String(), "new", mode.String()) + b.suspend() + b.resume() +} + +// BeaconSync is the post-merge version of the chain synchronization, where the +// chain is not downloaded from genesis onward, rather from trusted head announces +// backwards. +// +// Internally backfilling and state sync is done the same way, but the header +// retrieval and scheduling is replaced. +func (d *Downloader) BeaconSync(mode SyncMode, head *types.Header) error { + return d.beaconSync(mode, head, true) +} + +// BeaconExtend is an optimistic version of BeaconSync, where an attempt is made +// to extend the current beacon chain with a new header, but in case of a mismatch, +// the old sync will not be terminated and reorged, rather the new head is dropped. +// +// This is useful if a beacon client is feeding us large chunks of payloads to run, +// but is not setting the head after each. +func (d *Downloader) BeaconExtend(mode SyncMode, head *types.Header) error { + return d.beaconSync(mode, head, false) +} + +// beaconSync is the post-merge version of the chain synchronization, where the +// chain is not downloaded from genesis onward, rather from trusted head announces +// backwards. +// +// Internally backfilling and state sync is done the same way, but the header +// retrieval and scheduling is replaced. +func (d *Downloader) beaconSync(mode SyncMode, head *types.Header, force bool) error { + // When the downloader starts a sync cycle, it needs to be aware of the sync + // mode to use (full, snap). To keep the skeleton chain oblivious, inject the + // mode into the backfiller directly. + // + // Super crazy dangerous type cast. Should be fine (TM), we're only using a + // different backfiller implementation for skeleton tests. + d.skeleton.filler.(*beaconBackfiller).setMode(mode) + + // Signal the skeleton sync to switch to a new head, however it wants + if err := d.skeleton.Sync(head, force); err != nil { + return err + } + return nil +} + +// findBeaconAncestor tries to locate the common ancestor link of the local chain +// and the beacon chain just requested. In the general case when our node was in +// sync and on the correct chain, checking the top N links should already get us +// a match. In the rare scenario when we ended up on a long reorganisation (i.e. +// none of the head links match), we do a binary search to find the ancestor. +func (d *Downloader) findBeaconAncestor() (uint64, error) { + // Figure out the current local head position + var chainHead *types.Header + + switch d.getMode() { + case FullSync: + chainHead = d.blockchain.CurrentBlock().Header() + case SnapSync: + chainHead = d.blockchain.CurrentFastBlock().Header() + default: + chainHead = d.lightchain.CurrentHeader() + } + number := chainHead.Number.Uint64() + + // Retrieve the skeleton bounds and ensure they are linked to the local chain + beaconHead, beaconTail, err := d.skeleton.Bounds() + if err != nil { + // This is a programming error. The chain backfiller was called with an + // invalid beacon sync state. Ideally we would panic here, but erroring + // gives us at least a remote chance to recover. It's still a big fault! + log.Error("Failed to retrieve beacon bounds", "err", err) + return 0, err + } + var linked bool + switch d.getMode() { + case FullSync: + linked = d.blockchain.HasBlock(beaconTail.ParentHash, beaconTail.Number.Uint64()-1) + case SnapSync: + linked = d.blockchain.HasFastBlock(beaconTail.ParentHash, beaconTail.Number.Uint64()-1) + default: + linked = d.blockchain.HasHeader(beaconTail.ParentHash, beaconTail.Number.Uint64()-1) + } + if !linked { + // This is a programming error. The chain backfiller was called with a + // tail that's not linked to the local chain. Whilst this should never + // happen, there might be some weirdnesses if beacon sync backfilling + // races with the user (or beacon client) calling setHead. Whilst panic + // would be the ideal thing to do, it is safer long term to attempt a + // recovery and fix any noticed issue after the fact. + log.Error("Beacon sync linkup unavailable", "number", beaconTail.Number.Uint64()-1, "hash", beaconTail.ParentHash) + return 0, fmt.Errorf("beacon linkup unavailable locally: %d [%x]", beaconTail.Number.Uint64()-1, beaconTail.ParentHash) + } + // Binary search to find the ancestor + start, end := beaconTail.Number.Uint64()-1, number + if number := beaconHead.Number.Uint64(); end > number { + // This shouldn't really happen in a healty network, but if the consensus + // clients feeds us a shorter chain as the canonical, we should not attempt + // to access non-existent skeleton items. + log.Warn("Beacon head lower than local chain", "beacon", number, "local", end) + end = number + } + for start+1 < end { + // Split our chain interval in two, and request the hash to cross check + check := (start + end) / 2 + + h := d.skeleton.Header(check) + n := h.Number.Uint64() + + var known bool + switch d.getMode() { + case FullSync: + known = d.blockchain.HasBlock(h.Hash(), n) + case SnapSync: + known = d.blockchain.HasFastBlock(h.Hash(), n) + default: + known = d.lightchain.HasHeader(h.Hash(), n) + } + if !known { + end = check + continue + } + start = check + } + return start, nil +} + +// fetchBeaconHeaders feeds skeleton headers to the downloader queue for scheduling +// until sync errors or is finished. +func (d *Downloader) fetchBeaconHeaders(from uint64) error { + head, _, err := d.skeleton.Bounds() + if err != nil { + return err + } + for { + // Retrieve a batch of headers and feed it to the header processor + var ( + headers = make([]*types.Header, 0, maxHeadersProcess) + hashes = make([]common.Hash, 0, maxHeadersProcess) + ) + for i := 0; i < maxHeadersProcess && from <= head.Number.Uint64(); i++ { + headers = append(headers, d.skeleton.Header(from)) + hashes = append(hashes, headers[i].Hash()) + from++ + } + if len(headers) > 0 { + log.Trace("Scheduling new beacon headers", "count", len(headers), "from", from-uint64(len(headers))) + select { + case d.headerProcCh <- &headerTask{ + headers: headers, + hashes: hashes, + }: + case <-d.cancelCh: + return errCanceled + } + } + // If we still have headers to import, loop and keep pushing them + if from <= head.Number.Uint64() { + continue + } + // If the pivot block is committed, signal header sync termination + if atomic.LoadInt32(&d.committed) == 1 { + select { + case d.headerProcCh <- nil: + return nil + case <-d.cancelCh: + return errCanceled + } + } + // State sync still going, wait a bit for new headers and retry + log.Trace("Pivot not yet committed, waiting...") + select { + case <-time.After(fsHeaderContCheck): + case <-d.cancelCh: + return errCanceled + } + head, _, err = d.skeleton.Bounds() + if err != nil { + return err + } + } +} diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index cd399be7b0..1e68746f97 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -30,7 +30,6 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state/snapshot" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -79,6 +78,7 @@ var ( errCanceled = errors.New("syncing canceled (requested)") errTooOld = errors.New("peer's protocol version too old") errNoAncestorFound = errors.New("no common ancestor found") + ErrMergeTransition = errors.New("legacy sync reached the merge") ) // peerDropFn is a callback type for dropping a peer detected as malicious. @@ -123,6 +123,9 @@ type Downloader struct { // Channels headerProcCh chan *headerTask // Channel to feed the header processor new tasks + // Skeleton sync + skeleton *skeleton // Header skeleton to backfill the chain with (eth2 mode) + // State sync pivotHeader *types.Header // Pivot block header to dynamically push the syncing state root pivotLock sync.RWMutex // Lock protecting pivot header reads from updates @@ -201,7 +204,7 @@ type BlockChain interface { } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { +func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn, success func()) *Downloader { if lightchain == nil { lightchain = chain } @@ -219,6 +222,8 @@ func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain Bl SnapSyncer: snap.NewSyncer(stateDb), stateSyncStart: make(chan *stateSync), } + dl.skeleton = newSkeleton(stateDb, dl.peers, dropPeer, newBeaconBackfiller(dl, success)) + go dl.stateFetcher() return dl } @@ -318,10 +323,10 @@ func (d *Downloader) UnregisterPeer(id string) error { return nil } -// Synchronise tries to sync up our local block chain with a remote peer, both +// LegacySync tries to sync up our local block chain with a remote peer, both // adding various sanity checks as well as wrapping it with various log entries. -func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode SyncMode) error { - err := d.synchronise(id, head, td, mode) +func (d *Downloader) LegacySync(id string, head common.Hash, td, ttd *big.Int, mode SyncMode) error { + err := d.synchronise(id, head, td, ttd, mode, false, nil) switch err { case nil, errBusy, errCanceled: @@ -340,6 +345,9 @@ func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode } return err } + if errors.Is(err, ErrMergeTransition) { + return err // This is an expected fault, don't keep printing it in a spin-loop + } log.Warn("Synchronisation failed, retrying", "err", err) return err } @@ -347,7 +355,21 @@ func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode // synchronise will select the peer and use it for synchronising. If an empty string is given // it will use the best peer possible and synchronize if its TD is higher than our own. If any of the // checks fail an error will be returned. This method is synchronous -func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode SyncMode) error { +func (d *Downloader) synchronise(id string, hash common.Hash, td, ttd *big.Int, mode SyncMode, beaconMode bool, beaconPing chan struct{}) error { + // The beacon header syncer is async. It will start this synchronization and + // will continue doing other tasks. However, if synchornization needs to be + // cancelled, the syncer needs to know if we reached the startup point (and + // inited the cancel cannel) or not yet. Make sure that we'll signal even in + // case of a failure. + if beaconPing != nil { + defer func() { + select { + case <-beaconPing: // already notified + default: + close(beaconPing) // weird exit condition, notify that it's safe to cancel (the nothing) + } + }() + } // Mock out the synchronisation if testing if d.synchroniseMock != nil { return d.synchroniseMock(id, hash) @@ -362,9 +384,6 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode if atomic.CompareAndSwapInt32(&d.notified, 0, 1) { log.Info("Block synchronisation started") } - // If snap sync was requested, create the snap scheduler and switch to snap - // sync mode. Long term we could drop snap sync or merge the two together, - // but until snap becomes prevalent, we should support both. TODO(karalabe). if mode == SnapSync { // Snap sync uses the snapshot namespace to store potentially flakey data until // sync completely heals and finishes. Pause snapshot maintenance in the mean- @@ -402,11 +421,17 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode atomic.StoreUint32(&d.mode, uint32(mode)) // Retrieve the origin peer and initiate the downloading process - p := d.peers.Peer(id) - if p == nil { - return errUnknownPeer + var p *peerConnection + if !beaconMode { // Beacon mode doesn't need a peer to sync from + p = d.peers.Peer(id) + if p == nil { + return errUnknownPeer + } + } + if beaconPing != nil { + close(beaconPing) } - return d.syncWithPeer(p, hash, td) + return d.syncWithPeer(p, hash, td, ttd, beaconMode) } func (d *Downloader) getMode() SyncMode { @@ -415,7 +440,7 @@ func (d *Downloader) getMode() SyncMode { // syncWithPeer starts a block synchronization based on the hash chain from the // specified peer and head hash. -func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.Int) (err error) { +func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td, ttd *big.Int, beaconMode bool) (err error) { d.mux.Post(StartEvent{}) defer func() { // reset on error @@ -426,33 +451,57 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I d.mux.Post(DoneEvent{latest}) } }() - if p.version < eth.ETH66 { - return fmt.Errorf("%w: advertized %d < required %d", errTooOld, p.version, eth.ETH66) - } mode := d.getMode() - log.Debug("Synchronising with the network", "peer", p.id, "eth", p.version, "head", hash, "td", td, "mode", mode) + if !beaconMode { + log.Debug("Synchronising with the network", "peer", p.id, "eth", p.version, "head", hash, "td", td, "mode", mode) + } else { + log.Debug("Backfilling with the network", "mode", mode) + } defer func(start time.Time) { log.Debug("Synchronisation terminated", "elapsed", common.PrettyDuration(time.Since(start))) }(time.Now()) // Look up the sync boundaries: the common ancestor and the target block - latest, pivot, err := d.fetchHead(p) - if err != nil { - return err + var latest, pivot *types.Header + if !beaconMode { + // In legacy mode, use the master peer to retrieve the headers from + latest, pivot, err = d.fetchHead(p) + if err != nil { + return err + } + } else { + // In beacon mode, user the skeleton chain to retrieve the headers from + latest, _, err = d.skeleton.Bounds() + if err != nil { + return err + } + if latest.Number.Uint64() > uint64(fsMinFullBlocks) { + pivot = d.skeleton.Header(latest.Number.Uint64() - uint64(fsMinFullBlocks)) + } } + // If no pivot block was returned, the head is below the min full block + // threshold (i.e. new chain). In that case we won't really snap sync + // anyway, but still need a valid pivot block to avoid some code hitting + // nil panics on access. if mode == SnapSync && pivot == nil { - // If no pivot block was returned, the head is below the min full block - // threshold (i.e. new chain). In that case we won't really snap sync - // anyway, but still need a valid pivot block to avoid some code hitting - // nil panics on an access. pivot = d.blockchain.CurrentBlock().Header() } height := latest.Number.Uint64() - origin, err := d.findAncestor(p, latest) - if err != nil { - return err + var origin uint64 + if !beaconMode { + // In legacy mode, reach out to the network and find the ancestor + origin, err = d.findAncestor(p, latest) + if err != nil { + return err + } + } else { + // In beacon mode, use the skeleton chain for the ancestor lookup + origin, err = d.findBeaconAncestor() + if err != nil { + return err + } } d.syncStatsLock.Lock() if d.syncStatsChainHeight <= origin || d.syncStatsChainOrigin > origin { @@ -523,11 +572,19 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I if d.syncInitHook != nil { d.syncInitHook(origin, height) } + var headerFetcher func() error + if !beaconMode { + // In legacy mode, headers are retrieved from the network + headerFetcher = func() error { return d.fetchHeaders(p, origin+1, latest.Number.Uint64()) } + } else { + // In beacon mode, headers are served by the skeleton syncer + headerFetcher = func() error { return d.fetchBeaconHeaders(origin + 1) } + } fetchers := []func() error{ - func() error { return d.fetchHeaders(p, origin+1, latest.Number.Uint64()) }, // Headers are always retrieved - func() error { return d.fetchBodies(origin + 1) }, // Bodies are retrieved during normal and snap sync - func() error { return d.fetchReceipts(origin + 1) }, // Receipts are retrieved during snap sync - func() error { return d.processHeaders(origin+1, td) }, + headerFetcher, // Headers are always retrieved + func() error { return d.fetchBodies(origin+1, beaconMode) }, // Bodies are retrieved during normal and snap sync + func() error { return d.fetchReceipts(origin+1, beaconMode) }, // Receipts are retrieved during snap sync + func() error { return d.processHeaders(origin+1, td, ttd, beaconMode) }, } if mode == SnapSync { d.pivotLock.Lock() @@ -536,7 +593,7 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I fetchers = append(fetchers, func() error { return d.processSnapSyncContent() }) } else if mode == FullSync { - fetchers = append(fetchers, d.processFullSyncContent) + fetchers = append(fetchers, func() error { return d.processFullSyncContent(ttd, beaconMode) }) } return d.spawnSync(fetchers) } @@ -602,6 +659,9 @@ func (d *Downloader) Terminate() { case <-d.quitCh: default: close(d.quitCh) + + // Terminate the internal beacon syncer + d.skeleton.Terminate() } d.quitLock.Unlock() @@ -1127,7 +1187,7 @@ func (d *Downloader) fillHeaderSkeleton(from uint64, skeleton []*types.Header) ( log.Debug("Filling up skeleton", "from", from) d.queue.ScheduleSkeleton(from, skeleton) - err := d.concurrentFetch((*headerQueue)(d)) + err := d.concurrentFetch((*headerQueue)(d), false) if err != nil { log.Debug("Skeleton fill failed", "err", err) } @@ -1141,9 +1201,9 @@ func (d *Downloader) fillHeaderSkeleton(from uint64, skeleton []*types.Header) ( // fetchBodies iteratively downloads the scheduled block bodies, taking any // available peers, reserving a chunk of blocks for each, waiting for delivery // and also periodically checking for timeouts. -func (d *Downloader) fetchBodies(from uint64) error { +func (d *Downloader) fetchBodies(from uint64, beaconMode bool) error { log.Debug("Downloading block bodies", "origin", from) - err := d.concurrentFetch((*bodyQueue)(d)) + err := d.concurrentFetch((*bodyQueue)(d), beaconMode) log.Debug("Block body download terminated", "err", err) return err @@ -1152,9 +1212,9 @@ func (d *Downloader) fetchBodies(from uint64) error { // fetchReceipts iteratively downloads the scheduled block receipts, taking any // available peers, reserving a chunk of receipts for each, waiting for delivery // and also periodically checking for timeouts. -func (d *Downloader) fetchReceipts(from uint64) error { +func (d *Downloader) fetchReceipts(from uint64, beaconMode bool) error { log.Debug("Downloading receipts", "origin", from) - err := d.concurrentFetch((*receiptQueue)(d)) + err := d.concurrentFetch((*receiptQueue)(d), beaconMode) log.Debug("Receipt download terminated", "err", err) return err @@ -1163,7 +1223,7 @@ func (d *Downloader) fetchReceipts(from uint64) error { // processHeaders takes batches of retrieved headers from an input channel and // keeps processing and scheduling them into the header chain and downloader's // queue until the stream ends or a failure occurs. -func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { +func (d *Downloader) processHeaders(origin uint64, td, ttd *big.Int, beaconMode bool) error { // Keep a count of uncertain headers to roll back var ( rollback uint64 // Zero means no rollback (fine as you can't unroll the genesis) @@ -1211,35 +1271,40 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { case <-d.cancelCh: } } - // If no headers were retrieved at all, the peer violated its TD promise that it had a - // better chain compared to ours. The only exception is if its promised blocks were - // already imported by other means (e.g. fetcher): - // - // R , L : Both at block 10 - // R: Mine block 11, and propagate it to L - // L: Queue block 11 for import - // L: Notice that R's head and TD increased compared to ours, start sync - // L: Import of block 11 finishes - // L: Sync begins, and finds common ancestor at 11 - // L: Request new headers up from 11 (R's TD was higher, it must have something) - // R: Nothing to give - if mode != LightSync { - head := d.blockchain.CurrentBlock() - if !gotHeaders && td.Cmp(d.blockchain.GetTd(head.Hash(), head.NumberU64())) > 0 { - return errStallingPeer + // If we're in legacy sync mode, we need to check total difficulty + // violations from malicious peers. That is not needed in beacon + // mode and we can skip to terminating sync. + if !beaconMode { + // If no headers were retrieved at all, the peer violated its TD promise that it had a + // better chain compared to ours. The only exception is if its promised blocks were + // already imported by other means (e.g. fetcher): + // + // R , L : Both at block 10 + // R: Mine block 11, and propagate it to L + // L: Queue block 11 for import + // L: Notice that R's head and TD increased compared to ours, start sync + // L: Import of block 11 finishes + // L: Sync begins, and finds common ancestor at 11 + // L: Request new headers up from 11 (R's TD was higher, it must have something) + // R: Nothing to give + if mode != LightSync { + head := d.blockchain.CurrentBlock() + if !gotHeaders && td.Cmp(d.blockchain.GetTd(head.Hash(), head.NumberU64())) > 0 { + return errStallingPeer + } } - } - // If snap or light syncing, ensure promised headers are indeed delivered. This is - // needed to detect scenarios where an attacker feeds a bad pivot and then bails out - // of delivering the post-pivot blocks that would flag the invalid content. - // - // This check cannot be executed "as is" for full imports, since blocks may still be - // queued for processing when the header download completes. However, as long as the - // peer gave us something useful, we're already happy/progressed (above check). - if mode == SnapSync || mode == LightSync { - head := d.lightchain.CurrentHeader() - if td.Cmp(d.lightchain.GetTd(head.Hash(), head.Number.Uint64())) > 0 { - return errStallingPeer + // If snap or light syncing, ensure promised headers are indeed delivered. This is + // needed to detect scenarios where an attacker feeds a bad pivot and then bails out + // of delivering the post-pivot blocks that would flag the invalid content. + // + // This check cannot be executed "as is" for full imports, since blocks may still be + // queued for processing when the header download completes. However, as long as the + // peer gave us something useful, we're already happy/progressed (above check). + if mode == SnapSync || mode == LightSync { + head := d.lightchain.CurrentHeader() + if td.Cmp(d.lightchain.GetTd(head.Hash(), head.Number.Uint64())) > 0 { + return errStallingPeer + } } } // Disable any rollback and return @@ -1281,24 +1346,64 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { if chunkHeaders[len(chunkHeaders)-1].Number.Uint64()+uint64(fsHeaderForceVerify) > pivot { frequency = 1 } - if n, err := d.lightchain.InsertHeaderChain(chunkHeaders, frequency); err != nil { - rollbackErr = err - - // If some headers were inserted, track them as uncertain - if (mode == SnapSync || frequency > 1) && n > 0 && rollback == 0 { - rollback = chunkHeaders[0].Number.Uint64() + // Although the received headers might be all valid, a legacy + // PoW/PoA sync must not accept post-merge headers. Make sure + // that any transition is rejected at this point. + var ( + rejected []*types.Header + td *big.Int + ) + if !beaconMode && ttd != nil { + td = d.blockchain.GetTd(chunkHeaders[0].ParentHash, chunkHeaders[0].Number.Uint64()-1) + if td == nil { + // This should never really happen, but handle gracefully for now + log.Error("Failed to retrieve parent header TD", "number", chunkHeaders[0].Number.Uint64()-1, "hash", chunkHeaders[0].ParentHash) + return fmt.Errorf("%w: parent TD missing", errInvalidChain) + } + for i, header := range chunkHeaders { + td = new(big.Int).Add(td, header.Difficulty) + if td.Cmp(ttd) >= 0 { + // Terminal total difficulty reached, allow the last header in + if new(big.Int).Sub(td, header.Difficulty).Cmp(ttd) < 0 { + chunkHeaders, rejected = chunkHeaders[:i+1], chunkHeaders[i+1:] + if len(rejected) > 0 { + // Make a nicer user log as to the first TD truly rejected + td = new(big.Int).Add(td, rejected[0].Difficulty) + } + } else { + chunkHeaders, rejected = chunkHeaders[:i], chunkHeaders[i:] + } + break + } } - log.Warn("Invalid header encountered", "number", chunkHeaders[n].Number, "hash", chunkHashes[n], "parent", chunkHeaders[n].ParentHash, "err", err) - return fmt.Errorf("%w: %v", errInvalidChain, err) } - // All verifications passed, track all headers within the alloted limits - if mode == SnapSync { - head := chunkHeaders[len(chunkHeaders)-1].Number.Uint64() - if head-rollback > uint64(fsHeaderSafetyNet) { - rollback = head - uint64(fsHeaderSafetyNet) - } else { - rollback = 1 + if len(chunkHeaders) > 0 { + if n, err := d.lightchain.InsertHeaderChain(chunkHeaders, frequency); err != nil { + rollbackErr = err + + // If some headers were inserted, track them as uncertain + if (mode == SnapSync || frequency > 1) && n > 0 && rollback == 0 { + rollback = chunkHeaders[0].Number.Uint64() + } + log.Warn("Invalid header encountered", "number", chunkHeaders[n].Number, "hash", chunkHashes[n], "parent", chunkHeaders[n].ParentHash, "err", err) + return fmt.Errorf("%w: %v", errInvalidChain, err) } + // All verifications passed, track all headers within the allowed limits + if mode == SnapSync { + head := chunkHeaders[len(chunkHeaders)-1].Number.Uint64() + if head-rollback > uint64(fsHeaderSafetyNet) { + rollback = head - uint64(fsHeaderSafetyNet) + } else { + rollback = 1 + } + } + } + if len(rejected) != 0 { + // Merge threshold reached, stop importing, but don't roll back + rollback = 0 + + log.Info("Legacy sync reached merge threshold", "number", rejected[0].Number, "hash", rejected[0].Hash(), "td", td, "ttd", ttd) + return ErrMergeTransition } } // Unless we're doing light chains, schedule the headers for associated content retrieval @@ -1342,7 +1447,7 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error { } // processFullSyncContent takes fetch results from the queue and imports them into the chain. -func (d *Downloader) processFullSyncContent() error { +func (d *Downloader) processFullSyncContent(ttd *big.Int, beaconMode bool) error { for { results := d.queue.Results(true) if len(results) == 0 { @@ -1351,9 +1456,44 @@ func (d *Downloader) processFullSyncContent() error { if d.chainInsertHook != nil { d.chainInsertHook(results) } + // Although the received blocks might be all valid, a legacy PoW/PoA sync + // must not accept post-merge blocks. Make sure that pre-merge blocks are + // imported, but post-merge ones are rejected. + var ( + rejected []*fetchResult + td *big.Int + ) + if !beaconMode && ttd != nil { + td = d.blockchain.GetTd(results[0].Header.ParentHash, results[0].Header.Number.Uint64()-1) + if td == nil { + // This should never really happen, but handle gracefully for now + log.Error("Failed to retrieve parent block TD", "number", results[0].Header.Number.Uint64()-1, "hash", results[0].Header.ParentHash) + return fmt.Errorf("%w: parent TD missing", errInvalidChain) + } + for i, result := range results { + td = new(big.Int).Add(td, result.Header.Difficulty) + if td.Cmp(ttd) >= 0 { + // Terminal total difficulty reached, allow the last block in + if new(big.Int).Sub(td, result.Header.Difficulty).Cmp(ttd) < 0 { + results, rejected = results[:i+1], results[i+1:] + if len(rejected) > 0 { + // Make a nicer user log as to the first TD truly rejected + td = new(big.Int).Add(td, rejected[0].Header.Difficulty) + } + } else { + results, rejected = results[:i], results[i:] + } + break + } + } + } if err := d.importBlockResults(results); err != nil { return err } + if len(rejected) != 0 { + log.Info("Legacy sync reached merge threshold", "number", rejected[0].Header.Number, "hash", rejected[0].Header.Hash(), "td", td, "ttd", ttd) + return ErrMergeTransition + } } } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 70c6a51215..6989252c11 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -75,7 +75,7 @@ func newTester() *downloadTester { chain: chain, peers: make(map[string]*downloadTesterPeer), } - tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer) + tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer, nil) return tester } @@ -96,7 +96,7 @@ func (dl *downloadTester) sync(id string, td *big.Int, mode SyncMode) error { td = dl.peers[id].chain.GetTd(head.Hash(), head.NumberU64()) } // Synchronise with the chosen peer and ensure proper cleanup afterwards - err := dl.downloader.synchronise(id, head.Hash(), td, mode) + err := dl.downloader.synchronise(id, head.Hash(), td, nil, mode, false, nil) select { case <-dl.downloader.cancelCh: // Ok, downloader fully cancelled after sync cycle @@ -971,7 +971,7 @@ func testBlockHeaderAttackerDropping(t *testing.T, protocol uint) { // Simulate a synchronisation and check the required result tester.downloader.synchroniseMock = func(string, common.Hash) error { return tt.result } - tester.downloader.Synchronise(id, tester.chain.Genesis().Hash(), big.NewInt(1000), FullSync) + tester.downloader.LegacySync(id, tester.chain.Genesis().Hash(), big.NewInt(1000), nil, FullSync) if _, ok := tester.peers[id]; !ok != tt.drop { t.Errorf("test %d: peer drop mismatch for %v: have %v, want %v", i, tt.result, !ok, tt.drop) } diff --git a/eth/downloader/fetchers_concurrent.go b/eth/downloader/fetchers_concurrent.go index 4bade2b4c3..a0aa197175 100644 --- a/eth/downloader/fetchers_concurrent.go +++ b/eth/downloader/fetchers_concurrent.go @@ -76,7 +76,7 @@ type typedQueue interface { // concurrentFetch iteratively downloads scheduled block parts, taking available // peers, reserving a chunk of fetch requests for each and waiting for delivery // or timeouts. -func (d *Downloader) concurrentFetch(queue typedQueue) error { +func (d *Downloader) concurrentFetch(queue typedQueue, beaconMode bool) error { // Create a delivery channel to accept responses from all peers responses := make(chan *eth.Response) @@ -127,7 +127,7 @@ func (d *Downloader) concurrentFetch(queue typedQueue) error { finished := false for { // Short circuit if we lost all our peers - if d.peers.Len() == 0 { + if d.peers.Len() == 0 && !beaconMode { return errNoPeers } // If there's nothing more to fetch, wait or terminate @@ -209,7 +209,7 @@ func (d *Downloader) concurrentFetch(queue typedQueue) error { } // Make sure that we have peers available for fetching. If all peers have been tried // and all failed throw an error - if !progressed && !throttled && len(pending) == 0 && len(idles) == d.peers.Len() && queued > 0 { + if !progressed && !throttled && len(pending) == 0 && len(idles) == d.peers.Len() && queued > 0 && !beaconMode { return errPeersUnavailable } } diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index 324fdb9cd5..d74d23e74d 100644 --- a/eth/downloader/peer.go +++ b/eth/downloader/peer.go @@ -294,19 +294,19 @@ func (ps *peerSet) AllPeers() []*peerConnection { // peerCapacitySort implements sort.Interface. // It sorts peer connections by capacity (descending). type peerCapacitySort struct { - p []*peerConnection - tp []int + peers []*peerConnection + caps []int } func (ps *peerCapacitySort) Len() int { - return len(ps.p) + return len(ps.peers) } func (ps *peerCapacitySort) Less(i, j int) bool { - return ps.tp[i] > ps.tp[j] + return ps.caps[i] > ps.caps[j] } func (ps *peerCapacitySort) Swap(i, j int) { - ps.p[i], ps.p[j] = ps.p[j], ps.p[i] - ps.tp[i], ps.tp[j] = ps.tp[j], ps.tp[i] + ps.peers[i], ps.peers[j] = ps.peers[j], ps.peers[i] + ps.caps[i], ps.caps[j] = ps.caps[j], ps.caps[i] } diff --git a/eth/downloader/skeleton.go b/eth/downloader/skeleton.go new file mode 100644 index 0000000000..bebf273da5 --- /dev/null +++ b/eth/downloader/skeleton.go @@ -0,0 +1,1063 @@ +// Copyright 2021 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 . + +package downloader + +import ( + "encoding/json" + "errors" + "math/rand" + "sort" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" +) + +// scratchHeaders is the number of headers to store in a scratch space to allow +// concurrent downloads. A header is about 0.5KB in size, so there is no worry +// about using too much memory. The only catch is that we can only validate gaps +// afer they're linked to the head, so the bigger the scratch space, the larger +// potential for invalid headers. +// +// The current scratch space of 131072 headers is expected to use 64MB RAM. +const scratchHeaders = 131072 + +// requestHeaders is the number of header to request from a remote peer in a single +// network packet. Although the skeleton downloader takes into consideration peer +// capacities when picking idlers, the packet size was decided to remain constant +// since headers are relatively small and it's easier to work with fixed batches +// vs. dynamic interval fillings. +const requestHeaders = 512 + +// errSyncLinked is an internal helper error to signal that the current sync +// cycle linked up to the genesis block, this the skeleton syncer should ping +// the backfiller to resume. Since we already have that logic on sync start, +// piggie-back on that instead of 2 entrypoints. +var errSyncLinked = errors.New("sync linked") + +// errSyncMerged is an internal helper error to signal that the current sync +// cycle merged with a previously aborted subchain, thus the skeleton syncer +// should abort and restart with the new state. +var errSyncMerged = errors.New("sync merged") + +// errSyncReorged is an internal helper error to signal that the head chain of +// the current sync cycle was (partially) reorged, thus the skeleton syncer +// should abort and restart with the new state. +var errSyncReorged = errors.New("sync reorged") + +// errTerminated is returned if the sync mechanism was terminated for this run of +// the process. This is usually the case when Geth is shutting down and some events +// might still be propagating. +var errTerminated = errors.New("terminated") + +// errReorgDenied is returned if an attempt is made to extend the beacon chain +// with a new header, but it does not link up to the existing sync. +var errReorgDenied = errors.New("non-forced head reorg denied") + +func init() { + // Tuning parameters is nice, but the scratch space must be assignable in + // full to peers. It's a useless cornercase to support a dangling half-group. + if scratchHeaders%requestHeaders != 0 { + panic("Please make scratchHeaders divisible by requestHeaders") + } +} + +// subchain is a contiguous header chain segment that is backed by the database, +// but may not be linked to the live chain. The skeleton downloader may produce +// a new one of these every time it is restarted until the subchain grows large +// enough to connect with a previous subchain. +// +// The subchains use the exact same database namespace and are not disjoint from +// each other. As such, extending one to overlap the other entails reducing the +// second one first. This combined buffer model is used to avoid having to move +// data on disk when two subchains are joined together. +type subchain struct { + Head uint64 // Block number of the newest header in the subchain + Tail uint64 // Block number of the oldest header in the subchain + Next common.Hash // Block hash of the next oldest header in the subchain +} + +// skeletonProgress is a database entry to allow suspending and resuming a chain +// sync. As the skeleton header chain is downloaded backwards, restarts can and +// will produce temporarily disjoint subchains. There is no way to restart a +// suspended skeleton sync without prior knowledge of all prior suspension points. +type skeletonProgress struct { + Subchains []*subchain // Disjoint subchains downloaded until now +} + +// headUpdate is a notification that the beacon sync should switch to a new target. +// The update might request whether to forcefully change the target, or only try to +// extend it and fail if it's not possible. +type headUpdate struct { + header *types.Header // Header to update the sync target to + force bool // Whether to force the update or only extend if possible + errc chan error // Channel to signal acceptance of the new head +} + +// headerRequest tracks a pending header request to ensure responses are to +// actual requests and to validate any security constraints. +// +// Concurrency note: header requests and responses are handled concurrently from +// the main runloop to allow Keccak256 hash verifications on the peer's thread and +// to drop on invalid response. The request struct must contain all the data to +// construct the response without accessing runloop internals (i.e. subchains). +// That is only included to allow the runloop to match a response to the task being +// synced without having yet another set of maps. +type headerRequest struct { + peer string // Peer to which this request is assigned + id uint64 // Request ID of this request + + deliver chan *headerResponse // Channel to deliver successful response on + revert chan *headerRequest // Channel to deliver request failure on + cancel chan struct{} // Channel to track sync cancellation + stale chan struct{} // Channel to signal the request was dropped + + head uint64 // Head number of the requested batch of headers +} + +// headerResponse is an already verified remote response to a header request. +type headerResponse struct { + peer *peerConnection // Peer from which this response originates + reqid uint64 // Request ID that this response fulfils + headers []*types.Header // Chain of headers +} + +// backfiller is a callback interface through which the skeleton sync can tell +// the downloader that it should suspend or resume backfilling on specific head +// events (e.g. suspend on forks or gaps, resume on successful linkups). +type backfiller interface { + // suspend requests the backfiller to abort any running full or snap sync + // based on the skeleton chain as it might be invalid. The backfiller should + // gracefully handle multiple consecutive suspends without a resume, even + // on initial sartup. + suspend() + + // resume requests the backfiller to start running fill or snap sync based on + // the skeleton chain as it has successfully been linked. Appending new heads + // to the end of the chain will not result in suspend/resume cycles. + resume() +} + +// skeleton represents a header chain synchronized after the merge where blocks +// aren't validated any more via PoW in a forward fashion, rather are dictated +// and extended at the head via the beacon chain and backfilled on the original +// Ethereum block sync protocol. +// +// Since the skeleton is grown backwards from head to genesis, it is handled as +// a separate entity, not mixed in with the logical sequential transition of the +// blocks. Once the skeleton is connected to an existing, validated chain, the +// headers will be moved into the main downloader for filling and execution. +// +// Opposed to the original Ethereum block synchronization which is trustless (and +// uses a master peer to minimize the attack surface), post-merge block sync starts +// from a trusted head. As such, there is no need for a master peer any more and +// headers can be requested fully concurrently (though some batches might be +// discarded if they don't link up correctly). +// +// Although a skeleton is part of a sync cycle, it is not recreated, rather stays +// alive throughout the lifetime of the downloader. This allows it to be extended +// concurrently with the sync cycle, since extensions arrive from an API surface, +// not from within (vs. legacy Ethereum sync). +// +// Since the skeleton tracks the entire header chain until it is consumed by the +// forward block filling, it needs 0.5KB/block storage. At current mainnet sizes +// this is only possible with a disk backend. Since the skeleton is separate from +// the node's header chain, storing the headers ephemerally until sync finishes +// is wasted disk IO, but it's a price we're going to pay to keep things simple +// for now. +type skeleton struct { + db ethdb.Database // Database backing the skeleton + filler backfiller // Chain syncer suspended/resumed by head events + + peers *peerSet // Set of peers we can sync from + idles map[string]*peerConnection // Set of idle peers in the current sync cycle + drop peerDropFn // Drops a peer for misbehaving + + progress *skeletonProgress // Sync progress tracker for resumption and metrics + started time.Time // Timestamp when the skeleton syncer was created + logged time.Time // Timestamp when progress was last logged to the user + pulled uint64 // Number of headers downloaded in this run + + scratchSpace []*types.Header // Scratch space to accumulate headers in (first = recent) + scratchOwners []string // Peer IDs owning chunks of the scratch space (pend or delivered) + scratchHead uint64 // Block number of the first item in the scratch space + + requests map[uint64]*headerRequest // Header requests currently running + + headEvents chan *headUpdate // Notification channel for new heads + terminate chan chan error // Termination channel to abort sync + terminated chan struct{} // Channel to signal that the syner is dead + + // Callback hooks used during testing + syncStarting func() // callback triggered after a sync cycle is inited but before started +} + +// newSkeleton creates a new sync skeleton that tracks a potentially dangling +// header chain until it's linked into an existing set of blocks. +func newSkeleton(db ethdb.Database, peers *peerSet, drop peerDropFn, filler backfiller) *skeleton { + sk := &skeleton{ + db: db, + filler: filler, + peers: peers, + drop: drop, + requests: make(map[uint64]*headerRequest), + headEvents: make(chan *headUpdate), + terminate: make(chan chan error), + terminated: make(chan struct{}), + } + go sk.startup() + return sk +} + +// startup is an initial background loop which waits for an event to start or +// tear the syncer down. This is required to make the skeleton sync loop once +// per process but at the same time not start before the beacon chain announces +// a new (existing) head. +func (s *skeleton) startup() { + // Close a notification channel so anyone sending us events will know if the + // sync loop was torn down for good. + defer close(s.terminated) + + // Wait for startup or teardown. This wait might loop a few times if a beacon + // client requests sync head extensions, but not forced reorgs (i.e. they are + // giving us new payloads without setting a starting head initially). + for { + select { + case errc := <-s.terminate: + // No head was announced but Geth is shutting down + errc <- nil + return + + case event := <-s.headEvents: + // New head announced, start syncing to it, looping every time a current + // cycle is terminated due to a chain event (head reorg, old chain merge). + if !event.force { + event.errc <- errors.New("forced head needed for startup") + continue + } + event.errc <- nil // forced head accepted for startup + head := event.header + s.started = time.Now() + + for { + // If the sync cycle terminated or was terminated, propagate up when + // higher layers request termination. There's no fancy explicit error + // signalling as the sync loop should never terminate (TM). + newhead, err := s.sync(head) + switch { + case err == errSyncLinked: + // Sync cycle linked up to the genesis block. Tear down the loop + // and restart it so, it can properly notify the backfiller. Don't + // account a new head. + head = nil + + case err == errSyncMerged: + // Subchains were merged, we just need to reinit the internal + // start to continue on the tail of the merged chain. Don't + // announce a new head, + head = nil + + case err == errSyncReorged: + // The subchain being synced got modified at the head in a + // way that requires resyncing it. Restart sync with the new + // head to force a cleanup. + head = newhead + + case err == errTerminated: + // Sync was requested to be terminated from within, stop and + // return (no need to pass a message, was already done internally) + return + + default: + // Sync either successfully terminated or failed with an unhandled + // error. Abort and wait until Geth requests a termination. + errc := <-s.terminate + errc <- err + return + } + } + } + } +} + +// Terminate tears down the syncer indefinitely. +func (s *skeleton) Terminate() error { + // Request termination and fetch any errors + errc := make(chan error) + s.terminate <- errc + err := <-errc + + // Wait for full shutdown (not necessary, but cleaner) + <-s.terminated + return err +} + +// Sync starts or resumes a previous sync cycle to download and maintain a reverse +// header chain starting at the head and leading towards genesis to an available +// ancestor. +// +// This method does not block, rather it just waits until the syncer receives the +// fed header. What the syncer does with it is the syncer's problem. +func (s *skeleton) Sync(head *types.Header, force bool) error { + log.Trace("New skeleton head announced", "number", head.Number, "hash", head.Hash(), "force", force) + errc := make(chan error) + + select { + case s.headEvents <- &headUpdate{header: head, force: force, errc: errc}: + return <-errc + case <-s.terminated: + return errTerminated + } +} + +// sync is the internal version of Sync that executes a single sync cycle, either +// until some termination condition is reached, or until the current cycle merges +// with a previously aborted run. +func (s *skeleton) sync(head *types.Header) (*types.Header, error) { + // If we're continuing a previous merge interrupt, just access the existing + // old state without initing from disk. + if head == nil { + head = rawdb.ReadSkeletonHeader(s.db, s.progress.Subchains[0].Head) + } else { + // Otherwise, initialize the sync, trimming and previous leftovers until + // we're consistent with the newly requested chain head + s.initSync(head) + } + // Create the scratch space to fill with concurrently downloaded headers + s.scratchSpace = make([]*types.Header, scratchHeaders) + defer func() { s.scratchSpace = nil }() // don't hold on to references after sync + + s.scratchOwners = make([]string, scratchHeaders/requestHeaders) + defer func() { s.scratchOwners = nil }() // don't hold on to references after sync + + s.scratchHead = s.progress.Subchains[0].Tail - 1 // tail must not be 0! + + // If the sync is already done, resume the backfiller. When the loop stops, + // terminate the backfiller too. + linked := len(s.progress.Subchains) == 1 && + rawdb.HasBody(s.db, s.progress.Subchains[0].Next, s.scratchHead) && + rawdb.HasReceipts(s.db, s.progress.Subchains[0].Next, s.scratchHead) + if linked { + s.filler.resume() + } + defer s.filler.suspend() + + // Create a set of unique channels for this sync cycle. We need these to be + // ephemeral so a data race doesn't accidentally deliver something stale on + // a persistent channel across syncs (yup, this happened) + var ( + requestFails = make(chan *headerRequest) + responses = make(chan *headerResponse) + ) + cancel := make(chan struct{}) + defer close(cancel) + + log.Debug("Starting reverse header sync cycle", "head", head.Number, "hash", head.Hash(), "cont", s.scratchHead) + + // Whether sync completed or not, disregard any future packets + defer func() { + log.Debug("Terminating reverse header sync cycle", "head", head.Number, "hash", head.Hash(), "cont", s.scratchHead) + s.requests = make(map[uint64]*headerRequest) + }() + + // Start tracking idle peers for task assignments + peering := make(chan *peeringEvent, 64) // arbitrary buffer, just some burst protection + + peeringSub := s.peers.SubscribeEvents(peering) + defer peeringSub.Unsubscribe() + + s.idles = make(map[string]*peerConnection) + for _, peer := range s.peers.AllPeers() { + s.idles[peer.id] = peer + } + // Nofity any tester listening for startup events + if s.syncStarting != nil { + s.syncStarting() + } + for { + // Something happened, try to assign new tasks to any idle peers + if !linked { + s.assignTasks(responses, requestFails, cancel) + } + // Wait for something to happen + select { + case event := <-peering: + // A peer joined or left, the tasks queue and allocations need to be + // checked for potential assignment or reassignment + peerid := event.peer.id + if event.join { + log.Debug("Joining skeleton peer", "id", peerid) + s.idles[peerid] = event.peer + } else { + log.Debug("Leaving skeleton peer", "id", peerid) + s.revertRequests(peerid) + delete(s.idles, peerid) + } + + case errc := <-s.terminate: + errc <- nil + return nil, errTerminated + + case event := <-s.headEvents: + // New head was announced, try to integrate it. If successful, nothing + // needs to be done as the head simply extended the last range. For now + // we don't seamlessly integrate reorgs to keep things simple. If the + // network starts doing many mini reorgs, it might be worthwhile handling + // a limited depth without an error. + if reorged := s.processNewHead(event.header, event.force); reorged { + // If a reorg is needed, and we're forcing the new head, signal + // the syncer to tear down and start over. Otherwise, drop the + // non-force reorg. + if event.force { + event.errc <- nil // forced head reorg accepted + return event.header, errSyncReorged + } + event.errc <- errReorgDenied + continue + } + event.errc <- nil // head extension accepted + + // New head was integrated into the skeleton chain. If the backfiller + // is still running, it will pick it up. If it already terminated, + // a new cycle needs to be spun up. + if linked { + s.filler.resume() + } + + case req := <-requestFails: + s.revertRequest(req) + + case res := <-responses: + // Process the batch of headers. If though processing we managed to + // link the current subchain to a previously downloaded one, abort the + // sync and restart with the merged subchains. + // + // If we managed to link to the existing local chain or genesis block, + // abort sync altogether. + linked, merged := s.processResponse(res) + if linked { + log.Debug("Beacon sync linked to local chain") + return nil, errSyncLinked + } + if merged { + log.Debug("Beacon sync merged subchains") + return nil, errSyncMerged + } + // We still have work to do, loop and repeat + } + } +} + +// initSync attempts to get the skeleton sync into a consistent state wrt any +// past state on disk and the newly requested head to sync to. If the new head +// is nil, the method will return and continue from the previous head. +func (s *skeleton) initSync(head *types.Header) { + // Extract the head number, we'll need it all over + number := head.Number.Uint64() + + // Retrieve the previously saved sync progress + if status := rawdb.ReadSkeletonSyncStatus(s.db); len(status) > 0 { + s.progress = new(skeletonProgress) + if err := json.Unmarshal(status, s.progress); err != nil { + log.Error("Failed to decode skeleton sync status", "err", err) + } else { + // Previous sync was available, print some continuation logs + for _, subchain := range s.progress.Subchains { + log.Debug("Restarting skeleton subchain", "head", subchain.Head, "tail", subchain.Tail) + } + // Create a new subchain for the head (unless the last can be extended), + // trimming anything it would overwrite + headchain := &subchain{ + Head: number, + Tail: number, + Next: head.ParentHash, + } + for len(s.progress.Subchains) > 0 { + // If the last chain is above the new head, delete altogether + lastchain := s.progress.Subchains[0] + if lastchain.Tail >= headchain.Tail { + log.Debug("Dropping skeleton subchain", "head", lastchain.Head, "tail", lastchain.Tail) + s.progress.Subchains = s.progress.Subchains[1:] + continue + } + // Otherwise truncate the last chain if needed and abort trimming + if lastchain.Head >= headchain.Tail { + log.Debug("Trimming skeleton subchain", "oldhead", lastchain.Head, "newhead", headchain.Tail-1, "tail", lastchain.Tail) + lastchain.Head = headchain.Tail - 1 + } + break + } + // If the last subchain can be extended, we're lucky. Otherwise create + // a new subchain sync task. + var extended bool + if n := len(s.progress.Subchains); n > 0 { + lastchain := s.progress.Subchains[0] + if lastchain.Head == headchain.Tail-1 { + lasthead := rawdb.ReadSkeletonHeader(s.db, lastchain.Head) + if lasthead.Hash() == head.ParentHash { + log.Debug("Extended skeleton subchain with new head", "head", headchain.Tail, "tail", lastchain.Tail) + lastchain.Head = headchain.Tail + extended = true + } + } + } + if !extended { + log.Debug("Created new skeleton subchain", "head", number, "tail", number) + s.progress.Subchains = append([]*subchain{headchain}, s.progress.Subchains...) + } + // Update the database with the new sync stats and insert the new + // head header. We won't delete any trimmed skeleton headers since + // those will be outside the index space of the many subchains and + // the database space will be reclaimed eventually when processing + // blocks above the current head (TODO(karalabe): don't forget). + batch := s.db.NewBatch() + + rawdb.WriteSkeletonHeader(batch, head) + s.saveSyncStatus(batch) + + if err := batch.Write(); err != nil { + log.Crit("Failed to write skeleton sync status", "err", err) + } + return + } + } + // Either we've failed to decode the previus state, or there was none. Start + // a fresh sync with a single subchain represented by the currently sent + // chain head. + s.progress = &skeletonProgress{ + Subchains: []*subchain{ + { + Head: number, + Tail: number, + Next: head.ParentHash, + }, + }, + } + batch := s.db.NewBatch() + + rawdb.WriteSkeletonHeader(batch, head) + s.saveSyncStatus(batch) + + if err := batch.Write(); err != nil { + log.Crit("Failed to write initial skeleton sync status", "err", err) + } + log.Debug("Created initial skeleton subchain", "head", number, "tail", number) +} + +// saveSyncStatus marshals the remaining sync tasks into leveldb. +func (s *skeleton) saveSyncStatus(db ethdb.KeyValueWriter) { + status, err := json.Marshal(s.progress) + if err != nil { + panic(err) // This can only fail during implementation + } + rawdb.WriteSkeletonSyncStatus(db, status) +} + +// processNewHead does the internal shuffling for a new head marker and either +// accepts and integrates it into the skeleton or requests a reorg. Upon reorg, +// the syncer will tear itself down and restart with a fresh head. It is simpler +// to reconstruct the sync state than to mutate it and hope for the best. +func (s *skeleton) processNewHead(head *types.Header, force bool) bool { + // If the header cannot be inserted without interruption, return an error for + // the outer loop to tear down the skeleton sync and restart it + number := head.Number.Uint64() + + lastchain := s.progress.Subchains[0] + if lastchain.Tail >= number { + if force { + log.Warn("Beacon chain reorged", "tail", lastchain.Tail, "newHead", number) + } + return true + } + if lastchain.Head+1 < number { + if force { + log.Warn("Beacon chain gapped", "head", lastchain.Head, "newHead", number) + } + return true + } + if parent := rawdb.ReadSkeletonHeader(s.db, number-1); parent.Hash() != head.ParentHash { + if force { + log.Warn("Beacon chain forked", "ancestor", parent.Number, "hash", parent.Hash(), "want", head.ParentHash) + } + return true + } + // New header seems to be in the last subchain range. Unwind any extra headers + // from the chain tip and insert the new head. We won't delete any trimmed + // skeleton headers since those will be outside the index space of the many + // subchains and the database space will be reclaimed eventually when processing + // blocks above the current head (TODO(karalabe): don't forget). + batch := s.db.NewBatch() + + rawdb.WriteSkeletonHeader(batch, head) + lastchain.Head = number + s.saveSyncStatus(batch) + + if err := batch.Write(); err != nil { + log.Crit("Failed to write skeleton sync status", "err", err) + } + return false +} + +// assignTasks attempts to match idle peers to pending header retrievals. +func (s *skeleton) assignTasks(success chan *headerResponse, fail chan *headerRequest, cancel chan struct{}) { + // Sort the peers by download capacity to use faster ones if many available + idlers := &peerCapacitySort{ + peers: make([]*peerConnection, 0, len(s.idles)), + caps: make([]int, 0, len(s.idles)), + } + targetTTL := s.peers.rates.TargetTimeout() + for _, peer := range s.idles { + idlers.peers = append(idlers.peers, peer) + idlers.caps = append(idlers.caps, s.peers.rates.Capacity(peer.id, eth.BlockHeadersMsg, targetTTL)) + } + if len(idlers.peers) == 0 { + return + } + sort.Sort(idlers) + + // Find header regions not yet downloading and fill them + for task, owner := range s.scratchOwners { + // If we're out of idle peers, stop assigning tasks + if len(idlers.peers) == 0 { + return + } + // Skip any tasks already filling + if owner != "" { + continue + } + // If we've reached the genesis, stop assigning tasks + if uint64(task*requestHeaders) >= s.scratchHead { + return + } + // Found a task and have peers available, assign it + idle := idlers.peers[0] + + idlers.peers = idlers.peers[1:] + idlers.caps = idlers.caps[1:] + + // Matched a pending task to an idle peer, allocate a unique request id + var reqid uint64 + for { + reqid = uint64(rand.Int63()) + if reqid == 0 { + continue + } + if _, ok := s.requests[reqid]; ok { + continue + } + break + } + // Generate the network query and send it to the peer + req := &headerRequest{ + peer: idle.id, + id: reqid, + deliver: success, + revert: fail, + cancel: cancel, + stale: make(chan struct{}), + head: s.scratchHead - uint64(task*requestHeaders), + } + s.requests[reqid] = req + delete(s.idles, idle.id) + + // Generate the network query and send it to the peer + go s.executeTask(idle, req) + + // Inject the request into the task to block further assignments + s.scratchOwners[task] = idle.id + } +} + +// executeTask executes a single fetch request, blocking until either a result +// arrives or a timeouts / cancellation is triggered. The method should be run +// on its own goroutine and will deliver on the requested channels. +func (s *skeleton) executeTask(peer *peerConnection, req *headerRequest) { + start := time.Now() + resCh := make(chan *eth.Response) + + // Figure out how many headers to fetch. Usually this will be a full batch, + // but for the very tail of the chain, trim the request to the number left. + // Since nodes may or may not return the genesis header for a batch request, + // don't even request it. The parent hash of block #1 is enough to link. + requestCount := requestHeaders + if req.head < requestHeaders { + requestCount = int(req.head) + } + peer.log.Trace("Fetching skeleton headers", "from", req.head, "count", requestCount) + netreq, err := peer.peer.RequestHeadersByNumber(req.head, requestCount, 0, true, resCh) + if err != nil { + peer.log.Trace("Failed to request headers", "err", err) + s.scheduleRevertRequest(req) + return + } + defer netreq.Close() + + // Wait until the response arrives, the request is cancelled or times out + ttl := s.peers.rates.TargetTimeout() + + timeoutTimer := time.NewTimer(ttl) + defer timeoutTimer.Stop() + + select { + case <-req.cancel: + peer.log.Debug("Header request cancelled") + s.scheduleRevertRequest(req) + + case <-timeoutTimer.C: + // Header retrieval timed out, update the metrics + peer.log.Warn("Header request timed out, dropping peer", "elapsed", ttl) + headerTimeoutMeter.Mark(1) + s.peers.rates.Update(peer.id, eth.BlockHeadersMsg, 0, 0) + s.scheduleRevertRequest(req) + + // At this point we either need to drop the offending peer, or we need a + // mechanism to allow waiting for the response and not cancel it. For now + // lets go with dropping since the header sizes are deterministic and the + // beacon sync runs exclusive (downloader is idle) so there should be no + // other load to make timeouts probable. If we notice that timeouts happen + // more often than we'd like, we can introduce a tracker for the requests + // gone stale and monitor them. However, in that case too, we need a way + // to protect against malicious peers never responding, so it would need + // a second, hard-timeout mechanism. + s.drop(peer.id) + + case res := <-resCh: + // Headers successfully retrieved, update the metrics + headers := *res.Res.(*eth.BlockHeadersPacket) + + headerReqTimer.Update(time.Since(start)) + s.peers.rates.Update(peer.id, eth.BlockHeadersMsg, res.Time, len(headers)) + + // Cross validate the headers with the requests + switch { + case len(headers) == 0: + // No headers were delivered, reject the response and reschedule + peer.log.Debug("No headers delivered") + res.Done <- errors.New("no headers delivered") + s.scheduleRevertRequest(req) + + case headers[0].Number.Uint64() != req.head: + // Header batch anchored at non-requested number + peer.log.Debug("Invalid header response head", "have", headers[0].Number, "want", req.head) + res.Done <- errors.New("invalid header batch anchor") + s.scheduleRevertRequest(req) + + case req.head >= requestHeaders && len(headers) != requestHeaders: + // Invalid number of non-genesis headers delivered, reject the response and reschedule + peer.log.Debug("Invalid non-genesis header count", "have", len(headers), "want", requestHeaders) + res.Done <- errors.New("not enough non-genesis headers delivered") + s.scheduleRevertRequest(req) + + case req.head < requestHeaders && uint64(len(headers)) != req.head: + // Invalid number of genesis headers delivered, reject the response and reschedule + peer.log.Debug("Invalid genesis header count", "have", len(headers), "want", headers[0].Number.Uint64()) + res.Done <- errors.New("not enough genesis headers delivered") + s.scheduleRevertRequest(req) + + default: + // Packet seems structurally valid, check hash progression and if it + // is correct too, deliver for storage + for i := 0; i < len(headers)-1; i++ { + if headers[i].ParentHash != headers[i+1].Hash() { + peer.log.Debug("Invalid hash progression", "index", i, "wantparenthash", headers[i].ParentHash, "haveparenthash", headers[i+1].Hash()) + res.Done <- errors.New("invalid hash progression") + s.scheduleRevertRequest(req) + return + } + } + // Hash chain is valid. The delivery might still be junk as we're + // downloading batches concurrently (so no way to link the headers + // until gaps are filled); in that case, we'll nuke the peer when + // we detect the fault. + res.Done <- nil + + select { + case req.deliver <- &headerResponse{ + peer: peer, + reqid: req.id, + headers: headers, + }: + case <-req.cancel: + } + } + } +} + +// revertRequests locates all the currently pending reuqests from a particular +// peer and reverts them, rescheduling for others to fulfill. +func (s *skeleton) revertRequests(peer string) { + // Gather the requests first, revertals need the lock too + var requests []*headerRequest + for _, req := range s.requests { + if req.peer == peer { + requests = append(requests, req) + } + } + // Revert all the requests matching the peer + for _, req := range requests { + s.revertRequest(req) + } +} + +// scheduleRevertRequest asks the event loop to clean up a request and return +// all failed retrieval tasks to the scheduler for reassignment. +func (s *skeleton) scheduleRevertRequest(req *headerRequest) { + select { + case req.revert <- req: + // Sync event loop notified + case <-req.cancel: + // Sync cycle got cancelled + case <-req.stale: + // Request already reverted + } +} + +// revertRequest cleans up a request and returns all failed retrieval tasks to +// the scheduler for reassignment. +// +// Note, this needs to run on the event runloop thread to reschedule to idle peers. +// On peer threads, use scheduleRevertRequest. +func (s *skeleton) revertRequest(req *headerRequest) { + log.Trace("Reverting header request", "peer", req.peer, "reqid", req.id) + select { + case <-req.stale: + log.Trace("Header request already reverted", "peer", req.peer, "reqid", req.id) + return + default: + } + close(req.stale) + + // Remove the request from the tracked set + delete(s.requests, req.id) + + // Remove the request from the tracked set and mark the task as not-pending, + // ready for resheduling + s.scratchOwners[(s.scratchHead-req.head)/requestHeaders] = "" +} + +func (s *skeleton) processResponse(res *headerResponse) (linked bool, merged bool) { + res.peer.log.Trace("Processing header response", "head", res.headers[0].Number, "hash", res.headers[0].Hash(), "count", len(res.headers)) + + // Whether the response is valid, we can mark the peer as idle and notify + // the scheduler to assign a new task. If the response is invalid, we'll + // drop the peer in a bit. + s.idles[res.peer.id] = res.peer + + // Ensure the response is for a valid request + if _, ok := s.requests[res.reqid]; !ok { + // Some internal accounting is broken. A request either times out or it + // gets fulfilled successfully. It should not be possible to deliver a + // response to a non-existing request. + res.peer.log.Error("Unexpected header packet") + return false, false + } + delete(s.requests, res.reqid) + + // Insert the delivered headers into the scratch space independent of the + // content or continuation; those will be validated in a moment + head := res.headers[0].Number.Uint64() + copy(s.scratchSpace[s.scratchHead-head:], res.headers) + + // If there's still a gap in the head of the scratch space, abort + if s.scratchSpace[0] == nil { + return false, false + } + // Try to consume any head headers, validating the boundary conditions + batch := s.db.NewBatch() + for s.scratchSpace[0] != nil { + // Next batch of headers available, cross-reference with the subchain + // we are extending and either accept or discard + if s.progress.Subchains[0].Next != s.scratchSpace[0].Hash() { + // Print a log messages to track what's going on + tail := s.progress.Subchains[0].Tail + want := s.progress.Subchains[0].Next + have := s.scratchSpace[0].Hash() + + log.Warn("Invalid skeleton headers", "peer", s.scratchOwners[0], "number", tail-1, "want", want, "have", have) + + // The peer delivered junk, or at least not the subchain we are + // syncing to. Free up the scratch space and assignment, reassign + // and drop the original peer. + for i := 0; i < requestHeaders; i++ { + s.scratchSpace[i] = nil + } + s.drop(s.scratchOwners[0]) + s.scratchOwners[0] = "" + break + } + // Scratch delivery matches required subchain, deliver the batch of + // headers and push the subchain forward + var consumed int + for _, header := range s.scratchSpace[:requestHeaders] { + if header != nil { // nil when the genesis is reached + consumed++ + + rawdb.WriteSkeletonHeader(batch, header) + s.pulled++ + + s.progress.Subchains[0].Tail-- + s.progress.Subchains[0].Next = header.ParentHash + + // If we've reached an existing block in the chain, stop retrieving + // headers. Note, if we want to support light clients with the same + // code we'd need to switch here based on the downloader mode. That + // said, there's no such functionality for now, so don't complicate. + // + // In the case of full sync it would be enough to check for the body, + // but even a full syncing node will generate a receipt once block + // processing is done, so it's just one more "needless" check. + var ( + hasBody = rawdb.HasBody(s.db, header.ParentHash, header.Number.Uint64()-1) + hasReceipt = rawdb.HasReceipts(s.db, header.ParentHash, header.Number.Uint64()-1) + ) + if hasBody && hasReceipt { + linked = true + break + } + } + } + head := s.progress.Subchains[0].Head + tail := s.progress.Subchains[0].Tail + next := s.progress.Subchains[0].Next + + log.Trace("Primary subchain extended", "head", head, "tail", tail, "next", next) + + // If the beacon chain was linked to the local chain, completely swap out + // all internal progress and abort header synchronization. + if linked { + // Note, linking into the local chain should also mean that there are + // no leftover subchains, but just in case there's some junk due to + // strange conditions or bugs, clean up all internal state. + if len(s.progress.Subchains) > 1 { + log.Error("Cleaning up leftovers after beacon link") + s.progress.Subchains = s.progress.Subchains[:1] + } + break + } + // Batch of headers consumed, shift the download window forward + copy(s.scratchSpace, s.scratchSpace[requestHeaders:]) + for i := 0; i < requestHeaders; i++ { + s.scratchSpace[scratchHeaders-i-1] = nil + } + copy(s.scratchOwners, s.scratchOwners[1:]) + s.scratchOwners[scratchHeaders/requestHeaders-1] = "" + + s.scratchHead -= uint64(consumed) + + // If the subchain extended into the next subchain, we need to handle + // the overlap. Since there could be many overlaps (come on), do this + // in a loop. + for len(s.progress.Subchains) > 1 && s.progress.Subchains[1].Head >= s.progress.Subchains[0].Tail { + // Extract some stats from the second subchain + head := s.progress.Subchains[1].Head + tail := s.progress.Subchains[1].Tail + next := s.progress.Subchains[1].Next + + // Since we just overwrote part of the next subchain, we need to trim + // its head independent of matching or mismatching content + if s.progress.Subchains[1].Tail >= s.progress.Subchains[0].Tail { + // Fully overwritten, get rid of the subchain as a whole + log.Debug("Previous subchain fully overwritten", "head", head, "tail", tail, "next", next) + s.progress.Subchains = append(s.progress.Subchains[:1], s.progress.Subchains[2:]...) + continue + } else { + // Partially overwritten, trim the head to the overwritten size + log.Debug("Previous subchain partially overwritten", "head", head, "tail", tail, "next", next) + s.progress.Subchains[1].Head = s.progress.Subchains[0].Tail - 1 + } + // If the old subchain is an extension of the new one, merge the two + // and let the skeleton syncer restart (to clean internal state) + if rawdb.ReadSkeletonHeader(s.db, s.progress.Subchains[1].Head).Hash() == s.progress.Subchains[0].Next { + log.Debug("Previous subchain merged", "head", head, "tail", tail, "next", next) + s.progress.Subchains[0].Tail = s.progress.Subchains[1].Tail + s.progress.Subchains[0].Next = s.progress.Subchains[1].Next + + s.progress.Subchains = append(s.progress.Subchains[:1], s.progress.Subchains[2:]...) + merged = true + } + } + // If subchains were merged, all further available headers in the scratch + // space are invalid since we skipped ahead. Stop processing the scratch + // space to avoid dropping peers thinking they delivered invalid data. + if merged { + break + } + } + s.saveSyncStatus(batch) + if err := batch.Write(); err != nil { + log.Crit("Failed to write skeleton headers and progress", "err", err) + } + // Print a progress report making the UX a bit nicer + left := s.progress.Subchains[0].Tail - 1 + if linked { + left = 0 + } + if time.Since(s.logged) > 8*time.Second || left == 0 { + s.logged = time.Now() + + if s.pulled == 0 { + log.Info("Beacon sync starting", "left", left) + } else { + eta := float64(time.Since(s.started)) / float64(s.pulled) * float64(left) + log.Info("Syncing beacon headers", "downloaded", s.pulled, "left", left, "eta", common.PrettyDuration(eta)) + } + } + return linked, merged +} + +// Bounds retrieves the current head and tail tracked by the skeleton syncer. +// This method is used by the backfiller, whose life cycle is controlled by the +// skeleton syncer. +// +// Note, the method will not use the internal state of the skeleton, but will +// rather blindly pull stuff from the database. This is fine, because the back- +// filler will only run when the skeleton chain is fully downloaded and stable. +// There might be new heads appended, but those are atomic from the perspective +// of this method. Any head reorg will first tear down the backfiller and only +// then make the modification. +func (s *skeleton) Bounds() (head *types.Header, tail *types.Header, err error) { + // Read the current sync progress from disk and figure out the current head. + // Although there's a lot of error handling here, these are mostly as sanity + // checks to avoid crashing if a programming error happens. These should not + // happen in live code. + status := rawdb.ReadSkeletonSyncStatus(s.db) + if len(status) == 0 { + return nil, nil, errors.New("beacon sync not yet started") + } + progress := new(skeletonProgress) + if err := json.Unmarshal(status, progress); err != nil { + return nil, nil, err + } + head = rawdb.ReadSkeletonHeader(s.db, progress.Subchains[0].Head) + tail = rawdb.ReadSkeletonHeader(s.db, progress.Subchains[0].Tail) + + return head, tail, nil +} + +// Header retrieves a specific header tracked by the skeleton syncer. This method +// is meant to be used by the backfiller, whose life cycle is controlled by the +// skeleton syncer. +// +// Note, outside the permitted runtimes, this method might return nil results and +// subsequent calls might return headers from different chains. +func (s *skeleton) Header(number uint64) *types.Header { + return rawdb.ReadSkeletonHeader(s.db, number) +} diff --git a/eth/downloader/skeleton_test.go b/eth/downloader/skeleton_test.go new file mode 100644 index 0000000000..cbe0d51d37 --- /dev/null +++ b/eth/downloader/skeleton_test.go @@ -0,0 +1,896 @@ +// Copyright 2021 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 . + +package downloader + +import ( + "encoding/json" + "errors" + "fmt" + "math/big" + "os" + "sync/atomic" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/log" +) + +// hookedBackfiller is a tester backfiller with all interface methods mocked and +// hooked so tests can implement only the things they need. +type hookedBackfiller struct { + // suspendHook is an optional hook to be called when the filler is requested + // to be suspended. + suspendHook func() + + // resumeHook is an optional hook to be called when the filler is requested + // to be resumed. + resumeHook func() +} + +// newHookedBackfiller creates a hooked backfiller with all callbacks disabled, +// essentially acting as a noop. +func newHookedBackfiller() backfiller { + return new(hookedBackfiller) +} + +// suspend requests the backfiller to abort any running full or snap sync +// based on the skeleton chain as it might be invalid. The backfiller should +// gracefully handle multiple consecutive suspends without a resume, even +// on initial sartup. +func (hf *hookedBackfiller) suspend() { + if hf.suspendHook != nil { + hf.suspendHook() + } +} + +// resume requests the backfiller to start running fill or snap sync based on +// the skeleton chain as it has successfully been linked. Appending new heads +// to the end of the chain will not result in suspend/resume cycles. +func (hf *hookedBackfiller) resume() { + if hf.resumeHook != nil { + hf.resumeHook() + } +} + +// skeletonTestPeer is a mock peer that can only serve header requests from a +// pre-perated header chain (which may be arbitrarily wrong for testing). +// +// Requesting anything else from these peers will hard panic. Note, do *not* +// implement any other methods. We actually want to make sure that the skeleton +// syncer only depends on - and will only ever do so - on header requests. +type skeletonTestPeer struct { + id string // Unique identifier of the mock peer + headers []*types.Header // Headers to serve when requested + + serve func(origin uint64) []*types.Header // Hook to allow custom responses + + served uint64 // Number of headers served by this peer + dropped uint64 // Flag whether the peer was dropped (stop responding) +} + +// newSkeletonTestPeer creates a new mock peer to test the skeleton sync with. +func newSkeletonTestPeer(id string, headers []*types.Header) *skeletonTestPeer { + return &skeletonTestPeer{ + id: id, + headers: headers, + } +} + +// newSkeletonTestPeer creates a new mock peer to test the skeleton sync with, +// and sets an optional serve hook that can return headers for delivery instead +// of the predefined chain. Useful for emulating malicious behavior that would +// otherwise require dedicated peer types. +func newSkeletonTestPeerWithHook(id string, headers []*types.Header, serve func(origin uint64) []*types.Header) *skeletonTestPeer { + return &skeletonTestPeer{ + id: id, + headers: headers, + serve: serve, + } +} + +// RequestHeadersByNumber constructs a GetBlockHeaders function based on a numbered +// origin; associated with a particular peer in the download tester. The returned +// function can be used to retrieve batches of headers from the particular peer. +func (p *skeletonTestPeer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool, sink chan *eth.Response) (*eth.Request, error) { + // Since skeleton test peer are in-memory mocks, dropping the does not make + // them inaccepssible. As such, check a local `dropped` field to see if the + // peer has been dropped and should not respond any more. + if atomic.LoadUint64(&p.dropped) != 0 { + return nil, errors.New("peer already dropped") + } + // Skeleton sync retrieves batches of headers going backward without gaps. + // This ensures we can follow a clean parent progression without any reorg + // hiccups. There is no need for any other type of header retrieval, so do + // panic if there's such a request. + if !reverse || skip != 0 { + // Note, if other clients want to do these kinds of requests, it's their + // problem, it will still work. We just don't want *us* making complicated + // requests without a very strong reason to. + panic(fmt.Sprintf("invalid header retrieval: reverse %v, want true; skip %d, want 0", reverse, skip)) + } + // If the skeleton syncer requests the genesis block, panic. Whilst it could + // be considered a valid request, our code specifically should not request it + // ever since we want to link up headers to an existing local chain, which at + // worse will be the genesis. + if int64(origin)-int64(amount) < 0 { + panic(fmt.Sprintf("headers requested before (or at) genesis: origin %d, amount %d", origin, amount)) + } + // To make concurrency easier, the skeleton syncer always requests fixed size + // batches of headers. Panic if the peer is requested an amount other than the + // configured batch size (apart from the request leading to the genesis). + if amount > requestHeaders || (amount < requestHeaders && origin > uint64(amount)) { + panic(fmt.Sprintf("non-chunk size header batch requested: requested %d, want %d, origin %d", amount, requestHeaders, origin)) + } + // Simple reverse header retrieval. Fill from the peer's chain and return. + // If the tester has a serve hook set, try to use that before falling back + // to the default behavior. + var headers []*types.Header + if p.serve != nil { + headers = p.serve(origin) + } + if headers == nil { + headers = make([]*types.Header, 0, amount) + if len(p.headers) > int(origin) { // Don't serve headers if we're missing the origin + for i := 0; i < amount; i++ { + // Consider nil headers as a form of attack and withhold them. Nil + // cannot be decoded from RLP, so it's not possible to produce an + // attack by sending/receiving those over eth. + header := p.headers[int(origin)-i] + if header == nil { + continue + } + headers = append(headers, header) + } + } + } + atomic.AddUint64(&p.served, uint64(len(headers))) + + hashes := make([]common.Hash, len(headers)) + for i, header := range headers { + hashes[i] = header.Hash() + } + // Deliver the headers to the downloader + req := ð.Request{ + Peer: p.id, + } + res := ð.Response{ + Req: req, + Res: (*eth.BlockHeadersPacket)(&headers), + Meta: hashes, + Time: 1, + Done: make(chan error), + } + go func() { + sink <- res + if err := <-res.Done; err != nil { + log.Warn("Skeleton test peer response rejected", "err", err) + atomic.AddUint64(&p.dropped, 1) + } + }() + return req, nil +} + +func (p *skeletonTestPeer) Head() (common.Hash, *big.Int) { + panic("skeleton sync must not request the remote head") +} + +func (p *skeletonTestPeer) RequestHeadersByHash(common.Hash, int, int, bool, chan *eth.Response) (*eth.Request, error) { + panic("skeleton sync must not request headers by hash") +} + +func (p *skeletonTestPeer) RequestBodies([]common.Hash, chan *eth.Response) (*eth.Request, error) { + panic("skeleton sync must not request block bodies") +} + +func (p *skeletonTestPeer) RequestReceipts([]common.Hash, chan *eth.Response) (*eth.Request, error) { + panic("skeleton sync must not request receipts") +} + +// Tests various sync initialzations based on previous leftovers in the database +// and announced heads. +func TestSkeletonSyncInit(t *testing.T) { + // Create a few key headers + var ( + genesis = &types.Header{Number: big.NewInt(0)} + block49 = &types.Header{Number: big.NewInt(49)} + block49B = &types.Header{Number: big.NewInt(49), Extra: []byte("B")} + block50 = &types.Header{Number: big.NewInt(50), ParentHash: block49.Hash()} + ) + tests := []struct { + headers []*types.Header // Database content (beside the genesis) + oldstate []*subchain // Old sync state with various interrupted subchains + head *types.Header // New head header to announce to reorg to + newstate []*subchain // Expected sync state after the reorg + }{ + // Completely empty database with only the genesis set. The sync is expected + // to create a single subchain with the requested head. + { + head: block50, + newstate: []*subchain{{Head: 50, Tail: 50}}, + }, + // Empty database with only the genesis set with a leftover empty sync + // progess. This is a synthetic case, just for the sake of covering things. + { + oldstate: []*subchain{}, + head: block50, + newstate: []*subchain{{Head: 50, Tail: 50}}, + }, + // A single leftover subchain is present, older than the new head. The + // old subchain should be left as is and a new one appended to the sync + // status. + { + oldstate: []*subchain{{Head: 10, Tail: 5}}, + head: block50, + newstate: []*subchain{ + {Head: 50, Tail: 50}, + {Head: 10, Tail: 5}, + }, + }, + // Multiple leftover subchains are present, older than the new head. The + // old subchains should be left as is and a new one appended to the sync + // status. + { + oldstate: []*subchain{ + {Head: 20, Tail: 15}, + {Head: 10, Tail: 5}, + }, + head: block50, + newstate: []*subchain{ + {Head: 50, Tail: 50}, + {Head: 20, Tail: 15}, + {Head: 10, Tail: 5}, + }, + }, + // A single leftover subchain is present, newer than the new head. The + // newer subchain should be deleted and a fresh one created for the head. + { + oldstate: []*subchain{{Head: 65, Tail: 60}}, + head: block50, + newstate: []*subchain{{Head: 50, Tail: 50}}, + }, + // Multiple leftover subchain is present, newer than the new head. The + // newer subchains should be deleted and a fresh one created for the head. + { + oldstate: []*subchain{ + {Head: 75, Tail: 70}, + {Head: 65, Tail: 60}, + }, + head: block50, + newstate: []*subchain{{Head: 50, Tail: 50}}, + }, + + // Two leftover subchains are present, one fully older and one fully + // newer than the announced head. The head should delete the newer one, + // keeping the older one. + { + oldstate: []*subchain{ + {Head: 65, Tail: 60}, + {Head: 10, Tail: 5}, + }, + head: block50, + newstate: []*subchain{ + {Head: 50, Tail: 50}, + {Head: 10, Tail: 5}, + }, + }, + // Multiple leftover subchains are present, some fully older and some + // fully newer than the announced head. The head should delete the newer + // ones, keeping the older ones. + { + oldstate: []*subchain{ + {Head: 75, Tail: 70}, + {Head: 65, Tail: 60}, + {Head: 20, Tail: 15}, + {Head: 10, Tail: 5}, + }, + head: block50, + newstate: []*subchain{ + {Head: 50, Tail: 50}, + {Head: 20, Tail: 15}, + {Head: 10, Tail: 5}, + }, + }, + // A single leftover subchain is present and the new head is extending + // it with one more header. We expect the subchain head to be pushed + // forward. + { + headers: []*types.Header{block49}, + oldstate: []*subchain{{Head: 49, Tail: 5}}, + head: block50, + newstate: []*subchain{{Head: 50, Tail: 5}}, + }, + // A single leftover subchain is present and although the new head does + // extend it number wise, the hash chain does not link up. We expect a + // new subchain to be created for the dangling head. + { + headers: []*types.Header{block49B}, + oldstate: []*subchain{{Head: 49, Tail: 5}}, + head: block50, + newstate: []*subchain{ + {Head: 50, Tail: 50}, + {Head: 49, Tail: 5}, + }, + }, + // A single leftover subchain is present. A new head is announced that + // links into the middle of it, correctly anchoring into an existing + // header. We expect the old subchain to be truncated and extended with + // the new head. + { + headers: []*types.Header{block49}, + oldstate: []*subchain{{Head: 100, Tail: 5}}, + head: block50, + newstate: []*subchain{{Head: 50, Tail: 5}}, + }, + // A single leftover subchain is present. A new head is announced that + // links into the middle of it, but does not anchor into an existing + // header. We expect the old subchain to be truncated and a new chain + // be created for the dangling head. + { + headers: []*types.Header{block49B}, + oldstate: []*subchain{{Head: 100, Tail: 5}}, + head: block50, + newstate: []*subchain{ + {Head: 50, Tail: 50}, + {Head: 49, Tail: 5}, + }, + }, + } + for i, tt := range tests { + // Create a fresh database and initialize it with the starting state + db := rawdb.NewMemoryDatabase() + + rawdb.WriteHeader(db, genesis) + for _, header := range tt.headers { + rawdb.WriteSkeletonHeader(db, header) + } + if tt.oldstate != nil { + blob, _ := json.Marshal(&skeletonProgress{Subchains: tt.oldstate}) + rawdb.WriteSkeletonSyncStatus(db, blob) + } + // Create a skeleton sync and run a cycle + wait := make(chan struct{}) + + skeleton := newSkeleton(db, newPeerSet(), nil, newHookedBackfiller()) + skeleton.syncStarting = func() { close(wait) } + skeleton.Sync(tt.head, true) + + <-wait + skeleton.Terminate() + + // Ensure the correct resulting sync status + var progress skeletonProgress + json.Unmarshal(rawdb.ReadSkeletonSyncStatus(db), &progress) + + if len(progress.Subchains) != len(tt.newstate) { + t.Errorf("test %d: subchain count mismatch: have %d, want %d", i, len(progress.Subchains), len(tt.newstate)) + continue + } + for j := 0; j < len(progress.Subchains); j++ { + if progress.Subchains[j].Head != tt.newstate[j].Head { + t.Errorf("test %d: subchain %d head mismatch: have %d, want %d", i, j, progress.Subchains[j].Head, tt.newstate[j].Head) + } + if progress.Subchains[j].Tail != tt.newstate[j].Tail { + t.Errorf("test %d: subchain %d tail mismatch: have %d, want %d", i, j, progress.Subchains[j].Tail, tt.newstate[j].Tail) + } + } + } +} + +// Tests that a running skeleton sync can be extended with properly linked up +// headers but not with side chains. +func TestSkeletonSyncExtend(t *testing.T) { + // Create a few key headers + var ( + genesis = &types.Header{Number: big.NewInt(0)} + block49 = &types.Header{Number: big.NewInt(49)} + block49B = &types.Header{Number: big.NewInt(49), Extra: []byte("B")} + block50 = &types.Header{Number: big.NewInt(50), ParentHash: block49.Hash()} + block51 = &types.Header{Number: big.NewInt(51), ParentHash: block50.Hash()} + ) + tests := []struct { + head *types.Header // New head header to announce to reorg to + extend *types.Header // New head header to announce to extend with + newstate []*subchain // Expected sync state after the reorg + err error // Whether extension succeeds or not + }{ + // Initialize a sync and try to extend it with a subsequent block. + { + head: block49, + extend: block50, + newstate: []*subchain{ + {Head: 50, Tail: 49}, + }, + }, + // Initialize a sync and try to extend it with the existing head block. + { + head: block49, + extend: block49, + newstate: []*subchain{ + {Head: 49, Tail: 49}, + }, + err: errReorgDenied, + }, + // Initialize a sync and try to extend it with a sibling block. + { + head: block49, + extend: block49B, + newstate: []*subchain{ + {Head: 49, Tail: 49}, + }, + err: errReorgDenied, + }, + // Initialize a sync and try to extend it with a number-wise sequential + // header, but a hash wise non-linking one. + { + head: block49B, + extend: block50, + newstate: []*subchain{ + {Head: 49, Tail: 49}, + }, + err: errReorgDenied, + }, + // Initialize a sync and try to extend it with a non-linking future block. + { + head: block49, + extend: block51, + newstate: []*subchain{ + {Head: 49, Tail: 49}, + }, + err: errReorgDenied, + }, + // Initialize a sync and try to extend it with a past canonical block. + { + head: block50, + extend: block49, + newstate: []*subchain{ + {Head: 50, Tail: 50}, + }, + err: errReorgDenied, + }, + // Initialize a sync and try to extend it with a past sidechain block. + { + head: block50, + extend: block49B, + newstate: []*subchain{ + {Head: 50, Tail: 50}, + }, + err: errReorgDenied, + }, + } + for i, tt := range tests { + // Create a fresh database and initialize it with the starting state + db := rawdb.NewMemoryDatabase() + rawdb.WriteHeader(db, genesis) + + // Create a skeleton sync and run a cycle + wait := make(chan struct{}) + + skeleton := newSkeleton(db, newPeerSet(), nil, newHookedBackfiller()) + skeleton.syncStarting = func() { close(wait) } + skeleton.Sync(tt.head, true) + + <-wait + if err := skeleton.Sync(tt.extend, false); err != tt.err { + t.Errorf("extension failure mismatch: have %v, want %v", err, tt.err) + } + skeleton.Terminate() + + // Ensure the correct resulting sync status + var progress skeletonProgress + json.Unmarshal(rawdb.ReadSkeletonSyncStatus(db), &progress) + + if len(progress.Subchains) != len(tt.newstate) { + t.Errorf("test %d: subchain count mismatch: have %d, want %d", i, len(progress.Subchains), len(tt.newstate)) + continue + } + for j := 0; j < len(progress.Subchains); j++ { + if progress.Subchains[j].Head != tt.newstate[j].Head { + t.Errorf("test %d: subchain %d head mismatch: have %d, want %d", i, j, progress.Subchains[j].Head, tt.newstate[j].Head) + } + if progress.Subchains[j].Tail != tt.newstate[j].Tail { + t.Errorf("test %d: subchain %d tail mismatch: have %d, want %d", i, j, progress.Subchains[j].Tail, tt.newstate[j].Tail) + } + } + } +} + +// Tests that the skeleton sync correctly retrieves headers from one or more +// peers without duplicates or other strange side effects. +func TestSkeletonSyncRetrievals(t *testing.T) { + log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) + + // Since skeleton headers don't need to be meaningful, beyond a parent hash + // progression, create a long fake chain to test with. + chain := []*types.Header{{Number: big.NewInt(0)}} + for i := 1; i < 10000; i++ { + chain = append(chain, &types.Header{ + ParentHash: chain[i-1].Hash(), + Number: big.NewInt(int64(i)), + }) + } + tests := []struct { + headers []*types.Header // Database content (beside the genesis) + oldstate []*subchain // Old sync state with various interrupted subchains + + head *types.Header // New head header to announce to reorg to + peers []*skeletonTestPeer // Initial peer set to start the sync with + midstate []*subchain // Expected sync state after initial cycle + midserve uint64 // Expected number of header retrievals after initial cycle + middrop uint64 // Expectd number of peers dropped after initial cycle + + newHead *types.Header // New header to annount on top of the old one + newPeer *skeletonTestPeer // New peer to join the skeleton syncer + endstate []*subchain // Expected sync state after the post-init event + endserve uint64 // Expected number of header retrievals after the post-init event + enddrop uint64 // Expectd number of peers dropped after the post-init event + }{ + // Completely empty database with only the genesis set. The sync is expected + // to create a single subchain with the requested head. No peers however, so + // the sync should be stuck without any progression. + // + // When a new peer is added, it should detect the join and fill the headers + // to the genesis block. + { + head: chain[len(chain)-1], + midstate: []*subchain{{Head: uint64(len(chain) - 1), Tail: uint64(len(chain) - 1)}}, + + newPeer: newSkeletonTestPeer("test-peer", chain), + endstate: []*subchain{{Head: uint64(len(chain) - 1), Tail: 1}}, + endserve: uint64(len(chain) - 2), // len - head - genesis + }, + // Completely empty database with only the genesis set. The sync is expected + // to create a single subchain with the requested head. With one valid peer, + // the sync is expected to complete already in the initial round. + // + // Adding a second peer should not have any effect. + { + head: chain[len(chain)-1], + peers: []*skeletonTestPeer{newSkeletonTestPeer("test-peer-1", chain)}, + midstate: []*subchain{{Head: uint64(len(chain) - 1), Tail: 1}}, + midserve: uint64(len(chain) - 2), // len - head - genesis + + newPeer: newSkeletonTestPeer("test-peer-2", chain), + endstate: []*subchain{{Head: uint64(len(chain) - 1), Tail: 1}}, + endserve: uint64(len(chain) - 2), // len - head - genesis + }, + // Completely empty database with only the genesis set. The sync is expected + // to create a single subchain with the requested head. With many valid peers, + // the sync is expected to complete already in the initial round. + // + // Adding a new peer should not have any effect. + { + head: chain[len(chain)-1], + peers: []*skeletonTestPeer{ + newSkeletonTestPeer("test-peer-1", chain), + newSkeletonTestPeer("test-peer-2", chain), + newSkeletonTestPeer("test-peer-3", chain), + }, + midstate: []*subchain{{Head: uint64(len(chain) - 1), Tail: 1}}, + midserve: uint64(len(chain) - 2), // len - head - genesis + + newPeer: newSkeletonTestPeer("test-peer-4", chain), + endstate: []*subchain{{Head: uint64(len(chain) - 1), Tail: 1}}, + endserve: uint64(len(chain) - 2), // len - head - genesis + }, + // This test checks if a peer tries to withhold a header - *on* the sync + // boundary - instead of sending the requested amount. The malicious short + // package should not be accepted. + // + // Joining with a new peer should however unblock the sync. + { + head: chain[requestHeaders+100], + peers: []*skeletonTestPeer{ + newSkeletonTestPeer("header-skipper", append(append(append([]*types.Header{}, chain[:99]...), nil), chain[100:]...)), + }, + midstate: []*subchain{{Head: requestHeaders + 100, Tail: 100}}, + midserve: requestHeaders + 101 - 3, // len - head - genesis - missing + middrop: 1, // penalize shortened header deliveries + + newPeer: newSkeletonTestPeer("good-peer", chain), + endstate: []*subchain{{Head: requestHeaders + 100, Tail: 1}}, + endserve: (requestHeaders + 101 - 3) + (100 - 1), // midserve + lenrest - genesis + enddrop: 1, // no new drops + }, + // This test checks if a peer tries to withhold a header - *off* the sync + // boundary - instead of sending the requested amount. The malicious short + // package should not be accepted. + // + // Joining with a new peer should however unblock the sync. + { + head: chain[requestHeaders+100], + peers: []*skeletonTestPeer{ + newSkeletonTestPeer("header-skipper", append(append(append([]*types.Header{}, chain[:50]...), nil), chain[51:]...)), + }, + midstate: []*subchain{{Head: requestHeaders + 100, Tail: 100}}, + midserve: requestHeaders + 101 - 3, // len - head - genesis - missing + middrop: 1, // penalize shortened header deliveries + + newPeer: newSkeletonTestPeer("good-peer", chain), + endstate: []*subchain{{Head: requestHeaders + 100, Tail: 1}}, + endserve: (requestHeaders + 101 - 3) + (100 - 1), // midserve + lenrest - genesis + enddrop: 1, // no new drops + }, + // This test checks if a peer tries to duplicate a header - *on* the sync + // boundary - instead of sending the correct sequence. The malicious duped + // package should not be accepted. + // + // Joining with a new peer should however unblock the sync. + { + head: chain[requestHeaders+100], // We want to force the 100th header to be a request boundary + peers: []*skeletonTestPeer{ + newSkeletonTestPeer("header-duper", append(append(append([]*types.Header{}, chain[:99]...), chain[98]), chain[100:]...)), + }, + midstate: []*subchain{{Head: requestHeaders + 100, Tail: 100}}, + midserve: requestHeaders + 101 - 2, // len - head - genesis + middrop: 1, // penalize invalid header sequences + + newPeer: newSkeletonTestPeer("good-peer", chain), + endstate: []*subchain{{Head: requestHeaders + 100, Tail: 1}}, + endserve: (requestHeaders + 101 - 2) + (100 - 1), // midserve + lenrest - genesis + enddrop: 1, // no new drops + }, + // This test checks if a peer tries to duplicate a header - *off* the sync + // boundary - instead of sending the correct sequence. The malicious duped + // package should not be accepted. + // + // Joining with a new peer should however unblock the sync. + { + head: chain[requestHeaders+100], // We want to force the 100th header to be a request boundary + peers: []*skeletonTestPeer{ + newSkeletonTestPeer("header-duper", append(append(append([]*types.Header{}, chain[:50]...), chain[49]), chain[51:]...)), + }, + midstate: []*subchain{{Head: requestHeaders + 100, Tail: 100}}, + midserve: requestHeaders + 101 - 2, // len - head - genesis + middrop: 1, // penalize invalid header sequences + + newPeer: newSkeletonTestPeer("good-peer", chain), + endstate: []*subchain{{Head: requestHeaders + 100, Tail: 1}}, + endserve: (requestHeaders + 101 - 2) + (100 - 1), // midserve + lenrest - genesis + enddrop: 1, // no new drops + }, + // This test checks if a peer tries to inject a different header - *on* + // the sync boundary - instead of sending the correct sequence. The bad + // package should not be accepted. + // + // Joining with a new peer should however unblock the sync. + { + head: chain[requestHeaders+100], // We want to force the 100th header to be a request boundary + peers: []*skeletonTestPeer{ + newSkeletonTestPeer("header-changer", + append( + append( + append([]*types.Header{}, chain[:99]...), + &types.Header{ + ParentHash: chain[98].Hash(), + Number: big.NewInt(int64(99)), + GasLimit: 1, + }, + ), chain[100:]..., + ), + ), + }, + midstate: []*subchain{{Head: requestHeaders + 100, Tail: 100}}, + midserve: requestHeaders + 101 - 2, // len - head - genesis + middrop: 1, // different set of headers, drop // TODO(karalabe): maybe just diff sync? + + newPeer: newSkeletonTestPeer("good-peer", chain), + endstate: []*subchain{{Head: requestHeaders + 100, Tail: 1}}, + endserve: (requestHeaders + 101 - 2) + (100 - 1), // midserve + lenrest - genesis + enddrop: 1, // no new drops + }, + // This test checks if a peer tries to inject a different header - *off* + // the sync boundary - instead of sending the correct sequence. The bad + // package should not be accepted. + // + // Joining with a new peer should however unblock the sync. + { + head: chain[requestHeaders+100], // We want to force the 100th header to be a request boundary + peers: []*skeletonTestPeer{ + newSkeletonTestPeer("header-changer", + append( + append( + append([]*types.Header{}, chain[:50]...), + &types.Header{ + ParentHash: chain[49].Hash(), + Number: big.NewInt(int64(50)), + GasLimit: 1, + }, + ), chain[51:]..., + ), + ), + }, + midstate: []*subchain{{Head: requestHeaders + 100, Tail: 100}}, + midserve: requestHeaders + 101 - 2, // len - head - genesis + middrop: 1, // different set of headers, drop + + newPeer: newSkeletonTestPeer("good-peer", chain), + endstate: []*subchain{{Head: requestHeaders + 100, Tail: 1}}, + endserve: (requestHeaders + 101 - 2) + (100 - 1), // midserve + lenrest - genesis + enddrop: 1, // no new drops + }, + // This test reproduces a bug caught during review (kudos to @holiman) + // where a subchain is merged with a previously interrupted one, causing + // pending data in the scratch space to become "invalid" (since we jump + // ahead during subchain merge). In that case it is expected to ignore + // the queued up data instead of trying to process on top of a shifted + // task set. + // + // The test is a bit convoluted since it needs to trigger a concurrency + // issue. First we sync up an initial chain of 2x512 items. Then announce + // 2x512+2 as head and delay delivering the head batch to fill the scratch + // space first. The delivery head should merge with the previous download + // and the scratch space must not be consumed further. + { + head: chain[2*requestHeaders], + peers: []*skeletonTestPeer{ + newSkeletonTestPeerWithHook("peer-1", chain, func(origin uint64) []*types.Header { + if origin == chain[2*requestHeaders+1].Number.Uint64() { + time.Sleep(100 * time.Millisecond) + } + return nil // Fallback to default behavior, just delayed + }), + newSkeletonTestPeerWithHook("peer-2", chain, func(origin uint64) []*types.Header { + if origin == chain[2*requestHeaders+1].Number.Uint64() { + time.Sleep(100 * time.Millisecond) + } + return nil // Fallback to default behavior, just delayed + }), + }, + midstate: []*subchain{{Head: 2 * requestHeaders, Tail: 1}}, + midserve: 2*requestHeaders - 1, // len - head - genesis + + newHead: chain[2*requestHeaders+2], + endstate: []*subchain{{Head: 2*requestHeaders + 2, Tail: 1}}, + endserve: 4 * requestHeaders, + }, + } + for i, tt := range tests { + // Create a fresh database and initialize it with the starting state + db := rawdb.NewMemoryDatabase() + rawdb.WriteHeader(db, chain[0]) + + // Create a peer set to feed headers through + peerset := newPeerSet() + for _, peer := range tt.peers { + peerset.Register(newPeerConnection(peer.id, eth.ETH66, peer, log.New("id", peer.id))) + } + // Create a peer dropper to track malicious peers + dropped := make(map[string]int) + drop := func(peer string) { + if p := peerset.Peer(peer); p != nil { + atomic.AddUint64(&p.peer.(*skeletonTestPeer).dropped, 1) + } + peerset.Unregister(peer) + dropped[peer]++ + } + // Create a skeleton sync and run a cycle + skeleton := newSkeleton(db, peerset, drop, newHookedBackfiller()) + skeleton.Sync(tt.head, true) + + var progress skeletonProgress + // Wait a bit (bleah) for the initial sync loop to go to idle. This might + // be either a finish or a never-start hence why there's no event to hook. + check := func() error { + if len(progress.Subchains) != len(tt.midstate) { + return fmt.Errorf("test %d, mid state: subchain count mismatch: have %d, want %d", i, len(progress.Subchains), len(tt.midstate)) + + } + for j := 0; j < len(progress.Subchains); j++ { + if progress.Subchains[j].Head != tt.midstate[j].Head { + return fmt.Errorf("test %d, mid state: subchain %d head mismatch: have %d, want %d", i, j, progress.Subchains[j].Head, tt.midstate[j].Head) + } + if progress.Subchains[j].Tail != tt.midstate[j].Tail { + return fmt.Errorf("test %d, mid state: subchain %d tail mismatch: have %d, want %d", i, j, progress.Subchains[j].Tail, tt.midstate[j].Tail) + } + } + return nil + } + + waitStart := time.Now() + for waitTime := 20 * time.Millisecond; time.Since(waitStart) < time.Second; waitTime = waitTime * 2 { + time.Sleep(waitTime) + // Check the post-init end state if it matches the required results + json.Unmarshal(rawdb.ReadSkeletonSyncStatus(db), &progress) + if err := check(); err == nil { + break + } + } + if err := check(); err != nil { + t.Error(err) + continue + } + var served uint64 + for _, peer := range tt.peers { + served += atomic.LoadUint64(&peer.served) + } + if served != tt.midserve { + t.Errorf("test %d, mid state: served headers mismatch: have %d, want %d", i, served, tt.midserve) + } + var drops uint64 + for _, peer := range tt.peers { + drops += atomic.LoadUint64(&peer.dropped) + } + if drops != tt.middrop { + t.Errorf("test %d, mid state: dropped peers mismatch: have %d, want %d", i, drops, tt.middrop) + } + // Apply the post-init events if there's any + if tt.newHead != nil { + skeleton.Sync(tt.newHead, true) + } + if tt.newPeer != nil { + if err := peerset.Register(newPeerConnection(tt.newPeer.id, eth.ETH66, tt.newPeer, log.New("id", tt.newPeer.id))); err != nil { + t.Errorf("test %d: failed to register new peer: %v", i, err) + } + } + // Wait a bit (bleah) for the second sync loop to go to idle. This might + // be either a finish or a never-start hence why there's no event to hook. + check = func() error { + if len(progress.Subchains) != len(tt.endstate) { + return fmt.Errorf("test %d, end state: subchain count mismatch: have %d, want %d", i, len(progress.Subchains), len(tt.endstate)) + } + for j := 0; j < len(progress.Subchains); j++ { + if progress.Subchains[j].Head != tt.endstate[j].Head { + return fmt.Errorf("test %d, end state: subchain %d head mismatch: have %d, want %d", i, j, progress.Subchains[j].Head, tt.endstate[j].Head) + } + if progress.Subchains[j].Tail != tt.endstate[j].Tail { + return fmt.Errorf("test %d, end state: subchain %d tail mismatch: have %d, want %d", i, j, progress.Subchains[j].Tail, tt.endstate[j].Tail) + } + } + return nil + } + waitStart = time.Now() + for waitTime := 20 * time.Millisecond; time.Since(waitStart) < time.Second; waitTime = waitTime * 2 { + time.Sleep(waitTime) + // Check the post-init end state if it matches the required results + json.Unmarshal(rawdb.ReadSkeletonSyncStatus(db), &progress) + if err := check(); err == nil { + break + } + } + if err := check(); err != nil { + t.Error(err) + continue + } + // Check that the peers served no more headers than we actually needed + served = 0 + for _, peer := range tt.peers { + served += atomic.LoadUint64(&peer.served) + } + if tt.newPeer != nil { + served += atomic.LoadUint64(&tt.newPeer.served) + } + if served != tt.endserve { + t.Errorf("test %d, end state: served headers mismatch: have %d, want %d", i, served, tt.endserve) + } + drops = 0 + for _, peer := range tt.peers { + drops += atomic.LoadUint64(&peer.dropped) + } + if tt.newPeer != nil { + drops += atomic.LoadUint64(&tt.newPeer.dropped) + } + if drops != tt.middrop { + t.Errorf("test %d, end state: dropped peers mismatch: have %d, want %d", i, drops, tt.middrop) + } + // Clean up any leftover skeleton sync resources + skeleton.Terminate() + } +} diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 1572377f89..6ab43891f7 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -27,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/beacon" "github.com/ethereum/go-ethereum/consensus/bor" "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" @@ -139,8 +140,10 @@ type Config struct { TxLookupLimit uint64 `toml:",omitempty"` // The maximum number of blocks from head whose tx indices are reserved. - // Whitelist of required block number -> hash values to accept - Whitelist map[uint64]common.Hash `toml:"-"` + // PeerRequiredBlocks is a set of block number -> hash mappings which must be in the + // canonical chain of all remote peers. Setting the option makes geth verify the + // presence of these blocks for every new peer connection. + PeerRequiredBlocks map[uint64]common.Hash `toml:"-"` // Light client options LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests @@ -221,12 +224,11 @@ type Config struct { } // CreateConsensusEngine creates a consensus engine for the given chain configuration. -func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, ethConfig *Config, db ethdb.Database, blockchainAPI *ethapi.PublicBlockChainAPI) consensus.Engine { +func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, ethConfig *Config, notify []string, noverify bool, db ethdb.Database, blockchainAPI *ethapi.PublicBlockChainAPI) consensus.Engine { config := ðConfig.Ethash - notify := ethConfig.Miner.Notify - noverify := ethConfig.Miner.Noverify // If proof-of-authority is requested, set it up + var engine consensus.Engine if chainConfig.Clique != nil { return clique.New(chainConfig.Clique, db) } @@ -236,29 +238,28 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et // Then, bor != nil will also be enabled for ethash and clique. Only enable Bor for real if there is a validator contract present. if chainConfig.Bor != nil && chainConfig.Bor.ValidatorContract != "" { return bor.New(chainConfig, db, blockchainAPI, ethConfig.HeimdallURL, ethConfig.WithoutHeimdall) + } else { + switch config.PowMode { + case ethash.ModeFake: + log.Warn("Ethash used in fake mode") + case ethash.ModeTest: + log.Warn("Ethash used in test mode") + case ethash.ModeShared: + log.Warn("Ethash used in shared mode") + } + engine = ethash.New(ethash.Config{ + PowMode: config.PowMode, + CacheDir: stack.ResolvePath(config.CacheDir), + CachesInMem: config.CachesInMem, + CachesOnDisk: config.CachesOnDisk, + CachesLockMmap: config.CachesLockMmap, + DatasetDir: config.DatasetDir, + DatasetsInMem: config.DatasetsInMem, + DatasetsOnDisk: config.DatasetsOnDisk, + DatasetsLockMmap: config.DatasetsLockMmap, + NotifyFull: config.NotifyFull, + }, notify, noverify) + engine.(*ethash.Ethash).SetThreads(-1) // Disable CPU mining } - - // Otherwise assume proof-of-work - switch config.PowMode { - case ethash.ModeFake: - log.Warn("Ethash used in fake mode") - case ethash.ModeTest: - log.Warn("Ethash used in test mode") - case ethash.ModeShared: - log.Warn("Ethash used in shared mode") - } - engine := ethash.New(ethash.Config{ - PowMode: config.PowMode, - CacheDir: stack.ResolvePath(config.CacheDir), - CachesInMem: config.CachesInMem, - CachesOnDisk: config.CachesOnDisk, - CachesLockMmap: config.CachesLockMmap, - DatasetDir: config.DatasetDir, - DatasetsInMem: config.DatasetsInMem, - DatasetsOnDisk: config.DatasetsOnDisk, - DatasetsLockMmap: config.DatasetsLockMmap, - NotifyFull: config.NotifyFull, - }, notify, noverify) - engine.SetThreads(-1) // Disable CPU mining - return engine + return beacon.New(engine) } diff --git a/eth/ethconfig/gen_config.go b/eth/ethconfig/gen_config.go index 70a9649bff..874e30dffd 100644 --- a/eth/ethconfig/gen_config.go +++ b/eth/ethconfig/gen_config.go @@ -26,7 +26,7 @@ func (c Config) MarshalTOML() (interface{}, error) { NoPruning bool NoPrefetch bool TxLookupLimit uint64 `toml:",omitempty"` - Whitelist map[uint64]common.Hash `toml:"-"` + PeerRequiredBlocks map[uint64]common.Hash `toml:"-"` LightServ int `toml:",omitempty"` LightIngress int `toml:",omitempty"` LightEgress int `toml:",omitempty"` @@ -71,7 +71,7 @@ func (c Config) MarshalTOML() (interface{}, error) { enc.NoPruning = c.NoPruning enc.NoPrefetch = c.NoPrefetch enc.TxLookupLimit = c.TxLookupLimit - enc.Whitelist = c.Whitelist + enc.PeerRequiredBlocks = c.PeerRequiredBlocks enc.LightServ = c.LightServ enc.LightIngress = c.LightIngress enc.LightEgress = c.LightEgress @@ -120,7 +120,7 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { NoPruning *bool NoPrefetch *bool TxLookupLimit *uint64 `toml:",omitempty"` - Whitelist map[uint64]common.Hash `toml:"-"` + PeerRequiredBlocks map[uint64]common.Hash `toml:"-"` LightServ *int `toml:",omitempty"` LightIngress *int `toml:",omitempty"` LightEgress *int `toml:",omitempty"` @@ -184,8 +184,8 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.TxLookupLimit != nil { c.TxLookupLimit = *dec.TxLookupLimit } - if dec.Whitelist != nil { - c.Whitelist = dec.Whitelist + if dec.PeerRequiredBlocks != nil { + c.PeerRequiredBlocks = dec.PeerRequiredBlocks } if dec.LightServ != nil { c.LightServ = *dec.LightServ diff --git a/eth/fetcher/block_fetcher_test.go b/eth/fetcher/block_fetcher_test.go index 628a565042..06c61ae55d 100644 --- a/eth/fetcher/block_fetcher_test.go +++ b/eth/fetcher/block_fetcher_test.go @@ -364,6 +364,7 @@ func testSequentialAnnouncements(t *testing.T, light bool) { hashes, blocks := makeChain(targetBlocks, 0, genesis) tester := newTester(light) + defer tester.fetcher.Stop() headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) @@ -743,7 +744,7 @@ func testInvalidNumberAnnouncement(t *testing.T, light bool) { badBodyFetcher := tester.makeBodyFetcher("bad", blocks, 0) imported := make(chan interface{}) - announced := make(chan interface{}) + announced := make(chan interface{}, 2) tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { if light { if header == nil { @@ -806,6 +807,7 @@ func TestEmptyBlockShortCircuit(t *testing.T) { hashes, blocks := makeChain(32, 0, genesis) tester := newTester(false) + defer tester.fetcher.Stop() headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) diff --git a/eth/gasprice/feehistory.go b/eth/gasprice/feehistory.go index 970dfd4467..4113089afb 100644 --- a/eth/gasprice/feehistory.go +++ b/eth/gasprice/feehistory.go @@ -117,7 +117,7 @@ func (oracle *Oracle) processBlock(bf *blockFees, percentiles []float64) { reward, _ := tx.EffectiveGasTip(bf.block.BaseFee()) sorter[i] = txGasAndReward{gasUsed: bf.receipts[i].GasUsed, reward: reward} } - sort.Sort(sorter) + sort.Stable(sorter) var txIndex int sumGasUsed := sorter[0].gasUsed diff --git a/eth/handler.go b/eth/handler.go index 55ca869c77..40edfa2d17 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -86,7 +86,8 @@ type handlerConfig struct { BloomCache uint64 // Megabytes to alloc for snap sync bloom EventMux *event.TypeMux // Legacy event mux, deprecate for `feed` Checkpoint *params.TrustedCheckpoint // Hard coded checkpoint for sync challenges - Whitelist map[uint64]common.Hash // Hard coded whitelist for sync challenged + + PeerRequiredBlocks map[uint64]common.Hash // Hard coded map of required block hashes for sync challenges } type handler struct { @@ -115,7 +116,7 @@ type handler struct { txsSub event.Subscription minedBlockSub *event.TypeMuxSubscription - whitelist map[uint64]common.Hash + peerRequiredBlocks map[uint64]common.Hash // channels for fetcher, syncer, txsyncLoop quitSync chan struct{} @@ -132,16 +133,16 @@ func newHandler(config *handlerConfig) (*handler, error) { config.EventMux = new(event.TypeMux) // Nicety initialization for tests } h := &handler{ - networkID: config.Network, - forkFilter: forkid.NewFilter(config.Chain), - eventMux: config.EventMux, - database: config.Database, - txpool: config.TxPool, - chain: config.Chain, - peers: newPeerSet(), - merger: config.Merger, - whitelist: config.Whitelist, - quitSync: make(chan struct{}), + networkID: config.Network, + forkFilter: forkid.NewFilter(config.Chain), + eventMux: config.EventMux, + database: config.Database, + txpool: config.TxPool, + chain: config.Chain, + peers: newPeerSet(), + merger: config.Merger, + peerRequiredBlocks: config.PeerRequiredBlocks, + quitSync: make(chan struct{}), } if config.Sync == downloader.FullSync { // The database seems empty as the current block is the genesis. Yet the snap @@ -171,10 +172,30 @@ func newHandler(config *handlerConfig) (*handler, error) { h.checkpointNumber = (config.Checkpoint.SectionIndex+1)*params.CHTFrequency - 1 h.checkpointHash = config.Checkpoint.SectionHead } + // If sync succeeds, pass a callback to potentially disable snap sync mode + // and enable transaction propagation. + success := func() { + // If we were running snap sync and it finished, disable doing another + // round on next sync cycle + if atomic.LoadUint32(&h.snapSync) == 1 { + log.Info("Snap sync complete, auto disabling") + atomic.StoreUint32(&h.snapSync, 0) + } + // If we've successfully finished a sync cycle and passed any required + // checkpoint, enable accepting transactions from the network + head := h.chain.CurrentBlock() + if head.NumberU64() >= h.checkpointNumber { + // Checkpoint passed, sanity check the timestamp to have a fallback mechanism + // for non-checkpointed (number = 0) private networks. + if head.Time() >= uint64(time.Now().AddDate(0, -1, 0).Unix()) { + atomic.StoreUint32(&h.acceptTxs, 1) + } + } + } // Construct the downloader (long sync) and its backing state bloom if snap // sync is requested. The downloader is responsible for deallocating the state // bloom when it's done. - h.downloader = downloader.New(h.checkpointNumber, config.Database, h.eventMux, h.chain, nil, h.removePeer) + h.downloader = downloader.New(h.checkpointNumber, config.Database, h.eventMux, h.chain, nil, h.removePeer, success) // Construct the fetcher (short sync) validator := func(header *types.Header) error { @@ -403,8 +424,8 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { } }() } - // If we have any explicit whitelist block hashes, request them - for number, hash := range h.whitelist { + // If we have any explicit peer required block hashes, request them + for number := range h.peerRequiredBlocks { resCh := make(chan *eth.Response) if _, err := peer.RequestHeadersByNumber(number, 1, 0, false, resCh); err != nil { return err @@ -417,25 +438,25 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { case res := <-resCh: headers := ([]*types.Header)(*res.Res.(*eth.BlockHeadersPacket)) if len(headers) == 0 { - // Whitelisted blocks are allowed to be missing if the remote + // Required blocks are allowed to be missing if the remote // node is not yet synced res.Done <- nil return } // Validate the header and either drop the peer or continue if len(headers) > 1 { - res.Done <- errors.New("too many headers in whitelist response") + res.Done <- errors.New("too many headers in required block response") return } if headers[0].Number.Uint64() != number || headers[0].Hash() != hash { - peer.Log().Info("Whitelist mismatch, dropping peer", "number", number, "hash", headers[0].Hash(), "want", hash) - res.Done <- errors.New("whitelist block mismatch") + peer.Log().Info("Required block mismatch, dropping peer", "number", number, "hash", headers[0].Hash(), "want", hash) + res.Done <- errors.New("required block mismatch") return } - peer.Log().Debug("Whitelist block verified", "number", number, "hash", hash) - + peer.Log().Debug("Peer required block verified", "number", number, "hash", hash) + res.Done <- nil case <-timeout.C: - peer.Log().Warn("Whitelist challenge timed out, dropping", "addr", peer.RemoteAddr(), "type", peer.Name()) + peer.Log().Warn("Required block challenge timed out, dropping", "addr", peer.RemoteAddr(), "type", peer.Name()) h.removePeer(peer.ID()) } }(number, hash) diff --git a/eth/handler_eth_test.go b/eth/handler_eth_test.go index 6e1c57cb6c..7d5027ae77 100644 --- a/eth/handler_eth_test.go +++ b/eth/handler_eth_test.go @@ -570,7 +570,7 @@ func testCheckpointChallenge(t *testing.T, syncmode downloader.SyncMode, checkpo t.Fatalf("failed to answer challenge: %v", err) } } else { - responseRlp, _ := rlp.EncodeToBytes(types.Header{Number: response.Number}) + responseRlp, _ := rlp.EncodeToBytes(&types.Header{Number: response.Number}) if err := remote.ReplyBlockHeadersRLP(request.RequestId, []rlp.RawValue{responseRlp}); err != nil { t.Fatalf("failed to answer challenge: %v", err) } diff --git a/eth/peerset.go b/eth/peerset.go index 1e864a8e46..3e54a481e3 100644 --- a/eth/peerset.go +++ b/eth/peerset.go @@ -230,7 +230,7 @@ func (ps *peerSet) snapLen() int { } // peerWithHighestTD retrieves the known peer with the currently highest total -// difficulty. +// difficulty, but below the given PoS switchover threshold. func (ps *peerSet) peerWithHighestTD() *eth.Peer { ps.lock.RLock() defer ps.lock.RUnlock() diff --git a/eth/protocols/eth/handler_test.go b/eth/protocols/eth/handler_test.go index 7d9b378839..55e612b801 100644 --- a/eth/protocols/eth/handler_test.go +++ b/eth/protocols/eth/handler_test.go @@ -264,11 +264,11 @@ func testGetBlockHeaders(t *testing.T, protocol uint) { headers = append(headers, backend.chain.GetBlockByHash(hash).Header()) } // Send the hash request and verify the response - p2p.Send(peer.app, GetBlockHeadersMsg, GetBlockHeadersPacket66{ + p2p.Send(peer.app, GetBlockHeadersMsg, &GetBlockHeadersPacket66{ RequestId: 123, GetBlockHeadersPacket: tt.query, }) - if err := p2p.ExpectMsg(peer.app, BlockHeadersMsg, BlockHeadersPacket66{ + if err := p2p.ExpectMsg(peer.app, BlockHeadersMsg, &BlockHeadersPacket66{ RequestId: 123, BlockHeadersPacket: headers, }); err != nil { @@ -279,14 +279,12 @@ func testGetBlockHeaders(t *testing.T, protocol uint) { if origin := backend.chain.GetBlockByNumber(tt.query.Origin.Number); origin != nil { tt.query.Origin.Hash, tt.query.Origin.Number = origin.Hash(), 0 - p2p.Send(peer.app, GetBlockHeadersMsg, GetBlockHeadersPacket66{ + p2p.Send(peer.app, GetBlockHeadersMsg, &GetBlockHeadersPacket66{ RequestId: 456, GetBlockHeadersPacket: tt.query, }) - if err := p2p.ExpectMsg(peer.app, BlockHeadersMsg, BlockHeadersPacket66{ - RequestId: 456, - BlockHeadersPacket: headers, - }); err != nil { + expected := &BlockHeadersPacket66{RequestId: 456, BlockHeadersPacket: headers} + if err := p2p.ExpectMsg(peer.app, BlockHeadersMsg, expected); err != nil { t.Errorf("test %d by hash: headers mismatch: %v", i, err) } } @@ -364,11 +362,11 @@ func testGetBlockBodies(t *testing.T, protocol uint) { } } // Send the hash request and verify the response - p2p.Send(peer.app, GetBlockBodiesMsg, GetBlockBodiesPacket66{ + p2p.Send(peer.app, GetBlockBodiesMsg, &GetBlockBodiesPacket66{ RequestId: 123, GetBlockBodiesPacket: hashes, }) - if err := p2p.ExpectMsg(peer.app, BlockBodiesMsg, BlockBodiesPacket66{ + if err := p2p.ExpectMsg(peer.app, BlockBodiesMsg, &BlockBodiesPacket66{ RequestId: 123, BlockBodiesPacket: bodies, }); err != nil { @@ -436,7 +434,7 @@ func testGetNodeData(t *testing.T, protocol uint) { it.Release() // Request all hashes. - p2p.Send(peer.app, GetNodeDataMsg, GetNodeDataPacket66{ + p2p.Send(peer.app, GetNodeDataMsg, &GetNodeDataPacket66{ RequestId: 123, GetNodeDataPacket: hashes, }) @@ -546,11 +544,11 @@ func testGetBlockReceipts(t *testing.T, protocol uint) { receipts = append(receipts, backend.chain.GetReceiptsByHash(block.Hash())) } // Send the hash request and verify the response - p2p.Send(peer.app, GetReceiptsMsg, GetReceiptsPacket66{ + p2p.Send(peer.app, GetReceiptsMsg, &GetReceiptsPacket66{ RequestId: 123, GetReceiptsPacket: hashes, }) - if err := p2p.ExpectMsg(peer.app, ReceiptsMsg, ReceiptsPacket66{ + if err := p2p.ExpectMsg(peer.app, ReceiptsMsg, &ReceiptsPacket66{ RequestId: 123, ReceiptsPacket: receipts, }); err != nil { diff --git a/eth/protocols/eth/peer.go b/eth/protocols/eth/peer.go index 4161420f3a..a8af9640bb 100644 --- a/eth/protocols/eth/peer.go +++ b/eth/protocols/eth/peer.go @@ -241,7 +241,7 @@ func (p *Peer) ReplyPooledTransactionsRLP(id uint64, hashes []common.Hash, txs [ p.knownTxs.Add(hashes...) // Not packed into PooledTransactionsPacket to avoid RLP decoding - return p2p.Send(p.rw, PooledTransactionsMsg, PooledTransactionsRLPPacket66{ + return p2p.Send(p.rw, PooledTransactionsMsg, &PooledTransactionsRLPPacket66{ RequestId: id, PooledTransactionsRLPPacket: txs, }) @@ -298,7 +298,7 @@ func (p *Peer) AsyncSendNewBlock(block *types.Block, td *big.Int) { // ReplyBlockHeaders is the eth/66 version of SendBlockHeaders. func (p *Peer) ReplyBlockHeadersRLP(id uint64, headers []rlp.RawValue) error { - return p2p.Send(p.rw, BlockHeadersMsg, BlockHeadersRLPPacket66{ + return p2p.Send(p.rw, BlockHeadersMsg, &BlockHeadersRLPPacket66{ RequestId: id, BlockHeadersRLPPacket: headers, }) @@ -307,7 +307,7 @@ func (p *Peer) ReplyBlockHeadersRLP(id uint64, headers []rlp.RawValue) error { // ReplyBlockBodiesRLP is the eth/66 version of SendBlockBodiesRLP. func (p *Peer) ReplyBlockBodiesRLP(id uint64, bodies []rlp.RawValue) error { // Not packed into BlockBodiesPacket to avoid RLP decoding - return p2p.Send(p.rw, BlockBodiesMsg, BlockBodiesRLPPacket66{ + return p2p.Send(p.rw, BlockBodiesMsg, &BlockBodiesRLPPacket66{ RequestId: id, BlockBodiesRLPPacket: bodies, }) @@ -315,7 +315,7 @@ func (p *Peer) ReplyBlockBodiesRLP(id uint64, bodies []rlp.RawValue) error { // ReplyNodeData is the eth/66 response to GetNodeData. func (p *Peer) ReplyNodeData(id uint64, data [][]byte) error { - return p2p.Send(p.rw, NodeDataMsg, NodeDataPacket66{ + return p2p.Send(p.rw, NodeDataMsg, &NodeDataPacket66{ RequestId: id, NodeDataPacket: data, }) @@ -323,7 +323,7 @@ func (p *Peer) ReplyNodeData(id uint64, data [][]byte) error { // ReplyReceiptsRLP is the eth/66 response to GetReceipts. func (p *Peer) ReplyReceiptsRLP(id uint64, receipts []rlp.RawValue) error { - return p2p.Send(p.rw, ReceiptsMsg, ReceiptsRLPPacket66{ + return p2p.Send(p.rw, ReceiptsMsg, &ReceiptsRLPPacket66{ RequestId: id, ReceiptsRLPPacket: receipts, }) diff --git a/eth/protocols/snap/handler.go b/eth/protocols/snap/handler.go index 0a1ee2637f..314776dffe 100644 --- a/eth/protocols/snap/handler.go +++ b/eth/protocols/snap/handler.go @@ -299,7 +299,7 @@ func ServiceGetAccountRangeQuery(chain *core.BlockChain, req *GetAccountRangePac size uint64 last common.Hash ) - for it.Next() && size < req.Bytes { + for it.Next() { hash, account := it.Hash(), common.CopyBytes(it.Account()) // Track the returned interval for the Merkle proofs @@ -315,6 +315,9 @@ func ServiceGetAccountRangeQuery(chain *core.BlockChain, req *GetAccountRangePac if bytes.Compare(hash[:], req.Limit[:]) >= 0 { break } + if size > req.Bytes { + break + } } it.Release() @@ -464,7 +467,7 @@ func ServiceGetByteCodesQuery(chain *core.BlockChain, req *GetByteCodesPacket) [ // Peers should not request the empty code, but if they do, at // least sent them back a correct response without db lookups codes = append(codes, []byte{}) - } else if blob, err := chain.ContractCode(hash); err == nil { + } else if blob, err := chain.ContractCodeWithPrefix(hash); err == nil { codes = append(codes, blob) bytes += uint64(len(blob)) } diff --git a/eth/protocols/snap/sync.go b/eth/protocols/snap/sync.go index be8644a5a4..665d7601cf 100644 --- a/eth/protocols/snap/sync.go +++ b/eth/protocols/snap/sync.go @@ -168,7 +168,7 @@ type bytecodeResponse struct { // to actual requests and to validate any security constraints. // // Concurrency note: storage requests and responses are handled concurrently from -// the main runloop to allow Merkel proof verifications on the peer's thread and +// the main runloop to allow Merkle proof verifications on the peer's thread and // to drop on invalid response. The request struct must contain all the data to // construct the response without accessing runloop internals (i.e. tasks). That // is only included to allow the runloop to match a response to the task being @@ -1781,7 +1781,7 @@ func (s *Syncer) processAccountResponse(res *accountResponse) { for i, account := range res.accounts { // Check if the account is a contract with an unknown code if !bytes.Equal(account.CodeHash, emptyCode[:]) { - if code := rawdb.ReadCodeWithPrefix(s.db, common.BytesToHash(account.CodeHash)); code == nil { + if !rawdb.HasCodeWithPrefix(s.db, common.BytesToHash(account.CodeHash)) { res.task.codeTasks[common.BytesToHash(account.CodeHash)] = struct{}{} res.task.needCode[i] = true res.task.pend++ @@ -1789,7 +1789,7 @@ func (s *Syncer) processAccountResponse(res *accountResponse) { } // Check if the account is a contract with an unknown storage trie if account.Root != emptyRoot { - if node, err := s.db.Get(account.Root[:]); err != nil || node == nil { + if ok, err := s.db.Has(account.Root[:]); err != nil || !ok { // If there was a previous large state retrieval in progress, // don't restart it from scratch. This happens if a sync cycle // is interrupted and resumed later. However, *do* update the @@ -2826,7 +2826,10 @@ func (s *Syncer) reportSyncProgress(force bool) { new(big.Int).Mul(new(big.Int).SetUint64(uint64(synced)), hashSpace), accountFills, ).Uint64()) - + // Don't report anything until we have a meaningful progress + if estBytes < 1.0 { + return + } elapsed := time.Since(s.startTime) estTime := elapsed / time.Duration(synced) * time.Duration(estBytes) diff --git a/eth/protocols/snap/sync_test.go b/eth/protocols/snap/sync_test.go index 47ab1f026d..879ce8b6b2 100644 --- a/eth/protocols/snap/sync_test.go +++ b/eth/protocols/snap/sync_test.go @@ -1349,7 +1349,7 @@ func makeAccountTrieNoStorage(n int) (*trie.Trie, entrySlice) { accTrie, _ := trie.New(common.Hash{}, db) var entries entrySlice for i := uint64(1); i <= uint64(n); i++ { - value, _ := rlp.EncodeToBytes(types.StateAccount{ + value, _ := rlp.EncodeToBytes(&types.StateAccount{ Nonce: i, Balance: big.NewInt(int64(i)), Root: emptyRoot, @@ -1394,7 +1394,7 @@ func makeBoundaryAccountTrie(n int) (*trie.Trie, entrySlice) { } // Fill boundary accounts for i := 0; i < len(boundaries); i++ { - value, _ := rlp.EncodeToBytes(types.StateAccount{ + value, _ := rlp.EncodeToBytes(&types.StateAccount{ Nonce: uint64(0), Balance: big.NewInt(int64(i)), Root: emptyRoot, @@ -1406,7 +1406,7 @@ func makeBoundaryAccountTrie(n int) (*trie.Trie, entrySlice) { } // Fill other accounts if required for i := uint64(1); i <= uint64(n); i++ { - value, _ := rlp.EncodeToBytes(types.StateAccount{ + value, _ := rlp.EncodeToBytes(&types.StateAccount{ Nonce: i, Balance: big.NewInt(int64(i)), Root: emptyRoot, @@ -1442,7 +1442,7 @@ func makeAccountTrieWithStorageWithUniqueStorage(accounts, slots int, code bool) stTrie, stEntries := makeStorageTrieWithSeed(uint64(slots), i, db) stRoot := stTrie.Hash() stTrie.Commit(nil) - value, _ := rlp.EncodeToBytes(types.StateAccount{ + value, _ := rlp.EncodeToBytes(&types.StateAccount{ Nonce: i, Balance: big.NewInt(int64(i)), Root: stRoot, @@ -1489,7 +1489,7 @@ func makeAccountTrieWithStorage(accounts, slots int, code, boundary bool) (*trie if code { codehash = getCodeHash(i) } - value, _ := rlp.EncodeToBytes(types.StateAccount{ + value, _ := rlp.EncodeToBytes(&types.StateAccount{ Nonce: i, Balance: big.NewInt(int64(i)), Root: stRoot, diff --git a/eth/sync.go b/eth/sync.go index b8ac67d3b2..d67d2311d0 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -17,6 +17,7 @@ package eth import ( + "errors" "math/big" "sync/atomic" "time" @@ -65,6 +66,7 @@ type chainSyncer struct { handler *handler force *time.Timer forced bool // true when force timer fired + warned time.Time peerEventCh chan struct{} doneCh chan error // non-nil when sync is running } @@ -119,10 +121,18 @@ func (cs *chainSyncer) loop() { select { case <-cs.peerEventCh: // Peer information changed, recheck. - case <-cs.doneCh: + case err := <-cs.doneCh: cs.doneCh = nil cs.force.Reset(forceSyncCycle) cs.forced = false + + // If we've reached the merge transition but no beacon client is available, or + // it has not yet switched us over, keep warning the user that their infra is + // potentially flaky. + if errors.Is(err, downloader.ErrMergeTransition) && time.Since(cs.warned) > 10*time.Second { + log.Warn("Local chain is post-merge, waiting for beacon client sync switch-over...") + cs.warned = time.Now() + } case <-cs.force.C: cs.forced = true @@ -143,9 +153,16 @@ func (cs *chainSyncer) loop() { // nextSyncOp determines whether sync is required at this time. func (cs *chainSyncer) nextSyncOp() *chainSyncOp { if cs.doneCh != nil { - return nil // Sync already running. + return nil // Sync already running } - // Disable the td based sync trigger after the transition + // If a beacon client once took over control, disable the entire legacy sync + // path from here on end. Note, there is a slight "race" between reaching TTD + // and the beacon client taking over. The downloader will enforce that nothing + // above the first TTD will be delivered to the chain for import. + // + // An alternative would be to check the local chain for exceeding the TTD and + // avoid triggering a sync in that case, but that could also miss sibling or + // other family TTD block being accepted. if cs.handler.merger.TDDReached() { return nil } @@ -159,16 +176,24 @@ func (cs *chainSyncer) nextSyncOp() *chainSyncOp { if cs.handler.peers.len() < minPeers { return nil } - // We have enough peers, check TD + // We have enough peers, pick the one with the highest TD, but avoid going + // over the terminal total difficulty. Above that we expect the consensus + // clients to direct the chain head to sync to. peer := cs.handler.peers.peerWithHighestTD() if peer == nil { return nil } mode, ourTD := cs.modeAndLocalHead() - op := peerToSyncOp(mode, peer) if op.td.Cmp(ourTD) <= 0 { - return nil // We're in sync. + // We seem to be in sync according to the legacy rules. In the merge + // world, it can also mean we're stuck on the merge block, waiting for + // a beacon client. In the latter case, notify the user. + if ttd := cs.handler.chain.Config().TerminalTotalDifficulty; ttd != nil && ourTD.Cmp(ttd) >= 0 && time.Since(cs.warned) > 10*time.Second { + log.Warn("Local chain is post-merge, waiting for beacon client sync switch-over...") + cs.warned = time.Now() + } + return nil // We're in sync } return op } @@ -227,7 +252,7 @@ func (h *handler) doSync(op *chainSyncOp) error { } } // Run the sync cycle, and disable snap sync if we're past the pivot block - err := h.downloader.Synchronise(op.peer.ID(), op.head, op.td, op.mode) + err := h.downloader.LegacySync(op.peer.ID(), op.head, op.td, h.chain.Config().TerminalTotalDifficulty, op.mode) if err != nil { return err } diff --git a/eth/tracers/api.go b/eth/tracers/api.go index 5f88629a70..08c17601e4 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -452,7 +452,7 @@ func (api *API) TraceBlockByHash(ctx context.Context, hash common.Hash, config * // TraceBlock returns the structured logs created during the execution of EVM // and returns them as a JSON object. -func (api *API) TraceBlock(ctx context.Context, blob []byte, config *TraceConfig) ([]*txTraceResult, error) { +func (api *API) TraceBlock(ctx context.Context, blob hexutil.Bytes, config *TraceConfig) ([]*txTraceResult, error) { block := new(types.Block) if err := rlp.Decode(bytes.NewReader(blob), block); err != nil { return nil, fmt.Errorf("could not decode block: %v", err) @@ -592,11 +592,11 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac if threads > len(txs) { threads = len(txs) } - blockCtx := core.NewEVMBlockContext(block.Header(), api.chainContext(ctx), nil) blockHash := block.Hash() for th := 0; th < threads; th++ { pend.Add(1) go func() { + blockCtx := core.NewEVMBlockContext(block.Header(), api.chainContext(ctx), nil) defer pend.Done() // Fetch and execute the next transaction trace tasks for task := range jobs { @@ -617,6 +617,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac } // Feed the transactions into the tracers and return var failed error + blockCtx := core.NewEVMBlockContext(block.Header(), api.chainContext(ctx), nil) for i, tx := range txs { // Send the trace task over for execution jobs <- &txTraceTask{statedb: statedb.Copy(), index: i} diff --git a/eth/tracers/internal/tracetest/calltrace_test.go b/eth/tracers/internal/tracetest/calltrace_test.go index 7521a98f24..cf7c1e6c0d 100644 --- a/eth/tracers/internal/tracetest/calltrace_test.go +++ b/eth/tracers/internal/tracetest/calltrace_test.go @@ -130,10 +130,6 @@ func TestCallTracerLegacy(t *testing.T) { testCallTracer("callTracerLegacy", "call_tracer_legacy", t) } -func TestCallTracerJs(t *testing.T) { - testCallTracer("callTracerJs", "call_tracer", t) -} - func TestCallTracerNative(t *testing.T) { testCallTracer("callTracer", "call_tracer", t) } diff --git a/eth/tracers/js/internal/tracers/assets.go b/eth/tracers/js/internal/tracers/assets.go index a2bb69dee4..a117c9f06e 100644 --- a/eth/tracers/js/internal/tracers/assets.go +++ b/eth/tracers/js/internal/tracers/assets.go @@ -2,12 +2,11 @@ // sources: // 4byte_tracer_legacy.js (2.933kB) // bigram_tracer.js (1.712kB) -// call_tracer_js.js (3.497kB) // call_tracer_legacy.js (8.956kB) // evmdis_tracer.js (4.215kB) -// noop_tracer.js (1.271kB) +// noop_tracer_legacy.js (1.271kB) // opcount_tracer.js (1.372kB) -// prestate_tracer.js (4.287kB) +// prestate_tracer_legacy.js (4.483kB) // trigram_tracer.js (1.788kB) // unigram_tracer.js (1.469kB) @@ -118,26 +117,6 @@ func bigram_tracerJs() (*asset, error) { return a, nil } -var _call_tracer_jsJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x5f\x6f\xdb\x38\x0c\x7f\x8e\x3f\x05\xaf\x0f\x4b\x82\x65\x71\xbb\x03\xf6\xd0\x2d\x03\x72\x45\xbb\x05\xe8\xb5\x45\x9a\xde\x50\x14\x7d\x50\x6c\xda\xd6\xa6\x48\x86\x44\x37\xcd\x6d\xfd\xee\x07\x4a\x76\x6a\x67\x59\x6f\x2f\x06\x2c\x92\x3f\xfe\xfb\x51\x54\x1c\xc3\x89\x29\x37\x56\xe6\x05\xc1\xdb\xc3\xb7\x47\xb0\x28\x10\x72\xf3\x06\xa9\x40\x8b\xd5\x0a\xa6\x15\x15\xc6\xba\x28\x8e\x61\x51\x48\x07\x99\x54\x08\xd2\x41\x29\x2c\x81\xc9\x80\x76\xf4\x95\x5c\x5a\x61\x37\xe3\x28\x8e\x83\xcd\x5e\x31\x23\x64\x16\x11\x9c\xc9\x68\x2d\x2c\x1e\xc3\xc6\x54\x90\x08\x0d\x16\x53\xe9\xc8\xca\x65\x45\x08\x92\x40\xe8\x34\x36\x16\x56\x26\x95\xd9\x86\x21\x25\x41\xa5\x53\xb4\xde\x35\xa1\x5d\xb9\x26\x8e\x4f\x17\x37\x70\x8e\xce\xa1\x85\x4f\xa8\xd1\x0a\x05\x57\xd5\x52\xc9\x04\xce\x65\x82\xda\x21\x08\x07\x25\x9f\xb8\x02\x53\x58\x7a\x38\x36\x3c\xe3\x50\xae\xeb\x50\xe0\xcc\x54\x3a\x15\x24\x8d\x1e\x01\x4a\x8e\x1c\x1e\xd0\x3a\x69\x34\xfc\xd9\xb8\xaa\x01\x47\x60\x2c\x83\x0c\x04\x71\x02\x16\x4c\xc9\x76\x43\x10\x7a\x03\x4a\xd0\xb3\xe9\x6f\x14\xe4\x39\xef\x14\xa4\xf6\x6e\x0a\x53\x22\x50\x21\x88\xb3\x5e\x4b\xa5\x60\x89\x50\x39\xcc\x2a\x35\x62\xb4\x65\x45\xf0\x65\xb6\xf8\x7c\x79\xb3\x80\xe9\xc5\x2d\x7c\x99\xce\xe7\xd3\x8b\xc5\xed\x7b\x58\x4b\x2a\x4c\x45\x80\x0f\x18\xa0\xe4\xaa\x54\x12\x53\x58\x0b\x6b\x85\xa6\x0d\x98\x8c\x11\xfe\x3e\x9d\x9f\x7c\x9e\x5e\x2c\xa6\x7f\xcd\xce\x67\x8b\x5b\x30\x16\xce\x66\x8b\x8b\xd3\xeb\x6b\x38\xbb\x9c\xc3\x14\xae\xa6\xf3\xc5\xec\xe4\xe6\x7c\x3a\x87\xab\x9b\xf9\xd5\xe5\xf5\xe9\x18\xae\x91\xa3\x42\xb6\xff\xff\x9a\x67\xbe\x7b\x16\x21\x45\x12\x52\xb9\xa6\x12\xb7\xa6\x02\x57\x98\x4a\xa5\x50\x88\x07\x04\x8b\x09\xca\x07\x4c\x41\x40\x62\xca\xcd\x6f\x37\x95\xb1\x84\x32\x3a\xf7\x39\xff\x92\x90\x30\xcb\x40\x1b\x1a\x81\x43\x84\x0f\x05\x51\x79\x1c\xc7\xeb\xf5\x7a\x9c\xeb\x6a\x6c\x6c\x1e\xab\x00\xe7\xe2\x8f\xe3\x28\x62\xd0\x44\x28\x75\x66\xc5\x0a\x17\x56\x24\x68\xb9\xee\xce\xc3\x6b\x5c\x7b\x21\x64\x2c\x05\xb2\x22\x91\x3a\x87\x15\x52\x61\x52\x07\x64\xc0\x62\x69\x2c\xd5\x9d\x02\xa9\x33\x63\x57\x9e\x51\x3e\xd8\x25\x37\x46\x6a\x42\xab\x85\x82\x15\x3a\x27\x72\xf4\x2c\x16\x0c\xa6\x9d\x48\xc8\x53\xe6\x7b\xd4\x63\x3f\x8e\x44\xf2\xed\x18\xee\xbe\x3f\xdd\x8f\xa2\x5e\x26\x2a\x45\xc7\x90\x55\xda\x6b\x0d\x94\xc9\x47\x90\x2e\x87\xf0\xfd\x69\x14\xf5\x2c\xba\xae\x38\xa1\xc7\x5a\x1c\xf5\x7a\x71\x0c\x57\x16\x4b\x66\xb9\xa9\x98\x9d\xb5\x73\x1f\x62\xd4\xeb\x3d\x08\x0b\x01\x01\x26\xde\xa0\x47\x9b\x12\x8f\x01\x00\x12\x7a\x1c\xf3\xcf\x88\x4f\x33\x6b\x56\xfe\x94\xcc\x67\x7c\x64\x1f\x63\x3e\x1a\x7a\x21\x19\x2f\x6a\x0b\xc9\x04\xd1\x83\x50\x95\x87\xeb\x1f\x3e\xf6\xe1\xb5\x07\xf5\x67\x63\x32\xd7\x64\xa5\xce\x07\x47\xef\x82\x6a\x2e\x5c\x80\xa9\x55\x97\x32\x9f\x69\xf2\x68\xb9\x70\xc3\xbd\x06\x37\x0e\xd3\xe3\xfd\x06\x2c\xda\x63\x24\x75\x59\xd1\x71\x27\x56\x7f\x14\xa4\xa6\xa2\x20\x7e\x96\x86\x23\x2f\x7e\x8a\x7a\x3d\x99\xc1\x80\x0a\xe9\xc6\xdb\x3e\xdd\x1d\xde\x87\x1f\xf8\x63\x32\xf1\x37\x55\x26\x35\xa6\xa1\xfe\x75\x7b\x6a\x85\x09\xfc\xc2\xf4\x45\x70\xb4\xd6\xd8\x97\xc0\x83\xc2\x3e\x70\x2f\x61\x70\x40\xe5\x10\x18\x9f\x73\xfa\x6d\xc4\xad\x72\x2b\xc0\x8e\x4a\x07\x03\x5e\xbd\xda\x23\x3e\xc0\x47\x4c\x2a\xa6\x26\x58\x7c\x40\x4b\x98\x1e\xc0\x8f\x1f\x35\xed\xea\xfa\xc2\x64\x32\x39\x38\x7c\x3c\x18\xd6\x71\xa4\xa8\x90\xb0\xab\xe3\x63\x88\x38\x46\xaa\xac\x0e\xd9\x66\x52\x0b\x25\xff\xc5\xda\xed\x30\xea\xf1\x4c\x20\x8f\x5a\x6b\x24\xfc\xd8\x06\x64\x26\xbc\x1f\xe5\x0e\xdd\xbd\xc2\x38\x47\x5a\x6c\x4a\x1c\x0c\x5b\x94\x0f\x44\xd8\xca\xcf\xac\x59\x0d\x86\xcf\xb4\xdf\x11\x2f\x4c\x23\xac\x79\xb6\x23\x9f\xf1\x69\xa3\xe2\x09\xdf\xe5\xee\x56\xf1\x93\x70\x83\x61\x8b\xbe\xfd\xa3\x77\xfd\x0e\x07\xb7\x9a\xff\xf0\x34\x0d\x86\x3b\xdd\xf4\xb9\x71\x9e\x61\xda\x26\xbf\x70\x53\x1b\x77\xe7\xa4\xf6\xd2\x65\xd3\xb8\xac\x5c\x31\xe0\xdf\xa6\xc6\x8f\x92\x76\x4b\x3c\x0f\x4d\xd8\x16\x5a\xa1\xfe\x89\x96\x63\x85\x3a\xa7\xa2\x4e\x83\x35\x3e\xc2\x51\xdd\xf5\x56\x73\x76\xbd\x9b\x72\x30\xdc\xe6\x54\x8f\x37\x4c\xf6\x95\x2f\x04\x51\x17\x91\xd5\x7e\x2e\x64\xe3\xab\xa1\xf9\x8e\xdd\x29\x1f\x07\x77\x1c\x63\xad\xb5\x67\x5a\x42\x34\x0d\x83\xdb\xcd\x7e\x06\xbb\xf4\xd2\xc1\xd0\xc3\xd5\x73\xd8\x32\x6e\x42\x68\xa6\x2c\xb8\xf4\x22\xa6\xa6\x77\xdb\x3f\x99\x9f\x4e\x17\xa7\x7d\x9e\x9a\xbd\x92\xb7\xfd\x26\xa0\x66\x70\x82\x9a\xf1\x67\x4f\x51\xf3\xe1\x6a\xbf\x99\xc0\x51\x93\xd9\xce\x85\xa1\x50\xbf\x39\x6a\x2e\xb3\xbd\xf9\xbe\x68\x00\x77\xf7\x5b\x4f\x2f\x28\x76\x98\xc4\xda\xcc\xa6\x38\x86\x66\x94\xf9\x5d\x60\x51\x10\x3a\x7e\x18\x30\x1b\xcc\xf2\x2b\x26\xbc\x5c\x79\xe9\xf2\x3e\xf6\xaa\x90\xa2\x93\x16\x53\xc8\x24\xaa\x14\x0c\xbf\x10\xf9\xe9\xf1\xd5\x19\xed\x01\x1d\x5a\xc9\x88\x7e\x0f\x8f\xc3\x6b\x56\x32\xa8\x96\x09\xd2\x06\x32\x14\x54\x59\xe4\xf5\x5d\x0a\xe7\x60\x85\x42\x4b\x9d\x67\x95\x52\x1b\x30\x36\x45\x06\x0f\xf7\x8a\xf3\x80\x64\x78\xc1\x5b\x07\xeb\xc2\x40\x6a\x74\xbf\x5e\xea\xa5\x45\x7e\xaf\x8d\xe0\x6b\xe5\x88\x5f\x75\xa5\x12\x1b\x90\x34\x8e\x7a\x4d\x52\xed\xfd\xcc\x99\x6f\x47\xc4\x19\xbe\x10\x7f\x5e\xbe\x4d\x9b\xbb\xdb\xd7\x1f\xf3\x5f\x77\xef\xd6\xdd\xee\x6e\xdc\xe7\xe9\xef\xae\xd7\x66\x82\xba\x3b\xb4\x3d\x57\xdd\x45\xe9\x25\xfe\xaf\xbb\x22\x5b\xdc\xf7\x02\xcf\xe0\xad\x81\xff\x0b\x51\xca\x55\x3b\x27\xb9\x0a\xf1\x78\x2e\x6c\xd5\xfd\x5f\x73\xbf\x71\x17\x07\x5c\x9c\x6f\xb8\xe1\x87\x71\xa8\x51\xcd\x41\xe6\x6d\x38\xb8\xfb\x86\x9b\xfb\xfd\x3c\xad\xa7\xa0\xa5\xd7\x30\xb3\xb9\x3f\x83\xe8\x85\xc5\xbd\x0d\x42\x4e\x0e\xdf\x83\xfc\xd0\x36\xa8\xef\xb0\xf7\x20\x5f\xbf\x6e\x5c\xb6\xe5\x77\xf2\xbe\xb9\xc2\xb6\x0b\x6a\x47\x3e\x6c\x07\x54\x6f\xb4\xa0\x12\xf5\x9e\xa2\xa7\xe8\xbf\x00\x00\x00\xff\xff\x2a\xac\x9f\xff\xa9\x0d\x00\x00") - -func call_tracer_jsJsBytes() ([]byte, error) { - return bindataRead( - _call_tracer_jsJs, - "call_tracer_js.js", - ) -} - -func call_tracer_jsJs() (*asset, error) { - bytes, err := call_tracer_jsJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "call_tracer_js.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x42, 0x13, 0x7a, 0x14, 0xbf, 0xa7, 0x49, 0x4f, 0xb4, 0x4f, 0x45, 0x1, 0xbc, 0x9e, 0xd1, 0x8e, 0xc7, 0xee, 0x61, 0xfa, 0x82, 0x52, 0xa4, 0x78, 0xfe, 0xff, 0xb1, 0x68, 0x1d, 0xcc, 0x1d, 0x8e}} - return a, nil -} - var _call_tracer_legacyJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5a\xdf\x6f\x1b\x37\xf2\x7f\x96\xfe\x8a\x89\x1f\x6a\x09\x51\x24\x39\xe9\xb7\x5f\xc0\xae\x7a\x50\x1d\x25\x35\xe0\xc6\x81\xad\x34\x08\x82\x3c\x50\xbb\xb3\x12\x6b\x8a\xdc\x92\x5c\xc9\xba\xd6\xff\xfb\x61\x86\xdc\xd5\xae\x24\x3b\xbe\x5e\x71\xe8\xbd\x69\x97\x33\xc3\xe1\xcc\x67\x7e\x71\x35\x18\xc0\xb9\xc9\x37\x56\xce\x17\x1e\x5e\x0e\x4f\xfe\x1f\xa6\x0b\x84\xb9\x79\x81\x7e\x81\x16\x8b\x25\x8c\x0b\xbf\x30\xd6\xb5\x07\x03\x98\x2e\xa4\x83\x4c\x2a\x04\xe9\x20\x17\xd6\x83\xc9\xc0\xef\xd0\x2b\x39\xb3\xc2\x6e\xfa\xed\xc1\x20\xf0\x1c\x5c\x26\x09\x99\x45\x04\x67\x32\xbf\x16\x16\x4f\x61\x63\x0a\x48\x84\x06\x8b\xa9\x74\xde\xca\x59\xe1\x11\xa4\x07\xa1\xd3\x81\xb1\xb0\x34\xa9\xcc\x36\x24\x52\x7a\x28\x74\x8a\x96\xb7\xf6\x68\x97\xae\xd4\xe3\xed\xbb\x0f\x70\x89\xce\xa1\x85\xb7\xa8\xd1\x0a\x05\xef\x8b\x99\x92\x09\x5c\xca\x04\xb5\x43\x10\x0e\x72\x7a\xe3\x16\x98\xc2\x8c\xc5\x11\xe3\x1b\x52\xe5\x26\xaa\x02\x6f\x4c\xa1\x53\xe1\xa5\xd1\x3d\x40\x49\x9a\xc3\x0a\xad\x93\x46\xc3\xab\x72\xab\x28\xb0\x07\xc6\x92\x90\x8e\xf0\x74\x00\x0b\x26\x27\xbe\x2e\x08\xbd\x01\x25\xfc\x96\xf5\x09\x06\xd9\x9e\x3b\x05\xa9\x79\x9b\x85\xc9\x11\xfc\x42\x78\x3a\xf5\x5a\x2a\x05\x33\x84\xc2\x61\x56\xa8\x1e\x49\x9b\x15\x1e\x3e\x5e\x4c\x7f\xba\xfa\x30\x85\xf1\xbb\x4f\xf0\x71\x7c\x7d\x3d\x7e\x37\xfd\x74\x06\x6b\xe9\x17\xa6\xf0\x80\x2b\x0c\xa2\xe4\x32\x57\x12\x53\x58\x0b\x6b\x85\xf6\x1b\x30\x19\x49\xf8\x79\x72\x7d\xfe\xd3\xf8\xdd\x74\xfc\xe3\xc5\xe5\xc5\xf4\x13\x18\x0b\x6f\x2e\xa6\xef\x26\x37\x37\xf0\xe6\xea\x1a\xc6\xf0\x7e\x7c\x3d\xbd\x38\xff\x70\x39\xbe\x86\xf7\x1f\xae\xdf\x5f\xdd\x4c\xfa\x70\x83\xa4\x15\x12\xff\xd7\x6d\x9e\xb1\xf7\x2c\x42\x8a\x5e\x48\xe5\x4a\x4b\x7c\x32\x05\xb8\x85\x29\x54\x0a\x0b\xb1\x42\xb0\x98\xa0\x5c\x61\x0a\x02\x12\x93\x6f\x9e\xec\x54\x92\x25\x94\xd1\x73\x3e\xf3\x83\x80\x84\x8b\x0c\xb4\xf1\x3d\x70\x88\xf0\xfd\xc2\xfb\xfc\x74\x30\x58\xaf\xd7\xfd\xb9\x2e\xfa\xc6\xce\x07\x2a\x88\x73\x83\x1f\xfa\x6d\x92\x99\x08\xa5\xa6\x56\x24\x68\xc9\x39\x02\xb2\x82\xcc\xaf\xcc\x5a\x83\xb7\x42\x3b\x91\x90\xab\xe9\x77\xc2\x60\x14\x1e\xf0\x8e\x9e\xbc\x23\xd0\x82\xc5\xdc\x58\xfa\xad\x54\x89\x33\xa9\x3d\x5a\x2d\x14\xcb\x76\xb0\x14\x29\xc2\x6c\x03\xa2\x2e\xb0\x57\x3f\x0c\xc1\x28\xb8\x1b\xa4\xce\x8c\x5d\x32\x2c\xfb\xed\xdf\xdb\xad\xa8\xa1\xf3\x22\xb9\x25\x05\x49\x7e\x52\x58\x8b\xda\x93\x29\x0b\xeb\xe4\x0a\x99\x04\x02\x4d\xb4\xe7\xe4\x97\x9f\x01\xef\x30\x29\x82\xa4\x56\x25\xe4\x14\x3e\xff\x7e\xff\xa5\xd7\x66\xd1\x29\xba\x04\x75\x8a\x29\x9f\xef\xd6\xc1\x7a\xc1\x16\x85\x35\x1e\xaf\x10\x7e\x2d\x9c\xaf\xd1\x64\xd6\x2c\x41\x68\x30\x05\x21\xbe\x6e\x1d\xa9\xbd\x61\x81\x82\x7e\x6b\xb4\xac\x51\xbf\xdd\xaa\x98\x4f\x21\x13\xca\x61\xdc\xd7\x79\xcc\xe9\x34\x52\xaf\xcc\x2d\x49\x36\x96\x20\x6c\x37\x60\xf2\xc4\xa4\x31\x18\xe8\x1c\xd5\x31\xd0\xf5\xdb\x2d\xe2\x3b\x85\xac\xd0\xbc\x6d\x47\x99\x79\x0f\xd2\x59\x17\x7e\x6f\xb7\x48\xec\xb9\xc8\x7d\x61\x91\xed\x89\xd6\x1a\xeb\x40\x2e\x97\x98\x4a\xe1\x51\x6d\xda\xad\xd6\x4a\xd8\xb0\x00\x23\x50\x66\xde\x9f\xa3\x9f\xd0\x63\xa7\x7b\xd6\x6e\xb5\x64\x06\x9d\xb0\xfa\x6c\x34\xe2\xec\x93\x49\x8d\x69\x10\xdf\xf2\x0b\xe9\xfa\x99\x28\x94\xaf\xf6\x25\xa6\x96\x45\x5f\x58\x4d\x3f\xef\x83\x16\x1f\x11\x8c\x56\x1b\x48\x28\xcb\x88\x19\x85\xa7\xdb\x38\x8f\xcb\x78\x38\xd7\x83\x4c\x38\x32\xa1\xcc\x60\x8d\x90\x5b\x7c\x91\x2c\x90\x7c\xa7\x13\x8c\x5a\xba\x8d\x63\xa7\x8e\x80\x76\xeb\x9b\xbc\xef\xcd\xbb\x62\x39\x43\xdb\xe9\xc2\x37\x30\xbc\xcb\x86\x5d\x18\x8d\xf8\x47\xa9\x7b\xe4\x89\xfa\x92\x14\x93\xc7\x83\x32\xff\x8d\xb7\x52\xcf\xc3\x59\xa3\xae\x17\x19\x08\xd0\xb8\x86\xc4\x68\x06\x35\x79\x65\x86\x52\xcf\x21\xb1\x28\x3c\xa6\x3d\x10\x69\x0a\xde\x04\xe4\x55\x38\x6b\x6e\x09\xdf\x7c\x03\x1d\xda\x6c\x04\xc7\xe7\xd7\x93\xf1\x74\x72\x0c\x7f\xfc\x01\xe1\xcd\x51\x78\xf3\xf2\xa8\x5b\xd3\x4c\xea\xab\x2c\x8b\xca\xb1\xc0\x7e\x8e\x78\xdb\x39\xe9\xf6\x57\x42\x15\x78\x95\x05\x35\x23\xed\x44\xa7\x30\x8a\x3c\xcf\x77\x79\x5e\x36\x78\x88\x69\x30\x80\xb1\x73\xb8\x9c\x29\xdc\x0f\xc8\x18\xb1\x1c\xbc\xce\x53\xc6\x22\xf4\x25\x66\x99\x2b\x24\x54\x95\xbb\x46\xf3\xb3\xc6\x2d\xbf\xc9\xf1\x14\x00\xc0\xe4\x3d\x7e\x41\xb1\xc0\x2f\xbc\xf9\x09\xef\xd8\x47\xa5\x09\x09\x55\xe3\x34\xb5\xe8\x5c\xa7\xdb\x0d\xe4\x52\xe7\x85\x3f\x6d\x90\x2f\x71\x69\xec\xa6\xef\x28\x21\x75\xf8\x68\xbd\x70\xd2\x92\x67\x2e\xdc\x85\x26\x9e\x88\xd4\xb7\xc2\x75\xb6\x4b\xe7\xc6\xf9\xd3\x72\x89\x1e\xca\x35\xb6\x05\xb1\x1d\x0f\xef\x8e\xf7\xad\x35\xec\x6e\x91\x70\xf2\x5d\x97\x58\xee\xcf\x2a\x7c\x57\x69\xa2\x9f\x17\x6e\xd1\x61\x38\x6d\x57\xb7\xa9\x60\x04\xde\x16\x78\x10\xfe\x0c\xa9\x7d\x38\x39\x54\x19\xe5\x12\x6f\x8b\x84\x61\x35\x17\x9c\x69\x38\xd2\x05\x65\x5e\x57\xcc\xd8\xe6\xde\x98\x7d\x74\x45\x70\xdd\x4c\x2e\xdf\xbc\x9e\xdc\x4c\xaf\x3f\x9c\x4f\x8f\x6b\x70\x52\x98\x79\x52\xaa\x79\x06\x85\x7a\xee\x17\xac\x3f\x89\x6b\xae\x7e\x26\x9e\x17\x27\x5f\xc2\x1b\x18\x1d\x08\xf9\xd6\xe3\x1c\xf0\xf9\x0b\xcb\xbe\xdf\x37\x5f\x93\x34\x18\xf3\xaf\x41\x92\x37\x4c\x5c\x92\x7b\x53\x12\x3c\xee\xe7\xbf\x18\x54\xe9\x8c\x28\x7e\x14\x4a\xe8\x04\x1f\xd1\x79\x1f\x6b\xf5\xa4\x79\x20\x0f\x2d\xd1\x2f\x4c\xca\x85\x21\x11\xa1\xb6\x94\x08\x4a\x8d\xc6\x7f\x3f\x1b\x8d\x2f\x2f\x6b\xb9\x88\x9f\xcf\xaf\x5e\xd7\xf3\xd3\xf1\xeb\xc9\xe5\xe4\xed\x78\x3a\xd9\xa5\xbd\x99\x8e\xa7\x17\xe7\xfc\xb6\x4c\x5d\x83\x01\xdc\xdc\xca\x9c\x2b\x0c\xe7\x6d\xb3\xcc\xb9\x55\xae\xf4\x75\x3d\xf0\x0b\x43\x4d\xa8\x8d\x05\x34\x13\x3a\x29\x0b\x9b\x2b\x01\xeb\x0d\xc1\xf5\x21\xe7\x9d\xec\x38\xaf\x82\xb0\x74\xef\x2d\xc6\x4d\xd3\x8e\x37\xa5\x5e\x5b\x83\x06\x34\x72\xf2\xe7\x04\xdb\x79\xfa\x21\xe1\x1f\x30\x84\x53\x38\x89\x59\xf4\x91\x34\xfd\x12\x9e\x93\xf8\x3f\x91\xac\x5f\x1d\xe0\xfc\x7b\xa6\xec\xbd\x40\xfb\xef\xa7\x72\x53\xf8\xab\x2c\x3b\x85\x5d\x23\x7e\xbb\x67\xc4\x8a\xfe\x12\xf5\x3e\xfd\xff\xed\xd1\x6f\xd3\x3e\xa1\xca\xe4\xf0\x6c\x0f\x22\x21\xe9\x3e\xdb\x89\x83\x68\x5c\x6e\xef\x58\x1a\x8c\x1e\x28\x34\x2f\x9b\x18\x7e\x28\x53\xfe\x47\x85\xe6\x60\x9b\x4a\xcd\x68\xb3\x11\xed\x81\x45\x6f\x25\xae\x68\xd4\x3c\x76\x2c\x92\x1a\x76\xb3\xa6\xf4\xd5\x87\x8f\x18\x24\x6a\x44\x4e\x2e\xb1\xc1\xa7\xfe\x8c\x7b\x5e\x6a\xd2\xe3\xa8\xc6\x10\x13\xdc\x87\x5b\x84\xa5\xd8\xd0\xa8\x96\x15\xfa\x76\x03\x73\xe1\x20\xdd\x68\xb1\x94\x89\x0b\xf2\xb8\xb9\xb7\x38\x17\x96\xc5\x5a\xfc\xad\x40\x47\x73\x1f\x01\x59\x24\xbe\x10\x4a\x6d\x60\x2e\x69\x78\x23\xee\xce\xcb\x57\xc3\x21\x38\x2f\x73\xd4\x69\x0f\xbe\x7b\x35\xf8\xee\x5b\xb0\x85\xc2\x6e\xbf\x5d\x2b\x61\xd5\x51\xa3\x37\x68\x21\xa2\xe7\x35\xe6\x7e\xd1\xe9\xc2\x0f\x0f\xd4\xc2\x07\x0a\xdb\x41\x5a\x78\x01\x27\x5f\xfa\xa4\xd7\xa8\x81\xdb\xe0\x49\x40\xe5\x30\x4a\xa3\x81\xf7\xea\xf5\x55\xe7\x56\x58\xa1\xc4\x0c\xbb\xa7\x3c\x00\xb3\xad\xd6\x22\x4e\x40\xe4\x14\xc8\x95\x90\x1a\x44\x92\x98\x42\x7b\x32\x7c\x39\xcc\xa8\x0d\xe5\xf7\x63\x5f\xca\xe3\x59\x51\x24\x09\x3a\x57\xa6\x7b\xf6\x1a\xa9\x23\x96\xc4\x0d\x52\x3b\x99\x62\xcd\x2b\x94\x1d\x0c\xa7\xe6\x48\x41\xa3\x74\x29\x70\x69\x1c\x6d\x32\x43\x58\x5b\x1a\xbc\x9c\xd4\x09\xdf\x3c\xa4\x48\xd6\x76\x60\x34\x08\x50\x86\xaf\x3b\x38\xc6\x41\xd8\xb9\xeb\x87\x7c\x4f\xdb\x52\xce\xd1\x66\xdd\x6f\x02\xb9\x0e\x55\x1e\x71\x76\x5a\x21\x0d\x78\x27\x9d\xe7\x8e\x9a\xb4\x94\x0e\x02\x92\xa5\x9e\xf7\x20\x37\x39\xe7\xe9\xaf\x95\xb3\x98\xac\xaf\x27\xbf\x4c\xae\xab\xc6\xe7\xe9\x4e\x2c\x67\x9e\xa3\x6a\x24\x04\x4b\xf3\x96\xc7\xf4\xe8\xc0\x10\x73\x00\x50\xa3\x07\x00\x45\xf2\xb7\xb5\xf1\x7d\xed\x38\x4a\x38\xbf\x75\xcc\x1c\xc3\x3c\x57\x57\xc0\x15\xca\xbb\x9d\xdc\xbd\x9b\x1c\x4c\x5e\x56\x08\x52\x8a\xd3\x0e\x25\xf6\xdd\x49\xa3\xb1\xb0\x1d\x38\xb6\xf8\xbc\xa8\xd9\x78\xcd\xed\x66\x20\xaa\xa5\x06\x5e\x2f\xfb\x56\x11\xaa\x01\xeb\x6e\x0a\x4f\x70\xa0\xfa\xbd\x4d\x7e\x73\xe1\x3e\x38\xf6\x7a\x4c\x7f\x33\x39\xbf\xd0\xbe\x53\x2e\x5e\x68\x78\x01\xe5\x03\x25\x75\x78\xd1\x88\xa2\x03\xd9\xb1\x95\xa2\x42\x8f\xb0\x15\x71\x06\x3b\xaf\x48\x50\x30\x07\x1b\xcd\xa2\xdf\x2f\xce\xc3\x28\x8d\x0c\xf6\xcc\xa2\xef\xe3\x6f\x85\x50\xae\x33\xac\x9a\x85\x70\x02\x6f\xb8\xbc\x8d\xf6\x3a\x49\xe2\x69\xf6\x8e\x67\x35\xb6\x68\x8d\x92\x2d\x74\x82\xe7\x26\xc5\x47\x25\x44\x11\x31\x6d\x54\xbe\x8c\xc0\x3c\xd4\x7b\xb7\xea\x04\x70\x54\x35\x04\x99\x90\xaa\xb0\x78\x74\x06\x07\xd2\x8e\x2b\x6c\x26\x12\xf6\xa5\x43\xe0\x69\xdd\x81\x33\x4b\x5c\x98\x75\x50\xe0\x50\xf2\xda\x07\x47\x85\x83\x9d\xf2\xc1\xd7\x4e\xc2\x41\xe1\xc4\x1c\x6b\xe0\xa8\x0c\x5e\x3a\xea\xe0\x15\xc2\x9f\x86\xce\xf3\xea\xf1\x09\x28\xba\xff\x6b\xe0\xb1\xe3\xe7\xbd\x3e\xa7\x24\xe2\x6e\xa7\xf6\x50\x2a\x1b\x9a\x91\xbf\x97\xe3\x9f\x1c\x61\xbb\xb4\xe1\x68\x4d\xe2\x70\xc0\x6d\x5f\xf3\x75\xf7\x57\xab\x0f\x79\xfe\xa1\x96\x89\x30\xaa\x7f\xc5\xc4\x6f\x71\xca\x5d\x0e\x3d\xe5\x16\x57\xd2\x14\x54\xc0\xf0\x7f\x69\x1c\xae\x5a\xbe\xfb\x76\xeb\x3e\xde\x0b\xb2\xdf\xea\x17\x83\xeb\x45\xbc\xd7\x0e\xdd\x52\xad\x7c\x18\xae\xad\xf1\xba\x30\x0b\x37\xce\x2d\xe6\x7f\xe4\x82\x30\x06\xba\x37\x39\xb5\x03\xb1\x3a\x29\x8b\x22\xdd\x54\x05\xb1\x17\x1a\x11\x58\x08\x9d\xc6\x61\x44\xa4\xa9\x24\x79\x0c\x42\xd2\x50\xcc\x85\xd4\xed\x83\x66\xfc\x6a\x15\x3e\x84\x8c\xbd\xde\xb6\x5e\x48\xe3\x10\x49\x13\x1f\x6b\xdc\x7e\x42\xc1\xdc\x09\xa2\xdd\xbb\xce\x78\x5d\x6a\xb4\x2b\x96\xdc\x09\x83\x58\x09\xa9\x04\x4d\x5f\xdc\x61\xe9\x14\x12\x85\x42\x87\x2f\x1c\x98\x79\xb3\x42\xeb\xda\x4f\x00\xf9\x9f\xc1\xf8\x4e\x56\x2c\x1f\xa3\x39\x9e\x1e\xb3\x4f\x8d\xd8\x70\xfc\x37\x4a\x78\x1f\xe1\x55\x33\x6f\x88\x2c\xe9\xf9\xe3\x17\x6a\xdf\x7e\x5a\x48\x71\xcf\x44\x34\x3f\xc0\xb0\xd6\x97\xff\x5d\x82\x6c\x1f\x62\x97\x55\x7f\x16\x0f\xef\x8d\xe9\x81\x42\xc1\x53\x52\xf9\x69\xaa\xec\x47\x1f\x1b\xda\xca\xe8\x0d\x1d\xdd\x5e\xf8\xf2\x9d\xde\x02\xcb\x1b\x90\xd0\xda\xcf\x10\x35\x48\x8f\x56\xd0\x3c\x44\xe8\x8a\x5f\x53\x48\x4b\xc7\xe2\xd8\x2f\x92\x82\x2e\x0a\x8e\x9f\x36\xa8\x30\x4b\x3d\xef\xb7\x5b\xe1\x7d\x2d\xde\x13\x7f\xb7\x8d\xf7\x50\x01\x99\x33\xde\x09\x54\x57\x02\x89\xbf\xe3\x6e\x91\xc7\xe6\x9d\x7b\x01\x5a\xa3\x57\x61\xa6\xde\xb9\x05\x60\xc6\x78\x13\xb0\x7b\x27\x46\x6b\xfc\xae\x01\x70\x26\x9d\x0b\x17\xc4\xec\x84\x84\xbf\xdb\x8f\x88\x92\x81\x82\xe1\xf4\x30\x03\x2d\x1d\x60\xda\xb9\x99\x20\x62\x7e\x15\x56\x43\x3d\x3f\xad\xaf\x86\x57\xf1\xa0\x72\x59\xb3\x8d\x5c\xb2\x6d\xee\xcf\x0e\x27\xb9\x61\x89\xc7\xc3\xc9\x8c\x6c\x5e\x01\xf6\x01\xd6\xfa\xac\xb1\x4f\xf2\x58\xaa\x64\xe9\x65\x66\x7b\x80\x95\xa5\xd7\x5a\x0e\x7f\xf7\x74\x91\x15\x71\x5d\xc5\x06\x4d\x43\x08\xdf\x36\xee\x2d\x1f\x9a\xb4\x68\x50\x89\x84\x65\x73\x35\x1a\x1d\x0d\xef\xaa\x0f\x23\x31\x57\x35\x68\x4a\x25\x42\x64\x84\xf3\x72\x54\xc8\x7f\x62\xdc\xb6\x1e\x83\xe5\x12\x58\x0c\x1f\x70\xb8\x9b\xa5\x10\x34\x33\x6e\x20\x0a\x47\xa3\xe8\x36\xb6\x52\x74\xd2\x62\x0a\x99\x44\x95\x82\x49\xd1\xf2\xa0\xfb\xab\x33\x3a\x7c\xaa\x43\x2b\x49\x62\xf8\x24\x19\xfe\x1d\xc0\x1f\x4a\xb5\x4c\xd0\x6f\x20\x43\xc1\xdf\xdc\xbc\x81\x5c\x38\x07\x4b\x14\x34\xda\x66\x85\x52\x1b\x30\x36\x45\x12\x5e\xcd\x7a\x14\xd6\x06\x0a\x87\xd6\xc1\x7a\x61\x62\xa9\xe5\x16\x2f\xa7\x6e\x55\xfa\x5e\xbc\xce\x91\x2e\x57\x62\x03\xd2\x53\x59\x8f\x87\xaa\x47\x7a\xf5\xa1\x8b\xbf\x96\x19\x32\xf0\x7e\x98\x97\x53\x61\x33\xce\xf9\x35\x3d\x35\x23\x3c\x0e\x45\xcd\xd8\xde\x5e\x74\x35\x03\xb9\x2c\x3d\xcd\x68\xad\x17\xb2\x66\x48\xf2\x0a\x3f\x35\x83\xb1\xd6\x6a\xf3\x02\x23\xa8\x62\xe0\xa7\x9d\xf0\x64\x2d\x63\x7c\x86\xcf\xba\x15\x39\x3f\xf5\x22\x60\xc8\x8b\x1d\x32\xce\x2d\x6e\x28\x9b\x07\x1b\xd5\x4a\x53\x78\xf1\xf9\x16\x37\x5f\x0e\x57\xa2\x08\xc7\x1a\x5d\x55\x7a\xca\xb0\x08\x6b\x8f\x24\x83\x4a\x0b\x39\x1a\x9e\x81\xfc\xbe\xce\x50\x56\x4f\x90\xcf\x9f\x97\x7b\xd6\xd7\x3f\xcb\x2f\x65\x84\x57\x88\xdf\x59\xef\x36\x34\x8a\x31\x12\x68\x28\x28\xda\xf7\xed\x7f\x05\x00\x00\xff\xff\xfb\x65\x93\x4f\xfc\x22\x00\x00") func call_tracer_legacyJsBytes() ([]byte, error) { @@ -178,22 +157,22 @@ func evmdis_tracerJs() (*asset, error) { return a, nil } -var _noop_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x93\x4f\x6f\xdb\x46\x10\xc5\xcf\xe6\xa7\x78\xc7\x04\x50\xc5\xfe\x39\x14\x70\x8a\x02\xac\x61\x27\x2a\x1c\xdb\x90\xe8\x06\x3e\x0e\xc9\xa1\xb8\xe9\x6a\x87\x9d\x9d\x95\x22\x18\xfe\xee\xc5\x92\x12\x12\x14\x69\x9b\x9b\xb0\xd2\xfb\xbd\x37\xf3\x46\x65\x89\x2b\x19\x8f\xea\xb6\x83\xe1\xc7\xef\x7f\xf8\x19\xf5\xc0\xd8\xca\x77\x6c\x03\x2b\xa7\x1d\xaa\x64\x83\x68\x2c\xca\x12\xf5\xe0\x22\x7a\xe7\x19\x2e\x62\x24\x35\x48\x0f\xfb\xc7\xef\xbd\x6b\x94\xf4\xb8\x2c\xca\x72\xd6\x7c\xf5\xeb\x4c\xe8\x95\x19\x51\x7a\x3b\x90\xf2\x25\x8e\x92\xd0\x52\x80\x72\xe7\xa2\xa9\x6b\x92\x31\x9c\x81\x42\x57\x8a\x62\x27\x9d\xeb\x8f\x19\xe9\x0c\x29\x74\xac\x93\xb5\xb1\xee\xe2\x39\xc7\xdb\xbb\x47\xdc\x72\x8c\xac\x78\xcb\x81\x95\x3c\x1e\x52\xe3\x5d\x8b\x5b\xd7\x72\x88\x0c\x8a\x18\xf3\x4b\x1c\xb8\x43\x33\xe1\xb2\xf0\x26\x47\xd9\x9c\xa2\xe0\x46\x52\xe8\xc8\x9c\x84\x05\xd8\xe5\xe4\xd8\xb3\x46\x27\x01\x3f\x9d\xad\x4e\xc0\x05\x44\x33\xe4\x15\x59\x1e\x40\x21\x63\xd6\xbd\x06\x85\x23\x3c\xd9\x67\xe9\x37\x2c\xe4\xf3\xdc\x1d\x5c\x98\x6c\x06\x19\x19\x36\x90\xe5\xa9\x0f\xce\x7b\x34\x8c\x14\xb9\x4f\x7e\x91\x69\x4d\x32\x7c\x58\xd5\xef\xee\x1f\x6b\x54\x77\x4f\xf8\x50\xad\xd7\xd5\x5d\xfd\xf4\x06\x07\x67\x83\x24\x03\xef\x79\x46\xb9\xdd\xe8\x1d\x77\x38\x90\x2a\x05\x3b\x42\xfa\x4c\x78\x7f\xbd\xbe\x7a\x57\xdd\xd5\xd5\x6f\xab\xdb\x55\xfd\x04\x51\xdc\xac\xea\xbb\xeb\xcd\x06\x37\xf7\x6b\x54\x78\xa8\xd6\xf5\xea\xea\xf1\xb6\x5a\xe3\xe1\x71\xfd\x70\xbf\xb9\x5e\x62\xc3\x39\x15\x67\xfd\xff\xef\xbc\x9f\xda\x53\x46\xc7\x46\xce\xc7\xf3\x26\x9e\x24\x21\x0e\x92\x7c\x87\x81\xf6\x0c\xe5\x96\xdd\x9e\x3b\x10\x5a\x19\x8f\xdf\x5c\x6a\x66\x91\x97\xb0\x9d\x66\xfe\xd7\x83\xc4\xaa\x47\x10\x5b\x20\x32\xe3\x97\xc1\x6c\xbc\x2c\xcb\xc3\xe1\xb0\xdc\x86\xb4\x14\xdd\x96\x7e\xc6\xc5\xf2\xd7\x65\x91\x99\x41\x64\xac\x95\x5a\xd6\x5c\xce\xc7\x14\x6d\x62\x37\xa4\xdc\x48\x60\x34\xe2\x3c\xeb\x98\x5b\x46\x2b\x5d\x1e\xe0\xaf\xe4\x94\x3b\xf4\x2a\x3b\x10\x7e\xa7\x3d\x6d\x5a\x75\xa3\x65\x9c\x34\x1f\xb9\x35\x98\xcc\x15\x52\xe3\xa7\x73\x24\x98\x52\x88\xd4\xe6\xbb\xc9\x9f\x5b\xd6\x65\xf1\x5c\x5c\x94\x25\xa2\xf1\x98\xbd\x5d\xd8\xcb\x9f\x99\x2b\x9a\xfb\xd4\x23\x64\x9c\x1c\xa7\xcb\xc8\xa1\xfe\x78\x0f\xfe\xc4\x6d\x32\x8e\xcb\xe2\x22\xeb\x2e\xd1\xa7\x30\x41\x5f\x79\xd9\x2e\xd0\x35\xaf\xf1\x8c\x97\x45\x31\x91\x7b\x4a\xde\xbe\x44\x1f\x86\xd3\x99\x50\x6b\x89\xfc\x89\x96\x23\x49\x0f\x0a\x67\xc3\x7e\x2e\xf0\x62\xd2\xff\xb7\x85\x72\xfc\x9a\x07\x79\x3f\xf9\xcc\xc0\x38\x57\xdf\x30\x07\x38\x63\xa5\x7c\xfb\xb2\x67\xcd\x7f\x7b\x28\x5b\xd2\x10\x27\x5c\xd6\xf4\x2e\x90\x3f\x83\x4f\xe7\x91\x37\xe6\xc2\x76\x59\x5c\xcc\xef\x5f\x84\x6a\xed\xd3\x39\xd4\x4c\xc2\xf3\xcb\x1b\xbc\x14\x2f\xc5\xdf\x01\x00\x00\xff\xff\x77\x56\xe7\x1a\xf7\x04\x00\x00") +var _noop_tracer_legacyJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x93\x4f\x6f\xdb\x46\x10\xc5\xcf\xe6\xa7\x78\xc7\x04\x50\xc5\xfe\x39\x14\x70\x8a\x02\xac\x61\x27\x2a\x1c\xdb\x90\xe8\x06\x3e\x0e\xc9\xa1\xb8\xe9\x6a\x87\x9d\x9d\x95\x22\x18\xfe\xee\xc5\x92\x12\x12\x14\x69\x9b\x9b\xb0\xd2\xfb\xbd\x37\xf3\x46\x65\x89\x2b\x19\x8f\xea\xb6\x83\xe1\xc7\xef\x7f\xf8\x19\xf5\xc0\xd8\xca\x77\x6c\x03\x2b\xa7\x1d\xaa\x64\x83\x68\x2c\xca\x12\xf5\xe0\x22\x7a\xe7\x19\x2e\x62\x24\x35\x48\x0f\xfb\xc7\xef\xbd\x6b\x94\xf4\xb8\x2c\xca\x72\xd6\x7c\xf5\xeb\x4c\xe8\x95\x19\x51\x7a\x3b\x90\xf2\x25\x8e\x92\xd0\x52\x80\x72\xe7\xa2\xa9\x6b\x92\x31\x9c\x81\x42\x57\x8a\x62\x27\x9d\xeb\x8f\x19\xe9\x0c\x29\x74\xac\x93\xb5\xb1\xee\xe2\x39\xc7\xdb\xbb\x47\xdc\x72\x8c\xac\x78\xcb\x81\x95\x3c\x1e\x52\xe3\x5d\x8b\x5b\xd7\x72\x88\x0c\x8a\x18\xf3\x4b\x1c\xb8\x43\x33\xe1\xb2\xf0\x26\x47\xd9\x9c\xa2\xe0\x46\x52\xe8\xc8\x9c\x84\x05\xd8\xe5\xe4\xd8\xb3\x46\x27\x01\x3f\x9d\xad\x4e\xc0\x05\x44\x33\xe4\x15\x59\x1e\x40\x21\x63\xd6\xbd\x06\x85\x23\x3c\xd9\x67\xe9\x37\x2c\xe4\xf3\xdc\x1d\x5c\x98\x6c\x06\x19\x19\x36\x90\xe5\xa9\x0f\xce\x7b\x34\x8c\x14\xb9\x4f\x7e\x91\x69\x4d\x32\x7c\x58\xd5\xef\xee\x1f\x6b\x54\x77\x4f\xf8\x50\xad\xd7\xd5\x5d\xfd\xf4\x06\x07\x67\x83\x24\x03\xef\x79\x46\xb9\xdd\xe8\x1d\x77\x38\x90\x2a\x05\x3b\x42\xfa\x4c\x78\x7f\xbd\xbe\x7a\x57\xdd\xd5\xd5\x6f\xab\xdb\x55\xfd\x04\x51\xdc\xac\xea\xbb\xeb\xcd\x06\x37\xf7\x6b\x54\x78\xa8\xd6\xf5\xea\xea\xf1\xb6\x5a\xe3\xe1\x71\xfd\x70\xbf\xb9\x5e\x62\xc3\x39\x15\x67\xfd\xff\xef\xbc\x9f\xda\x53\x46\xc7\x46\xce\xc7\xf3\x26\x9e\x24\x21\x0e\x92\x7c\x87\x81\xf6\x0c\xe5\x96\xdd\x9e\x3b\x10\x5a\x19\x8f\xdf\x5c\x6a\x66\x91\x97\xb0\x9d\x66\xfe\xd7\x83\xc4\xaa\x47\x10\x5b\x20\x32\xe3\x97\xc1\x6c\xbc\x2c\xcb\xc3\xe1\xb0\xdc\x86\xb4\x14\xdd\x96\x7e\xc6\xc5\xf2\xd7\x65\x91\x99\x41\x64\xac\x95\x5a\xd6\x5c\xce\xc7\x14\x6d\x62\x37\xa4\xdc\x48\x60\x34\xe2\x3c\xeb\x98\x5b\x46\x2b\x5d\x1e\xe0\xaf\xe4\x94\x3b\xf4\x2a\x3b\x10\x7e\xa7\x3d\x6d\x5a\x75\xa3\x65\x9c\x34\x1f\xb9\x35\x98\xcc\x15\x52\xe3\xa7\x73\x24\x98\x52\x88\xd4\xe6\xbb\xc9\x9f\x5b\xd6\x65\xf1\x5c\x5c\x94\x25\xa2\xf1\x98\xbd\x5d\xd8\xcb\x9f\x99\x2b\x9a\xfb\xd4\x23\x64\x9c\x1c\xa7\xcb\xc8\xa1\xfe\x78\x0f\xfe\xc4\x6d\x32\x8e\xcb\xe2\x22\xeb\x2e\xd1\xa7\x30\x41\x5f\x79\xd9\x2e\xd0\x35\xaf\xf1\x8c\x97\x45\x31\x91\x7b\x4a\xde\xbe\x44\x1f\x86\xd3\x99\x50\x6b\x89\xfc\x89\x96\x23\x49\x0f\x0a\x67\xc3\x7e\x2e\xf0\x62\xd2\xff\xb7\x85\x72\xfc\x9a\x07\x79\x3f\xf9\xcc\xc0\x38\x57\xdf\x30\x07\x38\x63\xa5\x7c\xfb\xb2\x67\xcd\x7f\x7b\x28\x5b\xd2\x10\x27\x5c\xd6\xf4\x2e\x90\x3f\x83\x4f\xe7\x91\x37\xe6\xc2\x76\x59\x5c\xcc\xef\x5f\x84\x6a\xed\xd3\x39\xd4\x4c\xc2\xf3\xcb\x1b\xbc\x14\x2f\xc5\xdf\x01\x00\x00\xff\xff\x77\x56\xe7\x1a\xf7\x04\x00\x00") -func noop_tracerJsBytes() ([]byte, error) { +func noop_tracer_legacyJsBytes() ([]byte, error) { return bindataRead( - _noop_tracerJs, - "noop_tracer.js", + _noop_tracer_legacyJs, + "noop_tracer_legacy.js", ) } -func noop_tracerJs() (*asset, error) { - bytes, err := noop_tracerJsBytes() +func noop_tracer_legacyJs() (*asset, error) { + bytes, err := noop_tracer_legacyJsBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "noop_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + info := bindataFileInfo{name: "noop_tracer_legacy.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe3, 0xf, 0x1c, 0x6f, 0x65, 0xaf, 0x90, 0x31, 0xab, 0xf, 0xe0, 0xca, 0x54, 0x7, 0xfd, 0xd3, 0xa1, 0x4a, 0x14, 0x1, 0x2a, 0x9d, 0xdc, 0xb9, 0x64, 0x69, 0x83, 0x30, 0xb1, 0x2a, 0xbd, 0xfb}} return a, nil } @@ -218,23 +197,23 @@ func opcount_tracerJs() (*asset, error) { return a, nil } -var _prestate_tracerJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x57\xdd\x6f\xdb\x38\x12\x7f\xb6\xfe\x8a\x41\x5f\x6c\x5d\x5d\xb9\xcd\x02\x7b\x80\x73\x39\x40\x75\xdd\x36\x40\x36\x09\x6c\xe7\x72\xb9\xc5\x3e\x50\xe4\x48\xe6\x9a\x26\x05\x92\xb2\xe3\x2b\xf2\xbf\x1f\x86\xfa\xf0\x47\x93\xa6\x7b\x6f\x16\x39\xfc\xcd\xf7\x6f\xc6\xa3\x11\x4c\x4c\xb9\xb3\xb2\x58\x7a\x38\x7b\xff\xe1\xef\xb0\x58\x22\x14\xe6\x1d\xfa\x25\x5a\xac\xd6\x90\x56\x7e\x69\xac\x8b\x46\x23\x58\x2c\xa5\x83\x5c\x2a\x04\xe9\xa0\x64\xd6\x83\xc9\xc1\x9f\xc8\x2b\x99\x59\x66\x77\x49\x34\x1a\xd5\x6f\x9e\xbd\x26\x84\xdc\x22\x82\x33\xb9\xdf\x32\x8b\x63\xd8\x99\x0a\x38\xd3\x60\x51\x48\xe7\xad\xcc\x2a\x8f\x20\x3d\x30\x2d\x46\xc6\xc2\xda\x08\x99\xef\x08\x52\x7a\xa8\xb4\x40\x1b\x54\x7b\xb4\x6b\xd7\xda\xf1\xe5\xfa\x0e\xae\xd0\x39\xb4\xf0\x05\x35\x5a\xa6\xe0\xb6\xca\x94\xe4\x70\x25\x39\x6a\x87\xc0\x1c\x94\x74\xe2\x96\x28\x20\x0b\x70\xf4\xf0\x33\x99\x32\x6f\x4c\x81\xcf\xa6\xd2\x82\x79\x69\xf4\x10\x50\x92\xe5\xb0\x41\xeb\xa4\xd1\xf0\x4b\xab\xaa\x01\x1c\x82\xb1\x04\x32\x60\x9e\x1c\xb0\x60\x4a\x7a\x17\x03\xd3\x3b\x50\xcc\xef\x9f\xfe\x44\x40\xf6\x7e\x0b\x90\x3a\xa8\x59\x9a\x12\xc1\x2f\x99\x27\xaf\xb7\x52\x29\xc8\x10\x2a\x87\x79\xa5\x86\x84\x96\x55\x1e\xee\x2f\x17\x5f\x6f\xee\x16\x90\x5e\x3f\xc0\x7d\x3a\x9b\xa5\xd7\x8b\x87\x73\xd8\x4a\xbf\x34\x95\x07\xdc\x60\x0d\x25\xd7\xa5\x92\x28\x60\xcb\xac\x65\xda\xef\xc0\xe4\x84\xf0\xdb\x74\x36\xf9\x9a\x5e\x2f\xd2\x8f\x97\x57\x97\x8b\x07\x30\x16\x3e\x5f\x2e\xae\xa7\xf3\x39\x7c\xbe\x99\x41\x0a\xb7\xe9\x6c\x71\x39\xb9\xbb\x4a\x67\x70\x7b\x37\xbb\xbd\x99\x4f\x13\x98\x23\x59\x85\xf4\xfe\xf5\x98\xe7\x21\x7b\x16\x41\xa0\x67\x52\xb9\x36\x12\x0f\xa6\x02\xb7\x34\x95\x12\xb0\x64\x1b\x04\x8b\x1c\xe5\x06\x05\x30\xe0\xa6\xdc\xfd\x74\x52\x09\x8b\x29\xa3\x8b\xe0\xf3\x8b\x05\x09\x97\x39\x68\xe3\x87\xe0\x10\xe1\x1f\x4b\xef\xcb\xf1\x68\xb4\xdd\x6e\x93\x42\x57\x89\xb1\xc5\x48\xd5\x70\x6e\xf4\xcf\x24\x22\xcc\xd2\xa2\xf3\xcc\xe3\xc2\x32\x8e\x16\x4c\xe5\xcb\xca\x3b\x70\x55\x9e\x4b\x2e\x51\x7b\x90\x3a\x37\x76\x1d\x2a\x05\xbc\x01\x6e\x91\x79\x04\x06\xca\x70\xa6\x00\x1f\x91\x57\xe1\xae\x8e\x74\x28\x57\xcb\xb4\x63\x3c\x9c\xe6\xd6\xac\xc9\xd7\xca\x79\xfa\xe1\x1c\xae\x33\x85\x02\x0a\xd4\xe8\xa4\x83\x4c\x19\xbe\x4a\xa2\x6f\x51\xef\xc0\x18\xaa\x93\xe0\x61\x23\x14\x6a\x63\x8b\x7d\x8b\x90\x55\x52\x09\xa9\x8b\x24\xea\xb5\xd2\x63\xd0\x95\x52\xc3\x28\x40\x28\x63\x56\x55\x99\x72\x6e\xaa\x60\xfb\x9f\xc8\x7d\x0d\xe6\x4a\xe4\x32\xa7\xe2\x60\xdd\xad\x37\xe1\xaa\xd3\x6b\x32\x92\x4f\xa2\xde\x11\xcc\x18\xf2\x4a\x07\x77\x06\x4c\x08\x3b\x04\x91\xc5\xdf\xa2\x5e\x6f\xc3\x2c\x61\xc1\x05\x78\xf3\x15\x1f\xc3\x65\x7c\x1e\xf5\x7a\x32\x87\x81\x5f\x4a\x97\xb4\xc0\xbf\x33\xce\xff\x80\x8b\x8b\x8b\xd0\xd4\xb9\xd4\x28\x62\x20\x88\xde\x73\x62\xf5\x4d\x2f\x63\x8a\x69\x8e\x63\xe8\xbf\x7f\xec\xc3\x5b\x10\x59\x52\xa0\xff\x58\x9f\xd6\xca\x12\x6f\xe6\xde\x4a\x5d\x0c\x3e\xfc\x1a\x0f\xc3\x2b\x6d\xc2\x1b\x68\xc4\xaf\x4d\x27\x5c\xdf\x73\x23\xc2\x75\x63\x73\x2d\x35\x31\xa2\x11\x6a\xa4\x9c\x37\x96\x15\x38\x86\x6f\x4f\xf4\xfd\x44\x5e\x3d\x45\xbd\xa7\xa3\x28\xcf\x6b\xa1\x17\xa2\xdc\x40\x00\x6a\x6f\xbb\x3a\x2f\x24\x75\xea\x61\x02\x02\xde\x8f\x92\x30\x6f\x4d\x39\x49\xc2\x0a\x77\xaf\x67\x82\x2e\xa4\x78\xec\x2e\x56\xb8\x8b\xcf\xa3\x17\x53\x94\x34\x46\xff\x2e\xc5\xe3\xcf\xe6\xeb\xe4\xcd\x51\x5c\xe7\x24\xb5\xb7\x37\x8e\x4f\xe2\x68\xd1\x55\xca\x53\xb9\x4b\xbd\x31\x2b\x22\xae\x25\xc5\x47\xa9\x10\x12\x53\x52\xb6\x5c\xcd\x1c\x19\xa2\x06\xe9\xd1\x32\xa2\x4e\xb3\x41\x4b\x53\x03\x2c\xfa\xca\x6a\xd7\x85\x31\x97\x9a\xa9\x16\xb8\x89\xba\xb7\x8c\xd7\x3d\x53\x9f\x1f\xc4\x92\xfb\xc7\x10\xc5\xe0\xdd\x68\x04\xa9\x07\x72\x11\x4a\x23\xb5\x1f\xc2\x16\x41\x23\x0a\x6a\x7c\x81\xa2\xe2\x3e\xe0\xf5\x37\x4c\x55\xd8\xaf\x9b\x9b\x28\x32\x3c\x35\x15\x4d\x82\x83\xe6\x1f\x06\x03\xd7\x66\x13\x46\x5c\xc6\xf8\x0a\x9a\x86\x33\x56\x16\x52\x47\x4d\x38\x8f\x9a\x8d\x2c\x4a\x08\x38\x98\x15\x72\x45\x49\xa4\x93\x8f\x4c\xc1\x05\x64\xb2\xb8\xd4\xfe\x24\x79\x75\xd0\xdb\xa7\xf1\x1f\x49\xd3\x3c\x89\x23\xc2\x1b\x9c\xc5\x43\xf8\xf0\x6b\x57\x11\xde\x10\x14\xbc\x0e\xe6\xcd\xcb\x50\xd1\x69\x31\x3c\xff\x2c\xa8\xa1\x0e\x7e\x1b\xb4\x26\xae\xca\x28\x1d\xb5\x9f\x21\x8e\xc7\x5d\x7c\xfe\x03\xdc\x63\xdf\x5a\xdc\x26\x34\x09\x13\xe2\x10\x94\x3e\xc3\x77\xc1\xdc\x9d\x43\x01\x6f\x81\xbe\xa4\x26\x55\x4e\xf2\x2f\xcc\xc5\xf0\x37\x68\x24\x6e\xad\xe4\xdf\x59\x52\xe7\xf5\x13\x72\x8b\x6b\x1a\x05\x94\x3a\xce\x94\x42\xdb\x77\x10\x88\x66\xd8\xd4\x60\x48\x32\xae\x4b\xbf\x6b\x07\x84\x67\xb6\x40\xef\x5e\xf7\x26\xe0\xbc\x7b\xd7\xf2\x66\x88\xdf\xae\x44\xb8\xb8\x80\xfe\x64\x36\x4d\x17\xd3\x7e\xd3\x7b\xa3\x11\xdc\x63\x58\x9f\x32\x25\x33\xa1\x76\x20\x50\xa1\xc7\xda\x2e\xa3\x43\x5c\x3b\x1e\x19\xd2\x1e\x44\x1b\x0a\x3e\x4a\xe7\xa5\x2e\xa0\xa6\x97\x2d\x0d\xe3\x06\x2e\x34\x16\x67\x15\x85\xe7\x74\x72\x79\x43\x6b\x88\x45\x22\x23\x1a\x1a\xa1\x47\x99\x92\xdd\xda\x92\x4b\xeb\x3c\x94\x8a\x71\x4c\x08\xaf\x33\xe6\xe5\xa2\x68\xda\x9f\x54\xcf\x42\xdf\x06\xa0\xfd\x54\x64\x8a\xa6\x2a\xa9\x77\x30\x68\x31\xe2\xa8\xd7\xb3\xad\xf4\x01\xf6\xf9\x9e\x47\x9c\xc7\xf2\x90\x45\x68\x1b\xc1\x0d\x12\xef\x06\x0a\xa9\x27\x28\xe9\xfa\xd7\x6f\xcd\xc8\x46\x97\x44\x3d\x7a\x77\x40\x06\xca\x14\xc7\x64\x20\xea\xb0\xf0\xca\x5a\xca\x7f\xc7\xdb\x39\x11\xc3\x9f\x95\xf3\x14\x53\x4b\xe1\x69\x28\xe6\x39\x66\x0d\x3c\x4a\x23\x3a\xfe\x9e\x41\x69\xd8\x85\xe1\x42\xea\x9a\xd1\x56\xaf\x80\xa5\xf1\xa8\xbd\x64\x4a\xed\x28\x0f\x5b\x4b\xbb\x0f\x6d\x3b\x43\x70\x92\xa4\x02\x4d\x05\x51\xa9\xb9\xaa\x44\x5d\x06\xa1\xf8\x1b\x3c\x17\x6c\x3e\x5e\x9a\xd6\xe8\x1c\x2b\x30\xa1\x4a\xca\xe5\x63\xb3\x76\x6a\xe8\xd7\xcc\x38\x88\xfb\x49\x67\xe4\x31\x2f\x29\x53\x24\x6d\x91\x11\xb7\xa7\x42\x58\x74\x6e\x10\x37\x44\xd5\x65\xf6\x7e\x89\x9a\x82\x0f\x1a\xb7\xd0\xed\x33\x8c\x73\xda\xef\xc4\x10\x98\x10\xc4\x87\x27\xbb\x47\xd4\xeb\xb9\xad\xf4\x7c\x09\x41\x93\x29\xf7\xbd\x18\x37\xf5\xcf\x99\x43\x78\x33\xfd\xf7\x62\x72\xf3\x69\x3a\xb9\xb9\x7d\x78\x33\x86\xa3\xb3\xf9\xe5\x7f\xa6\xdd\xd9\xc7\xf4\x2a\xbd\x9e\x4c\xdf\x8c\xc3\x40\x7f\xc6\x21\x6f\x5a\x17\x48\xa1\xf3\x8c\xaf\x92\x12\x71\x35\x78\x7f\xcc\x03\x7b\x07\x7b\xbd\xcc\x22\x5b\x9d\xef\x8d\xa9\x1b\xb4\xd1\xd1\xf2\x34\x5c\xc0\x8b\xc1\x3a\x7f\xd9\x9a\x49\x23\x3f\x68\xd9\x7f\xbf\xbf\x04\xaa\x78\xdd\x8e\xb3\xbf\x6c\x48\xe8\x1d\xc6\x57\x63\x70\x4c\xd1\xda\x2c\xff\x4b\x7f\x77\xf2\xdc\xa1\x1f\x02\x6a\x61\xb6\xc4\x7c\x1d\x6a\x7d\xd3\xe0\x1e\x84\xec\x43\x5c\xd3\xee\x4d\x3e\x88\x3b\x61\x02\xfb\x5e\xf4\xec\x39\x51\xd4\x02\x2e\x5a\xf4\xb7\xe1\xe5\xeb\x81\x3a\x6b\x22\x75\xa2\xe0\x97\x93\xb5\x30\xdc\xaf\x71\x6d\xec\xae\x99\x61\x07\xfe\xfd\x38\xaa\xe9\xd5\x55\x57\x4f\xf4\x41\x45\xd6\x1d\x7c\x9a\x5e\x4d\xbf\xa4\x8b\xe9\x91\xd4\x7c\x91\x2e\x2e\x27\xf5\xd1\x5f\x2e\xbc\x0f\x3f\x5d\x78\xfd\xf9\x7c\x71\x33\x9b\xf6\xc7\xcd\xd7\xd5\x4d\xfa\xa9\xff\x9d\xc2\x66\x75\xfc\x51\xeb\x7a\x73\x6f\xac\xf8\x7f\x3a\xe0\x60\x8d\xcb\xd9\x73\x5b\x5c\xa0\x76\xee\xab\x93\x7f\x49\xc0\x74\xcb\xca\x79\xfd\x4f\xb1\x17\xde\x3f\xcb\xc3\x4f\xd1\x53\xf4\xbf\x00\x00\x00\xff\xff\x3a\xb7\x37\x41\xbf\x10\x00\x00") +var _prestate_tracer_legacyJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x57\xdb\x6e\x1b\x39\x12\x7d\x56\x7f\x45\x21\x2f\x92\x36\x4a\x2b\xf6\x00\xb3\x80\xbc\x5e\xa0\xa3\x28\xb1\x00\x8f\x6d\x48\xf2\x66\xbd\x83\x79\x60\x93\xd5\x2d\x8e\x28\xb2\x41\xb2\x25\x6b\x03\xff\xfb\xa2\xd8\x17\x5d\xe2\x4b\x66\xdf\xd4\x64\xf1\x54\xd5\x61\xd5\x61\x69\x38\x84\xb1\x29\x76\x56\xe6\x4b\x0f\xe7\x1f\xcf\xfe\x0e\x8b\x25\x42\x6e\x3e\xa0\x5f\xa2\xc5\x72\x0d\x49\xe9\x97\xc6\xba\x68\x38\x84\xc5\x52\x3a\xc8\xa4\x42\x90\x0e\x0a\x66\x3d\x98\x0c\xfc\x89\xbd\x92\xa9\x65\x76\x17\x47\xc3\x61\x75\xe6\xd9\x6d\x42\xc8\x2c\x22\x38\x93\xf9\x2d\xb3\x38\x82\x9d\x29\x81\x33\x0d\x16\x85\x74\xde\xca\xb4\xf4\x08\xd2\x03\xd3\x62\x68\x2c\xac\x8d\x90\xd9\x8e\x20\xa5\x87\x52\x0b\xb4\xc1\xb5\x47\xbb\x76\x4d\x1c\x5f\x6f\xee\xe1\x1a\x9d\x43\x0b\x5f\x51\xa3\x65\x0a\xee\xca\x54\x49\x0e\xd7\x92\xa3\x76\x08\xcc\x41\x41\x2b\x6e\x89\x02\xd2\x00\x47\x07\xbf\x50\x28\xf3\x3a\x14\xf8\x62\x4a\x2d\x98\x97\x46\x0f\x00\x25\x45\x0e\x1b\xb4\x4e\x1a\x0d\xbf\x34\xae\x6a\xc0\x01\x18\x4b\x20\x3d\xe6\x29\x01\x0b\xa6\xa0\x73\x7d\x60\x7a\x07\x8a\xf9\xfd\xd1\x9f\x20\x64\x9f\xb7\x00\xa9\x83\x9b\xa5\x29\x10\xfc\x92\x79\xca\x7a\x2b\x95\x82\x14\xa1\x74\x98\x95\x6a\x40\x68\x69\xe9\xe1\xdb\x74\x71\x75\x7b\xbf\x80\xe4\xe6\x01\xbe\x25\xb3\x59\x72\xb3\x78\xb8\x80\xad\xf4\x4b\x53\x7a\xc0\x0d\x56\x50\x72\x5d\x28\x89\x02\xb6\xcc\x5a\xa6\xfd\x0e\x4c\x46\x08\xbf\x4d\x66\xe3\xab\xe4\x66\x91\x7c\x9a\x5e\x4f\x17\x0f\x60\x2c\x7c\x99\x2e\x6e\x26\xf3\x39\x7c\xb9\x9d\x41\x02\x77\xc9\x6c\x31\x1d\xdf\x5f\x27\x33\xb8\xbb\x9f\xdd\xdd\xce\x27\x31\xcc\x91\xa2\x42\x3a\xff\x36\xe7\x59\xb8\x3d\x8b\x20\xd0\x33\xa9\x5c\xc3\xc4\x83\x29\xc1\x2d\x4d\xa9\x04\x2c\xd9\x06\xc1\x22\x47\xb9\x41\x01\x0c\xb8\x29\x76\x3f\x7d\xa9\x84\xc5\x94\xd1\x79\xc8\xf9\xc5\x82\x84\x69\x06\xda\xf8\x01\x38\x44\xf8\xc7\xd2\xfb\x62\x34\x1c\x6e\xb7\xdb\x38\xd7\x65\x6c\x6c\x3e\x54\x15\x9c\x1b\xfe\x33\x8e\x08\xb3\xb0\xe8\x3c\xf3\xb8\xb0\x8c\xa3\x05\x53\xfa\xa2\xf4\x0e\x5c\x99\x65\x92\x4b\xd4\x1e\xa4\xce\x8c\x5d\x87\x4a\x01\x6f\x80\x5b\x64\x1e\x81\x81\x32\x9c\x29\xc0\x47\xe4\x65\xd8\xab\x98\x0e\xe5\x6a\x99\x76\x8c\x87\xd5\xcc\x9a\x35\xe5\x5a\x3a\x4f\x3f\x9c\xc3\x75\xaa\x50\x40\x8e\x1a\x9d\x74\x90\x2a\xc3\x57\x71\xf4\x3d\xea\x1c\x04\x43\x75\x12\x32\xac\x8d\x42\x6d\x6c\xb1\x6b\x11\xd2\x52\x2a\x21\x75\x1e\x47\x9d\xc6\x7a\x04\xba\x54\x6a\x10\x05\x08\x65\xcc\xaa\x2c\x12\xce\x4d\x19\x62\xff\x13\xb9\xaf\xc0\x5c\x81\x5c\x66\x54\x1c\xac\xdd\xf5\x26\x6c\xb5\x7e\x4d\x4a\xf6\x71\xd4\x39\x82\x19\x41\x56\xea\x90\x4e\x8f\x09\x61\x07\x20\xd2\xfe\xf7\xa8\xd3\xd9\x30\x4b\x58\x70\x09\xde\x5c\xe1\x63\xd8\xec\x5f\x44\x9d\x8e\xcc\xa0\xe7\x97\xd2\xc5\x0d\xf0\xef\x8c\xf3\x3f\xe0\xf2\xf2\x32\x34\x75\x26\x35\x8a\x3e\x10\x44\xe7\x39\xb3\x6a\xa7\x93\x32\xc5\x34\xc7\x11\x74\x3f\x3e\x76\xe1\x3d\x88\x34\xce\xd1\x7f\xaa\x56\x2b\x67\xb1\x37\x73\x6f\xa5\xce\x7b\x67\xbf\xf6\x07\xe1\x94\x36\xe1\x0c\xd4\xe6\x37\xa6\x35\xae\xf6\xb9\x11\x61\xbb\x8e\xb9\xb2\x1a\x1b\x51\x1b\xd5\x56\xce\x1b\xcb\x72\x1c\xc1\xf7\x27\xfa\x7e\xa2\xac\x9e\xa2\xce\xd3\x11\xcb\xf3\xca\xe8\x05\x96\x6b\x08\x40\xed\x6d\x5b\xe7\xb9\xa4\x4e\x3d\xbc\x80\x80\xf7\xda\x25\xcc\x9b\x50\x4e\x2e\x61\x85\xbb\xb7\x6f\x82\x36\xa4\x78\x6c\x37\x56\xb8\xeb\x5f\x44\x2f\x5e\x51\x5c\x07\xfd\xbb\x14\x8f\x3f\x7b\x5f\x27\x67\x8e\x78\x9d\x93\xd5\x3e\xde\x7e\xff\x84\x47\x8b\xae\x54\x9e\xca\x5d\xea\x8d\x59\x91\x70\x2d\x89\x1f\xa5\x02\x25\xa6\xa0\xdb\x72\x95\x72\xa4\x88\x1a\xa4\x47\xcb\x48\x3a\xcd\x06\x2d\xbd\x1a\x60\xd1\x97\x56\xbb\x96\xc6\x4c\x6a\xa6\x1a\xe0\x9a\x75\x6f\x19\xaf\x7a\xa6\x5a\x3f\xe0\x92\xfb\xc7\xc0\x62\xc8\xee\x07\x52\x02\x05\xd4\x5d\xcf\x65\x4f\x85\x1a\x0a\x83\x5c\x4f\x33\xf0\x8f\xa1\x6f\xa9\xf9\x33\xb4\x1f\x8c\x56\xbb\x41\x70\x6f\x91\xcb\x22\x68\x49\x7d\xf1\xf5\x99\x25\x73\xba\xeb\xab\xc4\x0a\x53\x94\xf4\x94\x88\xb8\xf5\x73\xd4\x83\x14\x68\xec\x4d\x88\xb5\x22\x31\x0a\x18\x89\x07\x32\x86\xc2\x48\xed\x07\xb0\x45\xd0\x88\x82\x84\x4a\xa0\x28\xb9\x0f\x01\x74\x37\x4c\x95\xd8\xad\xc4\x88\x24\x3d\x1c\x35\x25\xbd\x5c\x07\x62\x35\x08\x84\xae\xcd\x26\x3c\xc9\x29\xe3\x2b\xa8\x05\xc2\x58\x99\x4b\x1d\xbd\x18\x18\x01\xd7\xa1\xd5\x45\x47\x2b\x9f\x98\x82\x4b\x48\x65\x3e\xd5\xfe\xa4\xd8\xaa\x22\x69\x8e\xf6\xff\x88\xeb\x66\x8f\x1d\x09\x74\xef\xbc\x3f\x80\xb3\x5f\xdb\x0a\xf6\x86\xa0\xe0\x6d\x30\x6f\x5e\x86\x8a\x4e\x8b\xf7\xf9\x63\xc1\x0d\x29\xce\xfb\xe0\x35\x76\x65\x4a\xe5\x53\xe5\x19\x78\x3c\x56\x9d\x8b\x57\x70\x8f\x73\x6b\x70\x6b\x6a\x62\x26\xc4\x21\x28\x7d\x86\xef\x9c\xb9\x7b\x87\x02\xde\x03\x7d\x49\x4d\xae\x9c\xe4\x5f\x99\xeb\xc3\xdf\xa0\xb6\xb8\xb3\x92\xff\x10\x49\x75\xaf\x9f\x91\x5b\x5c\x53\xb9\xd1\xd5\x71\xa6\x14\xda\xae\x83\x20\x8c\x83\xba\x67\xc2\x25\xe3\xba\xf0\xbb\xe6\x41\xf3\xcc\xe6\xe8\xdd\xdb\xd9\x04\x9c\x0f\x1f\x1a\x9d\x0f\xfc\xed\x0a\x6a\x15\xe8\x8e\x67\x93\x64\x31\xe9\xd6\xdd\x32\x1c\xc2\x37\x0c\xe3\x5e\xaa\x64\x2a\xd4\x0e\x04\x2a\xf4\x58\xc5\x65\x74\xe0\xb5\xd5\xbd\x01\xcd\x6d\x34\x51\xe1\xa3\x74\x5e\xea\x1c\xaa\x2e\xdb\xd2\xf0\xd0\x76\xcc\x86\x00\x4b\xa2\xe7\xf4\xa5\xf5\x86\xc6\x26\x8b\x24\x9e\xf4\xc8\x05\x4d\x61\x4a\xb6\x63\x56\x26\xad\xf3\x50\x28\xc6\x31\x34\x59\x1b\xcc\xcb\x45\x51\xcb\x15\xb9\x9e\x05\x9d\x09\x40\xfb\x57\x9c\x29\x9a\x02\xc8\xbd\x83\x5e\x83\xd1\x8f\x3a\x1d\xdb\x58\x1f\x60\x5f\xec\x75\xcf\x79\x2c\x0e\x55\x8f\xa6\x27\xdc\x20\xbd\x13\x41\xf2\xaa\x17\x9f\x7c\xfd\xeb\xb7\x7a\xc4\x40\x17\x47\x1d\x3a\x77\x20\x5e\xca\xe4\x7b\xf1\x22\x31\x10\x15\x2d\xbc\xb4\xf6\x40\x6e\x40\x66\x24\x0c\x7f\x96\xce\x13\xa7\x96\xe8\xa9\x25\xf1\x75\xd1\x7b\x43\xf3\xea\xa7\xb8\x1a\x59\x0b\xe3\x51\x7b\xc9\x94\xda\xd1\x3d\x6c\x2d\xcd\x6a\x34\x9d\x0d\xc0\x49\xb2\x0a\x32\x15\x4c\xa5\xe6\xaa\x14\x55\x19\x84\xe2\xaf\xf1\x5c\x88\xf9\x78\xc8\x5b\xa3\x73\x2c\xc7\x98\x2a\x29\x93\x8f\xf5\x98\xac\xa1\x5b\x29\x79\xaf\xdf\x7d\x49\x30\x95\xc9\xe3\xa6\xc8\xe8\x2d\x4a\x84\xb0\xe8\x5c\xaf\x7f\xa0\xa1\x55\x8d\x2e\x51\x13\xf9\xa0\x71\x0b\xed\xfc\xc5\x38\xa7\x79\x54\x0c\x80\x09\x41\x7a\x78\x32\x2b\x45\x9d\x8e\xdb\x4a\xcf\x97\x10\x3c\x99\x62\xdf\x8b\xfd\xba\xfe\x39\x73\x08\xef\x26\xff\x5e\x8c\x6f\x3f\x4f\xc6\xb7\x77\x0f\xef\x46\x70\xb4\x36\x9f\xfe\x67\x72\xba\x76\x95\xcc\xaf\xda\xb5\x4f\xc9\x75\x72\x33\x9e\xbc\x1b\x85\xa1\xe4\x99\x24\xbd\x69\xd2\xa2\x20\x9c\x67\x7c\x15\x17\x88\xab\xde\xc7\x63\x6d\xd8\x27\xdd\xe9\xa4\x16\xd9\xea\x62\x1f\x60\xd5\xb4\xb5\x8f\x46\xbb\xe1\x12\x5e\x24\xf0\xe2\xe5\x68\xc6\xb5\x7d\xaf\x79\x11\xf6\x33\x58\x90\x8f\xb7\xe3\x38\xff\xcb\x81\x84\x7e\x62\x7c\x35\x02\xc7\x14\x8d\xfe\xf2\xbf\xf4\x97\x2d\xcb\x1c\xfa\x01\xa0\x16\x66\x4b\x6a\xd8\xa2\x56\x3b\x35\xee\x01\x65\x67\xfd\x4a\x8a\x6f\xb3\x5e\xbf\x35\x26\xb0\x1f\x4d\xcf\x9f\x33\x45\x2d\xe0\xb2\x41\x7f\x1f\x4e\xbe\x4d\xd4\x79\xcd\xd4\x89\x83\x5f\x4e\x46\xdb\xb0\xbf\xc6\xb5\xb1\xbb\xfa\x5d\x3b\xc8\xef\x75\x56\x93\xeb\xeb\xb6\x9e\xe8\x83\x8a\xac\x5d\xf8\x3c\xb9\x9e\x7c\x4d\x16\x93\x23\xab\xf9\x22\x59\x4c\xc7\xd5\xd2\x5f\x2e\xbc\xb3\x9f\x2e\xbc\xee\x7c\xbe\xb8\x9d\x4d\xba\xa3\xfa\xeb\xfa\x36\xf9\xdc\xfd\xc1\x61\x3d\xfe\xbe\xd6\xce\xde\x7c\x33\x56\xfc\x3f\x1d\x70\x30\x8a\x66\xec\xb9\x49\x34\xc8\x3d\xf7\xe5\xc9\x3f\x3d\x60\xba\x51\xea\xac\xfa\xb7\xdb\x09\xe7\x9f\xd5\xe6\xa7\xe8\x29\xfa\x5f\x00\x00\x00\xff\xff\xfa\x53\xfa\x80\x83\x11\x00\x00") -func prestate_tracerJsBytes() ([]byte, error) { +func prestate_tracer_legacyJsBytes() ([]byte, error) { return bindataRead( - _prestate_tracerJs, - "prestate_tracer.js", + _prestate_tracer_legacyJs, + "prestate_tracer_legacy.js", ) } -func prestate_tracerJs() (*asset, error) { - bytes, err := prestate_tracerJsBytes() +func prestate_tracer_legacyJs() (*asset, error) { + bytes, err := prestate_tracer_legacyJsBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "prestate_tracer.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd4, 0x9, 0xf9, 0x44, 0x13, 0x31, 0x89, 0xf7, 0x35, 0x9a, 0xc6, 0xf0, 0x86, 0x9d, 0xb2, 0xe3, 0x57, 0xe2, 0xc0, 0xde, 0xc9, 0x3a, 0x4c, 0x4a, 0x94, 0x90, 0xa5, 0x92, 0x2f, 0xbf, 0xc0, 0xb8}} + info := bindataFileInfo{name: "prestate_tracer_legacy.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x94, 0xcf, 0x10, 0x37, 0xae, 0x8f, 0xd5, 0xfe, 0xf3, 0x25, 0x15, 0x25, 0x9b, 0x6b, 0x56, 0x7b, 0x3c, 0xa9, 0xda, 0xe8, 0xa2, 0xd3, 0x5, 0x96, 0x9c, 0xfd, 0x23, 0x68, 0xa2, 0x5, 0xca, 0x16}} return a, nil } @@ -369,16 +348,15 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "4byte_tracer_legacy.js": _4byte_tracer_legacyJs, - "bigram_tracer.js": bigram_tracerJs, - "call_tracer_js.js": call_tracer_jsJs, - "call_tracer_legacy.js": call_tracer_legacyJs, - "evmdis_tracer.js": evmdis_tracerJs, - "noop_tracer.js": noop_tracerJs, - "opcount_tracer.js": opcount_tracerJs, - "prestate_tracer.js": prestate_tracerJs, - "trigram_tracer.js": trigram_tracerJs, - "unigram_tracer.js": unigram_tracerJs, + "4byte_tracer_legacy.js": _4byte_tracer_legacyJs, + "bigram_tracer.js": bigram_tracerJs, + "call_tracer_legacy.js": call_tracer_legacyJs, + "evmdis_tracer.js": evmdis_tracerJs, + "noop_tracer_legacy.js": noop_tracer_legacyJs, + "opcount_tracer.js": opcount_tracerJs, + "prestate_tracer_legacy.js": prestate_tracer_legacyJs, + "trigram_tracer.js": trigram_tracerJs, + "unigram_tracer.js": unigram_tracerJs, } // AssetDebug is true if the assets were built with the debug flag enabled. @@ -425,16 +403,15 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "4byte_tracer_legacy.js": {_4byte_tracer_legacyJs, map[string]*bintree{}}, - "bigram_tracer.js": {bigram_tracerJs, map[string]*bintree{}}, - "call_tracer_js.js": {call_tracer_jsJs, map[string]*bintree{}}, - "call_tracer_legacy.js": {call_tracer_legacyJs, map[string]*bintree{}}, - "evmdis_tracer.js": {evmdis_tracerJs, map[string]*bintree{}}, - "noop_tracer.js": {noop_tracerJs, map[string]*bintree{}}, - "opcount_tracer.js": {opcount_tracerJs, map[string]*bintree{}}, - "prestate_tracer.js": {prestate_tracerJs, map[string]*bintree{}}, - "trigram_tracer.js": {trigram_tracerJs, map[string]*bintree{}}, - "unigram_tracer.js": {unigram_tracerJs, map[string]*bintree{}}, + "4byte_tracer_legacy.js": {_4byte_tracer_legacyJs, map[string]*bintree{}}, + "bigram_tracer.js": {bigram_tracerJs, map[string]*bintree{}}, + "call_tracer_legacy.js": {call_tracer_legacyJs, map[string]*bintree{}}, + "evmdis_tracer.js": {evmdis_tracerJs, map[string]*bintree{}}, + "noop_tracer_legacy.js": {noop_tracer_legacyJs, map[string]*bintree{}}, + "opcount_tracer.js": {opcount_tracerJs, map[string]*bintree{}}, + "prestate_tracer_legacy.js": {prestate_tracer_legacyJs, map[string]*bintree{}}, + "trigram_tracer.js": {trigram_tracerJs, map[string]*bintree{}}, + "unigram_tracer.js": {unigram_tracerJs, map[string]*bintree{}}, }} // RestoreAsset restores an asset under the given directory. diff --git a/eth/tracers/js/internal/tracers/noop_tracer_legacy.js b/eth/tracers/js/internal/tracers/noop_tracer_legacy.js new file mode 100644 index 0000000000..fe7ddc85ab --- /dev/null +++ b/eth/tracers/js/internal/tracers/noop_tracer_legacy.js @@ -0,0 +1,29 @@ +// Copyright 2017 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 . + +// noopTracer is just the barebone boilerplate code required from a JavaScript +// object to be usable as a transaction tracer. +{ + // step is invoked for every opcode that the VM executes. + step: function(log, db) { }, + + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) { }, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx, db) { return {}; } +} diff --git a/eth/tracers/js/internal/tracers/prestate_tracer.js b/eth/tracers/js/internal/tracers/prestate_tracer.js index 084c04ec46..77f25209cd 100644 --- a/eth/tracers/js/internal/tracers/prestate_tracer.js +++ b/eth/tracers/js/internal/tracers/prestate_tracer.js @@ -47,6 +47,13 @@ // result is invoked when all the opcodes have been iterated over and returns // the final result of the tracing. result: function(ctx, db) { + if (this.prestate === null) { + this.prestate = {}; + // If tx is transfer-only, the recipient account + // hasn't been populated. + this.lookupAccount(ctx.to, db); + } + // At this point, we need to deduct the 'value' from the // outer transaction, and move it back to the origin this.lookupAccount(ctx.from, db); @@ -79,7 +86,7 @@ } // Whenever new state is accessed, add it to the prestate switch (log.op.toString()) { - case "EXTCODECOPY": case "EXTCODESIZE": case "BALANCE": + case "EXTCODECOPY": case "EXTCODESIZE": case "EXTCODEHASH": case "BALANCE": this.lookupAccount(toAddress(log.stack.peek(0).toString(16)), db); break; case "CREATE": diff --git a/eth/tracers/js/internal/tracers/prestate_tracer_legacy.js b/eth/tracers/js/internal/tracers/prestate_tracer_legacy.js new file mode 100644 index 0000000000..77f25209cd --- /dev/null +++ b/eth/tracers/js/internal/tracers/prestate_tracer_legacy.js @@ -0,0 +1,115 @@ +// Copyright 2017 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 . + +// prestateTracer outputs sufficient information to create a local execution of +// the transaction from a custom assembled genesis block. +{ + // prestate is the genesis that we're building. + prestate: null, + + // lookupAccount injects the specified account into the prestate object. + lookupAccount: function(addr, db){ + var acc = toHex(addr); + if (this.prestate[acc] === undefined) { + this.prestate[acc] = { + balance: '0x' + db.getBalance(addr).toString(16), + nonce: db.getNonce(addr), + code: toHex(db.getCode(addr)), + storage: {} + }; + } + }, + + // lookupStorage injects the specified storage entry of the given account into + // the prestate object. + lookupStorage: function(addr, key, db){ + var acc = toHex(addr); + var idx = toHex(key); + + if (this.prestate[acc].storage[idx] === undefined) { + this.prestate[acc].storage[idx] = toHex(db.getState(addr, key)); + } + }, + + // result is invoked when all the opcodes have been iterated over and returns + // the final result of the tracing. + result: function(ctx, db) { + if (this.prestate === null) { + this.prestate = {}; + // If tx is transfer-only, the recipient account + // hasn't been populated. + this.lookupAccount(ctx.to, db); + } + + // At this point, we need to deduct the 'value' from the + // outer transaction, and move it back to the origin + this.lookupAccount(ctx.from, db); + + var fromBal = bigInt(this.prestate[toHex(ctx.from)].balance.slice(2), 16); + var toBal = bigInt(this.prestate[toHex(ctx.to)].balance.slice(2), 16); + + this.prestate[toHex(ctx.to)].balance = '0x'+toBal.subtract(ctx.value).toString(16); + this.prestate[toHex(ctx.from)].balance = '0x'+fromBal.add(ctx.value).add((ctx.gasUsed + ctx.intrinsicGas) * ctx.gasPrice).toString(16); + + // Decrement the caller's nonce, and remove empty create targets + this.prestate[toHex(ctx.from)].nonce--; + if (ctx.type == 'CREATE') { + // We can blibdly delete the contract prestate, as any existing state would + // have caused the transaction to be rejected as invalid in the first place. + delete this.prestate[toHex(ctx.to)]; + } + // Return the assembled allocations (prestate) + return this.prestate; + }, + + // step is invoked for every opcode that the VM executes. + step: function(log, db) { + // Add the current account if we just started tracing + if (this.prestate === null){ + this.prestate = {}; + // Balance will potentially be wrong here, since this will include the value + // sent along with the message. We fix that in 'result()'. + this.lookupAccount(log.contract.getAddress(), db); + } + // Whenever new state is accessed, add it to the prestate + switch (log.op.toString()) { + case "EXTCODECOPY": case "EXTCODESIZE": case "EXTCODEHASH": case "BALANCE": + this.lookupAccount(toAddress(log.stack.peek(0).toString(16)), db); + break; + case "CREATE": + var from = log.contract.getAddress(); + this.lookupAccount(toContract(from, db.getNonce(from)), db); + break; + case "CREATE2": + var from = log.contract.getAddress(); + // stack: salt, size, offset, endowment + var offset = log.stack.peek(1).valueOf() + var size = log.stack.peek(2).valueOf() + var end = offset + size + this.lookupAccount(toContract2(from, log.stack.peek(3).toString(16), log.memory.slice(offset, end)), db); + break; + case "CALL": case "CALLCODE": case "DELEGATECALL": case "STATICCALL": + this.lookupAccount(toAddress(log.stack.peek(1).toString(16)), db); + break; + case 'SSTORE':case 'SLOAD': + this.lookupStorage(log.contract.getAddress(), toWord(log.stack.peek(0).toString(16)), db); + break; + } + }, + + // fault is invoked when the actual execution of an opcode fails. + fault: function(log, db) {} +} diff --git a/eth/tracers/js/tracer.go b/eth/tracers/js/tracer.go index b8e035e6f3..30c5c2cf14 100644 --- a/eth/tracers/js/tracer.go +++ b/eth/tracers/js/tracer.go @@ -697,7 +697,7 @@ func (jst *jsTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Ad jst.ctx["block"] = env.Context.BlockNumber.Uint64() jst.dbWrapper.db = env.StateDB // Update list of precompiles based on current block - rules := env.ChainConfig().Rules(env.Context.BlockNumber) + rules := env.ChainConfig().Rules(env.Context.BlockNumber, env.Context.Random != nil) jst.activePrecompiles = vm.ActivePrecompiles(rules) // Compute intrinsic gas diff --git a/eth/tracers/native/4byte.go b/eth/tracers/native/4byte.go index e60e82de47..ad1d89071c 100644 --- a/eth/tracers/native/4byte.go +++ b/eth/tracers/native/4byte.go @@ -83,7 +83,7 @@ func (t *fourByteTracer) CaptureStart(env *vm.EVM, from common.Address, to commo t.env = env // Update list of precompiles based on current block - rules := env.ChainConfig().Rules(env.Context.BlockNumber) + rules := env.ChainConfig().Rules(env.Context.BlockNumber, env.Context.Random != nil) t.activePrecompiles = vm.ActivePrecompiles(rules) // Save the outer calldata also diff --git a/eth/tracers/native/call.go b/eth/tracers/native/call.go index 16ea75aa4a..08dc76aa61 100644 --- a/eth/tracers/native/call.go +++ b/eth/tracers/native/call.go @@ -59,8 +59,7 @@ type callTracer struct { func newCallTracer() tracers.Tracer { // First callframe contains tx context info // and is populated on start and end. - t := &callTracer{callstack: make([]callFrame, 1)} - return t + return &callTracer{callstack: make([]callFrame, 1)} } // CaptureStart implements the EVMLogger interface to initialize the tracing operation. diff --git a/eth/tracers/native/noop.go b/eth/tracers/native/noop.go index ee110ef7df..15b7dbccb7 100644 --- a/eth/tracers/native/noop.go +++ b/eth/tracers/native/noop.go @@ -27,7 +27,7 @@ import ( ) func init() { - register("noopTracerNative", newNoopTracer) + register("noopTracer", newNoopTracer) } // noopTracer is a go implementation of the Tracer interface which diff --git a/eth/tracers/native/prestate.go b/eth/tracers/native/prestate.go new file mode 100644 index 0000000000..598663ac81 --- /dev/null +++ b/eth/tracers/native/prestate.go @@ -0,0 +1,186 @@ +// Copyright 2022 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 . + +package native + +import ( + "encoding/json" + "math/big" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/tracers" +) + +func init() { + register("prestateTracer", newPrestateTracer) +} + +type prestate = map[common.Address]*account +type account struct { + Balance string `json:"balance"` + Nonce uint64 `json:"nonce"` + Code string `json:"code"` + Storage map[common.Hash]common.Hash `json:"storage"` +} + +type prestateTracer struct { + env *vm.EVM + prestate prestate + create bool + to common.Address + interrupt uint32 // Atomic flag to signal execution interruption + reason error // Textual reason for the interruption +} + +func newPrestateTracer() tracers.Tracer { + // First callframe contains tx context info + // and is populated on start and end. + return &prestateTracer{prestate: prestate{}} +} + +// CaptureStart implements the EVMLogger interface to initialize the tracing operation. +func (t *prestateTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { + t.env = env + t.create = create + t.to = to + + // Compute intrinsic gas + isHomestead := env.ChainConfig().IsHomestead(env.Context.BlockNumber) + isIstanbul := env.ChainConfig().IsIstanbul(env.Context.BlockNumber) + intrinsicGas, err := core.IntrinsicGas(input, nil, create, isHomestead, isIstanbul) + if err != nil { + return + } + + t.lookupAccount(from) + t.lookupAccount(to) + + // The recipient balance includes the value transferred. + toBal := hexutil.MustDecodeBig(t.prestate[to].Balance) + toBal = new(big.Int).Sub(toBal, value) + t.prestate[to].Balance = hexutil.EncodeBig(toBal) + + // The sender balance is after reducing: value, gasLimit, intrinsicGas. + // We need to re-add them to get the pre-tx balance. + fromBal := hexutil.MustDecodeBig(t.prestate[from].Balance) + gasPrice := env.TxContext.GasPrice + consumedGas := new(big.Int).Mul( + gasPrice, + new(big.Int).Add( + new(big.Int).SetUint64(intrinsicGas), + new(big.Int).SetUint64(gas), + ), + ) + fromBal.Add(fromBal, new(big.Int).Add(value, consumedGas)) + t.prestate[from].Balance = hexutil.EncodeBig(fromBal) + t.prestate[from].Nonce-- +} + +// CaptureEnd is called after the call finishes to finalize the tracing. +func (t *prestateTracer) CaptureEnd(output []byte, gasUsed uint64, _ time.Duration, err error) { + if t.create { + // Exclude created contract. + delete(t.prestate, t.to) + } +} + +// CaptureState implements the EVMLogger interface to trace a single step of VM execution. +func (t *prestateTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + stack := scope.Stack + stackData := stack.Data() + stackLen := len(stackData) + switch { + case stackLen >= 1 && (op == vm.SLOAD || op == vm.SSTORE): + slot := common.Hash(stackData[stackLen-1].Bytes32()) + t.lookupStorage(scope.Contract.Address(), slot) + case stackLen >= 1 && (op == vm.EXTCODECOPY || op == vm.EXTCODEHASH || op == vm.EXTCODESIZE || op == vm.BALANCE || op == vm.SELFDESTRUCT): + addr := common.Address(stackData[stackLen-1].Bytes20()) + t.lookupAccount(addr) + case stackLen >= 5 && (op == vm.DELEGATECALL || op == vm.CALL || op == vm.STATICCALL || op == vm.CALLCODE): + addr := common.Address(stackData[stackLen-2].Bytes20()) + t.lookupAccount(addr) + case op == vm.CREATE: + addr := scope.Contract.Address() + nonce := t.env.StateDB.GetNonce(addr) + t.lookupAccount(crypto.CreateAddress(addr, nonce)) + case stackLen >= 4 && op == vm.CREATE2: + offset := stackData[stackLen-2] + size := stackData[stackLen-3] + init := scope.Memory.GetCopy(int64(offset.Uint64()), int64(size.Uint64())) + inithash := crypto.Keccak256(init) + salt := stackData[stackLen-4] + t.lookupAccount(crypto.CreateAddress2(scope.Contract.Address(), salt.Bytes32(), inithash)) + } +} + +// CaptureFault implements the EVMLogger interface to trace an execution fault. +func (t *prestateTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, _ *vm.ScopeContext, depth int, err error) { +} + +// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). +func (t *prestateTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { +} + +// CaptureExit is called when EVM exits a scope, even if the scope didn't +// execute any code. +func (t *prestateTracer) CaptureExit(output []byte, gasUsed uint64, err error) { +} + +// GetResult returns the json-encoded nested list of call traces, and any +// error arising from the encoding or forceful termination (via `Stop`). +func (t *prestateTracer) GetResult() (json.RawMessage, error) { + res, err := json.Marshal(t.prestate) + if err != nil { + return nil, err + } + return json.RawMessage(res), t.reason +} + +// Stop terminates execution of the tracer at the first opportune moment. +func (t *prestateTracer) Stop(err error) { + t.reason = err + atomic.StoreUint32(&t.interrupt, 1) +} + +// lookupAccount fetches details of an account and adds it to the prestate +// if it doesn't exist there. +func (t *prestateTracer) lookupAccount(addr common.Address) { + if _, ok := t.prestate[addr]; ok { + return + } + t.prestate[addr] = &account{ + Balance: bigToHex(t.env.StateDB.GetBalance(addr)), + Nonce: t.env.StateDB.GetNonce(addr), + Code: bytesToHex(t.env.StateDB.GetCode(addr)), + Storage: make(map[common.Hash]common.Hash), + } +} + +// lookupStorage fetches the requested storage slot and adds +// it to the prestate of the given contract. It assumes `lookupAccount` +// has been performed on the contract before. +func (t *prestateTracer) lookupStorage(addr common.Address, key common.Hash) { + if _, ok := t.prestate[addr].Storage[key]; ok { + return + } + t.prestate[addr].Storage[key] = t.env.StateDB.GetState(addr, key) +} diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index c6fa6b4c85..82fc8d5681 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -465,6 +465,17 @@ func (ec *Client) CallContract(ctx context.Context, msg ethereum.CallMsg, blockN return hex, nil } +// CallContractAtHash is almost the same as CallContract except that it selects +// the block by block hash instead of block height. +func (ec *Client) CallContractAtHash(ctx context.Context, msg ethereum.CallMsg, blockHash common.Hash) ([]byte, error) { + var hex hexutil.Bytes + err := ec.c.CallContext(ctx, &hex, "eth_call", toCallArg(msg), rpc.BlockNumberOrHashWithHash(blockHash, false)) + if err != nil { + return nil, err + } + return hex, nil +} + // PendingCallContract executes a message call transaction using the EVM. // The state seen by the contract call is the pending state. func (ec *Client) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) { diff --git a/ethclient/ethclient_test.go b/ethclient/ethclient_test.go index 6507db843f..a75d17ded6 100644 --- a/ethclient/ethclient_test.go +++ b/ethclient/ethclient_test.go @@ -287,6 +287,9 @@ func TestEthClient(t *testing.T) { "CallContract": { func(t *testing.T) { testCallContract(t, client) }, }, + "CallContractAtHash": { + func(t *testing.T) { testCallContractAtHash(t, client) }, + }, "AtFunctions": { func(t *testing.T) { testAtFunctions(t, client) }, }, @@ -509,6 +512,33 @@ func testStatusFunctions(t *testing.T, client *rpc.Client) { } } +func testCallContractAtHash(t *testing.T, client *rpc.Client) { + ec := NewClient(client) + + // EstimateGas + msg := ethereum.CallMsg{ + From: testAddr, + To: &common.Address{}, + Gas: 21000, + Value: big.NewInt(1), + } + gas, err := ec.EstimateGas(context.Background(), msg) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if gas != 21000 { + t.Fatalf("unexpected gas price: %v", gas) + } + block, err := ec.HeaderByNumber(context.Background(), big.NewInt(1)) + if err != nil { + t.Fatalf("BlockByNumber error: %v", err) + } + // CallContract + if _, err := ec.CallContractAtHash(context.Background(), msg, block.Hash()); err != nil { + t.Fatalf("unexpected error: %v", err) + } +} + func testCallContract(t *testing.T, client *rpc.Client) { ec := NewClient(client) diff --git a/ethdb/batch.go b/ethdb/batch.go index 1353693318..541f40c838 100644 --- a/ethdb/batch.go +++ b/ethdb/batch.go @@ -43,6 +43,9 @@ type Batcher interface { // NewBatch creates a write-only database that buffers changes to its host db // until a final write is called. NewBatch() Batch + + // NewBatchWithSize creates a write-only database batch with pre-allocated buffer. + NewBatchWithSize(size int) Batch } // HookedBatch wraps an arbitrary batch where each operation may be hooked into diff --git a/ethdb/database.go b/ethdb/database.go index 0a5729c6c1..b2e7c7228a 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -64,6 +64,7 @@ type KeyValueStore interface { Iteratee Stater Compacter + Snapshotter io.Closer } @@ -86,6 +87,10 @@ type AncientReader interface { // Ancients returns the ancient item numbers in the ancient store. Ancients() (uint64, error) + // Tail returns the number of first stored item in the freezer. + // This number can also be interpreted as the total deleted item numbers. + Tail() (uint64, error) + // AncientSize returns the ancient size of the specified category. AncientSize(kind string) (uint64, error) } @@ -106,11 +111,24 @@ type AncientWriter interface { // The integer return value is the total size of the written data. ModifyAncients(func(AncientWriteOp) error) (int64, error) - // TruncateAncients discards all but the first n ancient data from the ancient store. - TruncateAncients(n uint64) error + // TruncateHead discards all but the first n ancient data from the ancient store. + // After the truncation, the latest item can be accessed it item_n-1(start from 0). + TruncateHead(n uint64) error + + // TruncateTail discards the first n ancient data from the ancient store. The already + // deleted items are ignored. After the truncation, the earliest item can be accessed + // is item_n(start from 0). The deleted items may not be removed from the ancient store + // immediately, but only when the accumulated deleted data reach the threshold then + // will be removed all together. + TruncateTail(n uint64) error // Sync flushes all in-memory ancient store data to disk. Sync() error + + // MigrateTable processes and migrates entries of a given table to a new format. + // The second argument is a function that takes a raw entry and returns it + // in the newest format. + MigrateTable(string, func([]byte) ([]byte, error)) error } // AncientWriteOp is given to the function argument of ModifyAncients. @@ -153,5 +171,6 @@ type Database interface { Iteratee Stater Compacter + Snapshotter io.Closer } diff --git a/ethdb/dbtest/testsuite.go b/ethdb/dbtest/testsuite.go index 06ee2211e6..6b206af48d 100644 --- a/ethdb/dbtest/testsuite.go +++ b/ethdb/dbtest/testsuite.go @@ -313,6 +313,68 @@ func TestDatabaseSuite(t *testing.T, New func() ethdb.KeyValueStore) { } }) + t.Run("Snapshot", func(t *testing.T) { + db := New() + defer db.Close() + + initial := map[string]string{ + "k1": "v1", "k2": "v2", "k3": "", "k4": "", + } + for k, v := range initial { + db.Put([]byte(k), []byte(v)) + } + snapshot, err := db.NewSnapshot() + if err != nil { + t.Fatal(err) + } + for k, v := range initial { + got, err := snapshot.Get([]byte(k)) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, []byte(v)) { + t.Fatalf("Unexpected value want: %v, got %v", v, got) + } + } + + // Flush more modifications into the database, ensure the snapshot + // isn't affected. + var ( + update = map[string]string{"k1": "v1-b", "k3": "v3-b"} + insert = map[string]string{"k5": "v5-b"} + delete = map[string]string{"k2": ""} + ) + for k, v := range update { + db.Put([]byte(k), []byte(v)) + } + for k, v := range insert { + db.Put([]byte(k), []byte(v)) + } + for k := range delete { + db.Delete([]byte(k)) + } + for k, v := range initial { + got, err := snapshot.Get([]byte(k)) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, []byte(v)) { + t.Fatalf("Unexpected value want: %v, got %v", v, got) + } + } + for k := range insert { + got, err := snapshot.Get([]byte(k)) + if err == nil || len(got) != 0 { + t.Fatal("Unexpected value") + } + } + for k := range delete { + got, err := snapshot.Get([]byte(k)) + if err != nil || len(got) == 0 { + t.Fatal("Unexpected deletion") + } + } + }) } func iterateKeys(it ethdb.Iterator) []string { diff --git a/ethdb/leveldb/leveldb.go b/ethdb/leveldb/leveldb.go index 9a782dedbe..15bd4e6eb3 100644 --- a/ethdb/leveldb/leveldb.go +++ b/ethdb/leveldb/leveldb.go @@ -213,6 +213,14 @@ func (db *Database) NewBatch() ethdb.Batch { } } +// NewBatchWithSize creates a write-only database batch with pre-allocated buffer. +func (db *Database) NewBatchWithSize(size int) ethdb.Batch { + return &batch{ + db: db.db, + b: leveldb.MakeBatch(size), + } +} + // NewIterator creates a binary-alphabetical iterator over a subset // of database content with a particular key prefix, starting at a particular // initial key (or after, if it does not exist). @@ -220,6 +228,19 @@ func (db *Database) NewIterator(prefix []byte, start []byte) ethdb.Iterator { return db.db.NewIterator(bytesPrefixRange(prefix, start), nil) } +// NewSnapshot creates a database snapshot based on the current state. +// The created snapshot will not be affected by all following mutations +// happened on the database. +// Note don't forget to release the snapshot once it's used up, otherwise +// the stale data will never be cleaned up by the underlying compactor. +func (db *Database) NewSnapshot() (ethdb.Snapshot, error) { + snap, err := db.db.GetSnapshot() + if err != nil { + return nil, err + } + return &snapshot{db: snap}, nil +} + // Stat returns a particular internal stat of the database. func (db *Database) Stat(property string) (string, error) { return db.db.GetProperty(property) @@ -519,3 +540,26 @@ func bytesPrefixRange(prefix, start []byte) *util.Range { r.Start = append(r.Start, start...) return r } + +// snapshot wraps a leveldb snapshot for implementing the Snapshot interface. +type snapshot struct { + db *leveldb.Snapshot +} + +// Has retrieves if a key is present in the snapshot backing by a key-value +// data store. +func (snap *snapshot) Has(key []byte) (bool, error) { + return snap.db.Has(key, nil) +} + +// Get retrieves the given key if it's present in the snapshot backing by +// key-value data store. +func (snap *snapshot) Get(key []byte) ([]byte, error) { + return snap.db.Get(key, nil) +} + +// Release releases associated resources. Release should always succeed and can +// be called multiple times without causing error. +func (snap *snapshot) Release() { + snap.db.Release() +} diff --git a/ethdb/memorydb/memorydb.go b/ethdb/memorydb/memorydb.go index 78181e860c..95ec9bb8aa 100644 --- a/ethdb/memorydb/memorydb.go +++ b/ethdb/memorydb/memorydb.go @@ -35,6 +35,10 @@ var ( // errMemorydbNotFound is returned if a key is requested that is not found in // the provided memory database. errMemorydbNotFound = errors.New("not found") + + // errSnapshotReleased is returned if callers want to retrieve data from a + // released snapshot. + errSnapshotReleased = errors.New("snapshot released") ) // Database is an ephemeral key-value store. Apart from basic data storage @@ -53,7 +57,7 @@ func New() *Database { } } -// NewWithCap returns a wrapped map pre-allocated to the provided capcity with +// NewWithCap returns a wrapped map pre-allocated to the provided capacity with // all the required database interface methods implemented. func NewWithCap(size int) *Database { return &Database{ @@ -129,6 +133,13 @@ func (db *Database) NewBatch() ethdb.Batch { } } +// NewBatchWithSize creates a write-only database batch with pre-allocated buffer. +func (db *Database) NewBatchWithSize(size int) ethdb.Batch { + return &batch{ + db: db, + } +} + // NewIterator creates a binary-alphabetical iterator over a subset // of database content with a particular key prefix, starting at a particular // initial key (or after, if it does not exist). @@ -163,6 +174,13 @@ func (db *Database) NewIterator(prefix []byte, start []byte) ethdb.Iterator { } } +// NewSnapshot creates a database snapshot based on the current state. +// The created snapshot will not be affected by all following mutations +// happened on the database. +func (db *Database) NewSnapshot() (ethdb.Snapshot, error) { + return newSnapshot(db), nil +} + // Stat returns a particular internal stat of the database. func (db *Database) Stat(property string) (string, error) { return "", errors.New("unknown property") @@ -313,3 +331,59 @@ func (it *iterator) Value() []byte { func (it *iterator) Release() { it.keys, it.values = nil, nil } + +// snapshot wraps a batch of key-value entries deep copied from the in-memory +// database for implementing the Snapshot interface. +type snapshot struct { + db map[string][]byte + lock sync.RWMutex +} + +// newSnapshot initializes the snapshot with the given database instance. +func newSnapshot(db *Database) *snapshot { + db.lock.RLock() + defer db.lock.RUnlock() + + copied := make(map[string][]byte) + for key, val := range db.db { + copied[key] = common.CopyBytes(val) + } + return &snapshot{db: copied} +} + +// Has retrieves if a key is present in the snapshot backing by a key-value +// data store. +func (snap *snapshot) Has(key []byte) (bool, error) { + snap.lock.RLock() + defer snap.lock.RUnlock() + + if snap.db == nil { + return false, errSnapshotReleased + } + _, ok := snap.db[string(key)] + return ok, nil +} + +// Get retrieves the given key if it's present in the snapshot backing by +// key-value data store. +func (snap *snapshot) Get(key []byte) ([]byte, error) { + snap.lock.RLock() + defer snap.lock.RUnlock() + + if snap.db == nil { + return nil, errSnapshotReleased + } + if entry, ok := snap.db[string(key)]; ok { + return common.CopyBytes(entry), nil + } + return nil, errMemorydbNotFound +} + +// Release releases associated resources. Release should always succeed and can +// be called multiple times without causing error. +func (snap *snapshot) Release() { + snap.lock.Lock() + defer snap.lock.Unlock() + + snap.db = nil +} diff --git a/ethdb/snapshot.go b/ethdb/snapshot.go new file mode 100644 index 0000000000..753e0f6b1f --- /dev/null +++ b/ethdb/snapshot.go @@ -0,0 +1,41 @@ +// Copyright 2018 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 . + +package ethdb + +type Snapshot interface { + // Has retrieves if a key is present in the snapshot backing by a key-value + // data store. + Has(key []byte) (bool, error) + + // Get retrieves the given key if it's present in the snapshot backing by + // key-value data store. + Get(key []byte) ([]byte, error) + + // Release releases associated resources. Release should always succeed and can + // be called multiple times without causing error. + Release() +} + +// Snapshotter wraps the Snapshot method of a backing data store. +type Snapshotter interface { + // NewSnapshot creates a database snapshot based on the current state. + // The created snapshot will not be affected by all following mutations + // happened on the database. + // Note don't forget to release the snapshot once it's used up, otherwise + // the stale data will never be cleaned up by the underlying compactor. + NewSnapshot() (Snapshot, error) +} diff --git a/go.mod b/go.mod index 8ffc4d00d0..edd6d6887a 100644 --- a/go.mod +++ b/go.mod @@ -3,21 +3,19 @@ module github.com/ethereum/go-ethereum go 1.16 require ( - github.com/Azure/azure-pipeline-go v0.2.2 // indirect - github.com/Azure/azure-storage-blob-go v0.7.0 - github.com/Azure/go-autorest/autorest/adal v0.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect github.com/VictoriaMetrics/fastcache v1.6.0 github.com/aws/aws-sdk-go-v2 v1.2.0 github.com/aws/aws-sdk-go-v2/config v1.1.1 github.com/aws/aws-sdk-go-v2/credentials v1.1.1 github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1 - github.com/btcsuite/btcd v0.20.1-beta + github.com/btcsuite/btcd/btcec/v2 v2.1.2 github.com/cespare/cp v0.1.0 github.com/cloudflare/cloudflare-go v0.14.0 github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f github.com/davecgh/go-spew v1.1.1 - github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea + github.com/deckarep/golang-set v1.8.0 github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48 @@ -29,31 +27,32 @@ require ( github.com/go-logfmt/logfmt v0.5.0 // indirect github.com/go-ole/go-ole v1.2.1 // indirect github.com/go-stack/stack v1.8.0 + github.com/golang-jwt/jwt/v4 v4.3.0 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa - github.com/google/uuid v1.1.5 + github.com/google/uuid v1.2.0 github.com/gorilla/websocket v1.4.2 - github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29 + github.com/graph-gophers/graphql-go v1.3.0 github.com/hashicorp/go-bexpr v0.1.10 github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d github.com/hashicorp/hcl/v2 v2.10.1 github.com/holiman/bloomfilter/v2 v2.0.3 github.com/holiman/uint256 v1.2.0 - github.com/huin/goupnp v1.0.2 + github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204 github.com/imdario/mergo v0.3.11 github.com/influxdata/influxdb v1.8.3 github.com/influxdata/influxdb-client-go/v2 v2.4.0 github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect - github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 + github.com/jackpal/go-nat-pmp v1.0.2 github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e github.com/julienschmidt/httprouter v1.3.0 - github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559 + github.com/karalabe/usb v0.0.2 github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-isatty v0.0.12 github.com/mitchellh/cli v1.1.2 - github.com/mitchellh/go-grpc-net-conn v0.0.0-20200427190222-eb030e4876f0 // indirect + github.com/mitchellh/go-grpc-net-conn v0.0.0-20200427190222-eb030e4876f0 github.com/mitchellh/go-homedir v1.1.0 github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 @@ -74,11 +73,11 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.2.0 go.opentelemetry.io/otel/sdk v1.2.0 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 - golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 - golang.org/x/text v0.3.6 + golang.org/x/text v0.3.7 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba + golang.org/x/tools v0.1.0 google.golang.org/grpc v1.42.0 google.golang.org/protobuf v1.27.1 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce diff --git a/go.sum b/go.sum index a353c13b4b..19a6002886 100644 --- a/go.sum +++ b/go.sum @@ -18,26 +18,12 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0 h1:MuueVOYkufCxJw5YZzF842DY2MBsp+hLuh2apKY0mck= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0 h1:CxTzQrySOxDnKpLjFJeZAS5Qrv/qFPkgLjx5bOAi//I= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -52,7 +38,6 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIO github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -94,15 +79,10 @@ github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/btcsuite/btcd/btcec/v2 v2.1.2 h1:YoYoC9J0jwfukodSBMzZYUVQ8PTiYg4BnOWiJVzTmLs= +github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0 h1:MSskdM4/xJYcFzy0altH/C/xHopifpWzHUi1JeVI34Q= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -132,21 +112,26 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 h1:Izz0+t1Z5nI16/II7vuEo/nHjodOg0p7+OiDpjX5t1E= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf h1:sh8rkQZavChcmakYiSlqu2425CHyFXLZZnvm7PDpU8M= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48 h1:iZOop7pqsg+56twTopWgwCGxdB5SI2yDO8Ti7eTRliQ= @@ -200,6 +185,8 @@ github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3a github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -251,16 +238,16 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I= -github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29 h1:sezaKhEfPFg8W0Enm61B9Gs911H8iesGY5R8NDPtd1M= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= @@ -282,8 +269,8 @@ github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204 h1:+EYBkW+dbi3F/atB+LSQZSWh7+HNrV3A/N0y6DSoy9k= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= @@ -303,14 +290,12 @@ github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19y github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e h1:UvSe12bq+Uj2hWd8aOlwPmoZ+CITRFrdit+sDGfAg8U= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -321,11 +306,10 @@ github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4d github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559 h1:0VWDXPNE0brOek1Q8bLfzKkvOzwbQE/snjGojlCr8CY= -github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -355,9 +339,6 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d h1:oNAwILwmgWKFpuU+dXvI6dl9jG2mAWAZLX3r9s0PPiw= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -388,6 +369,7 @@ github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/I github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= @@ -400,11 +382,9 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -521,7 +501,6 @@ go.opentelemetry.io/proto/otlp v0.10.0/go.mod h1:zG20xCK0szZ1xdokeSOwEcmlXu+x9kk go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -561,6 +540,7 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -582,10 +562,12 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -599,7 +581,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -652,8 +633,9 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -685,6 +667,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -775,8 +758,9 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/graphql/graphql.go b/graphql/graphql.go index 16e0eb654d..cbd76465d6 100644 --- a/graphql/graphql.go +++ b/graphql/graphql.go @@ -28,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/filters" @@ -100,6 +101,14 @@ func (a *Account) Balance(ctx context.Context) (hexutil.Big, error) { } func (a *Account) TransactionCount(ctx context.Context) (hexutil.Uint64, error) { + // Ask transaction pool for the nonce which includes pending transactions + if blockNr, ok := a.blockNrOrHash.Number(); ok && blockNr == rpc.PendingBlockNumber { + nonce, err := a.backend.GetPoolNonce(ctx, a.address) + if err != nil { + return 0, err + } + return hexutil.Uint64(nonce), nil + } state, err := a.getState(ctx) if err != nil { return 0, err @@ -245,6 +254,10 @@ func (t *Transaction) EffectiveGasPrice(ctx context.Context) (*hexutil.Big, erro if err != nil || tx == nil { return nil, err } + // Pending tx + if t.block == nil { + return nil, nil + } header, err := t.block.resolveHeader(ctx) if err != nil || header == nil { return nil, err @@ -285,6 +298,30 @@ func (t *Transaction) MaxPriorityFeePerGas(ctx context.Context) (*hexutil.Big, e } } +func (t *Transaction) EffectiveTip(ctx context.Context) (*hexutil.Big, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return nil, err + } + // Pending tx + if t.block == nil { + return nil, nil + } + header, err := t.block.resolveHeader(ctx) + if err != nil || header == nil { + return nil, err + } + if header.BaseFee == nil { + return (*hexutil.Big)(tx.GasPrice()), nil + } + + tip, err := tx.EffectiveGasTip(header.BaseFee) + if err != nil { + return nil, err + } + return (*hexutil.Big)(tip), nil +} + func (t *Transaction) Value(ctx context.Context) (hexutil.Big, error) { tx, err := t.resolve(ctx) if err != nil || tx == nil { @@ -598,6 +635,22 @@ func (b *Block) BaseFeePerGas(ctx context.Context) (*hexutil.Big, error) { return (*hexutil.Big)(header.BaseFee), nil } +func (b *Block) NextBaseFeePerGas(ctx context.Context) (*hexutil.Big, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return nil, err + } + chaincfg := b.backend.ChainConfig() + if header.BaseFee == nil { + // Make sure next block doesn't enable EIP-1559 + if !chaincfg.IsLondon(new(big.Int).Add(header.Number, common.Big1)) { + return nil, nil + } + } + nextBaseFee := misc.CalcBaseFee(chaincfg, header) + return (*hexutil.Big)(nextBaseFee), nil +} + func (b *Block) Parent(ctx context.Context) (*Block, error) { if _, err := b.resolveHeader(ctx); err != nil { return nil, err diff --git a/graphql/graphql_test.go b/graphql/graphql_test.go index 4e0f099e42..a0b7979069 100644 --- a/graphql/graphql_test.go +++ b/graphql/graphql_test.go @@ -48,6 +48,7 @@ func TestBuildSchema(t *testing.T) { conf := node.DefaultConfig conf.DataDir = ddir stack, err := node.New(&conf) + defer stack.Close() if err != nil { t.Fatalf("could not create new node: %v", err) } diff --git a/graphql/schema.go b/graphql/schema.go index 86060cd238..0013e7bae7 100644 --- a/graphql/schema.go +++ b/graphql/schema.go @@ -69,7 +69,7 @@ const schema string = ` transaction: Transaction! } - #EIP-2718 + #EIP-2718 type AccessTuple{ address: Address! storageKeys : [Bytes32!]! @@ -94,10 +94,12 @@ const schema string = ` value: BigInt! # GasPrice is the price offered to miners for gas, in wei per unit. gasPrice: BigInt! - # MaxFeePerGas is the maximum fee per gas offered to include a transaction, in wei. - maxFeePerGas: BigInt - # MaxPriorityFeePerGas is the maximum miner tip per gas offered to include a transaction, in wei. - maxPriorityFeePerGas: BigInt + # MaxFeePerGas is the maximum fee per gas offered to include a transaction, in wei. + maxFeePerGas: BigInt + # MaxPriorityFeePerGas is the maximum miner tip per gas offered to include a transaction, in wei. + maxPriorityFeePerGas: BigInt + # EffectiveTip is the actual amount of reward going to miner after considering the max fee cap. + effectiveTip: BigInt # Gas is the maximum amount of gas this transaction can consume. gas: Long! # InputData is the data supplied to the target of the transaction. @@ -187,8 +189,10 @@ const schema string = ` gasLimit: Long! # GasUsed is the amount of gas that was used executing transactions in this block. gasUsed: Long! - # BaseFeePerGas is the fee perunit of gas burned by the protocol in this block. - baseFeePerGas: BigInt + # BaseFeePerGas is the fee per unit of gas burned by the protocol in this block. + baseFeePerGas: BigInt + # NextBaseFeePerGas is the fee per unit of gas which needs to be burned in the next block. + nextBaseFeePerGas: BigInt # Timestamp is the unix timestamp at which this block was mined. timestamp: Long! # LogsBloom is a bloom filter that can be used to check if a block may @@ -244,10 +248,10 @@ const schema string = ` gas: Long # GasPrice is the price, in wei, offered for each unit of gas. gasPrice: BigInt - # MaxFeePerGas is the maximum fee per gas offered, in wei. - maxFeePerGas: BigInt - # MaxPriorityFeePerGas is the maximum miner tip per gas offered, in wei. - maxPriorityFeePerGas: BigInt + # MaxFeePerGas is the maximum fee per gas offered, in wei. + maxFeePerGas: BigInt + # MaxPriorityFeePerGas is the maximum miner tip per gas offered, in wei. + maxPriorityFeePerGas: BigInt # Value is the value, in wei, sent along with the call. value: BigInt # Data is the data sent to the callee. diff --git a/graphql/service.go b/graphql/service.go index bcb0a4990d..29d98ad746 100644 --- a/graphql/service.go +++ b/graphql/service.go @@ -74,7 +74,7 @@ func newHandler(stack *node.Node, backend ethapi.Backend, cors, vhosts []string) return err } h := handler{Schema: s} - handler := node.NewHTTPHandlerStack(h, cors, vhosts) + handler := node.NewHTTPHandlerStack(h, cors, vhosts, nil) stack.RegisterHandler("GraphQL UI", "/graphql/ui", GraphiQL{}) stack.RegisterHandler("GraphQL", "/graphql", handler) diff --git a/internal/build/azure.go b/internal/build/azure.go index 9c9cc2dcc5..9d1c4f300a 100644 --- a/internal/build/azure.go +++ b/internal/build/azure.go @@ -19,10 +19,9 @@ package build import ( "context" "fmt" - "net/url" "os" - "github.com/Azure/azure-storage-blob-go/azblob" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" ) // AzureBlobstoreConfig is an authentication and configuration struct containing @@ -49,15 +48,11 @@ func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) if err != nil { return err } - - pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) - - u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) - service := azblob.NewServiceURL(*u, pipeline) - - container := service.NewContainerURL(config.Container) - blockblob := container.NewBlockBlobURL(name) - + u := fmt.Sprintf("https://%s.blob.core.windows.net/%s", config.Account, config.Container) + container, err := azblob.NewContainerClientWithSharedKey(u, credential, nil) + if err != nil { + return err + } // Stream the file to upload into the designated blobstore container in, err := os.Open(path) if err != nil { @@ -65,49 +60,41 @@ func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) } defer in.Close() - _, err = blockblob.Upload(context.Background(), in, azblob.BlobHTTPHeaders{}, azblob.Metadata{}, azblob.BlobAccessConditions{}) + blockblob := container.NewBlockBlobClient(name) + _, err = blockblob.Upload(context.Background(), in, nil) return err } // AzureBlobstoreList lists all the files contained within an azure blobstore. -func AzureBlobstoreList(config AzureBlobstoreConfig) ([]azblob.BlobItem, error) { - credential := azblob.NewAnonymousCredential() - if len(config.Token) > 0 { - c, err := azblob.NewSharedKeyCredential(config.Account, config.Token) - if err != nil { - return nil, err - } - credential = c +func AzureBlobstoreList(config AzureBlobstoreConfig) ([]*azblob.BlobItemInternal, error) { + // Create an authenticated client against the Azure cloud + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return nil, err } - pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) - - u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) - service := azblob.NewServiceURL(*u, pipeline) - - var allBlobs []azblob.BlobItem - // List all the blobs from the container and return them - container := service.NewContainerURL(config.Container) - nextMarker := azblob.Marker{} - for nextMarker.NotDone() { - res, err := container.ListBlobsFlatSegment(context.Background(), nextMarker, azblob.ListBlobsSegmentOptions{ - MaxResults: 5000, // The server only gives max 5K items - }) - if err != nil { - return nil, err - } - allBlobs = append(allBlobs, res.Segment.BlobItems...) - nextMarker = res.NextMarker - + u := fmt.Sprintf("https://%s.blob.core.windows.net/%s", config.Account, config.Container) + container, err := azblob.NewContainerClientWithSharedKey(u, credential, nil) + if err != nil { + return nil, err + } + var maxResults int32 = 5000 + pager := container.ListBlobsFlat(&azblob.ContainerListBlobFlatSegmentOptions{ + Maxresults: &maxResults, + }) + var allBlobs []*azblob.BlobItemInternal + for pager.NextPage(context.Background()) { + res := pager.PageResponse() + allBlobs = append(allBlobs, res.ContainerListBlobFlatSegmentResult.Segment.BlobItems...) } - return allBlobs, nil + return allBlobs, pager.Err() } // AzureBlobstoreDelete iterates over a list of files to delete and removes them // from the blobstore. -func AzureBlobstoreDelete(config AzureBlobstoreConfig, blobs []azblob.BlobItem) error { +func AzureBlobstoreDelete(config AzureBlobstoreConfig, blobs []*azblob.BlobItemInternal) error { if *DryRunFlag { for _, blob := range blobs { - fmt.Printf("would delete %s (%s) from %s/%s\n", blob.Name, blob.Properties.LastModified, config.Account, config.Container) + fmt.Printf("would delete %s (%s) from %s/%s\n", *blob.Name, blob.Properties.LastModified, config.Account, config.Container) } return nil } @@ -116,21 +103,18 @@ func AzureBlobstoreDelete(config AzureBlobstoreConfig, blobs []azblob.BlobItem) if err != nil { return err } - - pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) - - u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) - service := azblob.NewServiceURL(*u, pipeline) - - container := service.NewContainerURL(config.Container) - + u := fmt.Sprintf("https://%s.blob.core.windows.net/%s", config.Account, config.Container) + container, err := azblob.NewContainerClientWithSharedKey(u, credential, nil) + if err != nil { + return err + } // Iterate over the blobs and delete them for _, blob := range blobs { - blockblob := container.NewBlockBlobURL(blob.Name) - if _, err := blockblob.Delete(context.Background(), azblob.DeleteSnapshotsOptionInclude, azblob.BlobAccessConditions{}); err != nil { + blockblob := container.NewBlockBlobClient(*blob.Name) + if _, err := blockblob.Delete(context.Background(), &azblob.DeleteBlobOptions{}); err != nil { return err } - fmt.Printf("deleted %s (%s)\n", blob.Name, blob.Properties.LastModified) + fmt.Printf("deleted %s (%s)\n", *blob.Name, blob.Properties.LastModified) } return nil } diff --git a/internal/build/download.go b/internal/build/download.go index 0ed0b5e130..efb223b327 100644 --- a/internal/build/download.go +++ b/internal/build/download.go @@ -58,7 +58,7 @@ func (db *ChecksumDB) Verify(path string) error { } fileHash := hex.EncodeToString(h.Sum(nil)) if !db.findHash(filepath.Base(path), fileHash) { - return fmt.Errorf("invalid file hash %s", fileHash) + return fmt.Errorf("invalid file hash %s for %s", fileHash, filepath.Base(path)) } return nil } diff --git a/internal/build/util.go b/internal/build/util.go index 2bdced82ee..cd6db09d00 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -17,6 +17,7 @@ package build import ( + "bufio" "bytes" "flag" "fmt" @@ -31,6 +32,7 @@ import ( "path/filepath" "strings" "text/template" + "time" ) var DryRunFlag = flag.Bool("n", false, "dry run, don't execute commands") @@ -115,7 +117,6 @@ func render(tpl *template.Template, outputFile string, outputPerm os.FileMode, x // the form sftp://[user@]host[:port]. func UploadSFTP(identityFile, host, dir string, files []string) error { sftp := exec.Command("sftp") - sftp.Stdout = nil sftp.Stderr = os.Stderr if identityFile != "" { sftp.Args = append(sftp.Args, "-i", identityFile) @@ -130,6 +131,10 @@ func UploadSFTP(identityFile, host, dir string, files []string) error { if err != nil { return fmt.Errorf("can't create stdin pipe for sftp: %v", err) } + stdout, err := sftp.StdoutPipe() + if err != nil { + return fmt.Errorf("can't create stdout pipe for sftp: %v", err) + } if err := sftp.Start(); err != nil { return err } @@ -137,8 +142,35 @@ func UploadSFTP(identityFile, host, dir string, files []string) error { for _, f := range files { fmt.Fprintln(in, "put", f, path.Join(dir, filepath.Base(f))) } + fmt.Fprintln(in, "exit") + // Some issue with the PPA sftp server makes it so the server does not + // respond properly to a 'bye', 'exit' or 'quit' from the client. + // To work around that, we check the output, and when we see the client + // exit command, we do a hard exit. + // See + // https://github.com/kolban-google/sftp-gcs/issues/23 + // https://github.com/mscdex/ssh2/pull/1111 + aborted := false + go func() { + scanner := bufio.NewScanner(stdout) + for scanner.Scan() { + txt := scanner.Text() + fmt.Println(txt) + if txt == "sftp> exit" { + // Give it .5 seconds to exit (server might be fixed), then + // hard kill it from the outside + time.Sleep(500 * time.Millisecond) + aborted = true + sftp.Process.Kill() + } + } + }() stdin.Close() - return sftp.Wait() + err = sftp.Wait() + if aborted { + return nil + } + return err } // FindMainPackages finds all 'main' packages in the given directory and returns their diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index b4c0835db4..06ec8c16af 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -723,7 +723,7 @@ func (c *Config) buildEth(stack *node.Node) (*ethconfig.Config, error) { // whitelist { - n.Whitelist = map[uint64]common.Hash{} + n.PeerRequiredBlocks = map[uint64]common.Hash{} for k, v := range c.Whitelist { number, err := strconv.ParseUint(k, 0, 64) if err != nil { @@ -733,7 +733,7 @@ func (c *Config) buildEth(stack *node.Node) (*ethconfig.Config, error) { if err = hash.UnmarshalText([]byte(v)); err != nil { return nil, fmt.Errorf("invalid whitelist hash %s: %v", v, err) } - n.Whitelist[number] = hash + n.PeerRequiredBlocks[number] = hash } } diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 6e9c2a098d..15536d5d72 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -288,7 +288,7 @@ func NewPrivateAccountAPI(b Backend, nonceLock *AddrLocker) *PrivateAccountAPI { } } -// listAccounts will return a list of addresses for accounts this node manages. +// ListAccounts will return a list of addresses for accounts this node manages. func (s *PrivateAccountAPI) ListAccounts() []common.Address { return s.am.Accounts() } @@ -855,8 +855,7 @@ func (s *PublicBlockChainAPI) GetBlockByHash(ctx context.Context, hash common.Ha return nil, err } -// GetUncleByBlockNumberAndIndex returns the uncle block for the given block hash and index. When fullTx is true -// all transactions in the block are returned in full detail, otherwise only the transaction hash is returned. +// GetUncleByBlockNumberAndIndex returns the uncle block for the given block hash and index. func (s *PublicBlockChainAPI) GetUncleByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (map[string]interface{}, error) { block, err := s.b.BlockByNumber(ctx, blockNr) if block != nil { @@ -871,8 +870,7 @@ func (s *PublicBlockChainAPI) GetUncleByBlockNumberAndIndex(ctx context.Context, return nil, err } -// GetUncleByBlockHashAndIndex returns the uncle block for the given block hash and index. When fullTx is true -// all transactions in the block are returned in full detail, otherwise only the transaction hash is returned. +// GetUncleByBlockHashAndIndex returns the uncle block for the given block hash and index. func (s *PublicBlockChainAPI) GetUncleByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (map[string]interface{}, error) { block, err := s.b.BlockByHash(ctx, blockHash) if block != nil { @@ -1520,8 +1518,9 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH } else { to = crypto.CreateAddress(args.from(), uint64(*args.Nonce)) } + isPostMerge := header.Difficulty.Cmp(common.Big0) == 0 // Retrieve the precompiles since they don't need to be added to the access list - precompiles := vm.ActivePrecompiles(b.ChainConfig().Rules(header.Number)) + precompiles := vm.ActivePrecompiles(b.ChainConfig().Rules(header.Number, isPostMerge)) // Create an initial tracer prevTracer := logger.NewAccessListTracer(nil, args.from(), to, precompiles) @@ -1780,7 +1779,7 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(ctx context.Context, ha fields["status"] = hexutil.Uint(receipt.Status) } if receipt.Logs == nil { - fields["logs"] = [][]*types.Log{} + fields["logs"] = []*types.Log{} } // If the ContractAddress is 20 0x0 bytes, assume it is not a contract creation if receipt.ContractAddress != (common.Address{}) { diff --git a/internal/ethapi/transaction_args.go b/internal/ethapi/transaction_args.go index 2d08d3008f..9c5950af58 100644 --- a/internal/ethapi/transaction_args.go +++ b/internal/ethapi/transaction_args.go @@ -55,20 +55,20 @@ type TransactionArgs struct { } // from retrieves the transaction sender address. -func (arg *TransactionArgs) from() common.Address { - if arg.From == nil { +func (args *TransactionArgs) from() common.Address { + if args.From == nil { return common.Address{} } - return *arg.From + return *args.From } // data retrieves the transaction calldata. Input field is preferred. -func (arg *TransactionArgs) data() []byte { - if arg.Input != nil { - return *arg.Input +func (args *TransactionArgs) data() []byte { + if args.Input != nil { + return *args.Input } - if arg.Data != nil { - return *arg.Data + if args.Data != nil { + return *args.Data } return nil } diff --git a/internal/flags/helpers.go b/internal/flags/helpers.go index 43bbcf0201..095df03807 100644 --- a/internal/flags/helpers.go +++ b/internal/flags/helpers.go @@ -51,7 +51,7 @@ OPTIONS: AppHelpTemplate = `NAME: {{.App.Name}} - {{.App.Usage}} - Copyright 2013-2021 The go-ethereum Authors + Copyright 2013-2022 The go-ethereum Authors USAGE: {{.App.HelpName}} [options]{{if .App.Commands}} [command] [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} @@ -77,7 +77,7 @@ COPYRIGHT: ClefAppHelpTemplate = `NAME: {{.App.Name}} - {{.App.Usage}} - Copyright 2013-2021 The go-ethereum Authors + Copyright 2013-2022 The go-ethereum Authors USAGE: {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} @@ -143,6 +143,7 @@ func FlagCategory(flag cli.Flag, flagGroups []FlagGroup) string { // NewApp creates an app with sane defaults. func NewApp(gitCommit, gitDate, usage string) *cli.App { app := cli.NewApp() + app.EnableBashCompletion = true app.Name = filepath.Base(os.Args[0]) app.Author = "" app.Email = "" diff --git a/internal/jsre/jsre_test.go b/internal/jsre/jsre_test.go index bc38f7a44a..57acdaed90 100644 --- a/internal/jsre/jsre_test.go +++ b/internal/jsre/jsre_test.go @@ -83,20 +83,20 @@ func TestNatto(t *testing.T) { err := jsre.Exec("test.js") if err != nil { - t.Errorf("expected no error, got %v", err) + t.Fatalf("expected no error, got %v", err) } time.Sleep(100 * time.Millisecond) val, err := jsre.Run("msg") if err != nil { - t.Errorf("expected no error, got %v", err) + t.Fatalf("expected no error, got %v", err) } if val.ExportType().Kind() != reflect.String { - t.Errorf("expected string value, got %v", val) + t.Fatalf("expected string value, got %v", val) } exp := "testMsg" got := val.ToString().String() if exp != got { - t.Errorf("expected '%v', got '%v'", exp, got) + t.Fatalf("expected '%v', got '%v'", exp, got) } jsre.Stop(false) } diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 8b2f64b44c..dd8b34e025 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -584,6 +584,11 @@ web3._extend({ params: 3, inputFormatter: [null, web3._extend.formatters.inputBlockNumberFormatter, null] }), + new web3._extend.Method({ + name: 'getLogs', + call: 'eth_getLogs', + params: 1, + }), ], properties: [ new web3._extend.Property({ diff --git a/les/catalyst/api.go b/les/catalyst/api.go new file mode 100644 index 0000000000..141df0585b --- /dev/null +++ b/les/catalyst/api.go @@ -0,0 +1,189 @@ +// Copyright 2022 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 . + +// Package catalyst implements the temporary eth1/eth2 RPC integration. +package catalyst + +import ( + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/beacon" + "github.com/ethereum/go-ethereum/les" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rpc" +) + +// Register adds catalyst APIs to the light client. +func Register(stack *node.Node, backend *les.LightEthereum) error { + log.Warn("Catalyst mode enabled", "protocol", "les") + stack.RegisterAPIs([]rpc.API{ + { + Namespace: "engine", + Version: "1.0", + Service: NewConsensusAPI(backend), + Public: true, + Authenticated: true, + }, + }) + return nil +} + +type ConsensusAPI struct { + les *les.LightEthereum +} + +// NewConsensusAPI creates a new consensus api for the given backend. +// The underlying blockchain needs to have a valid terminal total difficulty set. +func NewConsensusAPI(les *les.LightEthereum) *ConsensusAPI { + if les.BlockChain().Config().TerminalTotalDifficulty == nil { + panic("Catalyst started without valid total difficulty") + } + return &ConsensusAPI{les: les} +} + +// ForkchoiceUpdatedV1 has several responsibilities: +// If the method is called with an empty head block: +// we return success, which can be used to check if the catalyst mode is enabled +// If the total difficulty was not reached: +// we return INVALID +// If the finalizedBlockHash is set: +// we check if we have the finalizedBlockHash in our db, if not we start a sync +// We try to set our blockchain to the headBlock +// If there are payloadAttributes: +// we return an error since block creation is not supported in les mode +func (api *ConsensusAPI) ForkchoiceUpdatedV1(heads beacon.ForkchoiceStateV1, payloadAttributes *beacon.PayloadAttributesV1) (beacon.ForkChoiceResponse, error) { + if heads.HeadBlockHash == (common.Hash{}) { + log.Warn("Forkchoice requested update to zero hash") + return beacon.STATUS_INVALID, nil // TODO(karalabe): Why does someone send us this? + } + if err := api.checkTerminalTotalDifficulty(heads.HeadBlockHash); err != nil { + if header := api.les.BlockChain().GetHeaderByHash(heads.HeadBlockHash); header == nil { + // TODO (MariusVanDerWijden) trigger sync + return beacon.STATUS_SYNCING, nil + } + return beacon.STATUS_INVALID, err + } + // If the finalized block is set, check if it is in our blockchain + if heads.FinalizedBlockHash != (common.Hash{}) { + if header := api.les.BlockChain().GetHeaderByHash(heads.FinalizedBlockHash); header == nil { + // TODO (MariusVanDerWijden) trigger sync + return beacon.STATUS_SYNCING, nil + } + } + // SetHead + if err := api.setHead(heads.HeadBlockHash); err != nil { + return beacon.STATUS_INVALID, err + } + if payloadAttributes != nil { + return beacon.STATUS_INVALID, errors.New("not supported") + } + return api.validForkChoiceResponse(), nil +} + +// GetPayloadV1 returns a cached payload by id. It's not supported in les mode. +func (api *ConsensusAPI) GetPayloadV1(payloadID beacon.PayloadID) (*beacon.ExecutableDataV1, error) { + return nil, &beacon.GenericServerError +} + +// ExecutePayloadV1 creates an Eth1 block, inserts it in the chain, and returns the status of the chain. +func (api *ConsensusAPI) ExecutePayloadV1(params beacon.ExecutableDataV1) (beacon.PayloadStatusV1, error) { + block, err := beacon.ExecutableDataToBlock(params) + if err != nil { + return api.invalid(), err + } + if !api.les.BlockChain().HasHeader(block.ParentHash(), block.NumberU64()-1) { + /* + TODO (MariusVanDerWijden) reenable once sync is merged + if err := api.eth.Downloader().BeaconSync(api.eth.SyncMode(), block.Header()); err != nil { + return SYNCING, err + } + */ + // TODO (MariusVanDerWijden) we should return nil here not empty hash + return beacon.PayloadStatusV1{Status: beacon.SYNCING, LatestValidHash: nil}, nil + } + parent := api.les.BlockChain().GetHeaderByHash(params.ParentHash) + if parent == nil { + return api.invalid(), fmt.Errorf("could not find parent %x", params.ParentHash) + } + td := api.les.BlockChain().GetTd(parent.Hash(), block.NumberU64()-1) + ttd := api.les.BlockChain().Config().TerminalTotalDifficulty + if td.Cmp(ttd) < 0 { + return api.invalid(), fmt.Errorf("can not execute payload on top of block with low td got: %v threshold %v", td, ttd) + } + if err = api.les.BlockChain().InsertHeader(block.Header()); err != nil { + return api.invalid(), err + } + if merger := api.les.Merger(); !merger.TDDReached() { + merger.ReachTTD() + } + hash := block.Hash() + return beacon.PayloadStatusV1{Status: beacon.VALID, LatestValidHash: &hash}, nil +} + +func (api *ConsensusAPI) validForkChoiceResponse() beacon.ForkChoiceResponse { + currentHash := api.les.BlockChain().CurrentHeader().Hash() + return beacon.ForkChoiceResponse{ + PayloadStatus: beacon.PayloadStatusV1{Status: beacon.VALID, LatestValidHash: ¤tHash}, + } +} + +// invalid returns a response "INVALID" with the latest valid hash set to the current head. +func (api *ConsensusAPI) invalid() beacon.PayloadStatusV1 { + currentHash := api.les.BlockChain().CurrentHeader().Hash() + return beacon.PayloadStatusV1{Status: beacon.INVALID, LatestValidHash: ¤tHash} +} + +func (api *ConsensusAPI) checkTerminalTotalDifficulty(head common.Hash) error { + // shortcut if we entered PoS already + if api.les.Merger().PoSFinalized() { + return nil + } + // make sure the parent has enough terminal total difficulty + header := api.les.BlockChain().GetHeaderByHash(head) + if header == nil { + return &beacon.GenericServerError + } + td := api.les.BlockChain().GetTd(header.Hash(), header.Number.Uint64()) + if td != nil && td.Cmp(api.les.BlockChain().Config().TerminalTotalDifficulty) < 0 { + return &beacon.InvalidTB + } + return nil +} + +// setHead is called to perform a force choice. +func (api *ConsensusAPI) setHead(newHead common.Hash) error { + log.Info("Setting head", "head", newHead) + + headHeader := api.les.BlockChain().CurrentHeader() + if headHeader.Hash() == newHead { + return nil + } + newHeadHeader := api.les.BlockChain().GetHeaderByHash(newHead) + if newHeadHeader == nil { + return &beacon.GenericServerError + } + if err := api.les.BlockChain().SetChainHead(newHeadHeader); err != nil { + return err + } + // Trigger the transition if it's the first `NewHead` event. + if merger := api.les.Merger(); !merger.PoSFinalized() { + merger.FinalizePoS() + } + return nil +} diff --git a/les/catalyst/api_test.go b/les/catalyst/api_test.go new file mode 100644 index 0000000000..c1cbf645cc --- /dev/null +++ b/les/catalyst/api_test.go @@ -0,0 +1,244 @@ +// Copyright 2020 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 . + +package catalyst + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/beacon" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/les" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" +) + +var ( + // testKey is a private key to use for funding a tester account. + testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + + // testAddr is the Ethereum address of the tester account. + testAddr = crypto.PubkeyToAddress(testKey.PublicKey) + + testBalance = big.NewInt(2e18) +) + +func generatePreMergeChain(n int) (*core.Genesis, []*types.Header, []*types.Block) { + db := rawdb.NewMemoryDatabase() + config := params.AllEthashProtocolChanges + genesis := &core.Genesis{ + Config: config, + Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, + ExtraData: []byte("test genesis"), + Timestamp: 9000, + BaseFee: big.NewInt(params.InitialBaseFee), + } + gblock := genesis.ToBlock(db) + engine := ethash.NewFaker() + blocks, _ := core.GenerateChain(config, gblock, engine, db, n, nil) + totalDifficulty := big.NewInt(0) + + var headers []*types.Header + for _, b := range blocks { + totalDifficulty.Add(totalDifficulty, b.Difficulty()) + headers = append(headers, b.Header()) + } + config.TerminalTotalDifficulty = totalDifficulty + + return genesis, headers, blocks +} + +func TestSetHeadBeforeTotalDifficulty(t *testing.T) { + genesis, headers, blocks := generatePreMergeChain(10) + n, lesService := startLesService(t, genesis, headers) + defer n.Close() + + api := NewConsensusAPI(lesService) + fcState := beacon.ForkchoiceStateV1{ + HeadBlockHash: blocks[5].Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err == nil { + t.Errorf("fork choice updated before total terminal difficulty should fail") + } +} + +func TestExecutePayloadV1(t *testing.T) { + genesis, headers, blocks := generatePreMergeChain(10) + n, lesService := startLesService(t, genesis, headers[:9]) + lesService.Merger().ReachTTD() + defer n.Close() + + api := NewConsensusAPI(lesService) + fcState := beacon.ForkchoiceStateV1{ + HeadBlockHash: blocks[8].Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil { + t.Errorf("Failed to update head %v", err) + } + block := blocks[9] + + fakeBlock := types.NewBlock(&types.Header{ + ParentHash: block.ParentHash(), + UncleHash: crypto.Keccak256Hash(nil), + Coinbase: block.Coinbase(), + Root: block.Root(), + TxHash: crypto.Keccak256Hash(nil), + ReceiptHash: crypto.Keccak256Hash(nil), + Bloom: block.Bloom(), + Difficulty: big.NewInt(0), + Number: block.Number(), + GasLimit: block.GasLimit(), + GasUsed: block.GasUsed(), + Time: block.Time(), + Extra: block.Extra(), + MixDigest: block.MixDigest(), + Nonce: types.BlockNonce{}, + BaseFee: block.BaseFee(), + }, nil, nil, nil, trie.NewStackTrie(nil)) + + _, err := api.ExecutePayloadV1(beacon.ExecutableDataV1{ + ParentHash: fakeBlock.ParentHash(), + FeeRecipient: fakeBlock.Coinbase(), + StateRoot: fakeBlock.Root(), + ReceiptsRoot: fakeBlock.ReceiptHash(), + LogsBloom: fakeBlock.Bloom().Bytes(), + Random: fakeBlock.MixDigest(), + Number: fakeBlock.NumberU64(), + GasLimit: fakeBlock.GasLimit(), + GasUsed: fakeBlock.GasUsed(), + Timestamp: fakeBlock.Time(), + ExtraData: fakeBlock.Extra(), + BaseFeePerGas: fakeBlock.BaseFee(), + BlockHash: fakeBlock.Hash(), + Transactions: encodeTransactions(fakeBlock.Transactions()), + }) + if err != nil { + t.Errorf("Failed to execute payload %v", err) + } + headHeader := api.les.BlockChain().CurrentHeader() + if headHeader.Number.Uint64() != fakeBlock.NumberU64()-1 { + t.Fatal("Unexpected chain head update") + } + fcState = beacon.ForkchoiceStateV1{ + HeadBlockHash: fakeBlock.Hash(), + SafeBlockHash: common.Hash{}, + FinalizedBlockHash: common.Hash{}, + } + if _, err := api.ForkchoiceUpdatedV1(fcState, nil); err != nil { + t.Fatal("Failed to update head") + } + headHeader = api.les.BlockChain().CurrentHeader() + if headHeader.Number.Uint64() != fakeBlock.NumberU64() { + t.Fatal("Failed to update chain head") + } +} + +func TestEth2DeepReorg(t *testing.T) { + // TODO (MariusVanDerWijden) TestEth2DeepReorg is currently broken, because it tries to reorg + // before the totalTerminalDifficulty threshold + /* + genesis, preMergeBlocks := generatePreMergeChain(core.TriesInMemory * 2) + n, ethservice := startEthService(t, genesis, preMergeBlocks) + defer n.Close() + + var ( + api = NewConsensusAPI(ethservice, nil) + parent = preMergeBlocks[len(preMergeBlocks)-core.TriesInMemory-1] + head = ethservice.BlockChain().CurrentBlock().NumberU64() + ) + if ethservice.BlockChain().HasBlockAndState(parent.Hash(), parent.NumberU64()) { + t.Errorf("Block %d not pruned", parent.NumberU64()) + } + for i := 0; i < 10; i++ { + execData, err := api.assembleBlock(AssembleBlockParams{ + ParentHash: parent.Hash(), + Timestamp: parent.Time() + 5, + }) + if err != nil { + t.Fatalf("Failed to create the executable data %v", err) + } + block, err := ExecutableDataToBlock(ethservice.BlockChain().Config(), parent.Header(), *execData) + if err != nil { + t.Fatalf("Failed to convert executable data to block %v", err) + } + newResp, err := api.ExecutePayload(*execData) + if err != nil || newResp.Status != "VALID" { + t.Fatalf("Failed to insert block: %v", err) + } + if ethservice.BlockChain().CurrentBlock().NumberU64() != head { + t.Fatalf("Chain head shouldn't be updated") + } + if err := api.setHead(block.Hash()); err != nil { + t.Fatalf("Failed to set head: %v", err) + } + if ethservice.BlockChain().CurrentBlock().NumberU64() != block.NumberU64() { + t.Fatalf("Chain head should be updated") + } + parent, head = block, block.NumberU64() + } + */ +} + +// startEthService creates a full node instance for testing. +func startLesService(t *testing.T, genesis *core.Genesis, headers []*types.Header) (*node.Node, *les.LightEthereum) { + t.Helper() + + n, err := node.New(&node.Config{}) + if err != nil { + t.Fatal("can't create node:", err) + } + ethcfg := ðconfig.Config{ + Genesis: genesis, + Ethash: ethash.Config{PowMode: ethash.ModeFake}, + SyncMode: downloader.LightSync, + TrieDirtyCache: 256, + TrieCleanCache: 256, + LightPeers: 10, + } + lesService, err := les.New(n, ethcfg) + if err != nil { + t.Fatal("can't create eth service:", err) + } + if err := n.Start(); err != nil { + t.Fatal("can't start node:", err) + } + if _, err := lesService.BlockChain().InsertHeaderChain(headers, 0); err != nil { + n.Close() + t.Fatal("can't import test headers:", err) + } + return n, lesService +} + +func encodeTransactions(txs []*types.Transaction) [][]byte { + var enc = make([][]byte, len(txs)) + for i, tx := range txs { + enc[i], _ = tx.MarshalBinary() + } + return enc +} diff --git a/les/client.go b/les/client.go index 13000488b3..87d4f00dad 100644 --- a/les/client.go +++ b/les/client.go @@ -115,7 +115,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*LightEthereum, error) { reqDist: newRequestDistributor(peers, &mclock.System{}), accountManager: stack.AccountManager(), merger: merger, - engine: nil, + engine: ethconfig.CreateConsensusEngine(stack, chainConfig, config, nil, false, chainDb, nil), bloomRequests: make(chan chan *bloombits.Retrieval), bloomIndexer: core.NewBloomIndexer(chainDb, params.BloomBitsBlocksClient, params.HelperTrieConfirmations), p2pServer: stack.Server(), diff --git a/les/peer.go b/les/peer.go index c6c672942b..499429739d 100644 --- a/les/peer.go +++ b/les/peer.go @@ -213,7 +213,7 @@ func (p *peerCommons) sendReceiveHandshake(sendList keyValueList) (keyValueList, ) // Send out own handshake in a new thread go func() { - errc <- p2p.Send(p.rw, StatusMsg, sendList) + errc <- p2p.Send(p.rw, StatusMsg, &sendList) }() go func() { // In the mean time retrieve the remote status message @@ -421,7 +421,7 @@ func sendRequest(w p2p.MsgWriter, msgcode, reqID uint64, data interface{}) error ReqID uint64 Data interface{} } - return p2p.Send(w, msgcode, req{reqID, data}) + return p2p.Send(w, msgcode, &req{reqID, data}) } func (p *serverPeer) sendRequest(msgcode, reqID uint64, data interface{}, amount int) error { @@ -871,7 +871,7 @@ func (r *reply) send(bv uint64) error { ReqID, BV uint64 Data rlp.RawValue } - return p2p.Send(r.w, r.msgcode, resp{r.reqID, bv, r.data}) + return p2p.Send(r.w, r.msgcode, &resp{r.reqID, bv, r.data}) } // size returns the RLP encoded size of the message data diff --git a/les/test_helper.go b/les/test_helper.go index 10367ea800..480d249dca 100644 --- a/les/test_helper.go +++ b/les/test_helper.go @@ -356,7 +356,7 @@ func (p *testPeer) handshakeWithServer(t *testing.T, td *big.Int, head common.Ha if err := p2p.ExpectMsg(p.app, StatusMsg, nil); err != nil { t.Fatalf("status recv: %v", err) } - if err := p2p.Send(p.app, StatusMsg, sendList); err != nil { + if err := p2p.Send(p.app, StatusMsg, &sendList); err != nil { t.Fatalf("status send: %v", err) } } @@ -389,7 +389,7 @@ func (p *testPeer) handshakeWithClient(t *testing.T, td *big.Int, head common.Ha if err := p2p.ExpectMsg(p.app, StatusMsg, nil); err != nil { t.Fatalf("status recv: %v", err) } - if err := p2p.Send(p.app, StatusMsg, sendList); err != nil { + if err := p2p.Send(p.app, StatusMsg, &sendList); err != nil { t.Fatalf("status send: %v", err) } } diff --git a/les/vflux/client/fillset_test.go b/les/vflux/client/fillset_test.go index 58240682c6..ca5af8f07e 100644 --- a/les/vflux/client/fillset_test.go +++ b/les/vflux/client/fillset_test.go @@ -34,16 +34,20 @@ type testIter struct { } func (i *testIter) Next() bool { - i.waitCh <- struct{}{} + if _, ok := <-i.waitCh; !ok { + return false + } i.node = <-i.nodeCh - return i.node != nil + return true } func (i *testIter) Node() *enode.Node { return i.node } -func (i *testIter) Close() {} +func (i *testIter) Close() { + close(i.waitCh) +} func (i *testIter) push() { var id enode.ID @@ -53,7 +57,7 @@ func (i *testIter) push() { func (i *testIter) waiting(timeout time.Duration) bool { select { - case <-i.waitCh: + case i.waitCh <- struct{}{}: return true case <-time.After(timeout): return false diff --git a/les/vflux/server/clientpool.go b/les/vflux/server/clientpool.go index 87d783ebab..805de2d41b 100644 --- a/les/vflux/server/clientpool.go +++ b/les/vflux/server/clientpool.go @@ -34,7 +34,7 @@ import ( var ( ErrNotConnected = errors.New("client not connected") ErrNoPriority = errors.New("priority too low to raise capacity") - ErrCantFindMaximum = errors.New("Unable to find maximum allowed capacity") + ErrCantFindMaximum = errors.New("unable to find maximum allowed capacity") ) // ClientPool implements a client database that assigns a priority to each client @@ -177,7 +177,7 @@ func (cp *ClientPool) Unregister(peer clientPeer) { cp.ns.SetField(peer.Node(), cp.setup.clientField, nil) } -// setConnectedBias sets the connection bias, which is applied to already connected clients +// SetConnectedBias sets the connection bias, which is applied to already connected clients // So that already connected client won't be kicked out very soon and we can ensure all // connected clients can have enough time to request or sync some data. func (cp *ClientPool) SetConnectedBias(bias time.Duration) { diff --git a/light/lightchain.go b/light/lightchain.go index 4ac5a749bd..ee4146a2d8 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -422,6 +422,9 @@ func (lc *LightChain) SetChainHead(header *types.Header) error { // In the case of a light chain, InsertHeaderChain also creates and posts light // chain events when necessary. func (lc *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) { + if len(chain) == 0 { + return 0, nil + } if atomic.LoadInt32(&lc.disableCheckFreq) == 1 { checkFreq = 0 } diff --git a/miner/miner.go b/miner/miner.go index c8aaa5b928..20e12c240e 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -35,10 +35,12 @@ import ( "github.com/ethereum/go-ethereum/params" ) -// Backend wraps all methods required for mining. +// Backend wraps all methods required for mining. Only full node is capable +// to offer all the functions here. type Backend interface { BlockChain() *core.BlockChain TxPool() *core.TxPool + StateAtBlock(block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (statedb *state.StateDB, err error) } // Config is the configuration parameters of mining. @@ -68,7 +70,7 @@ type Miner struct { wg sync.WaitGroup } -func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, isLocalBlock func(header *types.Header) bool, merger *consensus.Merger) *Miner { +func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, isLocalBlock func(header *types.Header) bool) *Miner { miner := &Miner{ eth: eth, mux: mux, @@ -76,7 +78,7 @@ func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *even exitCh: make(chan struct{}), startCh: make(chan common.Address), stopCh: make(chan struct{}), - worker: newWorker(config, chainConfig, engine, eth, mux, isLocalBlock, true, merger), + worker: newWorker(config, chainConfig, engine, eth, mux, isLocalBlock, true), } miner.wg.Add(1) go miner.update() @@ -233,6 +235,12 @@ func (miner *Miner) DisablePreseal() { miner.worker.disablePreseal() } +// GetSealingBlock retrieves a sealing block based on the given parameters. +// The returned block is not sealed but all other fields should be filled. +func (miner *Miner) GetSealingBlock(parent common.Hash, timestamp uint64, coinbase common.Address, random common.Hash) (*types.Block, error) { + return miner.worker.getSealingBlock(parent, timestamp, coinbase, random) +} + // SubscribePendingLogs starts delivering logs from pending transactions // to the given channel. func (miner *Miner) SubscribePendingLogs(ch chan<- []*types.Log) event.Subscription { diff --git a/miner/miner_test.go b/miner/miner_test.go index de7ca73e26..56773101be 100644 --- a/miner/miner_test.go +++ b/miner/miner_test.go @@ -18,6 +18,7 @@ package miner import ( + "errors" "testing" "time" @@ -55,6 +56,10 @@ func (m *mockBackend) TxPool() *core.TxPool { return m.txPool } +func (m *mockBackend) StateAtBlock(block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (statedb *state.StateDB, err error) { + return nil, errors.New("not supported") +} + type testBlockChain struct { statedb *state.StateDB gasLimit uint64 @@ -80,7 +85,8 @@ func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) } func TestMiner(t *testing.T) { - miner, mux := createMiner(t) + miner, mux, cleanup := createMiner(t) + defer cleanup(false) miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) // Start the downloader @@ -107,7 +113,8 @@ func TestMiner(t *testing.T) { // An initial FailedEvent should allow mining to stop on a subsequent // downloader StartEvent. func TestMinerDownloaderFirstFails(t *testing.T) { - miner, mux := createMiner(t) + miner, mux, cleanup := createMiner(t) + defer cleanup(false) miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) // Start the downloader @@ -138,8 +145,8 @@ func TestMinerDownloaderFirstFails(t *testing.T) { } func TestMinerStartStopAfterDownloaderEvents(t *testing.T) { - miner, mux := createMiner(t) - + miner, mux, cleanup := createMiner(t) + defer cleanup(false) miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) // Start the downloader @@ -161,7 +168,8 @@ func TestMinerStartStopAfterDownloaderEvents(t *testing.T) { } func TestStartWhileDownload(t *testing.T) { - miner, mux := createMiner(t) + miner, mux, cleanup := createMiner(t) + defer cleanup(false) waitForMiningState(t, miner, false) miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) @@ -174,16 +182,19 @@ func TestStartWhileDownload(t *testing.T) { } func TestStartStopMiner(t *testing.T) { - miner, _ := createMiner(t) + miner, _, cleanup := createMiner(t) + defer cleanup(false) waitForMiningState(t, miner, false) miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) miner.Stop() waitForMiningState(t, miner, false) + } func TestCloseMiner(t *testing.T) { - miner, _ := createMiner(t) + miner, _, cleanup := createMiner(t) + defer cleanup(true) waitForMiningState(t, miner, false) miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) @@ -195,7 +206,8 @@ func TestCloseMiner(t *testing.T) { // TestMinerSetEtherbase checks that etherbase becomes set even if mining isn't // possible at the moment func TestMinerSetEtherbase(t *testing.T) { - miner, mux := createMiner(t) + miner, mux, cleanup := createMiner(t) + defer cleanup(false) // Start with a 'bad' mining address miner.Start(common.HexToAddress("0xdead")) waitForMiningState(t, miner, true) @@ -230,7 +242,7 @@ func waitForMiningState(t *testing.T, m *Miner, mining bool) { t.Fatalf("Mining() == %t, want %t", state, mining) } -func createMiner(t *testing.T) (*Miner, *event.TypeMux) { +func createMiner(t *testing.T) (*Miner, *event.TypeMux, func(skipMiner bool)) { // Create Ethash config config := Config{ Etherbase: common.HexToAddress("123456789"), @@ -259,5 +271,14 @@ func createMiner(t *testing.T) (*Miner, *event.TypeMux) { // Create event Mux mux := new(event.TypeMux) // Create Miner - return New(backend, &config, chainConfig, mux, engine, nil, merger), mux + miner := New(backend, &config, chainConfig, mux, engine, nil) + cleanup := func(skipMiner bool) { + bc.Stop() + engine.Close() + pool.Stop() + if !skipMiner { + miner.Close() + } + } + return miner, mux, cleanup } diff --git a/miner/stress/beacon/main.go b/miner/stress/beacon/main.go index 70005e20db..ccb7279b04 100644 --- a/miner/stress/beacon/main.go +++ b/miner/stress/beacon/main.go @@ -32,13 +32,15 @@ import ( "github.com/ethereum/go-ethereum/common/fdlimit" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/beacon" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/eth/catalyst" + ethcatalyst "github.com/ethereum/go-ethereum/eth/catalyst" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/les" + lescatalyst "github.com/ethereum/go-ethereum/les/catalyst" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/node" @@ -88,24 +90,26 @@ var ( type ethNode struct { typ nodetype - api *catalyst.ConsensusAPI - ethBackend *eth.Ethereum - lesBackend *les.LightEthereum stack *node.Node enode *enode.Node + api *ethcatalyst.ConsensusAPI + ethBackend *eth.Ethereum + lapi *lescatalyst.ConsensusAPI + lesBackend *les.LightEthereum } func newNode(typ nodetype, genesis *core.Genesis, enodes []*enode.Node) *ethNode { var ( err error - api *catalyst.ConsensusAPI + api *ethcatalyst.ConsensusAPI + lapi *lescatalyst.ConsensusAPI stack *node.Node ethBackend *eth.Ethereum lesBackend *les.LightEthereum ) // Start the node and wait until it's up if typ == eth2LightClient { - stack, lesBackend, api, err = makeLightNode(genesis) + stack, lesBackend, lapi, err = makeLightNode(genesis) } else { stack, ethBackend, api, err = makeFullNode(genesis) } @@ -131,20 +135,27 @@ func newNode(typ nodetype, genesis *core.Genesis, enodes []*enode.Node) *ethNode typ: typ, api: api, ethBackend: ethBackend, + lapi: lapi, lesBackend: lesBackend, stack: stack, enode: enode, } } -func (n *ethNode) assembleBlock(parentHash common.Hash, parentTimestamp uint64) (*catalyst.ExecutableDataV1, error) { +func (n *ethNode) assembleBlock(parentHash common.Hash, parentTimestamp uint64) (*beacon.ExecutableDataV1, error) { if n.typ != eth2MiningNode { return nil, errors.New("invalid node type") } - payloadAttribute := catalyst.PayloadAttributesV1{ - Timestamp: uint64(time.Now().Unix()), + timestamp := uint64(time.Now().Unix()) + if timestamp <= parentTimestamp { + timestamp = parentTimestamp + 1 + } + payloadAttribute := beacon.PayloadAttributesV1{ + Timestamp: timestamp, + Random: common.Hash{}, + SuggestedFeeRecipient: common.HexToAddress("0xdeadbeef"), } - fcState := catalyst.ForkchoiceStateV1{ + fcState := beacon.ForkchoiceStateV1{ HeadBlockHash: parentHash, SafeBlockHash: common.Hash{}, FinalizedBlockHash: common.Hash{}, @@ -156,39 +167,62 @@ func (n *ethNode) assembleBlock(parentHash common.Hash, parentTimestamp uint64) return n.api.GetPayloadV1(*payload.PayloadID) } -func (n *ethNode) insertBlock(eb catalyst.ExecutableDataV1) error { +func (n *ethNode) insertBlock(eb beacon.ExecutableDataV1) error { if !eth2types(n.typ) { return errors.New("invalid node type") } - newResp, err := n.api.ExecutePayloadV1(eb) - if err != nil { - return err - } else if newResp.Status != "VALID" { - return errors.New("failed to insert block") + switch n.typ { + case eth2NormalNode, eth2MiningNode: + newResp, err := n.api.NewPayloadV1(eb) + if err != nil { + return err + } else if newResp.Status != "VALID" { + return errors.New("failed to insert block") + } + return nil + case eth2LightClient: + newResp, err := n.lapi.ExecutePayloadV1(eb) + if err != nil { + return err + } else if newResp.Status != "VALID" { + return errors.New("failed to insert block") + } + return nil + default: + return errors.New("undefined node") } - return nil } -func (n *ethNode) insertBlockAndSetHead(parent *types.Header, ed catalyst.ExecutableDataV1) error { +func (n *ethNode) insertBlockAndSetHead(parent *types.Header, ed beacon.ExecutableDataV1) error { if !eth2types(n.typ) { return errors.New("invalid node type") } if err := n.insertBlock(ed); err != nil { return err } - block, err := catalyst.ExecutableDataToBlock(ed) + block, err := beacon.ExecutableDataToBlock(ed) if err != nil { return err } - fcState := catalyst.ForkchoiceStateV1{ + fcState := beacon.ForkchoiceStateV1{ HeadBlockHash: block.ParentHash(), SafeBlockHash: common.Hash{}, FinalizedBlockHash: common.Hash{}, } - if _, err := n.api.ForkchoiceUpdatedV1(fcState, nil); err != nil { - return err + switch n.typ { + case eth2NormalNode, eth2MiningNode: + if _, err := n.api.ForkchoiceUpdatedV1(fcState, nil); err != nil { + return err + } + return nil + case eth2LightClient: + if _, err := n.lapi.ForkchoiceUpdatedV1(fcState, nil); err != nil { + return err + } + return nil + default: + return errors.New("undefined node") } - return nil } type nodeManager struct { @@ -284,12 +318,15 @@ func (mgr *nodeManager) run() { nodes = append(nodes, mgr.getNodes(eth2NormalNode)...) nodes = append(nodes, mgr.getNodes(eth2LightClient)...) for _, node := range append(nodes) { - fcState := catalyst.ForkchoiceStateV1{ + fcState := beacon.ForkchoiceStateV1{ HeadBlockHash: oldest.Hash(), SafeBlockHash: common.Hash{}, - FinalizedBlockHash: common.Hash{}, + FinalizedBlockHash: oldest.Hash(), } - node.api.ForkchoiceUpdatedV1(fcState, nil) + // TODO(rjl493456442) finalization doesn't work properly, FIX IT + _ = fcState + _ = node + //node.api.ForkchoiceUpdatedV1(fcState, nil) } log.Info("Finalised eth2 block", "number", oldest.NumberU64(), "hash", oldest.Hash()) waitFinalise = waitFinalise[1:] @@ -327,12 +364,11 @@ func (mgr *nodeManager) run() { log.Error("Failed to assemble the block", "err", err) continue } - block, _ := catalyst.ExecutableDataToBlock(*ed) + block, _ := beacon.ExecutableDataToBlock(*ed) nodes := mgr.getNodes(eth2MiningNode) nodes = append(nodes, mgr.getNodes(eth2NormalNode)...) nodes = append(nodes, mgr.getNodes(eth2LightClient)...) - for _, node := range nodes { if err := node.insertBlockAndSetHead(parentBlock.Header(), *ed); err != nil { log.Error("Failed to insert block", "type", node.typ, "err", err) @@ -410,9 +446,8 @@ func makeGenesis(faucets []*ecdsa.PrivateKey) *core.Genesis { genesis.Difficulty = params.MinimumDifficulty genesis.GasLimit = 25000000 - genesis.Config.ChainID = big.NewInt(18) - genesis.Config.EIP150Hash = common.Hash{} genesis.BaseFee = big.NewInt(params.InitialBaseFee) + genesis.Config = params.AllEthashProtocolChanges genesis.Config.TerminalTotalDifficulty = transitionDifficulty genesis.Alloc = core.GenesisAlloc{} @@ -424,7 +459,7 @@ func makeGenesis(faucets []*ecdsa.PrivateKey) *core.Genesis { return genesis } -func makeFullNode(genesis *core.Genesis) (*node.Node, *eth.Ethereum, *catalyst.ConsensusAPI, error) { +func makeFullNode(genesis *core.Genesis) (*node.Node, *eth.Ethereum, *ethcatalyst.ConsensusAPI, error) { // Define the basic configurations for the Ethereum node datadir, _ := ioutil.TempDir("", "") @@ -472,10 +507,10 @@ func makeFullNode(genesis *core.Genesis) (*node.Node, *eth.Ethereum, *catalyst.C log.Crit("Failed to create the LES server", "err", err) } err = stack.Start() - return stack, ethBackend, catalyst.NewConsensusAPI(ethBackend, nil), err + return stack, ethBackend, ethcatalyst.NewConsensusAPI(ethBackend), err } -func makeLightNode(genesis *core.Genesis) (*node.Node, *les.LightEthereum, *catalyst.ConsensusAPI, error) { +func makeLightNode(genesis *core.Genesis) (*node.Node, *les.LightEthereum, *lescatalyst.ConsensusAPI, error) { // Define the basic configurations for the Ethereum node datadir, _ := ioutil.TempDir("", "") @@ -510,7 +545,7 @@ func makeLightNode(genesis *core.Genesis) (*node.Node, *les.LightEthereum, *cata return nil, nil, nil, err } err = stack.Start() - return stack, lesBackend, catalyst.NewConsensusAPI(nil, lesBackend), err + return stack, lesBackend, lescatalyst.NewConsensusAPI(lesBackend), err } func eth2types(typ nodetype) bool { diff --git a/miner/worker.go b/miner/worker.go index 5be6aea3fb..c3a5e1c9ba 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -17,8 +17,8 @@ package miner import ( - "bytes" "errors" + "fmt" "math/big" "sync" "sync/atomic" @@ -54,14 +54,14 @@ const ( // resubmitAdjustChanSize is the size of resubmitting interval adjustment channel. resubmitAdjustChanSize = 10 - // miningLogAtDepth is the number of confirmations before logging successful mining. - miningLogAtDepth = 7 + // sealingLogAtDepth is the number of confirmations before logging successful sealing. + sealingLogAtDepth = 7 - // minRecommitInterval is the minimal time interval to recreate the mining block with + // minRecommitInterval is the minimal time interval to recreate the sealing block with // any newly arrived transactions. minRecommitInterval = 1 * time.Second - // maxRecommitInterval is the maximum time interval to recreate the mining block with + // maxRecommitInterval is the maximum time interval to recreate the sealing block with // any newly arrived transactions. maxRecommitInterval = 15 * time.Second @@ -77,20 +77,68 @@ const ( staleThreshold = 7 ) -// environment is the worker's current environment and holds all of the current state information. +// environment is the worker's current environment and holds all +// information of the sealing block generation. type environment struct { signer types.Signer state *state.StateDB // apply state changes here ancestors mapset.Set // ancestor set (used for checking uncle parent validity) family mapset.Set // family set (used for checking uncle invalidity) - uncles mapset.Set // uncle set tcount int // tx count in cycle gasPool *core.GasPool // available gas used to pack transactions + coinbase common.Address header *types.Header txs []*types.Transaction receipts []*types.Receipt + uncles map[common.Hash]*types.Header +} + +// copy creates a deep copy of environment. +func (env *environment) copy() *environment { + cpy := &environment{ + signer: env.signer, + state: env.state.Copy(), + ancestors: env.ancestors.Clone(), + family: env.family.Clone(), + tcount: env.tcount, + coinbase: env.coinbase, + header: types.CopyHeader(env.header), + receipts: copyReceipts(env.receipts), + } + if env.gasPool != nil { + gasPool := *env.gasPool + cpy.gasPool = &gasPool + } + // The content of txs and uncles are immutable, unnecessary + // to do the expensive deep copy for them. + cpy.txs = make([]*types.Transaction, len(env.txs)) + copy(cpy.txs, env.txs) + cpy.uncles = make(map[common.Hash]*types.Header) + for hash, uncle := range env.uncles { + cpy.uncles[hash] = uncle + } + return cpy +} + +// unclelist returns the contained uncles as the list format. +func (env *environment) unclelist() []*types.Header { + var uncles []*types.Header + for _, uncle := range env.uncles { + uncles = append(uncles, uncle) + } + return uncles +} + +// discard terminates the background prefetcher go-routine. It should +// always be called for all created environment instances otherwise +// the go-routine leak can happen. +func (env *environment) discard() { + if env.state == nil { + return + } + env.state.StopPrefetcher() } // task contains all information for consensus engine sealing and result submitting. @@ -114,6 +162,13 @@ type newWorkReq struct { timestamp int64 } +// getWorkReq represents a request for getting a new sealing work with provided parameters. +type getWorkReq struct { + params *generateParams + err error + result chan *types.Block +} + // intervalAdjust represents a resubmitting interval adjustment. type intervalAdjust struct { ratio float64 @@ -144,6 +199,7 @@ type worker struct { // Channels newWorkCh chan *newWorkReq + getWorkCh chan *getWorkReq taskCh chan *task resultCh chan *types.Block startCh chan struct{} @@ -191,7 +247,7 @@ type worker struct { resubmitHook func(time.Duration, time.Duration) // Method to call upon updating resubmitting interval. } -func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus.Engine, eth Backend, mux *event.TypeMux, isLocalBlock func(header *types.Header) bool, init bool, merger *consensus.Merger) *worker { +func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus.Engine, eth Backend, mux *event.TypeMux, isLocalBlock func(header *types.Header) bool, init bool) *worker { worker := &worker{ config: config, chainConfig: chainConfig, @@ -199,16 +255,16 @@ func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus eth: eth, mux: mux, chain: eth.BlockChain(), - merger: merger, isLocalBlock: isLocalBlock, localUncles: make(map[common.Hash]*types.Block), remoteUncles: make(map[common.Hash]*types.Block), - unconfirmed: newUnconfirmedBlocks(eth.BlockChain(), miningLogAtDepth), + unconfirmed: newUnconfirmedBlocks(eth.BlockChain(), sealingLogAtDepth), pendingTasks: make(map[common.Hash]*task), txsCh: make(chan core.NewTxsEvent, txChanSize), chainHeadCh: make(chan core.ChainHeadEvent, chainHeadChanSize), chainSideCh: make(chan core.ChainSideEvent, chainSideChanSize), newWorkCh: make(chan *newWorkReq), + getWorkCh: make(chan *getWorkReq), taskCh: make(chan *task), resultCh: make(chan *types.Block, resultQueueSize), exitCh: make(chan struct{}), @@ -264,15 +320,18 @@ func (w *worker) setExtra(extra []byte) { // setRecommitInterval updates the interval for miner sealing work recommitting. func (w *worker) setRecommitInterval(interval time.Duration) { - w.resubmitIntervalCh <- interval + select { + case w.resubmitIntervalCh <- interval: + case <-w.exitCh: + } } -// disablePreseal disables pre-sealing mining feature +// disablePreseal disables pre-sealing feature func (w *worker) disablePreseal() { atomic.StoreUint32(&w.noempty, 1) } -// enablePreseal enables pre-sealing mining feature +// enablePreseal enables pre-sealing feature func (w *worker) enablePreseal() { atomic.StoreUint32(&w.noempty, 0) } @@ -350,13 +409,13 @@ func recalcRecommit(minRecommit, prev time.Duration, target float64, inc bool) t return time.Duration(int64(next)) } -// newWorkLoop is a standalone goroutine to submit new mining work upon received events. +// newWorkLoop is a standalone goroutine to submit new sealing work upon received events. func (w *worker) newWorkLoop(recommit time.Duration) { defer w.wg.Done() var ( interrupt *int32 minRecommit = recommit // minimal resubmit interval specified by user. - timestamp int64 // timestamp for each round of mining. + timestamp int64 // timestamp for each round of sealing. ) timer := time.NewTimer(0) @@ -401,7 +460,7 @@ func (w *worker) newWorkLoop(recommit time.Duration) { commit(false, commitInterruptNewHead) case <-timer.C: - // If mining is running resubmit a new work cycle periodically to pull in + // If sealing is running resubmit a new work cycle periodically to pull in // higher priced transactions. Disable this overhead for pending blocks. if w.isRunning() && (w.chainConfig.Clique == nil || w.chainConfig.Clique.Period > 0) { // Short circuit if no new transaction arrives. @@ -448,22 +507,36 @@ func (w *worker) newWorkLoop(recommit time.Duration) { } } -// mainLoop is a standalone goroutine to regenerate the sealing task based on the received event. +// mainLoop is responsible for generating and submitting sealing work based on +// the received event. It can support two modes: automatically generate task and +// submit it or return task according to given parameters for various proposes. func (w *worker) mainLoop() { defer w.wg.Done() defer w.txsSub.Unsubscribe() defer w.chainHeadSub.Unsubscribe() defer w.chainSideSub.Unsubscribe() defer func() { - if w.current != nil && w.current.state != nil { - w.current.state.StopPrefetcher() + if w.current != nil { + w.current.discard() } }() + cleanTicker := time.NewTicker(time.Second * 10) + defer cleanTicker.Stop() + for { select { case req := <-w.newWorkCh: - w.commitNewWork(req.interrupt, req.noempty, req.timestamp) + w.commitWork(req.interrupt, req.noempty, req.timestamp) + + case req := <-w.getWorkCh: + block, err := w.generateWork(req.params) + if err != nil { + req.err = err + req.result <- nil + } else { + req.result <- block + } case ev := <-w.chainSideCh: // Short circuit for duplicate side blocks @@ -479,46 +552,40 @@ func (w *worker) mainLoop() { } else { w.remoteUncles[ev.Block.Hash()] = ev.Block } - // If our mining block contains less than 2 uncle blocks, - // add the new uncle block if valid and regenerate a mining block. - if w.isRunning() && w.current != nil && w.current.uncles.Cardinality() < 2 { + // If our sealing block contains less than 2 uncle blocks, + // add the new uncle block if valid and regenerate a new + // sealing block for higher profit. + if w.isRunning() && w.current != nil && len(w.current.uncles) < 2 { start := time.Now() if err := w.commitUncle(w.current, ev.Block.Header()); err == nil { - var uncles []*types.Header - w.current.uncles.Each(func(item interface{}) bool { - hash, ok := item.(common.Hash) - if !ok { - return false - } - uncle, exist := w.localUncles[hash] - if !exist { - uncle, exist = w.remoteUncles[hash] - } - if !exist { - return false - } - uncles = append(uncles, uncle.Header()) - return false - }) - w.commit(uncles, nil, true, start) + w.commit(w.current.copy(), nil, true, start) + } + } + + case <-cleanTicker.C: + chainHead := w.chain.CurrentBlock() + for hash, uncle := range w.localUncles { + if uncle.NumberU64()+staleThreshold <= chainHead.NumberU64() { + delete(w.localUncles, hash) + } + } + for hash, uncle := range w.remoteUncles { + if uncle.NumberU64()+staleThreshold <= chainHead.NumberU64() { + delete(w.remoteUncles, hash) } } case ev := <-w.txsCh: - // Apply transactions to the pending state if we're not mining. + // Apply transactions to the pending state if we're not sealing // // Note all transactions received may not be continuous with transactions - // already included in the current mining block. These transactions will + // already included in the current sealing block. These transactions will // be automatically eliminated. if !w.isRunning() && w.current != nil { // If block is already full, abort if gp := w.current.gasPool; gp != nil && gp.Gas() < params.TxGas { continue } - w.mu.RLock() - coinbase := w.coinbase - w.mu.RUnlock() - txs := make(map[common.Address]types.Transactions) for _, tx := range ev.Txs { acc, _ := types.Sender(w.current.signer, tx) @@ -526,18 +593,19 @@ func (w *worker) mainLoop() { } txset := types.NewTransactionsByPriceAndNonce(w.current.signer, txs, w.current.header.BaseFee) tcount := w.current.tcount - w.commitTransactions(txset, coinbase, nil) - // Only update the snapshot if any new transactons were added + w.commitTransactions(w.current, txset, nil) + + // Only update the snapshot if any new transactions were added // to the pending block if tcount != w.current.tcount { - w.updateSnapshot() + w.updateSnapshot(w.current) } } else { // Special case, if the consensus engine is 0 period clique(dev mode), - // submit mining work here since all empty submission will be rejected + // submit sealing work here since all empty submission will be rejected // by clique. Of course the advance sealing(empty submission) is disabled. if w.chainConfig.Clique != nil && w.chainConfig.Clique.Period == 0 { - w.commitNewWork(nil, true, time.Now().Unix()) + w.commitWork(nil, true, time.Now().Unix()) } } atomic.AddInt32(&w.newTxs, int32(len(ev.Txs))) @@ -688,23 +756,35 @@ func (w *worker) resultLoop() { } } -// makeCurrent creates a new environment for the current cycle. -func (w *worker) makeCurrent(parent *types.Block, header *types.Header) error { +// makeEnv creates a new environment for the sealing block. +func (w *worker) makeEnv(parent *types.Block, header *types.Header, coinbase common.Address) (*environment, error) { // Retrieve the parent state to execute on top and start a prefetcher for - // the miner to speed block sealing up a bit + // the miner to speed block sealing up a bit. state, err := w.chain.StateAt(parent.Root()) if err != nil { - return err + // Note since the sealing block can be created upon the arbitrary parent + // block, but the state of parent block may already be pruned, so the necessary + // state recovery is needed here in the future. + // + // The maximum acceptable reorg depth can be limited by the finalised block + // somehow. TODO(rjl493456442) fix the hard-coded number here later. + state, err = w.eth.StateAtBlock(parent, 1024, nil, false, false) + log.Warn("Recovered mining state", "root", parent.Root(), "err", err) + } + if err != nil { + return nil, err } state.StartPrefetcher("miner") + // Note the passed coinbase may be different with header.Coinbase. env := &environment{ signer: types.MakeSigner(w.chainConfig, header.Number), state: state, + coinbase: coinbase, ancestors: mapset.NewSet(), family: mapset.NewSet(), - uncles: mapset.NewSet(), header: header, + uncles: make(map[common.Hash]*types.Header), } // when 08 is processed ancestors contain 07 (quick block) for _, ancestor := range w.chain.GetBlocksFromHash(parent.Hash(), 7) { @@ -716,20 +796,16 @@ func (w *worker) makeCurrent(parent *types.Block, header *types.Header) error { } // Keep track of transactions which return errors so they can be removed env.tcount = 0 - - // Swap out the old work with the new one, terminating any leftover prefetcher - // processes in the mean time and starting a new one. - if w.current != nil && w.current.state != nil { - w.current.state.StopPrefetcher() - } - w.current = env - return nil + return env, nil } // commitUncle adds the given block to uncle block set, returns error if failed to add. func (w *worker) commitUncle(env *environment, uncle *types.Header) error { + if w.isTTDReached(env.header) { + return errors.New("ignore uncle for beacon block") + } hash := uncle.Hash() - if env.uncles.Contains(hash) { + if _, exist := env.uncles[hash]; exist { return errors.New("uncle not unique") } if env.header.ParentHash == uncle.ParentHash { @@ -741,82 +817,58 @@ func (w *worker) commitUncle(env *environment, uncle *types.Header) error { if env.family.Contains(hash) { return errors.New("uncle already included") } - env.uncles.Add(uncle.Hash()) + env.uncles[hash] = uncle return nil } -// updateSnapshot updates pending snapshot block and state. -// Note this function assumes the current variable is thread safe. -func (w *worker) updateSnapshot() { +// updateSnapshot updates pending snapshot block, receipts and state. +func (w *worker) updateSnapshot(env *environment) { w.snapshotMu.Lock() defer w.snapshotMu.Unlock() - var uncles []*types.Header - w.current.uncles.Each(func(item interface{}) bool { - hash, ok := item.(common.Hash) - if !ok { - return false - } - uncle, exist := w.localUncles[hash] - if !exist { - uncle, exist = w.remoteUncles[hash] - } - if !exist { - return false - } - uncles = append(uncles, uncle.Header()) - return false - }) - w.snapshotBlock = types.NewBlock( - w.current.header, - w.current.txs, - uncles, - w.current.receipts, + env.header, + env.txs, + env.unclelist(), + env.receipts, trie.NewStackTrie(nil), ) - w.snapshotReceipts = copyReceipts(w.current.receipts) - w.snapshotState = w.current.state.Copy() + w.snapshotReceipts = copyReceipts(env.receipts) + w.snapshotState = env.state.Copy() } -func (w *worker) commitTransaction(tx *types.Transaction, coinbase common.Address) ([]*types.Log, error) { - snap := w.current.state.Snapshot() +func (w *worker) commitTransaction(env *environment, tx *types.Transaction) ([]*types.Log, error) { + snap := env.state.Snapshot() - receipt, err := core.ApplyTransaction(w.chainConfig, w.chain, &coinbase, w.current.gasPool, w.current.state, w.current.header, tx, &w.current.header.GasUsed, *w.chain.GetVMConfig()) + receipt, err := core.ApplyTransaction(w.chainConfig, w.chain, &env.coinbase, env.gasPool, env.state, env.header, tx, &env.header.GasUsed, *w.chain.GetVMConfig()) if err != nil { - w.current.state.RevertToSnapshot(snap) + env.state.RevertToSnapshot(snap) return nil, err } - w.current.txs = append(w.current.txs, tx) - w.current.receipts = append(w.current.receipts, receipt) + env.txs = append(env.txs, tx) + env.receipts = append(env.receipts, receipt) return receipt.Logs, nil } -func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coinbase common.Address, interrupt *int32) bool { - // Short circuit if current is nil - if w.current == nil { - return true +func (w *worker) commitTransactions(env *environment, txs *types.TransactionsByPriceAndNonce, interrupt *int32) bool { + gasLimit := env.header.GasLimit + if env.gasPool == nil { + env.gasPool = new(core.GasPool).AddGas(gasLimit) } - - gasLimit := w.current.header.GasLimit - if w.current.gasPool == nil { - w.current.gasPool = new(core.GasPool).AddGas(gasLimit) - } - var coalescedLogs []*types.Log for { // In the following three cases, we will interrupt the execution of the transaction. // (1) new head block event arrival, the interrupt signal is 1 // (2) worker start or restart, the interrupt signal is 1 - // (3) worker recreate the mining block with any newly arrived transactions, the interrupt signal is 2. + // (3) worker recreate the sealing block with any newly arrived transactions, the interrupt signal is 2. // For the first two cases, the semi-finished work will be discarded. // For the third case, the semi-finished work will be submitted to the consensus engine. if interrupt != nil && atomic.LoadInt32(interrupt) != commitInterruptNone { // Notify resubmit loop to increase resubmitting interval due to too frequent commits. if atomic.LoadInt32(interrupt) == commitInterruptResubmit { - ratio := float64(gasLimit-w.current.gasPool.Gas()) / float64(gasLimit) + ratio := float64(gasLimit-env.gasPool.Gas()) / float64(gasLimit) if ratio < 0.1 { ratio = 0.1 } @@ -828,8 +880,8 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin return atomic.LoadInt32(interrupt) == commitInterruptNewHead } // If we don't have enough gas for any further transactions then we're done - if w.current.gasPool.Gas() < params.TxGas { - log.Trace("Not enough gas for further transactions", "have", w.current.gasPool, "want", params.TxGas) + if env.gasPool.Gas() < params.TxGas { + log.Trace("Not enough gas for further transactions", "have", env.gasPool, "want", params.TxGas) break } // Retrieve the next transaction and abort if all done @@ -841,19 +893,19 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin // during transaction acceptance is the transaction pool. // // We use the eip155 signer regardless of the current hf. - from, _ := types.Sender(w.current.signer, tx) + from, _ := types.Sender(env.signer, tx) // Check whether the tx is replay protected. If we're not in the EIP155 hf // phase, start ignoring the sender until we do. - if tx.Protected() && !w.chainConfig.IsEIP155(w.current.header.Number) { + if tx.Protected() && !w.chainConfig.IsEIP155(env.header.Number) { log.Trace("Ignoring reply protected transaction", "hash", tx.Hash(), "eip155", w.chainConfig.EIP155Block) txs.Pop() continue } // Start executing the transaction - w.current.state.Prepare(tx.Hash(), w.current.tcount) + env.state.Prepare(tx.Hash(), env.tcount) - logs, err := w.commitTransaction(tx, coinbase) + logs, err := w.commitTransaction(env, tx) switch { case errors.Is(err, core.ErrGasLimitReached): // Pop the current out-of-gas transaction without shifting in the next from the account @@ -873,7 +925,7 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin case errors.Is(err, nil): // Everything ok, collect the logs and shift in the next transaction from the same account coalescedLogs = append(coalescedLogs, logs...) - w.current.tcount++ + env.tcount++ txs.Shift() case errors.Is(err, core.ErrTxTypeNotSupported): @@ -890,8 +942,8 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin } if !w.isRunning() && len(coalescedLogs) > 0 { - // We don't push the pendingLogsEvent while we are mining. The reason is that - // when we are mining, the worker will regenerate a mining block every 3 seconds. + // We don't push the pendingLogsEvent while we are sealing. The reason is that + // when we are sealing, the worker will regenerate a sealing block every 3 seconds. // In order to avoid pushing the repeated pendingLog, we disable the pending log pushing. // make a copy, the state caches the logs and these logs get "upgraded" from pending to mined @@ -912,24 +964,56 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin return false } -// commitNewWork generates several new sealing tasks based on the parent block. -func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) { +// generateParams wraps various of settings for generating sealing task. +type generateParams struct { + timestamp uint64 // The timstamp for sealing task + forceTime bool // Flag whether the given timestamp is immutable or not + parentHash common.Hash // Parent block hash, empty means the latest chain head + coinbase common.Address // The fee recipient address for including transaction + random common.Hash // The randomness generated by beacon chain, empty before the merge + noUncle bool // Flag whether the uncle block inclusion is allowed + noExtra bool // Flag whether the extra field assignment is allowed +} + +// prepareWork constructs the sealing task according to the given parameters, +// either based on the last chain head or specified parent. In this function +// the pending transactions are not filled yet, only the empty task returned. +func (w *worker) prepareWork(genParams *generateParams) (*environment, error) { w.mu.RLock() defer w.mu.RUnlock() - tstart := time.Now() + // Find the parent block for sealing task parent := w.chain.CurrentBlock() - - if parent.Time() >= uint64(timestamp) { - timestamp = int64(parent.Time() + 1) + if genParams.parentHash != (common.Hash{}) { + parent = w.chain.GetBlockByHash(genParams.parentHash) + } + if parent == nil { + return nil, fmt.Errorf("missing parent") + } + // Sanity check the timestamp correctness, recap the timestamp + // to parent+1 if the mutation is allowed. + timestamp := genParams.timestamp + if parent.Time() >= timestamp { + if genParams.forceTime { + return nil, fmt.Errorf("invalid timestamp, parent %d given %d", parent.Time(), timestamp) + } + timestamp = parent.Time() + 1 } + // Construct the sealing block header, set the extra field if it's allowed num := parent.Number() header := &types.Header{ ParentHash: parent.Hash(), Number: num.Add(num, common.Big1), GasLimit: core.CalcGasLimit(parent.GasLimit(), w.config.GasCeil), - Extra: w.extra, - Time: uint64(timestamp), + Time: timestamp, + Coinbase: genParams.coinbase, + } + if !genParams.noExtra && len(w.extra) != 0 { + header.Extra = w.extra + } + // Set the randomness field from the beacon chain if it's available. + if genParams.random != (common.Hash{}) { + header.MixDigest = genParams.random } // Set baseFee and GasLimit if we are on an EIP-1559 chain if w.chainConfig.IsLondon(header.Number) { @@ -939,83 +1023,47 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) header.GasLimit = core.CalcGasLimit(parentGasLimit, w.config.GasCeil) } } - // Only set the coinbase if our consensus engine is running (avoid spurious block rewards) - if w.isRunning() { - if w.coinbase == (common.Address{}) { - log.Error("Refusing to mine without etherbase") - return - } - header.Coinbase = w.coinbase - } + // Run the consensus preparation with the default or customized consensus engine. if err := w.engine.Prepare(w.chain, header); err != nil { - log.Error("Failed to prepare header for mining", "err", err) - return - } - // If we are care about TheDAO hard-fork check whether to override the extra-data or not - if daoBlock := w.chainConfig.DAOForkBlock; daoBlock != nil { - // Check whether the block is among the fork extra-override range - limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange) - if header.Number.Cmp(daoBlock) >= 0 && header.Number.Cmp(limit) < 0 { - // Depending whether we support or oppose the fork, override differently - if w.chainConfig.DAOForkSupport { - header.Extra = common.CopyBytes(params.DAOForkBlockExtra) - } else if bytes.Equal(header.Extra, params.DAOForkBlockExtra) { - header.Extra = []byte{} // If miner opposes, don't let it use the reserved extra-data - } - } + log.Error("Failed to prepare header for sealing", "err", err) + return nil, err } // Could potentially happen if starting to mine in an odd state. - err := w.makeCurrent(parent, header) + // Note genParams.coinbase can be different with header.Coinbase + // since clique algorithm can modify the coinbase field in header. + env, err := w.makeEnv(parent, header, genParams.coinbase) if err != nil { - log.Error("Failed to create mining context", "err", err) - return - } - // Create the current work task and check any fork transitions needed - env := w.current - if w.chainConfig.DAOForkSupport && w.chainConfig.DAOForkBlock != nil && w.chainConfig.DAOForkBlock.Cmp(header.Number) == 0 { - misc.ApplyDAOHardFork(env.state) + log.Error("Failed to create sealing context", "err", err) + return nil, err } - // Accumulate the uncles for the current block - uncles := make([]*types.Header, 0, 2) - commitUncles := func(blocks map[common.Hash]*types.Block) { - // Clean up stale uncle blocks first - for hash, uncle := range blocks { - if uncle.NumberU64()+staleThreshold <= header.Number.Uint64() { - delete(blocks, hash) - } - } - for hash, uncle := range blocks { - if len(uncles) == 2 { - break - } - if err := w.commitUncle(env, uncle.Header()); err != nil { - log.Trace("Possible uncle rejected", "hash", hash, "reason", err) - } else { - log.Debug("Committing new uncle to block", "hash", hash) - uncles = append(uncles, uncle.Header()) + // Accumulate the uncles for the sealing work only if it's allowed. + if !genParams.noUncle { + commitUncles := func(blocks map[common.Hash]*types.Block) { + for hash, uncle := range blocks { + if len(env.uncles) == 2 { + break + } + if err := w.commitUncle(env, uncle.Header()); err != nil { + log.Trace("Possible uncle rejected", "hash", hash, "reason", err) + } else { + log.Debug("Committing new uncle to block", "hash", hash) + } } } + // Prefer to locally generated uncle + commitUncles(w.localUncles) + commitUncles(w.remoteUncles) } - // Prefer to locally generated uncle - commitUncles(w.localUncles) - commitUncles(w.remoteUncles) - - // Create an empty block based on temporary copied state for - // sealing in advance without waiting block execution finished. - if !noempty && atomic.LoadUint32(&w.noempty) == 0 { - w.commit(uncles, nil, false, tstart) - } + return env, nil +} +// fillTransactions retrieves the pending transactions from the txpool and fills them +// into the given sealing block. The transaction selection and ordering strategy can +// be customized with the plugin in the future. +func (w *worker) fillTransactions(interrupt *int32, env *environment) { + // Split the pending transactions into locals and remotes // Fill the block with all available pending transactions. pending := w.eth.TxPool().Pending(true) - // Short circuit if there is no available pending transactions. - // But if we disable empty precommit already, ignore it. Since - // empty block is necessary to keep the liveness of the network. - if len(pending) == 0 && atomic.LoadUint32(&w.noempty) == 0 { - w.updateSnapshot() - return - } - // Split the pending transactions into locals and remotes localTxs, remoteTxs := make(map[common.Address]types.Transactions), pending for _, account := range w.eth.TxPool().Locals() { if txs := remoteTxs[account]; len(txs) > 0 { @@ -1024,57 +1072,139 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) } } if len(localTxs) > 0 { - txs := types.NewTransactionsByPriceAndNonce(w.current.signer, localTxs, header.BaseFee) - if w.commitTransactions(txs, w.coinbase, interrupt) { + txs := types.NewTransactionsByPriceAndNonce(env.signer, localTxs, env.header.BaseFee) + if w.commitTransactions(env, txs, interrupt) { return } } if len(remoteTxs) > 0 { - txs := types.NewTransactionsByPriceAndNonce(w.current.signer, remoteTxs, header.BaseFee) - if w.commitTransactions(txs, w.coinbase, interrupt) { + txs := types.NewTransactionsByPriceAndNonce(env.signer, remoteTxs, env.header.BaseFee) + if w.commitTransactions(env, txs, interrupt) { return } } - w.commit(uncles, w.fullTaskHook, true, tstart) } -// commit runs any post-transaction state modifications, assembles the final block -// and commits new work if consensus engine is running. -func (w *worker) commit(uncles []*types.Header, interval func(), update bool, start time.Time) error { - // Deep copy receipts here to avoid interaction between different tasks. - receipts := copyReceipts(w.current.receipts) - s := w.current.state.Copy() - block, err := w.engine.FinalizeAndAssemble(w.chain, w.current.header, s, w.current.txs, uncles, receipts) +// generateWork generates a sealing block based on the given parameters. +func (w *worker) generateWork(params *generateParams) (*types.Block, error) { + work, err := w.prepareWork(params) if err != nil { - return err + return nil, err } + defer work.discard() + + w.fillTransactions(nil, work) + return w.engine.FinalizeAndAssemble(w.chain, work.header, work.state, work.txs, work.unclelist(), work.receipts) +} + +// commitWork generates several new sealing tasks based on the parent block +// and submit them to the sealer. +func (w *worker) commitWork(interrupt *int32, noempty bool, timestamp int64) { + start := time.Now() + + // Set the coinbase if the worker is running or it's required + var coinbase common.Address + if w.isRunning() { + if w.coinbase == (common.Address{}) { + log.Error("Refusing to mine without etherbase") + return + } + coinbase = w.coinbase // Use the preset address as the fee recipient + } + work, err := w.prepareWork(&generateParams{ + timestamp: uint64(timestamp), + coinbase: coinbase, + }) + if err != nil { + return + } + // Create an empty block based on temporary copied state for + // sealing in advance without waiting block execution finished. + if !noempty && atomic.LoadUint32(&w.noempty) == 0 { + w.commit(work.copy(), nil, false, start) + } + // Fill pending transactions from the txpool + w.fillTransactions(interrupt, work) + w.commit(work.copy(), w.fullTaskHook, true, start) + + // Swap out the old work with the new one, terminating any leftover + // prefetcher processes in the mean time and starting a new one. + if w.current != nil { + w.current.discard() + } + w.current = work +} + +// commit runs any post-transaction state modifications, assembles the final block +// and commits new work if consensus engine is running. +// Note the assumption is held that the mutation is allowed to the passed env, do +// the deep copy first. +func (w *worker) commit(env *environment, interval func(), update bool, start time.Time) error { if w.isRunning() { if interval != nil { interval() } - // If we're post merge, just ignore - td, ttd := w.chain.GetTd(block.ParentHash(), block.NumberU64()-1), w.chain.Config().TerminalTotalDifficulty - if td != nil && ttd != nil && td.Cmp(ttd) >= 0 { - return nil + // Create a local environment copy, avoid the data race with snapshot state. + // https://github.com/ethereum/go-ethereum/issues/24299 + env := env.copy() + block, err := w.engine.FinalizeAndAssemble(w.chain, env.header, env.state, env.txs, env.unclelist(), env.receipts) + if err != nil { + return err } - select { - case w.taskCh <- &task{receipts: receipts, state: s, block: block, createdAt: time.Now()}: - w.unconfirmed.Shift(block.NumberU64() - 1) - log.Info("Commit new mining work", "number", block.Number(), "sealhash", w.engine.SealHash(block.Header()), - "uncles", len(uncles), "txs", w.current.tcount, - "gas", block.GasUsed(), "fees", totalFees(block, receipts), - "elapsed", common.PrettyDuration(time.Since(start))) - - case <-w.exitCh: - log.Info("Worker has exited") + // If we're post merge, just ignore + if !w.isTTDReached(block.Header()) { + select { + case w.taskCh <- &task{receipts: env.receipts, state: env.state, block: block, createdAt: time.Now()}: + w.unconfirmed.Shift(block.NumberU64() - 1) + log.Info("Commit new sealing work", "number", block.Number(), "sealhash", w.engine.SealHash(block.Header()), + "uncles", len(env.uncles), "txs", env.tcount, + "gas", block.GasUsed(), "fees", totalFees(block, env.receipts), + "elapsed", common.PrettyDuration(time.Since(start))) + + case <-w.exitCh: + log.Info("Worker has exited") + } } } if update { - w.updateSnapshot() + w.updateSnapshot(env) } return nil } +// getSealingBlock generates the sealing block based on the given parameters. +func (w *worker) getSealingBlock(parent common.Hash, timestamp uint64, coinbase common.Address, random common.Hash) (*types.Block, error) { + req := &getWorkReq{ + params: &generateParams{ + timestamp: timestamp, + forceTime: true, + parentHash: parent, + coinbase: coinbase, + random: random, + noUncle: true, + noExtra: true, + }, + result: make(chan *types.Block, 1), + } + select { + case w.getWorkCh <- req: + block := <-req.result + if block == nil { + return nil, req.err + } + return block, nil + case <-w.exitCh: + return nil, errors.New("miner closed") + } +} + +// isTTDReached returns the indicator if the given block has reached the total +// terminal difficulty for The Merge transition. +func (w *worker) isTTDReached(header *types.Header) bool { + td, ttd := w.chain.GetTd(header.ParentHash, header.Number.Uint64()-1), w.chain.Config().TerminalTotalDifficulty + return td != nil && ttd != nil && td.Cmp(ttd) >= 0 +} + // copyReceipts makes a deep copy of the given receipts. func copyReceipts(receipts []*types.Receipt) []*types.Receipt { result := make([]*types.Receipt, len(receipts)) diff --git a/miner/worker_test.go b/miner/worker_test.go index c8ddd2c320..f309ae994b 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -17,6 +17,7 @@ package miner import ( + "errors" "math/big" "math/rand" "sync/atomic" @@ -30,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -166,6 +168,9 @@ func newTestWorkerBackend(t *testing.T, chainConfig *params.ChainConfig, engine func (b *testWorkerBackend) BlockChain() *core.BlockChain { return b.chain } func (b *testWorkerBackend) TxPool() *core.TxPool { return b.txPool } +func (b *testWorkerBackend) StateAtBlock(block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (statedb *state.StateDB, err error) { + return nil, errors.New("not supported") +} func (b *testWorkerBackend) newRandomUncle() *types.Block { var parent *types.Block @@ -382,7 +387,7 @@ func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, en w, b := newTestWorker(t, chainConfig, engine, rawdb.NewMemoryDatabase(), 0) defer w.close() - var taskCh = make(chan struct{}) + var taskCh = make(chan struct{}, 3) taskIndex := 0 w.newTaskHook = func(task *task) { @@ -521,3 +526,144 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co t.Error("interval reset timeout") } } + +func TestGetSealingWorkEthash(t *testing.T) { + testGetSealingWork(t, ethashChainConfig, ethash.NewFaker(), false) +} + +func TestGetSealingWorkClique(t *testing.T) { + testGetSealingWork(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase()), false) +} + +func TestGetSealingWorkPostMerge(t *testing.T) { + local := new(params.ChainConfig) + *local = *ethashChainConfig + local.TerminalTotalDifficulty = big.NewInt(0) + testGetSealingWork(t, local, ethash.NewFaker(), true) +} + +func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, postMerge bool) { + defer engine.Close() + + w, b := newTestWorker(t, chainConfig, engine, rawdb.NewMemoryDatabase(), 0) + defer w.close() + + w.setExtra([]byte{0x01, 0x02}) + w.postSideBlock(core.ChainSideEvent{Block: b.uncleBlock}) + + w.skipSealHook = func(task *task) bool { + return true + } + w.fullTaskHook = func() { + time.Sleep(100 * time.Millisecond) + } + timestamp := uint64(time.Now().Unix()) + assertBlock := func(block *types.Block, number uint64, coinbase common.Address, random common.Hash) { + if block.Time() != timestamp { + // Sometime the timestamp will be mutated if the timestamp + // is even smaller than parent block's. It's OK. + t.Logf("Invalid timestamp, want %d, get %d", timestamp, block.Time()) + } + if len(block.Uncles()) != 0 { + t.Error("Unexpected uncle block") + } + _, isClique := engine.(*clique.Clique) + if !isClique { + if len(block.Extra()) != 0 { + t.Error("Unexpected extra field") + } + if block.Coinbase() != coinbase { + t.Errorf("Unexpected coinbase got %x want %x", block.Coinbase(), coinbase) + } + } else { + if block.Coinbase() != (common.Address{}) { + t.Error("Unexpected coinbase") + } + } + if !isClique { + if block.MixDigest() != random { + t.Error("Unexpected mix digest") + } + } + if block.Nonce() != 0 { + t.Error("Unexpected block nonce") + } + if block.NumberU64() != number { + t.Errorf("Mismatched block number, want %d got %d", number, block.NumberU64()) + } + } + var cases = []struct { + parent common.Hash + coinbase common.Address + random common.Hash + expectNumber uint64 + expectErr bool + }{ + { + b.chain.Genesis().Hash(), + common.HexToAddress("0xdeadbeef"), + common.HexToHash("0xcafebabe"), + uint64(1), + false, + }, + { + b.chain.CurrentBlock().Hash(), + common.HexToAddress("0xdeadbeef"), + common.HexToHash("0xcafebabe"), + b.chain.CurrentBlock().NumberU64() + 1, + false, + }, + { + b.chain.CurrentBlock().Hash(), + common.Address{}, + common.HexToHash("0xcafebabe"), + b.chain.CurrentBlock().NumberU64() + 1, + false, + }, + { + b.chain.CurrentBlock().Hash(), + common.Address{}, + common.Hash{}, + b.chain.CurrentBlock().NumberU64() + 1, + false, + }, + { + common.HexToHash("0xdeadbeef"), + common.HexToAddress("0xdeadbeef"), + common.HexToHash("0xcafebabe"), + 0, + true, + }, + } + + // This API should work even when the automatic sealing is not enabled + for _, c := range cases { + block, err := w.getSealingBlock(c.parent, timestamp, c.coinbase, c.random) + if c.expectErr { + if err == nil { + t.Error("Expect error but get nil") + } + } else { + if err != nil { + t.Errorf("Unexpected error %v", err) + } + assertBlock(block, c.expectNumber, c.coinbase, c.random) + } + } + + // This API should work even when the automatic sealing is enabled + w.start() + for _, c := range cases { + block, err := w.getSealingBlock(c.parent, timestamp, c.coinbase, c.random) + if c.expectErr { + if err == nil { + t.Error("Expect error but get nil") + } + } else { + if err != nil { + t.Errorf("Unexpected error %v", err) + } + assertBlock(block, c.expectNumber, c.coinbase, c.random) + } + } +} diff --git a/mobile/geth.go b/mobile/geth.go index 0118f6fc21..45930ee9cf 100644 --- a/mobile/geth.go +++ b/mobile/geth.go @@ -234,14 +234,6 @@ func (n *Node) Start() error { return n.node.Start() } -// Stop terminates a running node along with all its services. If the node was not started, -// an error is returned. It is not possible to restart a stopped node. -// -// Deprecated: use Close() -func (n *Node) Stop() error { - return n.node.Close() -} - // GetEthereumClient retrieves a client to access the Ethereum subsystem. func (n *Node) GetEthereumClient() (client *EthereumClient, _ error) { rpc, err := n.node.Attach() diff --git a/node/api.go b/node/api.go index a685ecd6b3..1b32399f63 100644 --- a/node/api.go +++ b/node/api.go @@ -274,11 +274,12 @@ func (api *privateAdminAPI) StartWS(host *string, port *int, allowedOrigins *str } // Enable WebSocket on the server. - server := api.node.wsServerForPort(*port) + server := api.node.wsServerForPort(*port, false) if err := server.setListenAddr(*host, *port); err != nil { return false, err } - if err := server.enableWS(api.node.rpcAPIs, config); err != nil { + openApis, _ := api.node.GetAPIs() + if err := server.enableWS(openApis, config); err != nil { return false, err } if err := server.start(); err != nil { diff --git a/node/config.go b/node/config.go index 26f00cd678..853190c95f 100644 --- a/node/config.go +++ b/node/config.go @@ -36,6 +36,7 @@ import ( const ( datadirPrivateKey = "nodekey" // Path within the datadir to the node's private key + datadirJWTKey = "jwtsecret" // Path within the datadir to the node's jwt secret datadirDefaultKeyStore = "keystore" // Path within the datadir to the keystore datadirStaticNodes = "static-nodes.json" // Path within the datadir to the static node list datadirTrustedNodes = "trusted-nodes.json" // Path within the datadir to the trusted node list @@ -138,6 +139,16 @@ type Config struct { // HTTPPathPrefix specifies a path prefix on which http-rpc is to be served. HTTPPathPrefix string `toml:",omitempty"` + // AuthAddr is the listening address on which authenticated APIs are provided. + AuthAddr string `toml:",omitempty"` + + // AuthPort is the port number on which authenticated APIs are provided. + AuthPort int `toml:",omitempty"` + + // AuthVirtualHosts is the list of virtual hostnames which are allowed on incoming requests + // for the authenticated api. This is by default {'localhost'}. + AuthVirtualHosts []string `toml:",omitempty"` + // WSHost is the host interface on which to start the websocket RPC server. If // this field is empty, no websocket API endpoint will be started. WSHost string @@ -190,6 +201,9 @@ type Config struct { // AllowUnprotectedTxs allows non EIP-155 protected transactions to be send over RPC. AllowUnprotectedTxs bool `toml:",omitempty"` + + // JWTSecret is the hex-encoded jwt secret. + JWTSecret string `toml:",omitempty"` } // IPCEndpoint resolves an IPC endpoint based on a configured value, taking into @@ -248,7 +262,7 @@ func (c *Config) HTTPEndpoint() string { // DefaultHTTPEndpoint returns the HTTP endpoint used by default. func DefaultHTTPEndpoint() string { - config := &Config{HTTPHost: DefaultHTTPHost, HTTPPort: DefaultHTTPPort} + config := &Config{HTTPHost: DefaultHTTPHost, HTTPPort: DefaultHTTPPort, AuthPort: DefaultAuthPort} return config.HTTPEndpoint() } diff --git a/node/defaults.go b/node/defaults.go index c685dde5d1..fd0277e29d 100644 --- a/node/defaults.go +++ b/node/defaults.go @@ -34,12 +34,25 @@ const ( DefaultWSPort = 8546 // Default TCP port for the websocket RPC server DefaultGraphQLHost = "localhost" // Default host interface for the GraphQL server DefaultGraphQLPort = 8547 // Default TCP port for the GraphQL server + DefaultAuthHost = "localhost" // Default host interface for the authenticated apis + DefaultAuthPort = 8551 // Default port for the authenticated apis +) + +var ( + DefaultAuthCors = []string{"localhost"} // Default cors domain for the authenticated apis + DefaultAuthVhosts = []string{"localhost"} // Default virtual hosts for the authenticated apis + DefaultAuthOrigins = []string{"localhost"} // Default origins for the authenticated apis + DefaultAuthPrefix = "" // Default prefix for the authenticated apis + DefaultAuthModules = []string{"eth", "engine"} ) // DefaultConfig contains reasonable default settings. var DefaultConfig = Config{ DataDir: DefaultDataDir(), HTTPPort: DefaultHTTPPort, + AuthAddr: DefaultAuthHost, + AuthPort: DefaultAuthPort, + AuthVirtualHosts: DefaultAuthVhosts, HTTPModules: []string{"net", "web3"}, HTTPVirtualHosts: []string{"localhost"}, HTTPTimeouts: rpc.DefaultHTTPTimeouts, diff --git a/node/endpoints.go b/node/endpoints.go index 1f85a52131..166e39adb4 100644 --- a/node/endpoints.go +++ b/node/endpoints.go @@ -60,8 +60,10 @@ func checkModuleAvailability(modules []string, apis []rpc.API) (bad, available [ } } for _, name := range modules { - if _, ok := availableSet[name]; !ok && name != rpc.MetadataApi { - bad = append(bad, name) + if _, ok := availableSet[name]; !ok { + if name != rpc.MetadataApi && name != rpc.EngineApi { + bad = append(bad, name) + } } } return bad, available diff --git a/node/jwt_handler.go b/node/jwt_handler.go new file mode 100644 index 0000000000..28d5b87c60 --- /dev/null +++ b/node/jwt_handler.go @@ -0,0 +1,78 @@ +// Copyright 2022 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 . + +package node + +import ( + "net/http" + "strings" + "time" + + "github.com/golang-jwt/jwt/v4" +) + +type jwtHandler struct { + keyFunc func(token *jwt.Token) (interface{}, error) + next http.Handler +} + +// newJWTHandler creates a http.Handler with jwt authentication support. +func newJWTHandler(secret []byte, next http.Handler) http.Handler { + return &jwtHandler{ + keyFunc: func(token *jwt.Token) (interface{}, error) { + return secret, nil + }, + next: next, + } +} + +// ServeHTTP implements http.Handler +func (handler *jwtHandler) ServeHTTP(out http.ResponseWriter, r *http.Request) { + var ( + strToken string + claims jwt.RegisteredClaims + ) + if auth := r.Header.Get("Authorization"); strings.HasPrefix(auth, "Bearer ") { + strToken = strings.TrimPrefix(auth, "Bearer ") + } + if len(strToken) == 0 { + http.Error(out, "missing token", http.StatusForbidden) + return + } + // We explicitly set only HS256 allowed, and also disables the + // claim-check: the RegisteredClaims internally requires 'iat' to + // be no later than 'now', but we allow for a bit of drift. + token, err := jwt.ParseWithClaims(strToken, &claims, handler.keyFunc, + jwt.WithValidMethods([]string{"HS256"}), + jwt.WithoutClaimsValidation()) + + switch { + case err != nil: + http.Error(out, err.Error(), http.StatusForbidden) + case !token.Valid: + http.Error(out, "invalid token", http.StatusForbidden) + case !claims.VerifyExpiresAt(time.Now(), false): // optional + http.Error(out, "token is expired", http.StatusForbidden) + case claims.IssuedAt == nil: + http.Error(out, "missing issued-at", http.StatusForbidden) + case time.Since(claims.IssuedAt.Time) > 5*time.Second: + http.Error(out, "stale token", http.StatusForbidden) + case time.Until(claims.IssuedAt.Time) > 5*time.Second: + http.Error(out, "future token", http.StatusForbidden) + default: + handler.next.ServeHTTP(out, r) + } +} diff --git a/node/node.go b/node/node.go index ceab1c9090..7c540306db 100644 --- a/node/node.go +++ b/node/node.go @@ -17,6 +17,7 @@ package node import ( + crand "crypto/rand" "errors" "fmt" "net/http" @@ -27,6 +28,8 @@ import ( "sync" "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -55,6 +58,8 @@ type Node struct { rpcAPIs []rpc.API // List of APIs currently provided by the node http *httpServer // ws *httpServer // + httpAuth *httpServer // + wsAuth *httpServer // ipc *ipcServer // Stores information about the ipc http server inprocHandler *rpc.Server // In-process RPC request handler to process the API requests @@ -147,7 +152,9 @@ func New(conf *Config) (*Node, error) { // Configure RPC servers. node.http = newHTTPServer(node.log, conf.HTTPTimeouts) + node.httpAuth = newHTTPServer(node.log, conf.HTTPTimeouts) node.ws = newHTTPServer(node.log, rpc.DefaultHTTPTimeouts) + node.wsAuth = newHTTPServer(node.log, rpc.DefaultHTTPTimeouts) node.ipc = newIPCServer(node.log, conf.IPCEndpoint()) return node, nil @@ -335,7 +342,41 @@ func (n *Node) closeDataDir() { } } -// configureRPC is a helper method to configure all the various RPC endpoints during node +// obtainJWTSecret loads the jwt-secret, either from the provided config, +// or from the default location. If neither of those are present, it generates +// a new secret and stores to the default location. +func (n *Node) obtainJWTSecret(cliParam string) ([]byte, error) { + fileName := cliParam + if len(fileName) == 0 { + // no path provided, use default + fileName = n.ResolvePath(datadirJWTKey) + } + // try reading from file + log.Debug("Reading JWT secret", "path", fileName) + if data, err := os.ReadFile(fileName); err == nil { + jwtSecret := common.FromHex(strings.TrimSpace(string(data))) + if len(jwtSecret) == 32 { + return jwtSecret, nil + } + log.Error("Invalid JWT secret", "path", fileName, "length", len(jwtSecret)) + return nil, errors.New("invalid JWT secret") + } + // Need to generate one + jwtSecret := make([]byte, 32) + crand.Read(jwtSecret) + // if we're in --dev mode, don't bother saving, just show it + if fileName == "" { + log.Info("Generated ephemeral JWT secret", "secret", hexutil.Encode(jwtSecret)) + return jwtSecret, nil + } + if err := os.WriteFile(fileName, []byte(hexutil.Encode(jwtSecret)), 0600); err != nil { + return nil, err + } + log.Info("Generated JWT secret", "path", fileName) + return jwtSecret, nil +} + +// startRPC is a helper method to configure all the various RPC endpoints during node // startup. It's not meant to be called at any time afterwards as it makes certain // assumptions about the state of the node. func (n *Node) startRPC() error { @@ -349,55 +390,125 @@ func (n *Node) startRPC() error { return err } } + var ( + servers []*httpServer + open, all = n.GetAPIs() + ) - // Configure HTTP. - if n.config.HTTPHost != "" { - config := httpConfig{ + initHttp := func(server *httpServer, apis []rpc.API, port int) error { + if err := server.setListenAddr(n.config.HTTPHost, port); err != nil { + return err + } + if err := server.enableRPC(apis, httpConfig{ CorsAllowedOrigins: n.config.HTTPCors, Vhosts: n.config.HTTPVirtualHosts, Modules: n.config.HTTPModules, prefix: n.config.HTTPPathPrefix, + }); err != nil { + return err } - if err := n.http.setListenAddr(n.config.HTTPHost, n.config.HTTPPort); err != nil { + servers = append(servers, server) + return nil + } + + initWS := func(apis []rpc.API, port int) error { + server := n.wsServerForPort(port, false) + if err := server.setListenAddr(n.config.WSHost, port); err != nil { return err } - if err := n.http.enableRPC(n.rpcAPIs, config); err != nil { + if err := server.enableWS(n.rpcAPIs, wsConfig{ + Modules: n.config.WSModules, + Origins: n.config.WSOrigins, + prefix: n.config.WSPathPrefix, + }); err != nil { return err } + servers = append(servers, server) + return nil } + initAuth := func(apis []rpc.API, port int, secret []byte) error { + // Enable auth via HTTP + server := n.httpAuth + if err := server.setListenAddr(n.config.AuthAddr, port); err != nil { + return err + } + if err := server.enableRPC(apis, httpConfig{ + CorsAllowedOrigins: DefaultAuthCors, + Vhosts: n.config.AuthVirtualHosts, + Modules: DefaultAuthModules, + prefix: DefaultAuthPrefix, + jwtSecret: secret, + }); err != nil { + return err + } + servers = append(servers, server) + // Enable auth via WS + server = n.wsServerForPort(port, true) + if err := server.setListenAddr(n.config.AuthAddr, port); err != nil { + return err + } + if err := server.enableWS(apis, wsConfig{ + Modules: DefaultAuthModules, + Origins: DefaultAuthOrigins, + prefix: DefaultAuthPrefix, + jwtSecret: secret, + }); err != nil { + return err + } + servers = append(servers, server) + return nil + } + + // Set up HTTP. + if n.config.HTTPHost != "" { + // Configure legacy unauthenticated HTTP. + if err := initHttp(n.http, open, n.config.HTTPPort); err != nil { + return err + } + } // Configure WebSocket. if n.config.WSHost != "" { - server := n.wsServerForPort(n.config.WSPort) - config := wsConfig{ - Modules: n.config.WSModules, - Origins: n.config.WSOrigins, - prefix: n.config.WSPathPrefix, + // legacy unauthenticated + if err := initWS(open, n.config.WSPort); err != nil { + return err } - if err := server.setListenAddr(n.config.WSHost, n.config.WSPort); err != nil { + } + // Configure authenticated API + if len(open) != len(all) { + jwtSecret, err := n.obtainJWTSecret(n.config.JWTSecret) + if err != nil { return err } - if err := server.enableWS(n.rpcAPIs, config); err != nil { + if err := initAuth(all, n.config.AuthPort, jwtSecret); err != nil { return err } } - - if err := n.http.start(); err != nil { - return err + // Start the servers + for _, server := range servers { + if err := server.start(); err != nil { + return err + } } - return n.ws.start() + return nil } -func (n *Node) wsServerForPort(port int) *httpServer { - if n.config.HTTPHost == "" || n.http.port == port { - return n.http +func (n *Node) wsServerForPort(port int, authenticated bool) *httpServer { + httpServer, wsServer := n.http, n.ws + if authenticated { + httpServer, wsServer = n.httpAuth, n.wsAuth } - return n.ws + if n.config.HTTPHost == "" || httpServer.port == port { + return httpServer + } + return wsServer } func (n *Node) stopRPC() { n.http.stop() n.ws.stop() + n.httpAuth.stop() + n.wsAuth.stop() n.ipc.stop() n.stopInProc() } @@ -458,6 +569,17 @@ func (n *Node) RegisterAPIs(apis []rpc.API) { n.rpcAPIs = append(n.rpcAPIs, apis...) } +// GetAPIs return two sets of APIs, both the ones that do not require +// authentication, and the complete set +func (n *Node) GetAPIs() (unauthenticated, all []rpc.API) { + for _, api := range n.rpcAPIs { + if !api.Authenticated { + unauthenticated = append(unauthenticated, api) + } + } + return unauthenticated, n.rpcAPIs +} + // RegisterHandler mounts a handler on the given path on the canonical HTTP server. // // The name of the handler is shown in a log message when the HTTP server starts diff --git a/node/node_test.go b/node/node_test.go index e104630600..84f61f0c44 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -393,7 +393,7 @@ func TestLifecycleTerminationGuarantee(t *testing.T) { // on the given prefix func TestRegisterHandler_Successful(t *testing.T) { node := createNode(t, 7878, 7979) - + defer node.Close() // create and mount handler handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("success")) @@ -577,13 +577,13 @@ func (test rpcPrefixTest) check(t *testing.T, node *Node) { } } for _, path := range test.wantWS { - err := wsRequest(t, wsBase+path, "") + err := wsRequest(t, wsBase+path) if err != nil { t.Errorf("Error: %s: WebSocket connection failed: %v", path, err) } } for _, path := range test.wantNoWS { - err := wsRequest(t, wsBase+path, "") + err := wsRequest(t, wsBase+path) if err == nil { t.Errorf("Error: %s: WebSocket connection succeeded for path in wantNoWS", path) } diff --git a/node/rpcstack.go b/node/rpcstack.go index 2c55a070b2..d9c41cca57 100644 --- a/node/rpcstack.go +++ b/node/rpcstack.go @@ -40,13 +40,15 @@ type httpConfig struct { CorsAllowedOrigins []string Vhosts []string prefix string // path prefix on which to mount http handler + jwtSecret []byte // optional JWT secret } // wsConfig is the JSON-RPC/Websocket configuration type wsConfig struct { - Origins []string - Modules []string - prefix string // path prefix on which to mount ws handler + Origins []string + Modules []string + prefix string // path prefix on which to mount ws handler + jwtSecret []byte // optional JWT secret } type rpcHandler struct { @@ -157,7 +159,7 @@ func (h *httpServer) start() error { } // Log http endpoint. h.log.Info("HTTP server started", - "endpoint", listener.Addr(), + "endpoint", listener.Addr(), "auth", (h.httpConfig.jwtSecret != nil), "prefix", h.httpConfig.prefix, "cors", strings.Join(h.httpConfig.CorsAllowedOrigins, ","), "vhosts", strings.Join(h.httpConfig.Vhosts, ","), @@ -285,7 +287,7 @@ func (h *httpServer) enableRPC(apis []rpc.API, config httpConfig) error { } h.httpConfig = config h.httpHandler.Store(&rpcHandler{ - Handler: NewHTTPHandlerStack(srv, config.CorsAllowedOrigins, config.Vhosts), + Handler: NewHTTPHandlerStack(srv, config.CorsAllowedOrigins, config.Vhosts, config.jwtSecret), server: srv, }) return nil @@ -309,7 +311,6 @@ func (h *httpServer) enableWS(apis []rpc.API, config wsConfig) error { if h.wsAllowed() { return fmt.Errorf("JSON-RPC over WebSocket is already enabled") } - // Create RPC server and handler. srv := rpc.NewServer() if err := RegisterApis(apis, config.Modules, srv, false); err != nil { @@ -317,7 +318,7 @@ func (h *httpServer) enableWS(apis []rpc.API, config wsConfig) error { } h.wsConfig = config h.wsHandler.Store(&rpcHandler{ - Handler: srv.WebsocketHandler(config.Origins), + Handler: NewWSHandlerStack(srv.WebsocketHandler(config.Origins), config.jwtSecret), server: srv, }) return nil @@ -362,13 +363,24 @@ func isWebsocket(r *http.Request) bool { } // NewHTTPHandlerStack returns wrapped http-related handlers -func NewHTTPHandlerStack(srv http.Handler, cors []string, vhosts []string) http.Handler { +func NewHTTPHandlerStack(srv http.Handler, cors []string, vhosts []string, jwtSecret []byte) http.Handler { // Wrap the CORS-handler within a host-handler handler := newCorsHandler(srv, cors) handler = newVHostHandler(vhosts, handler) + if len(jwtSecret) != 0 { + handler = newJWTHandler(jwtSecret, handler) + } return newGzipHandler(handler) } +// NewWSHandlerStack returns a wrapped ws-related handler. +func NewWSHandlerStack(srv http.Handler, jwtSecret []byte) http.Handler { + if len(jwtSecret) != 0 { + return newJWTHandler(jwtSecret, srv) + } + return srv +} + func newCorsHandler(srv http.Handler, allowedOrigins []string) http.Handler { // disable CORS support if user has not specified a custom CORS configuration if len(allowedOrigins) == 0 { diff --git a/node/rpcstack_test.go b/node/rpcstack_test.go index f92f0ba396..60fcab5a90 100644 --- a/node/rpcstack_test.go +++ b/node/rpcstack_test.go @@ -24,10 +24,12 @@ import ( "strconv" "strings" "testing" + "time" "github.com/ethereum/go-ethereum/internal/testlog" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" + "github.com/golang-jwt/jwt/v4" "github.com/gorilla/websocket" "github.com/stretchr/testify/assert" ) @@ -146,12 +148,12 @@ func TestWebsocketOrigins(t *testing.T) { srv := createAndStartServer(t, &httpConfig{}, true, &wsConfig{Origins: splitAndTrim(tc.spec)}) url := fmt.Sprintf("ws://%v", srv.listenAddr()) for _, origin := range tc.expOk { - if err := wsRequest(t, url, origin); err != nil { + if err := wsRequest(t, url, "Origin", origin); err != nil { t.Errorf("spec '%v', origin '%v': expected ok, got %v", tc.spec, origin, err) } } for _, origin := range tc.expFail { - if err := wsRequest(t, url, origin); err == nil { + if err := wsRequest(t, url, "Origin", origin); err == nil { t.Errorf("spec '%v', origin '%v': expected not to allow, got ok", tc.spec, origin) } } @@ -243,13 +245,18 @@ func createAndStartServer(t *testing.T, conf *httpConfig, ws bool, wsConf *wsCon } // wsRequest attempts to open a WebSocket connection to the given URL. -func wsRequest(t *testing.T, url, browserOrigin string) error { +func wsRequest(t *testing.T, url string, extraHeaders ...string) error { t.Helper() - t.Logf("checking WebSocket on %s (origin %q)", url, browserOrigin) + //t.Logf("checking WebSocket on %s (origin %q)", url, browserOrigin) headers := make(http.Header) - if browserOrigin != "" { - headers.Set("Origin", browserOrigin) + // Apply extra headers. + if len(extraHeaders)%2 != 0 { + panic("odd extraHeaders length") + } + for i := 0; i < len(extraHeaders); i += 2 { + key, value := extraHeaders[i], extraHeaders[i+1] + headers.Set(key, value) } conn, _, err := websocket.DefaultDialer.Dial(url, headers) if conn != nil { @@ -291,3 +298,79 @@ func rpcRequest(t *testing.T, url string, extraHeaders ...string) *http.Response } return resp } + +type testClaim map[string]interface{} + +func (testClaim) Valid() error { + return nil +} + +func TestJWT(t *testing.T) { + var secret = []byte("secret") + issueToken := func(secret []byte, method jwt.SigningMethod, input map[string]interface{}) string { + if method == nil { + method = jwt.SigningMethodHS256 + } + ss, _ := jwt.NewWithClaims(method, testClaim(input)).SignedString(secret) + return ss + } + expOk := []string{ + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix() + 4})), + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix() - 4})), + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{ + "iat": time.Now().Unix(), + "exp": time.Now().Unix() + 2, + })), + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{ + "iat": time.Now().Unix(), + "bar": "baz", + })), + } + expFail := []string{ + // future + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix() + 6})), + // stale + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix() - 6})), + // wrong algo + fmt.Sprintf("Bearer %v", issueToken(secret, jwt.SigningMethodHS512, testClaim{"iat": time.Now().Unix() + 4})), + // expired + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix(), "exp": time.Now().Unix()})), + // missing mandatory iat + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{})), + // wrong secret + fmt.Sprintf("Bearer %v", issueToken([]byte("wrong"), nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("Bearer %v", issueToken([]byte{}, nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("Bearer %v", issueToken(nil, nil, testClaim{"iat": time.Now().Unix()})), + // Various malformed syntax + fmt.Sprintf("%v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("Bearer %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("bearer %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("Bearer: %v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("Bearer:%v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("Bearer\t%v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix()})), + fmt.Sprintf("Bearer \t%v", issueToken(secret, nil, testClaim{"iat": time.Now().Unix()})), + } + srv := createAndStartServer(t, &httpConfig{jwtSecret: []byte("secret")}, + true, &wsConfig{Origins: []string{"*"}, jwtSecret: []byte("secret")}) + wsUrl := fmt.Sprintf("ws://%v", srv.listenAddr()) + htUrl := fmt.Sprintf("http://%v", srv.listenAddr()) + + for i, token := range expOk { + if err := wsRequest(t, wsUrl, "Authorization", token); err != nil { + t.Errorf("test %d-ws, token '%v': expected ok, got %v", i, token, err) + } + if resp := rpcRequest(t, htUrl, "Authorization", token); resp.StatusCode != 200 { + t.Errorf("test %d-http, token '%v': expected ok, got %v", i, token, resp.StatusCode) + } + } + for i, token := range expFail { + if err := wsRequest(t, wsUrl, "Authorization", token); err == nil { + t.Errorf("tc %d-ws, token '%v': expected not to allow, got ok", i, token) + } + if resp := rpcRequest(t, htUrl, "Authorization", token); resp.StatusCode != 403 { + t.Errorf("tc %d-http, token '%v': expected not to allow, got %v", i, token, resp.StatusCode) + } + } + srv.stop() +} diff --git a/p2p/peer.go b/p2p/peer.go index 8f564e776d..257027a5b7 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -332,11 +332,11 @@ func (p *Peer) handle(msg Msg) error { msg.Discard() go SendItems(p.rw, pongMsg) case msg.Code == discMsg: - var reason [1]DiscReason // This is the last message. We don't need to discard or // check errors because, the connection will be closed after it. - rlp.Decode(msg.Payload, &reason) - return reason[0] + var m struct{ R DiscReason } + rlp.Decode(msg.Payload, &m) + return m.R case msg.Code < baseProtocolLength: // ignore other base protocol messages return msg.Discard() diff --git a/p2p/peer_error.go b/p2p/peer_error.go index 393cc86b09..aad1a65c7a 100644 --- a/p2p/peer_error.go +++ b/p2p/peer_error.go @@ -54,7 +54,7 @@ func (pe *peerError) Error() string { var errProtocolReturned = errors.New("protocol returned") -type DiscReason uint +type DiscReason uint8 const ( DiscRequested DiscReason = iota diff --git a/p2p/server.go b/p2p/server.go index bcfc1bd10b..138975e54b 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -943,9 +943,8 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro } // If dialing, figure out the remote public key. - var dialPubkey *ecdsa.PublicKey if dialDest != nil { - dialPubkey = new(ecdsa.PublicKey) + dialPubkey := new(ecdsa.PublicKey) if err := dialDest.Load((*enode.Secp256k1)(dialPubkey)); err != nil { err = errors.New("dial destination doesn't have a secp256k1 public key") srv.log.Trace("Setting up connection failed", "addr", c.fd.RemoteAddr(), "conn", c.flags, "err", err) diff --git a/p2p/simulations/http_test.go b/p2p/simulations/http_test.go index 6d7f0b6d7a..f5172f3f23 100644 --- a/p2p/simulations/http_test.go +++ b/p2p/simulations/http_test.go @@ -141,7 +141,7 @@ func (t *testService) Stop() error { // message with the given code func (t *testService) handshake(rw p2p.MsgReadWriter, code uint64) error { errc := make(chan error, 2) - go func() { errc <- p2p.Send(rw, code, struct{}{}) }() + go func() { errc <- p2p.SendItems(rw, code) }() go func() { errc <- p2p.ExpectMsg(rw, code, struct{}{}) }() for i := 0; i < 2; i++ { if err := <-errc; err != nil { diff --git a/params/bootnodes.go b/params/bootnodes.go index 5460246626..7e43cd8b85 100644 --- a/params/bootnodes.go +++ b/params/bootnodes.go @@ -24,12 +24,12 @@ var MainnetBootnodes = []string{ // Ethereum Foundation Go Bootnodes "enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", // bootnode-aws-ap-southeast-1-001 "enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303", // bootnode-aws-us-east-1-001 - "enode://ca6de62fce278f96aea6ec5a2daadb877e51651247cb96ee310a318def462913b653963c155a0ef6c7d50048bba6e6cea881130857413d9f50a621546b590758@34.255.23.113:30303", // bootnode-aws-eu-west-1-001 - "enode://279944d8dcd428dffaa7436f25ca0ca43ae19e7bcf94a8fb7d1641651f92d121e972ac2e8f381414b80cc8e5555811c2ec6e1a99bb009b3f53c4c69923e11bd8@35.158.244.151:30303", // bootnode-aws-eu-central-1-001 "enode://8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303", // bootnode-azure-australiaeast-001 "enode://103858bdb88756c71f15e9b5e09b56dc1be52f0a5021d46301dbbfb7e130029cc9d0d6f73f693bc29b665770fff7da4d34f3c6379fe12721b5d7a0bcb5ca1fc1@191.234.162.198:30303", // bootnode-azure-brazilsouth-001 "enode://715171f50508aba88aecd1250af392a45a330af91d7b90701c436b618c86aaa1589c9184561907bebbb56439b8f8787bc01f49a7c77276c58c1b09822d75e8e8@52.231.165.108:30303", // bootnode-azure-koreasouth-001 "enode://5d6d7cd20d6da4bb83a1d28cadb5d409b64edf314c0335df658c1a54e32c7c4a7ab7823d57c39b6a757556e68ff1df17c748b698544a55cb488b52479a92b60f@104.42.217.25:30303", // bootnode-azure-westus-001 + "enode://2b252ab6a1d0f971d9722cb839a42cb81db019ba44c08754628ab4a823487071b5695317c8ccd085219c3a03af063495b2f1da8d18218da2d6a82981b45e6ffc@65.108.70.101:30303", // bootnode-hetzner-hel + "enode://4aeb4ab6c14b23e2c4cfdce879c04b0748a20d8e9b59e25ded2a08143e265c6c25936e74cbc8e641e3312ca288673d91f2f93f8e277de3cfa444ecdaaf982052@157.90.35.166:30303", // bootnode-hetzner-fsn } // RopstenBootnodes are the enode URLs of the P2P bootstrap nodes running on the @@ -90,6 +90,13 @@ var BorMainnetBootnodes = []string{ "enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303", } +var KilnBootnodes = []string{ + "enode://c354db99124f0faf677ff0e75c3cbbd568b2febc186af664e0c51ac435609badedc67a18a63adb64dacc1780a28dcefebfc29b83fd1a3f4aa3c0eb161364cf94@164.92.130.5:30303", + "enode://d41af1662434cad0a88fe3c7c92375ec5719f4516ab6d8cb9695e0e2e815382c767038e72c224e04040885157da47422f756c040a9072676c6e35c5b1a383cce@138.68.66.103:30303", + "enode://91a745c3fb069f6b99cad10b75c463d527711b106b622756e9ef9f12d2631b6cb885f831d1c8731b9bc7177cae5e1ea1f1be087f86d7d30b590a91f22bc041b0@165.232.180.230:30303", + "enode://b74bd2e8a9f0c53f0c93bcce80818f2f19439fd807af5c7fbc3efb10130c6ee08be8f3aaec7dc0a057ad7b2a809c8f34dc62431e9b6954b07a6548cc59867884@164.92.140.200:30303", +} + var V5Bootnodes = []string{ // Teku team's bootnode "enr:-KG4QOtcP9X1FbIMOe17QNMKqDxCpm14jcX5tiOE4_TyMrFqbmhPZHK_ZPG2Gxb1GE2xdtodOfx9-cgvNtxnRyHEmC0ghGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", diff --git a/params/config.go b/params/config.go index 16bac00ddf..47e22f986c 100644 --- a/params/config.go +++ b/params/config.go @@ -36,6 +36,7 @@ var ( MumbaiGenesisHash = common.HexToHash("0x7b66506a9ebdbf30d32b43c5f15a3b1216269a1ec3a75aa3182b86176a2b1ca7") BorMainnetGenesisHash = common.HexToHash("0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b") SepoliaGenesisHash = common.HexToHash("0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9") + KilnGenesisHash = common.HexToHash("0x51c7fe41be669f69c45c33a56982cbde405313342d9e2b00d7c91a7b284dd4f8") ) // TrustedCheckpoints associates each known checkpoint with the genesis hash of @@ -403,7 +404,7 @@ var ( AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, nil, nil, &CliqueConfig{Period: 0, Epoch: 30000}, &BorConfig{BurntContract: map[string]string{"0": "0x000000000000000000000000000000000000dead"}}} TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil, &BorConfig{BurntContract: map[string]string{"0": "0x000000000000000000000000000000000000dead"}}} - TestRules = TestChainConfig.Rules(new(big.Int)) + TestRules = TestChainConfig.Rules(new(big.Int), false) ) // TrustedCheckpoint represents a set of post-processed trie roots (CHT and @@ -589,7 +590,7 @@ func (c *ChainConfig) String() string { default: engine = "unknown" } - return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, MergeFork: %v, Engine: %v}", + return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, MergeFork: %v, Terminal TD: %v, Engine: %v}", c.ChainID, c.HomesteadBlock, c.DAOForkBlock, @@ -606,6 +607,7 @@ func (c *ChainConfig) String() string { c.LondonBlock, c.ArrowGlacierBlock, c.MergeForkBlock, + c.TerminalTotalDifficulty, engine, ) } @@ -870,10 +872,11 @@ type Rules struct { IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool IsByzantium, IsConstantinople, IsPetersburg, IsIstanbul bool IsBerlin, IsLondon bool + IsMerge bool } // Rules ensures c's ChainID is not nil. -func (c *ChainConfig) Rules(num *big.Int) Rules { +func (c *ChainConfig) Rules(num *big.Int, isMerge bool) Rules { chainID := c.ChainID if chainID == nil { chainID = new(big.Int) @@ -890,5 +893,6 @@ func (c *ChainConfig) Rules(num *big.Int) Rules { IsIstanbul: c.IsIstanbul(num), IsBerlin: c.IsBerlin(num), IsLondon: c.IsLondon(num), + IsMerge: isMerge, } } diff --git a/params/version.go b/params/version.go index 2fea76942d..b39e363b92 100644 --- a/params/version.go +++ b/params/version.go @@ -23,8 +23,8 @@ import ( const ( VersionMajor = 0 // Major version component of the current release VersionMinor = 2 // Minor version component of the current release - VersionPatch = 15 // Patch version component of the current release - VersionMeta = "beta-3" // Version metadata to append to the version string + VersionPatch = 16 // Patch version component of the current release + VersionMeta = "beta-1" // Version metadata to append to the version string ) // Version holds the textual version string. diff --git a/rlp/decode.go b/rlp/decode.go index 5f2e5ad5fe..9214dbfb37 100644 --- a/rlp/decode.go +++ b/rlp/decode.go @@ -27,6 +27,8 @@ import ( "reflect" "strings" "sync" + + "github.com/ethereum/go-ethereum/rlp/internal/rlpstruct" ) //lint:ignore ST1012 EOL is not an error. @@ -148,7 +150,7 @@ var ( bigInt = reflect.TypeOf(big.Int{}) ) -func makeDecoder(typ reflect.Type, tags tags) (dec decoder, err error) { +func makeDecoder(typ reflect.Type, tags rlpstruct.Tags) (dec decoder, err error) { kind := typ.Kind() switch { case typ == rawValueType: @@ -220,55 +222,20 @@ func decodeBigIntNoPtr(s *Stream, val reflect.Value) error { } func decodeBigInt(s *Stream, val reflect.Value) error { - var buffer []byte - kind, size, err := s.Kind() - switch { - case err != nil: - return wrapStreamError(err, val.Type()) - case kind == List: - return wrapStreamError(ErrExpectedString, val.Type()) - case kind == Byte: - buffer = s.uintbuf[:1] - buffer[0] = s.byteval - s.kind = -1 // re-arm Kind - case size == 0: - // Avoid zero-length read. - s.kind = -1 - case size <= uint64(len(s.uintbuf)): - // For integers smaller than s.uintbuf, allocating a buffer - // can be avoided. - buffer = s.uintbuf[:size] - if err := s.readFull(buffer); err != nil { - return wrapStreamError(err, val.Type()) - } - // Reject inputs where single byte encoding should have been used. - if size == 1 && buffer[0] < 128 { - return wrapStreamError(ErrCanonSize, val.Type()) - } - default: - // For large integers, a temporary buffer is needed. - buffer = make([]byte, size) - if err := s.readFull(buffer); err != nil { - return wrapStreamError(err, val.Type()) - } - } - - // Reject leading zero bytes. - if len(buffer) > 0 && buffer[0] == 0 { - return wrapStreamError(ErrCanonInt, val.Type()) - } - - // Set the integer bytes. i := val.Interface().(*big.Int) if i == nil { i = new(big.Int) val.Set(reflect.ValueOf(i)) } - i.SetBytes(buffer) + + err := s.decodeBigInt(i) + if err != nil { + return wrapStreamError(err, val.Type()) + } return nil } -func makeListDecoder(typ reflect.Type, tag tags) (decoder, error) { +func makeListDecoder(typ reflect.Type, tag rlpstruct.Tags) (decoder, error) { etype := typ.Elem() if etype.Kind() == reflect.Uint8 && !reflect.PtrTo(etype).Implements(decoderInterface) { if typ.Kind() == reflect.Array { @@ -276,7 +243,7 @@ func makeListDecoder(typ reflect.Type, tag tags) (decoder, error) { } return decodeByteSlice, nil } - etypeinfo := theTC.infoWhileGenerating(etype, tags{}) + etypeinfo := theTC.infoWhileGenerating(etype, rlpstruct.Tags{}) if etypeinfo.decoderErr != nil { return nil, etypeinfo.decoderErr } @@ -286,7 +253,7 @@ func makeListDecoder(typ reflect.Type, tag tags) (decoder, error) { dec = func(s *Stream, val reflect.Value) error { return decodeListArray(s, val, etypeinfo.decoder) } - case tag.tail: + case tag.Tail: // A slice with "tail" tag can occur as the last field // of a struct and is supposed to swallow all remaining // list elements. The struct decoder already called s.List, @@ -451,16 +418,16 @@ func zeroFields(structval reflect.Value, fields []field) { } // makePtrDecoder creates a decoder that decodes into the pointer's element type. -func makePtrDecoder(typ reflect.Type, tag tags) (decoder, error) { +func makePtrDecoder(typ reflect.Type, tag rlpstruct.Tags) (decoder, error) { etype := typ.Elem() - etypeinfo := theTC.infoWhileGenerating(etype, tags{}) + etypeinfo := theTC.infoWhileGenerating(etype, rlpstruct.Tags{}) switch { case etypeinfo.decoderErr != nil: return nil, etypeinfo.decoderErr - case !tag.nilOK: + case !tag.NilOK: return makeSimplePtrDecoder(etype, etypeinfo), nil default: - return makeNilPtrDecoder(etype, etypeinfo, tag.nilKind), nil + return makeNilPtrDecoder(etype, etypeinfo, tag), nil } } @@ -481,9 +448,13 @@ func makeSimplePtrDecoder(etype reflect.Type, etypeinfo *typeinfo) decoder { // values are decoded into a value of the element type, just like makePtrDecoder does. // // This decoder is used for pointer-typed struct fields with struct tag "nil". -func makeNilPtrDecoder(etype reflect.Type, etypeinfo *typeinfo, nilKind Kind) decoder { +func makeNilPtrDecoder(etype reflect.Type, etypeinfo *typeinfo, ts rlpstruct.Tags) decoder { typ := reflect.PtrTo(etype) nilPtr := reflect.Zero(typ) + + // Determine the value kind that results in nil pointer. + nilKind := typeNilKind(etype, ts) + return func(s *Stream, val reflect.Value) (err error) { kind, size, err := s.Kind() if err != nil { @@ -659,6 +630,37 @@ func (s *Stream) Bytes() ([]byte, error) { } } +// ReadBytes decodes the next RLP value and stores the result in b. +// The value size must match len(b) exactly. +func (s *Stream) ReadBytes(b []byte) error { + kind, size, err := s.Kind() + if err != nil { + return err + } + switch kind { + case Byte: + if len(b) != 1 { + return fmt.Errorf("input value has wrong size 1, want %d", len(b)) + } + b[0] = s.byteval + s.kind = -1 // rearm Kind + return nil + case String: + if uint64(len(b)) != size { + return fmt.Errorf("input value has wrong size %d, want %d", size, len(b)) + } + if err = s.readFull(b); err != nil { + return err + } + if size == 1 && b[0] < 128 { + return ErrCanonSize + } + return nil + default: + return ErrExpectedString + } +} + // Raw reads a raw encoded value including RLP type information. func (s *Stream) Raw() ([]byte, error) { kind, size, err := s.Kind() @@ -687,10 +689,31 @@ func (s *Stream) Raw() ([]byte, error) { // Uint reads an RLP string of up to 8 bytes and returns its contents // as an unsigned integer. If the input does not contain an RLP string, the // returned error will be ErrExpectedString. +// +// Deprecated: use s.Uint64 instead. func (s *Stream) Uint() (uint64, error) { return s.uint(64) } +func (s *Stream) Uint64() (uint64, error) { + return s.uint(64) +} + +func (s *Stream) Uint32() (uint32, error) { + i, err := s.uint(32) + return uint32(i), err +} + +func (s *Stream) Uint16() (uint16, error) { + i, err := s.uint(16) + return uint16(i), err +} + +func (s *Stream) Uint8() (uint8, error) { + i, err := s.uint(8) + return uint8(i), err +} + func (s *Stream) uint(maxbits int) (uint64, error) { kind, size, err := s.Kind() if err != nil { @@ -781,6 +804,65 @@ func (s *Stream) ListEnd() error { return nil } +// MoreDataInList reports whether the current list context contains +// more data to be read. +func (s *Stream) MoreDataInList() bool { + _, listLimit := s.listLimit() + return listLimit > 0 +} + +// BigInt decodes an arbitrary-size integer value. +func (s *Stream) BigInt() (*big.Int, error) { + i := new(big.Int) + if err := s.decodeBigInt(i); err != nil { + return nil, err + } + return i, nil +} + +func (s *Stream) decodeBigInt(dst *big.Int) error { + var buffer []byte + kind, size, err := s.Kind() + switch { + case err != nil: + return err + case kind == List: + return ErrExpectedString + case kind == Byte: + buffer = s.uintbuf[:1] + buffer[0] = s.byteval + s.kind = -1 // re-arm Kind + case size == 0: + // Avoid zero-length read. + s.kind = -1 + case size <= uint64(len(s.uintbuf)): + // For integers smaller than s.uintbuf, allocating a buffer + // can be avoided. + buffer = s.uintbuf[:size] + if err := s.readFull(buffer); err != nil { + return err + } + // Reject inputs where single byte encoding should have been used. + if size == 1 && buffer[0] < 128 { + return ErrCanonSize + } + default: + // For large integers, a temporary buffer is needed. + buffer = make([]byte, size) + if err := s.readFull(buffer); err != nil { + return err + } + } + + // Reject leading zero bytes. + if len(buffer) > 0 && buffer[0] == 0 { + return ErrCanonInt + } + // Set the integer bytes. + dst.SetBytes(buffer) + return nil +} + // Decode decodes a value and stores the result in the value pointed // to by val. Please see the documentation for the Decode function // to learn about the decoding rules. diff --git a/rlp/decode_test.go b/rlp/decode_test.go index 7c3dafeac4..babdf3891b 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -286,6 +286,47 @@ func TestStreamRaw(t *testing.T) { } } +func TestStreamReadBytes(t *testing.T) { + tests := []struct { + input string + size int + err string + }{ + // kind List + {input: "C0", size: 1, err: "rlp: expected String or Byte"}, + // kind Byte + {input: "04", size: 0, err: "input value has wrong size 1, want 0"}, + {input: "04", size: 1}, + {input: "04", size: 2, err: "input value has wrong size 1, want 2"}, + // kind String + {input: "820102", size: 0, err: "input value has wrong size 2, want 0"}, + {input: "820102", size: 1, err: "input value has wrong size 2, want 1"}, + {input: "820102", size: 2}, + {input: "820102", size: 3, err: "input value has wrong size 2, want 3"}, + } + + for _, test := range tests { + test := test + name := fmt.Sprintf("input_%s/size_%d", test.input, test.size) + t.Run(name, func(t *testing.T) { + s := NewStream(bytes.NewReader(unhex(test.input)), 0) + b := make([]byte, test.size) + err := s.ReadBytes(b) + if test.err == "" { + if err != nil { + t.Errorf("unexpected error %q", err) + } + } else { + if err == nil { + t.Errorf("expected error, got nil") + } else if err.Error() != test.err { + t.Errorf("wrong error %q", err) + } + } + }) + } +} + func TestDecodeErrors(t *testing.T) { r := bytes.NewReader(nil) @@ -990,7 +1031,7 @@ func TestInvalidOptionalField(t *testing.T) { v interface{} err string }{ - {v: new(invalid1), err: `rlp: struct field rlp.invalid1.B needs "optional" tag`}, + {v: new(invalid1), err: `rlp: invalid struct tag "" for rlp.invalid1.B (must be optional because preceding field "A" is optional)`}, {v: new(invalid2), err: `rlp: invalid struct tag "optional" for rlp.invalid2.T (also has "tail" tag)`}, {v: new(invalid3), err: `rlp: invalid struct tag "tail" for rlp.invalid3.T (also has "optional" tag)`}, } diff --git a/rlp/encbuffer.go b/rlp/encbuffer.go new file mode 100644 index 0000000000..289e7448c6 --- /dev/null +++ b/rlp/encbuffer.go @@ -0,0 +1,382 @@ +package rlp + +import ( + "io" + "math/big" + "reflect" + "sync" +) + +type encBuffer struct { + str []byte // string data, contains everything except list headers + lheads []listhead // all list headers + lhsize int // sum of sizes of all encoded list headers + sizebuf [9]byte // auxiliary buffer for uint encoding +} + +// The global encBuffer pool. +var encBufferPool = sync.Pool{ + New: func() interface{} { return new(encBuffer) }, +} + +func getEncBuffer() *encBuffer { + buf := encBufferPool.Get().(*encBuffer) + buf.reset() + return buf +} + +func (buf *encBuffer) reset() { + buf.lhsize = 0 + buf.str = buf.str[:0] + buf.lheads = buf.lheads[:0] +} + +// size returns the length of the encoded data. +func (buf *encBuffer) size() int { + return len(buf.str) + buf.lhsize +} + +// makeBytes creates the encoder output. +func (w *encBuffer) makeBytes() []byte { + out := make([]byte, w.size()) + w.copyTo(out) + return out +} + +func (w *encBuffer) copyTo(dst []byte) { + strpos := 0 + pos := 0 + for _, head := range w.lheads { + // write string data before header + n := copy(dst[pos:], w.str[strpos:head.offset]) + pos += n + strpos += n + // write the header + enc := head.encode(dst[pos:]) + pos += len(enc) + } + // copy string data after the last list header + copy(dst[pos:], w.str[strpos:]) +} + +// writeTo writes the encoder output to w. +func (buf *encBuffer) writeTo(w io.Writer) (err error) { + strpos := 0 + for _, head := range buf.lheads { + // write string data before header + if head.offset-strpos > 0 { + n, err := w.Write(buf.str[strpos:head.offset]) + strpos += n + if err != nil { + return err + } + } + // write the header + enc := head.encode(buf.sizebuf[:]) + if _, err = w.Write(enc); err != nil { + return err + } + } + if strpos < len(buf.str) { + // write string data after the last list header + _, err = w.Write(buf.str[strpos:]) + } + return err +} + +// Write implements io.Writer and appends b directly to the output. +func (buf *encBuffer) Write(b []byte) (int, error) { + buf.str = append(buf.str, b...) + return len(b), nil +} + +// writeBool writes b as the integer 0 (false) or 1 (true). +func (buf *encBuffer) writeBool(b bool) { + if b { + buf.str = append(buf.str, 0x01) + } else { + buf.str = append(buf.str, 0x80) + } +} + +func (buf *encBuffer) writeUint64(i uint64) { + if i == 0 { + buf.str = append(buf.str, 0x80) + } else if i < 128 { + // fits single byte + buf.str = append(buf.str, byte(i)) + } else { + s := putint(buf.sizebuf[1:], i) + buf.sizebuf[0] = 0x80 + byte(s) + buf.str = append(buf.str, buf.sizebuf[:s+1]...) + } +} + +func (buf *encBuffer) writeBytes(b []byte) { + if len(b) == 1 && b[0] <= 0x7F { + // fits single byte, no string header + buf.str = append(buf.str, b[0]) + } else { + buf.encodeStringHeader(len(b)) + buf.str = append(buf.str, b...) + } +} + +func (buf *encBuffer) writeString(s string) { + buf.writeBytes([]byte(s)) +} + +// wordBytes is the number of bytes in a big.Word +const wordBytes = (32 << (uint64(^big.Word(0)) >> 63)) / 8 + +// writeBigInt writes i as an integer. +func (w *encBuffer) writeBigInt(i *big.Int) { + bitlen := i.BitLen() + if bitlen <= 64 { + w.writeUint64(i.Uint64()) + return + } + // Integer is larger than 64 bits, encode from i.Bits(). + // The minimal byte length is bitlen rounded up to the next + // multiple of 8, divided by 8. + length := ((bitlen + 7) & -8) >> 3 + w.encodeStringHeader(length) + w.str = append(w.str, make([]byte, length)...) + index := length + buf := w.str[len(w.str)-length:] + for _, d := range i.Bits() { + for j := 0; j < wordBytes && index > 0; j++ { + index-- + buf[index] = byte(d) + d >>= 8 + } + } +} + +// list adds a new list header to the header stack. It returns the index of the header. +// Call listEnd with this index after encoding the content of the list. +func (buf *encBuffer) list() int { + buf.lheads = append(buf.lheads, listhead{offset: len(buf.str), size: buf.lhsize}) + return len(buf.lheads) - 1 +} + +func (buf *encBuffer) listEnd(index int) { + lh := &buf.lheads[index] + lh.size = buf.size() - lh.offset - lh.size + if lh.size < 56 { + buf.lhsize++ // length encoded into kind tag + } else { + buf.lhsize += 1 + intsize(uint64(lh.size)) + } +} + +func (buf *encBuffer) encode(val interface{}) error { + rval := reflect.ValueOf(val) + writer, err := cachedWriter(rval.Type()) + if err != nil { + return err + } + return writer(rval, buf) +} + +func (buf *encBuffer) encodeStringHeader(size int) { + if size < 56 { + buf.str = append(buf.str, 0x80+byte(size)) + } else { + sizesize := putint(buf.sizebuf[1:], uint64(size)) + buf.sizebuf[0] = 0xB7 + byte(sizesize) + buf.str = append(buf.str, buf.sizebuf[:sizesize+1]...) + } +} + +// encReader is the io.Reader returned by EncodeToReader. +// It releases its encbuf at EOF. +type encReader struct { + buf *encBuffer // the buffer we're reading from. this is nil when we're at EOF. + lhpos int // index of list header that we're reading + strpos int // current position in string buffer + piece []byte // next piece to be read +} + +func (r *encReader) Read(b []byte) (n int, err error) { + for { + if r.piece = r.next(); r.piece == nil { + // Put the encode buffer back into the pool at EOF when it + // is first encountered. Subsequent calls still return EOF + // as the error but the buffer is no longer valid. + if r.buf != nil { + encBufferPool.Put(r.buf) + r.buf = nil + } + return n, io.EOF + } + nn := copy(b[n:], r.piece) + n += nn + if nn < len(r.piece) { + // piece didn't fit, see you next time. + r.piece = r.piece[nn:] + return n, nil + } + r.piece = nil + } +} + +// next returns the next piece of data to be read. +// it returns nil at EOF. +func (r *encReader) next() []byte { + switch { + case r.buf == nil: + return nil + + case r.piece != nil: + // There is still data available for reading. + return r.piece + + case r.lhpos < len(r.buf.lheads): + // We're before the last list header. + head := r.buf.lheads[r.lhpos] + sizebefore := head.offset - r.strpos + if sizebefore > 0 { + // String data before header. + p := r.buf.str[r.strpos:head.offset] + r.strpos += sizebefore + return p + } + r.lhpos++ + return head.encode(r.buf.sizebuf[:]) + + case r.strpos < len(r.buf.str): + // String data at the end, after all list headers. + p := r.buf.str[r.strpos:] + r.strpos = len(r.buf.str) + return p + + default: + return nil + } +} + +func encBufferFromWriter(w io.Writer) *encBuffer { + switch w := w.(type) { + case EncoderBuffer: + return w.buf + case *EncoderBuffer: + return w.buf + case *encBuffer: + return w + default: + return nil + } +} + +// EncoderBuffer is a buffer for incremental encoding. +// +// The zero value is NOT ready for use. To get a usable buffer, +// create it using NewEncoderBuffer or call Reset. +type EncoderBuffer struct { + buf *encBuffer + dst io.Writer + + ownBuffer bool +} + +// NewEncoderBuffer creates an encoder buffer. +func NewEncoderBuffer(dst io.Writer) EncoderBuffer { + var w EncoderBuffer + w.Reset(dst) + return w +} + +// Reset truncates the buffer and sets the output destination. +func (w *EncoderBuffer) Reset(dst io.Writer) { + if w.buf != nil && !w.ownBuffer { + panic("can't Reset derived EncoderBuffer") + } + + // If the destination writer has an *encBuffer, use it. + // Note that w.ownBuffer is left false here. + if dst != nil { + if outer := encBufferFromWriter(dst); outer != nil { + *w = EncoderBuffer{outer, nil, false} + return + } + } + + // Get a fresh buffer. + if w.buf == nil { + w.buf = encBufferPool.Get().(*encBuffer) + w.ownBuffer = true + } + w.buf.reset() + w.dst = dst +} + +// Flush writes encoded RLP data to the output writer. This can only be called once. +// If you want to re-use the buffer after Flush, you must call Reset. +func (w *EncoderBuffer) Flush() error { + var err error + if w.dst != nil { + err = w.buf.writeTo(w.dst) + } + // Release the internal buffer. + if w.ownBuffer { + encBufferPool.Put(w.buf) + } + *w = EncoderBuffer{} + return err +} + +// ToBytes returns the encoded bytes. +func (w *EncoderBuffer) ToBytes() []byte { + return w.buf.makeBytes() +} + +// AppendToBytes appends the encoded bytes to dst. +func (w *EncoderBuffer) AppendToBytes(dst []byte) []byte { + size := w.buf.size() + out := append(dst, make([]byte, size)...) + w.buf.copyTo(out[len(dst):]) + return out +} + +// Write appends b directly to the encoder output. +func (w EncoderBuffer) Write(b []byte) (int, error) { + return w.buf.Write(b) +} + +// WriteBool writes b as the integer 0 (false) or 1 (true). +func (w EncoderBuffer) WriteBool(b bool) { + w.buf.writeBool(b) +} + +// WriteUint64 encodes an unsigned integer. +func (w EncoderBuffer) WriteUint64(i uint64) { + w.buf.writeUint64(i) +} + +// WriteBigInt encodes a big.Int as an RLP string. +// Note: Unlike with Encode, the sign of i is ignored. +func (w EncoderBuffer) WriteBigInt(i *big.Int) { + w.buf.writeBigInt(i) +} + +// WriteBytes encodes b as an RLP string. +func (w EncoderBuffer) WriteBytes(b []byte) { + w.buf.writeBytes(b) +} + +// WriteBytes encodes s as an RLP string. +func (w EncoderBuffer) WriteString(s string) { + w.buf.writeString(s) +} + +// List starts a list. It returns an internal index. Call EndList with +// this index after encoding the content to finish the list. +func (w EncoderBuffer) List() int { + return w.buf.list() +} + +// ListEnd finishes the given list. +func (w EncoderBuffer) ListEnd(index int) { + w.buf.listEnd(index) +} diff --git a/rlp/encbuffer_example_test.go b/rlp/encbuffer_example_test.go new file mode 100644 index 0000000000..ee15d82a77 --- /dev/null +++ b/rlp/encbuffer_example_test.go @@ -0,0 +1,45 @@ +// Copyright 2022 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 . + +package rlp_test + +import ( + "bytes" + "fmt" + + "github.com/ethereum/go-ethereum/rlp" +) + +func ExampleEncoderBuffer() { + var w bytes.Buffer + + // Encode [4, [5, 6]] to w. + buf := rlp.NewEncoderBuffer(&w) + l1 := buf.List() + buf.WriteUint64(4) + l2 := buf.List() + buf.WriteUint64(5) + buf.WriteUint64(6) + buf.ListEnd(l2) + buf.ListEnd(l1) + + if err := buf.Flush(); err != nil { + panic(err) + } + fmt.Printf("%X\n", w.Bytes()) + // Output: + // C404C20506 +} diff --git a/rlp/encode.go b/rlp/encode.go index 1623e97a3e..b96505f56d 100644 --- a/rlp/encode.go +++ b/rlp/encode.go @@ -17,11 +17,13 @@ package rlp import ( + "errors" "fmt" "io" "math/big" "reflect" - "sync" + + "github.com/ethereum/go-ethereum/rlp/internal/rlpstruct" ) var ( @@ -31,6 +33,8 @@ var ( EmptyList = []byte{0xC0} ) +var ErrNegativeBigInt = errors.New("rlp: cannot encode negative big.Int") + // Encoder is implemented by types that require custom // encoding rules or want to encode private fields. type Encoder interface { @@ -51,30 +55,29 @@ type Encoder interface { // // Please see package-level documentation of encoding rules. func Encode(w io.Writer, val interface{}) error { - if outer, ok := w.(*encbuf); ok { - // Encode was called by some type's EncodeRLP. - // Avoid copying by writing to the outer encbuf directly. - return outer.encode(val) + // Optimization: reuse *encBuffer when called by EncodeRLP. + if buf := encBufferFromWriter(w); buf != nil { + return buf.encode(val) } - eb := encbufPool.Get().(*encbuf) - defer encbufPool.Put(eb) - eb.reset() - if err := eb.encode(val); err != nil { + + buf := getEncBuffer() + defer encBufferPool.Put(buf) + if err := buf.encode(val); err != nil { return err } - return eb.toWriter(w) + return buf.writeTo(w) } // EncodeToBytes returns the RLP encoding of val. // Please see package-level documentation for the encoding rules. func EncodeToBytes(val interface{}) ([]byte, error) { - eb := encbufPool.Get().(*encbuf) - defer encbufPool.Put(eb) - eb.reset() - if err := eb.encode(val); err != nil { + buf := getEncBuffer() + defer encBufferPool.Put(buf) + + if err := buf.encode(val); err != nil { return nil, err } - return eb.toBytes(), nil + return buf.makeBytes(), nil } // EncodeToReader returns a reader from which the RLP encoding of val @@ -83,12 +86,15 @@ func EncodeToBytes(val interface{}) ([]byte, error) { // // Please see the documentation of Encode for the encoding rules. func EncodeToReader(val interface{}) (size int, r io.Reader, err error) { - eb := encbufPool.Get().(*encbuf) - eb.reset() - if err := eb.encode(val); err != nil { + buf := getEncBuffer() + if err := buf.encode(val); err != nil { + encBufferPool.Put(buf) return 0, nil, err } - return eb.size(), &encReader{buf: eb}, nil + // Note: can't put the reader back into the pool here + // because it is held by encReader. The reader puts it + // back when it has been fully consumed. + return buf.size(), &encReader{buf: buf}, nil } type listhead struct { @@ -123,207 +129,10 @@ func puthead(buf []byte, smalltag, largetag byte, size uint64) int { return sizesize + 1 } -type encbuf struct { - str []byte // string data, contains everything except list headers - lheads []listhead // all list headers - lhsize int // sum of sizes of all encoded list headers - sizebuf [9]byte // auxiliary buffer for uint encoding -} - -// encbufs are pooled. -var encbufPool = sync.Pool{ - New: func() interface{} { return new(encbuf) }, -} - -func (w *encbuf) reset() { - w.lhsize = 0 - w.str = w.str[:0] - w.lheads = w.lheads[:0] -} - -// encbuf implements io.Writer so it can be passed it into EncodeRLP. -func (w *encbuf) Write(b []byte) (int, error) { - w.str = append(w.str, b...) - return len(b), nil -} - -func (w *encbuf) encode(val interface{}) error { - rval := reflect.ValueOf(val) - writer, err := cachedWriter(rval.Type()) - if err != nil { - return err - } - return writer(rval, w) -} - -func (w *encbuf) encodeStringHeader(size int) { - if size < 56 { - w.str = append(w.str, 0x80+byte(size)) - } else { - sizesize := putint(w.sizebuf[1:], uint64(size)) - w.sizebuf[0] = 0xB7 + byte(sizesize) - w.str = append(w.str, w.sizebuf[:sizesize+1]...) - } -} - -func (w *encbuf) encodeString(b []byte) { - if len(b) == 1 && b[0] <= 0x7F { - // fits single byte, no string header - w.str = append(w.str, b[0]) - } else { - w.encodeStringHeader(len(b)) - w.str = append(w.str, b...) - } -} - -func (w *encbuf) encodeUint(i uint64) { - if i == 0 { - w.str = append(w.str, 0x80) - } else if i < 128 { - // fits single byte - w.str = append(w.str, byte(i)) - } else { - s := putint(w.sizebuf[1:], i) - w.sizebuf[0] = 0x80 + byte(s) - w.str = append(w.str, w.sizebuf[:s+1]...) - } -} - -// list adds a new list header to the header stack. It returns the index -// of the header. The caller must call listEnd with this index after encoding -// the content of the list. -func (w *encbuf) list() int { - w.lheads = append(w.lheads, listhead{offset: len(w.str), size: w.lhsize}) - return len(w.lheads) - 1 -} - -func (w *encbuf) listEnd(index int) { - lh := &w.lheads[index] - lh.size = w.size() - lh.offset - lh.size - if lh.size < 56 { - w.lhsize++ // length encoded into kind tag - } else { - w.lhsize += 1 + intsize(uint64(lh.size)) - } -} - -func (w *encbuf) size() int { - return len(w.str) + w.lhsize -} - -func (w *encbuf) toBytes() []byte { - out := make([]byte, w.size()) - strpos := 0 - pos := 0 - for _, head := range w.lheads { - // write string data before header - n := copy(out[pos:], w.str[strpos:head.offset]) - pos += n - strpos += n - // write the header - enc := head.encode(out[pos:]) - pos += len(enc) - } - // copy string data after the last list header - copy(out[pos:], w.str[strpos:]) - return out -} - -func (w *encbuf) toWriter(out io.Writer) (err error) { - strpos := 0 - for _, head := range w.lheads { - // write string data before header - if head.offset-strpos > 0 { - n, err := out.Write(w.str[strpos:head.offset]) - strpos += n - if err != nil { - return err - } - } - // write the header - enc := head.encode(w.sizebuf[:]) - if _, err = out.Write(enc); err != nil { - return err - } - } - if strpos < len(w.str) { - // write string data after the last list header - _, err = out.Write(w.str[strpos:]) - } - return err -} - -// encReader is the io.Reader returned by EncodeToReader. -// It releases its encbuf at EOF. -type encReader struct { - buf *encbuf // the buffer we're reading from. this is nil when we're at EOF. - lhpos int // index of list header that we're reading - strpos int // current position in string buffer - piece []byte // next piece to be read -} - -func (r *encReader) Read(b []byte) (n int, err error) { - for { - if r.piece = r.next(); r.piece == nil { - // Put the encode buffer back into the pool at EOF when it - // is first encountered. Subsequent calls still return EOF - // as the error but the buffer is no longer valid. - if r.buf != nil { - encbufPool.Put(r.buf) - r.buf = nil - } - return n, io.EOF - } - nn := copy(b[n:], r.piece) - n += nn - if nn < len(r.piece) { - // piece didn't fit, see you next time. - r.piece = r.piece[nn:] - return n, nil - } - r.piece = nil - } -} - -// next returns the next piece of data to be read. -// it returns nil at EOF. -func (r *encReader) next() []byte { - switch { - case r.buf == nil: - return nil - - case r.piece != nil: - // There is still data available for reading. - return r.piece - - case r.lhpos < len(r.buf.lheads): - // We're before the last list header. - head := r.buf.lheads[r.lhpos] - sizebefore := head.offset - r.strpos - if sizebefore > 0 { - // String data before header. - p := r.buf.str[r.strpos:head.offset] - r.strpos += sizebefore - return p - } - r.lhpos++ - return head.encode(r.buf.sizebuf[:]) - - case r.strpos < len(r.buf.str): - // String data at the end, after all list headers. - p := r.buf.str[r.strpos:] - r.strpos = len(r.buf.str) - return p - - default: - return nil - } -} - var encoderInterface = reflect.TypeOf(new(Encoder)).Elem() // makeWriter creates a writer function for the given type. -func makeWriter(typ reflect.Type, ts tags) (writer, error) { +func makeWriter(typ reflect.Type, ts rlpstruct.Tags) (writer, error) { kind := typ.Kind() switch { case typ == rawValueType: @@ -357,71 +166,45 @@ func makeWriter(typ reflect.Type, ts tags) (writer, error) { } } -func writeRawValue(val reflect.Value, w *encbuf) error { +func writeRawValue(val reflect.Value, w *encBuffer) error { w.str = append(w.str, val.Bytes()...) return nil } -func writeUint(val reflect.Value, w *encbuf) error { - w.encodeUint(val.Uint()) +func writeUint(val reflect.Value, w *encBuffer) error { + w.writeUint64(val.Uint()) return nil } -func writeBool(val reflect.Value, w *encbuf) error { - if val.Bool() { - w.str = append(w.str, 0x01) - } else { - w.str = append(w.str, 0x80) - } +func writeBool(val reflect.Value, w *encBuffer) error { + w.writeBool(val.Bool()) return nil } -func writeBigIntPtr(val reflect.Value, w *encbuf) error { +func writeBigIntPtr(val reflect.Value, w *encBuffer) error { ptr := val.Interface().(*big.Int) if ptr == nil { w.str = append(w.str, 0x80) return nil } - return writeBigInt(ptr, w) + if ptr.Sign() == -1 { + return ErrNegativeBigInt + } + w.writeBigInt(ptr) + return nil } -func writeBigIntNoPtr(val reflect.Value, w *encbuf) error { +func writeBigIntNoPtr(val reflect.Value, w *encBuffer) error { i := val.Interface().(big.Int) - return writeBigInt(&i, w) -} - -// wordBytes is the number of bytes in a big.Word -const wordBytes = (32 << (uint64(^big.Word(0)) >> 63)) / 8 - -func writeBigInt(i *big.Int, w *encbuf) error { if i.Sign() == -1 { - return fmt.Errorf("rlp: cannot encode negative *big.Int") - } - bitlen := i.BitLen() - if bitlen <= 64 { - w.encodeUint(i.Uint64()) - return nil - } - // Integer is larger than 64 bits, encode from i.Bits(). - // The minimal byte length is bitlen rounded up to the next - // multiple of 8, divided by 8. - length := ((bitlen + 7) & -8) >> 3 - w.encodeStringHeader(length) - w.str = append(w.str, make([]byte, length)...) - index := length - buf := w.str[len(w.str)-length:] - for _, d := range i.Bits() { - for j := 0; j < wordBytes && index > 0; j++ { - index-- - buf[index] = byte(d) - d >>= 8 - } + return ErrNegativeBigInt } + w.writeBigInt(&i) return nil } -func writeBytes(val reflect.Value, w *encbuf) error { - w.encodeString(val.Bytes()) +func writeBytes(val reflect.Value, w *encBuffer) error { + w.writeBytes(val.Bytes()) return nil } @@ -433,7 +216,7 @@ func makeByteArrayWriter(typ reflect.Type) writer { return writeLengthOneByteArray default: length := typ.Len() - return func(val reflect.Value, w *encbuf) error { + return func(val reflect.Value, w *encBuffer) error { if !val.CanAddr() { // Getting the byte slice of val requires it to be addressable. Make it // addressable by copying. @@ -449,12 +232,12 @@ func makeByteArrayWriter(typ reflect.Type) writer { } } -func writeLengthZeroByteArray(val reflect.Value, w *encbuf) error { +func writeLengthZeroByteArray(val reflect.Value, w *encBuffer) error { w.str = append(w.str, 0x80) return nil } -func writeLengthOneByteArray(val reflect.Value, w *encbuf) error { +func writeLengthOneByteArray(val reflect.Value, w *encBuffer) error { b := byte(val.Index(0).Uint()) if b <= 0x7f { w.str = append(w.str, b) @@ -464,7 +247,7 @@ func writeLengthOneByteArray(val reflect.Value, w *encbuf) error { return nil } -func writeString(val reflect.Value, w *encbuf) error { +func writeString(val reflect.Value, w *encBuffer) error { s := val.String() if len(s) == 1 && s[0] <= 0x7f { // fits single byte, no string header @@ -476,7 +259,7 @@ func writeString(val reflect.Value, w *encbuf) error { return nil } -func writeInterface(val reflect.Value, w *encbuf) error { +func writeInterface(val reflect.Value, w *encBuffer) error { if val.IsNil() { // Write empty list. This is consistent with the previous RLP // encoder that we had and should therefore avoid any @@ -492,17 +275,17 @@ func writeInterface(val reflect.Value, w *encbuf) error { return writer(eval, w) } -func makeSliceWriter(typ reflect.Type, ts tags) (writer, error) { - etypeinfo := theTC.infoWhileGenerating(typ.Elem(), tags{}) +func makeSliceWriter(typ reflect.Type, ts rlpstruct.Tags) (writer, error) { + etypeinfo := theTC.infoWhileGenerating(typ.Elem(), rlpstruct.Tags{}) if etypeinfo.writerErr != nil { return nil, etypeinfo.writerErr } var wfn writer - if ts.tail { + if ts.Tail { // This is for struct tail slices. // w.list is not called for them. - wfn = func(val reflect.Value, w *encbuf) error { + wfn = func(val reflect.Value, w *encBuffer) error { vlen := val.Len() for i := 0; i < vlen; i++ { if err := etypeinfo.writer(val.Index(i), w); err != nil { @@ -513,7 +296,7 @@ func makeSliceWriter(typ reflect.Type, ts tags) (writer, error) { } } else { // This is for regular slices and arrays. - wfn = func(val reflect.Value, w *encbuf) error { + wfn = func(val reflect.Value, w *encBuffer) error { vlen := val.Len() if vlen == 0 { w.str = append(w.str, 0xC0) @@ -547,7 +330,7 @@ func makeStructWriter(typ reflect.Type) (writer, error) { firstOptionalField := firstOptionalField(fields) if firstOptionalField == len(fields) { // This is the writer function for structs without any optional fields. - writer = func(val reflect.Value, w *encbuf) error { + writer = func(val reflect.Value, w *encBuffer) error { lh := w.list() for _, f := range fields { if err := f.info.writer(val.Field(f.index), w); err != nil { @@ -560,7 +343,7 @@ func makeStructWriter(typ reflect.Type) (writer, error) { } else { // If there are any "optional" fields, the writer needs to perform additional // checks to determine the output list length. - writer = func(val reflect.Value, w *encbuf) error { + writer = func(val reflect.Value, w *encBuffer) error { lastField := len(fields) - 1 for ; lastField >= firstOptionalField; lastField-- { if !val.Field(fields[lastField].index).IsZero() { @@ -580,33 +363,18 @@ func makeStructWriter(typ reflect.Type) (writer, error) { return writer, nil } -// nilEncoding returns the encoded value of a nil pointer. -func nilEncoding(typ reflect.Type, ts tags) uint8 { - var nilKind Kind - if ts.nilOK { - nilKind = ts.nilKind // use struct tag if provided - } else { - nilKind = defaultNilKind(typ.Elem()) +func makePtrWriter(typ reflect.Type, ts rlpstruct.Tags) (writer, error) { + nilEncoding := byte(0xC0) + if typeNilKind(typ.Elem(), ts) == String { + nilEncoding = 0x80 } - switch nilKind { - case String: - return 0x80 - case List: - return 0xC0 - default: - panic(fmt.Errorf("rlp: invalid nil kind %d", nilKind)) - } -} - -func makePtrWriter(typ reflect.Type, ts tags) (writer, error) { - etypeinfo := theTC.infoWhileGenerating(typ.Elem(), tags{}) + etypeinfo := theTC.infoWhileGenerating(typ.Elem(), rlpstruct.Tags{}) if etypeinfo.writerErr != nil { return nil, etypeinfo.writerErr } - nilEncoding := nilEncoding(typ, ts) - writer := func(val reflect.Value, w *encbuf) error { + writer := func(val reflect.Value, w *encBuffer) error { if ev := val.Elem(); ev.IsValid() { return etypeinfo.writer(ev, w) } @@ -618,11 +386,11 @@ func makePtrWriter(typ reflect.Type, ts tags) (writer, error) { func makeEncoderWriter(typ reflect.Type) writer { if typ.Implements(encoderInterface) { - return func(val reflect.Value, w *encbuf) error { + return func(val reflect.Value, w *encBuffer) error { return val.Interface().(Encoder).EncodeRLP(w) } } - w := func(val reflect.Value, w *encbuf) error { + w := func(val reflect.Value, w *encBuffer) error { if !val.CanAddr() { // package json simply doesn't call MarshalJSON for this case, but encodes the // value as if it didn't implement the interface. We don't want to handle it that diff --git a/rlp/encode_test.go b/rlp/encode_test.go index a63743440d..1d715e3776 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -145,7 +145,8 @@ var encTests = []encTest{ {val: *big.NewInt(0xFFFFFF), output: "83FFFFFF"}, // negative ints are not supported - {val: big.NewInt(-1), error: "rlp: cannot encode negative *big.Int"}, + {val: big.NewInt(-1), error: "rlp: cannot encode negative big.Int"}, + {val: *big.NewInt(-1), error: "rlp: cannot encode negative big.Int"}, // byte arrays {val: [0]byte{}, output: "80"}, @@ -398,6 +399,21 @@ func TestEncodeToBytes(t *testing.T) { runEncTests(t, EncodeToBytes) } +func TestEncodeAppendToBytes(t *testing.T) { + buffer := make([]byte, 20) + runEncTests(t, func(val interface{}) ([]byte, error) { + w := NewEncoderBuffer(nil) + defer w.Flush() + + err := Encode(w, val) + if err != nil { + return nil, err + } + output := w.AppendToBytes(buffer[:0]) + return output, nil + }) +} + func TestEncodeToReader(t *testing.T) { runEncTests(t, func(val interface{}) ([]byte, error) { _, r, err := EncodeToReader(val) diff --git a/rlp/encoder_example_test.go b/rlp/encoder_example_test.go index 42c1c5c890..4cd3cb8673 100644 --- a/rlp/encoder_example_test.go +++ b/rlp/encoder_example_test.go @@ -14,11 +14,13 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package rlp +package rlp_test import ( "fmt" "io" + + "github.com/ethereum/go-ethereum/rlp" ) type MyCoolType struct { @@ -28,16 +30,16 @@ type MyCoolType struct { // EncodeRLP writes x as RLP list [a, b] that omits the Name field. func (x *MyCoolType) EncodeRLP(w io.Writer) (err error) { - return Encode(w, []uint{x.a, x.b}) + return rlp.Encode(w, []uint{x.a, x.b}) } func ExampleEncoder() { var t *MyCoolType // t is nil pointer to MyCoolType - bytes, _ := EncodeToBytes(t) + bytes, _ := rlp.EncodeToBytes(t) fmt.Printf("%v → %X\n", t, bytes) t = &MyCoolType{Name: "foobar", a: 5, b: 6} - bytes, _ = EncodeToBytes(t) + bytes, _ = rlp.EncodeToBytes(t) fmt.Printf("%v → %X\n", t, bytes) // Output: diff --git a/rlp/internal/rlpstruct/rlpstruct.go b/rlp/internal/rlpstruct/rlpstruct.go new file mode 100644 index 0000000000..1ebaa960e3 --- /dev/null +++ b/rlp/internal/rlpstruct/rlpstruct.go @@ -0,0 +1,213 @@ +// Copyright 2021 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 . + +// Package rlpstruct implements struct processing for RLP encoding/decoding. +// +// In particular, this package handles all rules around field filtering, +// struct tags and nil value determination. +package rlpstruct + +import ( + "fmt" + "reflect" + "strings" +) + +// Field represents a struct field. +type Field struct { + Name string + Index int + Exported bool + Type Type + Tag string +} + +// Type represents the attributes of a Go type. +type Type struct { + Name string + Kind reflect.Kind + IsEncoder bool // whether type implements rlp.Encoder + IsDecoder bool // whether type implements rlp.Decoder + Elem *Type // non-nil for Kind values of Ptr, Slice, Array +} + +// defaultNilValue determines whether a nil pointer to t encodes/decodes +// as an empty string or empty list. +func (t Type) DefaultNilValue() NilKind { + k := t.Kind + if isUint(k) || k == reflect.String || k == reflect.Bool || isByteArray(t) { + return NilKindString + } + return NilKindList +} + +// NilKind is the RLP value encoded in place of nil pointers. +type NilKind uint8 + +const ( + NilKindString NilKind = 0x80 + NilKindList NilKind = 0xC0 +) + +// Tags represents struct tags. +type Tags struct { + // rlp:"nil" controls whether empty input results in a nil pointer. + // nilKind is the kind of empty value allowed for the field. + NilKind NilKind + NilOK bool + + // rlp:"optional" allows for a field to be missing in the input list. + // If this is set, all subsequent fields must also be optional. + Optional bool + + // rlp:"tail" controls whether this field swallows additional list elements. It can + // only be set for the last field, which must be of slice type. + Tail bool + + // rlp:"-" ignores fields. + Ignored bool +} + +// TagError is raised for invalid struct tags. +type TagError struct { + StructType string + + // These are set by this package. + Field string + Tag string + Err string +} + +func (e TagError) Error() string { + field := "field " + e.Field + if e.StructType != "" { + field = e.StructType + "." + e.Field + } + return fmt.Sprintf("rlp: invalid struct tag %q for %s (%s)", e.Tag, field, e.Err) +} + +// ProcessFields filters the given struct fields, returning only fields +// that should be considered for encoding/decoding. +func ProcessFields(allFields []Field) ([]Field, []Tags, error) { + lastPublic := lastPublicField(allFields) + + // Gather all exported fields and their tags. + var fields []Field + var tags []Tags + for _, field := range allFields { + if !field.Exported { + continue + } + ts, err := parseTag(field, lastPublic) + if err != nil { + return nil, nil, err + } + if ts.Ignored { + continue + } + fields = append(fields, field) + tags = append(tags, ts) + } + + // Verify optional field consistency. If any optional field exists, + // all fields after it must also be optional. Note: optional + tail + // is supported. + var anyOptional bool + var firstOptionalName string + for i, ts := range tags { + name := fields[i].Name + if ts.Optional || ts.Tail { + if !anyOptional { + firstOptionalName = name + } + anyOptional = true + } else { + if anyOptional { + msg := fmt.Sprintf("must be optional because preceding field %q is optional", firstOptionalName) + return nil, nil, TagError{Field: name, Err: msg} + } + } + } + return fields, tags, nil +} + +func parseTag(field Field, lastPublic int) (Tags, error) { + name := field.Name + tag := reflect.StructTag(field.Tag) + var ts Tags + for _, t := range strings.Split(tag.Get("rlp"), ",") { + switch t = strings.TrimSpace(t); t { + case "": + // empty tag is allowed for some reason + case "-": + ts.Ignored = true + case "nil", "nilString", "nilList": + ts.NilOK = true + if field.Type.Kind != reflect.Ptr { + return ts, TagError{Field: name, Tag: t, Err: "field is not a pointer"} + } + switch t { + case "nil": + ts.NilKind = field.Type.Elem.DefaultNilValue() + case "nilString": + ts.NilKind = NilKindString + case "nilList": + ts.NilKind = NilKindList + } + case "optional": + ts.Optional = true + if ts.Tail { + return ts, TagError{Field: name, Tag: t, Err: `also has "tail" tag`} + } + case "tail": + ts.Tail = true + if field.Index != lastPublic { + return ts, TagError{Field: name, Tag: t, Err: "must be on last field"} + } + if ts.Optional { + return ts, TagError{Field: name, Tag: t, Err: `also has "optional" tag`} + } + if field.Type.Kind != reflect.Slice { + return ts, TagError{Field: name, Tag: t, Err: "field type is not slice"} + } + default: + return ts, TagError{Field: name, Tag: t, Err: "unknown tag"} + } + } + return ts, nil +} + +func lastPublicField(fields []Field) int { + last := 0 + for _, f := range fields { + if f.Exported { + last = f.Index + } + } + return last +} + +func isUint(k reflect.Kind) bool { + return k >= reflect.Uint && k <= reflect.Uintptr +} + +func isByte(typ Type) bool { + return typ.Kind == reflect.Uint8 && !typ.IsEncoder +} + +func isByteArray(typ Type) bool { + return (typ.Kind == reflect.Slice || typ.Kind == reflect.Array) && isByte(*typ.Elem) +} diff --git a/rlp/rlpgen/gen.go b/rlp/rlpgen/gen.go new file mode 100644 index 0000000000..b36b269478 --- /dev/null +++ b/rlp/rlpgen/gen.go @@ -0,0 +1,735 @@ +package main + +import ( + "bytes" + "fmt" + "go/format" + "go/types" + "sort" + + "github.com/ethereum/go-ethereum/rlp/internal/rlpstruct" +) + +// buildContext keeps the data needed for make*Op. +type buildContext struct { + topType *types.Named // the type we're creating methods for + + encoderIface *types.Interface + decoderIface *types.Interface + rawValueType *types.Named + + typeToStructCache map[types.Type]*rlpstruct.Type +} + +func newBuildContext(packageRLP *types.Package) *buildContext { + enc := packageRLP.Scope().Lookup("Encoder").Type().Underlying() + dec := packageRLP.Scope().Lookup("Decoder").Type().Underlying() + rawv := packageRLP.Scope().Lookup("RawValue").Type() + return &buildContext{ + typeToStructCache: make(map[types.Type]*rlpstruct.Type), + encoderIface: enc.(*types.Interface), + decoderIface: dec.(*types.Interface), + rawValueType: rawv.(*types.Named), + } +} + +func (bctx *buildContext) isEncoder(typ types.Type) bool { + return types.Implements(typ, bctx.encoderIface) +} + +func (bctx *buildContext) isDecoder(typ types.Type) bool { + return types.Implements(typ, bctx.decoderIface) +} + +// typeToStructType converts typ to rlpstruct.Type. +func (bctx *buildContext) typeToStructType(typ types.Type) *rlpstruct.Type { + if prev := bctx.typeToStructCache[typ]; prev != nil { + return prev // short-circuit for recursive types. + } + + // Resolve named types to their underlying type, but keep the name. + name := types.TypeString(typ, nil) + for { + utype := typ.Underlying() + if utype == typ { + break + } + typ = utype + } + + // Create the type and store it in cache. + t := &rlpstruct.Type{ + Name: name, + Kind: typeReflectKind(typ), + IsEncoder: bctx.isEncoder(typ), + IsDecoder: bctx.isDecoder(typ), + } + bctx.typeToStructCache[typ] = t + + // Assign element type. + switch typ.(type) { + case *types.Array, *types.Slice, *types.Pointer: + etype := typ.(interface{ Elem() types.Type }).Elem() + t.Elem = bctx.typeToStructType(etype) + } + return t +} + +// genContext is passed to the gen* methods of op when generating +// the output code. It tracks packages to be imported by the output +// file and assigns unique names of temporary variables. +type genContext struct { + inPackage *types.Package + imports map[string]struct{} + tempCounter int +} + +func newGenContext(inPackage *types.Package) *genContext { + return &genContext{ + inPackage: inPackage, + imports: make(map[string]struct{}), + } +} + +func (ctx *genContext) temp() string { + v := fmt.Sprintf("_tmp%d", ctx.tempCounter) + ctx.tempCounter++ + return v +} + +func (ctx *genContext) resetTemp() { + ctx.tempCounter = 0 +} + +func (ctx *genContext) addImport(path string) { + if path == ctx.inPackage.Path() { + return // avoid importing the package that we're generating in. + } + // TODO: renaming? + ctx.imports[path] = struct{}{} +} + +// importsList returns all packages that need to be imported. +func (ctx *genContext) importsList() []string { + imp := make([]string, 0, len(ctx.imports)) + for k := range ctx.imports { + imp = append(imp, k) + } + sort.Strings(imp) + return imp +} + +// qualify is the types.Qualifier used for printing types. +func (ctx *genContext) qualify(pkg *types.Package) string { + if pkg.Path() == ctx.inPackage.Path() { + return "" + } + ctx.addImport(pkg.Path()) + // TODO: renaming? + return pkg.Name() +} + +type op interface { + // genWrite creates the encoder. The generated code should write v, + // which is any Go expression, to the rlp.EncoderBuffer 'w'. + genWrite(ctx *genContext, v string) string + + // genDecode creates the decoder. The generated code should read + // a value from the rlp.Stream 'dec' and store it to dst. + genDecode(ctx *genContext) (string, string) +} + +// basicOp handles basic types bool, uint*, string. +type basicOp struct { + typ types.Type + writeMethod string // calle write the value + writeArgType types.Type // parameter type of writeMethod + decMethod string + decResultType types.Type // return type of decMethod + decUseBitSize bool // if true, result bit size is appended to decMethod +} + +func (*buildContext) makeBasicOp(typ *types.Basic) (op, error) { + op := basicOp{typ: typ} + kind := typ.Kind() + switch { + case kind == types.Bool: + op.writeMethod = "WriteBool" + op.writeArgType = types.Typ[types.Bool] + op.decMethod = "Bool" + op.decResultType = types.Typ[types.Bool] + case kind >= types.Uint8 && kind <= types.Uint64: + op.writeMethod = "WriteUint64" + op.writeArgType = types.Typ[types.Uint64] + op.decMethod = "Uint" + op.decResultType = typ + op.decUseBitSize = true + case kind == types.String: + op.writeMethod = "WriteString" + op.writeArgType = types.Typ[types.String] + op.decMethod = "String" + op.decResultType = types.Typ[types.String] + default: + return nil, fmt.Errorf("unhandled basic type: %v", typ) + } + return op, nil +} + +func (*buildContext) makeByteSliceOp(typ *types.Slice) op { + if !isByte(typ.Elem()) { + panic("non-byte slice type in makeByteSliceOp") + } + bslice := types.NewSlice(types.Typ[types.Uint8]) + return basicOp{ + typ: typ, + writeMethod: "WriteBytes", + writeArgType: bslice, + decMethod: "Bytes", + decResultType: bslice, + } +} + +func (bctx *buildContext) makeRawValueOp() op { + bslice := types.NewSlice(types.Typ[types.Uint8]) + return basicOp{ + typ: bctx.rawValueType, + writeMethod: "Write", + writeArgType: bslice, + decMethod: "Raw", + decResultType: bslice, + } +} + +func (op basicOp) writeNeedsConversion() bool { + return !types.AssignableTo(op.typ, op.writeArgType) +} + +func (op basicOp) decodeNeedsConversion() bool { + return !types.AssignableTo(op.decResultType, op.typ) +} + +func (op basicOp) genWrite(ctx *genContext, v string) string { + if op.writeNeedsConversion() { + v = fmt.Sprintf("%s(%s)", op.writeArgType, v) + } + return fmt.Sprintf("w.%s(%s)\n", op.writeMethod, v) +} + +func (op basicOp) genDecode(ctx *genContext) (string, string) { + var ( + resultV = ctx.temp() + result = resultV + method = op.decMethod + ) + if op.decUseBitSize { + // Note: For now, this only works for platform-independent integer + // sizes. makeBasicOp forbids the platform-dependent types. + var sizes types.StdSizes + method = fmt.Sprintf("%s%d", op.decMethod, sizes.Sizeof(op.typ)*8) + } + + // Call the decoder method. + var b bytes.Buffer + fmt.Fprintf(&b, "%s, err := dec.%s()\n", resultV, method) + fmt.Fprintf(&b, "if err != nil { return err }\n") + if op.decodeNeedsConversion() { + conv := ctx.temp() + fmt.Fprintf(&b, "%s := %s(%s)\n", conv, types.TypeString(op.typ, ctx.qualify), resultV) + result = conv + } + return result, b.String() +} + +// byteArrayOp handles [...]byte. +type byteArrayOp struct { + typ types.Type + name types.Type // name != typ for named byte array types (e.g. common.Address) +} + +func (bctx *buildContext) makeByteArrayOp(name *types.Named, typ *types.Array) byteArrayOp { + nt := types.Type(name) + if name == nil { + nt = typ + } + return byteArrayOp{typ, nt} +} + +func (op byteArrayOp) genWrite(ctx *genContext, v string) string { + return fmt.Sprintf("w.WriteBytes(%s[:])\n", v) +} + +func (op byteArrayOp) genDecode(ctx *genContext) (string, string) { + var resultV = ctx.temp() + + var b bytes.Buffer + fmt.Fprintf(&b, "var %s %s\n", resultV, types.TypeString(op.name, ctx.qualify)) + fmt.Fprintf(&b, "if err := dec.ReadBytes(%s[:]); err != nil { return err }\n", resultV) + return resultV, b.String() +} + +// bigIntNoPtrOp handles non-pointer big.Int. +// This exists because big.Int has it's own decoder operation on rlp.Stream, +// but the decode method returns *big.Int, so it needs to be dereferenced. +type bigIntOp struct { + pointer bool +} + +func (op bigIntOp) genWrite(ctx *genContext, v string) string { + var b bytes.Buffer + + fmt.Fprintf(&b, "if %s.Sign() == -1 {\n", v) + fmt.Fprintf(&b, " return rlp.ErrNegativeBigInt\n") + fmt.Fprintf(&b, "}\n") + dst := v + if !op.pointer { + dst = "&" + v + } + fmt.Fprintf(&b, "w.WriteBigInt(%s)\n", dst) + + // Wrap with nil check. + if op.pointer { + code := b.String() + b.Reset() + fmt.Fprintf(&b, "if %s == nil {\n", v) + fmt.Fprintf(&b, " w.Write(rlp.EmptyString)") + fmt.Fprintf(&b, "} else {\n") + fmt.Fprint(&b, code) + fmt.Fprintf(&b, "}\n") + } + + return b.String() +} + +func (op bigIntOp) genDecode(ctx *genContext) (string, string) { + var resultV = ctx.temp() + + var b bytes.Buffer + fmt.Fprintf(&b, "%s, err := dec.BigInt()\n", resultV) + fmt.Fprintf(&b, "if err != nil { return err }\n") + + result := resultV + if !op.pointer { + result = "(*" + resultV + ")" + } + return result, b.String() +} + +// encoderDecoderOp handles rlp.Encoder and rlp.Decoder. +// In order to be used with this, the type must implement both interfaces. +// This restriction may be lifted in the future by creating separate ops for +// encoding and decoding. +type encoderDecoderOp struct { + typ types.Type +} + +func (op encoderDecoderOp) genWrite(ctx *genContext, v string) string { + return fmt.Sprintf("if err := %s.EncodeRLP(w); err != nil { return err }\n", v) +} + +func (op encoderDecoderOp) genDecode(ctx *genContext) (string, string) { + // DecodeRLP must have pointer receiver, and this is verified in makeOp. + etyp := op.typ.(*types.Pointer).Elem() + var resultV = ctx.temp() + + var b bytes.Buffer + fmt.Fprintf(&b, "%s := new(%s)\n", resultV, types.TypeString(etyp, ctx.qualify)) + fmt.Fprintf(&b, "if err := %s.DecodeRLP(dec); err != nil { return err }\n", resultV) + return resultV, b.String() +} + +// ptrOp handles pointer types. +type ptrOp struct { + elemTyp types.Type + elem op + nilOK bool + nilValue rlpstruct.NilKind +} + +func (bctx *buildContext) makePtrOp(elemTyp types.Type, tags rlpstruct.Tags) (op, error) { + elemOp, err := bctx.makeOp(nil, elemTyp, rlpstruct.Tags{}) + if err != nil { + return nil, err + } + op := ptrOp{elemTyp: elemTyp, elem: elemOp} + + // Determine nil value. + if tags.NilOK { + op.nilOK = true + op.nilValue = tags.NilKind + } else { + styp := bctx.typeToStructType(elemTyp) + op.nilValue = styp.DefaultNilValue() + } + return op, nil +} + +func (op ptrOp) genWrite(ctx *genContext, v string) string { + // Note: in writer functions, accesses to v are read-only, i.e. v is any Go + // expression. To make all accesses work through the pointer, we substitute + // v with (*v). This is required for most accesses including `v`, `call(v)`, + // and `v[index]` on slices. + // + // For `v.field` and `v[:]` on arrays, the dereference operation is not required. + var vv string + _, isStruct := op.elem.(structOp) + _, isByteArray := op.elem.(byteArrayOp) + if isStruct || isByteArray { + vv = v + } else { + vv = fmt.Sprintf("(*%s)", v) + } + + var b bytes.Buffer + fmt.Fprintf(&b, "if %s == nil {\n", v) + fmt.Fprintf(&b, " w.Write([]byte{0x%X})\n", op.nilValue) + fmt.Fprintf(&b, "} else {\n") + fmt.Fprintf(&b, " %s", op.elem.genWrite(ctx, vv)) + fmt.Fprintf(&b, "}\n") + return b.String() +} + +func (op ptrOp) genDecode(ctx *genContext) (string, string) { + result, code := op.elem.genDecode(ctx) + if !op.nilOK { + // If nil pointers are not allowed, we can just decode the element. + return "&" + result, code + } + + // nil is allowed, so check the kind and size first. + // If size is zero and kind matches the nilKind of the type, + // the value decodes as a nil pointer. + var ( + resultV = ctx.temp() + kindV = ctx.temp() + sizeV = ctx.temp() + wantKind string + ) + if op.nilValue == rlpstruct.NilKindList { + wantKind = "rlp.List" + } else { + wantKind = "rlp.String" + } + var b bytes.Buffer + fmt.Fprintf(&b, "var %s %s\n", resultV, types.TypeString(types.NewPointer(op.elemTyp), ctx.qualify)) + fmt.Fprintf(&b, "if %s, %s, err := dec.Kind(); err != nil {\n", kindV, sizeV) + fmt.Fprintf(&b, " return err\n") + fmt.Fprintf(&b, "} else if %s != 0 || %s != %s {\n", sizeV, kindV, wantKind) + fmt.Fprint(&b, code) + fmt.Fprintf(&b, " %s = &%s\n", resultV, result) + fmt.Fprintf(&b, "}\n") + return resultV, b.String() +} + +// structOp handles struct types. +type structOp struct { + named *types.Named + typ *types.Struct + fields []*structField + optionalFields []*structField +} + +type structField struct { + name string + typ types.Type + elem op +} + +func (bctx *buildContext) makeStructOp(named *types.Named, typ *types.Struct) (op, error) { + // Convert fields to []rlpstruct.Field. + var allStructFields []rlpstruct.Field + for i := 0; i < typ.NumFields(); i++ { + f := typ.Field(i) + allStructFields = append(allStructFields, rlpstruct.Field{ + Name: f.Name(), + Exported: f.Exported(), + Index: i, + Tag: typ.Tag(i), + Type: *bctx.typeToStructType(f.Type()), + }) + } + + // Filter/validate fields. + fields, tags, err := rlpstruct.ProcessFields(allStructFields) + if err != nil { + return nil, err + } + + // Create field ops. + var op = structOp{named: named, typ: typ} + for i, field := range fields { + // Advanced struct tags are not supported yet. + tag := tags[i] + if err := checkUnsupportedTags(field.Name, tag); err != nil { + return nil, err + } + typ := typ.Field(field.Index).Type() + elem, err := bctx.makeOp(nil, typ, tags[i]) + if err != nil { + return nil, fmt.Errorf("field %s: %v", field.Name, err) + } + f := &structField{name: field.Name, typ: typ, elem: elem} + if tag.Optional { + op.optionalFields = append(op.optionalFields, f) + } else { + op.fields = append(op.fields, f) + } + } + return op, nil +} + +func checkUnsupportedTags(field string, tag rlpstruct.Tags) error { + if tag.Tail { + return fmt.Errorf(`field %s has unsupported struct tag "tail"`, field) + } + return nil +} + +func (op structOp) genWrite(ctx *genContext, v string) string { + var b bytes.Buffer + var listMarker = ctx.temp() + fmt.Fprintf(&b, "%s := w.List()\n", listMarker) + for _, field := range op.fields { + selector := v + "." + field.name + fmt.Fprint(&b, field.elem.genWrite(ctx, selector)) + } + op.writeOptionalFields(&b, ctx, v) + fmt.Fprintf(&b, "w.ListEnd(%s)\n", listMarker) + return b.String() +} + +func (op structOp) writeOptionalFields(b *bytes.Buffer, ctx *genContext, v string) { + if len(op.optionalFields) == 0 { + return + } + // First check zero-ness of all optional fields. + var zeroV = make([]string, len(op.optionalFields)) + for i, field := range op.optionalFields { + selector := v + "." + field.name + zeroV[i] = ctx.temp() + fmt.Fprintf(b, "%s := %s\n", zeroV[i], nonZeroCheck(selector, field.typ, ctx.qualify)) + } + // Now write the fields. + for i, field := range op.optionalFields { + selector := v + "." + field.name + cond := "" + for j := i; j < len(op.optionalFields); j++ { + if j > i { + cond += " || " + } + cond += zeroV[j] + } + fmt.Fprintf(b, "if %s {\n", cond) + fmt.Fprint(b, field.elem.genWrite(ctx, selector)) + fmt.Fprintf(b, "}\n") + } +} + +func (op structOp) genDecode(ctx *genContext) (string, string) { + // Get the string representation of the type. + // Here, named types are handled separately because the output + // would contain a copy of the struct definition otherwise. + var typeName string + if op.named != nil { + typeName = types.TypeString(op.named, ctx.qualify) + } else { + typeName = types.TypeString(op.typ, ctx.qualify) + } + + // Create struct object. + var resultV = ctx.temp() + var b bytes.Buffer + fmt.Fprintf(&b, "var %s %s\n", resultV, typeName) + + // Decode fields. + fmt.Fprintf(&b, "{\n") + fmt.Fprintf(&b, "if _, err := dec.List(); err != nil { return err }\n") + for _, field := range op.fields { + result, code := field.elem.genDecode(ctx) + fmt.Fprintf(&b, "// %s:\n", field.name) + fmt.Fprint(&b, code) + fmt.Fprintf(&b, "%s.%s = %s\n", resultV, field.name, result) + } + op.decodeOptionalFields(&b, ctx, resultV) + fmt.Fprintf(&b, "if err := dec.ListEnd(); err != nil { return err }\n") + fmt.Fprintf(&b, "}\n") + return resultV, b.String() +} + +func (op structOp) decodeOptionalFields(b *bytes.Buffer, ctx *genContext, resultV string) { + var suffix bytes.Buffer + for _, field := range op.optionalFields { + result, code := field.elem.genDecode(ctx) + fmt.Fprintf(b, "// %s:\n", field.name) + fmt.Fprintf(b, "if dec.MoreDataInList() {\n") + fmt.Fprint(b, code) + fmt.Fprintf(b, "%s.%s = %s\n", resultV, field.name, result) + fmt.Fprintf(&suffix, "}\n") + } + suffix.WriteTo(b) +} + +// sliceOp handles slice types. +type sliceOp struct { + typ *types.Slice + elemOp op +} + +func (bctx *buildContext) makeSliceOp(typ *types.Slice) (op, error) { + elemOp, err := bctx.makeOp(nil, typ.Elem(), rlpstruct.Tags{}) + if err != nil { + return nil, err + } + return sliceOp{typ: typ, elemOp: elemOp}, nil +} + +func (op sliceOp) genWrite(ctx *genContext, v string) string { + var ( + listMarker = ctx.temp() // holds return value of w.List() + iterElemV = ctx.temp() // iteration variable + elemCode = op.elemOp.genWrite(ctx, iterElemV) + ) + + var b bytes.Buffer + fmt.Fprintf(&b, "%s := w.List()\n", listMarker) + fmt.Fprintf(&b, "for _, %s := range %s {\n", iterElemV, v) + fmt.Fprint(&b, elemCode) + fmt.Fprintf(&b, "}\n") + fmt.Fprintf(&b, "w.ListEnd(%s)\n", listMarker) + return b.String() +} + +func (op sliceOp) genDecode(ctx *genContext) (string, string) { + var sliceV = ctx.temp() // holds the output slice + elemResult, elemCode := op.elemOp.genDecode(ctx) + + var b bytes.Buffer + fmt.Fprintf(&b, "var %s %s\n", sliceV, types.TypeString(op.typ, ctx.qualify)) + fmt.Fprintf(&b, "if _, err := dec.List(); err != nil { return err }\n") + fmt.Fprintf(&b, "for dec.MoreDataInList() {\n") + fmt.Fprintf(&b, " %s", elemCode) + fmt.Fprintf(&b, " %s = append(%s, %s)\n", sliceV, sliceV, elemResult) + fmt.Fprintf(&b, "}\n") + fmt.Fprintf(&b, "if err := dec.ListEnd(); err != nil { return err }\n") + return sliceV, b.String() +} + +func (bctx *buildContext) makeOp(name *types.Named, typ types.Type, tags rlpstruct.Tags) (op, error) { + switch typ := typ.(type) { + case *types.Named: + if isBigInt(typ) { + return bigIntOp{}, nil + } + if typ == bctx.rawValueType { + return bctx.makeRawValueOp(), nil + } + if bctx.isDecoder(typ) { + return nil, fmt.Errorf("type %v implements rlp.Decoder with non-pointer receiver", typ) + } + // TODO: same check for encoder? + return bctx.makeOp(typ, typ.Underlying(), tags) + case *types.Pointer: + if isBigInt(typ.Elem()) { + return bigIntOp{pointer: true}, nil + } + // Encoder/Decoder interfaces. + if bctx.isEncoder(typ) { + if bctx.isDecoder(typ) { + return encoderDecoderOp{typ}, nil + } + return nil, fmt.Errorf("type %v implements rlp.Encoder but not rlp.Decoder", typ) + } + if bctx.isDecoder(typ) { + return nil, fmt.Errorf("type %v implements rlp.Decoder but not rlp.Encoder", typ) + } + // Default pointer handling. + return bctx.makePtrOp(typ.Elem(), tags) + case *types.Basic: + return bctx.makeBasicOp(typ) + case *types.Struct: + return bctx.makeStructOp(name, typ) + case *types.Slice: + etyp := typ.Elem() + if isByte(etyp) && !bctx.isEncoder(etyp) { + return bctx.makeByteSliceOp(typ), nil + } + return bctx.makeSliceOp(typ) + case *types.Array: + etyp := typ.Elem() + if isByte(etyp) && !bctx.isEncoder(etyp) { + return bctx.makeByteArrayOp(name, typ), nil + } + return nil, fmt.Errorf("unhandled array type: %v", typ) + default: + return nil, fmt.Errorf("unhandled type: %v", typ) + } +} + +// generateDecoder generates the DecodeRLP method on 'typ'. +func generateDecoder(ctx *genContext, typ string, op op) []byte { + ctx.resetTemp() + ctx.addImport(pathOfPackageRLP) + + result, code := op.genDecode(ctx) + var b bytes.Buffer + fmt.Fprintf(&b, "func (obj *%s) DecodeRLP(dec *rlp.Stream) error {\n", typ) + fmt.Fprint(&b, code) + fmt.Fprintf(&b, " *obj = %s\n", result) + fmt.Fprintf(&b, " return nil\n") + fmt.Fprintf(&b, "}\n") + return b.Bytes() +} + +// generateEncoder generates the EncodeRLP method on 'typ'. +func generateEncoder(ctx *genContext, typ string, op op) []byte { + ctx.resetTemp() + ctx.addImport("io") + ctx.addImport(pathOfPackageRLP) + + var b bytes.Buffer + fmt.Fprintf(&b, "func (obj *%s) EncodeRLP(_w io.Writer) error {\n", typ) + fmt.Fprintf(&b, " w := rlp.NewEncoderBuffer(_w)\n") + fmt.Fprint(&b, op.genWrite(ctx, "obj")) + fmt.Fprintf(&b, " return w.Flush()\n") + fmt.Fprintf(&b, "}\n") + return b.Bytes() +} + +func (bctx *buildContext) generate(typ *types.Named, encoder, decoder bool) ([]byte, error) { + bctx.topType = typ + + pkg := typ.Obj().Pkg() + op, err := bctx.makeOp(nil, typ, rlpstruct.Tags{}) + if err != nil { + return nil, err + } + + var ( + ctx = newGenContext(pkg) + encSource []byte + decSource []byte + ) + if encoder { + encSource = generateEncoder(ctx, typ.Obj().Name(), op) + } + if decoder { + decSource = generateDecoder(ctx, typ.Obj().Name(), op) + } + + var b bytes.Buffer + fmt.Fprintf(&b, "package %s\n\n", pkg.Name()) + for _, imp := range ctx.importsList() { + fmt.Fprintf(&b, "import %q\n", imp) + } + if encoder { + fmt.Fprintln(&b) + b.Write(encSource) + } + if decoder { + fmt.Fprintln(&b) + b.Write(decSource) + } + + source := b.Bytes() + // fmt.Println(string(source)) + return format.Source(source) +} diff --git a/rlp/rlpgen/gen_test.go b/rlp/rlpgen/gen_test.go new file mode 100644 index 0000000000..9940db188d --- /dev/null +++ b/rlp/rlpgen/gen_test.go @@ -0,0 +1,92 @@ +package main + +import ( + "bytes" + "fmt" + "go/ast" + "go/importer" + "go/parser" + "go/token" + "go/types" + "io/ioutil" + "os" + "path/filepath" + "testing" +) + +// Package RLP is loaded only once and reused for all tests. +var ( + testFset = token.NewFileSet() + testImporter = importer.ForCompiler(testFset, "source", nil).(types.ImporterFrom) + testPackageRLP *types.Package +) + +func init() { + cwd, err := os.Getwd() + if err != nil { + panic(err) + } + testPackageRLP, err = testImporter.ImportFrom(pathOfPackageRLP, cwd, 0) + if err != nil { + panic(fmt.Errorf("can't load package RLP: %v", err)) + } +} + +var tests = []string{"uints", "nil", "rawvalue", "optional", "bigint"} + +func TestOutput(t *testing.T) { + for _, test := range tests { + test := test + t.Run(test, func(t *testing.T) { + inputFile := filepath.Join("testdata", test+".in.txt") + outputFile := filepath.Join("testdata", test+".out.txt") + bctx, typ, err := loadTestSource(inputFile, "Test") + if err != nil { + t.Fatal("error loading test source:", err) + } + output, err := bctx.generate(typ, true, true) + if err != nil { + t.Fatal("error in generate:", err) + } + + // Set this environment variable to regenerate the test outputs. + if os.Getenv("WRITE_TEST_FILES") != "" { + ioutil.WriteFile(outputFile, output, 0644) + } + + // Check if output matches. + wantOutput, err := ioutil.ReadFile(outputFile) + if err != nil { + t.Fatal("error loading expected test output:", err) + } + if !bytes.Equal(output, wantOutput) { + t.Fatal("output mismatch:\n", string(output)) + } + }) + } +} + +func loadTestSource(file string, typeName string) (*buildContext, *types.Named, error) { + // Load the test input. + content, err := ioutil.ReadFile(file) + if err != nil { + return nil, nil, err + } + f, err := parser.ParseFile(testFset, file, content, 0) + if err != nil { + return nil, nil, err + } + conf := types.Config{Importer: testImporter} + pkg, err := conf.Check("test", testFset, []*ast.File{f}, nil) + if err != nil { + return nil, nil, err + } + + // Find the test struct. + bctx := newBuildContext(testPackageRLP) + typ, err := lookupStructType(pkg.Scope(), typeName) + if err != nil { + return nil, nil, fmt.Errorf("can't find type %s: %v", typeName, err) + } + return bctx, typ, nil +} diff --git a/rlp/rlpgen/main.go b/rlp/rlpgen/main.go new file mode 100644 index 0000000000..5b240bfd85 --- /dev/null +++ b/rlp/rlpgen/main.go @@ -0,0 +1,148 @@ +// Copyright 2021 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 . + +package main + +import ( + "bytes" + "errors" + "flag" + "fmt" + "go/types" + "io/ioutil" + "os" + + "golang.org/x/tools/go/packages" +) + +const pathOfPackageRLP = "github.com/ethereum/go-ethereum/rlp" + +func main() { + var ( + pkgdir = flag.String("dir", ".", "input package") + output = flag.String("out", "-", "output file (default is stdout)") + genEncoder = flag.Bool("encoder", true, "generate EncodeRLP?") + genDecoder = flag.Bool("decoder", false, "generate DecodeRLP?") + typename = flag.String("type", "", "type to generate methods for") + ) + flag.Parse() + + cfg := Config{ + Dir: *pkgdir, + Type: *typename, + GenerateEncoder: *genEncoder, + GenerateDecoder: *genDecoder, + } + code, err := cfg.process() + if err != nil { + fatal(err) + } + if *output == "-" { + os.Stdout.Write(code) + } else if err := ioutil.WriteFile(*output, code, 0644); err != nil { + fatal(err) + } +} + +func fatal(args ...interface{}) { + fmt.Fprintln(os.Stderr, args...) + os.Exit(1) +} + +type Config struct { + Dir string // input package directory + Type string + + GenerateEncoder bool + GenerateDecoder bool +} + +// process generates the Go code. +func (cfg *Config) process() (code []byte, err error) { + // Load packages. + pcfg := &packages.Config{ + Mode: packages.NeedName | packages.NeedTypes | packages.NeedImports | packages.NeedDeps, + Dir: cfg.Dir, + BuildFlags: []string{"-tags", "norlpgen"}, + } + ps, err := packages.Load(pcfg, pathOfPackageRLP, ".") + if err != nil { + return nil, err + } + if len(ps) == 0 { + return nil, fmt.Errorf("no Go package found in %s", cfg.Dir) + } + packages.PrintErrors(ps) + + // Find the packages that were loaded. + var ( + pkg *types.Package + packageRLP *types.Package + ) + for _, p := range ps { + if len(p.Errors) > 0 { + return nil, fmt.Errorf("package %s has errors", p.PkgPath) + } + if p.PkgPath == pathOfPackageRLP { + packageRLP = p.Types + } else { + pkg = p.Types + } + } + bctx := newBuildContext(packageRLP) + + // Find the type and generate. + typ, err := lookupStructType(pkg.Scope(), cfg.Type) + if err != nil { + return nil, fmt.Errorf("can't find %s in %s: %v", typ, pkg, err) + } + code, err = bctx.generate(typ, cfg.GenerateEncoder, cfg.GenerateDecoder) + if err != nil { + return nil, err + } + + // Add build comments. + // This is done here to avoid processing these lines with gofmt. + var header bytes.Buffer + fmt.Fprint(&header, "// Code generated by rlpgen. DO NOT EDIT.\n\n") + fmt.Fprint(&header, "//go:build !norlpgen\n") + fmt.Fprint(&header, "// +build !norlpgen\n\n") + return append(header.Bytes(), code...), nil +} + +func lookupStructType(scope *types.Scope, name string) (*types.Named, error) { + typ, err := lookupType(scope, name) + if err != nil { + return nil, err + } + _, ok := typ.Underlying().(*types.Struct) + if !ok { + return nil, errors.New("not a struct type") + } + return typ, nil +} + +func lookupType(scope *types.Scope, name string) (*types.Named, error) { + obj := scope.Lookup(name) + if obj == nil { + return nil, errors.New("no such identifier") + } + typ, ok := obj.(*types.TypeName) + if !ok { + return nil, errors.New("not a type") + } + return typ.Type().(*types.Named), nil +} diff --git a/rlp/rlpgen/testdata/bigint.in.txt b/rlp/rlpgen/testdata/bigint.in.txt new file mode 100644 index 0000000000..d23d84a287 --- /dev/null +++ b/rlp/rlpgen/testdata/bigint.in.txt @@ -0,0 +1,10 @@ +// -*- mode: go -*- + +package test + +import "math/big" + +type Test struct { + Int *big.Int + IntNoPtr big.Int +} diff --git a/rlp/rlpgen/testdata/bigint.out.txt b/rlp/rlpgen/testdata/bigint.out.txt new file mode 100644 index 0000000000..f54d1faa15 --- /dev/null +++ b/rlp/rlpgen/testdata/bigint.out.txt @@ -0,0 +1,49 @@ +package test + +import "github.com/ethereum/go-ethereum/rlp" +import "io" + +func (obj *Test) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + _tmp0 := w.List() + if obj.Int == nil { + w.Write(rlp.EmptyString) + } else { + if obj.Int.Sign() == -1 { + return rlp.ErrNegativeBigInt + } + w.WriteBigInt(obj.Int) + } + if obj.IntNoPtr.Sign() == -1 { + return rlp.ErrNegativeBigInt + } + w.WriteBigInt(&obj.IntNoPtr) + w.ListEnd(_tmp0) + return w.Flush() +} + +func (obj *Test) DecodeRLP(dec *rlp.Stream) error { + var _tmp0 Test + { + if _, err := dec.List(); err != nil { + return err + } + // Int: + _tmp1, err := dec.BigInt() + if err != nil { + return err + } + _tmp0.Int = _tmp1 + // IntNoPtr: + _tmp2, err := dec.BigInt() + if err != nil { + return err + } + _tmp0.IntNoPtr = (*_tmp2) + if err := dec.ListEnd(); err != nil { + return err + } + } + *obj = _tmp0 + return nil +} diff --git a/rlp/rlpgen/testdata/nil.in.txt b/rlp/rlpgen/testdata/nil.in.txt new file mode 100644 index 0000000000..a28ff34487 --- /dev/null +++ b/rlp/rlpgen/testdata/nil.in.txt @@ -0,0 +1,30 @@ +// -*- mode: go -*- + +package test + +type Aux struct{ + A uint32 +} + +type Test struct{ + Uint8 *byte `rlp:"nil"` + Uint8List *byte `rlp:"nilList"` + + Uint32 *uint32 `rlp:"nil"` + Uint32List *uint32 `rlp:"nilList"` + + Uint64 *uint64 `rlp:"nil"` + Uint64List *uint64 `rlp:"nilList"` + + String *string `rlp:"nil"` + StringList *string `rlp:"nilList"` + + ByteArray *[3]byte `rlp:"nil"` + ByteArrayList *[3]byte `rlp:"nilList"` + + ByteSlice *[]byte `rlp:"nil"` + ByteSliceList *[]byte `rlp:"nilList"` + + Struct *Aux `rlp:"nil"` + StructString *Aux `rlp:"nilString"` +} diff --git a/rlp/rlpgen/testdata/nil.out.txt b/rlp/rlpgen/testdata/nil.out.txt new file mode 100644 index 0000000000..e0d5dcebad --- /dev/null +++ b/rlp/rlpgen/testdata/nil.out.txt @@ -0,0 +1,289 @@ +package test + +import "github.com/ethereum/go-ethereum/rlp" +import "io" + +func (obj *Test) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + _tmp0 := w.List() + if obj.Uint8 == nil { + w.Write([]byte{0x80}) + } else { + w.WriteUint64(uint64((*obj.Uint8))) + } + if obj.Uint8List == nil { + w.Write([]byte{0xC0}) + } else { + w.WriteUint64(uint64((*obj.Uint8List))) + } + if obj.Uint32 == nil { + w.Write([]byte{0x80}) + } else { + w.WriteUint64(uint64((*obj.Uint32))) + } + if obj.Uint32List == nil { + w.Write([]byte{0xC0}) + } else { + w.WriteUint64(uint64((*obj.Uint32List))) + } + if obj.Uint64 == nil { + w.Write([]byte{0x80}) + } else { + w.WriteUint64((*obj.Uint64)) + } + if obj.Uint64List == nil { + w.Write([]byte{0xC0}) + } else { + w.WriteUint64((*obj.Uint64List)) + } + if obj.String == nil { + w.Write([]byte{0x80}) + } else { + w.WriteString((*obj.String)) + } + if obj.StringList == nil { + w.Write([]byte{0xC0}) + } else { + w.WriteString((*obj.StringList)) + } + if obj.ByteArray == nil { + w.Write([]byte{0x80}) + } else { + w.WriteBytes(obj.ByteArray[:]) + } + if obj.ByteArrayList == nil { + w.Write([]byte{0xC0}) + } else { + w.WriteBytes(obj.ByteArrayList[:]) + } + if obj.ByteSlice == nil { + w.Write([]byte{0x80}) + } else { + w.WriteBytes((*obj.ByteSlice)) + } + if obj.ByteSliceList == nil { + w.Write([]byte{0xC0}) + } else { + w.WriteBytes((*obj.ByteSliceList)) + } + if obj.Struct == nil { + w.Write([]byte{0xC0}) + } else { + _tmp1 := w.List() + w.WriteUint64(uint64(obj.Struct.A)) + w.ListEnd(_tmp1) + } + if obj.StructString == nil { + w.Write([]byte{0x80}) + } else { + _tmp2 := w.List() + w.WriteUint64(uint64(obj.StructString.A)) + w.ListEnd(_tmp2) + } + w.ListEnd(_tmp0) + return w.Flush() +} + +func (obj *Test) DecodeRLP(dec *rlp.Stream) error { + var _tmp0 Test + { + if _, err := dec.List(); err != nil { + return err + } + // Uint8: + var _tmp2 *byte + if _tmp3, _tmp4, err := dec.Kind(); err != nil { + return err + } else if _tmp4 != 0 || _tmp3 != rlp.String { + _tmp1, err := dec.Uint8() + if err != nil { + return err + } + _tmp2 = &_tmp1 + } + _tmp0.Uint8 = _tmp2 + // Uint8List: + var _tmp6 *byte + if _tmp7, _tmp8, err := dec.Kind(); err != nil { + return err + } else if _tmp8 != 0 || _tmp7 != rlp.List { + _tmp5, err := dec.Uint8() + if err != nil { + return err + } + _tmp6 = &_tmp5 + } + _tmp0.Uint8List = _tmp6 + // Uint32: + var _tmp10 *uint32 + if _tmp11, _tmp12, err := dec.Kind(); err != nil { + return err + } else if _tmp12 != 0 || _tmp11 != rlp.String { + _tmp9, err := dec.Uint32() + if err != nil { + return err + } + _tmp10 = &_tmp9 + } + _tmp0.Uint32 = _tmp10 + // Uint32List: + var _tmp14 *uint32 + if _tmp15, _tmp16, err := dec.Kind(); err != nil { + return err + } else if _tmp16 != 0 || _tmp15 != rlp.List { + _tmp13, err := dec.Uint32() + if err != nil { + return err + } + _tmp14 = &_tmp13 + } + _tmp0.Uint32List = _tmp14 + // Uint64: + var _tmp18 *uint64 + if _tmp19, _tmp20, err := dec.Kind(); err != nil { + return err + } else if _tmp20 != 0 || _tmp19 != rlp.String { + _tmp17, err := dec.Uint64() + if err != nil { + return err + } + _tmp18 = &_tmp17 + } + _tmp0.Uint64 = _tmp18 + // Uint64List: + var _tmp22 *uint64 + if _tmp23, _tmp24, err := dec.Kind(); err != nil { + return err + } else if _tmp24 != 0 || _tmp23 != rlp.List { + _tmp21, err := dec.Uint64() + if err != nil { + return err + } + _tmp22 = &_tmp21 + } + _tmp0.Uint64List = _tmp22 + // String: + var _tmp26 *string + if _tmp27, _tmp28, err := dec.Kind(); err != nil { + return err + } else if _tmp28 != 0 || _tmp27 != rlp.String { + _tmp25, err := dec.String() + if err != nil { + return err + } + _tmp26 = &_tmp25 + } + _tmp0.String = _tmp26 + // StringList: + var _tmp30 *string + if _tmp31, _tmp32, err := dec.Kind(); err != nil { + return err + } else if _tmp32 != 0 || _tmp31 != rlp.List { + _tmp29, err := dec.String() + if err != nil { + return err + } + _tmp30 = &_tmp29 + } + _tmp0.StringList = _tmp30 + // ByteArray: + var _tmp34 *[3]byte + if _tmp35, _tmp36, err := dec.Kind(); err != nil { + return err + } else if _tmp36 != 0 || _tmp35 != rlp.String { + var _tmp33 [3]byte + if err := dec.ReadBytes(_tmp33[:]); err != nil { + return err + } + _tmp34 = &_tmp33 + } + _tmp0.ByteArray = _tmp34 + // ByteArrayList: + var _tmp38 *[3]byte + if _tmp39, _tmp40, err := dec.Kind(); err != nil { + return err + } else if _tmp40 != 0 || _tmp39 != rlp.List { + var _tmp37 [3]byte + if err := dec.ReadBytes(_tmp37[:]); err != nil { + return err + } + _tmp38 = &_tmp37 + } + _tmp0.ByteArrayList = _tmp38 + // ByteSlice: + var _tmp42 *[]byte + if _tmp43, _tmp44, err := dec.Kind(); err != nil { + return err + } else if _tmp44 != 0 || _tmp43 != rlp.String { + _tmp41, err := dec.Bytes() + if err != nil { + return err + } + _tmp42 = &_tmp41 + } + _tmp0.ByteSlice = _tmp42 + // ByteSliceList: + var _tmp46 *[]byte + if _tmp47, _tmp48, err := dec.Kind(); err != nil { + return err + } else if _tmp48 != 0 || _tmp47 != rlp.List { + _tmp45, err := dec.Bytes() + if err != nil { + return err + } + _tmp46 = &_tmp45 + } + _tmp0.ByteSliceList = _tmp46 + // Struct: + var _tmp51 *Aux + if _tmp52, _tmp53, err := dec.Kind(); err != nil { + return err + } else if _tmp53 != 0 || _tmp52 != rlp.List { + var _tmp49 Aux + { + if _, err := dec.List(); err != nil { + return err + } + // A: + _tmp50, err := dec.Uint32() + if err != nil { + return err + } + _tmp49.A = _tmp50 + if err := dec.ListEnd(); err != nil { + return err + } + } + _tmp51 = &_tmp49 + } + _tmp0.Struct = _tmp51 + // StructString: + var _tmp56 *Aux + if _tmp57, _tmp58, err := dec.Kind(); err != nil { + return err + } else if _tmp58 != 0 || _tmp57 != rlp.String { + var _tmp54 Aux + { + if _, err := dec.List(); err != nil { + return err + } + // A: + _tmp55, err := dec.Uint32() + if err != nil { + return err + } + _tmp54.A = _tmp55 + if err := dec.ListEnd(); err != nil { + return err + } + } + _tmp56 = &_tmp54 + } + _tmp0.StructString = _tmp56 + if err := dec.ListEnd(); err != nil { + return err + } + } + *obj = _tmp0 + return nil +} diff --git a/rlp/rlpgen/testdata/optional.in.txt b/rlp/rlpgen/testdata/optional.in.txt new file mode 100644 index 0000000000..f1ac9f7899 --- /dev/null +++ b/rlp/rlpgen/testdata/optional.in.txt @@ -0,0 +1,17 @@ +// -*- mode: go -*- + +package test + +type Aux struct { + A uint64 +} + +type Test struct { + Uint64 uint64 `rlp:"optional"` + Pointer *uint64 `rlp:"optional"` + String string `rlp:"optional"` + Slice []uint64 `rlp:"optional"` + Array [3]byte `rlp:"optional"` + NamedStruct Aux `rlp:"optional"` + AnonStruct struct{ A string } `rlp:"optional"` +} diff --git a/rlp/rlpgen/testdata/optional.out.txt b/rlp/rlpgen/testdata/optional.out.txt new file mode 100644 index 0000000000..02df8e457f --- /dev/null +++ b/rlp/rlpgen/testdata/optional.out.txt @@ -0,0 +1,153 @@ +package test + +import "github.com/ethereum/go-ethereum/rlp" +import "io" + +func (obj *Test) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + _tmp0 := w.List() + _tmp1 := obj.Uint64 != 0 + _tmp2 := obj.Pointer != nil + _tmp3 := obj.String != "" + _tmp4 := len(obj.Slice) > 0 + _tmp5 := obj.Array != ([3]byte{}) + _tmp6 := obj.NamedStruct != (Aux{}) + _tmp7 := obj.AnonStruct != (struct{ A string }{}) + if _tmp1 || _tmp2 || _tmp3 || _tmp4 || _tmp5 || _tmp6 || _tmp7 { + w.WriteUint64(obj.Uint64) + } + if _tmp2 || _tmp3 || _tmp4 || _tmp5 || _tmp6 || _tmp7 { + if obj.Pointer == nil { + w.Write([]byte{0x80}) + } else { + w.WriteUint64((*obj.Pointer)) + } + } + if _tmp3 || _tmp4 || _tmp5 || _tmp6 || _tmp7 { + w.WriteString(obj.String) + } + if _tmp4 || _tmp5 || _tmp6 || _tmp7 { + _tmp8 := w.List() + for _, _tmp9 := range obj.Slice { + w.WriteUint64(_tmp9) + } + w.ListEnd(_tmp8) + } + if _tmp5 || _tmp6 || _tmp7 { + w.WriteBytes(obj.Array[:]) + } + if _tmp6 || _tmp7 { + _tmp10 := w.List() + w.WriteUint64(obj.NamedStruct.A) + w.ListEnd(_tmp10) + } + if _tmp7 { + _tmp11 := w.List() + w.WriteString(obj.AnonStruct.A) + w.ListEnd(_tmp11) + } + w.ListEnd(_tmp0) + return w.Flush() +} + +func (obj *Test) DecodeRLP(dec *rlp.Stream) error { + var _tmp0 Test + { + if _, err := dec.List(); err != nil { + return err + } + // Uint64: + if dec.MoreDataInList() { + _tmp1, err := dec.Uint64() + if err != nil { + return err + } + _tmp0.Uint64 = _tmp1 + // Pointer: + if dec.MoreDataInList() { + _tmp2, err := dec.Uint64() + if err != nil { + return err + } + _tmp0.Pointer = &_tmp2 + // String: + if dec.MoreDataInList() { + _tmp3, err := dec.String() + if err != nil { + return err + } + _tmp0.String = _tmp3 + // Slice: + if dec.MoreDataInList() { + var _tmp4 []uint64 + if _, err := dec.List(); err != nil { + return err + } + for dec.MoreDataInList() { + _tmp5, err := dec.Uint64() + if err != nil { + return err + } + _tmp4 = append(_tmp4, _tmp5) + } + if err := dec.ListEnd(); err != nil { + return err + } + _tmp0.Slice = _tmp4 + // Array: + if dec.MoreDataInList() { + var _tmp6 [3]byte + if err := dec.ReadBytes(_tmp6[:]); err != nil { + return err + } + _tmp0.Array = _tmp6 + // NamedStruct: + if dec.MoreDataInList() { + var _tmp7 Aux + { + if _, err := dec.List(); err != nil { + return err + } + // A: + _tmp8, err := dec.Uint64() + if err != nil { + return err + } + _tmp7.A = _tmp8 + if err := dec.ListEnd(); err != nil { + return err + } + } + _tmp0.NamedStruct = _tmp7 + // AnonStruct: + if dec.MoreDataInList() { + var _tmp9 struct{ A string } + { + if _, err := dec.List(); err != nil { + return err + } + // A: + _tmp10, err := dec.String() + if err != nil { + return err + } + _tmp9.A = _tmp10 + if err := dec.ListEnd(); err != nil { + return err + } + } + _tmp0.AnonStruct = _tmp9 + } + } + } + } + } + } + } + if err := dec.ListEnd(); err != nil { + return err + } + } + *obj = _tmp0 + return nil +} diff --git a/rlp/rlpgen/testdata/rawvalue.in.txt b/rlp/rlpgen/testdata/rawvalue.in.txt new file mode 100644 index 0000000000..3a657bc907 --- /dev/null +++ b/rlp/rlpgen/testdata/rawvalue.in.txt @@ -0,0 +1,11 @@ +// -*- mode: go -*- + +package test + +import "github.com/ethereum/go-ethereum/rlp" + +type Test struct { + RawValue rlp.RawValue + PointerToRawValue *rlp.RawValue + SliceOfRawValue []rlp.RawValue +} diff --git a/rlp/rlpgen/testdata/rawvalue.out.txt b/rlp/rlpgen/testdata/rawvalue.out.txt new file mode 100644 index 0000000000..3607c98636 --- /dev/null +++ b/rlp/rlpgen/testdata/rawvalue.out.txt @@ -0,0 +1,64 @@ +package test + +import "github.com/ethereum/go-ethereum/rlp" +import "io" + +func (obj *Test) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + _tmp0 := w.List() + w.Write(obj.RawValue) + if obj.PointerToRawValue == nil { + w.Write([]byte{0x80}) + } else { + w.Write((*obj.PointerToRawValue)) + } + _tmp1 := w.List() + for _, _tmp2 := range obj.SliceOfRawValue { + w.Write(_tmp2) + } + w.ListEnd(_tmp1) + w.ListEnd(_tmp0) + return w.Flush() +} + +func (obj *Test) DecodeRLP(dec *rlp.Stream) error { + var _tmp0 Test + { + if _, err := dec.List(); err != nil { + return err + } + // RawValue: + _tmp1, err := dec.Raw() + if err != nil { + return err + } + _tmp0.RawValue = _tmp1 + // PointerToRawValue: + _tmp2, err := dec.Raw() + if err != nil { + return err + } + _tmp0.PointerToRawValue = &_tmp2 + // SliceOfRawValue: + var _tmp3 []rlp.RawValue + if _, err := dec.List(); err != nil { + return err + } + for dec.MoreDataInList() { + _tmp4, err := dec.Raw() + if err != nil { + return err + } + _tmp3 = append(_tmp3, _tmp4) + } + if err := dec.ListEnd(); err != nil { + return err + } + _tmp0.SliceOfRawValue = _tmp3 + if err := dec.ListEnd(); err != nil { + return err + } + } + *obj = _tmp0 + return nil +} diff --git a/rlp/rlpgen/testdata/uints.in.txt b/rlp/rlpgen/testdata/uints.in.txt new file mode 100644 index 0000000000..8095da997d --- /dev/null +++ b/rlp/rlpgen/testdata/uints.in.txt @@ -0,0 +1,10 @@ +// -*- mode: go -*- + +package test + +type Test struct{ + A uint8 + B uint16 + C uint32 + D uint64 +} diff --git a/rlp/rlpgen/testdata/uints.out.txt b/rlp/rlpgen/testdata/uints.out.txt new file mode 100644 index 0000000000..1a354956a4 --- /dev/null +++ b/rlp/rlpgen/testdata/uints.out.txt @@ -0,0 +1,53 @@ +package test + +import "github.com/ethereum/go-ethereum/rlp" +import "io" + +func (obj *Test) EncodeRLP(_w io.Writer) error { + w := rlp.NewEncoderBuffer(_w) + _tmp0 := w.List() + w.WriteUint64(uint64(obj.A)) + w.WriteUint64(uint64(obj.B)) + w.WriteUint64(uint64(obj.C)) + w.WriteUint64(obj.D) + w.ListEnd(_tmp0) + return w.Flush() +} + +func (obj *Test) DecodeRLP(dec *rlp.Stream) error { + var _tmp0 Test + { + if _, err := dec.List(); err != nil { + return err + } + // A: + _tmp1, err := dec.Uint8() + if err != nil { + return err + } + _tmp0.A = _tmp1 + // B: + _tmp2, err := dec.Uint16() + if err != nil { + return err + } + _tmp0.B = _tmp2 + // C: + _tmp3, err := dec.Uint32() + if err != nil { + return err + } + _tmp0.C = _tmp3 + // D: + _tmp4, err := dec.Uint64() + if err != nil { + return err + } + _tmp0.D = _tmp4 + if err := dec.ListEnd(); err != nil { + return err + } + } + *obj = _tmp0 + return nil +} diff --git a/rlp/rlpgen/types.go b/rlp/rlpgen/types.go new file mode 100644 index 0000000000..5926a801ee --- /dev/null +++ b/rlp/rlpgen/types.go @@ -0,0 +1,98 @@ +package main + +import ( + "fmt" + "go/types" + "reflect" +) + +// typeReflectKind gives the reflect.Kind that represents typ. +func typeReflectKind(typ types.Type) reflect.Kind { + switch typ := typ.(type) { + case *types.Basic: + k := typ.Kind() + if k >= types.Bool && k <= types.Complex128 { + // value order matches for Bool..Complex128 + return reflect.Bool + reflect.Kind(k-types.Bool) + } + if k == types.String { + return reflect.String + } + if k == types.UnsafePointer { + return reflect.UnsafePointer + } + panic(fmt.Errorf("unhandled BasicKind %v", k)) + case *types.Array: + return reflect.Array + case *types.Chan: + return reflect.Chan + case *types.Interface: + return reflect.Interface + case *types.Map: + return reflect.Map + case *types.Pointer: + return reflect.Ptr + case *types.Signature: + return reflect.Func + case *types.Slice: + return reflect.Slice + case *types.Struct: + return reflect.Struct + default: + panic(fmt.Errorf("unhandled type %T", typ)) + } +} + +// nonZeroCheck returns the expression that checks whether 'v' is a non-zero value of type 'vtyp'. +func nonZeroCheck(v string, vtyp types.Type, qualify types.Qualifier) string { + // Resolve type name. + typ := resolveUnderlying(vtyp) + switch typ := typ.(type) { + case *types.Basic: + k := typ.Kind() + switch { + case k == types.Bool: + return v + case k >= types.Uint && k <= types.Complex128: + return fmt.Sprintf("%s != 0", v) + case k == types.String: + return fmt.Sprintf(`%s != ""`, v) + default: + panic(fmt.Errorf("unhandled BasicKind %v", k)) + } + case *types.Array, *types.Struct: + return fmt.Sprintf("%s != (%s{})", v, types.TypeString(vtyp, qualify)) + case *types.Interface, *types.Pointer, *types.Signature: + return fmt.Sprintf("%s != nil", v) + case *types.Slice, *types.Map: + return fmt.Sprintf("len(%s) > 0", v) + default: + panic(fmt.Errorf("unhandled type %T", typ)) + } +} + +// isBigInt checks whether 'typ' is "math/big".Int. +func isBigInt(typ types.Type) bool { + named, ok := typ.(*types.Named) + if !ok { + return false + } + name := named.Obj() + return name.Pkg().Path() == "math/big" && name.Name() == "Int" +} + +// isByte checks whether the underlying type of 'typ' is uint8. +func isByte(typ types.Type) bool { + basic, ok := resolveUnderlying(typ).(*types.Basic) + return ok && basic.Kind() == types.Uint8 +} + +func resolveUnderlying(typ types.Type) types.Type { + for { + t := typ.Underlying() + if t == typ { + return t + } + typ = t + } +} diff --git a/rlp/typecache.go b/rlp/typecache.go index 62553d3b55..3e37c9d2fc 100644 --- a/rlp/typecache.go +++ b/rlp/typecache.go @@ -19,9 +19,10 @@ package rlp import ( "fmt" "reflect" - "strings" "sync" "sync/atomic" + + "github.com/ethereum/go-ethereum/rlp/internal/rlpstruct" ) // typeinfo is an entry in the type cache. @@ -32,35 +33,16 @@ type typeinfo struct { writerErr error // error from makeWriter } -// tags represents struct tags. -type tags struct { - // rlp:"nil" controls whether empty input results in a nil pointer. - // nilKind is the kind of empty value allowed for the field. - nilKind Kind - nilOK bool - - // rlp:"optional" allows for a field to be missing in the input list. - // If this is set, all subsequent fields must also be optional. - optional bool - - // rlp:"tail" controls whether this field swallows additional list elements. It can - // only be set for the last field, which must be of slice type. - tail bool - - // rlp:"-" ignores fields. - ignored bool -} - // typekey is the key of a type in typeCache. It includes the struct tags because // they might generate a different decoder. type typekey struct { reflect.Type - tags + rlpstruct.Tags } type decoder func(*Stream, reflect.Value) error -type writer func(reflect.Value, *encbuf) error +type writer func(reflect.Value, *encBuffer) error var theTC = newTypeCache() @@ -95,10 +77,10 @@ func (c *typeCache) info(typ reflect.Type) *typeinfo { } // Not in the cache, need to generate info for this type. - return c.generate(typ, tags{}) + return c.generate(typ, rlpstruct.Tags{}) } -func (c *typeCache) generate(typ reflect.Type, tags tags) *typeinfo { +func (c *typeCache) generate(typ reflect.Type, tags rlpstruct.Tags) *typeinfo { c.mu.Lock() defer c.mu.Unlock() @@ -122,7 +104,7 @@ func (c *typeCache) generate(typ reflect.Type, tags tags) *typeinfo { return info } -func (c *typeCache) infoWhileGenerating(typ reflect.Type, tags tags) *typeinfo { +func (c *typeCache) infoWhileGenerating(typ reflect.Type, tags rlpstruct.Tags) *typeinfo { key := typekey{typ, tags} if info := c.next[key]; info != nil { return info @@ -144,35 +126,40 @@ type field struct { // structFields resolves the typeinfo of all public fields in a struct type. func structFields(typ reflect.Type) (fields []field, err error) { - var ( - lastPublic = lastPublicField(typ) - anyOptional = false - ) + // Convert fields to rlpstruct.Field. + var allStructFields []rlpstruct.Field for i := 0; i < typ.NumField(); i++ { - if f := typ.Field(i); f.PkgPath == "" { // exported - tags, err := parseStructTag(typ, i, lastPublic) - if err != nil { - return nil, err - } - - // Skip rlp:"-" fields. - if tags.ignored { - continue - } - // If any field has the "optional" tag, subsequent fields must also have it. - if tags.optional || tags.tail { - anyOptional = true - } else if anyOptional { - return nil, fmt.Errorf(`rlp: struct field %v.%s needs "optional" tag`, typ, f.Name) - } - info := theTC.infoWhileGenerating(f.Type, tags) - fields = append(fields, field{i, info, tags.optional}) + rf := typ.Field(i) + allStructFields = append(allStructFields, rlpstruct.Field{ + Name: rf.Name, + Index: i, + Exported: rf.PkgPath == "", + Tag: string(rf.Tag), + Type: *rtypeToStructType(rf.Type, nil), + }) + } + + // Filter/validate fields. + structFields, structTags, err := rlpstruct.ProcessFields(allStructFields) + if err != nil { + if tagErr, ok := err.(rlpstruct.TagError); ok { + tagErr.StructType = typ.String() + return nil, tagErr } + return nil, err + } + + // Resolve typeinfo. + for i, sf := range structFields { + typ := typ.Field(sf.Index).Type + tags := structTags[i] + info := theTC.infoWhileGenerating(typ, tags) + fields = append(fields, field{sf.Index, info, tags.Optional}) } return fields, nil } -// anyOptionalFields returns the index of the first field with "optional" tag. +// firstOptionalField returns the index of the first field with "optional" tag. func firstOptionalField(fields []field) int { for i, f := range fields { if f.optional { @@ -192,82 +179,56 @@ func (e structFieldError) Error() string { return fmt.Sprintf("%v (struct field %v.%s)", e.err, e.typ, e.typ.Field(e.field).Name) } -type structTagError struct { - typ reflect.Type - field, tag, err string +func (i *typeinfo) generate(typ reflect.Type, tags rlpstruct.Tags) { + i.decoder, i.decoderErr = makeDecoder(typ, tags) + i.writer, i.writerErr = makeWriter(typ, tags) } -func (e structTagError) Error() string { - return fmt.Sprintf("rlp: invalid struct tag %q for %v.%s (%s)", e.tag, e.typ, e.field, e.err) -} +// rtypeToStructType converts typ to rlpstruct.Type. +func rtypeToStructType(typ reflect.Type, rec map[reflect.Type]*rlpstruct.Type) *rlpstruct.Type { + k := typ.Kind() + if k == reflect.Invalid { + panic("invalid kind") + } -func parseStructTag(typ reflect.Type, fi, lastPublic int) (tags, error) { - f := typ.Field(fi) - var ts tags - for _, t := range strings.Split(f.Tag.Get("rlp"), ",") { - switch t = strings.TrimSpace(t); t { - case "": - case "-": - ts.ignored = true - case "nil", "nilString", "nilList": - ts.nilOK = true - if f.Type.Kind() != reflect.Ptr { - return ts, structTagError{typ, f.Name, t, "field is not a pointer"} - } - switch t { - case "nil": - ts.nilKind = defaultNilKind(f.Type.Elem()) - case "nilString": - ts.nilKind = String - case "nilList": - ts.nilKind = List - } - case "optional": - ts.optional = true - if ts.tail { - return ts, structTagError{typ, f.Name, t, `also has "tail" tag`} - } - case "tail": - ts.tail = true - if fi != lastPublic { - return ts, structTagError{typ, f.Name, t, "must be on last field"} - } - if ts.optional { - return ts, structTagError{typ, f.Name, t, `also has "optional" tag`} - } - if f.Type.Kind() != reflect.Slice { - return ts, structTagError{typ, f.Name, t, "field type is not slice"} - } - default: - return ts, fmt.Errorf("rlp: unknown struct tag %q on %v.%s", t, typ, f.Name) - } + if prev := rec[typ]; prev != nil { + return prev // short-circuit for recursive types + } + if rec == nil { + rec = make(map[reflect.Type]*rlpstruct.Type) } - return ts, nil -} -func lastPublicField(typ reflect.Type) int { - last := 0 - for i := 0; i < typ.NumField(); i++ { - if typ.Field(i).PkgPath == "" { - last = i - } + t := &rlpstruct.Type{ + Name: typ.String(), + Kind: k, + IsEncoder: typ.Implements(encoderInterface), + IsDecoder: typ.Implements(decoderInterface), + } + rec[typ] = t + if k == reflect.Array || k == reflect.Slice || k == reflect.Ptr { + t.Elem = rtypeToStructType(typ.Elem(), rec) } - return last + return t } -func (i *typeinfo) generate(typ reflect.Type, tags tags) { - i.decoder, i.decoderErr = makeDecoder(typ, tags) - i.writer, i.writerErr = makeWriter(typ, tags) -} +// typeNilKind gives the RLP value kind for nil pointers to 'typ'. +func typeNilKind(typ reflect.Type, tags rlpstruct.Tags) Kind { + styp := rtypeToStructType(typ, nil) -// defaultNilKind determines whether a nil pointer to typ encodes/decodes -// as an empty string or empty list. -func defaultNilKind(typ reflect.Type) Kind { - k := typ.Kind() - if isUint(k) || k == reflect.String || k == reflect.Bool || isByteArray(typ) { + var nk rlpstruct.NilKind + if tags.NilOK { + nk = tags.NilKind + } else { + nk = styp.DefaultNilValue() + } + switch nk { + case rlpstruct.NilKindString: return String + case rlpstruct.NilKindList: + return List + default: + panic("invalid nil kind value") } - return List } func isUint(k reflect.Kind) bool { @@ -277,7 +238,3 @@ func isUint(k reflect.Kind) bool { func isByte(typ reflect.Type) bool { return typ.Kind() == reflect.Uint8 && !typ.Implements(encoderInterface) } - -func isByteArray(typ reflect.Type) bool { - return (typ.Kind() == reflect.Slice || typ.Kind() == reflect.Array) && isByte(typ.Elem()) -} diff --git a/rpc/client.go b/rpc/client.go index e43760c22c..d3ce029775 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -58,12 +58,6 @@ const ( maxClientSubscriptionBuffer = 20000 ) -const ( - httpScheme = "http" - wsScheme = "ws" - ipcScheme = "ipc" -) - // BatchElem is an element in a batch request. type BatchElem struct { Method string @@ -80,7 +74,7 @@ type BatchElem struct { // Client represents a connection to an RPC server. type Client struct { idgen func() ID // for subscriptions - scheme string // connection type: http, ws or ipc + isHTTP bool // connection type: http, ws or ipc services *serviceRegistry idCounter uint32 @@ -115,11 +109,9 @@ type clientConn struct { } func (c *Client) newClientConn(conn ServerCodec) *clientConn { - ctx := context.WithValue(context.Background(), clientContextKey{}, c) - // Http connections have already set the scheme - if !c.isHTTP() && c.scheme != "" { - ctx = context.WithValue(ctx, "scheme", c.scheme) - } + ctx := context.Background() + ctx = context.WithValue(ctx, clientContextKey{}, c) + ctx = context.WithValue(ctx, peerInfoContextKey{}, conn.peerInfo()) handler := newHandler(ctx, conn, c.idgen, c.services) return &clientConn{conn, handler} } @@ -145,7 +137,7 @@ func (op *requestOp) wait(ctx context.Context, c *Client) (*jsonrpcMessage, erro select { case <-ctx.Done(): // Send the timeout to dispatch so it can remove the request IDs. - if !c.isHTTP() { + if !c.isHTTP { select { case c.reqTimeout <- op: case <-c.closing: @@ -194,7 +186,7 @@ func DialContext(ctx context.Context, rawurl string) (*Client, error) { } } -// Client retrieves the client from the context, if any. This can be used to perform +// ClientFromContext retrieves the client from the context, if any. This can be used to perform // 'reverse calls' in a handler method. func ClientFromContext(ctx context.Context) (*Client, bool) { client, ok := ctx.Value(clientContextKey{}).(*Client) @@ -212,18 +204,10 @@ func newClient(initctx context.Context, connect reconnectFunc) (*Client, error) } func initClient(conn ServerCodec, idgen func() ID, services *serviceRegistry) *Client { - scheme := "" - switch conn.(type) { - case *httpConn: - scheme = httpScheme - case *websocketCodec: - scheme = wsScheme - case *jsonCodec: - scheme = ipcScheme - } + _, isHTTP := conn.(*httpConn) c := &Client{ + isHTTP: isHTTP, idgen: idgen, - scheme: scheme, services: services, writeConn: conn, close: make(chan struct{}), @@ -236,7 +220,7 @@ func initClient(conn ServerCodec, idgen func() ID, services *serviceRegistry) *C reqSent: make(chan error, 1), reqTimeout: make(chan *requestOp), } - if !c.isHTTP() { + if !isHTTP { go c.dispatch(conn) } return c @@ -267,7 +251,7 @@ func (c *Client) SupportedModules() (map[string]string, error) { // Close closes the client, aborting any in-flight requests. func (c *Client) Close() { - if c.isHTTP() { + if c.isHTTP { return } select { @@ -281,7 +265,7 @@ func (c *Client) Close() { // This method only works for clients using HTTP, it doesn't have // any effect for clients using another transport. func (c *Client) SetHeader(key, value string) { - if !c.isHTTP() { + if !c.isHTTP { return } conn := c.writeConn.(*httpConn) @@ -315,7 +299,7 @@ func (c *Client) CallContext(ctx context.Context, result interface{}, method str } op := &requestOp{ids: []json.RawMessage{msg.ID}, resp: make(chan *jsonrpcMessage, 1)} - if c.isHTTP() { + if c.isHTTP { err = c.sendHTTP(ctx, op, msg) } else { err = c.send(ctx, op, msg) @@ -349,7 +333,7 @@ func (c *Client) BatchCall(b []BatchElem) error { return c.BatchCallContext(ctx, b) } -// BatchCall sends all given requests as a single batch and waits for the server +// BatchCallContext sends all given requests as a single batch and waits for the server // to return a response for all of them. The wait duration is bounded by the // context's deadline. // @@ -378,7 +362,7 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { } var err error - if c.isHTTP() { + if c.isHTTP { err = c.sendBatchHTTP(ctx, op, msgs) } else { err = c.send(ctx, op, msgs) @@ -417,7 +401,7 @@ func (c *Client) Notify(ctx context.Context, method string, args ...interface{}) } msg.ID = nil - if c.isHTTP() { + if c.isHTTP { return c.sendHTTP(ctx, op, msg) } return c.send(ctx, op, msg) @@ -450,12 +434,12 @@ func (c *Client) Subscribe(ctx context.Context, namespace string, channel interf // Check type of channel first. chanVal := reflect.ValueOf(channel) if chanVal.Kind() != reflect.Chan || chanVal.Type().ChanDir()&reflect.SendDir == 0 { - panic("first argument to Subscribe must be a writable channel") + panic(fmt.Sprintf("channel argument of Subscribe has type %T, need writable channel", channel)) } if chanVal.IsNil() { panic("channel given to Subscribe must not be nil") } - if c.isHTTP() { + if c.isHTTP { return nil, ErrNotificationsUnsupported } @@ -509,8 +493,8 @@ func (c *Client) send(ctx context.Context, op *requestOp, msg interface{}) error } func (c *Client) write(ctx context.Context, msg interface{}, retry bool) error { - // The previous write failed. Try to establish a new connection. if c.writeConn == nil { + // The previous write failed. Try to establish a new connection. if err := c.reconnect(ctx); err != nil { return err } @@ -657,7 +641,3 @@ func (c *Client) read(codec ServerCodec) { c.readOp <- readOp{msgs, batch} } } - -func (c *Client) isHTTP() bool { - return c.scheme == httpScheme -} diff --git a/rpc/client_test.go b/rpc/client_test.go index 224eb0c5c8..fa6010bb19 100644 --- a/rpc/client_test.go +++ b/rpc/client_test.go @@ -615,6 +615,7 @@ func TestClientReconnect(t *testing.T) { // Start a server and corresponding client. s1, l1 := startServer("127.0.0.1:0") client, err := DialContext(ctx, "ws://"+l1.Addr().String()) + defer client.Close() if err != nil { t.Fatal("can't dial", err) } diff --git a/rpc/http.go b/rpc/http.go index 32f4e7d90a..18404c060a 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -48,11 +48,18 @@ type httpConn struct { headers http.Header } -// httpConn is treated specially by Client. +// httpConn implements ServerCodec, but it is treated specially by Client +// and some methods don't work. The panic() stubs here exist to ensure +// this special treatment is correct. + func (hc *httpConn) writeJSON(context.Context, interface{}) error { panic("writeJSON called on httpConn") } +func (hc *httpConn) peerInfo() PeerInfo { + panic("peerInfo called on httpConn") +} + func (hc *httpConn) remoteAddr() string { return hc.url } @@ -174,6 +181,7 @@ func (hc *httpConn) doRequest(ctx context.Context, msg interface{}) (io.ReadClos return nil, err } req.ContentLength = int64(len(body)) + req.GetBody = func() (io.ReadCloser, error) { return ioutil.NopCloser(bytes.NewReader(body)), nil } // set headers hc.mu.Lock() @@ -236,20 +244,19 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), code) return } + + // Create request-scoped context. + connInfo := PeerInfo{Transport: "http", RemoteAddr: r.RemoteAddr} + connInfo.HTTP.Version = r.Proto + connInfo.HTTP.Host = r.Host + connInfo.HTTP.Origin = r.Header.Get("Origin") + connInfo.HTTP.UserAgent = r.Header.Get("User-Agent") + ctx := r.Context() + ctx = context.WithValue(ctx, peerInfoContextKey{}, connInfo) + // All checks passed, create a codec that reads directly from the request body // until EOF, writes the response to w, and orders the server to process a // single request. - ctx := r.Context() - ctx = context.WithValue(ctx, "remote", r.RemoteAddr) - ctx = context.WithValue(ctx, "scheme", r.Proto) - ctx = context.WithValue(ctx, "local", r.Host) - if ua := r.Header.Get("User-Agent"); ua != "" { - ctx = context.WithValue(ctx, "User-Agent", ua) - } - if origin := r.Header.Get("Origin"); origin != "" { - ctx = context.WithValue(ctx, "Origin", origin) - } - w.Header().Set("content-type", contentType) codec := newHTTPServerConn(r, w) defer codec.close() diff --git a/rpc/http_test.go b/rpc/http_test.go index 97f8d44c39..c84d7705f2 100644 --- a/rpc/http_test.go +++ b/rpc/http_test.go @@ -162,3 +162,39 @@ func TestHTTPErrorResponse(t *testing.T) { t.Error("unexpected error message", errMsg) } } + +func TestHTTPPeerInfo(t *testing.T) { + s := newTestServer() + defer s.Stop() + ts := httptest.NewServer(s) + defer ts.Close() + + c, err := Dial(ts.URL) + if err != nil { + t.Fatal(err) + } + c.SetHeader("user-agent", "ua-testing") + c.SetHeader("origin", "origin.example.com") + + // Request peer information. + var info PeerInfo + if err := c.Call(&info, "test_peerInfo"); err != nil { + t.Fatal(err) + } + + if info.RemoteAddr == "" { + t.Error("RemoteAddr not set") + } + if info.Transport != "http" { + t.Errorf("wrong Transport %q", info.Transport) + } + if info.HTTP.Version != "HTTP/1.1" { + t.Errorf("wrong HTTP.Version %q", info.HTTP.Version) + } + if info.HTTP.UserAgent != "ua-testing" { + t.Errorf("wrong HTTP.UserAgent %q", info.HTTP.UserAgent) + } + if info.HTTP.Origin != "origin.example.com" { + t.Errorf("wrong HTTP.Origin %q", info.HTTP.UserAgent) + } +} diff --git a/rpc/json.go b/rpc/json.go index 1daee3db82..6024f1e7dc 100644 --- a/rpc/json.go +++ b/rpc/json.go @@ -198,6 +198,11 @@ func NewCodec(conn Conn) ServerCodec { return NewFuncCodec(conn, enc.Encode, dec.Decode) } +func (c *jsonCodec) peerInfo() PeerInfo { + // This returns "ipc" because all other built-in transports have a separate codec type. + return PeerInfo{Transport: "ipc", RemoteAddr: c.remote} +} + func (c *jsonCodec) remoteAddr() string { return c.remote } diff --git a/rpc/server.go b/rpc/server.go index 64e078a7fd..babc5688e2 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -26,6 +26,7 @@ import ( ) const MetadataApi = "rpc" +const EngineApi = "engine" // CodecOption specifies which type of messages a codec supports. // @@ -145,3 +146,38 @@ func (s *RPCService) Modules() map[string]string { } return modules } + +// PeerInfo contains information about the remote end of the network connection. +// +// This is available within RPC method handlers through the context. Call +// PeerInfoFromContext to get information about the client connection related to +// the current method call. +type PeerInfo struct { + // Transport is name of the protocol used by the client. + // This can be "http", "ws" or "ipc". + Transport string + + // Address of client. This will usually contain the IP address and port. + RemoteAddr string + + // Addditional information for HTTP and WebSocket connections. + HTTP struct { + // Protocol version, i.e. "HTTP/1.1". This is not set for WebSocket. + Version string + // Header values sent by the client. + UserAgent string + Origin string + Host string + } +} + +type peerInfoContextKey struct{} + +// PeerInfoFromContext returns information about the client's network connection. +// Use this with the context passed to RPC method handler functions. +// +// The zero value is returned if no connection info is present in ctx. +func PeerInfoFromContext(ctx context.Context) PeerInfo { + info, _ := ctx.Value(peerInfoContextKey{}).(PeerInfo) + return info +} diff --git a/rpc/server_test.go b/rpc/server_test.go index 6a2b09e449..e67893710d 100644 --- a/rpc/server_test.go +++ b/rpc/server_test.go @@ -45,7 +45,7 @@ func TestServerRegisterName(t *testing.T) { t.Fatalf("Expected service calc to be registered") } - wantCallbacks := 9 + wantCallbacks := 10 if len(svc.callbacks) != wantCallbacks { t.Errorf("Expected %d callbacks for service 'service', got %d", wantCallbacks, len(svc.callbacks)) } @@ -134,7 +134,7 @@ func TestServerShortLivedConn(t *testing.T) { if err != nil { t.Fatal("can't dial:", err) } - defer conn.Close() + conn.SetDeadline(deadline) // Write the request, then half-close the connection so the server stops reading. conn.Write([]byte(request)) @@ -142,6 +142,8 @@ func TestServerShortLivedConn(t *testing.T) { // Now try to get the response. buf := make([]byte, 2000) n, err := conn.Read(buf) + conn.Close() + if err != nil { t.Fatal("read error:", err) } diff --git a/rpc/subscription.go b/rpc/subscription.go index 942e764e5d..d7ba784fc5 100644 --- a/rpc/subscription.go +++ b/rpc/subscription.go @@ -34,7 +34,7 @@ import ( var ( // ErrNotificationsUnsupported is returned when the connection doesn't support notifications ErrNotificationsUnsupported = errors.New("notifications not supported") - // ErrNotificationNotFound is returned when the notification for the given id is not found + // ErrSubscriptionNotFound is returned when the notification for the given id is not found ErrSubscriptionNotFound = errors.New("subscription not found") ) diff --git a/rpc/testservice_test.go b/rpc/testservice_test.go index 62afc1df44..253e263289 100644 --- a/rpc/testservice_test.go +++ b/rpc/testservice_test.go @@ -80,6 +80,10 @@ func (s *testService) EchoWithCtx(ctx context.Context, str string, i int, args * return echoResult{str, i, args} } +func (s *testService) PeerInfo(ctx context.Context) PeerInfo { + return PeerInfoFromContext(ctx) +} + func (s *testService) Sleep(ctx context.Context, duration time.Duration) { time.Sleep(duration) } diff --git a/rpc/types.go b/rpc/types.go index ca52d474d9..46b08caf68 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -30,18 +30,21 @@ import ( // API describes the set of methods offered over the RPC interface type API struct { - Namespace string // namespace under which the rpc methods of Service are exposed - Version string // api version for DApp's - Service interface{} // receiver instance which holds the methods - Public bool // indication if the methods must be considered safe for public use + Namespace string // namespace under which the rpc methods of Service are exposed + Version string // api version for DApp's + Service interface{} // receiver instance which holds the methods + Public bool // indication if the methods must be considered safe for public use + Authenticated bool // whether the api should only be available behind authentication. } // ServerCodec implements reading, parsing and writing RPC messages for the server side of // a RPC session. Implementations must be go-routine safe since the codec can be called in // multiple go-routines concurrently. type ServerCodec interface { + peerInfo() PeerInfo readBatch() (msgs []*jsonrpcMessage, isBatch bool, err error) close() + jsonWriter } diff --git a/rpc/websocket.go b/rpc/websocket.go index 5571324af8..28380d8aa4 100644 --- a/rpc/websocket.go +++ b/rpc/websocket.go @@ -60,7 +60,7 @@ func (s *Server) WebsocketHandler(allowedOrigins []string) http.Handler { log.Debug("WebSocket upgrade failed", "err", err) return } - codec := newWebsocketCodec(conn) + codec := newWebsocketCodec(conn, r.Host, r.Header) s.ServeCodec(codec, 0) }) } @@ -197,7 +197,7 @@ func DialWebsocketWithDialer(ctx context.Context, endpoint, origin string, diale } return nil, hErr } - return newWebsocketCodec(conn), nil + return newWebsocketCodec(conn, endpoint, header), nil }) } @@ -235,12 +235,13 @@ func wsClientHeaders(endpoint, origin string) (string, http.Header, error) { type websocketCodec struct { *jsonCodec conn *websocket.Conn + info PeerInfo wg sync.WaitGroup pingReset chan struct{} } -func newWebsocketCodec(conn *websocket.Conn) ServerCodec { +func newWebsocketCodec(conn *websocket.Conn, host string, req http.Header) ServerCodec { conn.SetReadLimit(wsMessageSizeLimit) conn.SetPongHandler(func(appData string) error { conn.SetReadDeadline(time.Time{}) @@ -250,7 +251,16 @@ func newWebsocketCodec(conn *websocket.Conn) ServerCodec { jsonCodec: NewFuncCodec(conn, conn.WriteJSON, conn.ReadJSON).(*jsonCodec), conn: conn, pingReset: make(chan struct{}, 1), + info: PeerInfo{ + Transport: "ws", + RemoteAddr: conn.RemoteAddr().String(), + }, } + // Fill in connection details. + wc.info.HTTP.Host = host + wc.info.HTTP.Origin = req.Get("Origin") + wc.info.HTTP.UserAgent = req.Get("User-Agent") + // Start pinger. wc.wg.Add(1) go wc.pingLoop() return wc @@ -261,6 +271,10 @@ func (wc *websocketCodec) close() { wc.wg.Wait() } +func (wc *websocketCodec) peerInfo() PeerInfo { + return wc.info +} + func (wc *websocketCodec) writeJSON(ctx context.Context, v interface{}) error { err := wc.jsonCodec.writeJSON(ctx, v) if err == nil { diff --git a/rpc/websocket_test.go b/rpc/websocket_test.go index cf83b621f1..f74b7fd08b 100644 --- a/rpc/websocket_test.go +++ b/rpc/websocket_test.go @@ -76,7 +76,7 @@ func TestWebsocketOriginCheck(t *testing.T) { // Connections without origin header should work. client, err = DialWebsocket(context.Background(), wsURL, "") if err != nil { - t.Fatal("error for empty origin") + t.Fatalf("error for empty origin: %v", err) } client.Close() } @@ -117,6 +117,41 @@ func TestWebsocketLargeCall(t *testing.T) { } } +func TestWebsocketPeerInfo(t *testing.T) { + var ( + s = newTestServer() + ts = httptest.NewServer(s.WebsocketHandler([]string{"origin.example.com"})) + tsurl = "ws:" + strings.TrimPrefix(ts.URL, "http:") + ) + defer s.Stop() + defer ts.Close() + + ctx := context.Background() + c, err := DialWebsocket(ctx, tsurl, "origin.example.com") + if err != nil { + t.Fatal(err) + } + + // Request peer information. + var connInfo PeerInfo + if err := c.Call(&connInfo, "test_peerInfo"); err != nil { + t.Fatal(err) + } + + if connInfo.RemoteAddr == "" { + t.Error("RemoteAddr not set") + } + if connInfo.Transport != "ws" { + t.Errorf("wrong Transport %q", connInfo.Transport) + } + if connInfo.HTTP.UserAgent != "Go-http-client/1.1" { + t.Errorf("wrong HTTP.UserAgent %q", connInfo.HTTP.UserAgent) + } + if connInfo.HTTP.Origin != "origin.example.com" { + t.Errorf("wrong HTTP.Origin %q", connInfo.HTTP.UserAgent) + } +} + // This test checks that client handles WebSocket ping frames correctly. func TestClientWebsocketPing(t *testing.T) { t.Parallel() diff --git a/signer/core/api.go b/signer/core/api.go index 48b54b8f43..f06fbeb76d 100644 --- a/signer/core/api.go +++ b/signer/core/api.go @@ -33,6 +33,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/signer/core/apitypes" "github.com/ethereum/go-ethereum/signer/storage" ) @@ -188,23 +189,24 @@ func StartClefAccountManager(ksLocation string, nousb, lightKDF bool, scpath str // MetadataFromContext extracts Metadata from a given context.Context func MetadataFromContext(ctx context.Context) Metadata { + info := rpc.PeerInfoFromContext(ctx) + m := Metadata{"NA", "NA", "NA", "", ""} // batman - if v := ctx.Value("remote"); v != nil { - m.Remote = v.(string) - } - if v := ctx.Value("scheme"); v != nil { - m.Scheme = v.(string) - } - if v := ctx.Value("local"); v != nil { - m.Local = v.(string) + if info.Transport != "" { + if info.Transport == "http" { + m.Scheme = info.HTTP.Version + } + m.Scheme = info.Transport } - if v := ctx.Value("Origin"); v != nil { - m.Origin = v.(string) + if info.RemoteAddr != "" { + m.Remote = info.RemoteAddr } - if v := ctx.Value("User-Agent"); v != nil { - m.UserAgent = v.(string) + if info.HTTP.Host != "" { + m.Local = info.HTTP.Host } + m.Origin = info.HTTP.Origin + m.UserAgent = info.HTTP.UserAgent return m } diff --git a/signer/core/api_test.go b/signer/core/api_test.go index 36f12f71a5..9f44ca3195 100644 --- a/signer/core/api_test.go +++ b/signer/core/api_test.go @@ -256,6 +256,9 @@ func TestSignTx(t *testing.T) { if err != nil { t.Fatal(err) } + if len(list) == 0 { + t.Fatal("Unexpected empty list") + } a := common.NewMixedcaseAddress(list[0]) methodSig := "test(uint)" diff --git a/signer/core/apitypes/types.go b/signer/core/apitypes/types.go index 15ab153416..f5c2fe2f3d 100644 --- a/signer/core/apitypes/types.go +++ b/signer/core/apitypes/types.go @@ -262,6 +262,7 @@ func (typedData *TypedData) HashStruct(primaryType string, data TypedDataMessage // Dependencies returns an array of custom types ordered by their hierarchical reference tree func (typedData *TypedData) Dependencies(primaryType string, found []string) []string { + primaryType = strings.TrimSuffix(primaryType, "[]") includes := func(arr []string, str string) bool { for _, obj := range arr { if obj == str { @@ -364,7 +365,7 @@ func (typedData *TypedData) EncodeData(primaryType string, data map[string]inter if err != nil { return nil, err } - arrayBuffer.Write(encodedData) + arrayBuffer.Write(crypto.Keccak256(encodedData)) } else { bytesValue, err := typedData.EncodePrimitiveValue(parsedType, item, depth) if err != nil { diff --git a/signer/core/gnosis_safe.go b/signer/core/gnosis_safe.go index 016b1fff3e..1b88db1afe 100644 --- a/signer/core/gnosis_safe.go +++ b/signer/core/gnosis_safe.go @@ -31,6 +31,7 @@ type GnosisSafeTx struct { SafeTxGas big.Int `json:"safeTxGas"` Nonce big.Int `json:"nonce"` InputExpHash common.Hash `json:"safeTxHash"` + ChainId *math.HexOrDecimal256 `json:"chainId,omitempty"` } // ToTypedData converts the tx to a EIP-712 Typed Data structure for signing @@ -39,9 +40,14 @@ func (tx *GnosisSafeTx) ToTypedData() apitypes.TypedData { if tx.Data != nil { data = *tx.Data } + var domainType = []apitypes.Type{{Name: "verifyingContract", Type: "address"}} + if tx.ChainId != nil { + domainType = append([]apitypes.Type{{Name: "chainId", Type: "uint256"}}, domainType[0]) + } + gnosisTypedData := apitypes.TypedData{ Types: apitypes.Types{ - "EIP712Domain": []apitypes.Type{{Name: "verifyingContract", Type: "address"}}, + "EIP712Domain": domainType, "SafeTx": []apitypes.Type{ {Name: "to", Type: "address"}, {Name: "value", Type: "uint256"}, @@ -57,6 +63,7 @@ func (tx *GnosisSafeTx) ToTypedData() apitypes.TypedData { }, Domain: apitypes.TypedDataDomain{ VerifyingContract: tx.Safe.Address().Hex(), + ChainId: tx.ChainId, }, PrimaryType: "SafeTx", Message: apitypes.TypedDataMessage{ @@ -88,6 +95,7 @@ func (tx *GnosisSafeTx) ArgsForValidation() *apitypes.SendTxArgs { Nonce: hexutil.Uint64(tx.Nonce.Uint64()), Data: tx.Data, Input: nil, + ChainID: (*hexutil.Big)(tx.ChainId), } return args } diff --git a/signer/core/signed_data_test.go b/signer/core/signed_data_test.go index 1d972d2961..fbc2903d9e 100644 --- a/signer/core/signed_data_test.go +++ b/signer/core/signed_data_test.go @@ -532,3 +532,283 @@ func TestGnosisCustomData(t *testing.T) { t.Fatalf("Error, got %x, wanted %x", sighash, expSigHash) } } + +var gnosisTypedDataWithChainId = ` +{ + "types": { + "EIP712Domain": [ + { "type": "uint256", "name": "chainId" }, + { "type": "address", "name": "verifyingContract" } + ], + "SafeTx": [ + { "type": "address", "name": "to" }, + { "type": "uint256", "name": "value" }, + { "type": "bytes", "name": "data" }, + { "type": "uint8", "name": "operation" }, + { "type": "uint256", "name": "safeTxGas" }, + { "type": "uint256", "name": "baseGas" }, + { "type": "uint256", "name": "gasPrice" }, + { "type": "address", "name": "gasToken" }, + { "type": "address", "name": "refundReceiver" }, + { "type": "uint256", "name": "nonce" } + ] + }, + "domain": { + "verifyingContract": "0x111dAE35D176A9607053e0c46e91F36AFbC1dc57", + "chainId": "4" + }, + "primaryType": "SafeTx", + "message": { + "to": "0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa", + "value": "0", + "data": "0xa9059cbb00000000000000000000000099d580d3a7fe7bd183b2464517b2cd7ce5a8f15a0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "operation": 0, + "safeTxGas": 0, + "baseGas": 0, + "gasPrice": "0", + "gasToken": "0x0000000000000000000000000000000000000000", + "refundReceiver": "0x0000000000000000000000000000000000000000", + "nonce": 15 + } +}` + +var gnosisTxWithChainId = ` +{ + "safe": "0x111dAE35D176A9607053e0c46e91F36AFbC1dc57", + "to": "0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa", + "value": "0", + "data": "0xa9059cbb00000000000000000000000099d580d3a7fe7bd183b2464517b2cd7ce5a8f15a0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "operation": 0, + "gasToken": "0x0000000000000000000000000000000000000000", + "safeTxGas": 0, + "baseGas": 0, + "gasPrice": "0", + "refundReceiver": "0x0000000000000000000000000000000000000000", + "nonce": 15, + "executionDate": "2022-01-10T20:00:12Z", + "submissionDate": "2022-01-10T19:59:59.689989Z", + "modified": "2022-01-10T20:00:31.903635Z", + "blockNumber": 9968802, + "transactionHash": "0xc9fef30499ee8984974ab9dddd9d15c2a97c1a4393935dceed5efc3af9fc41a4", + "safeTxHash": "0x6619dab5401503f2735256e12b898e69eb701d6a7e0d07abf1be4bb8aebfba29", + "executor": "0xbc2BB26a6d821e69A38016f3858561a1D80d4182", + "isExecuted": true, + "isSuccessful": true, + "ethGasPrice": "2500000009", + "gasUsed": 82902, + "fee": "207255000746118", + "chainId": "4", + "origin": null, + "dataDecoded": { + "method": "transfer", + "parameters": [ + { + "name": "to", + "type": "address", + "value": "0x99D580d3a7FE7BD183b2464517B2cD7ce5A8F15A" + }, + { + "name": "value", + "type": "uint256", + "value": "1000000000000000000" + } + ] + }, + "confirmationsRequired": 1, + "confirmations": [ + { + "owner": "0xbc2BB26a6d821e69A38016f3858561a1D80d4182", + "submissionDate": "2022-01-10T19:59:59.722500Z", + "transactionHash": null, + "signature": "0x5ca34641bcdee06e7b99143bfe34778195ca41022bd35837b96c204c7786be9d6dfa6dba43b53cd92da45ac728899e1561b232d28f38ba82df45f164caba38be1b", + "signatureType": "EOA" + } + ], + "signatures": "0x5ca34641bcdee06e7b99143bfe34778195ca41022bd35837b96c204c7786be9d6dfa6dba43b53cd92da45ac728899e1561b232d28f38ba82df45f164caba38be1b" +} +` + +func TestGnosisTypedDataWithChainId(t *testing.T) { + var td apitypes.TypedData + err := json.Unmarshal([]byte(gnosisTypedDataWithChainId), &td) + if err != nil { + t.Fatalf("unmarshalling failed '%v'", err) + } + _, sighash, err := sign(td) + if err != nil { + t.Fatal(err) + } + expSigHash := common.FromHex("0x6619dab5401503f2735256e12b898e69eb701d6a7e0d07abf1be4bb8aebfba29") + if !bytes.Equal(expSigHash, sighash) { + t.Fatalf("Error, got %x, wanted %x", sighash, expSigHash) + } +} + +// TestGnosisCustomData tests the scenario where a user submits only the gnosis-safe +// specific data, and we fill the TypedData struct on our side +func TestGnosisCustomDataWithChainId(t *testing.T) { + var tx core.GnosisSafeTx + err := json.Unmarshal([]byte(gnosisTxWithChainId), &tx) + if err != nil { + t.Fatal(err) + } + var td = tx.ToTypedData() + _, sighash, err := sign(td) + if err != nil { + t.Fatal(err) + } + expSigHash := common.FromHex("0x6619dab5401503f2735256e12b898e69eb701d6a7e0d07abf1be4bb8aebfba29") + if !bytes.Equal(expSigHash, sighash) { + t.Fatalf("Error, got %x, wanted %x", sighash, expSigHash) + } +} + +var complexTypedData = ` +{ + "types": { + "EIP712Domain": [ + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "name", + "type": "string" + }, + { + "name": "verifyingContract", + "type": "address" + }, + { + "name": "version", + "type": "string" + } + ], + "Action": [ + { + "name": "action", + "type": "string" + }, + { + "name": "params", + "type": "string" + } + ], + "Cell": [ + { + "name": "capacity", + "type": "string" + }, + { + "name": "lock", + "type": "string" + }, + { + "name": "type", + "type": "string" + }, + { + "name": "data", + "type": "string" + }, + { + "name": "extraData", + "type": "string" + } + ], + "Transaction": [ + { + "name": "DAS_MESSAGE", + "type": "string" + }, + { + "name": "inputsCapacity", + "type": "string" + }, + { + "name": "outputsCapacity", + "type": "string" + }, + { + "name": "fee", + "type": "string" + }, + { + "name": "action", + "type": "Action" + }, + { + "name": "inputs", + "type": "Cell[]" + }, + { + "name": "outputs", + "type": "Cell[]" + }, + { + "name": "digest", + "type": "bytes32" + } + ] + }, + "primaryType": "Transaction", + "domain": { + "chainId": "56", + "name": "da.systems", + "verifyingContract": "0x0000000000000000000000000000000020210722", + "version": "1" + }, + "message": { + "DAS_MESSAGE": "SELL mobcion.bit FOR 100000 CKB", + "inputsCapacity": "1216.9999 CKB", + "outputsCapacity": "1216.9998 CKB", + "fee": "0.0001 CKB", + "digest": "0x53a6c0f19ec281604607f5d6817e442082ad1882bef0df64d84d3810dae561eb", + "action": { + "action": "start_account_sale", + "params": "0x00" + }, + "inputs": [ + { + "capacity": "218 CKB", + "lock": "das-lock,0x01,0x051c152f77f8efa9c7c6d181cc97ee67c165c506...", + "type": "account-cell-type,0x01,0x", + "data": "{ account: mobcion.bit, expired_at: 1670913958 }", + "extraData": "{ status: 0, records_hash: 0x55478d76900611eb079b22088081124ed6c8bae21a05dd1a0d197efcc7c114ce }" + } + ], + "outputs": [ + { + "capacity": "218 CKB", + "lock": "das-lock,0x01,0x051c152f77f8efa9c7c6d181cc97ee67c165c506...", + "type": "account-cell-type,0x01,0x", + "data": "{ account: mobcion.bit, expired_at: 1670913958 }", + "extraData": "{ status: 1, records_hash: 0x55478d76900611eb079b22088081124ed6c8bae21a05dd1a0d197efcc7c114ce }" + }, + { + "capacity": "201 CKB", + "lock": "das-lock,0x01,0x051c152f77f8efa9c7c6d181cc97ee67c165c506...", + "type": "account-sale-cell-type,0x01,0x", + "data": "0x1209460ef3cb5f1c68ed2c43a3e020eec2d9de6e...", + "extraData": "" + } + ] + } +} +` + +func TestComplexTypedData(t *testing.T) { + var td apitypes.TypedData + err := json.Unmarshal([]byte(complexTypedData), &td) + if err != nil { + t.Fatalf("unmarshalling failed '%v'", err) + } + _, sighash, err := sign(td) + if err != nil { + t.Fatal(err) + } + expSigHash := common.FromHex("0x42b1aca82bb6900ff75e90a136de550a58f1a220a071704088eabd5e6ce20446") + if !bytes.Equal(expSigHash, sighash) { + t.Fatalf("Error, got %x, wanted %x", sighash, expSigHash) + } +} diff --git a/signer/fourbyte/abi.go b/signer/fourbyte/abi.go index d8fbabd3b1..352abc59e1 100644 --- a/signer/fourbyte/abi.go +++ b/signer/fourbyte/abi.go @@ -20,7 +20,6 @@ import ( "bytes" "encoding/json" "fmt" - "regexp" "strings" "github.com/ethereum/go-ethereum/accounts/abi" @@ -75,42 +74,15 @@ func verifySelector(selector string, calldata []byte) (*decodedCallData, error) return parseCallData(calldata, string(abidata)) } -// selectorRegexp is used to validate that a 4byte database selector corresponds -// to a valid ABI function declaration. -// -// Note, although uppercase letters are not part of the ABI spec, this regexp -// still accepts it as the general format is valid. It will be rejected later -// by the type checker. -var selectorRegexp = regexp.MustCompile(`^([^\)]+)\(([A-Za-z0-9,\[\]]*)\)`) - // parseSelector converts a method selector into an ABI JSON spec. The returned // data is a valid JSON string which can be consumed by the standard abi package. func parseSelector(unescapedSelector string) ([]byte, error) { - // Define a tiny fake ABI struct for JSON marshalling - type fakeArg struct { - Type string `json:"type"` - } - type fakeABI struct { - Name string `json:"name"` - Type string `json:"type"` - Inputs []fakeArg `json:"inputs"` - } - // Validate the unescapedSelector and extract it's components - groups := selectorRegexp.FindStringSubmatch(unescapedSelector) - if len(groups) != 3 { - return nil, fmt.Errorf("invalid selector %q (%v matches)", unescapedSelector, len(groups)) + selector, err := abi.ParseSelector(unescapedSelector) + if err != nil { + return nil, fmt.Errorf("failed to parse selector: %v", err) } - name := groups[1] - args := groups[2] - // Reassemble the fake ABI and constuct the JSON - arguments := make([]fakeArg, 0) - if len(args) > 0 { - for _, arg := range strings.Split(args, ",") { - arguments = append(arguments, fakeArg{arg}) - } - } - return json.Marshal([]fakeABI{{name, "function", arguments}}) + return json.Marshal([]abi.SelectorMarshaling{selector}) } // parseCallData matches the provided call data against the ABI definition and diff --git a/tests/evm-benchmarks b/tests/evm-benchmarks new file mode 160000 index 0000000000..849b3e239a --- /dev/null +++ b/tests/evm-benchmarks @@ -0,0 +1 @@ +Subproject commit 849b3e239a28f236dc99574b2e10e0c720895105 diff --git a/tests/fuzzers/bn256/bn256_fuzz.go b/tests/fuzzers/bn256/bn256_fuzz.go index 030ac19b3f..11fd9e18df 100644 --- a/tests/fuzzers/bn256/bn256_fuzz.go +++ b/tests/fuzzers/bn256/bn256_fuzz.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. +//go:build gofuzz // +build gofuzz package bn256 diff --git a/tests/fuzzers/secp256k1/secp_fuzzer.go b/tests/fuzzers/secp256k1/secp_fuzzer.go index 53845b6433..47083d5fe3 100644 --- a/tests/fuzzers/secp256k1/secp_fuzzer.go +++ b/tests/fuzzers/secp256k1/secp_fuzzer.go @@ -21,7 +21,7 @@ package secp256k1 import ( "fmt" - "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/btcec/v2" "github.com/ethereum/go-ethereum/crypto/secp256k1" fuzz "github.com/google/gofuzz" ) diff --git a/tests/fuzzers/stacktrie/trie_fuzzer.go b/tests/fuzzers/stacktrie/trie_fuzzer.go index e73ef4851a..9ed8bcbc51 100644 --- a/tests/fuzzers/stacktrie/trie_fuzzer.go +++ b/tests/fuzzers/stacktrie/trie_fuzzer.go @@ -66,6 +66,8 @@ func (s *spongeDb) Has(key []byte) (bool, error) { panic("implement func (s *spongeDb) Get(key []byte) ([]byte, error) { return nil, errors.New("no such elem") } func (s *spongeDb) Delete(key []byte) error { panic("implement me") } func (s *spongeDb) NewBatch() ethdb.Batch { return &spongeBatch{s} } +func (s *spongeDb) NewBatchWithSize(size int) ethdb.Batch { return &spongeBatch{s} } +func (s *spongeDb) NewSnapshot() (ethdb.Snapshot, error) { panic("implement me") } func (s *spongeDb) Stat(property string) (string, error) { panic("implement me") } func (s *spongeDb) Compact(start []byte, limit []byte) error { panic("implement me") } func (s *spongeDb) Close() error { return nil } diff --git a/tests/fuzzers/vflux/clientpool-fuzzer.go b/tests/fuzzers/vflux/clientpool-fuzzer.go index 0414c001ec..b3b523cc82 100644 --- a/tests/fuzzers/vflux/clientpool-fuzzer.go +++ b/tests/fuzzers/vflux/clientpool-fuzzer.go @@ -267,9 +267,7 @@ func FuzzClientPool(input []byte) int { bias = f.randomDelay() requested = f.randomBool() ) - if _, err := pool.SetCapacity(f.peers[index].node, reqCap, bias, requested); err == vfs.ErrCantFindMaximum { - panic(nil) - } + pool.SetCapacity(f.peers[index].node, reqCap, bias, requested) doLog("Set capacity", "id", f.peers[index].node.ID(), "reqcap", reqCap, "bias", bias, "requested", requested) case 7: index := f.randomByte() diff --git a/tests/gen_stenv.go b/tests/gen_stenv.go index ecf7af8503..29fbce1213 100644 --- a/tests/gen_stenv.go +++ b/tests/gen_stenv.go @@ -17,7 +17,8 @@ var _ = (*stEnvMarshaling)(nil) func (s stEnv) MarshalJSON() ([]byte, error) { type stEnv struct { Coinbase common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"` - Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"required"` + Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"optional"` + Random *math.HexOrDecimal256 `json:"currentRandom" gencodec:"optional"` GasLimit math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"` Number math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"` Timestamp math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"` @@ -26,6 +27,7 @@ func (s stEnv) MarshalJSON() ([]byte, error) { var enc stEnv enc.Coinbase = common.UnprefixedAddress(s.Coinbase) enc.Difficulty = (*math.HexOrDecimal256)(s.Difficulty) + enc.Random = (*math.HexOrDecimal256)(s.Random) enc.GasLimit = math.HexOrDecimal64(s.GasLimit) enc.Number = math.HexOrDecimal64(s.Number) enc.Timestamp = math.HexOrDecimal64(s.Timestamp) @@ -37,7 +39,8 @@ func (s stEnv) MarshalJSON() ([]byte, error) { func (s *stEnv) UnmarshalJSON(input []byte) error { type stEnv struct { Coinbase *common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"` - Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"required"` + Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"optional"` + Random *math.HexOrDecimal256 `json:"currentRandom" gencodec:"optional"` GasLimit *math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"` Number *math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"` Timestamp *math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"` @@ -51,10 +54,12 @@ func (s *stEnv) UnmarshalJSON(input []byte) error { return errors.New("missing required field 'currentCoinbase' for stEnv") } s.Coinbase = common.Address(*dec.Coinbase) - if dec.Difficulty == nil { - return errors.New("missing required field 'currentDifficulty' for stEnv") + if dec.Difficulty != nil { + s.Difficulty = (*big.Int)(dec.Difficulty) + } + if dec.Random != nil { + s.Random = (*big.Int)(dec.Random) } - s.Difficulty = (*big.Int)(dec.Difficulty) if dec.GasLimit == nil { return errors.New("missing required field 'currentGasLimit' for stEnv") } diff --git a/tests/init_test.go b/tests/init_test.go index 312ad8869a..7e2f3ff7f5 100644 --- a/tests/init_test.go +++ b/tests/init_test.go @@ -41,6 +41,7 @@ var ( transactionTestDir = filepath.Join(baseDir, "TransactionTests") rlpTestDir = filepath.Join(baseDir, "RLPTests") difficultyTestDir = filepath.Join(baseDir, "BasicTests") + benchmarksDir = filepath.Join(".", "evm-benchmarks", "benchmarks") ) func readJSON(reader io.Reader, value interface{}) error { diff --git a/tests/state_test.go b/tests/state_test.go index 78ecda0409..d2c92b211c 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -20,9 +20,16 @@ import ( "bufio" "bytes" "fmt" + "math/big" + "os" + "path/filepath" "reflect" + "strings" "testing" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/tracers/logger" ) @@ -61,6 +68,7 @@ func TestState(t *testing.T) { for _, dir := range []string{ stateTestDir, legacyStateTestDir, + benchmarksDir, } { st.walk(t, dir, func(t *testing.T, name string, test *StateTest) { for _, subtest := range test.Subtests() { @@ -131,3 +139,116 @@ func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { // t.Logf("EVM output: 0x%x", tracer.Output()) // t.Logf("EVM error: %v", tracer.Error()) } + +func BenchmarkEVM(b *testing.B) { + // Walk the directory. + dir := benchmarksDir + dirinfo, err := os.Stat(dir) + if os.IsNotExist(err) || !dirinfo.IsDir() { + fmt.Fprintf(os.Stderr, "can't find test files in %s, did you clone the evm-benchmarks submodule?\n", dir) + b.Skip("missing test files") + } + err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if info.IsDir() { + return nil + } + if ext := filepath.Ext(path); ext == ".json" { + name := filepath.ToSlash(strings.TrimPrefix(strings.TrimSuffix(path, ext), dir+string(filepath.Separator))) + b.Run(name, func(b *testing.B) { runBenchmarkFile(b, path) }) + } + return nil + }) + if err != nil { + b.Fatal(err) + } +} + +func runBenchmarkFile(b *testing.B, path string) { + m := make(map[string]StateTest) + if err := readJSONFile(path, &m); err != nil { + b.Fatal(err) + return + } + if len(m) != 1 { + b.Fatal("expected single benchmark in a file") + return + } + for _, t := range m { + runBenchmark(b, &t) + } +} + +func runBenchmark(b *testing.B, t *StateTest) { + for _, subtest := range t.Subtests() { + subtest := subtest + key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index) + + b.Run(key, func(b *testing.B) { + vmconfig := vm.Config{} + + config, eips, err := GetChainConfig(subtest.Fork) + if err != nil { + b.Error(err) + return + } + vmconfig.ExtraEips = eips + block := t.genesis(config).ToBlock(nil) + _, statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre, false) + + var baseFee *big.Int + if config.IsLondon(new(big.Int)) { + baseFee = t.json.Env.BaseFee + if baseFee == nil { + // Retesteth uses `0x10` for genesis baseFee. Therefore, it defaults to + // parent - 2 : 0xa as the basefee for 'this' context. + baseFee = big.NewInt(0x0a) + } + } + post := t.json.Post[subtest.Fork][subtest.Index] + msg, err := t.json.Tx.toMessage(post, baseFee) + if err != nil { + b.Error(err) + return + } + + // Try to recover tx with current signer + if len(post.TxBytes) != 0 { + var ttx types.Transaction + err := ttx.UnmarshalBinary(post.TxBytes) + if err != nil { + b.Error(err) + return + } + + if _, err := types.Sender(types.LatestSigner(config), &ttx); err != nil { + b.Error(err) + return + } + } + + // Prepare the EVM. + txContext := core.NewEVMTxContext(msg) + context := core.NewEVMBlockContext(block.Header(), nil, &t.json.Env.Coinbase) + context.GetHash = vmTestBlockHash + context.BaseFee = baseFee + evm := vm.NewEVM(context, txContext, statedb, config, vmconfig) + + // Create "contract" for sender to cache code analysis. + sender := vm.NewContract(vm.AccountRef(msg.From()), vm.AccountRef(msg.From()), + nil, 0) + + b.ResetTimer() + for n := 0; n < b.N; n++ { + // Execute the message. + snapshot := statedb.Snapshot() + _, _, err = evm.Call(sender, *msg.To(), msg.Data(), msg.Gas(), msg.Value()) + if err != nil { + b.Error(err) + return + } + statedb.RevertToSnapshot(snapshot) + } + + }) + } +} diff --git a/tests/state_test_util.go b/tests/state_test_util.go index f7fb08bfbc..4fd3cf76b2 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -80,16 +80,18 @@ type stPostState struct { type stEnv struct { Coinbase common.Address `json:"currentCoinbase" gencodec:"required"` - Difficulty *big.Int `json:"currentDifficulty" gencodec:"required"` + Difficulty *big.Int `json:"currentDifficulty" gencodec:"optional"` + Random *big.Int `json:"currentRandom" gencodec:"optional"` GasLimit uint64 `json:"currentGasLimit" gencodec:"required"` Number uint64 `json:"currentNumber" gencodec:"required"` Timestamp uint64 `json:"currentTimestamp" gencodec:"required"` - BaseFee *big.Int `json:"currentBaseFee" gencodec:"optional"` + BaseFee *big.Int `json:"currentBaseFee" gencodec:"optional"` } type stEnvMarshaling struct { Coinbase common.UnprefixedAddress Difficulty *math.HexOrDecimal256 + Random *math.HexOrDecimal256 GasLimit math.HexOrDecimal64 Number math.HexOrDecimal64 Timestamp math.HexOrDecimal64 @@ -218,8 +220,12 @@ func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapsh context := core.NewEVMBlockContext(block.Header(), nil, &t.json.Env.Coinbase) context.GetHash = vmTestBlockHash context.BaseFee = baseFee + if t.json.Env.Random != nil { + rnd := common.BigToHash(t.json.Env.Random) + context.Random = &rnd + context.Difficulty = big.NewInt(0) + } evm := vm.NewEVM(context, txContext, statedb, config, vmconfig) - // Execute the message. snapshot := statedb.Snapshot() gaspool := new(core.GasPool) @@ -268,7 +274,7 @@ func MakePreState(db ethdb.Database, accounts core.GenesisAlloc, snapshotter boo } func (t *StateTest) genesis(config *params.ChainConfig) *core.Genesis { - return &core.Genesis{ + genesis := &core.Genesis{ Config: config, Coinbase: t.json.Env.Coinbase, Difficulty: t.json.Env.Difficulty, @@ -277,6 +283,12 @@ func (t *StateTest) genesis(config *params.ChainConfig) *core.Genesis { Timestamp: t.json.Env.Timestamp, Alloc: t.json.Pre, } + if t.json.Env.Random != nil { + // Post-Merge + genesis.Mixhash = common.BigToHash(t.json.Env.Random) + genesis.Difficulty = big.NewInt(0) + } + return genesis } func (tx *stTransaction) toMessage(ps stPostState, baseFee *big.Int) (core.Message, error) { diff --git a/trie/committer.go b/trie/committer.go index 0721990a21..db753e2fa0 100644 --- a/trie/committer.go +++ b/trie/committer.go @@ -44,7 +44,6 @@ type leaf struct { // By 'some level' of parallelism, it's still the case that all leaves will be // processed sequentially - onleaf will never be called in parallel or out of order. type committer struct { - tmp sliceBuffer sha crypto.KeccakState onleaf LeafCallback @@ -55,7 +54,6 @@ type committer struct { var committerPool = sync.Pool{ New: func() interface{} { return &committer{ - tmp: make(sliceBuffer, 0, 550), // cap is as large as a full fullNode. sha: sha3.NewLegacyKeccak256().(crypto.KeccakState), } }, diff --git a/trie/database.go b/trie/database.go index 58ca4e6f3c..d71abeee47 100644 --- a/trie/database.go +++ b/trie/database.go @@ -113,16 +113,9 @@ func (n rawFullNode) cache() (hashNode, bool) { panic("this should never end u func (n rawFullNode) fstring(ind string) string { panic("this should never end up in a live trie") } func (n rawFullNode) EncodeRLP(w io.Writer) error { - var nodes [17]node - - for i, child := range n { - if child != nil { - nodes[i] = child - } else { - nodes[i] = nilValueNode - } - } - return rlp.Encode(w, nodes) + eb := rlp.NewEncoderBuffer(w) + n.encode(eb) + return eb.Flush() } // rawShortNode represents only the useful data content of a short node, with the @@ -164,11 +157,7 @@ func (n *cachedNode) rlp() []byte { if node, ok := n.node.(rawNode); ok { return node } - blob, err := rlp.EncodeToBytes(n.node) - if err != nil { - panic(err) - } - return blob + return nodeToBytes(n.node) } // obj returns the decoded and expanded trie node, either directly from the cache, diff --git a/trie/hasher.go b/trie/hasher.go index 3a62a2f119..7f0748c13d 100644 --- a/trie/hasher.go +++ b/trie/hasher.go @@ -24,22 +24,12 @@ import ( "golang.org/x/crypto/sha3" ) -type sliceBuffer []byte - -func (b *sliceBuffer) Write(data []byte) (n int, err error) { - *b = append(*b, data...) - return len(data), nil -} - -func (b *sliceBuffer) Reset() { - *b = (*b)[:0] -} - // hasher is a type used for the trie Hash operation. A hasher has some // internal preallocated temp space type hasher struct { sha crypto.KeccakState - tmp sliceBuffer + tmp []byte + encbuf rlp.EncoderBuffer parallel bool // Whether to use paralallel threads when hashing } @@ -47,8 +37,9 @@ type hasher struct { var hasherPool = sync.Pool{ New: func() interface{} { return &hasher{ - tmp: make(sliceBuffer, 0, 550), // cap is as large as a full fullNode. - sha: sha3.NewLegacyKeccak256().(crypto.KeccakState), + tmp: make([]byte, 0, 550), // cap is as large as a full fullNode. + sha: sha3.NewLegacyKeccak256().(crypto.KeccakState), + encbuf: rlp.NewEncoderBuffer(nil), } }, } @@ -153,30 +144,41 @@ func (h *hasher) hashFullNodeChildren(n *fullNode) (collapsed *fullNode, cached // into compact form for RLP encoding. // If the rlp data is smaller than 32 bytes, `nil` is returned. func (h *hasher) shortnodeToHash(n *shortNode, force bool) node { - h.tmp.Reset() - if err := rlp.Encode(&h.tmp, n); err != nil { - panic("encode error: " + err.Error()) - } + n.encode(h.encbuf) + enc := h.encodedBytes() - if len(h.tmp) < 32 && !force { + if len(enc) < 32 && !force { return n // Nodes smaller than 32 bytes are stored inside their parent } - return h.hashData(h.tmp) + return h.hashData(enc) } // shortnodeToHash is used to creates a hashNode from a set of hashNodes, (which // may contain nil values) func (h *hasher) fullnodeToHash(n *fullNode, force bool) node { - h.tmp.Reset() - // Generate the RLP encoding of the node - if err := n.EncodeRLP(&h.tmp); err != nil { - panic("encode error: " + err.Error()) - } + n.encode(h.encbuf) + enc := h.encodedBytes() - if len(h.tmp) < 32 && !force { + if len(enc) < 32 && !force { return n // Nodes smaller than 32 bytes are stored inside their parent } - return h.hashData(h.tmp) + return h.hashData(enc) +} + +// encodedBytes returns the result of the last encoding operation on h.encbuf. +// This also resets the encoder buffer. +// +// All node encoding must be done like this: +// +// node.encode(h.encbuf) +// enc := h.encodedBytes() +// +// This convention exists because node.encode can only be inlined/escape-analyzed when +// called on a concrete receiver type. +func (h *hasher) encodedBytes() []byte { + h.tmp = h.encbuf.AppendToBytes(h.tmp[:0]) + h.encbuf.Reset(nil) + return h.tmp } // hashData hashes the provided data diff --git a/trie/iterator.go b/trie/iterator.go index 654772aa13..e0006ee05e 100644 --- a/trie/iterator.go +++ b/trie/iterator.go @@ -23,7 +23,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/rlp" ) // Iterator is a key-value trie iterator that traverses a Trie. @@ -86,6 +85,10 @@ type NodeIterator interface { // For leaf nodes, the last element of the path is the 'terminator symbol' 0x10. Path() []byte + // NodeBlob returns the rlp-encoded value of the current iterated node. + // If the node is an embedded node in its parent, nil is returned then. + NodeBlob() []byte + // Leaf returns true iff the current node is a leaf node. Leaf() bool @@ -115,7 +118,7 @@ type NodeIterator interface { // Before adding a similar mechanism to any other place in Geth, consider // making trie.Database an interface and wrapping at that level. It's a huge // refactor, but it could be worth it if another occurrence arises. - AddResolver(ethdb.KeyValueStore) + AddResolver(ethdb.KeyValueReader) } // nodeIteratorState represents the iteration state at one particular node of the @@ -134,7 +137,7 @@ type nodeIterator struct { path []byte // Path to the current node err error // Failure set in case of an internal error in the iterator - resolver ethdb.KeyValueStore // Optional intermediate resolver above the disk layer + resolver ethdb.KeyValueReader // Optional intermediate resolver above the disk layer } // errIteratorEnd is stored in nodeIterator.err when iteration is done. @@ -151,15 +154,18 @@ func (e seekError) Error() string { } func newNodeIterator(trie *Trie, start []byte) NodeIterator { - if trie.Hash() == emptyState { - return new(nodeIterator) + if trie.Hash() == emptyRoot { + return &nodeIterator{ + trie: trie, + err: errIteratorEnd, + } } it := &nodeIterator{trie: trie} it.err = it.seek(start) return it } -func (it *nodeIterator) AddResolver(resolver ethdb.KeyValueStore) { +func (it *nodeIterator) AddResolver(resolver ethdb.KeyValueReader) { it.resolver = resolver } @@ -210,8 +216,7 @@ func (it *nodeIterator) LeafProof() [][]byte { // Gather nodes that end up as hash nodes (or the root) node, hashed := hasher.proofHash(item.node) if _, ok := hashed.(hashNode); ok || i == 0 { - enc, _ := rlp.EncodeToBytes(node) - proofs = append(proofs, enc) + proofs = append(proofs, nodeToBytes(node)) } } return proofs @@ -224,6 +229,18 @@ func (it *nodeIterator) Path() []byte { return it.path } +func (it *nodeIterator) NodeBlob() []byte { + if it.Hash() == (common.Hash{}) { + return nil // skip the non-standalone node + } + blob, err := it.resolveBlob(it.Hash().Bytes(), it.Path()) + if err != nil { + it.err = err + return nil + } + return blob +} + func (it *nodeIterator) Error() error { if it.err == errIteratorEnd { return nil @@ -362,6 +379,15 @@ func (it *nodeIterator) resolveHash(hash hashNode, path []byte) (node, error) { return resolved, err } +func (it *nodeIterator) resolveBlob(hash hashNode, path []byte) ([]byte, error) { + if it.resolver != nil { + if blob, err := it.resolver.Get(hash); err == nil && len(blob) > 0 { + return blob, nil + } + } + return it.trie.resolveBlob(hash, path) +} + func (st *nodeIteratorState) resolve(it *nodeIterator, path []byte) error { if hash, ok := st.node.(hashNode); ok { resolved, err := it.resolveHash(hash, path) @@ -402,7 +428,7 @@ func findChild(n *fullNode, index int, path []byte, ancestor common.Hash) (node, func (it *nodeIterator) nextChild(parent *nodeIteratorState, ancestor common.Hash) (*nodeIteratorState, []byte, bool) { switch node := parent.node.(type) { case *fullNode: - //Full node, move to the first non-nil child. + // Full node, move to the first non-nil child. if child, state, path, index := findChild(node, parent.index+1, it.path, ancestor); child != nil { parent.index = index - 1 return state, path, true @@ -480,8 +506,9 @@ func (it *nodeIterator) push(state *nodeIteratorState, parentIndex *int, path [] } func (it *nodeIterator) pop() { - parent := it.stack[len(it.stack)-1] - it.path = it.path[:parent.pathlen] + last := it.stack[len(it.stack)-1] + it.path = it.path[:last.pathlen] + it.stack[len(it.stack)-1] = nil it.stack = it.stack[:len(it.stack)-1] } @@ -549,7 +576,11 @@ func (it *differenceIterator) Path() []byte { return it.b.Path() } -func (it *differenceIterator) AddResolver(resolver ethdb.KeyValueStore) { +func (it *differenceIterator) NodeBlob() []byte { + return it.b.NodeBlob() +} + +func (it *differenceIterator) AddResolver(resolver ethdb.KeyValueReader) { panic("not implemented") } @@ -660,7 +691,11 @@ func (it *unionIterator) Path() []byte { return (*it.items)[0].Path() } -func (it *unionIterator) AddResolver(resolver ethdb.KeyValueStore) { +func (it *unionIterator) NodeBlob() []byte { + return (*it.items)[0].NodeBlob() +} + +func (it *unionIterator) AddResolver(resolver ethdb.KeyValueReader) { panic("not implemented") } diff --git a/trie/iterator_test.go b/trie/iterator_test.go index 95cafdd3bd..9a46e9b995 100644 --- a/trie/iterator_test.go +++ b/trie/iterator_test.go @@ -29,6 +29,19 @@ import ( "github.com/ethereum/go-ethereum/ethdb/memorydb" ) +func TestEmptyIterator(t *testing.T) { + trie := newEmpty() + iter := trie.NodeIterator(nil) + + seen := make(map[string]struct{}) + for iter.Next(true) { + seen[string(iter.Path())] = struct{}{} + } + if len(seen) != 0 { + t.Fatal("Unexpected trie node iterated") + } +} + func TestIterator(t *testing.T) { trie := newEmpty() vals := []struct{ k, v string }{ @@ -470,10 +483,18 @@ func (l *loggingDb) NewBatch() ethdb.Batch { return l.backend.NewBatch() } +func (l *loggingDb) NewBatchWithSize(size int) ethdb.Batch { + return l.backend.NewBatchWithSize(size) +} + func (l *loggingDb) NewIterator(prefix []byte, start []byte) ethdb.Iterator { - fmt.Printf("NewIterator\n") return l.backend.NewIterator(prefix, start) } + +func (l *loggingDb) NewSnapshot() (ethdb.Snapshot, error) { + return l.backend.NewSnapshot() +} + func (l *loggingDb) Stat(property string) (string, error) { return l.backend.Stat(property) } @@ -521,3 +542,54 @@ func TestNodeIteratorLargeTrie(t *testing.T) { t.Fatalf("Too many lookups during seek, have %d want %d", have, want) } } + +func TestIteratorNodeBlob(t *testing.T) { + var ( + db = memorydb.New() + triedb = NewDatabase(db) + trie, _ = New(common.Hash{}, triedb) + ) + vals := []struct{ k, v string }{ + {"do", "verb"}, + {"ether", "wookiedoo"}, + {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"dog", "puppy"}, + {"somethingveryoddindeedthis is", "myothernodedata"}, + } + all := make(map[string]string) + for _, val := range vals { + all[val.k] = val.v + trie.Update([]byte(val.k), []byte(val.v)) + } + trie.Commit(nil) + triedb.Cap(0) + + found := make(map[common.Hash][]byte) + it := trie.NodeIterator(nil) + for it.Next(true) { + if it.Hash() == (common.Hash{}) { + continue + } + found[it.Hash()] = it.NodeBlob() + } + + dbIter := db.NewIterator(nil, nil) + defer dbIter.Release() + + var count int + for dbIter.Next() { + got, present := found[common.BytesToHash(dbIter.Key())] + if !present { + t.Fatalf("Miss trie node %v", dbIter.Key()) + } + if !bytes.Equal(got, dbIter.Value()) { + t.Fatalf("Unexpected trie node want %v got %v", dbIter.Value(), got) + } + count += 1 + } + if count != len(found) { + t.Fatal("Find extra trie node via iterator") + } +} diff --git a/trie/node.go b/trie/node.go index f4055e779a..bf3f024bb8 100644 --- a/trie/node.go +++ b/trie/node.go @@ -28,8 +28,9 @@ import ( var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "[17]"} type node interface { - fstring(string) string cache() (hashNode, bool) + encode(w rlp.EncoderBuffer) + fstring(string) string } type ( @@ -52,16 +53,9 @@ var nilValueNode = valueNode(nil) // EncodeRLP encodes a full node into the consensus RLP format. func (n *fullNode) EncodeRLP(w io.Writer) error { - var nodes [17]node - - for i, child := range &n.Children { - if child != nil { - nodes[i] = child - } else { - nodes[i] = nilValueNode - } - } - return rlp.Encode(w, nodes) + eb := rlp.NewEncoderBuffer(w) + n.encode(eb) + return eb.Flush() } func (n *fullNode) copy() *fullNode { copy := *n; return © } diff --git a/trie/node_enc.go b/trie/node_enc.go new file mode 100644 index 0000000000..cade35b707 --- /dev/null +++ b/trie/node_enc.go @@ -0,0 +1,87 @@ +// Copyright 2022 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 . + +package trie + +import ( + "github.com/ethereum/go-ethereum/rlp" +) + +func nodeToBytes(n node) []byte { + w := rlp.NewEncoderBuffer(nil) + n.encode(w) + result := w.ToBytes() + w.Flush() + return result +} + +func (n *fullNode) encode(w rlp.EncoderBuffer) { + offset := w.List() + for _, c := range n.Children { + if c != nil { + c.encode(w) + } else { + w.Write(rlp.EmptyString) + } + } + w.ListEnd(offset) +} + +func (n *shortNode) encode(w rlp.EncoderBuffer) { + offset := w.List() + w.WriteBytes(n.Key) + if n.Val != nil { + n.Val.encode(w) + } else { + w.Write(rlp.EmptyString) + } + w.ListEnd(offset) +} + +func (n hashNode) encode(w rlp.EncoderBuffer) { + w.WriteBytes(n) +} + +func (n valueNode) encode(w rlp.EncoderBuffer) { + w.WriteBytes(n) +} + +func (n rawFullNode) encode(w rlp.EncoderBuffer) { + offset := w.List() + for _, c := range n { + if c != nil { + c.encode(w) + } else { + w.Write(rlp.EmptyString) + } + } + w.ListEnd(offset) +} + +func (n *rawShortNode) encode(w rlp.EncoderBuffer) { + offset := w.List() + w.WriteBytes(n.Key) + if n.Val != nil { + n.Val.encode(w) + } else { + w.Write(rlp.EmptyString) + } + w.ListEnd(offset) +} + +func (n rawNode) encode(w rlp.EncoderBuffer) { + w.Write(n) +} diff --git a/trie/proof.go b/trie/proof.go index 51ecea0c39..88ca80b0e7 100644 --- a/trie/proof.go +++ b/trie/proof.go @@ -25,7 +25,6 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethdb/memorydb" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rlp" ) // Prove constructs a merkle proof for key. The result contains all encoded nodes @@ -79,7 +78,7 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) e if hash, ok := hn.(hashNode); ok || i == 0 { // If the node's database encoding is a hash (or is the // root node), it becomes a proof element. - enc, _ := rlp.EncodeToBytes(n) + enc := nodeToBytes(n) if !ok { hash = hasher.hashData(enc) } @@ -406,7 +405,7 @@ func unset(parent node, child node, key []byte, pos int, removeLeft bool) error } // hasRightElement returns the indicator whether there exists more elements -// in the right side of the given path. The given path can point to an existent +// on the right side of the given path. The given path can point to an existent // key or a non-existent one. This function has the assumption that the whole // path should already be resolved. func hasRightElement(node node, key []byte) bool { @@ -505,7 +504,7 @@ func VerifyRangeProof(rootHash common.Hash, firstKey []byte, lastKey []byte, key if val != nil || hasRightElement(root, firstKey) { return false, errors.New("more entries available") } - return hasRightElement(root, firstKey), nil + return false, nil } // Special case, there is only one element and two edge keys are same. // In this case, we can't construct two edge paths. So handle it here. @@ -563,7 +562,7 @@ func VerifyRangeProof(rootHash common.Hash, firstKey []byte, lastKey []byte, key if tr.Hash() != rootHash { return false, fmt.Errorf("invalid proof, want hash %x, got %x", rootHash, tr.Hash()) } - return hasRightElement(root, keys[len(keys)-1]), nil + return hasRightElement(tr.root, keys[len(keys)-1]), nil } // get returns the child of the given node. Return nil if the diff --git a/trie/proof_test.go b/trie/proof_test.go index 95ad6169c3..29866714c2 100644 --- a/trie/proof_test.go +++ b/trie/proof_test.go @@ -1067,3 +1067,36 @@ func nonRandomTrie(n int) (*Trie, map[string]*kv) { } return trie, vals } + +func TestRangeProofKeysWithSharedPrefix(t *testing.T) { + keys := [][]byte{ + common.Hex2Bytes("aa10000000000000000000000000000000000000000000000000000000000000"), + common.Hex2Bytes("aa20000000000000000000000000000000000000000000000000000000000000"), + } + vals := [][]byte{ + common.Hex2Bytes("02"), + common.Hex2Bytes("03"), + } + trie := new(Trie) + for i, key := range keys { + trie.Update(key, vals[i]) + } + root := trie.Hash() + proof := memorydb.New() + start := common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000") + end := common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") + if err := trie.Prove(start, 0, proof); err != nil { + t.Fatalf("failed to prove start: %v", err) + } + if err := trie.Prove(end, 0, proof); err != nil { + t.Fatalf("failed to prove end: %v", err) + } + + more, err := VerifyRangeProof(root, start, end, keys, vals, proof) + if err != nil { + t.Fatalf("failed to verify range proof: %v", err) + } + if more != false { + t.Error("expected more to be false") + } +} diff --git a/trie/stacktrie.go b/trie/stacktrie.go index 76258c3112..4b7ccd42db 100644 --- a/trie/stacktrie.go +++ b/trie/stacktrie.go @@ -28,7 +28,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rlp" ) var ErrCommitDisabled = errors.New("no database for committing") @@ -233,6 +232,7 @@ func (st *StackTrie) insert(key, value []byte) { break } } + // Add new child if st.children[idx] == nil { st.children[idx] = newLeaf(key[1:], value, st.db) @@ -326,10 +326,9 @@ func (st *StackTrie) insert(key, value []byte) { p = st.children[0] } - // Create the two child leaves: the one containing the - // original value and the one containing the new value - // The child leave will be hashed directly in order to - // free up some memory. + // Create the two child leaves: one containing the original + // value and another containing the new value. The child leaf + // is hashed directly in order to free up some memory. origIdx := st.key[diffidx] p.children[origIdx] = newLeaf(st.key[diffidx+1:], st.val, st.db) p.children[origIdx].hash() @@ -341,19 +340,22 @@ func (st *StackTrie) insert(key, value []byte) { // over to the children. st.key = st.key[:diffidx] st.val = nil + case emptyNode: /* Empty */ st.nodeType = leafNode st.key = key st.val = value + case hashedNode: panic("trying to insert into hash") + default: panic("invalid type") } } -// hash() hashes the node 'st' and converts it into 'hashedNode', if possible. -// Possible outcomes: +// hash converts st into a 'hashedNode', if possible. Possible outcomes: +// // 1. The rlp-encoded value was >= 32 bytes: // - Then the 32-byte `hash` will be accessible in `st.val`. // - And the 'st.type' will be 'hashedNode' @@ -361,119 +363,116 @@ func (st *StackTrie) insert(key, value []byte) { // - Then the <32 byte rlp-encoded value will be accessible in 'st.val'. // - And the 'st.type' will be 'hashedNode' AGAIN // -// This method will also: -// set 'st.type' to hashedNode -// clear 'st.key' +// This method also sets 'st.type' to hashedNode, and clears 'st.key'. func (st *StackTrie) hash() { - /* Shortcut if node is already hashed */ - if st.nodeType == hashedNode { - return - } - // The 'hasher' is taken from a pool, but we don't actually - // claim an instance until all children are done with their hashing, - // and we actually need one - var h *hasher + h := newHasher(false) + defer returnHasherToPool(h) + + st.hashRec(h) +} + +func (st *StackTrie) hashRec(hasher *hasher) { + // The switch below sets this to the RLP-encoding of this node. + var encodedNode []byte switch st.nodeType { + case hashedNode: + return + + case emptyNode: + st.val = emptyRoot.Bytes() + st.key = st.key[:0] + st.nodeType = hashedNode + return + case branchNode: - var nodes [17]node + var nodes rawFullNode for i, child := range st.children { if child == nil { nodes[i] = nilValueNode continue } - child.hash() + + child.hashRec(hasher) if len(child.val) < 32 { nodes[i] = rawNode(child.val) } else { nodes[i] = hashNode(child.val) } - st.children[i] = nil // Reclaim mem from subtree + + // Release child back to pool. + st.children[i] = nil returnToPool(child) } - nodes[16] = nilValueNode - h = newHasher(false) - defer returnHasherToPool(h) - h.tmp.Reset() - if err := rlp.Encode(&h.tmp, nodes); err != nil { - panic(err) - } + + nodes.encode(hasher.encbuf) + encodedNode = hasher.encodedBytes() + case extNode: - st.children[0].hash() - h = newHasher(false) - defer returnHasherToPool(h) - h.tmp.Reset() - var valuenode node + st.children[0].hashRec(hasher) + + sz := hexToCompactInPlace(st.key) + n := rawShortNode{Key: st.key[:sz]} if len(st.children[0].val) < 32 { - valuenode = rawNode(st.children[0].val) + n.Val = rawNode(st.children[0].val) } else { - valuenode = hashNode(st.children[0].val) - } - n := struct { - Key []byte - Val node - }{ - Key: hexToCompact(st.key), - Val: valuenode, - } - if err := rlp.Encode(&h.tmp, n); err != nil { - panic(err) + n.Val = hashNode(st.children[0].val) } + + n.encode(hasher.encbuf) + encodedNode = hasher.encodedBytes() + + // Release child back to pool. returnToPool(st.children[0]) - st.children[0] = nil // Reclaim mem from subtree + st.children[0] = nil + case leafNode: - h = newHasher(false) - defer returnHasherToPool(h) - h.tmp.Reset() st.key = append(st.key, byte(16)) sz := hexToCompactInPlace(st.key) - n := [][]byte{st.key[:sz], st.val} - if err := rlp.Encode(&h.tmp, n); err != nil { - panic(err) - } - case emptyNode: - st.val = emptyRoot.Bytes() - st.key = st.key[:0] - st.nodeType = hashedNode - return + n := rawShortNode{Key: st.key[:sz], Val: valueNode(st.val)} + + n.encode(hasher.encbuf) + encodedNode = hasher.encodedBytes() + default: - panic("Invalid node type") + panic("invalid node type") } - st.key = st.key[:0] + st.nodeType = hashedNode - if len(h.tmp) < 32 { - st.val = common.CopyBytes(h.tmp) + st.key = st.key[:0] + if len(encodedNode) < 32 { + st.val = common.CopyBytes(encodedNode) return } + // Write the hash to the 'val'. We allocate a new val here to not mutate // input values - st.val = make([]byte, 32) - h.sha.Reset() - h.sha.Write(h.tmp) - h.sha.Read(st.val) + st.val = hasher.hashData(encodedNode) if st.db != nil { // TODO! Is it safe to Put the slice here? // Do all db implementations copy the value provided? - st.db.Put(st.val, h.tmp) + st.db.Put(st.val, encodedNode) } } -// Hash returns the hash of the current node +// Hash returns the hash of the current node. func (st *StackTrie) Hash() (h common.Hash) { - st.hash() - if len(st.val) != 32 { - // If the node's RLP isn't 32 bytes long, the node will not - // be hashed, and instead contain the rlp-encoding of the - // node. For the top level node, we need to force the hashing. - ret := make([]byte, 32) - h := newHasher(false) - defer returnHasherToPool(h) - h.sha.Reset() - h.sha.Write(st.val) - h.sha.Read(ret) - return common.BytesToHash(ret) + hasher := newHasher(false) + defer returnHasherToPool(hasher) + + st.hashRec(hasher) + if len(st.val) == 32 { + copy(h[:], st.val) + return h } - return common.BytesToHash(st.val) + + // If the node's RLP isn't 32 bytes long, the node will not + // be hashed, and instead contain the rlp-encoding of the + // node. For the top level node, we need to force the hashing. + hasher.sha.Reset() + hasher.sha.Write(st.val) + hasher.sha.Read(h[:]) + return h } // Commit will firstly hash the entrie trie if it's still not hashed @@ -483,23 +482,26 @@ func (st *StackTrie) Hash() (h common.Hash) { // // The associated database is expected, otherwise the whole commit // functionality should be disabled. -func (st *StackTrie) Commit() (common.Hash, error) { +func (st *StackTrie) Commit() (h common.Hash, err error) { if st.db == nil { return common.Hash{}, ErrCommitDisabled } - st.hash() - if len(st.val) != 32 { - // If the node's RLP isn't 32 bytes long, the node will not - // be hashed (and committed), and instead contain the rlp-encoding of the - // node. For the top level node, we need to force the hashing+commit. - ret := make([]byte, 32) - h := newHasher(false) - defer returnHasherToPool(h) - h.sha.Reset() - h.sha.Write(st.val) - h.sha.Read(ret) - st.db.Put(ret, st.val) - return common.BytesToHash(ret), nil + + hasher := newHasher(false) + defer returnHasherToPool(hasher) + + st.hashRec(hasher) + if len(st.val) == 32 { + copy(h[:], st.val) + return h, nil } - return common.BytesToHash(st.val), nil + + // If the node's RLP isn't 32 bytes long, the node will not + // be hashed (and committed), and instead contain the rlp-encoding of the + // node. For the top level node, we need to force the hashing+commit. + hasher.sha.Reset() + hasher.sha.Write(st.val) + hasher.sha.Read(h[:]) + st.db.Put(h[:], st.val) + return h, nil } diff --git a/trie/sync.go b/trie/sync.go index 81d38ee3a6..7eaa35244e 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -155,8 +155,7 @@ func (s *Sync) AddSubTrie(root common.Hash, path []byte, parent common.Hash, cal } // If database says this is a duplicate, then at least the trie node is // present, and we hold the assumption that it's NOT legacy contract code. - blob := rawdb.ReadTrieNode(s.database, root) - if len(blob) > 0 { + if rawdb.HasTrieNode(s.database, root) { return } // Assemble the new sub-trie sync request @@ -193,7 +192,7 @@ func (s *Sync) AddCodeEntry(hash common.Hash, path []byte, parent common.Hash) { // sync is expected to run with a fresh new node. Even there // exists the code with legacy format, fetch and store with // new scheme anyway. - if blob := rawdb.ReadCodeWithPrefix(s.database, hash); len(blob) > 0 { + if rawdb.HasCodeWithPrefix(s.database, hash) { return } // Assemble the new sub-trie sync request @@ -401,7 +400,7 @@ func (s *Sync) children(req *request, object node) ([]*request, error) { } // If database says duplicate, then at least the trie node is present // and we hold the assumption that it's NOT legacy contract code. - if blob := rawdb.ReadTrieNode(s.database, hash); len(blob) > 0 { + if rawdb.HasTrieNode(s.database, hash) { continue } // Locally unknown node, schedule for retrieval diff --git a/trie/trie.go b/trie/trie.go index 13343112b8..e40b03be38 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -514,6 +514,15 @@ func (t *Trie) resolveHash(n hashNode, prefix []byte) (node, error) { return nil, &MissingNodeError{NodeHash: hash, Path: prefix} } +func (t *Trie) resolveBlob(n hashNode, prefix []byte) ([]byte, error) { + hash := common.BytesToHash(n) + blob, _ := t.db.Node(hash) + if len(blob) != 0 { + return blob, nil + } + return nil, &MissingNodeError{NodeHash: hash, Path: prefix} +} + // Hash returns the root hash of the trie. It does not write to the // database and can be used even if the trie doesn't have one. func (t *Trie) Hash() common.Hash { diff --git a/trie/trie_test.go b/trie/trie_test.go index be0df8a544..a1fdc8cd58 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -414,8 +414,9 @@ func runRandTest(rt randTest) bool { values := make(map[string]string) // tracks content of the trie for i, step := range rt { - fmt.Printf("{op: %d, key: common.Hex2Bytes(\"%x\"), value: common.Hex2Bytes(\"%x\")}, // step %d\n", - step.op, step.key, step.value, i) + // fmt.Printf("{op: %d, key: common.Hex2Bytes(\"%x\"), value: common.Hex2Bytes(\"%x\")}, // step %d\n", + // step.op, step.key, step.value, i) + switch step.op { case opUpdate: tr.Update(step.key, step.value) @@ -675,6 +676,8 @@ func (s *spongeDb) Has(key []byte) (bool, error) { panic("implement func (s *spongeDb) Get(key []byte) ([]byte, error) { return nil, errors.New("no such elem") } func (s *spongeDb) Delete(key []byte) error { panic("implement me") } func (s *spongeDb) NewBatch() ethdb.Batch { return &spongeBatch{s} } +func (s *spongeDb) NewBatchWithSize(size int) ethdb.Batch { return &spongeBatch{s} } +func (s *spongeDb) NewSnapshot() (ethdb.Snapshot, error) { panic("implement me") } func (s *spongeDb) Stat(property string) (string, error) { panic("implement me") } func (s *spongeDb) Compact(start []byte, limit []byte) error { panic("implement me") } func (s *spongeDb) Close() error { return nil } @@ -884,7 +887,8 @@ func TestCommitSequenceSmallRoot(t *testing.T) { if stRoot != root { t.Fatalf("root wrong, got %x exp %x", stRoot, root) } - fmt.Printf("root: %x\n", stRoot) + + t.Logf("root: %x\n", stRoot) if got, exp := stackTrieSponge.sponge.Sum(nil), s.sponge.Sum(nil); !bytes.Equal(got, exp) { t.Fatalf("test, disk write sequence wrong:\ngot %x exp %x\n", got, exp) } From 44e5edf109974129c2ee15a1cab604bffc8ff182 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Mon, 11 Apr 2022 18:56:05 +0530 Subject: [PATCH 012/190] bumped version --- params/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/params/version.go b/params/version.go index b39e363b92..f5daf32ae7 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ const ( VersionMajor = 0 // Major version component of the current release VersionMinor = 2 // Minor version component of the current release VersionPatch = 16 // Patch version component of the current release - VersionMeta = "beta-1" // Version metadata to append to the version string + VersionMeta = "beta-2" // Version metadata to append to the version string ) // Version holds the textual version string. From d5b76d4aa4d7194598c93307a48ac3a1ccbeacce Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Mon, 11 Apr 2022 23:00:53 +0530 Subject: [PATCH 013/190] fix failing tests --- core/genesis_test.go | 30 ------------------------------ miner/miner_test.go | 2 +- miner/worker_test.go | 2 +- 3 files changed, 2 insertions(+), 32 deletions(-) diff --git a/core/genesis_test.go b/core/genesis_test.go index cf49de7ff1..e8010e3d4e 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -243,33 +243,3 @@ func TestReadWriteGenesisAlloc(t *testing.T) { } } } - -func TestGenesis_Commit(t *testing.T) { - genesis := &Genesis{ - BaseFee: big.NewInt(params.InitialBaseFee), - Config: params.TestChainConfig, - // difficulty is nil - } - - db := rawdb.NewMemoryDatabase() - genesisBlock, err := genesis.Commit(db) - if err != nil { - t.Fatal(err) - } - - if genesis.Difficulty != nil { - t.Fatalf("assumption wrong") - } - - // This value should have been set as default in the ToBlock method. - if genesisBlock.Difficulty().Cmp(params.GenesisDifficulty) != 0 { - t.Errorf("assumption wrong: want: %d, got: %v", params.GenesisDifficulty, genesisBlock.Difficulty()) - } - - // Expect the stored total difficulty to be the difficulty of the genesis block. - stored := rawdb.ReadTd(db, genesisBlock.Hash(), genesisBlock.NumberU64()) - - if stored.Cmp(genesisBlock.Difficulty()) != 0 { - t.Errorf("inequal difficulty; stored: %v, genesisBlock: %v", stored, genesisBlock.Difficulty()) - } -} diff --git a/miner/miner_test.go b/miner/miner_test.go index 56773101be..03c79cbbd5 100644 --- a/miner/miner_test.go +++ b/miner/miner_test.go @@ -258,7 +258,7 @@ func createMiner(t *testing.T) (*Miner, *event.TypeMux, func(skipMiner bool)) { // Create consensus engine engine := clique.New(chainConfig.Clique, chainDB) // Create Ethereum backend - merger := consensus.NewMerger(rawdb.NewMemoryDatabase()) + consensus.NewMerger(rawdb.NewMemoryDatabase()) bc, err := core.NewBlockChain(chainDB, nil, chainConfig, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("can't create new chain %v", err) diff --git a/miner/worker_test.go b/miner/worker_test.go index f309ae994b..dd029433b8 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -202,7 +202,7 @@ func (b *testWorkerBackend) newRandomTx(creation bool) *types.Transaction { func newTestWorker(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, db ethdb.Database, blocks int) (*worker, *testWorkerBackend) { backend := newTestWorkerBackend(t, chainConfig, engine, db, blocks) backend.txPool.AddLocals(pendingTxs) - w := newWorker(testConfig, chainConfig, engine, backend, new(event.TypeMux), nil, false, consensus.NewMerger(rawdb.NewMemoryDatabase())) + w := newWorker(testConfig, chainConfig, engine, backend, new(event.TypeMux), nil, false) w.setEtherbase(testBankAddress) return w, backend } From bf85e15dced64e6148e808f08eedb31eeeef527c Mon Sep 17 00:00:00 2001 From: Victor Castell Date: Tue, 19 Apr 2022 10:40:22 +0200 Subject: [PATCH 014/190] Bump Go version to v1.18 (#368) * Bump Go version to v1.18.1 --- Dockerfile.alltools | 2 +- Dockerfile.classic | 2 +- Makefile | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile.alltools b/Dockerfile.alltools index b702d332b9..a3f36d4a04 100644 --- a/Dockerfile.alltools +++ b/Dockerfile.alltools @@ -1,5 +1,5 @@ # Build Geth in a stock Go builder container -FROM golang:1.18-alpine as builder +FROM golang:1.18.1-alpine as builder RUN apk add --no-cache make gcc musl-dev linux-headers git diff --git a/Dockerfile.classic b/Dockerfile.classic index a60c55e7d4..2fa38f08f9 100644 --- a/Dockerfile.classic +++ b/Dockerfile.classic @@ -1,5 +1,5 @@ # Build Geth in a stock Go builder container -FROM golang:1.17-alpine as builder +FROM golang:1.18.1-alpine as builder RUN apk add --no-cache make gcc musl-dev linux-headers git bash diff --git a/Makefile b/Makefile index b4fc8de630..6469b8510f 100644 --- a/Makefile +++ b/Makefile @@ -160,7 +160,7 @@ geth-windows-amd64: @ls -ld $(GOBIN)/geth-windows-* | grep amd64 PACKAGE_NAME := github.com/maticnetwork/bor -GOLANG_CROSS_VERSION ?= v1.17.2 +GOLANG_CROSS_VERSION ?= v1.18.1 .PHONY: release-dry-run release-dry-run: @@ -174,7 +174,7 @@ release-dry-run: -v /var/run/docker.sock:/var/run/docker.sock \ -v `pwd`:/go/src/$(PACKAGE_NAME) \ -w /go/src/$(PACKAGE_NAME) \ - ghcr.io/troian/golang-cross:${GOLANG_CROSS_VERSION} \ + goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION} \ --rm-dist --skip-validate --skip-publish .PHONY: release @@ -190,5 +190,5 @@ release: -v /var/run/docker.sock:/var/run/docker.sock \ -v `pwd`:/go/src/$(PACKAGE_NAME) \ -w /go/src/$(PACKAGE_NAME) \ - ghcr.io/troian/golang-cross:${GOLANG_CROSS_VERSION} \ + goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION} \ --rm-dist --skip-validate From 1a31178c01b9fc98e3b77dd8f9fb6ff974104f8d Mon Sep 17 00:00:00 2001 From: Victor Castell Date: Wed, 22 Dec 2021 14:43:00 +0100 Subject: [PATCH 015/190] Build using netgo tag This will create a static build using Go native networking stack. Checked and it works stable for all archs and distros. --- .goreleaser.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 088dcf38c7..331d8de6b5 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -49,7 +49,7 @@ builds: tags: - netgo ldflags: - # We need to build a static binary because we are building in a glibc based system and running in a musl container + # We need to build a static binary because we are building in a glibc based system and running in a musl container -s -w -extldflags "-static" - id: linux-arm64 @@ -65,7 +65,7 @@ builds: tags: - netgo ldflags: - # We need to build a static binary because we are building in a glibc based system and running in a musl container + # We need to build a static binary because we are building in a glibc based system and running in a musl container -s -w -extldflags "-static" nfpms: From 429deab982a2a7c90f4399dcb908bf9380cc2769 Mon Sep 17 00:00:00 2001 From: Victor Castell Date: Tue, 26 Apr 2022 18:18:01 +0200 Subject: [PATCH 016/190] Fix meta --- params/version.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/params/version.go b/params/version.go index f5daf32ae7..e74aee4400 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 0 // Major version component of the current release - VersionMinor = 2 // Minor version component of the current release - VersionPatch = 16 // Patch version component of the current release - VersionMeta = "beta-2" // Version metadata to append to the version string + VersionMajor = 0 // Major version component of the current release + VersionMinor = 2 // Minor version component of the current release + VersionPatch = 16 // Patch version component of the current release + VersionMeta = "beta2" // Version metadata to append to the version string ) // Version holds the textual version string. From cc7c5b3fd997ad658c901f05ba7ddc639ea56423 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Mon, 2 May 2022 16:57:02 +0530 Subject: [PATCH 017/190] initial implementation for common ancestor approach --- consensus/bor/rest.go | 28 ++++++++ eth/backend.go | 55 +++++++++++++++ eth/downloader/downloader.go | 107 +++++++++++++++++++++++++---- eth/handler.go | 23 ++++--- eth/handler_bor.go | 50 ++++++++++++++ eth/handler_eth_test.go | 22 ++++++ tests/bor/mocks/IHeimdallClient.go | 23 +++++++ 7 files changed, 287 insertions(+), 21 deletions(-) create mode 100644 eth/handler_bor.go diff --git a/consensus/bor/rest.go b/consensus/bor/rest.go index 6460b75a3c..627262ffe6 100644 --- a/consensus/bor/rest.go +++ b/consensus/bor/rest.go @@ -4,11 +4,13 @@ import ( "encoding/json" "fmt" "io/ioutil" + "math/big" "net/http" "net/url" "sort" "time" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" ) @@ -23,10 +25,21 @@ type ResponseWithHeight struct { Result json.RawMessage `json:"result"` } +// Checkpoint defines a response object type of bor checkpoint +type Checkpoint struct { + Proposer common.Address `json:"proposer"` + StartBlock *big.Int `json:"start_block"` + EndBlock *big.Int `json:"end_block"` + RootHash common.Hash `json:"root_hash"` + BorChainID string `json:"bor_chain_id"` + Timestamp uint64 `json:"timestamp"` +} + type IHeimdallClient interface { Fetch(path string, query string) (*ResponseWithHeight, error) FetchWithRetry(path string, query string) (*ResponseWithHeight, error) FetchStateSyncEvents(fromID uint64, to int64) ([]*EventRecordWithTime, error) + FetchLatestCheckpoint() (*Checkpoint, error) Close() } @@ -76,6 +89,21 @@ func (h *HeimdallClient) FetchStateSyncEvents(fromID uint64, to int64) ([]*Event return eventRecords, nil } +// FetchLatestCheckpoint fetches the latest bor submitted checkpoint from heimdall +func (h *HeimdallClient) FetchLatestCheckpoint() (*Checkpoint, error) { + var checkpoint Checkpoint + + response, err := h.Fetch("/checkpoints/latest", "") + if err != nil { + return nil, err + } + if err := json.Unmarshal(response.Result, &checkpoint); err != nil { + return nil, err + } + + return &checkpoint, nil +} + // Fetch fetches response from heimdall func (h *HeimdallClient) Fetch(rawPath string, rawQuery string) (*ResponseWithHeight, error) { u, err := url.Parse(h.urlString) diff --git a/eth/backend.go b/eth/backend.go index 05d6c5c927..994a7d473f 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -100,6 +100,8 @@ type Ethereum struct { lock sync.RWMutex // Protects the variadic fields (e.g. gas price and etherbase) + closeCh chan struct{} // Channel to signal the background processes to exit + shutdownTracker *shutdowncheck.ShutdownTracker // Tracks if and when the node has shutdown ungracefully } @@ -161,6 +163,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { bloomRequests: make(chan chan *bloombits.Retrieval), bloomIndexer: core.NewBloomIndexer(chainDb, params.BloomBitsBlocks, params.BloomConfirms), p2pServer: stack.Server(), + closeCh: make(chan struct{}), shutdownTracker: shutdowncheck.NewShutdownTracker(chainDb), } @@ -252,6 +255,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { BloomCache: uint64(cacheLimit), EventMux: eth.eventMux, Checkpoint: checkpoint, + EthAPI: ethAPI, PeerRequiredBlocks: config.PeerRequiredBlocks, }); err != nil { return nil, err @@ -584,6 +588,54 @@ func (s *Ethereum) Start() error { } // Start the networking layer and the light server if requested s.handler.Start(maxPeers) + + go s.startCheckpointWhitelistService() + return nil +} + +// StartCheckpointWhitelistService starts the goroutine to fetch checkpoints and update the +// checkpoint whitelist map. +func (s *Ethereum) startCheckpointWhitelistService() { + every := time.Duration(100) * time.Second + ticker := time.NewTicker(every) + defer ticker.Stop() + +Loop: + for { + select { + case <-ticker.C: + err := s.handleWhitelistCheckpoint() + if err != nil { + log.Warn(err.Error()) + } + case <-s.closeCh: + break Loop + } + } +} + +// handleWhitelistCheckpoint handles the checkpoint whitelist mechanism. +func (s *Ethereum) handleWhitelistCheckpoint() error { + var m sync.Mutex + + ethHandler := (*ethHandler)(s.handler) + + if !ethHandler.chain.Engine().(*bor.Bor).WithoutHeimdall { + endBlockNum, endBlockHash, err := ethHandler.fetchWhitelistCheckpoint() + if err != nil { + return err + } + + m.Lock() + // Update the checkpoint whitelist map. + ethHandler.downloader.EnqueueCheckpointWhitelist(endBlockNum, endBlockHash) + // If size of checkpoint whitelist map is greater than 10, remove the oldest entry. + if len(ethHandler.downloader.GetCheckpointWhitelist()) > 10 { + ethHandler.downloader.DequeueCheckpointWhitelist() + } + m.Unlock() + } + return nil } @@ -599,6 +651,9 @@ func (s *Ethereum) Stop() error { s.bloomIndexer.Close() close(s.closeBloomHandler) + // Close all bg processes + close(s.closeCh) + // closing consensus engine first, as miner has deps on it s.engine.Close() s.txPool.Stop() diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 1e68746f97..b2d70906aa 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -78,6 +78,7 @@ var ( errCanceled = errors.New("syncing canceled (requested)") errTooOld = errors.New("peer's protocol version too old") errNoAncestorFound = errors.New("no common ancestor found") + errCheckpointMismatch = errors.New("checkpoint mismatch") ErrMergeTransition = errors.New("legacy sync reached the merge") ) @@ -143,6 +144,10 @@ type Downloader struct { quitCh chan struct{} // Quit channel to signal termination quitLock sync.Mutex // Lock to prevent double closes + // Checkpoint whitelist + checkpointWhitelist map[uint64]common.Hash // Checkpoint whitelist, populated by reaching out to heimdall + checkpointOrder []uint64 // Checkpoint order, populated by reaching out to heimdall + // Testing hooks syncInitHook func(uint64, uint64) // Method to call upon initiating a new sync run bodyFetchHook func([]*types.Header) // Method to call upon starting a block body fetch @@ -209,18 +214,20 @@ func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain Bl lightchain = chain } dl := &Downloader{ - stateDB: stateDb, - mux: mux, - checkpoint: checkpoint, - queue: newQueue(blockCacheMaxItems, blockCacheInitialItems), - peers: newPeerSet(), - blockchain: chain, - lightchain: lightchain, - dropPeer: dropPeer, - headerProcCh: make(chan *headerTask, 1), - quitCh: make(chan struct{}), - SnapSyncer: snap.NewSyncer(stateDb), - stateSyncStart: make(chan *stateSync), + stateDB: stateDb, + mux: mux, + checkpoint: checkpoint, + queue: newQueue(blockCacheMaxItems, blockCacheInitialItems), + peers: newPeerSet(), + blockchain: chain, + lightchain: lightchain, + dropPeer: dropPeer, + headerProcCh: make(chan *headerTask, 1), + quitCh: make(chan struct{}), + SnapSyncer: snap.NewSyncer(stateDb), + stateSyncStart: make(chan *stateSync), + checkpointWhitelist: make(map[uint64]common.Hash), + checkpointOrder: make([]uint64, 0), } dl.skeleton = newSkeleton(stateDb, dl.peers, dropPeer, newBeaconBackfiller(dl, success)) @@ -332,6 +339,10 @@ func (d *Downloader) LegacySync(id string, head common.Hash, td, ttd *big.Int, m case nil, errBusy, errCanceled: return err } + if errors.Is(err, errCheckpointMismatch) { + // TODO: what better can be done here? + log.Warn("Mismatch in last checkpointed block", "peer", id, "err", err) + } if errors.Is(err, errInvalidChain) || errors.Is(err, errBadPeer) || errors.Is(err, errTimeout) || errors.Is(err, errStallingPeer) || errors.Is(err, errUnsyncedPeer) || errors.Is(err, errEmptyHeaderSet) || errors.Is(err, errPeersUnavailable) || errors.Is(err, errTooOld) || errors.Is(err, errInvalidAncestor) { @@ -764,12 +775,51 @@ func calculateRequestSpan(remoteHeight, localHeight uint64) (int64, int, int, ui return int64(from), count, span - 1, uint64(max) } +// isValidChain checks if the chain we're about to receive from this peer is valid or not +// in terms of reorgs. We won't reorg beyond the last bor checkpoint submitted to mainchain. +func (d *Downloader) isValidChain(p *peerConnection, remoteHeader *types.Header) (bool, error) { + // We want to validate the chain by comparing the last checkpointed block + // we're storing in `checkpointWhitelist` with the peer's block. + + // Check for availaibility of the last checkpointed block. + // This can be also be empty if our heimdall is not responsing + // or we're running without it. + if len(d.checkpointWhitelist) <= 0 { + // worst case, we don't have the checkpoints in memory + return true, nil + } + + // Fetch the last checkpoint entry + lastCheckpointBlockNum := d.checkpointOrder[len(d.checkpointOrder)-1] + lastCheckpointBlockHash := d.checkpointWhitelist[lastCheckpointBlockNum] + + headers, hashes, err := d.fetchHeadersByNumber(p, lastCheckpointBlockNum, 1, 0, false) + if err != nil || len(headers) == 0 { + // TODO: what better can be done here? + return true, nil + } + reqBlockNum := headers[0].Number.Uint64() + reqBlockHash := hashes[0] + + // Check against the checkpointed blocks + if reqBlockNum == lastCheckpointBlockNum && reqBlockHash == lastCheckpointBlockHash { + return true, nil + } + + return false, errCheckpointMismatch +} + // findAncestor tries to locate the common ancestor link of the local chain and // a remote peers blockchain. In the general case when our node was in sync and // on the correct chain, checking the top N links should already get us a match. // In the rare scenario when we ended up on a long reorganisation (i.e. none of // the head links match), we do a binary search to find the common ancestor. func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) (uint64, error) { + // Check the validity of chain to be downloaded + if _, err := d.isValidChain(p, remoteHeader); errors.Is(err, errCheckpointMismatch) { + return 0, err + } + // Figure out the valid ancestor range to prevent rewrite attacks var ( floor = int64(-1) @@ -1755,3 +1805,36 @@ func (d *Downloader) DeliverSnapPacket(peer *snap.Peer, packet snap.Packet) erro return fmt.Errorf("unexpected snap packet type: %T", packet) } } + +// Helper functions for checkpoint whitelist service + +// PurgeWhitelistMap purges data from checkpoint whitelist map +func (d *Downloader) PurgeWhitelistMap() error { + for k := range d.checkpointWhitelist { + delete(d.checkpointWhitelist, k) + } + return nil +} + +// EnqueueWhitelistBlock enqueues blockNumber, blockHash to the checkpoint whitelist map +func (d *Downloader) EnqueueCheckpointWhitelist(key uint64, val common.Hash) { + if _, ok := d.checkpointWhitelist[key]; !ok { + log.Debug("Enqueing new checkpoint whitelist", "block number", key, "block hash", val) + d.checkpointWhitelist[key] = val + d.checkpointOrder = append(d.checkpointOrder, key) + } +} + +// DequeueWhitelistBlock dequeues block, blockhash from the checkpoint whitelist map +func (d *Downloader) DequeueCheckpointWhitelist() { + if len(d.checkpointOrder) > 0 { + log.Debug("Dequeing checkpoint whitelist", "block number", d.checkpointOrder[0], "block hash", d.checkpointWhitelist[d.checkpointOrder[0]]) + delete(d.checkpointWhitelist, d.checkpointOrder[0]) + d.checkpointOrder = d.checkpointOrder[1:] + } +} + +// GetCheckpointWhitelist returns the checkpoints whitelisted. +func (d *Downloader) GetCheckpointWhitelist() map[uint64]common.Hash { + return d.checkpointWhitelist +} diff --git a/eth/handler.go b/eth/handler.go index 40edfa2d17..fa0852d69e 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -36,6 +36,7 @@ import ( "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" @@ -77,15 +78,16 @@ type txPool interface { // handlerConfig is the collection of initialization parameters to create a full // node network handler. type handlerConfig struct { - Database ethdb.Database // Database for direct sync insertions - Chain *core.BlockChain // Blockchain to serve data from - TxPool txPool // Transaction pool to propagate from - Merger *consensus.Merger // The manager for eth1/2 transition - Network uint64 // Network identifier to adfvertise - Sync downloader.SyncMode // Whether to snap or full sync - BloomCache uint64 // Megabytes to alloc for snap sync bloom - EventMux *event.TypeMux // Legacy event mux, deprecate for `feed` - Checkpoint *params.TrustedCheckpoint // Hard coded checkpoint for sync challenges + Database ethdb.Database // Database for direct sync insertions + Chain *core.BlockChain // Blockchain to serve data from + TxPool txPool // Transaction pool to propagate from + Merger *consensus.Merger // The manager for eth1/2 transition + Network uint64 // Network identifier to adfvertise + Sync downloader.SyncMode // Whether to snap or full sync + BloomCache uint64 // Megabytes to alloc for snap sync bloom + EventMux *event.TypeMux // Legacy event mux, deprecate for `feed` + Checkpoint *params.TrustedCheckpoint // Hard coded checkpoint for sync challenges + EthAPI *ethapi.PublicBlockChainAPI // EthAPI to interact PeerRequiredBlocks map[uint64]common.Hash // Hard coded map of required block hashes for sync challenges } @@ -111,6 +113,8 @@ type handler struct { peers *peerSet merger *consensus.Merger + ethAPI *ethapi.PublicBlockChainAPI // EthAPI to interact + eventMux *event.TypeMux txsCh chan core.NewTxsEvent txsSub event.Subscription @@ -141,6 +145,7 @@ func newHandler(config *handlerConfig) (*handler, error) { chain: config.Chain, peers: newPeerSet(), merger: config.Merger, + ethAPI: config.EthAPI, peerRequiredBlocks: config.PeerRequiredBlocks, quitSync: make(chan struct{}), } diff --git a/eth/handler_bor.go b/eth/handler_bor.go new file mode 100644 index 0000000000..b87c07f551 --- /dev/null +++ b/eth/handler_bor.go @@ -0,0 +1,50 @@ +package eth + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" +) + +// fetchWhitelistCheckpoint fetched the latest checkpoint from it's local heimdall +// and verifies the data against bor data. +func (h *ethHandler) fetchWhitelistCheckpoint() (uint64, common.Hash, error) { + // check for checkpoint whitelisting: bor + checkpoint, err := h.chain.Engine().(*bor.Bor).HeimdallClient.FetchLatestCheckpoint() + if err != nil { + log.Debug("Failed to fetch latest checkpoint for whitelisting") + return 0, common.Hash{}, fmt.Errorf("failed to fetch latest checkpoint") + } + + // check if we have the checkpoint blocks + head := h.ethAPI.BlockNumber() + if head < hexutil.Uint64(checkpoint.EndBlock.Uint64()) { + log.Debug("Head block behing checkpoint block", "head", head, "checkpoint end block", checkpoint.EndBlock) + return 0, common.Hash{}, fmt.Errorf("missing checkpoint blocks") + } + + // verify the root hash of checkpoint + roothash, err := h.ethAPI.GetRootHash(context.Background(), checkpoint.StartBlock.Uint64(), checkpoint.EndBlock.Uint64()) + if err != nil { + log.Debug("Failed to get root hash of checkpoint while whitelisting") + return 0, common.Hash{}, fmt.Errorf("failed to get local root hash") + } + if roothash != checkpoint.RootHash.String()[2:] { + log.Warn("Checkpoint root hash mismatch while whitelisting", "expected", checkpoint.RootHash.String()[2:], "got", roothash) + return 0, common.Hash{}, fmt.Errorf("checkpoint roothash mismatch") + } + + // fetch the end checkpoint block hash + block, err := h.ethAPI.GetBlockByNumber(context.Background(), rpc.BlockNumber(checkpoint.EndBlock.Uint64()), false) + if err != nil { + log.Debug("Failed to get end block hash of checkpoint while whitelisting") + return 0, common.Hash{}, fmt.Errorf("failed to get end block") + } + hash := fmt.Sprintf("%v", block["hash"]) + return checkpoint.EndBlock.Uint64(), common.HexToHash(hash), nil +} diff --git a/eth/handler_eth_test.go b/eth/handler_eth_test.go index 7d5027ae77..ec1329b059 100644 --- a/eth/handler_eth_test.go +++ b/eth/handler_eth_test.go @@ -39,6 +39,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" + "gotest.tools/assert" ) // testEthHandler is a mock event handler to listen for inbound network requests @@ -746,3 +747,24 @@ func testBroadcastMalformedBlock(t *testing.T, protocol uint) { } } } + +// TestWhitelistCheckpoint checks the checkpoint whitelist map queue mechanism +func TestWhitelistCheckpoint(t *testing.T) { + t.Parallel() + + testHandler := newTestHandler() + defer testHandler.close() + + ethHandler := (*ethHandler)(testHandler.handler) + for i := 0; i < 10; i++ { + ethHandler.downloader.EnqueueCheckpointWhitelist(uint64(i), common.Hash{}) + } + + assert.Equal(t, len(ethHandler.downloader.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") + + ethHandler.downloader.EnqueueCheckpointWhitelist(11, common.Hash{}) + ethHandler.downloader.DequeueCheckpointWhitelist() + + assert.Equal(t, len(ethHandler.downloader.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") + +} diff --git a/tests/bor/mocks/IHeimdallClient.go b/tests/bor/mocks/IHeimdallClient.go index ac89487d3b..3ee599bb2e 100644 --- a/tests/bor/mocks/IHeimdallClient.go +++ b/tests/bor/mocks/IHeimdallClient.go @@ -40,6 +40,29 @@ func (_m *IHeimdallClient) Fetch(path string, query string) (*bor.ResponseWithHe return r0, r1 } +// FetchLatestCheckpoint provides a mock function with given fields: +func (_m *IHeimdallClient) FetchLatestCheckpoint() (*bor.Checkpoint, error) { + ret := _m.Called() + + var r0 *bor.Checkpoint + if rf, ok := ret.Get(0).(func() *bor.Checkpoint); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*bor.Checkpoint) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // FetchStateSyncEvents provides a mock function with given fields: fromID, to func (_m *IHeimdallClient) FetchStateSyncEvents(fromID uint64, to int64) ([]*bor.EventRecordWithTime, error) { ret := _m.Called(fromID, to) From 2cb82c991a17ed9fd3bb9f509d8da00f62e74981 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 5 May 2022 17:00:24 +0300 Subject: [PATCH 018/190] extract whitelist interface --- eth/downloader/downloader.go | 89 +++++---------------------- eth/downloader/downloader_test.go | 5 +- eth/downloader/whitelist/service.go | 93 +++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 74 deletions(-) create mode 100644 eth/downloader/whitelist/service.go diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index b2d70906aa..2ee61c3372 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state/snapshot" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader/whitelist" "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -78,7 +79,6 @@ var ( errCanceled = errors.New("syncing canceled (requested)") errTooOld = errors.New("peer's protocol version too old") errNoAncestorFound = errors.New("no common ancestor found") - errCheckpointMismatch = errors.New("checkpoint mismatch") ErrMergeTransition = errors.New("legacy sync reached the merge") ) @@ -144,9 +144,7 @@ type Downloader struct { quitCh chan struct{} // Quit channel to signal termination quitLock sync.Mutex // Lock to prevent double closes - // Checkpoint whitelist - checkpointWhitelist map[uint64]common.Hash // Checkpoint whitelist, populated by reaching out to heimdall - checkpointOrder []uint64 // Checkpoint order, populated by reaching out to heimdall + ChainValidator // Testing hooks syncInitHook func(uint64, uint64) // Method to call upon initiating a new sync run @@ -155,6 +153,11 @@ type Downloader struct { chainInsertHook func([]*fetchResult) // Method to call upon inserting a chain of blocks (possibly in multiple invocations) } +// interface for whitelist service +type ChainValidator interface { + IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) +} + // LightChain encapsulates functions required to synchronise a light chain. type LightChain interface { // HasHeader verifies a header's presence in the local chain. @@ -209,7 +212,7 @@ type BlockChain interface { } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn, success func()) *Downloader { +func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn, success func(), whitelistService ChainValidator) *Downloader { if lightchain == nil { lightchain = chain } @@ -226,8 +229,7 @@ func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain Bl quitCh: make(chan struct{}), SnapSyncer: snap.NewSyncer(stateDb), stateSyncStart: make(chan *stateSync), - checkpointWhitelist: make(map[uint64]common.Hash), - checkpointOrder: make([]uint64, 0), + ChainValidator: whitelistService, } dl.skeleton = newSkeleton(stateDb, dl.peers, dropPeer, newBeaconBackfiller(dl, success)) @@ -339,7 +341,7 @@ func (d *Downloader) LegacySync(id string, head common.Hash, td, ttd *big.Int, m case nil, errBusy, errCanceled: return err } - if errors.Is(err, errCheckpointMismatch) { + if errors.Is(err, whitelist.ErrCheckpointMismatch) { // TODO: what better can be done here? log.Warn("Mismatch in last checkpointed block", "peer", id, "err", err) } @@ -775,38 +777,11 @@ func calculateRequestSpan(remoteHeight, localHeight uint64) (int64, int, int, ui return int64(from), count, span - 1, uint64(max) } -// isValidChain checks if the chain we're about to receive from this peer is valid or not -// in terms of reorgs. We won't reorg beyond the last bor checkpoint submitted to mainchain. -func (d *Downloader) isValidChain(p *peerConnection, remoteHeader *types.Header) (bool, error) { - // We want to validate the chain by comparing the last checkpointed block - // we're storing in `checkpointWhitelist` with the peer's block. - - // Check for availaibility of the last checkpointed block. - // This can be also be empty if our heimdall is not responsing - // or we're running without it. - if len(d.checkpointWhitelist) <= 0 { - // worst case, we don't have the checkpoints in memory - return true, nil - } - - // Fetch the last checkpoint entry - lastCheckpointBlockNum := d.checkpointOrder[len(d.checkpointOrder)-1] - lastCheckpointBlockHash := d.checkpointWhitelist[lastCheckpointBlockNum] - - headers, hashes, err := d.fetchHeadersByNumber(p, lastCheckpointBlockNum, 1, 0, false) - if err != nil || len(headers) == 0 { - // TODO: what better can be done here? - return true, nil - } - reqBlockNum := headers[0].Number.Uint64() - reqBlockHash := hashes[0] - - // Check against the checkpointed blocks - if reqBlockNum == lastCheckpointBlockNum && reqBlockHash == lastCheckpointBlockHash { - return true, nil +// curried fetchHeadersByNumber +func (d *Downloader) getFetchHeadersByNumber(p *peerConnection) func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + return func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + return d.fetchHeadersByNumber(p, number, amount, skip, reverse) } - - return false, errCheckpointMismatch } // findAncestor tries to locate the common ancestor link of the local chain and @@ -816,7 +791,8 @@ func (d *Downloader) isValidChain(p *peerConnection, remoteHeader *types.Header) // the head links match), we do a binary search to find the common ancestor. func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) (uint64, error) { // Check the validity of chain to be downloaded - if _, err := d.isValidChain(p, remoteHeader); errors.Is(err, errCheckpointMismatch) { + // TODO: we can use a mock and + if _, err := d.IsValidChain(remoteHeader, d.getFetchHeadersByNumber(p)); errors.Is(err, whitelist.ErrCheckpointMismatch) { return 0, err } @@ -1805,36 +1781,3 @@ func (d *Downloader) DeliverSnapPacket(peer *snap.Peer, packet snap.Packet) erro return fmt.Errorf("unexpected snap packet type: %T", packet) } } - -// Helper functions for checkpoint whitelist service - -// PurgeWhitelistMap purges data from checkpoint whitelist map -func (d *Downloader) PurgeWhitelistMap() error { - for k := range d.checkpointWhitelist { - delete(d.checkpointWhitelist, k) - } - return nil -} - -// EnqueueWhitelistBlock enqueues blockNumber, blockHash to the checkpoint whitelist map -func (d *Downloader) EnqueueCheckpointWhitelist(key uint64, val common.Hash) { - if _, ok := d.checkpointWhitelist[key]; !ok { - log.Debug("Enqueing new checkpoint whitelist", "block number", key, "block hash", val) - d.checkpointWhitelist[key] = val - d.checkpointOrder = append(d.checkpointOrder, key) - } -} - -// DequeueWhitelistBlock dequeues block, blockhash from the checkpoint whitelist map -func (d *Downloader) DequeueCheckpointWhitelist() { - if len(d.checkpointOrder) > 0 { - log.Debug("Dequeing checkpoint whitelist", "block number", d.checkpointOrder[0], "block hash", d.checkpointWhitelist[d.checkpointOrder[0]]) - delete(d.checkpointWhitelist, d.checkpointOrder[0]) - d.checkpointOrder = d.checkpointOrder[1:] - } -} - -// GetCheckpointWhitelist returns the checkpoints whitelisted. -func (d *Downloader) GetCheckpointWhitelist() map[uint64]common.Hash { - return d.checkpointWhitelist -} diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 6989252c11..e2a3dca6be 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -35,6 +35,7 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/downloader/whitelist" "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/event" @@ -75,7 +76,9 @@ func newTester() *downloadTester { chain: chain, peers: make(map[string]*downloadTesterPeer), } - tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer, nil) + + // TODO: here we can inject a mock + tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer, nil, whitelist.NewService()) return tester } diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go new file mode 100644 index 0000000000..538b77988f --- /dev/null +++ b/eth/downloader/whitelist/service.go @@ -0,0 +1,93 @@ +package whitelist + +import ( + "errors" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" +) + +var ( + ErrCheckpointMismatch = errors.New("checkpoint mismatch") +) + +type Service struct { + // Checkpoint whitelist + checkpointWhitelist map[uint64]common.Hash // Checkpoint whitelist, populated by reaching out to heimdall + checkpointOrder []uint64 // Checkpoint order, populated by reaching out to heimdall +} + +func NewService() *Service { + return &Service{ + checkpointWhitelist: make(map[uint64]common.Hash), + checkpointOrder: []uint64{}, + } +} + +// IsValidChain checks if the chain we're about to receive from this peer is valid or not +// in terms of reorgs. We won't reorg beyond the last bor checkpoint submitted to mainchain. +func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) { + // We want to validate the chain by comparing the last checkpointed block + // we're storing in `checkpointWhitelist` with the peer's block. + + // Check for availaibility of the last checkpointed block. + // This can be also be empty if our heimdall is not responsing + // or we're running without it. + if len(w.checkpointWhitelist) <= 0 { + // worst case, we don't have the checkpoints in memory + return true, nil + } + + // Fetch the last checkpoint entry + lastCheckpointBlockNum := w.checkpointOrder[len(w.checkpointOrder)-1] + lastCheckpointBlockHash := w.checkpointWhitelist[lastCheckpointBlockNum] + + // todo: we can extract this as an interface and mock as well or just test IsValidChain in isolation from downloader passing fake fetchHeadersByNumber functions + headers, hashes, err := fetchHeadersByNumber(lastCheckpointBlockNum, 1, 0, false) + if err != nil || len(headers) == 0 { + // TODO: what better can be done here? + return true, nil + } + + reqBlockNum := headers[0].Number.Uint64() + reqBlockHash := hashes[0] + + // Check against the checkpointed blocks + if reqBlockNum == lastCheckpointBlockNum && reqBlockHash == lastCheckpointBlockHash { + return true, nil + } + + return false, ErrCheckpointMismatch +} + +// PurgeWhitelistMap purges data from checkpoint whitelist map +func (w *Service) PurgeWhitelistMap() error { + for k := range w.checkpointWhitelist { + delete(w.checkpointWhitelist, k) + } + return nil +} + +// EnqueueWhitelistBlock enqueues blockNumber, blockHash to the checkpoint whitelist map +func (w *Service) EnqueueCheckpointWhitelist(key uint64, val common.Hash) { + if _, ok := w.checkpointWhitelist[key]; !ok { + log.Debug("Enqueing new checkpoint whitelist", "block number", key, "block hash", val) + w.checkpointWhitelist[key] = val + w.checkpointOrder = append(w.checkpointOrder, key) + } +} + +// DequeueWhitelistBlock dequeues block, blockhash from the checkpoint whitelist map +func (w *Service) DequeueCheckpointWhitelist() { + if len(w.checkpointOrder) > 0 { + log.Debug("Dequeing checkpoint whitelist", "block number", w.checkpointOrder[0], "block hash", w.checkpointWhitelist[w.checkpointOrder[0]]) + delete(w.checkpointWhitelist, w.checkpointOrder[0]) + w.checkpointOrder = w.checkpointOrder[1:] + } +} + +// GetCheckpointWhitelist returns the checkpoints whitelisted. +func (w *Service) GetCheckpointWhitelist() map[uint64]common.Hash { + return w.checkpointWhitelist +} From aa3004b08301e20e4d9f98b6afcda457cc703c90 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 5 May 2022 18:08:31 +0300 Subject: [PATCH 019/190] fix types --- eth/backend.go | 10 +--------- eth/downloader/downloader.go | 1 + eth/downloader/whitelist/service.go | 21 +++++++++++++++++++-- eth/handler.go | 4 +++- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/eth/backend.go b/eth/backend.go index 994a7d473f..727525da55 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -616,8 +616,6 @@ Loop: // handleWhitelistCheckpoint handles the checkpoint whitelist mechanism. func (s *Ethereum) handleWhitelistCheckpoint() error { - var m sync.Mutex - ethHandler := (*ethHandler)(s.handler) if !ethHandler.chain.Engine().(*bor.Bor).WithoutHeimdall { @@ -626,14 +624,8 @@ func (s *Ethereum) handleWhitelistCheckpoint() error { return err } - m.Lock() // Update the checkpoint whitelist map. - ethHandler.downloader.EnqueueCheckpointWhitelist(endBlockNum, endBlockHash) - // If size of checkpoint whitelist map is greater than 10, remove the oldest entry. - if len(ethHandler.downloader.GetCheckpointWhitelist()) > 10 { - ethHandler.downloader.DequeueCheckpointWhitelist() - } - m.Unlock() + ethHandler.downloader.ProcessCheckpoint(endBlockNum, endBlockHash) } return nil diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 2ee61c3372..ae00350464 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -156,6 +156,7 @@ type Downloader struct { // interface for whitelist service type ChainValidator interface { IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) + ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) } // LightChain encapsulates functions required to synchronise a light chain. diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go index 538b77988f..63851f3058 100644 --- a/eth/downloader/whitelist/service.go +++ b/eth/downloader/whitelist/service.go @@ -2,6 +2,7 @@ package whitelist import ( "errors" + "sync" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -12,16 +13,19 @@ var ( ErrCheckpointMismatch = errors.New("checkpoint mismatch") ) +// Checkpoint whitelist type Service struct { - // Checkpoint whitelist + m sync.RWMutex checkpointWhitelist map[uint64]common.Hash // Checkpoint whitelist, populated by reaching out to heimdall checkpointOrder []uint64 // Checkpoint order, populated by reaching out to heimdall + maxCapacity uint } -func NewService() *Service { +func NewService(maxCapacity uint) *Service { return &Service{ checkpointWhitelist: make(map[uint64]common.Hash), checkpointOrder: []uint64{}, + maxCapacity: maxCapacity, } } @@ -61,6 +65,18 @@ func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber return false, ErrCheckpointMismatch } +func (w *Service) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) { + w.m.Lock() + defer w.m.Unlock() + + w.EnqueueCheckpointWhitelist(endBlockNum, endBlockHash) + // If size of checkpoint whitelist map is greater than 10, remove the oldest entry. + + if len(w.GetCheckpointWhitelist()) > int(w.maxCapacity) { + w.DequeueCheckpointWhitelist() + } +} + // PurgeWhitelistMap purges data from checkpoint whitelist map func (w *Service) PurgeWhitelistMap() error { for k := range w.checkpointWhitelist { @@ -73,6 +89,7 @@ func (w *Service) PurgeWhitelistMap() error { func (w *Service) EnqueueCheckpointWhitelist(key uint64, val common.Hash) { if _, ok := w.checkpointWhitelist[key]; !ok { log.Debug("Enqueing new checkpoint whitelist", "block number", key, "block hash", val) + w.checkpointWhitelist[key] = val w.checkpointOrder = append(w.checkpointOrder, key) } diff --git a/eth/handler.go b/eth/handler.go index fa0852d69e..96eb3dc7be 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/downloader/whitelist" "github.com/ethereum/go-ethereum/eth/fetcher" "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/eth/protocols/snap" @@ -200,7 +201,8 @@ func newHandler(config *handlerConfig) (*handler, error) { // Construct the downloader (long sync) and its backing state bloom if snap // sync is requested. The downloader is responsible for deallocating the state // bloom when it's done. - h.downloader = downloader.New(h.checkpointNumber, config.Database, h.eventMux, h.chain, nil, h.removePeer, success) + // todo: it'd better to extract maxCapacity into config + h.downloader = downloader.New(h.checkpointNumber, config.Database, h.eventMux, h.chain, nil, h.removePeer, success, whitelist.NewService(10)) // Construct the fetcher (short sync) validator := func(header *types.Header) error { From 0a6398125201601f8c68c163e4a10f79ced6d7d8 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 27 Jan 2022 15:52:45 +0530 Subject: [PATCH 020/190] add seperate module config for http and ws From 0232c6a2665af363d114a68f4fec6e6b0c35f804 Mon Sep 17 00:00:00 2001 From: Victor Castell Date: Wed, 2 Feb 2022 12:01:47 +0100 Subject: [PATCH 021/190] Do not build classic docker image --- .github/workflows/dockerimage.yml | 29 ----------------------------- Dockerfile.classic | 18 ------------------ 2 files changed, 47 deletions(-) delete mode 100644 .github/workflows/dockerimage.yml delete mode 100644 Dockerfile.classic diff --git a/.github/workflows/dockerimage.yml b/.github/workflows/dockerimage.yml deleted file mode 100644 index a8dc11949f..0000000000 --- a/.github/workflows/dockerimage.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Bor Docker Image CI - -on: - push: - branches-ignore: - - '**' - tags: - - 'v*.*.*' - # to be used by fork patch-releases ^^ - - 'v*.*.*-*' - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Build the Bor Docker image - env: - DOCKERHUB: ${{ secrets.DOCKERHUB }} - DOCKERHUB_KEY: ${{ secrets.DOCKERHUB_KEY }} - run: | - ls -l - echo "Docker login" - docker login -u $DOCKERHUB -p $DOCKERHUB_KEY - echo "running build" - docker build -f Dockerfile.classic -t maticnetwork/bor:${GITHUB_REF/refs\/tags\//} . - echo "pushing image" - docker push maticnetwork/bor:${GITHUB_REF/refs\/tags\//} - echo "DONE!" diff --git a/Dockerfile.classic b/Dockerfile.classic deleted file mode 100644 index 2fa38f08f9..0000000000 --- a/Dockerfile.classic +++ /dev/null @@ -1,18 +0,0 @@ -# Build Geth in a stock Go builder container -FROM golang:1.18.1-alpine as builder - -RUN apk add --no-cache make gcc musl-dev linux-headers git bash - -ADD . /bor -RUN cd /bor && make bor-all - -CMD ["/bin/bash"] - -# Pull Bor into a second stage deploy alpine container -FROM alpine:latest - -RUN apk add --no-cache ca-certificates -COPY --from=builder /bor/build/bin/bor /usr/local/bin/ -COPY --from=builder /bor/build/bin/bootnode /usr/local/bin/ - -EXPOSE 8545 8546 8547 30303 30303/udp From b416577a8e79c8f340300e45c6b377204c24b4dd Mon Sep 17 00:00:00 2001 From: Victor Castell Date: Thu, 3 Feb 2022 09:30:27 +0100 Subject: [PATCH 022/190] Protobuf tooling fix and upgrade (#313) * Protobuf tooling fix and upgrade * Paths for protobuf files has changed, reflect that in Makefile * Fix the tooling to make it work in macos * Update protoc version and regenarate files. * Regen proto --- Makefile | 2 +- internal/cli/server/proto/server.pb.go | 545 ++++++++++---------- internal/cli/server/proto/server.proto | 2 +- internal/cli/server/proto/server_grpc.pb.go | 6 +- scripts/tools-protobuf.sh | 17 +- 5 files changed, 289 insertions(+), 283 deletions(-) diff --git a/Makefile b/Makefile index 6469b8510f..5bee26f690 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ bor-all: cp $(GOBIN)/* $(GOPATH)/bin/ protoc: - protoc --go_out=. --go-grpc_out=. ./command/server/proto/*.proto + protoc --go_out=. --go-grpc_out=. ./internal/cli/server/proto/*.proto geth: $(GORUN) build/ci.go install ./cmd/geth diff --git a/internal/cli/server/proto/server.pb.go b/internal/cli/server/proto/server.pb.go index a709c538ae..2b45fb37e9 100644 --- a/internal/cli/server/proto/server.pb.go +++ b/internal/cli/server/proto/server.pb.go @@ -1,8 +1,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.17.3 -// source: command/server/proto/server.proto +// protoc v3.19.3 +// source: internal/cli/server/proto/server.proto package proto @@ -59,11 +59,11 @@ func (x PprofRequest_Type) String() string { } func (PprofRequest_Type) Descriptor() protoreflect.EnumDescriptor { - return file_command_server_proto_server_proto_enumTypes[0].Descriptor() + return file_internal_cli_server_proto_server_proto_enumTypes[0].Descriptor() } func (PprofRequest_Type) Type() protoreflect.EnumType { - return &file_command_server_proto_server_proto_enumTypes[0] + return &file_internal_cli_server_proto_server_proto_enumTypes[0] } func (x PprofRequest_Type) Number() protoreflect.EnumNumber { @@ -72,7 +72,7 @@ func (x PprofRequest_Type) Number() protoreflect.EnumNumber { // Deprecated: Use PprofRequest_Type.Descriptor instead. func (PprofRequest_Type) EnumDescriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{16, 0} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{16, 0} } type ChainWatchRequest struct { @@ -84,7 +84,7 @@ type ChainWatchRequest struct { func (x *ChainWatchRequest) Reset() { *x = ChainWatchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[0] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -97,7 +97,7 @@ func (x *ChainWatchRequest) String() string { func (*ChainWatchRequest) ProtoMessage() {} func (x *ChainWatchRequest) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[0] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -110,7 +110,7 @@ func (x *ChainWatchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainWatchRequest.ProtoReflect.Descriptor instead. func (*ChainWatchRequest) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{0} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{0} } type ChainWatchResponse struct { @@ -126,7 +126,7 @@ type ChainWatchResponse struct { func (x *ChainWatchResponse) Reset() { *x = ChainWatchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[1] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -139,7 +139,7 @@ func (x *ChainWatchResponse) String() string { func (*ChainWatchResponse) ProtoMessage() {} func (x *ChainWatchResponse) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[1] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -152,7 +152,7 @@ func (x *ChainWatchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainWatchResponse.ProtoReflect.Descriptor instead. func (*ChainWatchResponse) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{1} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{1} } func (x *ChainWatchResponse) GetOldchain() []*BlockStub { @@ -188,7 +188,7 @@ type BlockStub struct { func (x *BlockStub) Reset() { *x = BlockStub{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[2] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -201,7 +201,7 @@ func (x *BlockStub) String() string { func (*BlockStub) ProtoMessage() {} func (x *BlockStub) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[2] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -214,7 +214,7 @@ func (x *BlockStub) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockStub.ProtoReflect.Descriptor instead. func (*BlockStub) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{2} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{2} } func (x *BlockStub) GetHash() string { @@ -243,7 +243,7 @@ type PeersAddRequest struct { func (x *PeersAddRequest) Reset() { *x = PeersAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[3] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -256,7 +256,7 @@ func (x *PeersAddRequest) String() string { func (*PeersAddRequest) ProtoMessage() {} func (x *PeersAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[3] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -269,7 +269,7 @@ func (x *PeersAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersAddRequest.ProtoReflect.Descriptor instead. func (*PeersAddRequest) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{3} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{3} } func (x *PeersAddRequest) GetEnode() string { @@ -295,7 +295,7 @@ type PeersAddResponse struct { func (x *PeersAddResponse) Reset() { *x = PeersAddResponse{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[4] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -308,7 +308,7 @@ func (x *PeersAddResponse) String() string { func (*PeersAddResponse) ProtoMessage() {} func (x *PeersAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[4] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -321,7 +321,7 @@ func (x *PeersAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersAddResponse.ProtoReflect.Descriptor instead. func (*PeersAddResponse) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{4} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{4} } type PeersRemoveRequest struct { @@ -336,7 +336,7 @@ type PeersRemoveRequest struct { func (x *PeersRemoveRequest) Reset() { *x = PeersRemoveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[5] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -349,7 +349,7 @@ func (x *PeersRemoveRequest) String() string { func (*PeersRemoveRequest) ProtoMessage() {} func (x *PeersRemoveRequest) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[5] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -362,7 +362,7 @@ func (x *PeersRemoveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersRemoveRequest.ProtoReflect.Descriptor instead. func (*PeersRemoveRequest) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{5} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{5} } func (x *PeersRemoveRequest) GetEnode() string { @@ -388,7 +388,7 @@ type PeersRemoveResponse struct { func (x *PeersRemoveResponse) Reset() { *x = PeersRemoveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[6] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -401,7 +401,7 @@ func (x *PeersRemoveResponse) String() string { func (*PeersRemoveResponse) ProtoMessage() {} func (x *PeersRemoveResponse) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[6] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -414,7 +414,7 @@ func (x *PeersRemoveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersRemoveResponse.ProtoReflect.Descriptor instead. func (*PeersRemoveResponse) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{6} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{6} } type PeersListRequest struct { @@ -426,7 +426,7 @@ type PeersListRequest struct { func (x *PeersListRequest) Reset() { *x = PeersListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[7] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -439,7 +439,7 @@ func (x *PeersListRequest) String() string { func (*PeersListRequest) ProtoMessage() {} func (x *PeersListRequest) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[7] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -452,7 +452,7 @@ func (x *PeersListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersListRequest.ProtoReflect.Descriptor instead. func (*PeersListRequest) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{7} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{7} } type PeersListResponse struct { @@ -466,7 +466,7 @@ type PeersListResponse struct { func (x *PeersListResponse) Reset() { *x = PeersListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[8] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -479,7 +479,7 @@ func (x *PeersListResponse) String() string { func (*PeersListResponse) ProtoMessage() {} func (x *PeersListResponse) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[8] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -492,7 +492,7 @@ func (x *PeersListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersListResponse.ProtoReflect.Descriptor instead. func (*PeersListResponse) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{8} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{8} } func (x *PeersListResponse) GetPeers() []*Peer { @@ -513,7 +513,7 @@ type PeersStatusRequest struct { func (x *PeersStatusRequest) Reset() { *x = PeersStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[9] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -526,7 +526,7 @@ func (x *PeersStatusRequest) String() string { func (*PeersStatusRequest) ProtoMessage() {} func (x *PeersStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[9] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -539,7 +539,7 @@ func (x *PeersStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersStatusRequest.ProtoReflect.Descriptor instead. func (*PeersStatusRequest) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{9} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{9} } func (x *PeersStatusRequest) GetEnode() string { @@ -560,7 +560,7 @@ type PeersStatusResponse struct { func (x *PeersStatusResponse) Reset() { *x = PeersStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[10] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -573,7 +573,7 @@ func (x *PeersStatusResponse) String() string { func (*PeersStatusResponse) ProtoMessage() {} func (x *PeersStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[10] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -586,7 +586,7 @@ func (x *PeersStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersStatusResponse.ProtoReflect.Descriptor instead. func (*PeersStatusResponse) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{10} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{10} } func (x *PeersStatusResponse) GetPeer() *Peer { @@ -613,7 +613,7 @@ type Peer struct { func (x *Peer) Reset() { *x = Peer{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[11] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -626,7 +626,7 @@ func (x *Peer) String() string { func (*Peer) ProtoMessage() {} func (x *Peer) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[11] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -639,7 +639,7 @@ func (x *Peer) ProtoReflect() protoreflect.Message { // Deprecated: Use Peer.ProtoReflect.Descriptor instead. func (*Peer) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{11} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{11} } func (x *Peer) GetId() string { @@ -702,7 +702,7 @@ type ChainSetHeadRequest struct { func (x *ChainSetHeadRequest) Reset() { *x = ChainSetHeadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[12] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -715,7 +715,7 @@ func (x *ChainSetHeadRequest) String() string { func (*ChainSetHeadRequest) ProtoMessage() {} func (x *ChainSetHeadRequest) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[12] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -728,7 +728,7 @@ func (x *ChainSetHeadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainSetHeadRequest.ProtoReflect.Descriptor instead. func (*ChainSetHeadRequest) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{12} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{12} } func (x *ChainSetHeadRequest) GetNumber() uint64 { @@ -747,7 +747,7 @@ type ChainSetHeadResponse struct { func (x *ChainSetHeadResponse) Reset() { *x = ChainSetHeadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[13] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -760,7 +760,7 @@ func (x *ChainSetHeadResponse) String() string { func (*ChainSetHeadResponse) ProtoMessage() {} func (x *ChainSetHeadResponse) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[13] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -773,7 +773,7 @@ func (x *ChainSetHeadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainSetHeadResponse.ProtoReflect.Descriptor instead. func (*ChainSetHeadResponse) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{13} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{13} } type StatusResponse struct { @@ -792,7 +792,7 @@ type StatusResponse struct { func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[14] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -805,7 +805,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[14] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -818,7 +818,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{14} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{14} } func (x *StatusResponse) GetCurrentBlock() *Header { @@ -875,7 +875,7 @@ type Header struct { func (x *Header) Reset() { *x = Header{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[15] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -888,7 +888,7 @@ func (x *Header) String() string { func (*Header) ProtoMessage() {} func (x *Header) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[15] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -901,7 +901,7 @@ func (x *Header) ProtoReflect() protoreflect.Message { // Deprecated: Use Header.ProtoReflect.Descriptor instead. func (*Header) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{15} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{15} } func (x *Header) GetHash() string { @@ -931,7 +931,7 @@ type PprofRequest struct { func (x *PprofRequest) Reset() { *x = PprofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[16] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -944,7 +944,7 @@ func (x *PprofRequest) String() string { func (*PprofRequest) ProtoMessage() {} func (x *PprofRequest) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[16] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -957,7 +957,7 @@ func (x *PprofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PprofRequest.ProtoReflect.Descriptor instead. func (*PprofRequest) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{16} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{16} } func (x *PprofRequest) GetType() PprofRequest_Type { @@ -996,7 +996,7 @@ type PprofResponse struct { func (x *PprofResponse) Reset() { *x = PprofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[17] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1009,7 +1009,7 @@ func (x *PprofResponse) String() string { func (*PprofResponse) ProtoMessage() {} func (x *PprofResponse) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[17] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1022,7 +1022,7 @@ func (x *PprofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PprofResponse.ProtoReflect.Descriptor instead. func (*PprofResponse) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{17} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{17} } func (m *PprofResponse) GetEvent() isPprofResponse_Event { @@ -1088,7 +1088,7 @@ type StatusResponse_Fork struct { func (x *StatusResponse_Fork) Reset() { *x = StatusResponse_Fork{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[18] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1101,7 +1101,7 @@ func (x *StatusResponse_Fork) String() string { func (*StatusResponse_Fork) ProtoMessage() {} func (x *StatusResponse_Fork) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[18] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1114,7 +1114,7 @@ func (x *StatusResponse_Fork) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse_Fork.ProtoReflect.Descriptor instead. func (*StatusResponse_Fork) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{14, 0} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{14, 0} } func (x *StatusResponse_Fork) GetName() string { @@ -1151,7 +1151,7 @@ type StatusResponse_Syncing struct { func (x *StatusResponse_Syncing) Reset() { *x = StatusResponse_Syncing{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[19] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1164,7 +1164,7 @@ func (x *StatusResponse_Syncing) String() string { func (*StatusResponse_Syncing) ProtoMessage() {} func (x *StatusResponse_Syncing) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[19] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1177,7 +1177,7 @@ func (x *StatusResponse_Syncing) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse_Syncing.ProtoReflect.Descriptor instead. func (*StatusResponse_Syncing) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{14, 1} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{14, 1} } func (x *StatusResponse_Syncing) GetStartingBlock() int64 { @@ -1213,7 +1213,7 @@ type PprofResponse_Open struct { func (x *PprofResponse_Open) Reset() { *x = PprofResponse_Open{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[20] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1226,7 +1226,7 @@ func (x *PprofResponse_Open) String() string { func (*PprofResponse_Open) ProtoMessage() {} func (x *PprofResponse_Open) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[20] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1239,7 +1239,7 @@ func (x *PprofResponse_Open) ProtoReflect() protoreflect.Message { // Deprecated: Use PprofResponse_Open.ProtoReflect.Descriptor instead. func (*PprofResponse_Open) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{17, 0} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{17, 0} } func (x *PprofResponse_Open) GetHeaders() map[string]string { @@ -1267,7 +1267,7 @@ type PprofResponse_Input struct { func (x *PprofResponse_Input) Reset() { *x = PprofResponse_Input{} if protoimpl.UnsafeEnabled { - mi := &file_command_server_proto_server_proto_msgTypes[21] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1280,7 +1280,7 @@ func (x *PprofResponse_Input) String() string { func (*PprofResponse_Input) ProtoMessage() {} func (x *PprofResponse_Input) ProtoReflect() protoreflect.Message { - mi := &file_command_server_proto_server_proto_msgTypes[21] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1293,7 +1293,7 @@ func (x *PprofResponse_Input) ProtoReflect() protoreflect.Message { // Deprecated: Use PprofResponse_Input.ProtoReflect.Descriptor instead. func (*PprofResponse_Input) Descriptor() ([]byte, []int) { - return file_command_server_proto_server_proto_rawDescGZIP(), []int{17, 1} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{17, 1} } func (x *PprofResponse_Input) GetData() []byte { @@ -1303,181 +1303,182 @@ func (x *PprofResponse_Input) GetData() []byte { return nil } -var File_command_server_proto_server_proto protoreflect.FileDescriptor - -var file_command_server_proto_server_proto_rawDesc = []byte{ - 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, - 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x13, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x84, 0x01, 0x0a, - 0x12, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x62, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x12, 0x2c, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x53, 0x74, 0x75, 0x62, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x37, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x62, - 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x0f, - 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x22, - 0x12, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x44, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x50, 0x65, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x12, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x11, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x70, 0x65, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0x2a, 0x0a, 0x12, - 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x36, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1f, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, - 0x22, 0x98, 0x01, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x61, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x04, 0x63, 0x61, 0x70, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, - 0x73, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, - 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x22, 0x2d, 0x0a, 0x13, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0xe2, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x33, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0d, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, - 0x08, 0x6e, 0x75, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x6e, 0x75, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x79, 0x6e, - 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x79, 0x6e, - 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x79, - 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x30, - 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x6b, 0x73, - 0x1a, 0x4c, 0x0a, 0x04, 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x77, - 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x34, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x98, 0x01, - 0x0a, 0x0c, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x22, 0x26, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, 0x4f, 0x4b, - 0x55, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x55, 0x10, 0x01, 0x12, 0x09, 0x0a, - 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x02, 0x22, 0xe1, 0x02, 0x0a, 0x0d, 0x50, 0x70, 0x72, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6f, 0x70, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x05, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, +var File_internal_cli_server_proto_server_proto protoreflect.FileDescriptor + +var file_internal_cli_server_proto_server_proto_rawDesc = []byte{ + 0x0a, 0x26, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x13, 0x0a, 0x11, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x62, 0x52, 0x08, 0x6f, 0x6c, + 0x64, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x62, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x37, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x53, 0x74, 0x75, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x41, 0x0a, 0x0f, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, + 0x73, 0x74, 0x65, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x22, 0x15, + 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x11, 0x50, 0x65, 0x65, + 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, + 0x0a, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, + 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x36, 0x0a, + 0x13, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, + 0x04, 0x70, 0x65, 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x65, 0x6e, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x61, 0x70, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x63, 0x61, 0x70, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x22, 0x2d, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x16, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe2, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0c, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, + 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x33, 0x0a, + 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x79, + 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x1a, 0x4c, 0x0a, 0x04, 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x1a, 0x77, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x24, + 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x68, 0x69, 0x67, 0x68, + 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x34, 0x0a, 0x06, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x0c, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x26, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x55, + 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x02, 0x22, 0xe1, 0x02, + 0x0a, 0x0d, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2f, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, + 0x12, 0x32, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x05, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x2a, 0x0a, 0x03, 0x65, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x03, 0x65, 0x6f, 0x66, + 0x1a, 0x98, 0x01, 0x0a, 0x04, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x40, 0x0a, 0x07, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x2a, 0x0a, 0x03, 0x65, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x03, 0x65, 0x6f, 0x66, 0x1a, 0x98, 0x01, 0x0a, 0x04, - 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x40, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, - 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x1b, 0x0a, 0x05, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x32, 0x8b, 0x04, 0x0a, - 0x03, 0x42, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x05, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x12, 0x13, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x3b, 0x0a, 0x08, 0x50, 0x65, - 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, - 0x09, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, - 0x0b, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x70, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x1a, + 0x3a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x1b, 0x0a, 0x05, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x32, 0x8b, 0x04, 0x0a, 0x03, 0x42, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x05, 0x50, 0x70, 0x72, + 0x6f, 0x66, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, + 0x3b, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0b, + 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, + 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, - 0x65, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, - 0x74, 0x63, 0x68, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x17, 0x5a, 0x15, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x37, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, + 0x1c, 0x5a, 0x1a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6c, 0x69, + 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_command_server_proto_server_proto_rawDescOnce sync.Once - file_command_server_proto_server_proto_rawDescData = file_command_server_proto_server_proto_rawDesc + file_internal_cli_server_proto_server_proto_rawDescOnce sync.Once + file_internal_cli_server_proto_server_proto_rawDescData = file_internal_cli_server_proto_server_proto_rawDesc ) -func file_command_server_proto_server_proto_rawDescGZIP() []byte { - file_command_server_proto_server_proto_rawDescOnce.Do(func() { - file_command_server_proto_server_proto_rawDescData = protoimpl.X.CompressGZIP(file_command_server_proto_server_proto_rawDescData) +func file_internal_cli_server_proto_server_proto_rawDescGZIP() []byte { + file_internal_cli_server_proto_server_proto_rawDescOnce.Do(func() { + file_internal_cli_server_proto_server_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_cli_server_proto_server_proto_rawDescData) }) - return file_command_server_proto_server_proto_rawDescData + return file_internal_cli_server_proto_server_proto_rawDescData } -var file_command_server_proto_server_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_command_server_proto_server_proto_msgTypes = make([]protoimpl.MessageInfo, 23) -var file_command_server_proto_server_proto_goTypes = []interface{}{ +var file_internal_cli_server_proto_server_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_internal_cli_server_proto_server_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_internal_cli_server_proto_server_proto_goTypes = []interface{}{ (PprofRequest_Type)(0), // 0: proto.PprofRequest.Type (*ChainWatchRequest)(nil), // 1: proto.ChainWatchRequest (*ChainWatchResponse)(nil), // 2: proto.ChainWatchResponse @@ -1504,7 +1505,7 @@ var file_command_server_proto_server_proto_goTypes = []interface{}{ nil, // 23: proto.PprofResponse.Open.HeadersEntry (*emptypb.Empty)(nil), // 24: google.protobuf.Empty } -var file_command_server_proto_server_proto_depIdxs = []int32{ +var file_internal_cli_server_proto_server_proto_depIdxs = []int32{ 3, // 0: proto.ChainWatchResponse.oldchain:type_name -> proto.BlockStub 3, // 1: proto.ChainWatchResponse.newchain:type_name -> proto.BlockStub 12, // 2: proto.PeersListResponse.peers:type_name -> proto.Peer @@ -1541,13 +1542,13 @@ var file_command_server_proto_server_proto_depIdxs = []int32{ 0, // [0:13] is the sub-list for field type_name } -func init() { file_command_server_proto_server_proto_init() } -func file_command_server_proto_server_proto_init() { - if File_command_server_proto_server_proto != nil { +func init() { file_internal_cli_server_proto_server_proto_init() } +func file_internal_cli_server_proto_server_proto_init() { + if File_internal_cli_server_proto_server_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_command_server_proto_server_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChainWatchRequest); i { case 0: return &v.state @@ -1559,7 +1560,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChainWatchResponse); i { case 0: return &v.state @@ -1571,7 +1572,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BlockStub); i { case 0: return &v.state @@ -1583,7 +1584,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeersAddRequest); i { case 0: return &v.state @@ -1595,7 +1596,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeersAddResponse); i { case 0: return &v.state @@ -1607,7 +1608,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeersRemoveRequest); i { case 0: return &v.state @@ -1619,7 +1620,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeersRemoveResponse); i { case 0: return &v.state @@ -1631,7 +1632,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeersListRequest); i { case 0: return &v.state @@ -1643,7 +1644,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeersListResponse); i { case 0: return &v.state @@ -1655,7 +1656,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeersStatusRequest); i { case 0: return &v.state @@ -1667,7 +1668,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeersStatusResponse); i { case 0: return &v.state @@ -1679,7 +1680,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Peer); i { case 0: return &v.state @@ -1691,7 +1692,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChainSetHeadRequest); i { case 0: return &v.state @@ -1703,7 +1704,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChainSetHeadResponse); i { case 0: return &v.state @@ -1715,7 +1716,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusResponse); i { case 0: return &v.state @@ -1727,7 +1728,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Header); i { case 0: return &v.state @@ -1739,7 +1740,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PprofRequest); i { case 0: return &v.state @@ -1751,7 +1752,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PprofResponse); i { case 0: return &v.state @@ -1763,7 +1764,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusResponse_Fork); i { case 0: return &v.state @@ -1775,7 +1776,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusResponse_Syncing); i { case 0: return &v.state @@ -1787,7 +1788,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PprofResponse_Open); i { case 0: return &v.state @@ -1799,7 +1800,7 @@ func file_command_server_proto_server_proto_init() { return nil } } - file_command_server_proto_server_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_internal_cli_server_proto_server_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PprofResponse_Input); i { case 0: return &v.state @@ -1812,7 +1813,7 @@ func file_command_server_proto_server_proto_init() { } } } - file_command_server_proto_server_proto_msgTypes[17].OneofWrappers = []interface{}{ + file_internal_cli_server_proto_server_proto_msgTypes[17].OneofWrappers = []interface{}{ (*PprofResponse_Open_)(nil), (*PprofResponse_Input_)(nil), (*PprofResponse_Eof)(nil), @@ -1821,19 +1822,19 @@ func file_command_server_proto_server_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_command_server_proto_server_proto_rawDesc, + RawDescriptor: file_internal_cli_server_proto_server_proto_rawDesc, NumEnums: 1, NumMessages: 23, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_command_server_proto_server_proto_goTypes, - DependencyIndexes: file_command_server_proto_server_proto_depIdxs, - EnumInfos: file_command_server_proto_server_proto_enumTypes, - MessageInfos: file_command_server_proto_server_proto_msgTypes, + GoTypes: file_internal_cli_server_proto_server_proto_goTypes, + DependencyIndexes: file_internal_cli_server_proto_server_proto_depIdxs, + EnumInfos: file_internal_cli_server_proto_server_proto_enumTypes, + MessageInfos: file_internal_cli_server_proto_server_proto_msgTypes, }.Build() - File_command_server_proto_server_proto = out.File - file_command_server_proto_server_proto_rawDesc = nil - file_command_server_proto_server_proto_goTypes = nil - file_command_server_proto_server_proto_depIdxs = nil + File_internal_cli_server_proto_server_proto = out.File + file_internal_cli_server_proto_server_proto_rawDesc = nil + file_internal_cli_server_proto_server_proto_goTypes = nil + file_internal_cli_server_proto_server_proto_depIdxs = nil } diff --git a/internal/cli/server/proto/server.proto b/internal/cli/server/proto/server.proto index 2dc84bff78..7259e7dacb 100644 --- a/internal/cli/server/proto/server.proto +++ b/internal/cli/server/proto/server.proto @@ -4,7 +4,7 @@ package proto; import "google/protobuf/empty.proto"; -option go_package = "/command/server/proto"; +option go_package = "/internal/cli/server/proto"; service Bor { rpc Pprof(PprofRequest) returns (stream PprofResponse); diff --git a/internal/cli/server/proto/server_grpc.pb.go b/internal/cli/server/proto/server_grpc.pb.go index 9ed2593e47..b3a6244c18 100644 --- a/internal/cli/server/proto/server_grpc.pb.go +++ b/internal/cli/server/proto/server_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.17.3 -// source: command/server/proto/server.proto package proto @@ -409,5 +405,5 @@ var Bor_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, }, - Metadata: "command/server/proto/server.proto", + Metadata: "internal/cli/server/proto/server.proto", } diff --git a/scripts/tools-protobuf.sh b/scripts/tools-protobuf.sh index fe03cab3cb..04144134f4 100755 --- a/scripts/tools-protobuf.sh +++ b/scripts/tools-protobuf.sh @@ -1,15 +1,24 @@ #!/bin/bash # Install protobuf -PROTOC_ZIP=protoc-3.12.0-linux-x86_64.zip -curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.12.0/$PROTOC_ZIP +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + os="linux" +elif [[ "$OSTYPE" == "darwin"* ]]; then + os="osx" +else + echo "Unsupported platform" + exit 1 +fi + +PROTOC_ZIP=protoc-3.19.3-$os-x86_64.zip +curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.19.3/$PROTOC_ZIP sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*' rm -f $PROTOC_ZIP # Change permissions to use the binary -sudo chmod 755 -R /usr/local/bin/protoc -sudo chmod 755 -R /usr/local/include +sudo chmod -R 755 /usr/local/bin/protoc +sudo chmod -R 755 /usr/local/include # Install golang extensions (DO NOT CHANGE THE VERSIONS) go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.25.0 From 66fc055a7b7fc0695f0e00e1d7976b4aeede9975 Mon Sep 17 00:00:00 2001 From: Victor Castell Date: Thu, 3 Feb 2022 14:37:46 +0100 Subject: [PATCH 023/190] Build and run the new CLI (#318) * Build and run the new CLI --- .goreleaser.yml | 8 ++++---- Makefile | 10 +--------- README.md | 12 ------------ builder/files/bor.service | 22 +++++++++++----------- 4 files changed, 16 insertions(+), 36 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 331d8de6b5..d09cc43206 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -7,7 +7,7 @@ release: builds: - id: darwin-amd64 - main: ./cmd/geth + main: ./cmd/cli binary: bor goos: - darwin @@ -22,7 +22,7 @@ builds: -s -w - id: darwin-arm64 - main: ./cmd/geth + main: ./cmd/cli binary: bor goos: - darwin @@ -37,7 +37,7 @@ builds: -s -w - id: linux-amd64 - main: ./cmd/geth + main: ./cmd/cli binary: bor goos: - linux @@ -53,7 +53,7 @@ builds: -s -w -extldflags "-static" - id: linux-arm64 - main: ./cmd/geth + main: ./cmd/cli binary: bor goos: - linux diff --git a/Makefile b/Makefile index 5bee26f690..678af31c46 100644 --- a/Makefile +++ b/Makefile @@ -10,16 +10,8 @@ GORUN = env GO111MODULE=on go run GOPATH = $(shell go env GOPATH) bor: - $(GORUN) build/ci.go install ./cmd/geth - mkdir -p $(GOPATH)/bin/ - cp $(GOBIN)/geth $(GOBIN)/bor - cp $(GOBIN)/* $(GOPATH)/bin/ - -bor-all: - $(GORUN) build/ci.go install mkdir -p $(GOPATH)/bin/ - cp $(GOBIN)/geth $(GOBIN)/bor - cp $(GOBIN)/* $(GOPATH)/bin/ + go build -o $(GOBIN)/bor ./cmd/cli/main.go protoc: protoc --go_out=. --go-grpc_out=. ./internal/cli/server/proto/*.proto diff --git a/README.md b/README.md index 1dacae0219..4e33a551d0 100644 --- a/README.md +++ b/README.md @@ -63,12 +63,6 @@ them using your favourite package manager. Once the dependencies are installed, $ make bor ``` -- or, to build the full suite of utilities: - - ```shell - $ make bor-all - ``` - ### Make awesome changes! 1. Create new branch for your changes @@ -113,12 +107,6 @@ them using your favourite package manager. Once the dependencies are installed,
-Build the beta client: - -```shell -go build -o bor-beta command/*.go -``` - ## License The go-ethereum library (i.e. all code outside of the `cmd` directory) is licensed under the diff --git a/builder/files/bor.service b/builder/files/bor.service index fa84320a6c..4f834a3cb4 100644 --- a/builder/files/bor.service +++ b/builder/files/bor.service @@ -6,19 +6,19 @@ [Service] Restart=on-failure RestartSec=5s - ExecStart=/usr/local/bin/bor \ - --bor-mumbai \ - # --bor-mainnet \ - --datadir /var/lib/bor/data \ - --bootnodes "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303,enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303" + ExecStart=/usr/local/bin/bor server \ + -chain=mumbai \ + # -chain=mainnet \ + -datadir /var/lib/bor/data \ + -bootnodes "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303,enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303" # Validator params # Uncomment and configure the following lines in case you run a validator - # --keystore /var/lib/bor/keystore \ - # --unlock [VALIDATOR ADDRESS] \ - # --password /var/lib/bor/password.txt \ - # --allow-insecure-unlock \ - # --nodiscover --maxpeers 1 \ - # --mine + # -keystore /var/lib/bor/keystore \ + # -unlock [VALIDATOR ADDRESS] \ + # -password /var/lib/bor/password.txt \ + # -allow-insecure-unlock \ + # -nodiscover -maxpeers 1 \ + # -mine Type=simple User=root KillSignal=SIGINT From e10b10a3dd321d8daa6b2dd91343c13ae2fe9e48 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Fri, 4 Feb 2022 20:10:26 +0530 Subject: [PATCH 024/190] start http rpc server and eth namespace by default (#319) --- internal/cli/server/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 06ec8c16af..9f5e4fa81f 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -443,11 +443,11 @@ func DefaultConfig() *Config { GasCap: ethconfig.Defaults.RPCGasCap, TxFeeCap: ethconfig.Defaults.RPCTxFeeCap, Http: &APIConfig{ - Enabled: false, + Enabled: true, Port: 8545, Prefix: "", Host: "localhost", - Modules: []string{"web3", "net"}, + Modules: []string{"eth", "web3", "net"}, }, Ws: &APIConfig{ Enabled: false, From 1ef2726beb6fae2eac66ca5f72215706b144ba7a Mon Sep 17 00:00:00 2001 From: Krishna Upadhyaya Date: Fri, 21 Jan 2022 17:56:30 +0530 Subject: [PATCH 025/190] Add ability to run using chain json file --- internal/cli/server/chains/chain.go | 30 +++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/internal/cli/server/chains/chain.go b/internal/cli/server/chains/chain.go index 05c12ef0b0..570619609d 100644 --- a/internal/cli/server/chains/chain.go +++ b/internal/cli/server/chains/chain.go @@ -1,6 +1,9 @@ package chains import ( + "encoding/json" + "io/ioutil" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" ) @@ -19,6 +22,29 @@ var chains = map[string]*Chain{ } func GetChain(name string) (*Chain, bool) { - chain, ok := chains[name] - return chain, ok + chain, err := ImportFromFile(name) + if err != nil { + chain, ok := chains[name] + return chain, ok + } + return chain, true +} + +func ImportFromFile(filename string) (*Chain, error) { + data, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + + return importChain(data) +} + +func importChain(content []byte) (*Chain, error) { + var chain *Chain + + if err := json.Unmarshal(content, &chain); err != nil { + return nil, err + } + + return chain, nil } From b3984096e2b212fc28d41304ac851749f030abcd Mon Sep 17 00:00:00 2001 From: Krishna Upadhyaya Date: Fri, 21 Jan 2022 19:28:07 +0530 Subject: [PATCH 026/190] Updated file check --- internal/cli/server/chains/chain.go | 25 +++++++++++++++++++------ internal/cli/server/config.go | 9 +++------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/internal/cli/server/chains/chain.go b/internal/cli/server/chains/chain.go index 570619609d..4fc7bad5d1 100644 --- a/internal/cli/server/chains/chain.go +++ b/internal/cli/server/chains/chain.go @@ -2,7 +2,10 @@ package chains import ( "encoding/json" + "errors" + "fmt" "io/ioutil" + "os" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -21,13 +24,23 @@ var chains = map[string]*Chain{ "mumbai": mumbaiTestnet, } -func GetChain(name string) (*Chain, bool) { - chain, err := ImportFromFile(name) - if err != nil { - chain, ok := chains[name] - return chain, ok +func GetChain(name string) (*Chain, error) { + var chain *Chain + var err error + if _, fileErr := os.Stat(name); fileErr == nil { + if chain, err = ImportFromFile(name); err != nil { + return nil, fmt.Errorf("error importing chain from file: %v", err) + } + return chain, nil + } else if errors.Is(fileErr, os.ErrNotExist) { + var ok bool + if chain, ok = chains[name]; !ok { + return nil, fmt.Errorf("chain %s not found", name) + } + return chain, nil + } else { + return nil, fileErr } - return chain, true } func ImportFromFile(filename string) (*Chain, error) { diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 9f5e4fa81f..29cb8ffa21 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -591,12 +591,9 @@ func readConfigFile(path string) (*Config, error) { } func (c *Config) loadChain() error { - if c.Developer.Enabled { - return nil - } - chain, ok := chains.GetChain(c.Chain) - if !ok { - return fmt.Errorf("chain '%s' not found", c.Chain) + chain, err := chains.GetChain(c.Chain) + if err != nil { + return err } c.chain = chain From d7ebe2fca1c06cc6f15a0d825803cff2420d2f80 Mon Sep 17 00:00:00 2001 From: Krishna Upadhyaya Date: Mon, 24 Jan 2022 11:26:31 +0530 Subject: [PATCH 027/190] Add test case for Import from file --- internal/cli/server/chains/chain_test.go | 36 ++++++++ .../server/chains/test_files/chain_test.json | 92 +++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 internal/cli/server/chains/chain_test.go create mode 100644 internal/cli/server/chains/test_files/chain_test.json diff --git a/internal/cli/server/chains/chain_test.go b/internal/cli/server/chains/chain_test.go new file mode 100644 index 0000000000..d9bc638af2 --- /dev/null +++ b/internal/cli/server/chains/chain_test.go @@ -0,0 +1,36 @@ +package chains + +import ( + "testing" +) + +func TestImportFromFile(t *testing.T) { + type args struct { + filename string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "ImportFromFile correct json file", + args: args{filename: "test_files/chain_test.json"}, + wantErr: false, + }, + { + name: "ImportFromFile nonexistent json file", + args: args{filename: "test_files/chain_test_nonexistent.json"}, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := ImportFromFile(tt.args.filename) + if (err != nil) != tt.wantErr { + t.Errorf("ImportFromFile() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} diff --git a/internal/cli/server/chains/test_files/chain_test.json b/internal/cli/server/chains/test_files/chain_test.json new file mode 100644 index 0000000000..5bfe155d27 --- /dev/null +++ b/internal/cli/server/chains/test_files/chain_test.json @@ -0,0 +1,92 @@ +{ + "Hash":"0x7b66506a9ebdbf30d32b43c5f15a3b1216269a1ec3a75aa3182b86176a2b1ca7", + "Genesis":{ + "config":{ + "chainId":80001, + "homesteadBlock":0, + "daoForkSupport":true, + "eip150Block":0, + "eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block":0, + "eip158Block":0, + "byzantiumBlock":0, + "constantinopleBlock":0, + "petersburgBlock":0, + "istanbulBlock":2722000, + "muirGlacierBlock":2722000, + "berlinBlock":13996000, + "londonBlock":13996000, + "bor":{ + "period":{ + "0":2 + }, + "producerDelay":6, + "sprint":64, + "backupMultiplier":{ + "0":2 + }, + "validatorContract":"0x0000000000000000000000000000000000001000", + "stateReceiverContract":"0x0000000000000000000000000000000000001001", + "overrideStateSyncRecords":null, + "blockAlloc":{ + "22244000":{ + "0000000000000000000000000000000000001010":{ + "balance":"0x0", + "code":"0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610caa565b005b3480156103eb57600080fd5b506103f4610dfc565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e05565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fc1565b005b3480156104e857600080fd5b506104f1611090565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b506105486110b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110dc565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b506106046110fd565b005b34801561061257600080fd5b5061061b6111cd565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506111d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b50610758611358565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af611381565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de6113d8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e611411565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061144e565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b50610964611474565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b8101908080359060200190929190505050611501565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611521565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a65611541565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a90611548565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb61154e565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115db565b005b348015610b2e57600080fd5b50610b376115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b60003390506000610cba826110dc565b9050610cd18360065461161e90919063ffffffff16565b600681905550600083118015610ce657508234145b610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610dd4876110dc565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610e0d611381565b610e1657600080fd5b600081118015610e535750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611da96023913960400191505060405180910390fd5b6000610eb3836110dc565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610f00573d6000803e3d6000fd5b50610f168360065461163e90919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f68585610f98896110dc565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611027576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611d866023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061108c8261165d565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b611105611381565b61110e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b60008060008060418551146111ee5760009350505050611352565b602085015192506040850151915060ff6041860151169050601b8160ff16101561121957601b810190505b601b8160ff16141580156112315750601c8160ff1614155b156112425760009350505050611352565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561129f573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b6000813414611460576000905061146e565b61146b338484611755565b90505b92915050565b6040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b602083106114c357805182526020820191506020810190506020830392506114a0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061153761153286868686611b12565b611be8565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611dcc605291396040516020018082805190602001908083835b6020831061159d578051825260208201915060208101905060208303925061157a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b6115e3611381565b6115ec57600080fd5b6115f58161165d565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282111561162d57600080fd5b600082840390508091505092915050565b60008082840190508381101561165357600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561169757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b810190808051906020019092919050505090506118d9868686611c32565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d6020811015611a0b57600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b6000806040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b60208310611b645780518252602082019150602081019050602083039250611b41565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e27742073656e6420746f204d524332300000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d1a573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a72315820ccd6c2a9c259832bbb367986ee06cd87af23022681b0cb22311a864b701d939564736f6c63430005100032" + } + } + }, + "burntContract":{ + "22640000":"0x70bcA57F4579f58670aB2d18Ef16e02C17553C38" + }, + "jaipurBlock":22770000 + } + }, + "nonce":"0x0", + "timestamp":"0x5ce28211", + "extraData":"0x", + "gasLimit":"0x989680", + "difficulty":"0x1", + "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase":"0x0000000000000000000000000000000000000000", + "alloc":{ + "0000000000000000000000000000000000001000":{ + "code":"0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806360c8614d1161010f578063af26aa96116100a2578063d5b844eb11610071578063d5b844eb14610666578063dcf2793a14610684578063e3b7c924146106b6578063f59cf565146106d4576101f0565b8063af26aa96146105c7578063b71d7a69146105e7578063b7ab4db514610617578063c1b3c91914610636576101f0565b806370ba5707116100de57806370ba57071461052b57806398ab2b621461055b5780639d11b80714610579578063ae756451146105a9576101f0565b806360c8614d1461049c57806365b3a1e2146104bc57806366332354146104db578063687a9bd6146104f9576101f0565b80633434735f1161018757806344d6528f1161015657806344d6528f146103ee5780634dbc959f1461041e57806355614fcc1461043c578063582a8d081461046c576101f0565b80633434735f1461035257806335ddfeea1461037057806343ee8213146103a057806344c15cb1146103be576101f0565b806323f2a73f116101c357806323f2a73f146102a45780632bc06564146102d45780632de3a180146102f25780632eddf35214610322576101f0565b8063047a6c5b146101f55780630c35b1cb146102275780631270b5741461025857806323c2a2b414610288575b600080fd5b61020f600480360361020a9190810190612b24565b610706565b60405161021e93929190613463565b60405180910390f35b610241600480360361023c9190810190612b24565b61075d565b60405161024f929190613284565b60405180910390f35b610272600480360361026d9190810190612b4d565b610939565b60405161027f91906132bb565b60405180910390f35b6102a2600480360361029d9190810190612c2c565b610a91565b005b6102be60048036036102b99190810190612b4d565b61112a565b6040516102cb91906132bb565b60405180910390f35b6102dc611281565b6040516102e99190613411565b60405180910390f35b61030c60048036036103079190810190612a81565b611286565b60405161031991906132d6565b60405180910390f35b61033c60048036036103379190810190612b24565b611307565b6040516103499190613411565b60405180910390f35b61035a611437565b6040516103679190613269565b60405180910390f35b61038a60048036036103859190810190612abd565b61144f565b60405161039791906132bb565b60405180910390f35b6103a861151a565b6040516103b591906132d6565b60405180910390f35b6103d860048036036103d39190810190612b89565b611531565b6040516103e59190613411565b60405180910390f35b61040860048036036104039190810190612b4d565b611619565b60405161041591906133f6565b60405180910390f35b610426611781565b6040516104339190613411565b60405180910390f35b61045660048036036104519190810190612a06565b611791565b60405161046391906132bb565b60405180910390f35b61048660048036036104819190810190612a2f565b6117ab565b60405161049391906132d6565b60405180910390f35b6104a4611829565b6040516104b393929190613463565b60405180910390f35b6104c461189d565b6040516104d2929190613284565b60405180910390f35b6104e3611b6e565b6040516104f09190613411565b60405180910390f35b610513600480360361050e9190810190612bf0565b611b73565b6040516105229392919061342c565b60405180910390f35b61054560048036036105409190810190612a06565b611bd7565b60405161055291906132bb565b60405180910390f35b610563611bf1565b60405161057091906132d6565b60405180910390f35b610593600480360361058e9190810190612b24565b611c08565b6040516105a09190613411565b60405180910390f35b6105b1611d39565b6040516105be91906132d6565b60405180910390f35b6105cf611d50565b6040516105de93929190613463565b60405180910390f35b61060160048036036105fc9190810190612b24565b611db1565b60405161060e9190613411565b60405180910390f35b61061f611eb1565b60405161062d929190613284565b60405180910390f35b610650600480360361064b9190810190612b24565b611ec5565b60405161065d9190613411565b60405180910390f35b61066e611ee6565b60405161067b919061349a565b60405180910390f35b61069e60048036036106999190810190612bf0565b611eeb565b6040516106ad9392919061342c565b60405180910390f35b6106be611f4f565b6040516106cb9190613411565b60405180910390f35b6106ee60048036036106e99190810190612b24565b611f61565b6040516106fd93929190613463565b60405180910390f35b60008060006002600085815260200190815260200160002060000154600260008681526020019081526020016000206001015460026000878152602001908152602001600020600201549250925092509193909250565b60608060ff83116107795761077061189d565b91509150610934565b600061078484611db1565b9050606060016000838152602001908152602001600020805490506040519080825280602002602001820160405280156107cd5781602001602082028038833980820191505090505b509050606060016000848152602001908152602001600020805490506040519080825280602002602001820160405280156108175781602001602082028038833980820191505090505b50905060008090505b60016000858152602001908152602001600020805490508110156109295760016000858152602001908152602001600020818154811061085c57fe5b906000526020600020906003020160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061089a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600085815260200190815260200160002081815481106108f257fe5b90600052602060002090600302016001015482828151811061091057fe5b6020026020010181815250508080600101915050610820565b508181945094505050505b915091565b6000606060016000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a0c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190610970565b50505050905060008090505b8151811015610a84578373ffffffffffffffffffffffffffffffffffffffff16828281518110610a4457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff161415610a7757600192505050610a8b565b8080600101915050610a18565b5060009150505b92915050565b73fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906133d6565b60405180910390fd5b6000610b1d611781565b90506000811415610b3157610b30611f8b565b5b610b456001826122ac90919063ffffffff16565b8814610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90613356565b60405180910390fd5b868611610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906133b6565b60405180910390fd5b6000604060018989030181610bd957fe5b0614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613396565b60405180910390fd5b8660026000838152602001908152602001600020600101541115610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90613336565b60405180910390fd5b6000600260008a81526020019081526020016000206000015414610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613376565b60405180910390fd5b604051806060016040528089815260200188815260200187815250600260008a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600388908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008a815260200190815260200160002081610d669190612800565b506000600160008a815260200190815260200160002081610d879190612800565b506060610ddf610dda87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b8151811015610f51576060610e0e838381518110610e0157fe5b60200260200101516122f9565b90506000808c81526020019081526020016000208054809190600101610e349190612800565b506040518060600160405280610e5d83600081518110610e5057fe5b60200260200101516123d6565b8152602001610e7f83600181518110610e7257fe5b60200260200101516123d6565b8152602001610ea183600281518110610e9457fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff168152506000808d81526020019081526020016000208381548110610ed757fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610de7565b506060610fa9610fa486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b815181101561111d576060610fd8838381518110610fcb57fe5b60200260200101516122f9565b9050600160008d81526020019081526020016000208054809190600101610fff9190612800565b5060405180606001604052806110288360008151811061101b57fe5b60200260200101516123d6565b815260200161104a8360018151811061103d57fe5b60200260200101516123d6565b815260200161106c8360028151811061105f57fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff16815250600160008e815260200190815260200160002083815481106110a357fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610fb1565b5050505050505050505050565b60006060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156111fc578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611160565b50505050905060008090505b8151811015611274578373ffffffffffffffffffffffffffffffffffffffff1682828151811061123457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff1614156112675760019250505061127b565b8080600101915050611208565b5060009150505b92915050565b604081565b60006002600160f81b84846040516020016112a3939291906131d6565b6040516020818303038152906040526040516112bf9190613213565b602060405180830381855afa1580156112dc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506112ff9190810190612a58565b905092915050565b60006060600080848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156113d9578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508152602001906001019061133d565b505050509050600080905060008090505b825181101561142c5761141d83828151811061140257fe5b602002602001015160200151836122ac90919063ffffffff16565b915080806001019150506113ea565b508092505050919050565b73fffffffffffffffffffffffffffffffffffffffe81565b600080600080859050600060218087518161146657fe5b04029050600081111561147f5761147c876117ab565b91505b6000602190505b818111611509576000600182038801519050818801519550806000602081106114ab57fe5b1a60f81b9450600060f81b857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156114f0576114e98685611286565b93506114fd565b6114fa8487611286565b93505b50602181019050611486565b508782149450505050509392505050565b60405161152690613254565b604051809103902081565b60008060009050600080905060008090505b84518167ffffffffffffffff16101561160c57606061156e868367ffffffffffffffff16604161246a565b9050600061158582896124f690919063ffffffff16565b905061158f612832565b6115998a83611619565b90506115a58a8361112a565b80156115dc57508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16115b156115fe578194506115fb8160200151876122ac90919063ffffffff16565b95505b505050604181019050611543565b5081925050509392505050565b611621612832565b6060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156116f1578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611655565b50505050905060008090505b8151811015611779578373ffffffffffffffffffffffffffffffffffffffff1682828151811061172957fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff16141561176c5781818151811061175d57fe5b60200260200101519250611779565b80806001019150506116fd565b505092915050565b600061178c43611db1565b905090565b60006117a461179e611781565b8361112a565b9050919050565b60006002600060f81b836040516020016117c69291906131aa565b6040516020818303038152906040526040516117e29190613213565b602060405180830381855afa1580156117ff573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506118229190810190612a58565b9050919050565b60008060008061184a600161183c611781565b6122ac90919063ffffffff16565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b606080606060056040519080825280602002602001820160405280156118d25781602001602082028038833980820191505090505b50905073c26880a0af2ea0c7e8130e6ec47af756465452e8816000815181106118f757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073be188d6641e8b680743a4815dfa0f6208038960f8160018151811061195357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c275dc8be39f50d12f66b6a63629c39da5bae5bd816002815181106119af57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073f903ba9e006193c1527bfbe65fe2123704ea3f9981600381518110611a0b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073928ed6a3e94437bbd316ccad78479f1d163a6a8c81600481518110611a6757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606005604051908082528060200260200182016040528015611ad35781602001602082028038833980820191505090505b50905061271081600081518110611ae657fe5b60200260200101818152505061271081600181518110611b0257fe5b60200260200101818152505061271081600281518110611b1e57fe5b60200260200101818152505061271081600381518110611b3a57fe5b60200260200101818152505061271081600481518110611b5657fe5b60200260200101818152505081819350935050509091565b60ff81565b60016020528160005260406000208181548110611b8c57fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b6000611bea611be4611781565b83610939565b9050919050565b604051611bfd9061322a565b604051809103902081565b6000606060016000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611cdb578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611c3f565b505050509050600080905060008090505b8251811015611d2e57611d1f838281518110611d0457fe5b602002602001015160200151836122ac90919063ffffffff16565b91508080600101915050611cec565b508092505050919050565b604051611d459061323f565b604051809103902081565b600080600080611d5e611781565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b60008060038054905090505b6000811115611e7157611dce612869565b6002600060036001850381548110611de257fe5b906000526020600020015481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905083816020015111158015611e3f57506000816040015114155b8015611e4f575080604001518411155b15611e6257806000015192505050611eac565b50808060019003915050611dbd565b5060006003805490501115611ea757600360016003805490500381548110611e9557fe5b90600052602060002001549050611eac565b600090505b919050565b606080611ebd4361075d565b915091509091565b60038181548110611ed257fe5b906000526020600020016000915090505481565b600281565b60006020528160005260406000208181548110611f0457fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b600060404381611f5b57fe5b04905090565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b606080611f9661189d565b8092508193505050600080905060405180606001604052808281526020016000815260200160ff81525060026000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600381908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008381526020019081526020016000208161203f9190612800565b50600060016000838152602001908152602001600020816120609190612800565b5060008090505b83518110156121825760008083815260200190815260200160002080548091906001016120949190612800565b5060405180606001604052808281526020018483815181106120b257fe5b602002602001015181526020018583815181106120cb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815250600080848152602001908152602001600020828154811061210957fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612067565b5060008090505b83518110156122a6576001600083815260200190815260200160002080548091906001016121b79190612800565b5060405180606001604052808281526020018483815181106121d557fe5b602002602001015181526020018583815181106121ee57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681525060016000848152602001908152602001600020828154811061222d57fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612189565b50505050565b6000808284019050838110156122c157600080fd5b8091505092915050565b6122d361288a565b600060208301905060405180604001604052808451815260200182815250915050919050565b606061230482612600565b61230d57600080fd5b60006123188361264e565b905060608160405190808252806020026020018201604052801561235657816020015b6123436128a4565b81526020019060019003908161233b5790505b509050600061236885602001516126bf565b8560200151019050600080600090505b848110156123c95761238983612748565b91506040518060400160405280838152602001848152508482815181106123ac57fe5b602002602001018190525081830192508080600101915050612378565b5082945050505050919050565b60008082600001511180156123f057506021826000015111155b6123f957600080fd5b600061240883602001516126bf565b9050600081846000015103905060008083866020015101905080519150602083101561243b57826020036101000a820491505b81945050505050919050565b6000601582600001511461245a57600080fd5b612463826123d6565b9050919050565b60608183018451101561247c57600080fd5b6060821560008114612499576040519150602082016040526124ea565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156124d757805183526020830192506020810190506124ba565b50868552601f19601f8301166040525050505b50809150509392505050565b600080600080604185511461251157600093505050506125fa565b602085015192506040850151915060ff6041860151169050601b8160ff16101561253c57601b810190505b601b8160ff16141580156125545750601c8160ff1614155b1561256557600093505050506125fa565b60006001878386866040516000815260200160405260405161258a94939291906132f1565b6020604051602081039080840390855afa1580156125ac573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125f257600080fd5b809450505050505b92915050565b600080826000015114156126175760009050612649565b60008083602001519050805160001a915060c060ff168260ff16101561264257600092505050612649565b6001925050505b919050565b6000808260000151141561266557600090506126ba565b6000809050600061267984602001516126bf565b84602001510190506000846000015185602001510190505b808210156126b3576126a282612748565b820191508280600101935050612691565b8293505050505b919050565b600080825160001a9050608060ff168110156126df576000915050612743565b60b860ff16811080612704575060c060ff168110158015612703575060f860ff1681105b5b15612713576001915050612743565b60c060ff168110156127335760018060b80360ff16820301915050612743565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561276957600191506127f6565b60b860ff16811015612786576001608060ff1682030191506127f5565b60c060ff168110156127b65760b78103600185019450806020036101000a855104600182018101935050506127f4565b60f860ff168110156127d357600160c060ff1682030191506127f3565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b81548183558181111561282d5760030281600302836000526020600020918201910161282c91906128be565b5b505050565b60405180606001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180606001604052806000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604051806040016040528060008152602001600081525090565b61291191905b8082111561290d5760008082016000905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506003016128c4565b5090565b90565b60008135905061292381613693565b92915050565b600081359050612938816136aa565b92915050565b60008151905061294d816136aa565b92915050565b60008083601f84011261296557600080fd5b8235905067ffffffffffffffff81111561297e57600080fd5b60208301915083600182028301111561299657600080fd5b9250929050565b600082601f8301126129ae57600080fd5b81356129c16129bc826134e2565b6134b5565b915080825260208301602083018583830111156129dd57600080fd5b6129e883828461363d565b50505092915050565b600081359050612a00816136c1565b92915050565b600060208284031215612a1857600080fd5b6000612a2684828501612914565b91505092915050565b600060208284031215612a4157600080fd5b6000612a4f84828501612929565b91505092915050565b600060208284031215612a6a57600080fd5b6000612a788482850161293e565b91505092915050565b60008060408385031215612a9457600080fd5b6000612aa285828601612929565b9250506020612ab385828601612929565b9150509250929050565b600080600060608486031215612ad257600080fd5b6000612ae086828701612929565b9350506020612af186828701612929565b925050604084013567ffffffffffffffff811115612b0e57600080fd5b612b1a8682870161299d565b9150509250925092565b600060208284031215612b3657600080fd5b6000612b44848285016129f1565b91505092915050565b60008060408385031215612b6057600080fd5b6000612b6e858286016129f1565b9250506020612b7f85828601612914565b9150509250929050565b600080600060608486031215612b9e57600080fd5b6000612bac868287016129f1565b9350506020612bbd86828701612929565b925050604084013567ffffffffffffffff811115612bda57600080fd5b612be68682870161299d565b9150509250925092565b60008060408385031215612c0357600080fd5b6000612c11858286016129f1565b9250506020612c22858286016129f1565b9150509250929050565b600080600080600080600060a0888a031215612c4757600080fd5b6000612c558a828b016129f1565b9750506020612c668a828b016129f1565b9650506040612c778a828b016129f1565b955050606088013567ffffffffffffffff811115612c9457600080fd5b612ca08a828b01612953565b9450945050608088013567ffffffffffffffff811115612cbf57600080fd5b612ccb8a828b01612953565b925092505092959891949750929550565b6000612ce88383612d0c565b60208301905092915050565b6000612d00838361317d565b60208301905092915050565b612d15816135b2565b82525050565b612d24816135b2565b82525050565b6000612d358261352e565b612d3f8185613569565b9350612d4a8361350e565b8060005b83811015612d7b578151612d628882612cdc565b9750612d6d8361354f565b925050600181019050612d4e565b5085935050505092915050565b6000612d9382613539565b612d9d818561357a565b9350612da88361351e565b8060005b83811015612dd9578151612dc08882612cf4565b9750612dcb8361355c565b925050600181019050612dac565b5085935050505092915050565b612def816135c4565b82525050565b612e06612e01826135d0565b61367f565b82525050565b612e15816135fc565b82525050565b612e2c612e27826135fc565b613689565b82525050565b6000612e3d82613544565b612e47818561358b565b9350612e5781856020860161364c565b80840191505092915050565b6000612e706004836135a7565b91507f766f7465000000000000000000000000000000000000000000000000000000006000830152600482019050919050565b6000612eb0602d83613596565b91507f537461727420626c6f636b206d7573742062652067726561746572207468616e60008301527f2063757272656e74207370616e000000000000000000000000000000000000006020830152604082019050919050565b6000612f16600f83613596565b91507f496e76616c6964207370616e20696400000000000000000000000000000000006000830152602082019050919050565b6000612f56601383613596565b91507f5370616e20616c726561647920657869737473000000000000000000000000006000830152602082019050919050565b6000612f96604583613596565b91507f446966666572656e6365206265747765656e20737461727420616e6420656e6460008301527f20626c6f636b206d75737420626520696e206d756c7469706c6573206f66207360208301527f7072696e740000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613022602a83613596565b91507f456e6420626c6f636b206d7573742062652067726561746572207468616e207360008301527f7461727420626c6f636b000000000000000000000000000000000000000000006020830152604082019050919050565b6000613088601283613596565b91507f4e6f742053797374656d204164646573732100000000000000000000000000006000830152602082019050919050565b60006130c86005836135a7565b91507f38303030310000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613108600e836135a7565b91507f6865696d64616c6c2d38303030310000000000000000000000000000000000006000830152600e82019050919050565b606082016000820151613151600085018261317d565b506020820151613164602085018261317d565b5060408201516131776040850182612d0c565b50505050565b61318681613626565b82525050565b61319581613626565b82525050565b6131a481613630565b82525050565b60006131b68285612df5565b6001820191506131c68284612e1b565b6020820191508190509392505050565b60006131e28286612df5565b6001820191506131f28285612e1b565b6020820191506132028284612e1b565b602082019150819050949350505050565b600061321f8284612e32565b915081905092915050565b600061323582612e63565b9150819050919050565b600061324a826130bb565b9150819050919050565b600061325f826130fb565b9150819050919050565b600060208201905061327e6000830184612d1b565b92915050565b6000604082019050818103600083015261329e8185612d2a565b905081810360208301526132b28184612d88565b90509392505050565b60006020820190506132d06000830184612de6565b92915050565b60006020820190506132eb6000830184612e0c565b92915050565b60006080820190506133066000830187612e0c565b613313602083018661319b565b6133206040830185612e0c565b61332d6060830184612e0c565b95945050505050565b6000602082019050818103600083015261334f81612ea3565b9050919050565b6000602082019050818103600083015261336f81612f09565b9050919050565b6000602082019050818103600083015261338f81612f49565b9050919050565b600060208201905081810360008301526133af81612f89565b9050919050565b600060208201905081810360008301526133cf81613015565b9050919050565b600060208201905081810360008301526133ef8161307b565b9050919050565b600060608201905061340b600083018461313b565b92915050565b6000602082019050613426600083018461318c565b92915050565b6000606082019050613441600083018661318c565b61344e602083018561318c565b61345b6040830184612d1b565b949350505050565b6000606082019050613478600083018661318c565b613485602083018561318c565b613492604083018461318c565b949350505050565b60006020820190506134af600083018461319b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156134d857600080fd5b8060405250919050565b600067ffffffffffffffff8211156134f957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006135bd82613606565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561366a57808201518184015260208101905061364f565b83811115613679576000848401525b50505050565b6000819050919050565b6000819050919050565b61369c816135b2565b81146136a757600080fd5b50565b6136b3816135fc565b81146136be57600080fd5b50565b6136ca81613626565b81146136d557600080fd5b5056fea365627a7a723158208f52ee07630ffe523cc6ad3e15f437f973dcfa36729cd697f9b0fc4a145a48f06c6578706572696d656e74616cf564736f6c634300050b0040", + "balance":"0x0" + }, + "0000000000000000000000000000000000001001":{ + "code":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c806319494a17146100465780633434735f146100e15780635407ca671461012b575b600080fd5b6100c76004803603604081101561005c57600080fd5b81019080803590602001909291908035906020019064010000000081111561008357600080fd5b82018360208201111561009557600080fd5b803590602001918460018302840111640100000000831117156100b757600080fd5b9091929391929390505050610149565b604051808215151515815260200191505060405180910390f35b6100e961047a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610133610492565b6040518082815260200191505060405180910390f35b600073fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f742053797374656d2041646465737321000000000000000000000000000081525060200191505060405180910390fd5b606061025761025285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610498565b6104c6565b905060006102788260008151811061026b57fe5b60200260200101516105a3565b905080600160005401146102f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f537461746549647320617265206e6f742073657175656e7469616c000000000081525060200191505060405180910390fd5b600080815480929190600101919050555060006103248360018151811061031757fe5b6020026020010151610614565b905060606103458460028151811061033857fe5b6020026020010151610637565b9050610350826106c3565b1561046f576000624c4b409050606084836040516024018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103aa57808201518184015260208101905061038f565b50505050905090810190601f1680156103d75780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f26c53bea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008082516020840160008887f1965050505b505050509392505050565b73fffffffffffffffffffffffffffffffffffffffe81565b60005481565b6104a0610943565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606104d1826106dc565b6104da57600080fd5b60006104e58361072a565b905060608160405190808252806020026020018201604052801561052357816020015b61051061095d565b8152602001906001900390816105085790505b5090506000610535856020015161079b565b8560200151019050600080600090505b848110156105965761055683610824565b915060405180604001604052808381526020018481525084828151811061057957fe5b602002602001018190525081830192508080600101915050610545565b5082945050505050919050565b60008082600001511180156105bd57506021826000015111155b6105c657600080fd5b60006105d5836020015161079b565b9050600081846000015103905060008083866020015101905080519150602083101561060857826020036101000a820491505b81945050505050919050565b6000601582600001511461062757600080fd5b610630826105a3565b9050919050565b6060600082600001511161064a57600080fd5b6000610659836020015161079b565b905060008184600001510390506060816040519080825280601f01601f19166020018201604052801561069b5781602001600182028038833980820191505090505b50905060008160200190506106b78487602001510182856108dc565b81945050505050919050565b600080823b905060008163ffffffff1611915050919050565b600080826000015114156106f35760009050610725565b60008083602001519050805160001a915060c060ff168260ff16101561071e57600092505050610725565b6001925050505b919050565b600080826000015114156107415760009050610796565b60008090506000610755846020015161079b565b84602001510190506000846000015185602001510190505b8082101561078f5761077e82610824565b82019150828060010193505061076d565b8293505050505b919050565b600080825160001a9050608060ff168110156107bb57600091505061081f565b60b860ff168110806107e0575060c060ff1681101580156107df575060f860ff1681105b5b156107ef57600191505061081f565b60c060ff1681101561080f5760018060b80360ff1682030191505061081f565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561084557600191506108d2565b60b860ff16811015610862576001608060ff1682030191506108d1565b60c060ff168110156108925760b78103600185019450806020036101000a855104600182018101935050506108d0565b60f860ff168110156108af57600160c060ff1682030191506108cf565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156108ea5761093e565b5b602060ff16811061091a5782518252602060ff1683019250602060ff1682019150602060ff16810390506108eb565b6000600182602060ff16036101000a03905080198451168184511681811785525050505b505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fea265627a7a7231582083fbdacb76f32b4112d0f7db9a596937925824798a0026ba0232322390b5263764736f6c634300050b0032", + "balance":"0x0" + }, + "0000000000000000000000000000000000001010":{ + "code":"0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610e06565b005b3480156103eb57600080fd5b506103f4610f58565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f61565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061111d565b005b3480156104e857600080fd5b506104f16111ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b50610548611212565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611238565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b50610604611259565b005b34801561061257600080fd5b5061061b611329565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061132f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b506107586114b4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af6114dd565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de611534565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e61156d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115aa565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b506109646115d0565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b810190808035906020019092919050505061165d565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061167d565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a6561169d565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a906116a4565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb6116aa565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611737565b005b348015610b2e57600080fd5b50610b37611754565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b6000808511610c4857600080fd5b6000831480610c575750824311155b610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5369676e6174757265206973206578706972656400000000000000000000000081525060200191505060405180910390fd5b6000610cd73387878761167d565b9050600015156005600083815260200190815260200160002060009054906101000a900460ff16151514610d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f536967206465616374697661746564000000000000000000000000000000000081525060200191505060405180910390fd5b60016005600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610ded8189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061132f565b9150610dfa82848861177a565b50509695505050505050565b60003390506000610e1682611238565b9050610e2d83600654611b3790919063ffffffff16565b600681905550600083118015610e4257508234145b610eb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610f3087611238565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610f696114dd565b610f7257600080fd5b600081118015610faf5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e636023913960400191505060405180910390fd5b600061100f83611238565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561105c573d6000803e3d6000fd5b5061107283600654611b5790919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f685856110f489611238565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611183576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e406023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111e882611b76565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b6112616114dd565b61126a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b600080600080604185511461134a57600093505050506114ae565b602085015192506040850151915060ff6041860151169050601b8160ff16101561137557601b810190505b601b8160ff161415801561138d5750601c8160ff1614155b1561139e57600093505050506114ae565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113fb573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b60008134146115bc57600090506115ca565b6115c733848461177a565b90505b92915050565b6040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b6020831061161f57805182526020820191506020810190506020830392506115fc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061169361168e86868686611c6e565b611d44565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611e86605291396040516020018082805190602001908083835b602083106116f957805182526020820191506020810190506020830392506116d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b61173f6114dd565b61174857600080fd5b61175181611b76565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117fa57600080fd5b505afa15801561180e573d6000803e3d6000fd5b505050506040513d602081101561182457600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118b657600080fd5b505afa1580156118ca573d6000803e3d6000fd5b505050506040513d60208110156118e057600080fd5b810190808051906020019092919050505090506118fe868686611d8e565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d6020811015611a3057600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611abe57600080fd5b505afa158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b600082821115611b4657600080fd5b600082840390508091505092915050565b600080828401905083811015611b6c57600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bb057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b60208310611cc05780518252602082019150602081019050602083039250611c9d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611dd4573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a723158208f81700133738d766ae3d68af591ad588b0125bd91449192179f460893f79f6b64736f6c634300050b0032", + "balance":"0x204fcd4f31349d83b6e00000" + }, + "928ed6a3e94437bbd316ccad78479f1d163a6a8c":{ + "balance":"0x3635c9adc5dea00000" + }, + "be188d6641e8b680743a4815dfa0f6208038960f":{ + "balance":"0x3635c9adc5dea00000" + }, + "c26880a0af2ea0c7e8130e6ec47af756465452e8":{ + "balance":"0x3635c9adc5dea00000" + }, + "c275dc8be39f50d12f66b6a63629c39da5bae5bd":{ + "balance":"0x3635c9adc5dea00000" + }, + "f903ba9e006193c1527bfbe65fe2123704ea3f99":{ + "balance":"0x3635c9adc5dea00000" + } + }, + "number":"0x0", + "gasUsed":"0x0", + "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas":null + }, + "Bootnodes":[ + "enode://320553cda00dfc003f499a3ce9598029f364fbb3ed1222fdc20a94d97dcc4d8ba0cd0bfa996579dcc6d17a534741fb0a5da303a90579431259150de66b597251@54.147.31.250:30303", + "enode://f0f48a8781629f95ff02606081e6e43e4aebd503f3d07fc931fad7dd5ca1ba52bd849a6f6c3be0e375cf13c9ae04d859c4a9ae3546dc8ed4f10aa5dbb47d4998@34.226.134.117:30303" + ], + "NetworkId":80001, + "DNS":null + } From 98b71173dfbcaa41e0c401363415201e060cfa32 Mon Sep 17 00:00:00 2001 From: Krishna Upadhyaya Date: Mon, 24 Jan 2022 14:00:09 +0530 Subject: [PATCH 028/190] Rename chain test case --- internal/cli/server/chains/chain_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cli/server/chains/chain_test.go b/internal/cli/server/chains/chain_test.go index d9bc638af2..0f309b2919 100644 --- a/internal/cli/server/chains/chain_test.go +++ b/internal/cli/server/chains/chain_test.go @@ -4,7 +4,7 @@ import ( "testing" ) -func TestImportFromFile(t *testing.T) { +func TestChain_ImportFromFile(t *testing.T) { type args struct { filename string } From 4e6d323382c9d6bd0768b6a98b07ad7733210a33 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 15 Feb 2022 20:24:55 +0530 Subject: [PATCH 029/190] Added GetSnapshotProposerSequence --- consensus/bor/api.go | 50 +++++++++++++++++++++++++++++++++++++ internal/web3ext/bor_ext.go | 12 +++++++++ 2 files changed, 62 insertions(+) diff --git a/consensus/bor/api.go b/consensus/bor/api.go index 12841290af..5c3496891f 100644 --- a/consensus/bor/api.go +++ b/consensus/bor/api.go @@ -46,6 +46,56 @@ func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) { return api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) } +type BlockSigners struct { + Signers map[common.Address]uint64 + Diff int + Author common.Address +} + +// GetSnapshotProposerSequence retrieves the in-turn signers of all sprints in a span +func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigners, error) { + + var difficulties = make(map[common.Address]uint64) + snap, err := api.GetSnapshot(number) + if err != nil { + return BlockSigners{}, err + } + proposer := snap.ValidatorSet.GetProposer().Address + proposerIndex, _ := snap.ValidatorSet.GetByAddress(proposer) + + signers := snap.signers() + for i := 0; i < len(signers); i++ { + tempIndex := i + if tempIndex < proposerIndex { + tempIndex = tempIndex + len(signers) + } + difficulties[signers[i]] = uint64(len(signers) - (tempIndex - proposerIndex)) + } + + author, err := api.GetAuthor(number) + if err != nil { + return BlockSigners{}, err + } + diff := int(difficulties[*author]) + blockSigners := &BlockSigners{ + Signers: difficulties, + Diff: diff, + Author: *author, + } + + return *blockSigners, nil +} + +// GetSnapshotProposer retrieves the in-turn signer at a given block. +func (api *API) GetSnapshotProposer(number *rpc.BlockNumber) (common.Address, error) { + *number -= 1 + snap, err := api.GetSnapshot(number) + if err != nil { + return common.Address{}, err + } + return snap.ValidatorSet.GetProposer().Address, nil +} + // GetAuthor retrieves the author a block. func (api *API) GetAuthor(number *rpc.BlockNumber) (*common.Address, error) { // Retrieve the requested block number (or current if none requested) diff --git a/internal/web3ext/bor_ext.go b/internal/web3ext/bor_ext.go index b7fe9b4886..fe8b01da19 100644 --- a/internal/web3ext/bor_ext.go +++ b/internal/web3ext/bor_ext.go @@ -17,6 +17,18 @@ web3._extend({ params: 1, inputFormatter: [null] }), + new web3._extend.Method({ + name: 'getSnapshotProposer', + call: 'bor_getSnapshotProposer', + params: 1, + inputFormatter: [null] + }), + new web3._extend.Method({ + name: 'getSnapshotProposerSequence', + call: 'bor_getSnapshotProposerSequence', + params: 1, + inputFormatter: [null] + }), new web3._extend.Method({ name: 'getSnapshotAtHash', call: 'bor_getSnapshotAtHash', From e496afb98c7f7ea2e3c964244d0e8c1b8f7c1933 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 16 Feb 2022 00:28:34 +0530 Subject: [PATCH 030/190] Minor Fix --- consensus/bor/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/bor/api.go b/consensus/bor/api.go index 5c3496891f..b7ffebaf66 100644 --- a/consensus/bor/api.go +++ b/consensus/bor/api.go @@ -54,7 +54,7 @@ type BlockSigners struct { // GetSnapshotProposerSequence retrieves the in-turn signers of all sprints in a span func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigners, error) { - + *number -= 1 var difficulties = make(map[common.Address]uint64) snap, err := api.GetSnapshot(number) if err != nil { From e0b43b011684b70b78ed718a6c6a38436521d1ea Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 16 Feb 2022 00:36:02 +0530 Subject: [PATCH 031/190] Minor fix --- consensus/bor/api.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/consensus/bor/api.go b/consensus/bor/api.go index b7ffebaf66..1a2d140b21 100644 --- a/consensus/bor/api.go +++ b/consensus/bor/api.go @@ -54,9 +54,9 @@ type BlockSigners struct { // GetSnapshotProposerSequence retrieves the in-turn signers of all sprints in a span func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigners, error) { - *number -= 1 + snapNumber := *number - 1 var difficulties = make(map[common.Address]uint64) - snap, err := api.GetSnapshot(number) + snap, err := api.GetSnapshot(&snapNumber) if err != nil { return BlockSigners{}, err } From b172ba8fbf06debf2f57bc3f0ee6a5884cffcb7e Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 16 Feb 2022 13:34:03 +0530 Subject: [PATCH 032/190] Sorted Difficulties --- consensus/bor/api.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/consensus/bor/api.go b/consensus/bor/api.go index 1a2d140b21..c6433ce092 100644 --- a/consensus/bor/api.go +++ b/consensus/bor/api.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "math" "math/big" + "sort" "strconv" "sync" @@ -47,11 +48,29 @@ func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) { } type BlockSigners struct { - Signers map[common.Address]uint64 + Signers []difficultiesKV Diff int Author common.Address } +type difficultiesKV struct { + Signer common.Address + Difficulty uint64 +} + +func rankMapDifficulties(values map[common.Address]uint64) []difficultiesKV { + + var ss []difficultiesKV + for k, v := range values { + ss = append(ss, difficultiesKV{k, v}) + } + sort.Slice(ss, func(i, j int) bool { + return ss[i].Difficulty > ss[j].Difficulty + }) + + return ss +} + // GetSnapshotProposerSequence retrieves the in-turn signers of all sprints in a span func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigners, error) { snapNumber := *number - 1 @@ -72,13 +91,15 @@ func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigne difficulties[signers[i]] = uint64(len(signers) - (tempIndex - proposerIndex)) } + difficulties2 := rankMapDifficulties(difficulties) + author, err := api.GetAuthor(number) if err != nil { return BlockSigners{}, err } diff := int(difficulties[*author]) blockSigners := &BlockSigners{ - Signers: difficulties, + Signers: difficulties2, Diff: diff, Author: *author, } From c3d180cc466956e49477dac611539aad4ce48659 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 16 Feb 2022 23:55:31 +0530 Subject: [PATCH 033/190] Minor fix --- consensus/bor/api.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/consensus/bor/api.go b/consensus/bor/api.go index c6433ce092..8f172e47a6 100644 --- a/consensus/bor/api.go +++ b/consensus/bor/api.go @@ -91,7 +91,7 @@ func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigne difficulties[signers[i]] = uint64(len(signers) - (tempIndex - proposerIndex)) } - difficulties2 := rankMapDifficulties(difficulties) + rankedDifficulties := rankMapDifficulties(difficulties) author, err := api.GetAuthor(number) if err != nil { @@ -99,7 +99,7 @@ func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigne } diff := int(difficulties[*author]) blockSigners := &BlockSigners{ - Signers: difficulties2, + Signers: rankedDifficulties, Diff: diff, Author: *author, } From 5039f4fc1ea9462bdee3cf6e6cd0c513897e9577 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 21 Jan 2022 12:51:17 +0000 Subject: [PATCH 034/190] Added bor fingerprint --- internal/cli/bor_fingerprint.go | 68 +++++++++++++++++++++++++++++++++ internal/cli/command.go | 5 +++ 2 files changed, 73 insertions(+) create mode 100644 internal/cli/bor_fingerprint.go diff --git a/internal/cli/bor_fingerprint.go b/internal/cli/bor_fingerprint.go new file mode 100644 index 0000000000..de85e53074 --- /dev/null +++ b/internal/cli/bor_fingerprint.go @@ -0,0 +1,68 @@ +package cli + +import ( + "fmt" + "math" + + "github.com/ethereum/go-ethereum/params" + "github.com/mitchellh/cli" + "github.com/shirou/gopsutil/cpu" + "github.com/shirou/gopsutil/disk" + "github.com/shirou/gopsutil/host" + "github.com/shirou/gopsutil/mem" +) + +// VersionCommand is the command to show the version of the agent +type FingerprintCommand struct { + UI cli.Ui +} + +// Help implements the cli.Command interface +func (c *FingerprintCommand) Help() string { + return `Usage: bor fingerprint + + Display the system fingerprint` +} + +// Synopsis implements the cli.Command interface +func (c *FingerprintCommand) Synopsis() string { + return "Display the system fingerprint" +} + +func getCoresCount(cp []cpu.InfoStat) int { + cores := 0 + for i := 0; i < len(cp); i++ { + cores += int(cp[i].Cores) + } + return cores +} + +// Run implements the cli.Command interface +func (c *FingerprintCommand) Run(args []string) int { + v, _ := mem.VirtualMemory() + h, _ := host.Info() + cp, _ := cpu.Info() + d, _ := disk.Usage("/") + + osName := h.OS + osVer := h.Platform + " - " + h.PlatformVersion + " - " + h.KernelArch + totalMem := math.Floor(float64(v.Total)/(1024*1024*1024)*100) / 100 + availableMem := math.Floor(float64(v.Available)/(1024*1024*1024)*100) / 100 + usedMem := math.Floor(float64(v.Used)/(1024*1024*1024)*100) / 100 + totalDisk := math.Floor(float64(d.Total)/(1024*1024*1024)*100) / 100 + availableDisk := math.Floor(float64(d.Free)/(1024*1024*1024)*100) / 100 + usedDisk := math.Floor(float64(d.Used)/(1024*1024*1024)*100) / 100 + + borDetails := fmt.Sprintf("Bor Version : %s", params.VersionWithMeta) + cpuDetails := fmt.Sprintf("CPU : %d cores", getCoresCount(cp)) + osDetails := fmt.Sprintf("OS : %s %s ", osName, osVer) + memDetails := fmt.Sprintf("RAM :: total : %v GB, free : %v GB, used : %v GB", totalMem, availableMem, usedMem) + diskDetails := fmt.Sprintf("STORAGE :: total : %v GB, free : %v GB, used : %v GB", totalDisk, availableDisk, usedDisk) + + c.UI.Output(borDetails) + c.UI.Output(cpuDetails) + c.UI.Output(osDetails) + c.UI.Output(memDetails) + c.UI.Output(diskDetails) + return 0 +} diff --git a/internal/cli/command.go b/internal/cli/command.go index d164791f80..131fe504c4 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -125,6 +125,11 @@ func commands() map[string]cli.CommandFactory { Meta2: meta2, }, nil }, + "fingerprint": func() (cli.Command, error) { + return &FingerprintCommand{ + UI: ui, + }, nil + }, } } From d50341053e3c468ed22e1bd76145c7fe503be68c Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Mon, 24 Jan 2022 08:24:00 +0000 Subject: [PATCH 035/190] code refactor --- internal/cli/bor_fingerprint.go | 106 ++++++++++++++++++++++++-------- 1 file changed, 81 insertions(+), 25 deletions(-) diff --git a/internal/cli/bor_fingerprint.go b/internal/cli/bor_fingerprint.go index de85e53074..bb7e3de7f0 100644 --- a/internal/cli/bor_fingerprint.go +++ b/internal/cli/bor_fingerprint.go @@ -37,32 +37,88 @@ func getCoresCount(cp []cpu.InfoStat) int { return cores } +type MemoryDetails struct { + TotalMem float64 `json:"totalMem"` + FreeMem float64 `json:"freeMem"` + UsedMem float64 `json:"usedMem"` +} + +type DiskDetails struct { + TotalDisk float64 `json:"totalDisk"` + FreeDisk float64 `json:"freeDisk"` + UsedDisk float64 `json:"usedDisk"` +} + +type BorFingerprint struct { + CoresCount int `json:"coresCount"` + OsName string `json:"osName"` + OsVer string `json:"osVer"` + DiskDetails *DiskDetails `json:"diskDetails"` + MemoryDetails *MemoryDetails `json:"memoryDetails"` +} + +func formatFingerprint(borFingerprint *BorFingerprint) string { + base := formatKV([]string{ + fmt.Sprintf("Bor Version : %s", params.VersionWithMeta), + fmt.Sprintf("CPU : %d cores", borFingerprint.CoresCount), + fmt.Sprintf("OS : %s %s ", borFingerprint.OsName, borFingerprint.OsVer), + fmt.Sprintf("RAM :: total : %v GB, free : %v GB, used : %v GB", borFingerprint.MemoryDetails.TotalMem, borFingerprint.MemoryDetails.FreeMem, borFingerprint.MemoryDetails.UsedMem), + fmt.Sprintf("STORAGE :: total : %v GB, free : %v GB, used : %v GB", borFingerprint.DiskDetails.TotalDisk, borFingerprint.DiskDetails.FreeDisk, borFingerprint.DiskDetails.UsedDisk), + }) + return base +} + +func convertBytesToGB(bytesValue uint64) float64 { + return math.Floor(float64(bytesValue)/(1024*1024*1024)*100) / 100 +} + // Run implements the cli.Command interface func (c *FingerprintCommand) Run(args []string) int { - v, _ := mem.VirtualMemory() - h, _ := host.Info() - cp, _ := cpu.Info() - d, _ := disk.Usage("/") - - osName := h.OS - osVer := h.Platform + " - " + h.PlatformVersion + " - " + h.KernelArch - totalMem := math.Floor(float64(v.Total)/(1024*1024*1024)*100) / 100 - availableMem := math.Floor(float64(v.Available)/(1024*1024*1024)*100) / 100 - usedMem := math.Floor(float64(v.Used)/(1024*1024*1024)*100) / 100 - totalDisk := math.Floor(float64(d.Total)/(1024*1024*1024)*100) / 100 - availableDisk := math.Floor(float64(d.Free)/(1024*1024*1024)*100) / 100 - usedDisk := math.Floor(float64(d.Used)/(1024*1024*1024)*100) / 100 - - borDetails := fmt.Sprintf("Bor Version : %s", params.VersionWithMeta) - cpuDetails := fmt.Sprintf("CPU : %d cores", getCoresCount(cp)) - osDetails := fmt.Sprintf("OS : %s %s ", osName, osVer) - memDetails := fmt.Sprintf("RAM :: total : %v GB, free : %v GB, used : %v GB", totalMem, availableMem, usedMem) - diskDetails := fmt.Sprintf("STORAGE :: total : %v GB, free : %v GB, used : %v GB", totalDisk, availableDisk, usedDisk) - - c.UI.Output(borDetails) - c.UI.Output(cpuDetails) - c.UI.Output(osDetails) - c.UI.Output(memDetails) - c.UI.Output(diskDetails) + + v, err := mem.VirtualMemory() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + h, err := host.Info() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + cp, err := cpu.Info() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + d, err := disk.Usage("/") + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + diskDetails := &DiskDetails{ + TotalDisk: convertBytesToGB(d.Total), + FreeDisk: convertBytesToGB(d.Free), + UsedDisk: convertBytesToGB(d.Used), + } + + memoryDetails := &MemoryDetails{ + TotalMem: convertBytesToGB(v.Total), + FreeMem: convertBytesToGB(v.Available), + UsedMem: convertBytesToGB(v.Used), + } + + borFingerprint := &BorFingerprint{ + CoresCount: getCoresCount(cp), + OsName: h.OS, + OsVer: h.Platform + " - " + h.PlatformVersion + " - " + h.KernelArch, + DiskDetails: diskDetails, + MemoryDetails: memoryDetails, + } + + c.UI.Output(formatFingerprint(borFingerprint)) return 0 } From be2463b95899d258c5ee0f911a8feef0693a4049 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Mon, 31 Jan 2022 13:59:03 +0000 Subject: [PATCH 036/190] read/write IOPS added --- internal/cli/bor_fingerprint.go | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/internal/cli/bor_fingerprint.go b/internal/cli/bor_fingerprint.go index bb7e3de7f0..8e2fd8b0dd 100644 --- a/internal/cli/bor_fingerprint.go +++ b/internal/cli/bor_fingerprint.go @@ -3,6 +3,7 @@ package cli import ( "fmt" "math" + "os/exec" "github.com/ethereum/go-ethereum/params" "github.com/mitchellh/cli" @@ -72,6 +73,63 @@ func convertBytesToGB(bytesValue uint64) float64 { return math.Floor(float64(bytesValue)/(1024*1024*1024)*100) / 100 } +// Install fio on the node if it does not exist +func (c *FingerprintCommand) installFio() error { + + cmd := exec.Command("/bin/sh", "-c", "fio -v") + + _, err := cmd.CombinedOutput() + if err != nil { + c.UI.Output("fio not installed\nInstalling Fio...") + + cmd := exec.Command("/bin/sh", "-c", "sudo apt-get update && sudo apt-get install fio -y") + _, err := cmd.CombinedOutput() + if err == nil { + return nil + } + + cmd = exec.Command("/bin/sh", "-c", "sudo yum install fio -y") + _, err = cmd.CombinedOutput() + if err == nil { + return nil + } + + cmd = exec.Command("/bin/sh", "-c", "sudo dnf install fio -y") + _, err = cmd.CombinedOutput() + if err == nil { + return nil + } + + c.UI.Output("Unable to install fio") + return err + } + + return nil +} + +// Run the IOPS benchmark for the node +func (c *FingerprintCommand) benchmark() error { + var b []byte + err := c.installFio() + if err != nil { + return err + } + + c.UI.Output("\nRunning a 10 second test...\n") + + cmd := exec.Command("/bin/sh", "-c", "sudo fio --filename=/file --size=2GB --direct=1 --rw=randrw --bs=64k --ioengine=libaio --iodepth=64 --runtime=10 --numjobs=4 --time_based --group_reporting --name=throughput-test-job --eta-newline=1 | grep -e 'read:' -e 'write:' | awk '{print $1,$2}' ") + + b, err = cmd.CombinedOutput() + if err != nil { + return err + } + + out := string(b) + c.UI.Output(out) + + return nil +} + // Run implements the cli.Command interface func (c *FingerprintCommand) Run(args []string) int { @@ -120,5 +178,14 @@ func (c *FingerprintCommand) Run(args []string) int { } c.UI.Output(formatFingerprint(borFingerprint)) + + if borFingerprint.OsName == "linux" { + err = c.benchmark() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + } + return 0 } From 55aa9af2094570c53996f7d7f421fdf6f393b2d6 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 16 Feb 2022 09:41:26 +0000 Subject: [PATCH 037/190] Removed Fio installation process --- internal/cli/bor_fingerprint.go | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/internal/cli/bor_fingerprint.go b/internal/cli/bor_fingerprint.go index 8e2fd8b0dd..5c5a8f47bd 100644 --- a/internal/cli/bor_fingerprint.go +++ b/internal/cli/bor_fingerprint.go @@ -73,34 +73,15 @@ func convertBytesToGB(bytesValue uint64) float64 { return math.Floor(float64(bytesValue)/(1024*1024*1024)*100) / 100 } -// Install fio on the node if it does not exist -func (c *FingerprintCommand) installFio() error { +// Checks if fio exists on the node +func (c *FingerprintCommand) checkFio() error { cmd := exec.Command("/bin/sh", "-c", "fio -v") _, err := cmd.CombinedOutput() if err != nil { - c.UI.Output("fio not installed\nInstalling Fio...") - - cmd := exec.Command("/bin/sh", "-c", "sudo apt-get update && sudo apt-get install fio -y") - _, err := cmd.CombinedOutput() - if err == nil { - return nil - } - - cmd = exec.Command("/bin/sh", "-c", "sudo yum install fio -y") - _, err = cmd.CombinedOutput() - if err == nil { - return nil - } - - cmd = exec.Command("/bin/sh", "-c", "sudo dnf install fio -y") - _, err = cmd.CombinedOutput() - if err == nil { - return nil - } - - c.UI.Output("Unable to install fio") + message := "\nFio package not installed. Install Fio for IOPS Benchmarking :\n\nDebianOS : 'sudo apt-get update && sudo apt-get install fio -y'\nAWS AMI/CentOS : 'sudo yum install fio -y'\nOracle LinuxOS : 'sudo dnf install fio -y'\n" + c.UI.Output(message) return err } @@ -110,9 +91,9 @@ func (c *FingerprintCommand) installFio() error { // Run the IOPS benchmark for the node func (c *FingerprintCommand) benchmark() error { var b []byte - err := c.installFio() + err := c.checkFio() if err != nil { - return err + return nil } c.UI.Output("\nRunning a 10 second test...\n") From 7f5469997af7eeb432faea1dd6b617587ff63d3d Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 16 Mar 2022 20:06:00 +0530 Subject: [PATCH 038/190] Initial Work Setup --- internal/cli/attach.go | 103 ++++++++++++++++++++++++++++++++++++++++ internal/cli/command.go | 7 +++ 2 files changed, 110 insertions(+) create mode 100644 internal/cli/attach.go diff --git a/internal/cli/attach.go b/internal/cli/attach.go new file mode 100644 index 0000000000..4bf2f628bc --- /dev/null +++ b/internal/cli/attach.go @@ -0,0 +1,103 @@ +package cli + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/ethereum/go-ethereum/rpc" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/node" + "github.com/mitchellh/cli" +) + +// VersionCommand is the command to show the version of the agent +type AttachCommand struct { + UI cli.Ui + Meta *Meta + Meta2 *Meta2 +} + +// Help implements the cli.Command interface +func (c *AttachCommand) Help() string { + return `Usage: bor attach + + Connect to Bor IPC console.` +} + +// Synopsis implements the cli.Command interface +func (c *AttachCommand) Synopsis() string { + return "Connect to Bor via IPC" +} + +// Run implements the cli.Command interface +func (c *AttachCommand) Run(args []string) int { + + c.remoteConsole(args) + + return 0 +} + +// remoteConsole will connect to a remote geth instance, attaching a JavaScript +// console to it. +func (c *AttachCommand) remoteConsole(args []string) error { + // Attach to a remotely running geth instance and start the JavaScript console + endpoint := args[0] + path := node.DefaultDataDir() + + if endpoint == "" { + if c.Meta.dataDir != "" { + path = c.Meta.dataDir + } + if path != "" { + homeDir, _ := os.UserHomeDir() + path = filepath.Join(homeDir, "/.bor/data") + } + endpoint = fmt.Sprintf("%s/geth.ipc", path) + } + client, err := dialRPC(endpoint) + if err != nil { + utils.Fatalf("Unable to attach to remote geth: %v", err) + } + config := console.Config{ + DataDir: path, + DocRoot: utils.JSpathFlag.Name, + Client: client, + } + + console, err := console.New(config) + if err != nil { + utils.Fatalf("Failed to start the JavaScript console: %v", err) + } + defer console.Stop(false) + + if len(args) > 1 { + if script := args[1]; script == "exec" { + console.Evaluate(args[2]) + return nil + } + } + + // Otherwise print the welcome screen and enter interactive mode + console.Welcome() + console.Interactive() + + return nil +} + +// dialRPC returns a RPC client which connects to the given endpoint. +// The check for empty endpoint implements the defaulting logic +// for "geth attach" with no argument. +func dialRPC(endpoint string) (*rpc.Client, error) { + if endpoint == "" { + endpoint = node.DefaultIPCEndpoint("bor") + } else if strings.HasPrefix(endpoint, "rpc:") || strings.HasPrefix(endpoint, "ipc:") { + // Backwards compatibility with geth < 1.5 which required + // these prefixes. + endpoint = endpoint[4:] + } + return rpc.Dial(endpoint) +} diff --git a/internal/cli/command.go b/internal/cli/command.go index 131fe504c4..9e373a65cd 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -130,6 +130,13 @@ func commands() map[string]cli.CommandFactory { UI: ui, }, nil }, + "attach": func() (cli.Command, error) { + return &AttachCommand{ + UI: ui, + Meta: meta, + Meta2: meta2, + }, nil + }, } } From 15304529f2eb64b1fe4dcb6578e507840576edb4 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Thu, 17 Mar 2022 17:44:37 +0530 Subject: [PATCH 039/190] minor fixes --- internal/cli/attach.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/internal/cli/attach.go b/internal/cli/attach.go index 4bf2f628bc..4daaf2cf17 100644 --- a/internal/cli/attach.go +++ b/internal/cli/attach.go @@ -41,10 +41,15 @@ func (c *AttachCommand) Run(args []string) int { return 0 } -// remoteConsole will connect to a remote geth instance, attaching a JavaScript +// remoteConsole will connect to a remote bor instance, attaching a JavaScript // console to it. func (c *AttachCommand) remoteConsole(args []string) error { // Attach to a remotely running geth instance and start the JavaScript console + + if len(args) < 1 { + args = append(args, "") + } + endpoint := args[0] path := node.DefaultDataDir() @@ -56,7 +61,7 @@ func (c *AttachCommand) remoteConsole(args []string) error { homeDir, _ := os.UserHomeDir() path = filepath.Join(homeDir, "/.bor/data") } - endpoint = fmt.Sprintf("%s/geth.ipc", path) + endpoint = fmt.Sprintf("%s/bor.ipc", path) } client, err := dialRPC(endpoint) if err != nil { From 065556d21a2d0122151db11b0cacf9ff9faad5e5 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Thu, 17 Mar 2022 17:58:46 +0530 Subject: [PATCH 040/190] Minor Fixes --- internal/cli/attach.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cli/attach.go b/internal/cli/attach.go index 4daaf2cf17..75c88d002f 100644 --- a/internal/cli/attach.go +++ b/internal/cli/attach.go @@ -80,7 +80,7 @@ func (c *AttachCommand) remoteConsole(args []string) error { defer console.Stop(false) if len(args) > 1 { - if script := args[1]; script == "exec" { + if script := args[1]; script == "--exec" { console.Evaluate(args[2]) return nil } From 0736fdef5264b1c92a0dfd71142931c713d541f7 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 22 Mar 2022 16:17:45 +0530 Subject: [PATCH 041/190] Added console + attach refactor --- internal/cli/attach.go | 102 ++++-- internal/cli/command.go | 5 + internal/cli/server/command_flags.go | 504 +++++++++++++++++++++++++++ internal/cli/server/console.go | 163 +++++++++ 4 files changed, 752 insertions(+), 22 deletions(-) create mode 100644 internal/cli/server/command_flags.go create mode 100644 internal/cli/server/console.go diff --git a/internal/cli/attach.go b/internal/cli/attach.go index 75c88d002f..b48bc5518b 100644 --- a/internal/cli/attach.go +++ b/internal/cli/attach.go @@ -6,6 +6,7 @@ import ( "path/filepath" "strings" + "github.com/ethereum/go-ethereum/internal/cli/flagset" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/cmd/utils" @@ -14,18 +15,22 @@ import ( "github.com/mitchellh/cli" ) -// VersionCommand is the command to show the version of the agent +// AttachCommand is the command to Connect to remote Bor IPC console type AttachCommand struct { - UI cli.Ui - Meta *Meta - Meta2 *Meta2 + UI cli.Ui + Meta *Meta + Meta2 *Meta2 + ExecCMD string + Endpoint string + PreloadJSFlag string + JSpathFlag string } // Help implements the cli.Command interface func (c *AttachCommand) Help() string { return `Usage: bor attach - Connect to Bor IPC console.` + Connect to remote Bor IPC console.` } // Synopsis implements the cli.Command interface @@ -33,27 +38,65 @@ func (c *AttachCommand) Synopsis() string { return "Connect to Bor via IPC" } +func (c *AttachCommand) Flags() *flagset.Flagset { + + f := flagset.NewFlagSet("attach") + + f.StringFlag(&flagset.StringFlag{ + Name: "exec", + Usage: "Command to run in remote console", + Value: &c.ExecCMD, + }) + + f.StringFlag(&flagset.StringFlag{ + Name: "preload", + Usage: "Comma separated list of JavaScript files to preload into the console", + Value: &c.PreloadJSFlag, + }) + + f.StringFlag(&flagset.StringFlag{ + Name: "jspath", + Usage: "JavaScript root path for `loadScript`", + Value: &c.JSpathFlag, + }) + + return f +} + // Run implements the cli.Command interface func (c *AttachCommand) Run(args []string) int { - c.remoteConsole(args) + flags := c.Flags() + + //check if first arg is flag or IPC location + if len(args) == 0 { + args = append(args, "") + } + if args[0] != "" && string(args[0][0:2]) == "--" { + if err := flags.Parse(args); err != nil { + c.UI.Error(err.Error()) + return 1 + } + } else { + c.Endpoint = args[0] + if err := flags.Parse(args[1:]); err != nil { + c.UI.Error(err.Error()) + return 1 + } + } + c.remoteConsole() return 0 } // remoteConsole will connect to a remote bor instance, attaching a JavaScript // console to it. -func (c *AttachCommand) remoteConsole(args []string) error { +func (c *AttachCommand) remoteConsole() error { // Attach to a remotely running geth instance and start the JavaScript console - if len(args) < 1 { - args = append(args, "") - } - - endpoint := args[0] path := node.DefaultDataDir() - if endpoint == "" { + if c.Endpoint == "" { if c.Meta.dataDir != "" { path = c.Meta.dataDir } @@ -61,16 +104,17 @@ func (c *AttachCommand) remoteConsole(args []string) error { homeDir, _ := os.UserHomeDir() path = filepath.Join(homeDir, "/.bor/data") } - endpoint = fmt.Sprintf("%s/bor.ipc", path) + c.Endpoint = fmt.Sprintf("%s/bor.ipc", path) } - client, err := dialRPC(endpoint) + client, err := dialRPC(c.Endpoint) if err != nil { - utils.Fatalf("Unable to attach to remote geth: %v", err) + utils.Fatalf("Unable to attach to remote bor: %v", err) } config := console.Config{ DataDir: path, - DocRoot: utils.JSpathFlag.Name, + DocRoot: c.JSpathFlag, Client: client, + Preload: c.MakeConsolePreloads(), } console, err := console.New(config) @@ -79,11 +123,9 @@ func (c *AttachCommand) remoteConsole(args []string) error { } defer console.Stop(false) - if len(args) > 1 { - if script := args[1]; script == "--exec" { - console.Evaluate(args[2]) - return nil - } + if c.ExecCMD != "" { + console.Evaluate(c.ExecCMD) + return nil } // Otherwise print the welcome screen and enter interactive mode @@ -106,3 +148,19 @@ func dialRPC(endpoint string) (*rpc.Client, error) { } return rpc.Dial(endpoint) } + +// MakeConsolePreloads retrieves the absolute paths for the console JavaScript +// scripts to preload before starting. +func (c *AttachCommand) MakeConsolePreloads() []string { + // Skip preloading if there's nothing to preload + if c.PreloadJSFlag == "" { + return nil + } + // Otherwise resolve absolute paths and return them + var preloads []string + + for _, file := range strings.Split(c.PreloadJSFlag, ",") { + preloads = append(preloads, strings.TrimSpace(file)) + } + return preloads +} diff --git a/internal/cli/command.go b/internal/cli/command.go index 9e373a65cd..baa09368b6 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -137,6 +137,11 @@ func commands() map[string]cli.CommandFactory { Meta2: meta2, }, nil }, + "console": func() (cli.Command, error) { + return &server.ConsoleCommand{ + UI: ui, + }, nil + }, } } diff --git a/internal/cli/server/command_flags.go b/internal/cli/server/command_flags.go new file mode 100644 index 0000000000..f43535a459 --- /dev/null +++ b/internal/cli/server/command_flags.go @@ -0,0 +1,504 @@ +package server + +import ( + "github.com/ethereum/go-ethereum/internal/cli/flagset" +) + +func (c *ConsoleCommand) Flags() *flagset.Flagset { + c.cliConfig = DefaultConfig() + + f := flagset.NewFlagSet("console") + + // console flags + f.StringFlag(&flagset.StringFlag{ + Name: "exec", + Usage: "Command to run in remote console", + Value: &c.ExecCMD, + }) + + f.StringFlag(&flagset.StringFlag{ + Name: "preload", + Usage: "Comma separated list of JavaScript files to preload into the console", + Value: &c.PreloadJSFlag, + }) + + f.StringFlag(&flagset.StringFlag{ + Name: "jspath", + Usage: "JavaScript root path for `loadScript`", + Value: &c.JSpathFlag, + }) + + // server flags + f.StringFlag(&flagset.StringFlag{ + Name: "chain", + Usage: "Name of the chain to sync", + Value: &c.cliConfig.Chain, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "name", + Usage: "Name/Identity of the node", + Value: &c.cliConfig.Name, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "log-level", + Usage: "Set log level for the server", + Value: &c.cliConfig.LogLevel, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "datadir", + Usage: "Path of the data directory to store information", + Value: &c.cliConfig.DataDir, + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "config", + Usage: "File for the config file", + Value: &c.configFile, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "syncmode", + Usage: `Blockchain sync mode ("fast", "full", "snap" or "light")`, + Value: &c.cliConfig.SyncMode, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "gcmode", + Usage: `Blockchain garbage collection mode ("full", "archive")`, + Value: &c.cliConfig.GcMode, + }) + f.MapStringFlag(&flagset.MapStringFlag{ + Name: "whitelist", + Usage: "Comma separated block number-to-hash mappings to enforce (=)", + Value: &c.cliConfig.Whitelist, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "snapshot", + Usage: `Enables snapshot-database mode (default = enable)`, + Value: &c.cliConfig.Snapshot, + }) + + // heimdall + f.StringFlag(&flagset.StringFlag{ + Name: "bor.heimdall", + Usage: "URL of Heimdall service", + Value: &c.cliConfig.Heimdall.URL, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "bor.withoutheimdall", + Usage: "Run without Heimdall service (for testing purpose)", + Value: &c.cliConfig.Heimdall.Without, + }) + + // txpool options + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "txpool.locals", + Usage: "Comma separated accounts to treat as locals (no flush, priority inclusion)", + Value: &c.cliConfig.TxPool.Locals, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "txpool.nolocals", + Usage: "Disables price exemptions for locally submitted transactions", + Value: &c.cliConfig.TxPool.NoLocals, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "txpool.journal", + Usage: "Disk journal for local transaction to survive node restarts", + Value: &c.cliConfig.TxPool.Journal, + }) + f.DurationFlag(&flagset.DurationFlag{ + Name: "txpool.rejournal", + Usage: "Time interval to regenerate the local transaction journal", + Value: &c.cliConfig.TxPool.Rejournal, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "txpool.pricelimit", + Usage: "Minimum gas price limit to enforce for acceptance into the pool", + Value: &c.cliConfig.TxPool.PriceLimit, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "txpool.pricebump", + Usage: "Price bump percentage to replace an already existing transaction", + Value: &c.cliConfig.TxPool.PriceBump, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "txpool.accountslots", + Usage: "Minimum number of executable transaction slots guaranteed per account", + Value: &c.cliConfig.TxPool.AccountSlots, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "txpool.globalslots", + Usage: "Maximum number of executable transaction slots for all accounts", + Value: &c.cliConfig.TxPool.GlobalSlots, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "txpool.accountqueue", + Usage: "Maximum number of non-executable transaction slots permitted per account", + Value: &c.cliConfig.TxPool.AccountQueue, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "txpool.globalqueue", + Usage: "Maximum number of non-executable transaction slots for all accounts", + Value: &c.cliConfig.TxPool.GlobalQueue, + }) + f.DurationFlag(&flagset.DurationFlag{ + Name: "txpool.lifetime", + Usage: "Maximum amount of time non-executable transaction are queued", + Value: &c.cliConfig.TxPool.LifeTime, + }) + + // sealer options + f.BoolFlag(&flagset.BoolFlag{ + Name: "mine", + Usage: "Enable mining", + Value: &c.cliConfig.Sealer.Enabled, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "miner.etherbase", + Usage: "Public address for block mining rewards (default = first account)", + Value: &c.cliConfig.Sealer.Etherbase, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "miner.extradata", + Usage: "Block extra data set by the miner (default = client version)", + Value: &c.cliConfig.Sealer.ExtraData, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "miner.gaslimit", + Usage: "Target gas ceiling for mined blocks", + Value: &c.cliConfig.Sealer.GasCeil, + }) + f.BigIntFlag(&flagset.BigIntFlag{ + Name: "miner.gasprice", + Usage: "Minimum gas price for mining a transaction", + Value: c.cliConfig.Sealer.GasPrice, + }) + + // ethstats + f.StringFlag(&flagset.StringFlag{ + Name: "ethstats", + Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)", + Value: &c.cliConfig.Ethstats, + }) + + // gas price oracle + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "gpo.blocks", + Usage: "Number of recent blocks to check for gas prices", + Value: &c.cliConfig.Gpo.Blocks, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "gpo.percentile", + Usage: "Suggested gas price is the given percentile of a set of recent transaction gas prices", + Value: &c.cliConfig.Gpo.Percentile, + }) + f.BigIntFlag(&flagset.BigIntFlag{ + Name: "gpo.maxprice", + Usage: "Maximum gas price will be recommended by gpo", + Value: c.cliConfig.Gpo.MaxPrice, + }) + f.BigIntFlag(&flagset.BigIntFlag{ + Name: "gpo.ignoreprice", + Usage: "Gas price below which gpo will ignore transactions", + Value: c.cliConfig.Gpo.IgnorePrice, + }) + + // cache options + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "cache", + Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node)", + Value: &c.cliConfig.Cache.Cache, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "cache.database", + Usage: "Percentage of cache memory allowance to use for database io", + Value: &c.cliConfig.Cache.PercDatabase, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "cache.trie", + Usage: "Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode)", + Value: &c.cliConfig.Cache.PercTrie, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "cache.trie.journal", + Usage: "Disk journal directory for trie cache to survive node restarts", + Value: &c.cliConfig.Cache.Journal, + }) + f.DurationFlag(&flagset.DurationFlag{ + Name: "cache.trie.rejournal", + Usage: "Time interval to regenerate the trie cache journal", + Value: &c.cliConfig.Cache.Rejournal, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "cache.gc", + Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)", + Value: &c.cliConfig.Cache.PercGc, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "cache.snapshot", + Usage: "Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode)", + Value: &c.cliConfig.Cache.PercSnapshot, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "cache.noprefetch", + Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)", + Value: &c.cliConfig.Cache.NoPrefetch, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "cache.preimages", + Usage: "Enable recording the SHA3/keccak preimages of trie keys", + Value: &c.cliConfig.Cache.Preimages, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "txlookuplimit", + Usage: "Number of recent blocks to maintain transactions index for (default = about one year, 0 = entire chain)", + Value: &c.cliConfig.Cache.TxLookupLimit, + }) + + // rpc options + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "rpc.gascap", + Usage: "Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite)", + Value: &c.cliConfig.JsonRPC.GasCap, + }) + f.Float64Flag(&flagset.Float64Flag{ + Name: "rpc.txfeecap", + Usage: "Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap)", + Value: &c.cliConfig.JsonRPC.TxFeeCap, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "ipcdisable", + Usage: "Disable the IPC-RPC server", + Value: &c.cliConfig.JsonRPC.IPCDisable, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "ipcpath", + Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", + Value: &c.cliConfig.JsonRPC.IPCPath, + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "jsonrpc.corsdomain", + Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", + Value: &c.cliConfig.JsonRPC.Cors, + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "jsonrpc.vhosts", + Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", + Value: &c.cliConfig.JsonRPC.VHost, + }) + + // http options + f.BoolFlag(&flagset.BoolFlag{ + Name: "http", + Usage: "Enable the HTTP-RPC server", + Value: &c.cliConfig.JsonRPC.Http.Enabled, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "http.addr", + Usage: "HTTP-RPC server listening interface", + Value: &c.cliConfig.JsonRPC.Http.Host, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "http.port", + Usage: "HTTP-RPC server listening port", + Value: &c.cliConfig.JsonRPC.Http.Port, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "http.rpcprefix", + Usage: "HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", + Value: &c.cliConfig.JsonRPC.Http.Prefix, + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "http.modules", + Usage: "API's offered over the HTTP-RPC interface", + Value: &c.cliConfig.JsonRPC.Http.Modules, + }) + + // ws options + f.BoolFlag(&flagset.BoolFlag{ + Name: "ws", + Usage: "Enable the WS-RPC server", + Value: &c.cliConfig.JsonRPC.Ws.Enabled, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "ws.addr", + Usage: "WS-RPC server listening interface", + Value: &c.cliConfig.JsonRPC.Ws.Host, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "ws.port", + Usage: "WS-RPC server listening port", + Value: &c.cliConfig.JsonRPC.Ws.Port, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "ws.rpcprefix", + Usage: "HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", + Value: &c.cliConfig.JsonRPC.Ws.Prefix, + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "ws.modules", + Usage: "API's offered over the WS-RPC interface", + Value: &c.cliConfig.JsonRPC.Ws.Modules, + }) + + // graphql options + f.BoolFlag(&flagset.BoolFlag{ + Name: "graphql", + Usage: "Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.", + Value: &c.cliConfig.JsonRPC.Graphql.Enabled, + }) + + // p2p options + f.StringFlag(&flagset.StringFlag{ + Name: "bind", + Usage: "Network binding address", + Value: &c.cliConfig.P2P.Bind, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "port", + Usage: "Network listening port", + Value: &c.cliConfig.P2P.Port, + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "bootnodes", + Usage: "Comma separated enode URLs for P2P discovery bootstrap", + Value: &c.cliConfig.P2P.Discovery.Bootnodes, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "maxpeers", + Usage: "Maximum number of network peers (network disabled if set to 0)", + Value: &c.cliConfig.P2P.MaxPeers, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "maxpendpeers", + Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", + Value: &c.cliConfig.P2P.MaxPendPeers, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "nat", + Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:)", + Value: &c.cliConfig.P2P.NAT, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "nodiscover", + Usage: "Disables the peer discovery mechanism (manual peer addition)", + Value: &c.cliConfig.P2P.NoDiscover, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "v5disc", + Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism", + Value: &c.cliConfig.P2P.Discovery.V5Enabled, + }) + + // metrics + f.BoolFlag(&flagset.BoolFlag{ + Name: "metrics", + Usage: "Enable metrics collection and reporting", + Value: &c.cliConfig.Telemetry.Enabled, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "metrics.expensive", + Usage: "Enable expensive metrics collection and reporting", + Value: &c.cliConfig.Telemetry.Expensive, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "metrics.influxdb", + Usage: "Enable metrics export/push to an external InfluxDB database (v1)", + Value: &c.cliConfig.Telemetry.InfluxDB.V1Enabled, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.influxdb.endpoint", + Usage: "InfluxDB API endpoint to report metrics to", + Value: &c.cliConfig.Telemetry.InfluxDB.Endpoint, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.influxdb.database", + Usage: "InfluxDB database name to push reported metrics to", + Value: &c.cliConfig.Telemetry.InfluxDB.Database, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.influxdb.username", + Usage: "Username to authorize access to the database", + Value: &c.cliConfig.Telemetry.InfluxDB.Username, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.influxdb.password", + Usage: "Password to authorize access to the database", + Value: &c.cliConfig.Telemetry.InfluxDB.Password, + }) + f.MapStringFlag(&flagset.MapStringFlag{ + Name: "metrics.influxdb.tags", + Usage: "Comma-separated InfluxDB tags (key/values) attached to all measurements", + Value: &c.cliConfig.Telemetry.InfluxDB.Tags, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.prometheus-addr", + Usage: "Address for Prometheus Server", + Value: &c.cliConfig.Telemetry.PrometheusAddr, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.opencollector-endpoint", + Usage: "OpenCollector Endpoint (host:port)", + Value: &c.cliConfig.Telemetry.OpenCollectorEndpoint, + }) + // influx db v2 + f.BoolFlag(&flagset.BoolFlag{ + Name: "metrics.influxdbv2", + Usage: "Enable metrics export/push to an external InfluxDB v2 database", + Value: &c.cliConfig.Telemetry.InfluxDB.V2Enabled, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.influxdb.token", + Usage: "Token to authorize access to the database (v2 only)", + Value: &c.cliConfig.Telemetry.InfluxDB.Token, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.influxdb.bucket", + Usage: "InfluxDB bucket name to push reported metrics to (v2 only)", + Value: &c.cliConfig.Telemetry.InfluxDB.Bucket, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "metrics.influxdb.organization", + Usage: "InfluxDB organization name (v2 only)", + Value: &c.cliConfig.Telemetry.InfluxDB.Organization, + }) + + // account + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "unlock", + Usage: "Comma separated list of accounts to unlock", + Value: &c.cliConfig.Accounts.Unlock, + }) + f.StringFlag(&flagset.StringFlag{ + Name: "password", + Usage: "Password file to use for non-interactive password input", + Value: &c.cliConfig.Accounts.PasswordFile, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "allow-insecure-unlock", + Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", + Value: &c.cliConfig.Accounts.AllowInsecureUnlock, + }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "lightkdf", + Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", + Value: &c.cliConfig.Accounts.UseLightweightKDF, + }) + + // grpc + f.StringFlag(&flagset.StringFlag{ + Name: "grpc.addr", + Usage: "Address and port to bind the GRPC server", + Value: &c.cliConfig.GRPC.Addr, + }) + + // developer + f.BoolFlag(&flagset.BoolFlag{ + Name: "dev", + Usage: "Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled", + Value: &c.cliConfig.Developer.Enabled, + }) + f.Uint64Flag(&flagset.Uint64Flag{ + Name: "dev.period", + Usage: "Block period to use in developer mode (0 = mine only if transaction pending)", + Value: &c.cliConfig.Developer.Period, + }) + return f +} diff --git a/internal/cli/server/console.go b/internal/cli/server/console.go new file mode 100644 index 0000000000..05b333111c --- /dev/null +++ b/internal/cli/server/console.go @@ -0,0 +1,163 @@ +package server + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rpc" + "github.com/mitchellh/cli" +) + +// ConsoleCommand is the command to Connect to remote Bor IPC console +type ConsoleCommand struct { + // cli configuration + cliConfig *Config + + // final configuration + config *Config + + configFile []string + UI cli.Ui + ExecCMD string + Endpoint string + PreloadJSFlag string + JSpathFlag string + srv *Server +} + +// Help implements the cli.Command interface +func (c *ConsoleCommand) Help() string { + return `Usage: bor console + + Connect to local Bor IPC console.` +} + +// Synopsis implements the cli.Command interface +func (c *ConsoleCommand) Synopsis() string { + return "Connect to Bor console" +} + +// Run implements the cli.Command interface +func (c *ConsoleCommand) Run(args []string) int { + flags := c.Flags() + if err := flags.Parse(args); err != nil { + c.UI.Error(err.Error()) + return 1 + } + + // read config file + config := DefaultConfig() + for _, configFile := range c.configFile { + cfg, err := readConfigFile(configFile) + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + if err := config.Merge(cfg); err != nil { + c.UI.Error(err.Error()) + return 1 + } + } + if err := config.Merge(c.cliConfig); err != nil { + c.UI.Error(err.Error()) + return 1 + } + c.config = config + + srv, err := NewServer(config) + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + c.srv = srv + + c.localConsole() + + return 0 +} + +// localConsole starts a new geth node, attaching a JavaScript console to it at the +// same time. +func (c *ConsoleCommand) localConsole() error { + // Create and start the node based on the CLI flags + stack := c.srv.node + stack.Start() + defer stack.Close() + + path := node.DefaultDataDir() + + if c.Endpoint == "" { + if c.config.DataDir != "" { + path = c.config.DataDir + } + if path != "" { + homeDir, _ := os.UserHomeDir() + path = filepath.Join(homeDir, "/.bor/data") + } + c.Endpoint = fmt.Sprintf("%s/bor.ipc", path) + } + + // Attach to the newly started node and start the JavaScript console + client, err := stack.Attach() + if err != nil { + utils.Fatalf("Failed to attach to the inproc geth: %v", err) + } + config := console.Config{ + DataDir: path, + DocRoot: c.JSpathFlag, + Client: client, + Preload: c.MakeConsolePreloads(), + } + + console, err := console.New(config) + if err != nil { + utils.Fatalf("Failed to start the JavaScript console: %v", err) + } + defer console.Stop(false) + + // If only a short execution was requested, evaluate and return + if script := c.ExecCMD; script != "" { + console.Evaluate(script) + return nil + } + // Otherwise print the welcome screen and enter interactive mode + console.Welcome() + console.Interactive() + + return nil +} + +// dialRPC returns a RPC client which connects to the given endpoint. +// The check for empty endpoint implements the defaulting logic +// for "geth attach" with no argument. +func dialRPC(endpoint string) (*rpc.Client, error) { + if endpoint == "" { + endpoint = node.DefaultIPCEndpoint("bor") + } else if strings.HasPrefix(endpoint, "rpc:") || strings.HasPrefix(endpoint, "ipc:") { + // Backwards compatibility with geth < 1.5 which required + // these prefixes. + endpoint = endpoint[4:] + } + return rpc.Dial(endpoint) +} + +// MakeConsolePreloads retrieves the absolute paths for the console JavaScript +// scripts to preload before starting. +func (c *ConsoleCommand) MakeConsolePreloads() []string { + // Skip preloading if there's nothing to preload + if c.PreloadJSFlag == "" { + return nil + } + // Otherwise resolve absolute paths and return them + var preloads []string + + for _, file := range strings.Split(c.PreloadJSFlag, ",") { + preloads = append(preloads, strings.TrimSpace(file)) + } + return preloads +} From 00e51a99c0fe552e7d3e202e74915a17e2e91c4e Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 23 Mar 2022 16:49:56 +0530 Subject: [PATCH 042/190] Removed console command --- internal/cli/attach.go | 4 +- internal/cli/command.go | 5 - internal/cli/server/command_flags.go | 504 --------------------------- internal/cli/server/console.go | 163 --------- 4 files changed, 2 insertions(+), 674 deletions(-) delete mode 100644 internal/cli/server/command_flags.go delete mode 100644 internal/cli/server/console.go diff --git a/internal/cli/attach.go b/internal/cli/attach.go index b48bc5518b..e6454a1b22 100644 --- a/internal/cli/attach.go +++ b/internal/cli/attach.go @@ -114,7 +114,7 @@ func (c *AttachCommand) remoteConsole() error { DataDir: path, DocRoot: c.JSpathFlag, Client: client, - Preload: c.MakeConsolePreloads(), + Preload: c.makeConsolePreloads(), } console, err := console.New(config) @@ -151,7 +151,7 @@ func dialRPC(endpoint string) (*rpc.Client, error) { // MakeConsolePreloads retrieves the absolute paths for the console JavaScript // scripts to preload before starting. -func (c *AttachCommand) MakeConsolePreloads() []string { +func (c *AttachCommand) makeConsolePreloads() []string { // Skip preloading if there's nothing to preload if c.PreloadJSFlag == "" { return nil diff --git a/internal/cli/command.go b/internal/cli/command.go index baa09368b6..9e373a65cd 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -137,11 +137,6 @@ func commands() map[string]cli.CommandFactory { Meta2: meta2, }, nil }, - "console": func() (cli.Command, error) { - return &server.ConsoleCommand{ - UI: ui, - }, nil - }, } } diff --git a/internal/cli/server/command_flags.go b/internal/cli/server/command_flags.go deleted file mode 100644 index f43535a459..0000000000 --- a/internal/cli/server/command_flags.go +++ /dev/null @@ -1,504 +0,0 @@ -package server - -import ( - "github.com/ethereum/go-ethereum/internal/cli/flagset" -) - -func (c *ConsoleCommand) Flags() *flagset.Flagset { - c.cliConfig = DefaultConfig() - - f := flagset.NewFlagSet("console") - - // console flags - f.StringFlag(&flagset.StringFlag{ - Name: "exec", - Usage: "Command to run in remote console", - Value: &c.ExecCMD, - }) - - f.StringFlag(&flagset.StringFlag{ - Name: "preload", - Usage: "Comma separated list of JavaScript files to preload into the console", - Value: &c.PreloadJSFlag, - }) - - f.StringFlag(&flagset.StringFlag{ - Name: "jspath", - Usage: "JavaScript root path for `loadScript`", - Value: &c.JSpathFlag, - }) - - // server flags - f.StringFlag(&flagset.StringFlag{ - Name: "chain", - Usage: "Name of the chain to sync", - Value: &c.cliConfig.Chain, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "name", - Usage: "Name/Identity of the node", - Value: &c.cliConfig.Name, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "log-level", - Usage: "Set log level for the server", - Value: &c.cliConfig.LogLevel, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "datadir", - Usage: "Path of the data directory to store information", - Value: &c.cliConfig.DataDir, - }) - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "config", - Usage: "File for the config file", - Value: &c.configFile, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "syncmode", - Usage: `Blockchain sync mode ("fast", "full", "snap" or "light")`, - Value: &c.cliConfig.SyncMode, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "gcmode", - Usage: `Blockchain garbage collection mode ("full", "archive")`, - Value: &c.cliConfig.GcMode, - }) - f.MapStringFlag(&flagset.MapStringFlag{ - Name: "whitelist", - Usage: "Comma separated block number-to-hash mappings to enforce (=)", - Value: &c.cliConfig.Whitelist, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "snapshot", - Usage: `Enables snapshot-database mode (default = enable)`, - Value: &c.cliConfig.Snapshot, - }) - - // heimdall - f.StringFlag(&flagset.StringFlag{ - Name: "bor.heimdall", - Usage: "URL of Heimdall service", - Value: &c.cliConfig.Heimdall.URL, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "bor.withoutheimdall", - Usage: "Run without Heimdall service (for testing purpose)", - Value: &c.cliConfig.Heimdall.Without, - }) - - // txpool options - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "txpool.locals", - Usage: "Comma separated accounts to treat as locals (no flush, priority inclusion)", - Value: &c.cliConfig.TxPool.Locals, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "txpool.nolocals", - Usage: "Disables price exemptions for locally submitted transactions", - Value: &c.cliConfig.TxPool.NoLocals, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "txpool.journal", - Usage: "Disk journal for local transaction to survive node restarts", - Value: &c.cliConfig.TxPool.Journal, - }) - f.DurationFlag(&flagset.DurationFlag{ - Name: "txpool.rejournal", - Usage: "Time interval to regenerate the local transaction journal", - Value: &c.cliConfig.TxPool.Rejournal, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.pricelimit", - Usage: "Minimum gas price limit to enforce for acceptance into the pool", - Value: &c.cliConfig.TxPool.PriceLimit, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.pricebump", - Usage: "Price bump percentage to replace an already existing transaction", - Value: &c.cliConfig.TxPool.PriceBump, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.accountslots", - Usage: "Minimum number of executable transaction slots guaranteed per account", - Value: &c.cliConfig.TxPool.AccountSlots, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.globalslots", - Usage: "Maximum number of executable transaction slots for all accounts", - Value: &c.cliConfig.TxPool.GlobalSlots, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.accountqueue", - Usage: "Maximum number of non-executable transaction slots permitted per account", - Value: &c.cliConfig.TxPool.AccountQueue, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.globalqueue", - Usage: "Maximum number of non-executable transaction slots for all accounts", - Value: &c.cliConfig.TxPool.GlobalQueue, - }) - f.DurationFlag(&flagset.DurationFlag{ - Name: "txpool.lifetime", - Usage: "Maximum amount of time non-executable transaction are queued", - Value: &c.cliConfig.TxPool.LifeTime, - }) - - // sealer options - f.BoolFlag(&flagset.BoolFlag{ - Name: "mine", - Usage: "Enable mining", - Value: &c.cliConfig.Sealer.Enabled, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "miner.etherbase", - Usage: "Public address for block mining rewards (default = first account)", - Value: &c.cliConfig.Sealer.Etherbase, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "miner.extradata", - Usage: "Block extra data set by the miner (default = client version)", - Value: &c.cliConfig.Sealer.ExtraData, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "miner.gaslimit", - Usage: "Target gas ceiling for mined blocks", - Value: &c.cliConfig.Sealer.GasCeil, - }) - f.BigIntFlag(&flagset.BigIntFlag{ - Name: "miner.gasprice", - Usage: "Minimum gas price for mining a transaction", - Value: c.cliConfig.Sealer.GasPrice, - }) - - // ethstats - f.StringFlag(&flagset.StringFlag{ - Name: "ethstats", - Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)", - Value: &c.cliConfig.Ethstats, - }) - - // gas price oracle - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "gpo.blocks", - Usage: "Number of recent blocks to check for gas prices", - Value: &c.cliConfig.Gpo.Blocks, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "gpo.percentile", - Usage: "Suggested gas price is the given percentile of a set of recent transaction gas prices", - Value: &c.cliConfig.Gpo.Percentile, - }) - f.BigIntFlag(&flagset.BigIntFlag{ - Name: "gpo.maxprice", - Usage: "Maximum gas price will be recommended by gpo", - Value: c.cliConfig.Gpo.MaxPrice, - }) - f.BigIntFlag(&flagset.BigIntFlag{ - Name: "gpo.ignoreprice", - Usage: "Gas price below which gpo will ignore transactions", - Value: c.cliConfig.Gpo.IgnorePrice, - }) - - // cache options - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache", - Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node)", - Value: &c.cliConfig.Cache.Cache, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache.database", - Usage: "Percentage of cache memory allowance to use for database io", - Value: &c.cliConfig.Cache.PercDatabase, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache.trie", - Usage: "Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode)", - Value: &c.cliConfig.Cache.PercTrie, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "cache.trie.journal", - Usage: "Disk journal directory for trie cache to survive node restarts", - Value: &c.cliConfig.Cache.Journal, - }) - f.DurationFlag(&flagset.DurationFlag{ - Name: "cache.trie.rejournal", - Usage: "Time interval to regenerate the trie cache journal", - Value: &c.cliConfig.Cache.Rejournal, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache.gc", - Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)", - Value: &c.cliConfig.Cache.PercGc, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache.snapshot", - Usage: "Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode)", - Value: &c.cliConfig.Cache.PercSnapshot, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "cache.noprefetch", - Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)", - Value: &c.cliConfig.Cache.NoPrefetch, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "cache.preimages", - Usage: "Enable recording the SHA3/keccak preimages of trie keys", - Value: &c.cliConfig.Cache.Preimages, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txlookuplimit", - Usage: "Number of recent blocks to maintain transactions index for (default = about one year, 0 = entire chain)", - Value: &c.cliConfig.Cache.TxLookupLimit, - }) - - // rpc options - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "rpc.gascap", - Usage: "Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite)", - Value: &c.cliConfig.JsonRPC.GasCap, - }) - f.Float64Flag(&flagset.Float64Flag{ - Name: "rpc.txfeecap", - Usage: "Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap)", - Value: &c.cliConfig.JsonRPC.TxFeeCap, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "ipcdisable", - Usage: "Disable the IPC-RPC server", - Value: &c.cliConfig.JsonRPC.IPCDisable, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "ipcpath", - Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", - Value: &c.cliConfig.JsonRPC.IPCPath, - }) - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "jsonrpc.corsdomain", - Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", - Value: &c.cliConfig.JsonRPC.Cors, - }) - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "jsonrpc.vhosts", - Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", - Value: &c.cliConfig.JsonRPC.VHost, - }) - - // http options - f.BoolFlag(&flagset.BoolFlag{ - Name: "http", - Usage: "Enable the HTTP-RPC server", - Value: &c.cliConfig.JsonRPC.Http.Enabled, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "http.addr", - Usage: "HTTP-RPC server listening interface", - Value: &c.cliConfig.JsonRPC.Http.Host, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "http.port", - Usage: "HTTP-RPC server listening port", - Value: &c.cliConfig.JsonRPC.Http.Port, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "http.rpcprefix", - Usage: "HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", - Value: &c.cliConfig.JsonRPC.Http.Prefix, - }) - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "http.modules", - Usage: "API's offered over the HTTP-RPC interface", - Value: &c.cliConfig.JsonRPC.Http.Modules, - }) - - // ws options - f.BoolFlag(&flagset.BoolFlag{ - Name: "ws", - Usage: "Enable the WS-RPC server", - Value: &c.cliConfig.JsonRPC.Ws.Enabled, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "ws.addr", - Usage: "WS-RPC server listening interface", - Value: &c.cliConfig.JsonRPC.Ws.Host, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "ws.port", - Usage: "WS-RPC server listening port", - Value: &c.cliConfig.JsonRPC.Ws.Port, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "ws.rpcprefix", - Usage: "HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", - Value: &c.cliConfig.JsonRPC.Ws.Prefix, - }) - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "ws.modules", - Usage: "API's offered over the WS-RPC interface", - Value: &c.cliConfig.JsonRPC.Ws.Modules, - }) - - // graphql options - f.BoolFlag(&flagset.BoolFlag{ - Name: "graphql", - Usage: "Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.", - Value: &c.cliConfig.JsonRPC.Graphql.Enabled, - }) - - // p2p options - f.StringFlag(&flagset.StringFlag{ - Name: "bind", - Usage: "Network binding address", - Value: &c.cliConfig.P2P.Bind, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "port", - Usage: "Network listening port", - Value: &c.cliConfig.P2P.Port, - }) - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "bootnodes", - Usage: "Comma separated enode URLs for P2P discovery bootstrap", - Value: &c.cliConfig.P2P.Discovery.Bootnodes, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "maxpeers", - Usage: "Maximum number of network peers (network disabled if set to 0)", - Value: &c.cliConfig.P2P.MaxPeers, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "maxpendpeers", - Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", - Value: &c.cliConfig.P2P.MaxPendPeers, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "nat", - Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:)", - Value: &c.cliConfig.P2P.NAT, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "nodiscover", - Usage: "Disables the peer discovery mechanism (manual peer addition)", - Value: &c.cliConfig.P2P.NoDiscover, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "v5disc", - Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism", - Value: &c.cliConfig.P2P.Discovery.V5Enabled, - }) - - // metrics - f.BoolFlag(&flagset.BoolFlag{ - Name: "metrics", - Usage: "Enable metrics collection and reporting", - Value: &c.cliConfig.Telemetry.Enabled, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "metrics.expensive", - Usage: "Enable expensive metrics collection and reporting", - Value: &c.cliConfig.Telemetry.Expensive, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "metrics.influxdb", - Usage: "Enable metrics export/push to an external InfluxDB database (v1)", - Value: &c.cliConfig.Telemetry.InfluxDB.V1Enabled, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.endpoint", - Usage: "InfluxDB API endpoint to report metrics to", - Value: &c.cliConfig.Telemetry.InfluxDB.Endpoint, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.database", - Usage: "InfluxDB database name to push reported metrics to", - Value: &c.cliConfig.Telemetry.InfluxDB.Database, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.username", - Usage: "Username to authorize access to the database", - Value: &c.cliConfig.Telemetry.InfluxDB.Username, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.password", - Usage: "Password to authorize access to the database", - Value: &c.cliConfig.Telemetry.InfluxDB.Password, - }) - f.MapStringFlag(&flagset.MapStringFlag{ - Name: "metrics.influxdb.tags", - Usage: "Comma-separated InfluxDB tags (key/values) attached to all measurements", - Value: &c.cliConfig.Telemetry.InfluxDB.Tags, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.prometheus-addr", - Usage: "Address for Prometheus Server", - Value: &c.cliConfig.Telemetry.PrometheusAddr, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.opencollector-endpoint", - Usage: "OpenCollector Endpoint (host:port)", - Value: &c.cliConfig.Telemetry.OpenCollectorEndpoint, - }) - // influx db v2 - f.BoolFlag(&flagset.BoolFlag{ - Name: "metrics.influxdbv2", - Usage: "Enable metrics export/push to an external InfluxDB v2 database", - Value: &c.cliConfig.Telemetry.InfluxDB.V2Enabled, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.token", - Usage: "Token to authorize access to the database (v2 only)", - Value: &c.cliConfig.Telemetry.InfluxDB.Token, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.bucket", - Usage: "InfluxDB bucket name to push reported metrics to (v2 only)", - Value: &c.cliConfig.Telemetry.InfluxDB.Bucket, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.organization", - Usage: "InfluxDB organization name (v2 only)", - Value: &c.cliConfig.Telemetry.InfluxDB.Organization, - }) - - // account - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "unlock", - Usage: "Comma separated list of accounts to unlock", - Value: &c.cliConfig.Accounts.Unlock, - }) - f.StringFlag(&flagset.StringFlag{ - Name: "password", - Usage: "Password file to use for non-interactive password input", - Value: &c.cliConfig.Accounts.PasswordFile, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "allow-insecure-unlock", - Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", - Value: &c.cliConfig.Accounts.AllowInsecureUnlock, - }) - f.BoolFlag(&flagset.BoolFlag{ - Name: "lightkdf", - Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", - Value: &c.cliConfig.Accounts.UseLightweightKDF, - }) - - // grpc - f.StringFlag(&flagset.StringFlag{ - Name: "grpc.addr", - Usage: "Address and port to bind the GRPC server", - Value: &c.cliConfig.GRPC.Addr, - }) - - // developer - f.BoolFlag(&flagset.BoolFlag{ - Name: "dev", - Usage: "Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled", - Value: &c.cliConfig.Developer.Enabled, - }) - f.Uint64Flag(&flagset.Uint64Flag{ - Name: "dev.period", - Usage: "Block period to use in developer mode (0 = mine only if transaction pending)", - Value: &c.cliConfig.Developer.Period, - }) - return f -} diff --git a/internal/cli/server/console.go b/internal/cli/server/console.go deleted file mode 100644 index 05b333111c..0000000000 --- a/internal/cli/server/console.go +++ /dev/null @@ -1,163 +0,0 @@ -package server - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/console" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" - "github.com/mitchellh/cli" -) - -// ConsoleCommand is the command to Connect to remote Bor IPC console -type ConsoleCommand struct { - // cli configuration - cliConfig *Config - - // final configuration - config *Config - - configFile []string - UI cli.Ui - ExecCMD string - Endpoint string - PreloadJSFlag string - JSpathFlag string - srv *Server -} - -// Help implements the cli.Command interface -func (c *ConsoleCommand) Help() string { - return `Usage: bor console - - Connect to local Bor IPC console.` -} - -// Synopsis implements the cli.Command interface -func (c *ConsoleCommand) Synopsis() string { - return "Connect to Bor console" -} - -// Run implements the cli.Command interface -func (c *ConsoleCommand) Run(args []string) int { - flags := c.Flags() - if err := flags.Parse(args); err != nil { - c.UI.Error(err.Error()) - return 1 - } - - // read config file - config := DefaultConfig() - for _, configFile := range c.configFile { - cfg, err := readConfigFile(configFile) - if err != nil { - c.UI.Error(err.Error()) - return 1 - } - if err := config.Merge(cfg); err != nil { - c.UI.Error(err.Error()) - return 1 - } - } - if err := config.Merge(c.cliConfig); err != nil { - c.UI.Error(err.Error()) - return 1 - } - c.config = config - - srv, err := NewServer(config) - if err != nil { - c.UI.Error(err.Error()) - return 1 - } - c.srv = srv - - c.localConsole() - - return 0 -} - -// localConsole starts a new geth node, attaching a JavaScript console to it at the -// same time. -func (c *ConsoleCommand) localConsole() error { - // Create and start the node based on the CLI flags - stack := c.srv.node - stack.Start() - defer stack.Close() - - path := node.DefaultDataDir() - - if c.Endpoint == "" { - if c.config.DataDir != "" { - path = c.config.DataDir - } - if path != "" { - homeDir, _ := os.UserHomeDir() - path = filepath.Join(homeDir, "/.bor/data") - } - c.Endpoint = fmt.Sprintf("%s/bor.ipc", path) - } - - // Attach to the newly started node and start the JavaScript console - client, err := stack.Attach() - if err != nil { - utils.Fatalf("Failed to attach to the inproc geth: %v", err) - } - config := console.Config{ - DataDir: path, - DocRoot: c.JSpathFlag, - Client: client, - Preload: c.MakeConsolePreloads(), - } - - console, err := console.New(config) - if err != nil { - utils.Fatalf("Failed to start the JavaScript console: %v", err) - } - defer console.Stop(false) - - // If only a short execution was requested, evaluate and return - if script := c.ExecCMD; script != "" { - console.Evaluate(script) - return nil - } - // Otherwise print the welcome screen and enter interactive mode - console.Welcome() - console.Interactive() - - return nil -} - -// dialRPC returns a RPC client which connects to the given endpoint. -// The check for empty endpoint implements the defaulting logic -// for "geth attach" with no argument. -func dialRPC(endpoint string) (*rpc.Client, error) { - if endpoint == "" { - endpoint = node.DefaultIPCEndpoint("bor") - } else if strings.HasPrefix(endpoint, "rpc:") || strings.HasPrefix(endpoint, "ipc:") { - // Backwards compatibility with geth < 1.5 which required - // these prefixes. - endpoint = endpoint[4:] - } - return rpc.Dial(endpoint) -} - -// MakeConsolePreloads retrieves the absolute paths for the console JavaScript -// scripts to preload before starting. -func (c *ConsoleCommand) MakeConsolePreloads() []string { - // Skip preloading if there's nothing to preload - if c.PreloadJSFlag == "" { - return nil - } - // Otherwise resolve absolute paths and return them - var preloads []string - - for _, file := range strings.Split(c.PreloadJSFlag, ",") { - preloads = append(preloads, strings.TrimSpace(file)) - } - return preloads -} From 388b68cd05addf9ebddcc300546f3e0ec12ecb64 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 20 Apr 2022 17:22:55 +0530 Subject: [PATCH 043/190] Minor Fixes --- internal/cli/attach.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/internal/cli/attach.go b/internal/cli/attach.go index e6454a1b22..eec8a28ed3 100644 --- a/internal/cli/attach.go +++ b/internal/cli/attach.go @@ -72,7 +72,7 @@ func (c *AttachCommand) Run(args []string) int { if len(args) == 0 { args = append(args, "") } - if args[0] != "" && string(args[0][0:2]) == "--" { + if args[0] != "" && strings.HasPrefix(args[0], "--") { if err := flags.Parse(args); err != nil { c.UI.Error(err.Error()) return 1 @@ -84,7 +84,10 @@ func (c *AttachCommand) Run(args []string) int { return 1 } } - c.remoteConsole() + if err := c.remoteConsole(); err != nil { + c.UI.Error(err.Error()) + return 1 + } return 0 } From 597037df3021c124556135a8bdfdcd308d919de4 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Tue, 26 Apr 2022 13:50:53 +0530 Subject: [PATCH 044/190] Update default cli config (#323) * update the default cli config * fix: handle maxpeers flag override, added tests * add: no-snapshot flag, handle snapshot disable * fix: update default flags * add: update the sealer.GasPrice default to 30 gewi * fix: remove snapshot flag, rely on no-snapshot only --- internal/cli/server/config.go | 35 +++++++++++++++++++----------- internal/cli/server/config_test.go | 30 +++++++++++++++++++++---- internal/cli/server/flags.go | 6 ++--- 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 29cb8ffa21..a5e255ad48 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -58,8 +58,8 @@ type Config struct { // GcMode selects the garbage collection mode for the trie GcMode string `hcl:"gc-mode,optional"` - // XXX - Snapshot bool `hcl:"snapshot,optional"` + // NoSnapshot disbales the snapshot database mode + NoSnapshot bool `hcl:"no-snapshot,optional"` // Ethstats is the address of the ethstats server to send telemetry Ethstats string `hcl:"ethstats,optional"` @@ -406,27 +406,27 @@ func DefaultConfig() *Config { URL: "http://localhost:1317", Without: false, }, - SyncMode: "full", - GcMode: "full", - Snapshot: true, + SyncMode: "full", + GcMode: "full", + NoSnapshot: false, TxPool: &TxPoolConfig{ Locals: []string{}, NoLocals: false, Journal: "", Rejournal: time.Duration(1 * time.Hour), - PriceLimit: 1, + PriceLimit: 30000000000, PriceBump: 10, AccountSlots: 16, - GlobalSlots: 4096, - AccountQueue: 64, - GlobalQueue: 1024, + GlobalSlots: 32768, + AccountQueue: 16, + GlobalQueue: 32768, LifeTime: time.Duration(3 * time.Hour), }, Sealer: &SealerConfig{ Enabled: false, Etherbase: "", GasCeil: 8000000, - GasPrice: big.NewInt(params.GWei), + GasPrice: big.NewInt(30 * params.GWei), ExtraData: "", }, Gpo: &GpoConfig{ @@ -443,11 +443,11 @@ func DefaultConfig() *Config { GasCap: ethconfig.Defaults.RPCGasCap, TxFeeCap: ethconfig.Defaults.RPCTxFeeCap, Http: &APIConfig{ - Enabled: true, + Enabled: false, Port: 8545, Prefix: "", Host: "localhost", - Modules: []string{"eth", "web3", "net"}, + Modules: []string{"eth", "net", "web3", "txpool", "bor"}, }, Ws: &APIConfig{ Enabled: false, @@ -805,7 +805,7 @@ func (c *Config) buildEth(stack *node.Node) (*ethconfig.Config, error) { } // snapshot disable check - if c.Snapshot { + if c.NoSnapshot { if n.SyncMode == downloader.SnapSync { log.Info("Snap sync requested, enabling --snapshot") } else { @@ -867,6 +867,10 @@ func (c *Config) buildNode() (*node.Config, error) { cfg.P2P.ListenAddr = "" cfg.P2P.NoDial = true cfg.P2P.DiscoveryV5 = false + + // enable JsonRPC HTTP API + c.JsonRPC.Http.Enabled = true + cfg.HTTPModules = []string{"admin", "debug", "eth", "miner", "net", "personal", "txpool", "web3", "bor"} } // enable jsonrpc endpoints @@ -922,6 +926,11 @@ func (c *Config) Merge(cc ...*Config) error { if err := mergo.Merge(c, elem, mergo.WithOverride, mergo.WithAppendSlice); err != nil { return fmt.Errorf("failed to merge configurations: %v", err) } + + // override max peers + if elem.P2P.MaxPeers == 0 { + c.P2P.MaxPeers = 0 + } } return nil } diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index 62296d82a4..6f5f9ff97d 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -22,8 +22,8 @@ func TestConfigDefault(t *testing.T) { func TestConfigMerge(t *testing.T) { c0 := &Config{ - Chain: "0", - Snapshot: true, + Chain: "0", + NoSnapshot: true, Whitelist: map[string]string{ "a": "b", }, @@ -53,8 +53,8 @@ func TestConfigMerge(t *testing.T) { }, } expected := &Config{ - Chain: "1", - Snapshot: true, + Chain: "1", + NoSnapshot: true, Whitelist: map[string]string{ "a": "b", "b": "c", @@ -76,6 +76,28 @@ func TestConfigMerge(t *testing.T) { assert.Equal(t, c0, expected) } +func TestDefaultDatatypeOverride(t *testing.T) { + // This test is specific to `maxpeers` flag (for now) to check + // if default datatype value (0 in case of uint64) is overridden. + c0 := &Config{ + P2P: &P2PConfig{ + MaxPeers: 30, + }, + } + c1 := &Config{ + P2P: &P2PConfig{ + MaxPeers: 0, + }, + } + expected := &Config{ + P2P: &P2PConfig{ + MaxPeers: 0, + }, + } + assert.NoError(t, c0.Merge(c1)) + assert.Equal(t, c0, expected) +} + func TestConfigLoadFile(t *testing.T) { readFile := func(path string) { config, err := readConfigFile(path) diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index b8f6003420..edc7276a8b 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -50,9 +50,9 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.cliConfig.Whitelist, }) f.BoolFlag(&flagset.BoolFlag{ - Name: "snapshot", - Usage: `Enables snapshot-database mode (default = enable)`, - Value: &c.cliConfig.Snapshot, + Name: "no-snapshot", + Usage: `Disables the snapshot-database mode (default = false)`, + Value: &c.cliConfig.NoSnapshot, }) // heimdall From a131e427f64bd56839c432ac93fb64dd3d471087 Mon Sep 17 00:00:00 2001 From: Jerry Date: Fri, 22 Apr 2022 11:44:35 -0700 Subject: [PATCH 045/190] Automatically generate markdown pages from bor CLI Adding a script that can automatically generate markdown pages from bor CLI, so we can avoid copy-pasting helper strings whenever a flag is created, deleted, or modified. CLI docs could be generated with command `make docs`. --- Makefile | 9 +- cmd/clidoc/main.go | 71 ++++++++++++ docs/cli/README.md | 25 ++-- docs/cli/account.md | 3 +- docs/cli/account_import.md | 7 +- docs/cli/account_list.md | 9 +- docs/cli/account_new.md | 9 +- docs/cli/attach.md | 11 ++ docs/cli/chain.md | 3 +- docs/cli/chain_sethead.md | 5 +- docs/cli/chain_watch.md | 2 +- docs/cli/debug.md | 13 ++- docs/cli/fingerprint.md | 3 + docs/cli/peers.md | 3 +- docs/cli/peers_add.md | 7 +- docs/cli/peers_list.md | 7 +- docs/cli/peers_remove.md | 7 +- docs/cli/peers_status.md | 5 +- docs/cli/server.md | 195 ++++++++++++++++---------------- docs/cli/status.md | 3 +- docs/cli/version.md | 3 +- internal/cli/account.go | 18 ++- internal/cli/account_import.go | 11 ++ internal/cli/account_list.go | 11 ++ internal/cli/account_new.go | 11 ++ internal/cli/attach.go | 10 ++ internal/cli/bor_fingerprint.go | 10 ++ internal/cli/chain.go | 13 +++ internal/cli/chain_sethead.go | 13 +++ internal/cli/chain_watch.go | 10 ++ internal/cli/command.go | 60 ++++++---- internal/cli/debug.go | 27 +++++ internal/cli/flagset/flagset.go | 54 +++++++++ internal/cli/markdown.go | 14 +++ internal/cli/markdown_test.go | 19 ++++ internal/cli/peers.go | 15 +++ internal/cli/peers_add.go | 11 ++ internal/cli/peers_list.go | 10 ++ internal/cli/peers_remove.go | 11 ++ internal/cli/peers_status.go | 10 ++ internal/cli/server/command.go | 11 ++ internal/cli/server/flags.go | 71 +++++++++++- internal/cli/status.go | 9 ++ internal/cli/version.go | 20 ++++ 44 files changed, 686 insertions(+), 163 deletions(-) create mode 100644 cmd/clidoc/main.go create mode 100644 docs/cli/attach.md create mode 100644 docs/cli/fingerprint.md create mode 100644 internal/cli/markdown.go create mode 100644 internal/cli/markdown_test.go diff --git a/Makefile b/Makefile index 678af31c46..9ee575aab4 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,11 @@ # with Go source code. If you know what GOPATH is then you probably # don't need to bother with make. -.PHONY: geth android ios evm all test clean +.PHONY: geth android ios geth-cross evm all test clean docs +.PHONY: geth-linux geth-linux-386 geth-linux-amd64 geth-linux-mips64 geth-linux-mips64le +.PHONY: geth-linux-arm geth-linux-arm-5 geth-linux-arm-6 geth-linux-arm-7 geth-linux-arm64 +.PHONY: geth-darwin geth-darwin-386 geth-darwin-amd64 +.PHONY: geth-windows geth-windows-386 geth-windows-amd64 GOBIN = ./build/bin GO ?= latest @@ -43,6 +47,9 @@ test: lint: ## Run linters. $(GORUN) build/ci.go lint +docs: + $(GORUN) cmd/clidoc/main.go -d ./docs/cli + clean: env GO111MODULE=on go clean -cache rm -fr build/_workspace/pkg/ $(GOBIN)/* diff --git a/cmd/clidoc/main.go b/cmd/clidoc/main.go new file mode 100644 index 0000000000..70ad35501b --- /dev/null +++ b/cmd/clidoc/main.go @@ -0,0 +1,71 @@ +package main + +import ( + "flag" + "log" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/ethereum/go-ethereum/internal/cli" +) + +const ( + DefaultDir string = "./docs/cli" + DefaultMainPage string = "README.md" +) + +func main() { + + commands := cli.Commands() + + dest := flag.String("d", DefaultDir, "Destination directory where the docs will be generated") + flag.Parse() + + dirPath := filepath.Join(".", *dest) + if err := os.MkdirAll(dirPath, os.ModePerm); err != nil { + log.Fatalln("Failed to create directory.", err) + } + + mainPage := []string{ + "# Bor command line interface", + "## Commands", + } + + keys := make([]string, len(commands)) + i := 0 + for k := range commands { + keys[i] = k + i++ + } + sort.Strings(keys) + + for _, name := range keys { + cmd, err := commands[name]() + if err != nil { + log.Fatalf("Error occurred when inspecting bor command %s: %s", name, err) + } + + fileName := strings.ReplaceAll(name, " ", "_") + ".md" + + overwriteFile(filepath.Join(dirPath, fileName), cmd.MarkDown()) + mainPage = append(mainPage, "- [```"+name+"```](./"+fileName+")") + } + + overwriteFile(filepath.Join(dirPath, DefaultMainPage), strings.Join(mainPage, "\n\n")) + + os.Exit(0) +} + +func overwriteFile(filePath string, text string) { + log.Printf("Writing to page: %s\n", filePath) + f, err := os.Create(filePath) + if err != nil { + log.Fatalln(err) + } + f.WriteString(text) + if err := f.Close(); err != nil { + log.Fatalln(err) + } +} diff --git a/docs/cli/README.md b/docs/cli/README.md index ed8a3f5977..c10c8bf9c2 100644 --- a/docs/cli/README.md +++ b/docs/cli/README.md @@ -1,24 +1,27 @@ - -# Command line interface +# Bor command line interface ## Commands -- [```server```](./server.md) - -- [```debug```](./debug.md) - - [```account```](./account.md) -- [```account new```](./account_new.md) +- [```account import```](./account_import.md) - [```account list```](./account_list.md) -- [```account import```](./account_import.md) +- [```account new```](./account_new.md) + +- [```attach```](./attach.md) - [```chain```](./chain.md) - [```chain sethead```](./chain_sethead.md) +- [```chain watch```](./chain_watch.md) + +- [```debug```](./debug.md) + +- [```fingerprint```](./fingerprint.md) + - [```peers```](./peers.md) - [```peers add```](./peers_add.md) @@ -29,8 +32,8 @@ - [```peers status```](./peers_status.md) -- [```status```](./status.md) +- [```server```](./server.md) -- [```chain watch```](./chain_watch.md) +- [```status```](./status.md) -- [```version```](./version.md) +- [```version```](./version.md) \ No newline at end of file diff --git a/docs/cli/account.md b/docs/cli/account.md index 00fd6cbe65..b3659952f6 100644 --- a/docs/cli/account.md +++ b/docs/cli/account.md @@ -1,4 +1,3 @@ - # Account The ```account``` command groups actions to interact with accounts: @@ -7,4 +6,4 @@ The ```account``` command groups actions to interact with accounts: - [```account list```](./account_list.md): List the wallets in the Bor client. -- [```account import```](./account_import.md): Import an account to the Bor client. +- [```account import```](./account_import.md): Import an account to the Bor client. \ No newline at end of file diff --git a/docs/cli/account_import.md b/docs/cli/account_import.md index 2a515866cf..d7b02195bc 100644 --- a/docs/cli/account_import.md +++ b/docs/cli/account_import.md @@ -1,4 +1,9 @@ - # Account import The ```account import``` command imports an account in Json format to the Bor data directory. + +## Options + +- ```datadir```: Path of the data directory to store information + +- ```keystore```: Path of the data directory to store information \ No newline at end of file diff --git a/docs/cli/account_list.md b/docs/cli/account_list.md index 4a2d28de92..61ebf9e776 100644 --- a/docs/cli/account_list.md +++ b/docs/cli/account_list.md @@ -1,4 +1,9 @@ - # Account list -The ```account list``` command lists all the accounts in the Bor data directory. +The `account list` command lists all the accounts in the Bor data directory. + +## Options + +- ```datadir```: Path of the data directory to store information + +- ```keystore```: Path of the data directory to store information \ No newline at end of file diff --git a/docs/cli/account_new.md b/docs/cli/account_new.md index 41e53767a1..dd62061ba0 100644 --- a/docs/cli/account_new.md +++ b/docs/cli/account_new.md @@ -1,4 +1,9 @@ - # Account new -The ```account new``` command creates a new local account file on the Bor data directory. Bor should not be running to execute this command. +The `account new` command creates a new local account file on the Bor data directory. Bor should not be running to execute this command. + +## Options + +- ```datadir```: Path of the data directory to store information + +- ```keystore```: Path of the data directory to store information \ No newline at end of file diff --git a/docs/cli/attach.md b/docs/cli/attach.md new file mode 100644 index 0000000000..6e323b8d18 --- /dev/null +++ b/docs/cli/attach.md @@ -0,0 +1,11 @@ +# Attach + +Connect to remote Bor IPC console. + +## Options + +- ```exec```: Command to run in remote console + +- ```preload```: Comma separated list of JavaScript files to preload into the console + +- ```jspath```: JavaScript root path for `loadScript` \ No newline at end of file diff --git a/docs/cli/chain.md b/docs/cli/chain.md index e55a90f122..8412588e37 100644 --- a/docs/cli/chain.md +++ b/docs/cli/chain.md @@ -1,6 +1,7 @@ - # Chain The ```chain``` command groups actions to interact with the blockchain in the client: - [```chain sethead```](./chain_sethead.md): Set the current chain to a certain block. + +- [```chain watch```](./chain_watch.md): Watch the chainHead, reorg and fork events in real-time. \ No newline at end of file diff --git a/docs/cli/chain_sethead.md b/docs/cli/chain_sethead.md index 985383988f..bf97990e62 100644 --- a/docs/cli/chain_sethead.md +++ b/docs/cli/chain_sethead.md @@ -1,4 +1,3 @@ - # Chain sethead The ```chain sethead ``` command sets the current chain to a certain block. @@ -9,4 +8,6 @@ The ```chain sethead ``` command sets the current chain to a certain blo ## Options -- ```yes```: Force set head. +- ```address```: Address of the grpc endpoint + +- ```yes```: Force set head \ No newline at end of file diff --git a/docs/cli/chain_watch.md b/docs/cli/chain_watch.md index 4844bb7618..252ac02531 100644 --- a/docs/cli/chain_watch.md +++ b/docs/cli/chain_watch.md @@ -1,3 +1,3 @@ # Chain watch -The ```chain watch``` command is used to view the chainHead, reorg and fork events in real-time. +The ```chain watch``` command is used to view the chainHead, reorg and fork events in real-time. \ No newline at end of file diff --git a/docs/cli/debug.md b/docs/cli/debug.md index c75ae79e49..eecc6c6ef0 100644 --- a/docs/cli/debug.md +++ b/docs/cli/debug.md @@ -1,13 +1,14 @@ - # Debug The ```bor debug``` command takes a debug dump of the running client. ## Options -- ```seconds```: Number of seconds to trace cpu and traces. +- ```address```: Address of the grpc endpoint + +- ```seconds```: seconds to trace -- ```output```: Output directory for the data dump. +- ```output```: Output directory ## Examples @@ -15,8 +16,8 @@ By default it creates a tar.gz file with the output: ``` $ bor debug -Starting debugger... - +Starting debugger... + Created debug archive: bor-debug-2021-10-26-073819Z.tar.gz ``` @@ -27,4 +28,4 @@ $ bor debug --output data Starting debugger... Created debug directory: data/bor-debug-2021-10-26-075437Z -``` +``` \ No newline at end of file diff --git a/docs/cli/fingerprint.md b/docs/cli/fingerprint.md new file mode 100644 index 0000000000..8bb7cb1542 --- /dev/null +++ b/docs/cli/fingerprint.md @@ -0,0 +1,3 @@ +# Fingerprint + +Display the system fingerprint \ No newline at end of file diff --git a/docs/cli/peers.md b/docs/cli/peers.md index 57b4889a00..ac6dfd676e 100644 --- a/docs/cli/peers.md +++ b/docs/cli/peers.md @@ -1,4 +1,3 @@ - # Peers The ```peers``` command groups actions to interact with peers: @@ -9,4 +8,4 @@ The ```peers``` command groups actions to interact with peers: - [```peers remove```](./peers_remove.md): Disconnects the local client from a connected peer if exists. -- [```peers status```](./peers_status.md): Display the status of a peer by its id. +- [```peers status```](./peers_status.md): Display the status of a peer by its id. \ No newline at end of file diff --git a/docs/cli/peers_add.md b/docs/cli/peers_add.md index 35e5ece450..5bc4ed1448 100644 --- a/docs/cli/peers_add.md +++ b/docs/cli/peers_add.md @@ -1,8 +1,9 @@ - # Peers add The ```peers add ``` command joins the local client to another remote peer. -## Arguments +## Options + +- ```address```: Address of the grpc endpoint -- ```trusted```: Whether the peer is added as a trusted peer. +- ```trusted```: Add the peer as a trusted \ No newline at end of file diff --git a/docs/cli/peers_list.md b/docs/cli/peers_list.md index cb1ef2f599..41f398b764 100644 --- a/docs/cli/peers_list.md +++ b/docs/cli/peers_list.md @@ -1,4 +1,7 @@ - -# Peers list +# Peers add The ```peers list``` command lists the connected peers. + +## Options + +- ```address```: Address of the grpc endpoint \ No newline at end of file diff --git a/docs/cli/peers_remove.md b/docs/cli/peers_remove.md index e2fa0a71df..2cac1e7656 100644 --- a/docs/cli/peers_remove.md +++ b/docs/cli/peers_remove.md @@ -1,4 +1,9 @@ - # Peers remove The ```peers remove ``` command disconnects the local client from a connected peer if exists. + +## Options + +- ```address```: Address of the grpc endpoint + +- ```trusted```: Add the peer as a trusted \ No newline at end of file diff --git a/docs/cli/peers_status.md b/docs/cli/peers_status.md index 56343c8d6b..65a0fe9d8f 100644 --- a/docs/cli/peers_status.md +++ b/docs/cli/peers_status.md @@ -1,4 +1,7 @@ - # Peers status The ```peers status ``` command displays the status of a peer by its id. + +## Options + +- ```address```: Address of the grpc endpoint \ No newline at end of file diff --git a/docs/cli/server.md b/docs/cli/server.md index 5a3e7e1052..ba6f3389c5 100644 --- a/docs/cli/server.md +++ b/docs/cli/server.md @@ -1,133 +1,112 @@ - # Server The ```bor server``` command runs the Bor client. -## General Options - -- ```chain```: Name of the chain to sync (mainnet or mumbai). - -- ```log-level```: Set log level for the server (info, warn, debug, trace). - -- ```datadir```: Path of the data directory to store information (defaults to $HOME). +## Options -- ```config```: List of files that contain the configuration. +- ```chain```: Name of the chain to sync -- ```syncmode```: Blockchain sync mode ("fast", "full", "snap" or "light"). +- ```name```: Name/Identity of the node -- ```gcmode```: Blockchain garbage collection mode ("full", "archive"). +- ```log-level```: Set log level for the server -- ```whitelist```: Comma separated block number-to-hash mappings to enforce (=). +- ```datadir```: Path of the data directory to store information -- ```snapshot```: Enables snapshot-database mode (default = enable). +- ```config```: File for the config file -- ```bor.heimdall```: URL of Heimdall service. +- ```syncmode```: Blockchain sync mode ("fast", "full", or "snap") -- ```bor.withoutheimdall```: Run without Heimdall service (for testing purpose). +- ```gcmode```: Blockchain garbage collection mode ("full", "archive") -- ```ethstats```: Reporting URL of a ethstats service (nodename:secret@host:port). +- ```whitelist```: Comma separated block number-to-hash mappings to enforce (=) -- ```gpo.blocks```: Number of recent blocks to check for gas prices. +- ```no-snapshot```: Disables the snapshot-database mode (default = false) -- ```gpo.percentile```: Suggested gas price is the given percentile of a set of recent transaction gas prices. +- ```bor.heimdall```: URL of Heimdall service -- ```gpo.maxprice```: Maximum gas price will be recommended by gpo. +- ```bor.withoutheimdall```: Run without Heimdall service (for testing purpose) -- ```gpo.ignoreprice```: Gas price below which gpo will ignore transactions. - -- ```grpc.addr```: Address and port to bind the GRPC server. - -### Transaction Pool Options +- ```ethstats```: Reporting URL of a ethstats service (nodename:secret@host:port) -- ```txpool.locals```: Comma separated accounts to treat as locals (no flush, priority inclusion). +- ```gpo.blocks```: Number of recent blocks to check for gas prices -- ```txpool.nolocals```: Disables price exemptions for locally submitted transactions +- ```gpo.percentile```: Suggested gas price is the given percentile of a set of recent transaction gas prices -- ```txpool.journal```: Disk journal for local transaction to survive node restarts +- ```gpo.maxprice```: Maximum gas price will be recommended by gpo -- ```txpool.rejournal```: Time interval to regenerate the local transaction journal +- ```gpo.ignoreprice```: Gas price below which gpo will ignore transactions -- ```txpool.pricelimit```: Minimum gas price limit to enforce for acceptance into the pool +- ```grpc.addr```: Address and port to bind the GRPC server -- ```txpool.pricebump```: Price bump percentage to replace an already existing transaction +- ```dev```: Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled -- ```txpool.accountslots```: Minimum number of executable transaction slots guaranteed per account +- ```dev.period```: Block period to use in developer mode (0 = mine only if transaction pending) -- ```txpool.globalslots```: Maximum number of executable transaction slots for all accounts - -- ```txpool.accountqueue```: Maximum number of non-executable transaction slots permitted per account - -- ```txpool.globalqueue```: Maximum number of non-executable transaction slots for all accounts - -- ```txpool.lifetime```: Maximum amount of time non-executable transaction are queued - -### Sealer Options - -- ```mine```: Enable sealing. +### Account Management Options -- ```miner.etherbase```: Public address for block mining rewards (default = first account) +- ```unlock```: Comma separated list of accounts to unlock -- ```miner.extradata```: Block extra data set by the miner (default = client version). +- ```password```: Password file to use for non-interactive password input -- ```miner.gaslimit```: Target gas ceiling for mined blocks. +- ```allow-insecure-unlock```: Allow insecure account unlocking when account-related RPCs are exposed by http -- ```miner.gasprice```: Minimum gas price for mining a transaction. +- ```lightkdf```: Reduce key-derivation RAM & CPU usage at some expense of KDF strength ### Cache Options -- ```cache```: Megabytes of memory allocated to internal caching (default = 4096 mainnet full node). +- ```cache```: Megabytes of memory allocated to internal caching (default = 4096 mainnet full node) -- ```cache.database```: Percentage of cache memory allowance to use for database io. +- ```cache.database```: Percentage of cache memory allowance to use for database io -- ```cache.trie```: Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode). +- ```cache.trie```: Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode) -- ```cache.trie.journal```: Disk journal directory for trie cache to survive node restarts. +- ```cache.trie.journal```: Disk journal directory for trie cache to survive node restarts -- ```cache.trie.rejournal```: Time interval to regenerate the trie cache journal. +- ```cache.trie.rejournal```: Time interval to regenerate the trie cache journal -- ```cache.gc```: Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode). +- ```cache.gc```: Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode) -- ```cache.snapshot```: Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode). +- ```cache.snapshot```: Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode) -- ```cache.noprefetch```: Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data). +- ```cache.noprefetch```: Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data) -- ```cache.preimages```: Enable recording the SHA3/keccak preimages of trie keys. +- ```cache.preimages```: Enable recording the SHA3/keccak preimages of trie keys -- ```txlookuplimit```: Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain). +- ```txlookuplimit```: Number of recent blocks to maintain transactions index for (default = about one year, 0 = entire chain) ### JsonRPC Options -- ```rpc.gascap```: Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite). +- ```rpc.gascap```: Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite) -- ```rpc.txfeecap```: Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap). +- ```rpc.txfeecap```: Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap) -- ```ipcdisable```: Disable the IPC-RPC server. +- ```ipcdisable```: Disable the IPC-RPC server -- ```ipcpath```: Filename for IPC socket/pipe within the datadir (explicit paths escape it). +- ```ipcpath```: Filename for IPC socket/pipe within the datadir (explicit paths escape it) -- ```jsonrpc.corsdomain```: Comma separated list of domains from which to accept cross. +- ```jsonrpc.corsdomain```: Comma separated list of domains from which to accept cross origin requests (browser enforced) - ```jsonrpc.vhosts```: Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. -- ```http```: Enable the HTTP-RPC server. +- ```http```: Enable the HTTP-RPC server + +- ```http.addr```: HTTP-RPC server listening interface + +- ```http.port```: HTTP-RPC server listening port -- ```http.addr```: HTTP-RPC server listening interface. - -- ```http.port```: HTTP-RPC server listening port. - - ```http.rpcprefix```: HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths. -- ```http.modules```: API's offered over the HTTP-RPC interface. +- ```http.modules```: API's offered over the HTTP-RPC interface -- ```ws```: Enable the WS-RPC server. +- ```ws```: Enable the WS-RPC server -- ```ws.addr```: WS-RPC server listening interface. +- ```ws.addr```: WS-RPC server listening interface -- ```ws.port```: WS-RPC server listening port. +- ```ws.port```: WS-RPC server listening port - ```ws.rpcprefix```: HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths. -- ```ws.modules```: API's offered over the WS-RPC interface. +- ```ws.modules```: API's offered over the WS-RPC interface - ```graphql```: Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well. @@ -139,56 +118,78 @@ The ```bor server``` command runs the Bor client. - ```bootnodes```: Comma separated enode URLs for P2P discovery bootstrap -- ```maxpeers```: "Maximum number of network peers (network disabled if set to 0) +- ```maxpeers```: Maximum number of network peers (network disabled if set to 0) - ```maxpendpeers```: Maximum number of pending connection attempts (defaults used if set to 0) -- ```nat```: "NAT port mapping mechanism (any|none|upnp|pmp|extip:) +- ```nat```: NAT port mapping mechanism (any|none|upnp|pmp|extip:) -- ```nodiscover```: "Disables the peer discovery mechanism (manual peer addition) +- ```nodiscover```: Disables the peer discovery mechanism (manual peer addition) -- ```v5disc```: "Enables the experimental RLPx V5 (Topic Discovery) mechanism +- ```v5disc```: Enables the experimental RLPx V5 (Topic Discovery) mechanism + +### Sealer Options + +- ```mine```: Enable mining + +- ```miner.etherbase```: Public address for block mining rewards (default = first account) + +- ```miner.extradata```: Block extra data set by the miner (default = client version) + +- ```miner.gaslimit```: Target gas ceiling for mined blocks + +- ```miner.gasprice```: Minimum gas price for mining a transaction ### Telemetry Options -- ```metrics```: Enable metrics collection and reporting. +- ```metrics```: Enable metrics collection and reporting -- ```metrics.expensive```: Enable expensive metrics collection and reporting. +- ```metrics.expensive```: Enable expensive metrics collection and reporting -- ```metrics.influxdb```: Enable metrics export/push to an external InfluxDB database (v1). +- ```metrics.influxdb```: Enable metrics export/push to an external InfluxDB database (v1) -- ```metrics.influxdb.endpoint```: InfluxDB API endpoint to report metrics to. +- ```metrics.influxdb.endpoint```: InfluxDB API endpoint to report metrics to -- ```metrics.influxdb.database```: InfluxDB database name to push reported metrics to. +- ```metrics.influxdb.database```: InfluxDB database name to push reported metrics to -- ```metrics.influxdb.username```: Username to authorize access to the database. +- ```metrics.influxdb.username```: Username to authorize access to the database -- ```metrics.influxdb.password```: Password to authorize access to the database. +- ```metrics.influxdb.password```: Password to authorize access to the database -- ```metrics.influxdb.tags```: Comma-separated InfluxDB tags (key/values) attached to all measurements. +- ```metrics.influxdb.tags```: Comma-separated InfluxDB tags (key/values) attached to all measurements -- ```metrics.influxdbv2```: Enable metrics export/push to an external InfluxDB v2 database. +- ```metrics.prometheus-addr```: Address for Prometheus Server -- ```metrics.influxdb.token```: Token to authorize access to the database (v2 only). +- ```metrics.opencollector-endpoint```: OpenCollector Endpoint (host:port) -- ```metrics.influxdb.bucket```: InfluxDB bucket name to push reported metrics to (v2 only). +- ```metrics.influxdbv2```: Enable metrics export/push to an external InfluxDB v2 database -- ```metrics.influxdb.organization```: InfluxDB organization name (v2 only). +- ```metrics.influxdb.token```: Token to authorize access to the database (v2 only) -### Account Management Options +- ```metrics.influxdb.bucket```: InfluxDB bucket name to push reported metrics to (v2 only) + +- ```metrics.influxdb.organization```: InfluxDB organization name (v2 only) + +### Transaction Pool Options + +- ```txpool.locals```: Comma separated accounts to treat as locals (no flush, priority inclusion) -- ```unlock```: "Comma separated list of accounts to unlock. +- ```txpool.nolocals```: Disables price exemptions for locally submitted transactions -- ```password```: Password file to use for non-interactive password input. +- ```txpool.journal```: Disk journal for local transaction to survive node restarts -- ```allow-insecure-unlock```: Allow insecure account unlocking when account-related RPCs are exposed by http. +- ```txpool.rejournal```: Time interval to regenerate the local transaction journal -- ```lightkdf```: Reduce key-derivation RAM & CPU usage at some expense of KDF strength. +- ```txpool.pricelimit```: Minimum gas price limit to enforce for acceptance into the pool -## Usage +- ```txpool.pricebump```: Price bump percentage to replace an already existing transaction -Use multiple files to configure the client: +- ```txpool.accountslots```: Minimum number of executable transaction slots guaranteed per account -``` -$ bor server --config ./legacy-config.toml --config ./config2.hcl -``` +- ```txpool.globalslots```: Maximum number of executable transaction slots for all accounts + +- ```txpool.accountqueue```: Maximum number of non-executable transaction slots permitted per account + +- ```txpool.globalqueue```: Maximum number of non-executable transaction slots for all accounts + +- ```txpool.lifetime```: Maximum amount of time non-executable transaction are queued diff --git a/docs/cli/status.md b/docs/cli/status.md index fb7bddb182..9fa8e25905 100644 --- a/docs/cli/status.md +++ b/docs/cli/status.md @@ -1,4 +1,3 @@ - # Status -The ```status``` command outputs the status of the client. +The ```status``` command outputs the status of the client. \ No newline at end of file diff --git a/docs/cli/version.md b/docs/cli/version.md index 156bdf607c..87e7cf44a8 100644 --- a/docs/cli/version.md +++ b/docs/cli/version.md @@ -1,4 +1,3 @@ - # Version The ```bor version``` command outputs the version of the binary. @@ -8,4 +7,4 @@ The ```bor version``` command outputs the version of the binary. ``` $ bor version 0.2.9-stable -``` +``` \ No newline at end of file diff --git a/internal/cli/account.go b/internal/cli/account.go index b8661821d0..7ce6c09b63 100644 --- a/internal/cli/account.go +++ b/internal/cli/account.go @@ -1,11 +1,27 @@ package cli -import "github.com/mitchellh/cli" +import ( + "strings" + + "github.com/mitchellh/cli" +) type Account struct { UI cli.Ui } +// MarkDown implements cli.MarkDown interface +func (a *Account) MarkDown() string { + items := []string{ + "# Account", + "The ```account``` command groups actions to interact with accounts:", + "- [```account new```](./account_new.md): Create a new account in the Bor client.", + "- [```account list```](./account_list.md): List the wallets in the Bor client.", + "- [```account import```](./account_import.md): Import an account to the Bor client.", + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (a *Account) Help() string { return `Usage: bor account diff --git a/internal/cli/account_import.go b/internal/cli/account_import.go index 8c9ff40e58..d7ab14601a 100644 --- a/internal/cli/account_import.go +++ b/internal/cli/account_import.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "strings" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/crypto" @@ -12,6 +13,16 @@ type AccountImportCommand struct { *Meta } +// MarkDown implements cli.MarkDown interface +func (a *AccountImportCommand) MarkDown() string { + items := []string{ + "# Account import", + "The ```account import``` command imports an account in Json format to the Bor data directory.", + a.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (a *AccountImportCommand) Help() string { return `Usage: bor account import diff --git a/internal/cli/account_list.go b/internal/cli/account_list.go index 360d41b558..db77158b8e 100644 --- a/internal/cli/account_list.go +++ b/internal/cli/account_list.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "strings" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/internal/cli/flagset" @@ -11,6 +12,16 @@ type AccountListCommand struct { *Meta } +// MarkDown implements cli.MarkDown interface +func (a *AccountListCommand) MarkDown() string { + items := []string{ + "# Account list", + "The `account list` command lists all the accounts in the Bor data directory.", + a.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (a *AccountListCommand) Help() string { return `Usage: bor account list diff --git a/internal/cli/account_new.go b/internal/cli/account_new.go index 3334384cb0..f6591fc53b 100644 --- a/internal/cli/account_new.go +++ b/internal/cli/account_new.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "strings" "github.com/ethereum/go-ethereum/internal/cli/flagset" ) @@ -10,6 +11,16 @@ type AccountNewCommand struct { *Meta } +// MarkDown implements cli.MarkDown interface +func (a *AccountNewCommand) MarkDown() string { + items := []string{ + "# Account new", + "The `account new` command creates a new local account file on the Bor data directory. Bor should not be running to execute this command.", + a.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (a *AccountNewCommand) Help() string { return `Usage: bor account new diff --git a/internal/cli/attach.go b/internal/cli/attach.go index eec8a28ed3..df1c76ff3d 100644 --- a/internal/cli/attach.go +++ b/internal/cli/attach.go @@ -26,6 +26,16 @@ type AttachCommand struct { JSpathFlag string } +// MarkDown implements cli.MarkDown interface +func (c *AttachCommand) MarkDown() string { + items := []string{ + "# Attach", + "Connect to remote Bor IPC console.", + c.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (c *AttachCommand) Help() string { return `Usage: bor attach diff --git a/internal/cli/bor_fingerprint.go b/internal/cli/bor_fingerprint.go index 5c5a8f47bd..e9f4e70398 100644 --- a/internal/cli/bor_fingerprint.go +++ b/internal/cli/bor_fingerprint.go @@ -4,6 +4,7 @@ import ( "fmt" "math" "os/exec" + "strings" "github.com/ethereum/go-ethereum/params" "github.com/mitchellh/cli" @@ -18,6 +19,15 @@ type FingerprintCommand struct { UI cli.Ui } +// MarkDown implements cli.MarkDown interface +func (c *FingerprintCommand) MarkDown() string { + items := []string{ + "# Fingerprint", + "Display the system fingerprint", + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (c *FingerprintCommand) Help() string { return `Usage: bor fingerprint diff --git a/internal/cli/chain.go b/internal/cli/chain.go index b43f22f999..896ce42cc4 100644 --- a/internal/cli/chain.go +++ b/internal/cli/chain.go @@ -1,6 +1,8 @@ package cli import ( + "strings" + "github.com/mitchellh/cli" ) @@ -9,6 +11,17 @@ type ChainCommand struct { UI cli.Ui } +// MarkDown implements cli.MarkDown interface +func (c *ChainCommand) MarkDown() string { + items := []string{ + "# Chain", + "The ```chain``` command groups actions to interact with the blockchain in the client:", + "- [```chain sethead```](./chain_sethead.md): Set the current chain to a certain block.", + "- [```chain watch```](./chain_watch.md): Watch the chainHead, reorg and fork events in real-time.", + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (c *ChainCommand) Help() string { return `Usage: bor chain diff --git a/internal/cli/chain_sethead.go b/internal/cli/chain_sethead.go index 127ac38f15..4d34479e0b 100644 --- a/internal/cli/chain_sethead.go +++ b/internal/cli/chain_sethead.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "strconv" + "strings" "github.com/ethereum/go-ethereum/internal/cli/flagset" "github.com/ethereum/go-ethereum/internal/cli/server/proto" @@ -16,6 +17,18 @@ type ChainSetHeadCommand struct { yes bool } +// MarkDown implements cli.MarkDown interface +func (a *ChainSetHeadCommand) MarkDown() string { + items := []string{ + "# Chain sethead", + "The ```chain sethead ``` command sets the current chain to a certain block.", + "## Arguments", + "- ```number```: The block number to roll back.", + a.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (c *ChainSetHeadCommand) Help() string { return `Usage: bor chain sethead [--yes] diff --git a/internal/cli/chain_watch.go b/internal/cli/chain_watch.go index 9469c1df00..72bd21b85d 100644 --- a/internal/cli/chain_watch.go +++ b/internal/cli/chain_watch.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "os/signal" + "strings" "syscall" "github.com/ethereum/go-ethereum/core" @@ -17,6 +18,15 @@ type ChainWatchCommand struct { *Meta2 } +// MarkDown implements cli.MarkDown interface +func (c *ChainWatchCommand) MarkDown() string { + items := []string{ + "# Chain watch", + "The ```chain watch``` command is used to view the chainHead, reorg and fork events in real-time.", + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (c *ChainWatchCommand) Help() string { return `Usage: bor chain watch diff --git a/internal/cli/command.go b/internal/cli/command.go index 9e373a65cd..4cb089b9ff 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -14,13 +14,29 @@ import ( "google.golang.org/grpc" ) +type MarkDownCommand interface { + MarkDown + cli.Command +} + +type MarkDownCommandFactory func() (MarkDownCommand, error) + func Run(args []string) int { - commands := commands() + commands := Commands() + + mappedCommands := make(map[string]cli.CommandFactory) + + for k, v := range commands { + mappedCommands[k] = func() (cli.Command, error) { + cmd, err := v() + return cmd.(cli.Command), err + } + } cli := &cli.CLI{ Name: "bor", Args: args, - Commands: commands, + Commands: mappedCommands, } exitCode, err := cli.Run() @@ -31,7 +47,7 @@ func Run(args []string) int { return exitCode } -func commands() map[string]cli.CommandFactory { +func Commands() map[string]MarkDownCommandFactory { ui := &cli.BasicUi{ Reader: os.Stdin, Writer: os.Stdout, @@ -44,93 +60,93 @@ func commands() map[string]cli.CommandFactory { meta := &Meta{ UI: ui, } - return map[string]cli.CommandFactory{ - "server": func() (cli.Command, error) { + return map[string]MarkDownCommandFactory{ + "server": func() (MarkDownCommand, error) { return &server.Command{ UI: ui, }, nil }, - "version": func() (cli.Command, error) { + "version": func() (MarkDownCommand, error) { return &VersionCommand{ UI: ui, }, nil }, - "debug": func() (cli.Command, error) { + "debug": func() (MarkDownCommand, error) { return &DebugCommand{ Meta2: meta2, }, nil }, - "chain": func() (cli.Command, error) { + "chain": func() (MarkDownCommand, error) { return &ChainCommand{ UI: ui, }, nil }, - "chain watch": func() (cli.Command, error) { + "chain watch": func() (MarkDownCommand, error) { return &ChainWatchCommand{ Meta2: meta2, }, nil }, - "chain sethead": func() (cli.Command, error) { + "chain sethead": func() (MarkDownCommand, error) { return &ChainSetHeadCommand{ Meta2: meta2, }, nil }, - "account": func() (cli.Command, error) { + "account": func() (MarkDownCommand, error) { return &Account{ UI: ui, }, nil }, - "account new": func() (cli.Command, error) { + "account new": func() (MarkDownCommand, error) { return &AccountNewCommand{ Meta: meta, }, nil }, - "account import": func() (cli.Command, error) { + "account import": func() (MarkDownCommand, error) { return &AccountImportCommand{ Meta: meta, }, nil }, - "account list": func() (cli.Command, error) { + "account list": func() (MarkDownCommand, error) { return &AccountListCommand{ Meta: meta, }, nil }, - "peers": func() (cli.Command, error) { + "peers": func() (MarkDownCommand, error) { return &PeersCommand{ UI: ui, }, nil }, - "peers add": func() (cli.Command, error) { + "peers add": func() (MarkDownCommand, error) { return &PeersAddCommand{ Meta2: meta2, }, nil }, - "peers remove": func() (cli.Command, error) { + "peers remove": func() (MarkDownCommand, error) { return &PeersRemoveCommand{ Meta2: meta2, }, nil }, - "peers list": func() (cli.Command, error) { + "peers list": func() (MarkDownCommand, error) { return &PeersListCommand{ Meta2: meta2, }, nil }, - "peers status": func() (cli.Command, error) { + "peers status": func() (MarkDownCommand, error) { return &PeersStatusCommand{ Meta2: meta2, }, nil }, - "status": func() (cli.Command, error) { + "status": func() (MarkDownCommand, error) { return &StatusCommand{ Meta2: meta2, }, nil }, - "fingerprint": func() (cli.Command, error) { + "fingerprint": func() (MarkDownCommand, error) { return &FingerprintCommand{ UI: ui, }, nil }, - "attach": func() (cli.Command, error) { + "attach": func() (MarkDownCommand, error) { return &AttachCommand{ UI: ui, Meta: meta, diff --git a/internal/cli/debug.go b/internal/cli/debug.go index a6b6ff7973..66e936995c 100644 --- a/internal/cli/debug.go +++ b/internal/cli/debug.go @@ -31,6 +31,33 @@ type DebugCommand struct { output string } +// MarkDown implements cli.MarkDown interface +func (d *DebugCommand) MarkDown() string { + examples := []string{ + "## Examples", + "By default it creates a tar.gz file with the output:", + CodeBlock([]string{ + "$ bor debug", + "Starting debugger...\n", + "Created debug archive: bor-debug-2021-10-26-073819Z.tar.gz", + }), + "Send the output to a specific directory:", + CodeBlock([]string{ + "$ bor debug --output data", + "Starting debugger...\n", + "Created debug directory: data/bor-debug-2021-10-26-075437Z", + }), + } + + items := []string{ + "# Debug", + "The ```bor debug``` command takes a debug dump of the running client.", + d.Flags().MarkDown(), + } + items = append(items, examples...) + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (d *DebugCommand) Help() string { return `Usage: bor debug diff --git a/internal/cli/flagset/flagset.go b/internal/cli/flagset/flagset.go index 4388dd03fc..e04f452c1e 100644 --- a/internal/cli/flagset/flagset.go +++ b/internal/cli/flagset/flagset.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "math/big" + "sort" "strings" "time" ) @@ -24,6 +25,7 @@ func NewFlagSet(name string) *Flagset { type FlagVar struct { Name string Usage string + Group string } func (f *Flagset) addFlag(fl *FlagVar) { @@ -39,6 +41,40 @@ func (f *Flagset) Help() string { return str + strings.Join(items, "\n\n") } +// MarkDown implements cli.MarkDown interface +func (f *Flagset) MarkDown() string { + if len(f.flags) == 0 { + return "" + } + + groups := make(map[string][]*FlagVar) + + for _, item := range f.flags { + groups[item.Group] = append(groups[item.Group], item) + } + + keys := make([]string, len(groups)) + i := 0 + for k := range groups { + keys[i] = k + i++ + } + sort.Strings(keys) + + items := []string{} + for _, k := range keys { + if k == "" { + items = append(items, fmt.Sprintf("## Options")) + } else { + items = append(items, fmt.Sprintf("### %s Options", k)) + } + for _, item := range groups[k] { + items = append(items, fmt.Sprintf("- ```%s```: %s", item.Name, item.Usage)) + } + } + return strings.Join(items, "\n\n") +} + func (f *Flagset) Parse(args []string) error { return f.set.Parse(args) } @@ -52,12 +88,14 @@ type BoolFlag struct { Usage string Default bool Value *bool + Group string } func (f *Flagset) BoolFlag(b *BoolFlag) { f.addFlag(&FlagVar{ Name: b.Name, Usage: b.Usage, + Group: b.Group, }) f.set.BoolVar(b.Value, b.Name, b.Default, b.Usage) } @@ -67,12 +105,14 @@ type StringFlag struct { Usage string Default string Value *string + Group string } func (f *Flagset) StringFlag(b *StringFlag) { f.addFlag(&FlagVar{ Name: b.Name, Usage: b.Usage, + Group: b.Group, }) f.set.StringVar(b.Value, b.Name, b.Default, b.Usage) } @@ -82,12 +122,14 @@ type IntFlag struct { Usage string Value *int Default int + Group string } func (f *Flagset) IntFlag(i *IntFlag) { f.addFlag(&FlagVar{ Name: i.Name, Usage: i.Usage, + Group: i.Group, }) f.set.IntVar(i.Value, i.Name, i.Default, i.Usage) } @@ -97,12 +139,14 @@ type Uint64Flag struct { Usage string Value *uint64 Default uint64 + Group string } func (f *Flagset) Uint64Flag(i *Uint64Flag) { f.addFlag(&FlagVar{ Name: i.Name, Usage: i.Usage, + Group: i.Group, }) f.set.Uint64Var(i.Value, i.Name, i.Default, i.Usage) } @@ -111,6 +155,7 @@ type BigIntFlag struct { Name string Usage string Value *big.Int + Group string } func (b *BigIntFlag) String() string { @@ -140,6 +185,7 @@ func (f *Flagset) BigIntFlag(b *BigIntFlag) { f.addFlag(&FlagVar{ Name: b.Name, Usage: b.Usage, + Group: b.Group, }) f.set.Var(b, b.Name, b.Usage) } @@ -148,6 +194,7 @@ type SliceStringFlag struct { Name string Usage string Value *[]string + Group string } func (i *SliceStringFlag) String() string { @@ -166,6 +213,7 @@ func (f *Flagset) SliceStringFlag(s *SliceStringFlag) { f.addFlag(&FlagVar{ Name: s.Name, Usage: s.Usage, + Group: s.Group, }) f.set.Var(s, s.Name, s.Usage) } @@ -175,12 +223,14 @@ type DurationFlag struct { Usage string Value *time.Duration Default time.Duration + Group string } func (f *Flagset) DurationFlag(d *DurationFlag) { f.addFlag(&FlagVar{ Name: d.Name, Usage: d.Usage, + Group: d.Group, }) f.set.DurationVar(d.Value, d.Name, d.Default, "") } @@ -189,6 +239,7 @@ type MapStringFlag struct { Name string Usage string Value *map[string]string + Group string } func (m *MapStringFlag) String() string { @@ -222,6 +273,7 @@ func (f *Flagset) MapStringFlag(m *MapStringFlag) { f.addFlag(&FlagVar{ Name: m.Name, Usage: m.Usage, + Group: m.Group, }) f.set.Var(m, m.Name, m.Usage) } @@ -231,12 +283,14 @@ type Float64Flag struct { Usage string Value *float64 Default float64 + Group string } func (f *Flagset) Float64Flag(i *Float64Flag) { f.addFlag(&FlagVar{ Name: i.Name, Usage: i.Usage, + Group: i.Group, }) f.set.Float64Var(i.Value, i.Name, i.Default, "") } diff --git a/internal/cli/markdown.go b/internal/cli/markdown.go new file mode 100644 index 0000000000..652c98e56b --- /dev/null +++ b/internal/cli/markdown.go @@ -0,0 +1,14 @@ +package cli + +import ( + "strings" +) + +type MarkDown interface { + MarkDown() string +} + +// Create a Markdown code block from a slice of string, where each string is a line of code +func CodeBlock(lines []string) string { + return "```\n" + strings.Join(lines, "\n") + "\n```" +} diff --git a/internal/cli/markdown_test.go b/internal/cli/markdown_test.go new file mode 100644 index 0000000000..13a5c4ece3 --- /dev/null +++ b/internal/cli/markdown_test.go @@ -0,0 +1,19 @@ +package cli + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCodeBlock(t *testing.T) { + assert := assert.New(t) + + lines := []string{ + "abc", + "bcd", + } + + expected := "```\n" + "abc\n" + "bcd\n" + "```" + assert.Equal(expected, CodeBlock(lines)) +} diff --git a/internal/cli/peers.go b/internal/cli/peers.go index b591366222..ee70a747b8 100644 --- a/internal/cli/peers.go +++ b/internal/cli/peers.go @@ -1,6 +1,8 @@ package cli import ( + "strings" + "github.com/mitchellh/cli" ) @@ -9,6 +11,19 @@ type PeersCommand struct { UI cli.Ui } +// MarkDown implements cli.MarkDown interface +func (a *PeersCommand) MarkDown() string { + items := []string{ + "# Peers", + "The ```peers``` command groups actions to interact with peers:", + "- [```peers add```](./peers_add.md): Joins the local client to another remote peer.", + "- [```peers list```](./peers_list.md): Lists the connected peers to the Bor client.", + "- [```peers remove```](./peers_remove.md): Disconnects the local client from a connected peer if exists.", + "- [```peers status```](./peers_status.md): Display the status of a peer by its id.", + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (c *PeersCommand) Help() string { return `Usage: bor peers diff --git a/internal/cli/peers_add.go b/internal/cli/peers_add.go index 2b2fe127e0..ae84f4e0c1 100644 --- a/internal/cli/peers_add.go +++ b/internal/cli/peers_add.go @@ -2,6 +2,7 @@ package cli import ( "context" + "strings" "github.com/ethereum/go-ethereum/internal/cli/flagset" "github.com/ethereum/go-ethereum/internal/cli/server/proto" @@ -14,6 +15,16 @@ type PeersAddCommand struct { trusted bool } +// MarkDown implements cli.MarkDown interface +func (p *PeersAddCommand) MarkDown() string { + items := []string{ + "# Peers add", + "The ```peers add ``` command joins the local client to another remote peer.", + p.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (p *PeersAddCommand) Help() string { return `Usage: bor peers add diff --git a/internal/cli/peers_list.go b/internal/cli/peers_list.go index a42e0011a5..56dfdc317d 100644 --- a/internal/cli/peers_list.go +++ b/internal/cli/peers_list.go @@ -14,6 +14,16 @@ type PeersListCommand struct { *Meta2 } +// MarkDown implements cli.MarkDown interface +func (p *PeersListCommand) MarkDown() string { + items := []string{ + "# Peers add", + "The ```peers list``` command lists the connected peers.", + p.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (p *PeersListCommand) Help() string { return `Usage: bor peers list diff --git a/internal/cli/peers_remove.go b/internal/cli/peers_remove.go index 979f139251..5cd3796e3c 100644 --- a/internal/cli/peers_remove.go +++ b/internal/cli/peers_remove.go @@ -2,6 +2,7 @@ package cli import ( "context" + "strings" "github.com/ethereum/go-ethereum/internal/cli/flagset" "github.com/ethereum/go-ethereum/internal/cli/server/proto" @@ -14,6 +15,16 @@ type PeersRemoveCommand struct { trusted bool } +// MarkDown implements cli.MarkDown interface +func (p *PeersRemoveCommand) MarkDown() string { + items := []string{ + "# Peers remove", + "The ```peers remove ``` command disconnects the local client from a connected peer if exists.", + p.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (p *PeersRemoveCommand) Help() string { return `Usage: bor peers remove diff --git a/internal/cli/peers_status.go b/internal/cli/peers_status.go index c1da2b2647..bb8d385291 100644 --- a/internal/cli/peers_status.go +++ b/internal/cli/peers_status.go @@ -14,6 +14,16 @@ type PeersStatusCommand struct { *Meta2 } +// MarkDown implements cli.MarkDown interface +func (p *PeersStatusCommand) MarkDown() string { + items := []string{ + "# Peers status", + "The ```peers status ``` command displays the status of a peer by its id.", + p.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (p *PeersStatusCommand) Help() string { return `Usage: bor peers status diff --git a/internal/cli/server/command.go b/internal/cli/server/command.go index 4b2374dc42..01ce44f5ee 100644 --- a/internal/cli/server/command.go +++ b/internal/cli/server/command.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "os/signal" + "strings" "syscall" "github.com/ethereum/go-ethereum/log" @@ -25,6 +26,16 @@ type Command struct { srv *Server } +// MarkDown implements cli.MarkDown interface +func (c *Command) MarkDown() string { + items := []string{ + "# Server", + "The ```bor server``` command runs the Bor client.", + c.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (c *Command) Help() string { return `Usage: bor [options] diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index edc7276a8b..ce93e8c071 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -36,7 +36,7 @@ func (c *Command) Flags() *flagset.Flagset { }) f.StringFlag(&flagset.StringFlag{ Name: "syncmode", - Usage: `Blockchain sync mode ("fast", "full", "snap" or "light")`, + Usage: `Blockchain sync mode ("fast", "full", or "snap")`, Value: &c.cliConfig.SyncMode, }) f.StringFlag(&flagset.StringFlag{ @@ -72,56 +72,67 @@ func (c *Command) Flags() *flagset.Flagset { Name: "txpool.locals", Usage: "Comma separated accounts to treat as locals (no flush, priority inclusion)", Value: &c.cliConfig.TxPool.Locals, + Group: "Transaction Pool", }) f.BoolFlag(&flagset.BoolFlag{ Name: "txpool.nolocals", Usage: "Disables price exemptions for locally submitted transactions", Value: &c.cliConfig.TxPool.NoLocals, + Group: "Transaction Pool", }) f.StringFlag(&flagset.StringFlag{ Name: "txpool.journal", Usage: "Disk journal for local transaction to survive node restarts", Value: &c.cliConfig.TxPool.Journal, + Group: "Transaction Pool", }) f.DurationFlag(&flagset.DurationFlag{ Name: "txpool.rejournal", Usage: "Time interval to regenerate the local transaction journal", Value: &c.cliConfig.TxPool.Rejournal, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.pricelimit", Usage: "Minimum gas price limit to enforce for acceptance into the pool", Value: &c.cliConfig.TxPool.PriceLimit, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.pricebump", Usage: "Price bump percentage to replace an already existing transaction", Value: &c.cliConfig.TxPool.PriceBump, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.accountslots", Usage: "Minimum number of executable transaction slots guaranteed per account", Value: &c.cliConfig.TxPool.AccountSlots, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.globalslots", Usage: "Maximum number of executable transaction slots for all accounts", Value: &c.cliConfig.TxPool.GlobalSlots, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.accountqueue", Usage: "Maximum number of non-executable transaction slots permitted per account", Value: &c.cliConfig.TxPool.AccountQueue, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.globalqueue", Usage: "Maximum number of non-executable transaction slots for all accounts", Value: &c.cliConfig.TxPool.GlobalQueue, + Group: "Transaction Pool", }) f.DurationFlag(&flagset.DurationFlag{ Name: "txpool.lifetime", Usage: "Maximum amount of time non-executable transaction are queued", Value: &c.cliConfig.TxPool.LifeTime, + Group: "Transaction Pool", }) // sealer options @@ -129,26 +140,31 @@ func (c *Command) Flags() *flagset.Flagset { Name: "mine", Usage: "Enable mining", Value: &c.cliConfig.Sealer.Enabled, + Group: "Sealer", }) f.StringFlag(&flagset.StringFlag{ Name: "miner.etherbase", Usage: "Public address for block mining rewards (default = first account)", Value: &c.cliConfig.Sealer.Etherbase, + Group: "Sealer", }) f.StringFlag(&flagset.StringFlag{ Name: "miner.extradata", Usage: "Block extra data set by the miner (default = client version)", Value: &c.cliConfig.Sealer.ExtraData, + Group: "Sealer", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "miner.gaslimit", Usage: "Target gas ceiling for mined blocks", Value: &c.cliConfig.Sealer.GasCeil, + Group: "Sealer", }) f.BigIntFlag(&flagset.BigIntFlag{ Name: "miner.gasprice", Usage: "Minimum gas price for mining a transaction", Value: c.cliConfig.Sealer.GasPrice, + Group: "Sealer", }) // ethstats @@ -185,51 +201,61 @@ func (c *Command) Flags() *flagset.Flagset { Name: "cache", Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node)", Value: &c.cliConfig.Cache.Cache, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache.database", Usage: "Percentage of cache memory allowance to use for database io", Value: &c.cliConfig.Cache.PercDatabase, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache.trie", Usage: "Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode)", Value: &c.cliConfig.Cache.PercTrie, + Group: "Cache", }) f.StringFlag(&flagset.StringFlag{ Name: "cache.trie.journal", Usage: "Disk journal directory for trie cache to survive node restarts", Value: &c.cliConfig.Cache.Journal, + Group: "Cache", }) f.DurationFlag(&flagset.DurationFlag{ Name: "cache.trie.rejournal", Usage: "Time interval to regenerate the trie cache journal", Value: &c.cliConfig.Cache.Rejournal, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache.gc", Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)", Value: &c.cliConfig.Cache.PercGc, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache.snapshot", Usage: "Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode)", Value: &c.cliConfig.Cache.PercSnapshot, + Group: "Cache", }) f.BoolFlag(&flagset.BoolFlag{ Name: "cache.noprefetch", Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)", Value: &c.cliConfig.Cache.NoPrefetch, + Group: "Cache", }) f.BoolFlag(&flagset.BoolFlag{ Name: "cache.preimages", Usage: "Enable recording the SHA3/keccak preimages of trie keys", Value: &c.cliConfig.Cache.Preimages, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txlookuplimit", Usage: "Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain)", Value: &c.cliConfig.Cache.TxLookupLimit, + Group: "Cache", }) // rpc options @@ -237,31 +263,37 @@ func (c *Command) Flags() *flagset.Flagset { Name: "rpc.gascap", Usage: "Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite)", Value: &c.cliConfig.JsonRPC.GasCap, + Group: "JsonRPC", }) f.Float64Flag(&flagset.Float64Flag{ Name: "rpc.txfeecap", Usage: "Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap)", Value: &c.cliConfig.JsonRPC.TxFeeCap, + Group: "JsonRPC", }) f.BoolFlag(&flagset.BoolFlag{ Name: "ipcdisable", Usage: "Disable the IPC-RPC server", Value: &c.cliConfig.JsonRPC.IPCDisable, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ Name: "ipcpath", Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", Value: &c.cliConfig.JsonRPC.IPCPath, + Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "jsonrpc.corsdomain", Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", Value: &c.cliConfig.JsonRPC.Cors, + Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "jsonrpc.vhosts", Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", Value: &c.cliConfig.JsonRPC.VHost, + Group: "JsonRPC", }) // http options @@ -269,26 +301,31 @@ func (c *Command) Flags() *flagset.Flagset { Name: "http", Usage: "Enable the HTTP-RPC server", Value: &c.cliConfig.JsonRPC.Http.Enabled, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ Name: "http.addr", Usage: "HTTP-RPC server listening interface", Value: &c.cliConfig.JsonRPC.Http.Host, + Group: "JsonRPC", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "http.port", Usage: "HTTP-RPC server listening port", Value: &c.cliConfig.JsonRPC.Http.Port, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ Name: "http.rpcprefix", Usage: "HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", Value: &c.cliConfig.JsonRPC.Http.Prefix, + Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "http.modules", Usage: "API's offered over the HTTP-RPC interface", Value: &c.cliConfig.JsonRPC.Http.Modules, + Group: "JsonRPC", }) // ws options @@ -296,26 +333,31 @@ func (c *Command) Flags() *flagset.Flagset { Name: "ws", Usage: "Enable the WS-RPC server", Value: &c.cliConfig.JsonRPC.Ws.Enabled, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ Name: "ws.addr", Usage: "WS-RPC server listening interface", Value: &c.cliConfig.JsonRPC.Ws.Host, + Group: "JsonRPC", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "ws.port", Usage: "WS-RPC server listening port", Value: &c.cliConfig.JsonRPC.Ws.Port, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ Name: "ws.rpcprefix", Usage: "HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", Value: &c.cliConfig.JsonRPC.Ws.Prefix, + Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "ws.modules", Usage: "API's offered over the WS-RPC interface", Value: &c.cliConfig.JsonRPC.Ws.Modules, + Group: "JsonRPC", }) // graphql options @@ -323,6 +365,7 @@ func (c *Command) Flags() *flagset.Flagset { Name: "graphql", Usage: "Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.", Value: &c.cliConfig.JsonRPC.Graphql.Enabled, + Group: "JsonRPC", }) // p2p options @@ -330,41 +373,49 @@ func (c *Command) Flags() *flagset.Flagset { Name: "bind", Usage: "Network binding address", Value: &c.cliConfig.P2P.Bind, + Group: "P2P", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "port", Usage: "Network listening port", Value: &c.cliConfig.P2P.Port, + Group: "P2P", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "bootnodes", Usage: "Comma separated enode URLs for P2P discovery bootstrap", Value: &c.cliConfig.P2P.Discovery.Bootnodes, + Group: "P2P", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "maxpeers", Usage: "Maximum number of network peers (network disabled if set to 0)", Value: &c.cliConfig.P2P.MaxPeers, + Group: "P2P", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "maxpendpeers", Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", Value: &c.cliConfig.P2P.MaxPendPeers, + Group: "P2P", }) f.StringFlag(&flagset.StringFlag{ Name: "nat", Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:)", Value: &c.cliConfig.P2P.NAT, + Group: "P2P", }) f.BoolFlag(&flagset.BoolFlag{ Name: "nodiscover", Usage: "Disables the peer discovery mechanism (manual peer addition)", Value: &c.cliConfig.P2P.NoDiscover, + Group: "P2P", }) f.BoolFlag(&flagset.BoolFlag{ Name: "v5disc", Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism", Value: &c.cliConfig.P2P.Discovery.V5Enabled, + Group: "P2P", }) // metrics @@ -372,72 +423,86 @@ func (c *Command) Flags() *flagset.Flagset { Name: "metrics", Usage: "Enable metrics collection and reporting", Value: &c.cliConfig.Telemetry.Enabled, + Group: "Telemetry", }) f.BoolFlag(&flagset.BoolFlag{ Name: "metrics.expensive", Usage: "Enable expensive metrics collection and reporting", Value: &c.cliConfig.Telemetry.Expensive, + Group: "Telemetry", }) f.BoolFlag(&flagset.BoolFlag{ Name: "metrics.influxdb", Usage: "Enable metrics export/push to an external InfluxDB database (v1)", Value: &c.cliConfig.Telemetry.InfluxDB.V1Enabled, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.endpoint", Usage: "InfluxDB API endpoint to report metrics to", Value: &c.cliConfig.Telemetry.InfluxDB.Endpoint, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.database", Usage: "InfluxDB database name to push reported metrics to", Value: &c.cliConfig.Telemetry.InfluxDB.Database, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.username", Usage: "Username to authorize access to the database", Value: &c.cliConfig.Telemetry.InfluxDB.Username, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.password", Usage: "Password to authorize access to the database", Value: &c.cliConfig.Telemetry.InfluxDB.Password, + Group: "Telemetry", }) f.MapStringFlag(&flagset.MapStringFlag{ Name: "metrics.influxdb.tags", Usage: "Comma-separated InfluxDB tags (key/values) attached to all measurements", Value: &c.cliConfig.Telemetry.InfluxDB.Tags, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.prometheus-addr", Usage: "Address for Prometheus Server", Value: &c.cliConfig.Telemetry.PrometheusAddr, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.opencollector-endpoint", Usage: "OpenCollector Endpoint (host:port)", Value: &c.cliConfig.Telemetry.OpenCollectorEndpoint, + Group: "Telemetry", }) // influx db v2 f.BoolFlag(&flagset.BoolFlag{ Name: "metrics.influxdbv2", Usage: "Enable metrics export/push to an external InfluxDB v2 database", Value: &c.cliConfig.Telemetry.InfluxDB.V2Enabled, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.token", Usage: "Token to authorize access to the database (v2 only)", Value: &c.cliConfig.Telemetry.InfluxDB.Token, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.bucket", Usage: "InfluxDB bucket name to push reported metrics to (v2 only)", Value: &c.cliConfig.Telemetry.InfluxDB.Bucket, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.organization", Usage: "InfluxDB organization name (v2 only)", Value: &c.cliConfig.Telemetry.InfluxDB.Organization, + Group: "Telemetry", }) // account @@ -445,21 +510,25 @@ func (c *Command) Flags() *flagset.Flagset { Name: "unlock", Usage: "Comma separated list of accounts to unlock", Value: &c.cliConfig.Accounts.Unlock, + Group: "Account Management", }) f.StringFlag(&flagset.StringFlag{ Name: "password", Usage: "Password file to use for non-interactive password input", Value: &c.cliConfig.Accounts.PasswordFile, + Group: "Account Management", }) f.BoolFlag(&flagset.BoolFlag{ Name: "allow-insecure-unlock", Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", Value: &c.cliConfig.Accounts.AllowInsecureUnlock, + Group: "Account Management", }) f.BoolFlag(&flagset.BoolFlag{ Name: "lightkdf", Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", Value: &c.cliConfig.Accounts.UseLightweightKDF, + Group: "Account Management", }) // grpc diff --git a/internal/cli/status.go b/internal/cli/status.go index ef0a42172b..c4165b0a2e 100644 --- a/internal/cli/status.go +++ b/internal/cli/status.go @@ -14,6 +14,15 @@ type StatusCommand struct { *Meta2 } +// MarkDown implements cli.MarkDown interface +func (p *StatusCommand) MarkDown() string { + items := []string{ + "# Status", + "The ```status``` command outputs the status of the client.", + } + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (p *StatusCommand) Help() string { return `Usage: bor status diff --git a/internal/cli/version.go b/internal/cli/version.go index 7433f208b2..080cf41221 100644 --- a/internal/cli/version.go +++ b/internal/cli/version.go @@ -1,6 +1,8 @@ package cli import ( + "strings" + "github.com/ethereum/go-ethereum/params" "github.com/mitchellh/cli" ) @@ -10,6 +12,24 @@ type VersionCommand struct { UI cli.Ui } +// MarkDown implements cli.MarkDown interface +func (d *VersionCommand) MarkDown() string { + examples := []string{ + "## Usage", + CodeBlock([]string{ + "$ bor version", + "0.2.9-stable", + }), + } + + items := []string{ + "# Version", + "The ```bor version``` command outputs the version of the binary.", + } + items = append(items, examples...) + return strings.Join(items, "\n\n") +} + // Help implements the cli.Command interface func (c *VersionCommand) Help() string { return `Usage: bor version From ad8bede955d8b5fa6b81dd9a38ad4a878a0fa91f Mon Sep 17 00:00:00 2001 From: Jerry Date: Tue, 3 May 2022 14:52:15 -0700 Subject: [PATCH 046/190] Add bootnode cli --- docs/cli/README.md | 2 + docs/cli/bootnode.md | 17 +++ internal/cli/bootnode.go | 220 +++++++++++++++++++++++++++++++++++++++ internal/cli/command.go | 9 ++ 4 files changed, 248 insertions(+) create mode 100644 docs/cli/bootnode.md create mode 100644 internal/cli/bootnode.go diff --git a/docs/cli/README.md b/docs/cli/README.md index c10c8bf9c2..d5648dca7d 100644 --- a/docs/cli/README.md +++ b/docs/cli/README.md @@ -12,6 +12,8 @@ - [```attach```](./attach.md) +- [```bootnode```](./bootnode.md) + - [```chain```](./chain.md) - [```chain sethead```](./chain_sethead.md) diff --git a/docs/cli/bootnode.md b/docs/cli/bootnode.md new file mode 100644 index 0000000000..3e60252341 --- /dev/null +++ b/docs/cli/bootnode.md @@ -0,0 +1,17 @@ +# Bootnode + +## Options + +- ```listen-addr```: listening address of bootnode (:) + +- ```v5```: Enable UDP v5 + +- ```log-level```: Log level (trace|debug|info|warn|error|crit) + +- ```nat```: port mapping mechanism (any|none|upnp|pmp|extip:) + +- ```node-key```: file or hex node key + +- ```save-key```: path to save the ecdsa private key + +- ```dry-run``` \ No newline at end of file diff --git a/internal/cli/bootnode.go b/internal/cli/bootnode.go new file mode 100644 index 0000000000..f9127494a6 --- /dev/null +++ b/internal/cli/bootnode.go @@ -0,0 +1,220 @@ +package cli + +import ( + "crypto/ecdsa" + "errors" + "fmt" + "io/ioutil" + "net" + "os" + "os/signal" + "path/filepath" + "strings" + "syscall" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/internal/cli/flagset" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/mitchellh/cli" +) + +type BootnodeCommand struct { + UI cli.Ui + + listenAddr string + v5 bool + logLevel string + nat string + nodeKey string + saveKey string + dryRun bool +} + +// Help implements the cli.Command interface +func (b *BootnodeCommand) Help() string { + return `Usage: bor bootnode` +} + +// MarkDown implements cli.MarkDown interface +func (c *BootnodeCommand) MarkDown() string { + items := []string{ + "# Bootnode", + c.Flags().MarkDown(), + } + return strings.Join(items, "\n\n") +} + +func (b *BootnodeCommand) Flags() *flagset.Flagset { + flags := flagset.NewFlagSet("bootnode") + + flags.StringFlag(&flagset.StringFlag{ + Name: "listen-addr", + Default: "0.0.0.0:30303", + Usage: "listening address of bootnode (:)", + Value: &b.listenAddr, + }) + flags.BoolFlag(&flagset.BoolFlag{ + Name: "v5", + Default: false, + Usage: "Enable UDP v5", + Value: &b.v5, + }) + flags.StringFlag(&flagset.StringFlag{ + Name: "log-level", + Default: "info", + Usage: "Log level (trace|debug|info|warn|error|crit)", + Value: &b.logLevel, + }) + flags.StringFlag(&flagset.StringFlag{ + Name: "nat", + Default: "none", + Usage: "port mapping mechanism (any|none|upnp|pmp|extip:)", + Value: &b.nat, + }) + flags.StringFlag(&flagset.StringFlag{ + Name: "node-key", + Default: "", + Usage: "file or hex node key", + Value: &b.nodeKey, + }) + flags.StringFlag(&flagset.StringFlag{ + Name: "save-key", + Default: "", + Usage: "path to save the ecdsa private key", + Value: &b.saveKey, + }) + flags.BoolFlag(&flagset.BoolFlag{ + Name: "dry-run", + Default: false, + Usage: "validates parameters and prints bootnode configurations, but does not start bootnode", + Value: &b.dryRun, + }) + + return flags +} + +// Synopsis implements the cli.Command interface +func (b *BootnodeCommand) Synopsis() string { + return "Start a bootnode" +} + +// Run implements the cli.Command interface +func (b *BootnodeCommand) Run(args []string) int { + flags := b.Flags() + if err := flags.Parse(args); err != nil { + b.UI.Error(err.Error()) + return 1 + } + + glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) + + lvl, err := log.LvlFromString(strings.ToLower(b.logLevel)) + if err == nil { + glogger.Verbosity(lvl) + } else { + glogger.Verbosity(log.LvlInfo) + } + log.Root().SetHandler(glogger) + + natm, err := nat.Parse(b.nat) + if err != nil { + b.UI.Error(fmt.Sprintf("failed to parse nat: %v", err)) + return 1 + } + + // create a one time key + var nodeKey *ecdsa.PrivateKey + if b.nodeKey != "" { + // try to read the key either from file or command line + if _, err := os.Stat(b.nodeKey); errors.Is(err, os.ErrNotExist) { + if nodeKey, err = crypto.HexToECDSA(b.nodeKey); err != nil { + b.UI.Error(fmt.Sprintf("failed to parse hex address: %v", err)) + return 1 + } + } else { + if nodeKey, err = crypto.LoadECDSA(b.nodeKey); err != nil { + b.UI.Error(fmt.Sprintf("failed to load node key: %v", err)) + return 1 + } + } + } else { + // generate a new temporal key + if nodeKey, err = crypto.GenerateKey(); err != nil { + b.UI.Error(fmt.Sprintf("could not generate key: %v", err)) + return 1 + } + if b.saveKey != "" { + path := b.saveKey + + // save the private key + if err = crypto.SaveECDSA(filepath.Join(path, "priv.key"), nodeKey); err != nil { + b.UI.Error(fmt.Sprintf("failed to write node priv key: %v", err)) + return 1 + } + // save the public key + pubRaw := fmt.Sprintf("%x", crypto.FromECDSAPub(&nodeKey.PublicKey)[1:]) + if err := ioutil.WriteFile(filepath.Join(path, "pub.key"), []byte(pubRaw), 0755); err != nil { + b.UI.Error(fmt.Sprintf("failed to write node pub key: %v", err)) + return 1 + } + } + } + + addr, err := net.ResolveUDPAddr("udp", b.listenAddr) + if err != nil { + b.UI.Error(fmt.Sprintf("could not resolve udp addr '%s': %v", b.listenAddr, err)) + return 1 + } + conn, err := net.ListenUDP("udp", addr) + if err != nil { + b.UI.Error(fmt.Sprintf("failed to listen udp addr '%s': %v", b.listenAddr, err)) + return 1 + } + + realaddr := conn.LocalAddr().(*net.UDPAddr) + if natm != nil { + if !realaddr.IP.IsLoopback() { + go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") + } + if ext, err := natm.ExternalIP(); err == nil { + realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port} + } + } + + n := enode.NewV4(&nodeKey.PublicKey, addr.IP, addr.Port, addr.Port) + b.UI.Info(n.String()) + + if b.dryRun { + return 0 + } + + db, _ := enode.OpenDB("") + ln := enode.NewLocalNode(db, nodeKey) + cfg := discover.Config{ + PrivateKey: nodeKey, + Log: log.Root(), + } + if b.v5 { + if _, err := discover.ListenV5(conn, ln, cfg); err != nil { + utils.Fatalf("%v", err) + } + } else { + if _, err := discover.ListenUDP(conn, ln, cfg); err != nil { + utils.Fatalf("%v", err) + } + } + + signalCh := make(chan os.Signal, 4) + signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP) + + sig := <-signalCh + + b.UI.Output(fmt.Sprintf("Caught signal: %v", sig)) + b.UI.Output("Gracefully shutting down agent...") + + return 0 +} diff --git a/internal/cli/command.go b/internal/cli/command.go index 4cb089b9ff..d1851594a7 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -27,6 +27,10 @@ func Run(args []string) int { mappedCommands := make(map[string]cli.CommandFactory) for k, v := range commands { + // Declare a new v to limit the scope of v to inside the block, so the anonymous function below + // can get the "current" value of v, instead of the value of last v in the loop. + // See this post: https://stackoverflow.com/questions/10116507/go-transfer-var-into-anonymous-function for more explanation + v := v mappedCommands[k] = func() (cli.Command, error) { cmd, err := v() return cmd.(cli.Command), err @@ -153,6 +157,11 @@ func Commands() map[string]MarkDownCommandFactory { Meta2: meta2, }, nil }, + "bootnode": func() (MarkDownCommand, error) { + return &BootnodeCommand{ + UI: ui, + }, nil + }, } } From 8fc86ccb9027430ad35f558187a153c2238b4733 Mon Sep 17 00:00:00 2001 From: Jerry Date: Fri, 6 May 2022 13:55:00 -0700 Subject: [PATCH 047/190] Fix prometheus path and add prometheus to bor.service --- builder/files/bor.service | 6 +++++- internal/cli/server/server.go | 4 +--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/builder/files/bor.service b/builder/files/bor.service index 4f834a3cb4..6fe89a8f2d 100644 --- a/builder/files/bor.service +++ b/builder/files/bor.service @@ -10,14 +10,18 @@ -chain=mumbai \ # -chain=mainnet \ -datadir /var/lib/bor/data \ + -metrics \ + -metrics.prometheus-addr="127.0.0.1:7071" \ -bootnodes "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303,enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303" # Validator params - # Uncomment and configure the following lines in case you run a validator + # Uncomment and configure the following lines in case you run a validator. Don't forget to add backslash (\) + # to previous command line. # -keystore /var/lib/bor/keystore \ # -unlock [VALIDATOR ADDRESS] \ # -password /var/lib/bor/password.txt \ # -allow-insecure-unlock \ # -nodiscover -maxpeers 1 \ + # -miner.etherbase [VALIDATOR ADDRESS] \ # -mine Type=simple User=root diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index e882429e86..5d3d307d2a 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -175,9 +175,7 @@ func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error prometheusMux := http.NewServeMux() - prometheusMux.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) { - prometheus.Handler(metrics.DefaultRegistry) - }) + prometheusMux.Handle("/debug/metrics/prometheus", prometheus.Handler(metrics.DefaultRegistry)) promServer := &http.Server{ Addr: config.PrometheusAddr, From eb76df22af662774063e9f0b4bfe1d2bc764fc59 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 10:00:31 +0300 Subject: [PATCH 048/190] better ci --- .github/workflows/ci.yml | 63 ++++++++++++++++++++++++++++++---------- Makefile | 24 +++++++++++++-- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d61e14cb42..b6e2e71305 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,20 +1,53 @@ name: CI on: [push, pull_request] jobs: - build: - runs-on: ubuntu-latest + tests: + strategy: + matrix: + os: [ ubuntu-20.04, macos-11 ] # list of os: https://github.com/actions/virtual-environments + runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: 1.17 - - name: "Build binaries" - run: make all - - name: "Run tests" - run: make test - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - with: - file: ./cover.out + - uses: actions/checkout@v3 + - run: git submodule update --init --recursive --force + - uses: actions/setup-go@v3 + with: + go-version: 1.18.x + - name: Install dependencies on Linux + if: runner.os == 'Linux' + run: sudo apt update && sudo apt install build-essential + - uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/Library/Caches/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: ${{ runner.os }}-go- + + - name: Build + run: make all + + - name: Reproducible build test + run: | + make geth + shasum -a256 ./build/bin/geth > bor1.sha256 + make geth + shasum -a256 ./build/bin/geth > bor2.sha256 + if ! cmp -s bor1.sha256 bor2.sha256; then + echo >&2 "Reproducible build broken"; cat bor1.sha256; cat bor2.sha256; exit 1 + fi + + - name: Lint + if: runner.os == 'Linux' + uses: golangci/golangci-lint-action@v3 + with: + version: v1.46 + skip-pkg-cache: true + skip-build-cache: true + + - name: Test + run: make test + + - name: Data race tests + run: make test-race \ No newline at end of file diff --git a/Makefile b/Makefile index 6469b8510f..d23903faac 100644 --- a/Makefile +++ b/Makefile @@ -4,11 +4,21 @@ .PHONY: geth android ios evm all test clean -GOBIN = ./build/bin GO ?= latest +GOBIN = $(CURDIR)/build/bin GORUN = env GO111MODULE=on go run GOPATH = $(shell go env GOPATH) +GIT_COMMIT ?= $(shell git rev-list -1 HEAD) +GIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD) +GIT_TAG ?= $(shell git describe --tags `git rev-list --tags="v*" --max-count=1`) + +PACKAGE = github.com/ethereum/go-ethereum +GO_FLAGS += -trimpath -buildvcs=false +GO_FLAGS += -ldflags "-X ${PACKAGE}/params.GitCommit=${GIT_COMMIT} -X ${PACKAGE}/params.GitBranch=${GIT_BRANCH} -X ${PACKAGE}/params.GitTag=${GIT_TAG}" + +GOTEST = GODEBUG=cgocheck=0 go test $(GO_FLAGS) ./... -p 1 -shuffle=on + bor: $(GORUN) build/ci.go install ./cmd/geth mkdir -p $(GOPATH)/bin/ @@ -45,8 +55,16 @@ ios: @echo "Import \"$(GOBIN)/Geth.framework\" to use the library." test: - # Skip mobile and cmd tests since they are being deprecated - go test -v $$(go list ./... | grep -v go-ethereum/cmd/) -cover -coverprofile=cover.out + $(GOTEST) --timeout 5m -cover -coverprofile=cover.out + +test-race: + $(GOTEST) --timeout 5m -race + +test-integration: + $(GOTEST) --timeout 30m -tags integration + +escape: + cd $(path) && go test -gcflags "-m -m" -run none -bench=BenchmarkJumpdest* -benchmem -memprofile mem.out lint: ## Run linters. $(GORUN) build/ci.go lint From 5192fd7d8dff7a211a69d79a1d408490779edbc3 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 10:26:10 +0300 Subject: [PATCH 049/190] split units and integration. step 1 --- .github/workflows/ci.yml | 30 +++++++++++++------- .github/workflows/test-integration.yml | 39 ++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/test-integration.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b6e2e71305..6ba2cece0b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,16 @@ name: CI -on: [push, pull_request] +on: + push: + branches: + - "**" + - "!master" + pull_request: + branches: + - master + types: [opened, synchronize, closed] jobs: tests: + if: (!(github.event.action == 'closed' && github.event.pull_request.merged != true)) strategy: matrix: os: [ ubuntu-20.04, macos-11 ] # list of os: https://github.com/actions/virtual-environments @@ -28,15 +37,16 @@ jobs: - name: Build run: make all - - name: Reproducible build test - run: | - make geth - shasum -a256 ./build/bin/geth > bor1.sha256 - make geth - shasum -a256 ./build/bin/geth > bor2.sha256 - if ! cmp -s bor1.sha256 bor2.sha256; then - echo >&2 "Reproducible build broken"; cat bor1.sha256; cat bor2.sha256; exit 1 - fi + # TODO: make it work + # - name: Reproducible build test + # run: | + # make geth + # shasum -a256 ./build/bin/geth > bor1.sha256 + # make geth + # shasum -a256 ./build/bin/geth > bor2.sha256 + # if ! cmp -s bor1.sha256 bor2.sha256; then + # echo >&2 "Reproducible build broken"; cat bor1.sha256; cat bor2.sha256; exit 1 + # fi - name: Lint if: runner.os == 'Linux' diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml new file mode 100644 index 0000000000..93578062f2 --- /dev/null +++ b/.github/workflows/test-integration.yml @@ -0,0 +1,39 @@ +name: Integration tests +on: + push: + branches: + - "**" + - "!master" + pull_request: + branches: + - master + types: [opened, synchronize, closed] +jobs: + tests: + if: (!(github.event.action == 'closed' && github.event.pull_request.merged != true)) + strategy: + matrix: + os: [ ubuntu-20.04, macos-11 ] # list of os: https://github.com/actions/virtual-environments + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v3 + - run: git submodule update --init --recursive --force + - uses: actions/setup-go@v3 + with: + go-version: 1.18.x + - name: Install dependencies on Linux + if: runner.os == 'Linux' + run: sudo apt update && sudo apt install build-essential + + - uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/Library/Caches/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: ${{ runner.os }}-go- + + - name: test-integration + run: make test-integration From ee5b7c04aa571c158c0c2bfcac5cb5802954a5ef Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 10:31:41 +0300 Subject: [PATCH 050/190] integration tag --- tests/block_test.go | 3 +++ tests/block_test_util.go | 4 ++++ tests/bor/bor_test.go | 3 +++ tests/difficulty_test.go | 3 +++ tests/init_test.go | 3 +++ tests/state_test.go | 3 +++ tests/transaction_test.go | 3 +++ 7 files changed, 22 insertions(+) diff --git a/tests/block_test.go b/tests/block_test.go index 74c7ed8197..591bff6e07 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -14,6 +14,9 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration +// +build integration + package tests import ( diff --git a/tests/block_test_util.go b/tests/block_test_util.go index bcf861e09b..fea4ee0b95 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -15,6 +15,10 @@ // along with the go-ethereum library. If not, see . // Package tests implements execution of Ethereum JSON tests. + +//go:build integration +// +build integration + package tests import ( diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index 7d0ca9372b..3bda2ee3f4 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -1,3 +1,6 @@ +//go:build integration +// +build integration + package bor import ( diff --git a/tests/difficulty_test.go b/tests/difficulty_test.go index 192dff12cc..0b030c1485 100644 --- a/tests/difficulty_test.go +++ b/tests/difficulty_test.go @@ -14,6 +14,9 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration +// +build integration + package tests import ( diff --git a/tests/init_test.go b/tests/init_test.go index 7e2f3ff7f5..4ade0bfb90 100644 --- a/tests/init_test.go +++ b/tests/init_test.go @@ -14,6 +14,9 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration +// +build integration + package tests import ( diff --git a/tests/state_test.go b/tests/state_test.go index d2c92b211c..8fcf35b864 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -14,6 +14,9 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration +// +build integration + package tests import ( diff --git a/tests/transaction_test.go b/tests/transaction_test.go index cb0f262318..1197eebe19 100644 --- a/tests/transaction_test.go +++ b/tests/transaction_test.go @@ -14,6 +14,9 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration +// +build integration + package tests import ( From 63cd7a3273615575d57dd76c4db5546597037b3a Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 10:33:44 +0300 Subject: [PATCH 051/190] move integration ci --- .github/workflows/ci.yml | 5 +++- .github/workflows/test-integration.yml | 39 -------------------------- 2 files changed, 4 insertions(+), 40 deletions(-) delete mode 100644 .github/workflows/test-integration.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6ba2cece0b..36fdc12f86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,4 +60,7 @@ jobs: run: make test - name: Data race tests - run: make test-race \ No newline at end of file + run: make test-race + + - name: test-integration + run: make test-integration \ No newline at end of file diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml deleted file mode 100644 index 93578062f2..0000000000 --- a/.github/workflows/test-integration.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Integration tests -on: - push: - branches: - - "**" - - "!master" - pull_request: - branches: - - master - types: [opened, synchronize, closed] -jobs: - tests: - if: (!(github.event.action == 'closed' && github.event.pull_request.merged != true)) - strategy: - matrix: - os: [ ubuntu-20.04, macos-11 ] # list of os: https://github.com/actions/virtual-environments - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v3 - - run: git submodule update --init --recursive --force - - uses: actions/setup-go@v3 - with: - go-version: 1.18.x - - name: Install dependencies on Linux - if: runner.os == 'Linux' - run: sudo apt update && sudo apt install build-essential - - - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/Library/Caches/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: ${{ runner.os }}-go- - - - name: test-integration - run: make test-integration From b43ebd5f96a0bc21930956acc3169a15d44092f0 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 10:53:35 +0300 Subject: [PATCH 052/190] fix build --- tests/block_test_util.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/block_test_util.go b/tests/block_test_util.go index fea4ee0b95..d28f3a1237 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -16,9 +16,6 @@ // Package tests implements execution of Ethereum JSON tests. -//go:build integration -// +build integration - package tests import ( From 3c2510a5af17ac8d81c9a40381a2da5d45a7ae4d Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 11:22:17 +0300 Subject: [PATCH 053/190] move integration ci --- tests/rlp_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/rlp_test.go b/tests/rlp_test.go index 79a1683eb2..dbca73efc6 100644 --- a/tests/rlp_test.go +++ b/tests/rlp_test.go @@ -14,6 +14,9 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration +// +build integration + package tests import ( From 15900477fb7e139e9a30d5efdf880749c60324dd Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 14:05:02 +0300 Subject: [PATCH 054/190] linters --- .github/workflows/ci.yml | 1 + .golangci.yml | 86 +++++++++++++++++++++++++++++++++++++++- Makefile | 12 +++++- go.mod | 11 +++-- go.sum | 68 +++++++++++++++++++++++++++++++ 5 files changed, 172 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 36fdc12f86..4b71b413b9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,6 +38,7 @@ jobs: run: make all # TODO: make it work + # - name: Reproducible build test # run: | # make geth diff --git a/.golangci.yml b/.golangci.yml index 4950b98c21..14e0654ef0 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -8,6 +8,8 @@ run: skip-dirs-use-default: true skip-files: - core/genesis_alloc.go + - gen_.*.go + - .*_gen.go linters: disable-all: true @@ -27,9 +29,70 @@ linters: linters-settings: gofmt: simplify: true + auto-fix: false goconst: min-len: 3 # minimum length of string constant - min-occurrences: 6 # minimum number of occurrences + min-occurrences: 2 # minimum number of occurrences + + gocritic: + # Which checks should be enabled; can't be combined with 'disabled-checks'; + # See https://go-critic.github.io/overview#checks-overview + # To check which checks are enabled run `GL_DEBUG=gocritic ./build/bin/golangci-lint run` + # By default list of stable checks is used. + enabled-checks: + - badLock + - filepathJoin + - sortSlice + - sprintfQuotedString + - syncMapLoadAndDelete + - weakCond + - boolExprSimplify + - httpNoBody + - ioutilDeprecated + - nestingReduce + - preferFilepathJoin + - redundantSprint + - stringConcatSimplify + - timeExprSimplify + - typeAssertChain + - yodaStyleExpr + - truncateCmp + - equalFold + - preferDecodeRune + - preferFprint + - preferStringWriter + - preferWriteByte + - sliceClear + #- ruleguard + + # Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty + disabled-checks: + - regexpMust + - exitAfterDefer + - dupBranchBody + - singleCaseSwitch + - unlambda + - captLocal + - commentFormatting + - ifElseChain + - importShadow + - builtinShadow + + # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks. + # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags". + enabled-tags: + - performance + - diagnostic + - opinionated + - style + disabled-tags: + - experimental + govet: + disable: + - deepequalerrors + - fieldalignment + - shadow + - unsafeptr issues: exclude-rules: @@ -48,3 +111,24 @@ issues: - path: cmd/faucet/ linters: - deadcode + # Exclude some linters from running on tests files. + - path: test\.go + linters: + - gosec + - unused + - deadcode + - gocritic + - path: cmd/devp2p + linters: + - gosec + - unused + - deadcode + - gocritic + - path: metrics/sample\.go + linters: + - gosec + - gocritic + - path: p2p/simulations + linters: + - gosec + - gocritic diff --git a/Makefile b/Makefile index d23903faac..9bc9ec5919 100644 --- a/Makefile +++ b/Makefile @@ -66,8 +66,16 @@ test-integration: escape: cd $(path) && go test -gcflags "-m -m" -run none -bench=BenchmarkJumpdest* -benchmem -memprofile mem.out -lint: ## Run linters. - $(GORUN) build/ci.go lint +lint: + @./build/bin/golangci-lint run --config ./.golangci.yml + +lintci: + @echo "--> Running linter for code" + @./build/bin/golangci-lint run --config ./.golangci.yml + +lintci-deps: + rm -f ./build/bin/golangci-lint + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./build/bin v1.46.0 clean: env GO111MODULE=on go clean -cache diff --git a/go.mod b/go.mod index edd6d6887a..6065c1a5d2 100644 --- a/go.mod +++ b/go.mod @@ -23,10 +23,12 @@ require ( github.com/fatih/color v1.7.0 github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff + github.com/go-critic/go-critic v0.6.3 // indirect github.com/go-kit/kit v0.9.0 // indirect github.com/go-logfmt/logfmt v0.5.0 // indirect github.com/go-ole/go-ole v1.2.1 // indirect github.com/go-stack/stack v1.8.0 + github.com/go-toolsmith/astcopy v1.0.1 // indirect github.com/golang-jwt/jwt/v4 v4.3.0 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 @@ -59,6 +61,8 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 github.com/prometheus/tsdb v0.7.1 + github.com/quasilyte/gogrep v0.0.0-20220429205452-5e2753ee08f9 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/rjeczalik/notify v0.9.1 github.com/rs/cors v1.7.0 github.com/ryanuber/columnize v2.1.2+incompatible @@ -72,12 +76,13 @@ require ( go.opentelemetry.io/otel v1.2.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.2.0 go.opentelemetry.io/otel/sdk v1.2.0 - golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 + golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 + golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 golang.org/x/text v0.3.7 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba - golang.org/x/tools v0.1.0 + golang.org/x/tools v0.1.10 + golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect google.golang.org/grpc v1.42.0 google.golang.org/protobuf v1.27.1 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce diff --git a/go.sum b/go.sum index 19a6002886..d664628dac 100644 --- a/go.sum +++ b/go.sum @@ -162,6 +162,8 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-critic/go-critic v0.6.3 h1:abibh5XYBTASawfTQ0rA7dVtQT+6KzpGqb/J+DxRDaw= +github.com/go-critic/go-critic v0.6.3/go.mod h1:c6b3ZP1MQ7o6lPR7Rv3lEf7pYQUmAcx8ABHgdZCQt/k= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -182,6 +184,25 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astcopy v1.0.1 h1:l09oBhAPyV74kLJ3ZO31iBU8htZGTwr9LTjuMCyL8go= +github.com/go-toolsmith/astcopy v1.0.1/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= +github.com/go-toolsmith/astequal v1.0.2 h1:+XvaV8zNxua+9+Oa4AHmgmpo4RYAbwr/qjNppLfX2yM= +github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -226,10 +247,13 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -419,6 +443,21 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a h1:sWFavxtIctGrVs5SYZ5Ml1CvrDAs8Kf5kx2PI3C41dA= +github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a/go.mod h1:VMX+OnnSw4LicdiEGtRSD/1X8kW7GuEscjYNr4cOIT4= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.16/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= +github.com/quasilyte/gogrep v0.0.0-20220429205452-5e2753ee08f9 h1:mEQjyqtrQ6eB7oW9Qm+5po33faQIbhWp3qfhxGYuHKc= +github.com/quasilyte/gogrep v0.0.0-20220429205452-5e2753ee08f9/go.mod h1:MsVMK2P94jAne/7vEaLCRmjmOL0aTGAkvVOVuT+UYww= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= @@ -477,7 +516,9 @@ github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPyS github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xsleonard/go-merkle v1.1.0 h1:fHe1fuhJjGH22ZzVTAH0jqHLhTGhOq3wQjJN+8P0jQg= github.com/xsleonard/go-merkle v1.1.0/go.mod h1:cW4z+UZ/4f2n9IJgIiyDCdYguchoDyDAPmpuOWGxdGg= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= @@ -513,6 +554,9 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 h1:NvGWuYG8dkDHFSKksI1P9faiVJ9rayE6l0+ouWVIDs8= +golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -522,7 +566,10 @@ golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxT golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171 h1:DZhP7zSquENyG3Yb6ZpGqNEtgE8dfXhcLcheIF9RQHY= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -542,6 +589,9 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -560,6 +610,7 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -570,6 +621,10 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -581,6 +636,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -622,8 +678,13 @@ golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -667,13 +728,20 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= From a6ec55bb31d59acdd9d21d8a1fc9551c7c571c23 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Wed, 11 May 2022 17:09:28 +0530 Subject: [PATCH 055/190] fix tests and format --- eth/downloader/downloader.go | 28 ++++++++++----------- eth/downloader/downloader_test.go | 2 +- eth/downloader/whitelist/service.go | 6 ++--- eth/downloader/whitelist/service_test.go | 32 ++++++++++++++++++++++++ eth/handler_eth_test.go | 22 ---------------- 5 files changed, 50 insertions(+), 40 deletions(-) create mode 100644 eth/downloader/whitelist/service_test.go diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index ae00350464..209d039f90 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -218,19 +218,19 @@ func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain Bl lightchain = chain } dl := &Downloader{ - stateDB: stateDb, - mux: mux, - checkpoint: checkpoint, - queue: newQueue(blockCacheMaxItems, blockCacheInitialItems), - peers: newPeerSet(), - blockchain: chain, - lightchain: lightchain, - dropPeer: dropPeer, - headerProcCh: make(chan *headerTask, 1), - quitCh: make(chan struct{}), - SnapSyncer: snap.NewSyncer(stateDb), - stateSyncStart: make(chan *stateSync), - ChainValidator: whitelistService, + stateDB: stateDb, + mux: mux, + checkpoint: checkpoint, + queue: newQueue(blockCacheMaxItems, blockCacheInitialItems), + peers: newPeerSet(), + blockchain: chain, + lightchain: lightchain, + dropPeer: dropPeer, + headerProcCh: make(chan *headerTask, 1), + quitCh: make(chan struct{}), + SnapSyncer: snap.NewSyncer(stateDb), + stateSyncStart: make(chan *stateSync), + ChainValidator: whitelistService, } dl.skeleton = newSkeleton(stateDb, dl.peers, dropPeer, newBeaconBackfiller(dl, success)) @@ -792,7 +792,7 @@ func (d *Downloader) getFetchHeadersByNumber(p *peerConnection) func(number uint // the head links match), we do a binary search to find the common ancestor. func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) (uint64, error) { // Check the validity of chain to be downloaded - // TODO: we can use a mock and + // TODO: we can use a mock and if _, err := d.IsValidChain(remoteHeader, d.getFetchHeadersByNumber(p)); errors.Is(err, whitelist.ErrCheckpointMismatch) { return 0, err } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index e2a3dca6be..fa6059b781 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -78,7 +78,7 @@ func newTester() *downloadTester { } // TODO: here we can inject a mock - tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer, nil, whitelist.NewService()) + tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer, nil, whitelist.NewService(10)) return tester } diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go index 63851f3058..d79284bfad 100644 --- a/eth/downloader/whitelist/service.go +++ b/eth/downloader/whitelist/service.go @@ -15,17 +15,17 @@ var ( // Checkpoint whitelist type Service struct { - m sync.RWMutex + m sync.RWMutex checkpointWhitelist map[uint64]common.Hash // Checkpoint whitelist, populated by reaching out to heimdall checkpointOrder []uint64 // Checkpoint order, populated by reaching out to heimdall - maxCapacity uint + maxCapacity uint } func NewService(maxCapacity uint) *Service { return &Service{ checkpointWhitelist: make(map[uint64]common.Hash), checkpointOrder: []uint64{}, - maxCapacity: maxCapacity, + maxCapacity: maxCapacity, } } diff --git a/eth/downloader/whitelist/service_test.go b/eth/downloader/whitelist/service_test.go new file mode 100644 index 0000000000..dbd3f2f92e --- /dev/null +++ b/eth/downloader/whitelist/service_test.go @@ -0,0 +1,32 @@ +package whitelist + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "gotest.tools/assert" +) + +// NewMockService creates a new mock whitelist service +func NewMockService(maxCapacity uint) *Service { + return &Service{ + checkpointWhitelist: make(map[uint64]common.Hash), + checkpointOrder: []uint64{}, + maxCapacity: maxCapacity, + } +} + +// TestWhitelistCheckpoint checks the checkpoint whitelist map queue mechanism +func TestWhitelistCheckpoint(t *testing.T) { + t.Parallel() + + s := NewMockService(10) + for i := 0; i < 10; i++ { + s.EnqueueCheckpointWhitelist(uint64(i), common.Hash{}) + } + assert.Equal(t, len(s.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") + + s.EnqueueCheckpointWhitelist(11, common.Hash{}) + s.DequeueCheckpointWhitelist() + assert.Equal(t, len(s.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") +} diff --git a/eth/handler_eth_test.go b/eth/handler_eth_test.go index ec1329b059..7d5027ae77 100644 --- a/eth/handler_eth_test.go +++ b/eth/handler_eth_test.go @@ -39,7 +39,6 @@ import ( "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" - "gotest.tools/assert" ) // testEthHandler is a mock event handler to listen for inbound network requests @@ -747,24 +746,3 @@ func testBroadcastMalformedBlock(t *testing.T, protocol uint) { } } } - -// TestWhitelistCheckpoint checks the checkpoint whitelist map queue mechanism -func TestWhitelistCheckpoint(t *testing.T) { - t.Parallel() - - testHandler := newTestHandler() - defer testHandler.close() - - ethHandler := (*ethHandler)(testHandler.handler) - for i := 0; i < 10; i++ { - ethHandler.downloader.EnqueueCheckpointWhitelist(uint64(i), common.Hash{}) - } - - assert.Equal(t, len(ethHandler.downloader.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") - - ethHandler.downloader.EnqueueCheckpointWhitelist(11, common.Hash{}) - ethHandler.downloader.DequeueCheckpointWhitelist() - - assert.Equal(t, len(ethHandler.downloader.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") - -} From 64ad2f9eb158e3d82ed16eae4d0f5d104aba8da6 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 14:40:15 +0300 Subject: [PATCH 056/190] update linter list --- .golangci.yml | 64 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 14e0654ef0..d72bb83320 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -12,27 +12,63 @@ run: - .*_gen.go linters: - disable-all: true enable: - - deadcode - goconst - goimports - - gosimple - - govet - - ineffassign - misspell - # - staticcheck - unconvert - # - unused - - varcheck + - bodyclose + - containedctx + - contextcheck + - decorder + - durationcheck + - errchkjson + - errname + - errorlint + - exhaustive + - exportloopref + - gocognit + - gofmt + - gomnd + - gomoddirectives + - gosec + - makezero + - nestif + - nilerr + - nilnil + - noctx + #- nosprintfhostport # TODO: do we use IPv6? + - paralleltest + - prealloc + - predeclared + #- promlinter + #- revive + - tagliatelle + - tenv + - thelper + - tparallel + - unconvert + - unparam + - wsl linters-settings: gofmt: simplify: true auto-fix: false + goconst: min-len: 3 # minimum length of string constant min-occurrences: 2 # minimum number of occurrences + numbers: true + + goimports: + local-prefixes: github.com/ethereum/go-ethereum + + nestif: + min-complexity: 3 + + prealloc: + for-loops: true gocritic: # Which checks should be enabled; can't be combined with 'disabled-checks'; @@ -93,6 +129,18 @@ linters-settings: - fieldalignment - shadow - unsafeptr + check-shadowing: true + enable-all: true + settings: + printf: + # Run `go tool vet help printf` to see available settings for `printf` analyzer. + funcs: + - (github.com/ethereum/go-ethereum/log.Logger).Trace + - (github.com/ethereum/go-ethereum/log.Logger).Debug + - (github.com/ethereum/go-ethereum/log.Logger).Info + - (github.com/ethereum/go-ethereum/log.Logger).Warn + - (github.com/ethereum/go-ethereum/log.Logger).Error + - (github.com/ethereum/go-ethereum/log.Logger).Crit issues: exclude-rules: From 834c7741b40a10467f7eb62f29525851926652e3 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 15:21:21 +0300 Subject: [PATCH 057/190] only new issues --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b71b413b9..40483cbe73 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,6 +56,7 @@ jobs: version: v1.46 skip-pkg-cache: true skip-build-cache: true + only-new-issues: true - name: Test run: make test From cd4b40fffd1a1df589fdd3d076e0dd16dcede89f Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 15:26:55 +0300 Subject: [PATCH 058/190] test without linters --- .github/workflows/ci.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 40483cbe73..f9b383a310 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,15 +49,6 @@ jobs: # echo >&2 "Reproducible build broken"; cat bor1.sha256; cat bor2.sha256; exit 1 # fi - - name: Lint - if: runner.os == 'Linux' - uses: golangci/golangci-lint-action@v3 - with: - version: v1.46 - skip-pkg-cache: true - skip-build-cache: true - only-new-issues: true - - name: Test run: make test @@ -65,4 +56,13 @@ jobs: run: make test-race - name: test-integration - run: make test-integration \ No newline at end of file + run: make test-integration + + - name: Lint + if: runner.os == 'Linux' + uses: golangci/golangci-lint-action@v3 + with: + version: v1.46 + skip-pkg-cache: true + skip-build-cache: true + only-new-issues: true \ No newline at end of file From 6a598b4e93fe8bf6f5b75643f4cd26dea5543b42 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 15:27:18 +0300 Subject: [PATCH 059/190] revert --- .github/workflows/ci.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f9b383a310..40483cbe73 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,15 +49,6 @@ jobs: # echo >&2 "Reproducible build broken"; cat bor1.sha256; cat bor2.sha256; exit 1 # fi - - name: Test - run: make test - - - name: Data race tests - run: make test-race - - - name: test-integration - run: make test-integration - - name: Lint if: runner.os == 'Linux' uses: golangci/golangci-lint-action@v3 @@ -65,4 +56,13 @@ jobs: version: v1.46 skip-pkg-cache: true skip-build-cache: true - only-new-issues: true \ No newline at end of file + only-new-issues: true + + - name: Test + run: make test + + - name: Data race tests + run: make test-race + + - name: test-integration + run: make test-integration \ No newline at end of file From 348f91e9f4339a1b96863d660b539ba920371ec4 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 15:31:10 +0300 Subject: [PATCH 060/190] more time for tests for data races --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9bc9ec5919..a59d443078 100644 --- a/Makefile +++ b/Makefile @@ -58,7 +58,7 @@ test: $(GOTEST) --timeout 5m -cover -coverprofile=cover.out test-race: - $(GOTEST) --timeout 5m -race + $(GOTEST) --timeout 15m -race test-integration: $(GOTEST) --timeout 30m -tags integration From 5458ac01cdb150fee94a8f70677708108b132129 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 15:41:02 +0300 Subject: [PATCH 061/190] fix --- .gitignore | 2 ++ Makefile | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ad4242c519..50328c8121 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ */**/*dapps* build/_vendor/pkg +cover.out + #* .#* *# diff --git a/Makefile b/Makefile index a59d443078..55c33ada33 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ PACKAGE = github.com/ethereum/go-ethereum GO_FLAGS += -trimpath -buildvcs=false GO_FLAGS += -ldflags "-X ${PACKAGE}/params.GitCommit=${GIT_COMMIT} -X ${PACKAGE}/params.GitBranch=${GIT_BRANCH} -X ${PACKAGE}/params.GitTag=${GIT_TAG}" -GOTEST = GODEBUG=cgocheck=0 go test $(GO_FLAGS) ./... -p 1 -shuffle=on +GOTEST = GODEBUG=cgocheck=0 go test $(GO_FLAGS) -p 1 ./... -shuffle=on bor: $(GORUN) build/ci.go install ./cmd/geth From b2b327eaf4d11a72fbeff11ff1984d7dc4c19ce8 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 15:47:18 +0300 Subject: [PATCH 062/190] ignore cmd tests --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 55c33ada33..eb129ee3c7 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ PACKAGE = github.com/ethereum/go-ethereum GO_FLAGS += -trimpath -buildvcs=false GO_FLAGS += -ldflags "-X ${PACKAGE}/params.GitCommit=${GIT_COMMIT} -X ${PACKAGE}/params.GitBranch=${GIT_BRANCH} -X ${PACKAGE}/params.GitTag=${GIT_TAG}" -GOTEST = GODEBUG=cgocheck=0 go test $(GO_FLAGS) -p 1 ./... -shuffle=on +GOTEST = GODEBUG=cgocheck=0 go test $(GO_FLAGS) -p 1 $$(go list ./... | grep -v go-ethereum/cmd/) -shuffle=on bor: $(GORUN) build/ci.go install ./cmd/geth From 7c6357ecf6f47e05a41e9831eacc89d1bb2cd061 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 16:18:56 +0300 Subject: [PATCH 063/190] group concurrency --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 40483cbe73..ec4063a557 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,11 @@ on: branches: - master types: [opened, synchronize, closed] + +concurrency: + group: build-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: tests: if: (!(github.event.action == 'closed' && github.event.pull_request.merged != true)) From e36a54d60021a3845ce23d58580194f1cd0d9285 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 16:43:43 +0300 Subject: [PATCH 064/190] goleak --- Makefile | 3 +++ accounts/abi/bind/backends/simulated_test.go | 5 +++++ common/leak/ignore_list.go | 13 +++++++++++++ go.mod | 1 + go.sum | 7 +++++++ 5 files changed, 29 insertions(+) create mode 100644 common/leak/ignore_list.go diff --git a/Makefile b/Makefile index eb129ee3c7..608cd52f2c 100644 --- a/Makefile +++ b/Makefile @@ -77,6 +77,9 @@ lintci-deps: rm -f ./build/bin/golangci-lint curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./build/bin v1.46.0 +goimports: + goimports -local "$(PACKAGE)" -w . + clean: env GO111MODULE=on go clean -cache rm -fr build/_workspace/pkg/ $(GOBIN)/* diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go index 8a0cbe3357..7df1a823ec 100644 --- a/accounts/abi/bind/backends/simulated_test.go +++ b/accounts/abi/bind/backends/simulated_test.go @@ -27,10 +27,13 @@ import ( "testing" "time" + "go.uber.org/goleak" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/leak" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -38,6 +41,8 @@ import ( ) func TestSimulatedBackend(t *testing.T) { + defer goleak.VerifyNone(t, leak.IgnoreList()...) + var gasLimit uint64 = 8000029 key, _ := crypto.GenerateKey() // nolint: gosec auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) diff --git a/common/leak/ignore_list.go b/common/leak/ignore_list.go new file mode 100644 index 0000000000..adcadce274 --- /dev/null +++ b/common/leak/ignore_list.go @@ -0,0 +1,13 @@ +package leak + +import "go.uber.org/goleak" + +func IgnoreList() []goleak.Option { + return []goleak.Option { + goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/core.(*txSenderCacher).cache"), + goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*recursiveTree).dispatch"), + goleak.IgnoreTopFunction("github.com/rjeczalik/notify._Cfunc_CFRunLoopRun"), + goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/metrics.(*meterArbiter).tick"), + goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/consensus/ethash.(*remoteSealer).loop"), + } +} \ No newline at end of file diff --git a/go.mod b/go.mod index 6065c1a5d2..e9c010d388 100644 --- a/go.mod +++ b/go.mod @@ -76,6 +76,7 @@ require ( go.opentelemetry.io/otel v1.2.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.2.0 go.opentelemetry.io/otel/sdk v1.2.0 + go.uber.org/goleak v1.1.12 // indirect golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 diff --git a/go.sum b/go.sum index d664628dac..3aba63edb5 100644 --- a/go.sum +++ b/go.sum @@ -518,6 +518,7 @@ github.com/xsleonard/go-merkle v1.1.0 h1:fHe1fuhJjGH22ZzVTAH0jqHLhTGhOq3wQjJN+8P github.com/xsleonard/go-merkle v1.1.0/go.mod h1:cW4z+UZ/4f2n9IJgIiyDCdYguchoDyDAPmpuOWGxdGg= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= @@ -540,6 +541,8 @@ go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqe go.opentelemetry.io/proto/otlp v0.10.0 h1:n7brgtEbDvXEgGyKKo8SobKT1e9FewlDtXzkVP5djoE= go.opentelemetry.io/proto/otlp v0.10.0/go.mod h1:zG20xCK0szZ1xdokeSOwEcmlXu+x9kkdRe6N1DhKcfU= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -618,6 +621,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -675,9 +679,11 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -732,6 +738,7 @@ golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= From 2bac6ce45fea9a6bcffc689a944065779e31d056 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 17:09:36 +0300 Subject: [PATCH 065/190] remove shuffle for e2e --- .github/workflows/ci.yml | 6 +++--- Makefile | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec4063a557..c23dc68bf2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,8 +66,8 @@ jobs: - name: Test run: make test - - name: Data race tests - run: make test-race + #- name: Data race tests + # run: make test-race - name: test-integration - run: make test-integration \ No newline at end of file + run: make test-integration \ No newline at end of file diff --git a/Makefile b/Makefile index 608cd52f2c..389c1f3202 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,9 @@ PACKAGE = github.com/ethereum/go-ethereum GO_FLAGS += -trimpath -buildvcs=false GO_FLAGS += -ldflags "-X ${PACKAGE}/params.GitCommit=${GIT_COMMIT} -X ${PACKAGE}/params.GitBranch=${GIT_BRANCH} -X ${PACKAGE}/params.GitTag=${GIT_TAG}" -GOTEST = GODEBUG=cgocheck=0 go test $(GO_FLAGS) -p 1 $$(go list ./... | grep -v go-ethereum/cmd/) -shuffle=on +TESTALL = $$(go list ./... | grep -v go-ethereum/cmd/) +TESTE2E = ./tests/... +GOTEST = GODEBUG=cgocheck=0 go test $(GO_FLAGS) -p 1 bor: $(GORUN) build/ci.go install ./cmd/geth @@ -55,13 +57,13 @@ ios: @echo "Import \"$(GOBIN)/Geth.framework\" to use the library." test: - $(GOTEST) --timeout 5m -cover -coverprofile=cover.out + $(GOTEST) --timeout 5m -shuffle=on -cover -coverprofile=cover.out $(TESTALL) test-race: - $(GOTEST) --timeout 15m -race + $(GOTEST) --timeout 15m -race -shuffle=on $(TESTALL) test-integration: - $(GOTEST) --timeout 30m -tags integration + $(GOTEST) --timeout 30m -tags integration -count=1 $(TESTE2E) escape: cd $(path) && go test -gcflags "-m -m" -run none -bench=BenchmarkJumpdest* -benchmem -memprofile mem.out From ca19e0182d53f616c17c3a4738f2885a5921dd36 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 11 May 2022 17:11:59 +0300 Subject: [PATCH 066/190] fix --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 389c1f3202..5f6287dff5 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,7 @@ test-race: $(GOTEST) --timeout 15m -race -shuffle=on $(TESTALL) test-integration: - $(GOTEST) --timeout 30m -tags integration -count=1 $(TESTE2E) + $(GOTEST) --timeout 30m -tags integration $(TESTE2E) escape: cd $(path) && go test -gcflags "-m -m" -run none -bench=BenchmarkJumpdest* -benchmem -memprofile mem.out From 9838fefd3a23a7799773a7c6c927d24b2a059b09 Mon Sep 17 00:00:00 2001 From: Jerry Date: Wed, 11 May 2022 14:02:13 -0700 Subject: [PATCH 067/190] Set default user to ubuntu in bor.service --- builder/files/bor.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/files/bor.service b/builder/files/bor.service index 6fe89a8f2d..28fda79814 100644 --- a/builder/files/bor.service +++ b/builder/files/bor.service @@ -24,7 +24,7 @@ # -miner.etherbase [VALIDATOR ADDRESS] \ # -mine Type=simple - User=root + User=ubuntu KillSignal=SIGINT TimeoutStopSec=120 From bae9c4400b6756d3686772b7c0b2ef80f91530c8 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 12 May 2022 14:49:48 +0530 Subject: [PATCH 068/190] add unit tests for IsValidChain function --- eth/downloader/whitelist/service.go | 2 +- eth/downloader/whitelist/service_test.go | 64 ++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go index d79284bfad..7889429c87 100644 --- a/eth/downloader/whitelist/service.go +++ b/eth/downloader/whitelist/service.go @@ -38,7 +38,7 @@ func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber // Check for availaibility of the last checkpointed block. // This can be also be empty if our heimdall is not responsing // or we're running without it. - if len(w.checkpointWhitelist) <= 0 { + if len(w.checkpointWhitelist) == 0 { // worst case, we don't have the checkpoints in memory return true, nil } diff --git a/eth/downloader/whitelist/service_test.go b/eth/downloader/whitelist/service_test.go index dbd3f2f92e..db17af8ba8 100644 --- a/eth/downloader/whitelist/service_test.go +++ b/eth/downloader/whitelist/service_test.go @@ -1,9 +1,12 @@ package whitelist import ( + "errors" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "gotest.tools/assert" ) @@ -30,3 +33,64 @@ func TestWhitelistCheckpoint(t *testing.T) { s.DequeueCheckpointWhitelist() assert.Equal(t, len(s.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") } + +// TestIsValidChain checks che IsValidChain function in isolation +// for different cases by providing a mock fetchHeadersByNumber function +func TestIsValidChain(t *testing.T) { + t.Parallel() + + s := NewMockService(10) + + // case1: no checkpoint whitelist, should consider the chain as valid + res, err := s.IsValidChain(nil, nil) + assert.Equal(t, res, true, "expected chain to be valid") + assert.NilError(t, err, "expected no error") + + // add checkpoint entries and mock fetchHeadersByNumber function + s.ProcessCheckpoint(uint64(0), common.Hash{}) + s.ProcessCheckpoint(uint64(1), common.Hash{}) + assert.Equal(t, len(s.GetCheckpointWhitelist()), 2, "expected 2 items in whitelist") + + // create a false function, returning absolutely nothing + falseFetchHeadersByNumber := func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + return nil, nil, nil + } + + // create a mock function, returning a the required header + fetchHeadersByNumber := func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + hash := common.Hash{} + header := types.Header{Number: big.NewInt(0)} + switch number { + case 0: + return []*types.Header{&header}, []common.Hash{hash}, nil + case 1: + header.Number = big.NewInt(1) + return []*types.Header{&header}, []common.Hash{hash}, nil + case 2: + header.Number = big.NewInt(1) // sending wrong header for misamatch + return []*types.Header{&header}, []common.Hash{hash}, nil + default: + return nil, nil, errors.New("invalid number") + } + } + + // case2: false fetchHeadersByNumber function provided, should consider the chain as valid + res, err = s.IsValidChain(nil, falseFetchHeadersByNumber) + assert.Equal(t, res, true, "expected chain to be valid") + assert.NilError(t, err, "expected no error") + + // case3: correct fetchHeadersByNumber function provided, should consider the chain as valid + res, err = s.IsValidChain(nil, fetchHeadersByNumber) + assert.Equal(t, res, true, "expected chain to be valid") + assert.NilError(t, err, "expected no error") + + // add one more checkpoint whitelist entry + s.ProcessCheckpoint(uint64(2), common.Hash{}) + assert.Equal(t, len(s.GetCheckpointWhitelist()), 3, "expected 3 items in whitelist") + + // case4: correct fetchHeadersByNumber function provided with wrong header + // for block number 2. Should consider the chain as invalid and throw an error + res, err = s.IsValidChain(nil, fetchHeadersByNumber) + assert.Equal(t, res, false, "expected chain to be invalid") + assert.Equal(t, err, ErrCheckpointMismatch, "expected checkpoint mismatch error") +} From f0f113c0fcc6ce6f360f1e63b7e80fb19ec391d2 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 12 May 2022 15:25:59 +0300 Subject: [PATCH 069/190] run versus origin/master --- .golangci.yml | 6 +++++- Makefile | 4 ---- common/leak/ignore_list.go | 4 ++-- go.mod | 1 + go.sum | 3 +++ 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index d72bb83320..7dc4fc37e3 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -24,7 +24,6 @@ linters: - durationcheck - errchkjson - errname - - errorlint - exhaustive - exportloopref - gocognit @@ -50,6 +49,7 @@ linters: - unconvert - unparam - wsl + #- errorlint causes stack overflow. TODO: recheck after each golangci update linters-settings: gofmt: @@ -180,3 +180,7 @@ issues: linters: - gosec - gocritic + max-issues-per-linter: 0 + max-same-issues: 0 + #new: true + new-from-rev: origin/master \ No newline at end of file diff --git a/Makefile b/Makefile index 5f6287dff5..bce03bf5ef 100644 --- a/Makefile +++ b/Makefile @@ -71,10 +71,6 @@ escape: lint: @./build/bin/golangci-lint run --config ./.golangci.yml -lintci: - @echo "--> Running linter for code" - @./build/bin/golangci-lint run --config ./.golangci.yml - lintci-deps: rm -f ./build/bin/golangci-lint curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./build/bin v1.46.0 diff --git a/common/leak/ignore_list.go b/common/leak/ignore_list.go index adcadce274..e43e1c0393 100644 --- a/common/leak/ignore_list.go +++ b/common/leak/ignore_list.go @@ -3,11 +3,11 @@ package leak import "go.uber.org/goleak" func IgnoreList() []goleak.Option { - return []goleak.Option { + return []goleak.Option{ goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/core.(*txSenderCacher).cache"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*recursiveTree).dispatch"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify._Cfunc_CFRunLoopRun"), goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/metrics.(*meterArbiter).tick"), goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/consensus/ethash.(*remoteSealer).loop"), } -} \ No newline at end of file +} diff --git a/go.mod b/go.mod index e9c010d388..5e3a8b81e9 100644 --- a/go.mod +++ b/go.mod @@ -60,6 +60,7 @@ require ( github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 github.com/olekukonko/tablewriter v0.0.5 github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 + github.com/polyfloyd/go-errorlint v0.0.0-20220510153142-36539f2bdac3 // indirect github.com/prometheus/tsdb v0.7.1 github.com/quasilyte/gogrep v0.0.0-20220429205452-5e2753ee08f9 // indirect github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect diff --git a/go.sum b/go.sum index 3aba63edb5..b5278c5112 100644 --- a/go.sum +++ b/go.sum @@ -429,6 +429,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v0.0.0-20220510153142-36539f2bdac3 h1:GhmKVnwiethXkJVYqq/kdcw3+u2TIuhPwmHhB+ehpIQ= +github.com/polyfloyd/go-errorlint v0.0.0-20220510153142-36539f2bdac3/go.mod h1:KZy4xxPJyy88/gldCe5OdW6OQRtNO3EZE7hXzmnebgA= github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -689,6 +691,7 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5 golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= From 594c9ab23f74d9f53241e4efc5a683280a9fcc2a Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 12 May 2022 18:04:04 +0300 Subject: [PATCH 070/190] vs master --- .github/workflows/ci.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c23dc68bf2..0cb5167156 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,9 @@ jobs: runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - - run: git submodule update --init --recursive --force + - run: | + git submodule update --init --recursive --force + git fetch --no-tags --prune --depth=1 origin +refs/heads/master:refs/remotes/origin/master - uses: actions/setup-go@v3 with: go-version: 1.18.x @@ -54,14 +56,13 @@ jobs: # echo >&2 "Reproducible build broken"; cat bor1.sha256; cat bor2.sha256; exit 1 # fi + - name: Golang-ci install + if: runner.os == 'Linux' + run: make lintci-deps + - name: Lint if: runner.os == 'Linux' - uses: golangci/golangci-lint-action@v3 - with: - version: v1.46 - skip-pkg-cache: true - skip-build-cache: true - only-new-issues: true + run: make lint - name: Test run: make test From a57d21166a8e08a6d9c6a58a69e65e6914342bd8 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 12 May 2022 18:27:03 +0300 Subject: [PATCH 071/190] leaks --- .github/workflows/ci.yml | 10 ++++++---- common/leak/ignore_list.go | 8 ++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0cb5167156..6060ca77cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,13 +25,19 @@ jobs: - run: | git submodule update --init --recursive --force git fetch --no-tags --prune --depth=1 origin +refs/heads/master:refs/remotes/origin/master + - uses: actions/setup-go@v3 with: go-version: 1.18.x + - name: Install dependencies on Linux if: runner.os == 'Linux' run: sudo apt update && sudo apt install build-essential + - name: Golang-ci install + if: runner.os == 'Linux' + run: make lintci-deps + - uses: actions/cache@v3 with: path: | @@ -56,10 +62,6 @@ jobs: # echo >&2 "Reproducible build broken"; cat bor1.sha256; cat bor2.sha256; exit 1 # fi - - name: Golang-ci install - if: runner.os == 'Linux' - run: make lintci-deps - - name: Lint if: runner.os == 'Linux' run: make lint diff --git a/common/leak/ignore_list.go b/common/leak/ignore_list.go index e43e1c0393..ed61342a06 100644 --- a/common/leak/ignore_list.go +++ b/common/leak/ignore_list.go @@ -4,10 +4,18 @@ import "go.uber.org/goleak" func IgnoreList() []goleak.Option { return []goleak.Option{ + // a list of goroutne leaks that goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/core.(*txSenderCacher).cache"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*recursiveTree).dispatch"), + goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*nonrecursiveTree).dispatch"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify._Cfunc_CFRunLoopRun"), + + // todo: this leaks should be fixed goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/metrics.(*meterArbiter).tick"), goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/consensus/ethash.(*remoteSealer).loop"), + goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/core.(*BlockChain).updateFutureBlocks"), + goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/core/state/snapshot.(*diskLayer).generate"), + goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/accounts/abi/bind/backends.nullSubscription.func1"), + goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/eth/filters.(*EventSystem).eventLoop"), } } From b05c336a831bc1e9466d90da7c70ab4183268bfb Mon Sep 17 00:00:00 2001 From: Evgeny Danilenko <6655321@bk.ru> Date: Thu, 12 May 2022 18:52:40 +0300 Subject: [PATCH 072/190] fmt --- common/leak/ignore_list.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/leak/ignore_list.go b/common/leak/ignore_list.go index ed61342a06..4f0fe62e9b 100644 --- a/common/leak/ignore_list.go +++ b/common/leak/ignore_list.go @@ -4,7 +4,7 @@ import "go.uber.org/goleak" func IgnoreList() []goleak.Option { return []goleak.Option{ - // a list of goroutne leaks that + // a list of goroutne leaks that hard to fix due to external dependencies or too big refactoring needed goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/core.(*txSenderCacher).cache"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*recursiveTree).dispatch"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*nonrecursiveTree).dispatch"), From 39d943d22e7ffa31af1ebb65334cc7dab13242af Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 09:11:17 +0300 Subject: [PATCH 073/190] stable tests --- Makefile | 2 +- common/leak/ignore_list.go | 2 ++ metrics/sample_test.go | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index bce03bf5ef..313fabb134 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ GIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD) GIT_TAG ?= $(shell git describe --tags `git rev-list --tags="v*" --max-count=1`) PACKAGE = github.com/ethereum/go-ethereum -GO_FLAGS += -trimpath -buildvcs=false +GO_FLAGS += -buildvcs=false GO_FLAGS += -ldflags "-X ${PACKAGE}/params.GitCommit=${GIT_COMMIT} -X ${PACKAGE}/params.GitBranch=${GIT_BRANCH} -X ${PACKAGE}/params.GitTag=${GIT_TAG}" TESTALL = $$(go list ./... | grep -v go-ethereum/cmd/) diff --git a/common/leak/ignore_list.go b/common/leak/ignore_list.go index 4f0fe62e9b..56134dcabc 100644 --- a/common/leak/ignore_list.go +++ b/common/leak/ignore_list.go @@ -7,7 +7,9 @@ func IgnoreList() []goleak.Option { // a list of goroutne leaks that hard to fix due to external dependencies or too big refactoring needed goleak.IgnoreTopFunction("github.com/ethereum/go-ethereum/core.(*txSenderCacher).cache"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*recursiveTree).dispatch"), + goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*recursiveTree).internal"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*nonrecursiveTree).dispatch"), + goleak.IgnoreTopFunction("github.com/rjeczalik/notify.(*nonrecursiveTree).internal"), goleak.IgnoreTopFunction("github.com/rjeczalik/notify._Cfunc_CFRunLoopRun"), // todo: this leaks should be fixed diff --git a/metrics/sample_test.go b/metrics/sample_test.go index c9168d3e82..d675862e84 100644 --- a/metrics/sample_test.go +++ b/metrics/sample_test.go @@ -244,6 +244,7 @@ func TestUniformSampleIncludesTail(t *testing.T) { } func TestUniformSampleSnapshot(t *testing.T) { + rand.Seed(1) s := NewUniformSample(100) for i := 1; i <= 10000; i++ { s.Update(int64(i)) @@ -339,6 +340,9 @@ func TestUniformSampleConcurrentUpdateCount(t *testing.T) { if testing.Short() { t.Skip("skipping in short mode") } + + rand.Seed(1) + s := NewUniformSample(100) for i := 0; i < 100; i++ { s.Update(int64(i)) From 81ede2f6d25e52e3d3e1e195625046250e885793 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 09:25:37 +0300 Subject: [PATCH 074/190] where to run --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6060ca77cf..a7e78112c2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: pull_request: branches: - master - types: [opened, synchronize, closed] + types: [closed] concurrency: group: build-${{ github.event.pull_request.number || github.ref }} @@ -15,7 +15,7 @@ concurrency: jobs: tests: - if: (!(github.event.action == 'closed' && github.event.pull_request.merged != true)) + if: (github.event.action != 'closed' || github.event.pull_request.merged == true) strategy: matrix: os: [ ubuntu-20.04, macos-11 ] # list of os: https://github.com/actions/virtual-environments From 485762a28d013d5c94be6daebf5f3cb2492748c9 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 09:35:31 +0300 Subject: [PATCH 075/190] where to run --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a7e78112c2..fc170c3871 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,8 +6,7 @@ on: - "!master" pull_request: branches: - - master - types: [closed] + - "**" concurrency: group: build-${{ github.event.pull_request.number || github.ref }} From 3268c143cdbc8fc51668334e9955e86028896c51 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 09:36:02 +0300 Subject: [PATCH 076/190] where to run --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc170c3871..14cf78dfc1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,8 @@ on: - "!master" pull_request: branches: - - "**" + - master + types: [synchronize, closed] concurrency: group: build-${{ github.event.pull_request.number || github.ref }} From 276e82b16c8e56ebbb15d7680d045da74c2aaba8 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 09:36:40 +0300 Subject: [PATCH 077/190] where to run1 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14cf78dfc1..03037bb2e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ on: - "!master" pull_request: branches: - - master + - "master" types: [synchronize, closed] concurrency: From a8a9229c341bbb3e984ac0016d744d3428bedc4d Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 09:37:23 +0300 Subject: [PATCH 078/190] where to run2 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03037bb2e3..ca4e9671fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: pull_request: branches: - "master" - types: [synchronize, closed] + types: [opened, synchronize, closed] concurrency: group: build-${{ github.event.pull_request.number || github.ref }} From 5a3eb08a57c64ee41c6ede4271dcfc1f290f15ce Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 09:38:43 +0300 Subject: [PATCH 079/190] where to run3 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca4e9671fa..2015b06777 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: pull_request: branches: - "master" - types: [opened, synchronize, closed] + types: [closed] concurrency: group: build-${{ github.event.pull_request.number || github.ref }} From 95bfcdc5f4a7af6576a4c520a8f7ca3da284286e Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 10:06:11 +0300 Subject: [PATCH 080/190] macos tests --- consensus/ethash/sealer_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/ethash/sealer_test.go b/consensus/ethash/sealer_test.go index c34e76aec2..a9e96af866 100644 --- a/consensus/ethash/sealer_test.go +++ b/consensus/ethash/sealer_test.go @@ -70,7 +70,7 @@ func TestRemoteNotify(t *testing.T) { if want := common.BytesToHash(target.Bytes()).Hex(); work[2] != want { t.Errorf("work packet target mismatch: have %s, want %s", work[2], want) } - case <-time.After(3 * time.Second): + case <-time.After(5 * time.Second): t.Fatalf("notification timed out") } } From e7870978744ffd675feeb1106a8d5ef4e63b7628 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 13 May 2022 18:41:27 +0300 Subject: [PATCH 081/190] restore codecov --- .github/workflows/ci.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2015b06777..9ee76fca61 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,4 +73,9 @@ jobs: # run: make test-race - name: test-integration - run: make test-integration \ No newline at end of file + run: make test-integration + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 + with: + file: ./cover.out \ No newline at end of file From 52647fcd88ec4b92b76682359dc38dbac81a485e Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Mon, 16 May 2022 10:12:09 +0300 Subject: [PATCH 082/190] run on forked branches --- .github/workflows/ci.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ee76fca61..59fa866165 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,11 +3,10 @@ on: push: branches: - "**" - - "!master" pull_request: branches: - - "master" - types: [closed] + - "**" + types: [opened, synchronize] concurrency: group: build-${{ github.event.pull_request.number || github.ref }} From 30dd11a183e0e06c92ca0fa3b081001af5de8b45 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Mon, 16 May 2022 10:35:57 +0300 Subject: [PATCH 083/190] run on forked branches --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 59fa866165..79dba640ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,10 +3,13 @@ on: push: branches: - "**" + - "!main" pull_request: branches: - "**" - types: [opened, synchronize] + types: [opened, synchronize, closed] + + workflow_dispatch: concurrency: group: build-${{ github.event.pull_request.number || github.ref }} From 91559f39556f73cadfbd6984450f579d1f941603 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Mon, 16 May 2022 10:47:33 +0300 Subject: [PATCH 084/190] run on forked branches --- .github/workflows/ci.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 79dba640ca..9d51c4f67b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,13 +3,6 @@ on: push: branches: - "**" - - "!main" - pull_request: - branches: - - "**" - types: [opened, synchronize, closed] - - workflow_dispatch: concurrency: group: build-${{ github.event.pull_request.number || github.ref }} From 8de6903eeeb4ca0afc9e16daa4a097a7cd267e54 Mon Sep 17 00:00:00 2001 From: Jerry Date: Mon, 16 May 2022 14:54:35 -0700 Subject: [PATCH 085/190] Implement and enable 'unlock' flag --- internal/cli/server/config.go | 32 +++++++++++++++++++++++ internal/cli/server/config_test.go | 7 +++++ internal/cli/server/testdata/password.txt | 2 ++ 3 files changed, 41 insertions(+) create mode 100644 internal/cli/server/testdata/password.txt diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index a5e255ad48..e74964606e 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -663,6 +663,25 @@ func (c *Config) buildEth(stack *node.Node) (*ethconfig.Config, error) { } } + // unlock accounts + if len(c.Accounts.Unlock) > 0 { + if !stack.Config().InsecureUnlockAllowed && stack.Config().ExtRPCEnabled() { + return nil, fmt.Errorf("Account unlock with HTTP access is forbidden!") + } + ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + passwords, err := MakePasswordListFromFile(c.Accounts.PasswordFile) + if err != nil { + return nil, err + } + if len(passwords) < len(c.Accounts.Unlock) { + return nil, fmt.Errorf("Number of passwords provided (%v) is less than number of accounts (%v) to unlock", + len(passwords), len(c.Accounts.Unlock)) + } + for i, account := range c.Accounts.Unlock { + ks.Unlock(accounts.Account{Address: common.HexToAddress(account)}, passwords[i]) + } + } + // update for developer mode if c.Developer.Enabled { // Get a keystore @@ -990,3 +1009,16 @@ func Hostname() string { } return hostname } + +func MakePasswordListFromFile(path string) ([]string, error) { + text, err := ioutil.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("Failed to read password file: %v", err) + } + lines := strings.Split(string(text), "\n") + // Sanitise DOS line endings. + for i := range lines { + lines[i] = strings.TrimRight(lines[i], "\r") + } + return lines, nil +} diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index 6f5f9ff97d..4e6f3ef499 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -153,3 +153,10 @@ func TestConfigBootnodesDefault(t *testing.T) { assert.Len(t, cfg.P2P.BootstrapNodes, 1) }) } + +func TestMakePasswordListFromFile(t *testing.T) { + t.Run("ReadPasswordFile", func(t *testing.T) { + result, _ := MakePasswordListFromFile("./testdata/password.txt") + assert.Equal(t, []string{"test1", "test2"}, result) + }) +} diff --git a/internal/cli/server/testdata/password.txt b/internal/cli/server/testdata/password.txt new file mode 100644 index 0000000000..1827ffa521 --- /dev/null +++ b/internal/cli/server/testdata/password.txt @@ -0,0 +1,2 @@ +test1 +test2 \ No newline at end of file From 3dd7f59531e875ca3f22c20d30a0933730fe311a Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Tue, 17 May 2022 19:23:57 +0300 Subject: [PATCH 086/190] more tests --- eth/downloader/downloader.go | 17 ++- eth/downloader/downloader_test.go | 173 ++++++++++++++++++----- eth/downloader/whitelist/service.go | 39 ++--- eth/downloader/whitelist/service_test.go | 43 +++--- 4 files changed, 200 insertions(+), 72 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 209d039f90..4420ca2c1b 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -342,13 +342,11 @@ func (d *Downloader) LegacySync(id string, head common.Hash, td, ttd *big.Int, m case nil, errBusy, errCanceled: return err } - if errors.Is(err, whitelist.ErrCheckpointMismatch) { - // TODO: what better can be done here? - log.Warn("Mismatch in last checkpointed block", "peer", id, "err", err) - } + if errors.Is(err, errInvalidChain) || errors.Is(err, errBadPeer) || errors.Is(err, errTimeout) || errors.Is(err, errStallingPeer) || errors.Is(err, errUnsyncedPeer) || errors.Is(err, errEmptyHeaderSet) || - errors.Is(err, errPeersUnavailable) || errors.Is(err, errTooOld) || errors.Is(err, errInvalidAncestor) { + errors.Is(err, errPeersUnavailable) || errors.Is(err, errTooOld) || errors.Is(err, errInvalidAncestor) || + errors.Is(err, whitelist.ErrCheckpointMismatch) { log.Warn("Synchronisation failed, dropping peer", "peer", id, "err", err) if d.dropPeer == nil { // The dropPeer method is nil when `--copydb` is used for a local copy. @@ -359,10 +357,17 @@ func (d *Downloader) LegacySync(id string, head common.Hash, td, ttd *big.Int, m } return err } + if errors.Is(err, ErrMergeTransition) { return err // This is an expected fault, don't keep printing it in a spin-loop } - log.Warn("Synchronisation failed, retrying", "err", err) + + if errors.Is(err, whitelist.ErrNoRemoteCheckoint) { + log.Warn("Doesn't have remote checkpoint yet", "peer", id, "err", err) + } + + log.Warn("Synchronisation failed, retrying", "peer", id, "err", err) + return err } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index fa6059b781..048e5fa190 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -82,6 +82,10 @@ func newTester() *downloadTester { return tester } +func (dl *downloadTester) setWhitelist(w ChainValidator) { + dl.downloader.ChainValidator = w +} + // terminate aborts any operations on the embedded downloader and releases all // held resources. func (dl *downloadTester) terminate() { @@ -158,7 +162,7 @@ func (dlp *downloadTesterPeer) Head() (common.Hash, *big.Int) { } func unmarshalRlpHeaders(rlpdata []rlp.RawValue) []*types.Header { - var headers = make([]*types.Header, len(rlpdata)) + headers := make([]*types.Header, len(rlpdata)) for i, data := range rlpdata { var h types.Header if err := rlp.DecodeBytes(data, &h); err != nil { @@ -620,9 +624,11 @@ func testBoundedForkedSync(t *testing.T, protocol uint, mode SyncMode) { func TestBoundedHeavyForkedSync66Full(t *testing.T) { testBoundedHeavyForkedSync(t, eth.ETH66, FullSync) } + func TestBoundedHeavyForkedSync66Snap(t *testing.T) { testBoundedHeavyForkedSync(t, eth.ETH66, SnapSync) } + func TestBoundedHeavyForkedSync66Light(t *testing.T) { testBoundedHeavyForkedSync(t, eth.ETH66, LightSync) } @@ -714,7 +720,7 @@ func testMultiProtoSync(t *testing.T, protocol uint, mode SyncMode) { // Create peers of every type tester.newPeer("peer 66", eth.ETH66, chain.blocks[1:]) - //tester.newPeer("peer 65", eth.ETH67, chain.blocks[1:) + // tester.newPeer("peer 65", eth.ETH67, chain.blocks[1:) // Synchronise with the requested peer and make sure all blocks were retrieved if err := tester.sync(fmt.Sprintf("peer %d", protocol), nil, mode); err != nil { @@ -916,9 +922,11 @@ func testInvalidHeaderRollback(t *testing.T, protocol uint, mode SyncMode) { func TestHighTDStarvationAttack66Full(t *testing.T) { testHighTDStarvationAttack(t, eth.ETH66, FullSync) } + func TestHighTDStarvationAttack66Snap(t *testing.T) { testHighTDStarvationAttack(t, eth.ETH66, SnapSync) } + func TestHighTDStarvationAttack66Light(t *testing.T) { testHighTDStarvationAttack(t, eth.ETH66, LightSync) } @@ -1271,36 +1279,45 @@ func TestRemoteHeaderRequestSpan(t *testing.T) { expected []int }{ // Remote is way higher. We should ask for the remote head and go backwards - {1500, 1000, + { + 1500, 1000, []int{1323, 1339, 1355, 1371, 1387, 1403, 1419, 1435, 1451, 1467, 1483, 1499}, }, - {15000, 13006, + { + 15000, 13006, []int{14823, 14839, 14855, 14871, 14887, 14903, 14919, 14935, 14951, 14967, 14983, 14999}, }, // Remote is pretty close to us. We don't have to fetch as many - {1200, 1150, + { + 1200, 1150, []int{1149, 1154, 1159, 1164, 1169, 1174, 1179, 1184, 1189, 1194, 1199}, }, // Remote is equal to us (so on a fork with higher td) // We should get the closest couple of ancestors - {1500, 1500, + { + 1500, 1500, []int{1497, 1499}, }, // We're higher than the remote! Odd - {1000, 1500, + { + 1000, 1500, []int{997, 999}, }, // Check some weird edgecases that it behaves somewhat rationally - {0, 1500, + { + 0, 1500, []int{0, 2}, }, - {6000000, 0, + { + 6000000, 0, []int{5999823, 5999839, 5999855, 5999871, 5999887, 5999903, 5999919, 5999935, 5999951, 5999967, 5999983, 5999999}, }, - {0, 0, + { + 0, 0, []int{0, 2}, }, } + reqs := func(from, count, span int) []int { var r []int num := from @@ -1310,32 +1327,38 @@ func TestRemoteHeaderRequestSpan(t *testing.T) { } return r } + for i, tt := range testCases { - from, count, span, max := calculateRequestSpan(tt.remoteHeight, tt.localHeight) - data := reqs(int(from), count, span) + i := i + tt := tt - if max != uint64(data[len(data)-1]) { - t.Errorf("test %d: wrong last value %d != %d", i, data[len(data)-1], max) - } - failed := false - if len(data) != len(tt.expected) { - failed = true - t.Errorf("test %d: length wrong, expected %d got %d", i, len(tt.expected), len(data)) - } else { - for j, n := range data { - if n != tt.expected[j] { - failed = true - break + t.Run("", func(t *testing.T) { + from, count, span, max := calculateRequestSpan(tt.remoteHeight, tt.localHeight) + data := reqs(int(from), count, span) + + if max != uint64(data[len(data)-1]) { + t.Errorf("test %d: wrong last value %d != %d", i, data[len(data)-1], max) + } + failed := false + if len(data) != len(tt.expected) { + failed = true + t.Errorf("test %d: length wrong, expected %d got %d", i, len(tt.expected), len(data)) + } else { + for j, n := range data { + if n != tt.expected[j] { + failed = true + break + } } } - } - if failed { - res := strings.Replace(fmt.Sprint(data), " ", ",", -1) - exp := strings.Replace(fmt.Sprint(tt.expected), " ", ",", -1) - t.Logf("got: %v\n", res) - t.Logf("exp: %v\n", exp) - t.Errorf("test %d: wrong values", i) - } + if failed { + res := strings.Replace(fmt.Sprint(data), " ", ",", -1) + exp := strings.Replace(fmt.Sprint(tt.expected), " ", ",", -1) + t.Logf("got: %v\n", res) + t.Logf("exp: %v\n", exp) + t.Errorf("test %d: wrong values", i) + } + }) } } @@ -1371,3 +1394,89 @@ func testCheckpointEnforcement(t *testing.T, protocol uint, mode SyncMode) { assertOwnChain(t, tester, len(chain.blocks)) } } + +type whitelistFake struct { + err error + res bool +} + +func newWhitelistFake(res bool, err error) *whitelistFake { + return &whitelistFake{err, res} +} + +func (w *whitelistFake) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) { + return w.res, w.err +} + +func (w *whitelistFake) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) {} + +func TestFakedSyncProgress66Whitelist(t *testing.T) { + protocol := uint(eth.ETH66) + mode := FullSync + tester := newTester() + defer tester.terminate() + + chain := testChainBase.shorten(blockCacheMaxItems - 15) + + // Set a sync init hook to catch progress changes + starting := make(chan struct{}) + progress := make(chan struct{}) + tester.downloader.syncInitHook = func(_, _ uint64) { + starting <- struct{}{} + <-progress + } + checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) + + // Create and sync with an attacker that promises a higher chain than available. + attacker := tester.newPeer("attack", protocol, chain.blocks[1:]) + numMissing := 5 + for i := len(chain.blocks) - 2; i > len(chain.blocks)-numMissing; i-- { + attacker.withholdHeaders[chain.blocks[i].Hash()] = struct{}{} + } + attacker.dl.setWhitelist(newWhitelistFake(false, whitelist.ErrCheckpointMismatch)) + + pending := new(sync.WaitGroup) + pending.Add(1) + go func() { + defer pending.Done() + if err := tester.sync("attack", nil, mode); err == nil { + panic("succeeded attacker synchronisation") + } + }() + <-starting + + checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ + HighestBlock: uint64(len(chain.blocks) - 1), + }) + progress <- struct{}{} + pending.Wait() + + afterFailedSync := tester.downloader.Progress() + + // Synchronise with a good peer and check that the progress height has been reduced to + // the true value. + validChain := chain.shorten(len(chain.blocks) - numMissing) + tester.newPeer("valid", protocol, validChain.blocks[1:]) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("valid", nil, mode); err != nil { + panic(fmt.Sprintf("failed to synchronise blocks: %v", err)) + } + }() + <-starting + + checkProgress(t, tester.downloader, "completing", ethereum.SyncProgress{ + CurrentBlock: afterFailedSync.CurrentBlock, + HighestBlock: uint64(len(validChain.blocks) - 1), + }) + // Check final progress after successful sync. + progress <- struct{}{} + pending.Wait() + + checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ + CurrentBlock: uint64(len(validChain.blocks) - 1), + HighestBlock: uint64(len(validChain.blocks) - 1), + }) +} diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go index 7889429c87..4e23c4095b 100644 --- a/eth/downloader/whitelist/service.go +++ b/eth/downloader/whitelist/service.go @@ -2,6 +2,7 @@ package whitelist import ( "errors" + "fmt" "sync" "github.com/ethereum/go-ethereum/common" @@ -9,10 +10,6 @@ import ( "github.com/ethereum/go-ethereum/log" ) -var ( - ErrCheckpointMismatch = errors.New("checkpoint mismatch") -) - // Checkpoint whitelist type Service struct { m sync.RWMutex @@ -29,6 +26,11 @@ func NewService(maxCapacity uint) *Service { } } +var ( + ErrCheckpointMismatch = errors.New("checkpoint mismatch") + ErrNoRemoteCheckoint = errors.New("remote peer doesn't have a checkoint") +) + // IsValidChain checks if the chain we're about to receive from this peer is valid or not // in terms of reorgs. We won't reorg beyond the last bor checkpoint submitted to mainchain. func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) { @@ -36,7 +38,7 @@ func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber // we're storing in `checkpointWhitelist` with the peer's block. // Check for availaibility of the last checkpointed block. - // This can be also be empty if our heimdall is not responsing + // This can be also be empty if our heimdall is not responding // or we're running without it. if len(w.checkpointWhitelist) == 0 { // worst case, we don't have the checkpoints in memory @@ -49,9 +51,11 @@ func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber // todo: we can extract this as an interface and mock as well or just test IsValidChain in isolation from downloader passing fake fetchHeadersByNumber functions headers, hashes, err := fetchHeadersByNumber(lastCheckpointBlockNum, 1, 0, false) - if err != nil || len(headers) == 0 { - // TODO: what better can be done here? - return true, nil + if err != nil { + return false, fmt.Errorf("%w: last checkpoint %d, err %v", ErrNoRemoteCheckoint, lastCheckpointBlockNum, err) + } + if len(headers) == 0 { + return true, fmt.Errorf("%w: last checkpoint %d", ErrNoRemoteCheckoint, lastCheckpointBlockNum) } reqBlockNum := headers[0].Number.Uint64() @@ -69,16 +73,16 @@ func (w *Service) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash w.m.Lock() defer w.m.Unlock() - w.EnqueueCheckpointWhitelist(endBlockNum, endBlockHash) + w.enqueueCheckpointWhitelist(endBlockNum, endBlockHash) // If size of checkpoint whitelist map is greater than 10, remove the oldest entry. - if len(w.GetCheckpointWhitelist()) > int(w.maxCapacity) { - w.DequeueCheckpointWhitelist() + if w.length() > int(w.maxCapacity) { + w.dequeueCheckpointWhitelist() } } // PurgeWhitelistMap purges data from checkpoint whitelist map -func (w *Service) PurgeWhitelistMap() error { +func (w *Service) purgeWhitelistMap() error { for k := range w.checkpointWhitelist { delete(w.checkpointWhitelist, k) } @@ -86,7 +90,7 @@ func (w *Service) PurgeWhitelistMap() error { } // EnqueueWhitelistBlock enqueues blockNumber, blockHash to the checkpoint whitelist map -func (w *Service) EnqueueCheckpointWhitelist(key uint64, val common.Hash) { +func (w *Service) enqueueCheckpointWhitelist(key uint64, val common.Hash) { if _, ok := w.checkpointWhitelist[key]; !ok { log.Debug("Enqueing new checkpoint whitelist", "block number", key, "block hash", val) @@ -96,15 +100,16 @@ func (w *Service) EnqueueCheckpointWhitelist(key uint64, val common.Hash) { } // DequeueWhitelistBlock dequeues block, blockhash from the checkpoint whitelist map -func (w *Service) DequeueCheckpointWhitelist() { +func (w *Service) dequeueCheckpointWhitelist() { if len(w.checkpointOrder) > 0 { log.Debug("Dequeing checkpoint whitelist", "block number", w.checkpointOrder[0], "block hash", w.checkpointWhitelist[w.checkpointOrder[0]]) + delete(w.checkpointWhitelist, w.checkpointOrder[0]) w.checkpointOrder = w.checkpointOrder[1:] } } -// GetCheckpointWhitelist returns the checkpoints whitelisted. -func (w *Service) GetCheckpointWhitelist() map[uint64]common.Hash { - return w.checkpointWhitelist +// length returns the len of the whitelist. +func (w *Service) length() int { + return len(w.checkpointWhitelist) } diff --git a/eth/downloader/whitelist/service_test.go b/eth/downloader/whitelist/service_test.go index db17af8ba8..de1e902e99 100644 --- a/eth/downloader/whitelist/service_test.go +++ b/eth/downloader/whitelist/service_test.go @@ -25,13 +25,13 @@ func TestWhitelistCheckpoint(t *testing.T) { s := NewMockService(10) for i := 0; i < 10; i++ { - s.EnqueueCheckpointWhitelist(uint64(i), common.Hash{}) + s.enqueueCheckpointWhitelist(uint64(i), common.Hash{}) } - assert.Equal(t, len(s.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") + assert.Equal(t, s.length(), 10, "expected 10 items in whitelist") - s.EnqueueCheckpointWhitelist(11, common.Hash{}) - s.DequeueCheckpointWhitelist() - assert.Equal(t, len(s.GetCheckpointWhitelist()), 10, "expected 10 items in whitelist") + s.enqueueCheckpointWhitelist(11, common.Hash{}) + s.dequeueCheckpointWhitelist() + assert.Equal(t, s.length(), 10, "expected 10 items in whitelist") } // TestIsValidChain checks che IsValidChain function in isolation @@ -43,23 +43,38 @@ func TestIsValidChain(t *testing.T) { // case1: no checkpoint whitelist, should consider the chain as valid res, err := s.IsValidChain(nil, nil) - assert.Equal(t, res, true, "expected chain to be valid") assert.NilError(t, err, "expected no error") + assert.Equal(t, res, true, "expected chain to be valid") // add checkpoint entries and mock fetchHeadersByNumber function s.ProcessCheckpoint(uint64(0), common.Hash{}) s.ProcessCheckpoint(uint64(1), common.Hash{}) - assert.Equal(t, len(s.GetCheckpointWhitelist()), 2, "expected 2 items in whitelist") + + assert.Equal(t, s.length(), 2, "expected 2 items in whitelist") // create a false function, returning absolutely nothing falseFetchHeadersByNumber := func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { return nil, nil, nil } + // case2: false fetchHeadersByNumber function provided, should consider the chain as valid + res, err = s.IsValidChain(nil, falseFetchHeadersByNumber) + if err == nil { + t.Fatal("expected error, got nil") + } + + if !errors.Is(err, ErrNoRemoteCheckoint) { + t.Fatalf("expected error ErrNoRemoteCheckoint, got %v", err) + } + + assert.Equal(t, res, true, "expected chain to be valid") + + // case3: correct fetchHeadersByNumber function provided, should consider the chain as valid // create a mock function, returning a the required header - fetchHeadersByNumber := func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + fetchHeadersByNumber := func(number uint64, _ int, _ int, _ bool) ([]*types.Header, []common.Hash, error) { hash := common.Hash{} header := types.Header{Number: big.NewInt(0)} + switch number { case 0: return []*types.Header{&header}, []common.Hash{hash}, nil @@ -74,23 +89,17 @@ func TestIsValidChain(t *testing.T) { } } - // case2: false fetchHeadersByNumber function provided, should consider the chain as valid - res, err = s.IsValidChain(nil, falseFetchHeadersByNumber) - assert.Equal(t, res, true, "expected chain to be valid") - assert.NilError(t, err, "expected no error") - - // case3: correct fetchHeadersByNumber function provided, should consider the chain as valid res, err = s.IsValidChain(nil, fetchHeadersByNumber) - assert.Equal(t, res, true, "expected chain to be valid") assert.NilError(t, err, "expected no error") + assert.Equal(t, res, true, "expected chain to be valid") // add one more checkpoint whitelist entry s.ProcessCheckpoint(uint64(2), common.Hash{}) - assert.Equal(t, len(s.GetCheckpointWhitelist()), 3, "expected 3 items in whitelist") + assert.Equal(t, s.length(), 3, "expected 3 items in whitelist") // case4: correct fetchHeadersByNumber function provided with wrong header // for block number 2. Should consider the chain as invalid and throw an error res, err = s.IsValidChain(nil, fetchHeadersByNumber) - assert.Equal(t, res, false, "expected chain to be invalid") assert.Equal(t, err, ErrCheckpointMismatch, "expected checkpoint mismatch error") + assert.Equal(t, res, false, "expected chain to be invalid") } From af2b5e06b097e314674531e0c08ade53384c9957 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Tue, 17 May 2022 19:24:16 +0300 Subject: [PATCH 087/190] wip --- eth/downloader/downloader_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 048e5fa190..7250a656f4 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -1425,7 +1425,7 @@ func TestFakedSyncProgress66Whitelist(t *testing.T) { starting <- struct{}{} <-progress } - checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) + checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) // FIXME: WIP deadlock // Create and sync with an attacker that promises a higher chain than available. attacker := tester.newPeer("attack", protocol, chain.blocks[1:]) From 3aaf6bc13e30771ff35bfcfd04759155c2e65939 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Tue, 17 May 2022 19:25:59 +0300 Subject: [PATCH 088/190] cherry-pick from Jerry's Chen branch --- .github/workflows/ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d51c4f67b..fc2445e0f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,12 @@ name: CI -on: +=on: push: + branches: + - "master" + pull_request: branches: - "**" + types: [opened, synchronize] concurrency: group: build-${{ github.event.pull_request.number || github.ref }} From 2930d04428f649d93971e1ccad6e9a2c10665a13 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Tue, 17 May 2022 19:28:08 +0300 Subject: [PATCH 089/190] misspell --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc2445e0f4..7db530c346 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ name: CI -=on: +on: push: branches: - "master" From c02e2cbb935429003c5ef230631fcc3ed7a3e221 Mon Sep 17 00:00:00 2001 From: Jerry Date: Tue, 17 May 2022 17:07:14 -0700 Subject: [PATCH 090/190] Rename whitelist to requiredblocks --- docs/cli/bootnode.md | 2 +- docs/cli/server.md | 6 +++--- internal/cli/server/config.go | 22 +++++++++++----------- internal/cli/server/config_test.go | 8 ++++---- internal/cli/server/flags.go | 4 ++-- internal/cli/server/testdata/simple.hcl | 2 +- internal/cli/server/testdata/simple.json | 2 +- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/cli/bootnode.md b/docs/cli/bootnode.md index 3e60252341..48e933a934 100644 --- a/docs/cli/bootnode.md +++ b/docs/cli/bootnode.md @@ -14,4 +14,4 @@ - ```save-key```: path to save the ecdsa private key -- ```dry-run``` \ No newline at end of file +- ```dry-run```: validates parameters and prints bootnode configurations, but does not start bootnode \ No newline at end of file diff --git a/docs/cli/server.md b/docs/cli/server.md index ba6f3389c5..beca2c2fde 100644 --- a/docs/cli/server.md +++ b/docs/cli/server.md @@ -18,7 +18,7 @@ The ```bor server``` command runs the Bor client. - ```gcmode```: Blockchain garbage collection mode ("full", "archive") -- ```whitelist```: Comma separated block number-to-hash mappings to enforce (=) +- ```requiredblocks```: Comma separated block number-to-hash mappings to enforce (=) - ```no-snapshot```: Disables the snapshot-database mode (default = false) @@ -72,7 +72,7 @@ The ```bor server``` command runs the Bor client. - ```cache.preimages```: Enable recording the SHA3/keccak preimages of trie keys -- ```txlookuplimit```: Number of recent blocks to maintain transactions index for (default = about one year, 0 = entire chain) +- ```txlookuplimit```: Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain) ### JsonRPC Options @@ -192,4 +192,4 @@ The ```bor server``` command runs the Bor client. - ```txpool.globalqueue```: Maximum number of non-executable transaction slots for all accounts -- ```txpool.lifetime```: Maximum amount of time non-executable transaction are queued +- ```txpool.lifetime```: Maximum amount of time non-executable transaction are queued \ No newline at end of file diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index a5e255ad48..9457a8a270 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -43,8 +43,8 @@ type Config struct { // Name, or identity of the node Name string `hcl:"name,optional"` - // Whitelist is a list of required (block number, hash) pairs to accept - Whitelist map[string]string `hcl:"whitelist,optional"` + // RequiredBlocks is a list of required (block number, hash) pairs to accept + RequiredBlocks map[string]string `hcl:"requiredblocks,optional"` // LogLevel is the level of the logs to put out LogLevel string `hcl:"log-level,optional"` @@ -380,11 +380,11 @@ type DeveloperConfig struct { func DefaultConfig() *Config { return &Config{ - Chain: "mainnet", - Name: Hostname(), - Whitelist: map[string]string{}, - LogLevel: "INFO", - DataDir: defaultDataDir(), + Chain: "mainnet", + Name: Hostname(), + RequiredBlocks: map[string]string{}, + LogLevel: "INFO", + DataDir: defaultDataDir(), P2P: &P2PConfig{ MaxPeers: 30, MaxPendPeers: 50, @@ -718,17 +718,17 @@ func (c *Config) buildEth(stack *node.Node) (*ethconfig.Config, error) { n.SnapDiscoveryURLs = c.P2P.Discovery.DNS } - // whitelist + // RequiredBlocks { n.PeerRequiredBlocks = map[uint64]common.Hash{} - for k, v := range c.Whitelist { + for k, v := range c.RequiredBlocks { number, err := strconv.ParseUint(k, 0, 64) if err != nil { - return nil, fmt.Errorf("invalid whitelist block number %s: %v", k, err) + return nil, fmt.Errorf("invalid required block number %s: %v", k, err) } var hash common.Hash if err = hash.UnmarshalText([]byte(v)); err != nil { - return nil, fmt.Errorf("invalid whitelist hash %s: %v", v, err) + return nil, fmt.Errorf("invalid required block hash %s: %v", v, err) } n.PeerRequiredBlocks[number] = hash } diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index 6f5f9ff97d..6fedd09109 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -24,7 +24,7 @@ func TestConfigMerge(t *testing.T) { c0 := &Config{ Chain: "0", NoSnapshot: true, - Whitelist: map[string]string{ + RequiredBlocks: map[string]string{ "a": "b", }, TxPool: &TxPoolConfig{ @@ -40,7 +40,7 @@ func TestConfigMerge(t *testing.T) { } c1 := &Config{ Chain: "1", - Whitelist: map[string]string{ + RequiredBlocks: map[string]string{ "b": "c", }, P2P: &P2PConfig{ @@ -55,7 +55,7 @@ func TestConfigMerge(t *testing.T) { expected := &Config{ Chain: "1", NoSnapshot: true, - Whitelist: map[string]string{ + RequiredBlocks: map[string]string{ "a": "b", "b": "c", }, @@ -104,7 +104,7 @@ func TestConfigLoadFile(t *testing.T) { assert.NoError(t, err) assert.Equal(t, config, &Config{ DataDir: "./data", - Whitelist: map[string]string{ + RequiredBlocks: map[string]string{ "a": "b", }, P2P: &P2PConfig{ diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index ce93e8c071..cc8f474ecd 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -45,9 +45,9 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.cliConfig.GcMode, }) f.MapStringFlag(&flagset.MapStringFlag{ - Name: "whitelist", + Name: "requiredblocks", Usage: "Comma separated block number-to-hash mappings to enforce (=)", - Value: &c.cliConfig.Whitelist, + Value: &c.cliConfig.RequiredBlocks, }) f.BoolFlag(&flagset.BoolFlag{ Name: "no-snapshot", diff --git a/internal/cli/server/testdata/simple.hcl b/internal/cli/server/testdata/simple.hcl index e276960e6d..5afc091859 100644 --- a/internal/cli/server/testdata/simple.hcl +++ b/internal/cli/server/testdata/simple.hcl @@ -1,6 +1,6 @@ data-dir = "./data" -whitelist = { +requiredblocks = { a = "b" } diff --git a/internal/cli/server/testdata/simple.json b/internal/cli/server/testdata/simple.json index 277f05d105..6270ee6d13 100644 --- a/internal/cli/server/testdata/simple.json +++ b/internal/cli/server/testdata/simple.json @@ -1,6 +1,6 @@ { "data-dir": "./data", - "whitelist": { + "requiredblocks": { "a": "b" }, "p2p": { From b1b0c0e2fb79184136453166427ef74a0378c894 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Wed, 18 May 2022 17:21:51 +0300 Subject: [PATCH 091/190] test ErrCheckpointMismatch --- eth/downloader/downloader_test.go | 72 ++++--------------------------- eth/downloader/queue_test.go | 10 ++++- 2 files changed, 17 insertions(+), 65 deletions(-) diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 7250a656f4..9d847e382e 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -77,7 +77,6 @@ func newTester() *downloadTester { peers: make(map[string]*downloadTesterPeer), } - // TODO: here we can inject a mock tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer, nil, whitelist.NewService(10)) return tester } @@ -1410,73 +1409,20 @@ func (w *whitelistFake) IsValidChain(remoteHeader *types.Header, fetchHeadersByN func (w *whitelistFake) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) {} -func TestFakedSyncProgress66Whitelist(t *testing.T) { +func TestFakedSyncProgress66WhitelistMismatch(t *testing.T) { protocol := uint(eth.ETH66) mode := FullSync + tester := newTester() - defer tester.terminate() + tester.downloader.ChainValidator = newWhitelistFake(true, whitelist.ErrCheckpointMismatch) - chain := testChainBase.shorten(blockCacheMaxItems - 15) + defer tester.terminate() - // Set a sync init hook to catch progress changes - starting := make(chan struct{}) - progress := make(chan struct{}) - tester.downloader.syncInitHook = func(_, _ uint64) { - starting <- struct{}{} - <-progress - } - checkProgress(t, tester.downloader, "pristine", ethereum.SyncProgress{}) // FIXME: WIP deadlock + chainA := testChainForkLightA.blocks + tester.newPeer("light", protocol, chainA[1:]) - // Create and sync with an attacker that promises a higher chain than available. - attacker := tester.newPeer("attack", protocol, chain.blocks[1:]) - numMissing := 5 - for i := len(chain.blocks) - 2; i > len(chain.blocks)-numMissing; i-- { - attacker.withholdHeaders[chain.blocks[i].Hash()] = struct{}{} + // Synchronise with the peer and make sure all blocks were retrieved + if err := tester.sync("light", nil, mode); err == nil { + t.Fatal("succeeded attacker synchronisation") } - attacker.dl.setWhitelist(newWhitelistFake(false, whitelist.ErrCheckpointMismatch)) - - pending := new(sync.WaitGroup) - pending.Add(1) - go func() { - defer pending.Done() - if err := tester.sync("attack", nil, mode); err == nil { - panic("succeeded attacker synchronisation") - } - }() - <-starting - - checkProgress(t, tester.downloader, "initial", ethereum.SyncProgress{ - HighestBlock: uint64(len(chain.blocks) - 1), - }) - progress <- struct{}{} - pending.Wait() - - afterFailedSync := tester.downloader.Progress() - - // Synchronise with a good peer and check that the progress height has been reduced to - // the true value. - validChain := chain.shorten(len(chain.blocks) - numMissing) - tester.newPeer("valid", protocol, validChain.blocks[1:]) - pending.Add(1) - - go func() { - defer pending.Done() - if err := tester.sync("valid", nil, mode); err != nil { - panic(fmt.Sprintf("failed to synchronise blocks: %v", err)) - } - }() - <-starting - - checkProgress(t, tester.downloader, "completing", ethereum.SyncProgress{ - CurrentBlock: afterFailedSync.CurrentBlock, - HighestBlock: uint64(len(validChain.blocks) - 1), - }) - // Check final progress after successful sync. - progress <- struct{}{} - pending.Wait() - - checkProgress(t, tester.downloader, "final", ethereum.SyncProgress{ - CurrentBlock: uint64(len(validChain.blocks) - 1), - HighestBlock: uint64(len(validChain.blocks) - 1), - }) } diff --git a/eth/downloader/queue_test.go b/eth/downloader/queue_test.go index f729def671..428e3cb706 100644 --- a/eth/downloader/queue_test.go +++ b/eth/downloader/queue_test.go @@ -64,8 +64,11 @@ type chainData struct { offset int } -var chain *chainData -var emptyChain *chainData +var ( + chain *chainData + chainLongerFork *chainData + emptyChain *chainData +) func init() { // Create a chain of blocks to import @@ -75,6 +78,9 @@ func init() { blocks, _ = makeChain(targetBlocks, 0, genesis, true) emptyChain = &chainData{blocks, 0} + + chainLongerForkBlocks, _ := makeChain(1024, 0, blocks[len(blocks)-1], false) + chainLongerFork = &chainData{chainLongerForkBlocks, 0} } func (chain *chainData) headers() []*types.Header { From fb46dd8cdf3e5c2f98dd373ab721fa4c867dea75 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 19 May 2022 10:23:34 +0300 Subject: [PATCH 092/190] minor fixes --- eth/backend.go | 11 +++++++++-- eth/handler_bor.go | 12 +++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/eth/backend.go b/eth/backend.go index 727525da55..eb4223bf6a 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -586,10 +586,12 @@ func (s *Ethereum) Start() error { } maxPeers -= s.config.LightPeers } + // Start the networking layer and the light server if requested s.handler.Start(maxPeers) go s.startCheckpointWhitelistService() + return nil } @@ -600,7 +602,12 @@ func (s *Ethereum) startCheckpointWhitelistService() { ticker := time.NewTicker(every) defer ticker.Stop() -Loop: + // first run the checkpoint whitelist + err := s.handleWhitelistCheckpoint() + if err != nil { + log.Warn("the first run", "err", err) + } + for { select { case <-ticker.C: @@ -609,7 +616,7 @@ Loop: log.Warn(err.Error()) } case <-s.closeCh: - break Loop + return } } } diff --git a/eth/handler_bor.go b/eth/handler_bor.go index b87c07f551..02f9918f50 100644 --- a/eth/handler_bor.go +++ b/eth/handler_bor.go @@ -3,6 +3,7 @@ package eth import ( "context" "fmt" + "errors" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -18,32 +19,33 @@ func (h *ethHandler) fetchWhitelistCheckpoint() (uint64, common.Hash, error) { checkpoint, err := h.chain.Engine().(*bor.Bor).HeimdallClient.FetchLatestCheckpoint() if err != nil { log.Debug("Failed to fetch latest checkpoint for whitelisting") - return 0, common.Hash{}, fmt.Errorf("failed to fetch latest checkpoint") + return 0, common.Hash{}, errors.New("failed to fetch latest checkpoint") } // check if we have the checkpoint blocks head := h.ethAPI.BlockNumber() if head < hexutil.Uint64(checkpoint.EndBlock.Uint64()) { log.Debug("Head block behing checkpoint block", "head", head, "checkpoint end block", checkpoint.EndBlock) - return 0, common.Hash{}, fmt.Errorf("missing checkpoint blocks") + return 0, common.Hash{}, errors.New("missing checkpoint blocks") } // verify the root hash of checkpoint roothash, err := h.ethAPI.GetRootHash(context.Background(), checkpoint.StartBlock.Uint64(), checkpoint.EndBlock.Uint64()) if err != nil { log.Debug("Failed to get root hash of checkpoint while whitelisting") - return 0, common.Hash{}, fmt.Errorf("failed to get local root hash") + return 0, common.Hash{}, errors.New("failed to get local root hash") } + if roothash != checkpoint.RootHash.String()[2:] { log.Warn("Checkpoint root hash mismatch while whitelisting", "expected", checkpoint.RootHash.String()[2:], "got", roothash) - return 0, common.Hash{}, fmt.Errorf("checkpoint roothash mismatch") + return 0, common.Hash{}, errors.New("checkpoint roothash mismatch") } // fetch the end checkpoint block hash block, err := h.ethAPI.GetBlockByNumber(context.Background(), rpc.BlockNumber(checkpoint.EndBlock.Uint64()), false) if err != nil { log.Debug("Failed to get end block hash of checkpoint while whitelisting") - return 0, common.Hash{}, fmt.Errorf("failed to get end block") + return 0, common.Hash{}, errors.New("failed to get end block") } hash := fmt.Sprintf("%v", block["hash"]) return checkpoint.EndBlock.Uint64(), common.HexToHash(hash), nil From d4938065c1f21960f5cfad7e89cdaf09cc1e39b8 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 19 May 2022 14:15:35 +0300 Subject: [PATCH 093/190] fix test --- tests/bor/bor_test.go | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index 7d0ca9372b..460b296f31 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -32,10 +32,14 @@ var ( func TestInsertingSpanSizeBlocks(t *testing.T) { init := buildEthereumInstance(t, rawdb.NewMemoryDatabase()) + chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() + _bor := engine.(*bor.Bor) + h, heimdallSpan := getMockedHeimdallClient(t) + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -70,6 +74,7 @@ func TestFetchStateSyncEvents(t *testing.T) { // A. Insert blocks for 0th sprint db := init.ethereum.ChainDb() block := init.genesis.ToBlock(db) + // Insert sprintSize # of blocks so that span is fetched at the start of a new sprint for i := uint64(1); i < sprintSize; i++ { block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) @@ -77,10 +82,8 @@ func TestFetchStateSyncEvents(t *testing.T) { } // B. Before inserting 1st block of the next sprint, mock heimdall deps - // B.1 Mock /bor/span/1 - res, _ := loadSpanFromFile(t) - h := &mocks.IHeimdallClient{} - h.On("FetchWithRetry", spanPath, "").Return(res, nil) + + // B.1 /bor/span/1 // B.2 Mock State Sync events fromID := uint64(1) @@ -91,6 +94,12 @@ func TestFetchStateSyncEvents(t *testing.T) { sample := getSampleEventRecord(t) sample.Time = time.Unix(to-int64(eventCount+1), 0) // last event.Time will be just < to eventRecords := generateFakeStateSyncEvents(sample, eventCount) + + // Mock + res, _ := loadSpanFromFile(t) + h := &mocks.IHeimdallClient{} + h.On("FetchWithRetry", spanPath, "").Return(res, nil) + h.On("FetchLatestCheckpoint").Maybe().Return(mock.Anything, nil) h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) _bor.SetHeimdallClient(h) @@ -111,6 +120,7 @@ func TestFetchStateSyncEvents_2(t *testing.T) { res, _ := loadSpanFromFile(t) h := &mocks.IHeimdallClient{} h.On("FetchWithRetry", spanPath, "").Return(res, nil) + h.On("FetchLatestCheckpoint").Maybe().Return(mock.Anything, nil) // Mock State Sync events // at # sprintSize, events are fetched for [fromID, (block-sprint).Time) @@ -128,6 +138,7 @@ func TestFetchStateSyncEvents_2(t *testing.T) { buildStateEvent(sample, 4, 5), // id = 4, time = 5 buildStateEvent(sample, 6, 4), // id = 6, time = 4 } + h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) _bor.SetHeimdallClient(h) @@ -138,9 +149,12 @@ func TestFetchStateSyncEvents_2(t *testing.T) { block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) insertNewBlock(t, chain, block) } + assert.True(t, h.AssertCalled(t, "FetchWithRetry", spanPath, "")) assert.True(t, h.AssertCalled(t, "FetchStateSyncEvents", fromID, to)) + lastStateID, _ := _bor.GenesisContractsClient.LastStateId(sprintSize) + // state 6 was not written assert.Equal(t, uint64(4), lastStateID.Uint64()) @@ -151,11 +165,13 @@ func TestFetchStateSyncEvents_2(t *testing.T) { buildStateEvent(sample, 5, 7), buildStateEvent(sample, 6, 4), } + h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) for i := sprintSize + 1; i <= spanSize; i++ { block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) insertNewBlock(t, chain, block) } + assert.True(t, h.AssertCalled(t, "FetchStateSyncEvents", fromID, to)) lastStateID, _ = _bor.GenesisContractsClient.LastStateId(spanSize) assert.Equal(t, uint64(6), lastStateID.Uint64()) @@ -165,6 +181,7 @@ func TestOutOfTurnSigning(t *testing.T) { init := buildEthereumInstance(t, rawdb.NewMemoryDatabase()) chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() + _bor := engine.(*bor.Bor) h, _ := getMockedHeimdallClient(t) _bor.SetHeimdallClient(h) @@ -195,8 +212,10 @@ func TestOutOfTurnSigning(t *testing.T) { header := block.Header() header.Time += (bor.CalcProducerDelay(header.Number.Uint64(), expectedSuccessionNumber, init.genesis.Config.Bor) - bor.CalcProducerDelay(header.Number.Uint64(), 0, init.genesis.Config.Bor)) + sign(t, header, signerKey, init.genesis.Config.Bor) block = types.NewBlockWithHeader(header) + _, err = chain.InsertChain([]*types.Block{block}) assert.Equal(t, *err.(*bor.WrongDifficultyError), @@ -205,6 +224,7 @@ func TestOutOfTurnSigning(t *testing.T) { header.Difficulty = new(big.Int).SetUint64(expectedDifficulty) sign(t, header, signerKey, init.genesis.Config.Bor) block = types.NewBlockWithHeader(header) + _, err = chain.InsertChain([]*types.Block{block}) assert.Nil(t, err) } @@ -213,6 +233,7 @@ func TestSignerNotFound(t *testing.T) { init := buildEthereumInstance(t, rawdb.NewMemoryDatabase()) chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() + _bor := engine.(*bor.Bor) h, _ := getMockedHeimdallClient(t) _bor.SetHeimdallClient(h) @@ -241,6 +262,8 @@ func getMockedHeimdallClient(t *testing.T) (*mocks.IHeimdallClient, *bor.Heimdal "FetchStateSyncEvents", mock.AnythingOfType("uint64"), mock.AnythingOfType("int64")).Return([]*bor.EventRecordWithTime{getSampleEventRecord(t)}, nil) + h.On("FetchLatestCheckpoint").Maybe().Return(mock.Anything, nil) + return h, heimdallSpan } @@ -480,7 +503,6 @@ func TestEIP1559Transition(t *testing.T) { tx, _ = types.SignTx(tx, signer, key3) b.AddTx(tx) - }) if n, err := chain.InsertChain(blocks); err != nil { From 89fadee71e1b98822c5af75f6af58c7cd1dd1b90 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 19 May 2022 14:38:49 +0300 Subject: [PATCH 094/190] dont panic --- eth/backend.go | 41 ++++++++++++++++++++++++++++------------- eth/handler_bor.go | 8 +++++--- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/eth/backend.go b/eth/backend.go index eb4223bf6a..8f3930f605 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -184,7 +184,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { // END: Bor changes bcVersion := rawdb.ReadDatabaseVersion(chainDb) - var dbVer = "" + dbVer := "" if bcVersion != nil { dbVer = fmt.Sprintf("%d", *bcVersion) } @@ -598,22 +598,25 @@ func (s *Ethereum) Start() error { // StartCheckpointWhitelistService starts the goroutine to fetch checkpoints and update the // checkpoint whitelist map. func (s *Ethereum) startCheckpointWhitelistService() { - every := time.Duration(100) * time.Second - ticker := time.NewTicker(every) - defer ticker.Stop() - // first run the checkpoint whitelist err := s.handleWhitelistCheckpoint() if err != nil { + if errors.Is(err, ErrBorConsensusWithoutHeimdall) || errors.Is(err, ErrNotBorConsensus) { + return + } + log.Warn("the first run", "err", err) } + ticker := time.NewTicker(100 * time.Second) + defer ticker.Stop() + for { select { case <-ticker.C: err := s.handleWhitelistCheckpoint() if err != nil { - log.Warn(err.Error()) + log.Warn("couldn't get whitelist checkpoint", "err", err) } case <-s.closeCh: return @@ -621,20 +624,32 @@ func (s *Ethereum) startCheckpointWhitelistService() { } } +var ( + ErrNotBorConsensus = errors.New("not Bor consensus was given") + ErrBorConsensusWithoutHeimdall = errors.New("Bor consensus without Heimdall") +) + // handleWhitelistCheckpoint handles the checkpoint whitelist mechanism. func (s *Ethereum) handleWhitelistCheckpoint() error { ethHandler := (*ethHandler)(s.handler) - if !ethHandler.chain.Engine().(*bor.Bor).WithoutHeimdall { - endBlockNum, endBlockHash, err := ethHandler.fetchWhitelistCheckpoint() - if err != nil { - return err - } + bor, ok := ethHandler.chain.Engine().(*bor.Bor) + if !ok { + return ErrNotBorConsensus + } - // Update the checkpoint whitelist map. - ethHandler.downloader.ProcessCheckpoint(endBlockNum, endBlockHash) + if bor.WithoutHeimdall { + return ErrBorConsensusWithoutHeimdall } + endBlockNum, endBlockHash, err := ethHandler.fetchWhitelistCheckpoint(bor) + if err != nil { + return err + } + + // Update the checkpoint whitelist map. + ethHandler.downloader.ProcessCheckpoint(endBlockNum, endBlockHash) + return nil } diff --git a/eth/handler_bor.go b/eth/handler_bor.go index 02f9918f50..ad1ef16288 100644 --- a/eth/handler_bor.go +++ b/eth/handler_bor.go @@ -2,8 +2,8 @@ package eth import ( "context" - "fmt" "errors" + "fmt" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -14,9 +14,9 @@ import ( // fetchWhitelistCheckpoint fetched the latest checkpoint from it's local heimdall // and verifies the data against bor data. -func (h *ethHandler) fetchWhitelistCheckpoint() (uint64, common.Hash, error) { +func (h *ethHandler) fetchWhitelistCheckpoint(bor *bor.Bor) (uint64, common.Hash, error) { // check for checkpoint whitelisting: bor - checkpoint, err := h.chain.Engine().(*bor.Bor).HeimdallClient.FetchLatestCheckpoint() + checkpoint, err := bor.HeimdallClient.FetchLatestCheckpoint() if err != nil { log.Debug("Failed to fetch latest checkpoint for whitelisting") return 0, common.Hash{}, errors.New("failed to fetch latest checkpoint") @@ -47,6 +47,8 @@ func (h *ethHandler) fetchWhitelistCheckpoint() (uint64, common.Hash, error) { log.Debug("Failed to get end block hash of checkpoint while whitelisting") return 0, common.Hash{}, errors.New("failed to get end block") } + hash := fmt.Sprintf("%v", block["hash"]) + return checkpoint.EndBlock.Uint64(), common.HexToHash(hash), nil } From 01117acbcc2c301b15b3b446da392bb81a427818 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Thu, 19 May 2022 14:41:49 +0300 Subject: [PATCH 095/190] fmt --- eth/downloader/whitelist/service.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go index 4e23c4095b..2ddad0e5ab 100644 --- a/eth/downloader/whitelist/service.go +++ b/eth/downloader/whitelist/service.go @@ -12,7 +12,7 @@ import ( // Checkpoint whitelist type Service struct { - m sync.RWMutex + m sync.Mutex checkpointWhitelist map[uint64]common.Hash // Checkpoint whitelist, populated by reaching out to heimdall checkpointOrder []uint64 // Checkpoint order, populated by reaching out to heimdall maxCapacity uint @@ -54,6 +54,7 @@ func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber if err != nil { return false, fmt.Errorf("%w: last checkpoint %d, err %v", ErrNoRemoteCheckoint, lastCheckpointBlockNum, err) } + if len(headers) == 0 { return true, fmt.Errorf("%w: last checkpoint %d", ErrNoRemoteCheckoint, lastCheckpointBlockNum) } From e01a0f26195b276385a716863fd607a16285e24b Mon Sep 17 00:00:00 2001 From: Ferran Date: Mon, 9 May 2022 17:39:07 +0400 Subject: [PATCH 096/190] Limit state sync by gas --- consensus/bor/bor.go | 22 +++++++++++++++++----- consensus/bor/genesis_contracts_client.go | 13 +++++++------ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 2623011d79..70e45bab22 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1144,7 +1144,8 @@ func (c *Bor) fetchAndCommitSpan( msg := getSystemMessage(common.HexToAddress(c.config.ValidatorContract), data) // apply message - return applyMessage(msg, state, header, c.chainConfig, chain) + _, err = applyMessage(msg, state, header, c.chainConfig, chain) + return err } // CommitStates commit states @@ -1173,6 +1174,8 @@ func (c *Bor) CommitStates( } } + totalGas := 10000000 /// limit on gas for state sync per block + chainID := c.chainConfig.ChainID.String() for _, eventRecord := range eventRecords { if eventRecord.ID <= lastStateID { @@ -1191,9 +1194,15 @@ func (c *Bor) CommitStates( } stateSyncs = append(stateSyncs, &stateData) - if err := c.GenesisContractsClient.CommitState(eventRecord, state, header, chain); err != nil { + gasUsed, err := c.GenesisContractsClient.CommitState(eventRecord, state, header, chain) + if err != nil { return nil, err } + totalGas -= int(gasUsed) + if totalGas < 0 { + break + } + lastStateID++ } return stateSyncs, nil @@ -1311,14 +1320,16 @@ func applyMessage( header *types.Header, chainConfig *params.ChainConfig, chainContext core.ChainContext, -) error { +) (uint64, error) { + initialGas := msg.Gas() + // Create a new context to be used in the EVM environment blockContext := core.NewEVMBlockContext(header, chainContext, &header.Coinbase) // Create a new environment which holds all relevant information // about the transaction and calling mechanisms. vmenv := vm.NewEVM(blockContext, vm.TxContext{}, state, chainConfig, vm.Config{}) // Apply the transaction to the current state (included in the env) - _, _, err := vmenv.Call( + _, gasLeft, err := vmenv.Call( vm.AccountRef(msg.From()), *msg.To(), msg.Data(), @@ -1330,7 +1341,8 @@ func applyMessage( state.Finalise(true) } - return nil + gasUsed := initialGas - gasLeft + return gasUsed, nil } func validatorContains(a []*Validator, x *Validator) (*Validator, bool) { diff --git a/consensus/bor/genesis_contracts_client.go b/consensus/bor/genesis_contracts_client.go index 582358e0cb..456e3fe2e5 100644 --- a/consensus/bor/genesis_contracts_client.go +++ b/consensus/bor/genesis_contracts_client.go @@ -53,25 +53,26 @@ func (gc *GenesisContractsClient) CommitState( state *state.StateDB, header *types.Header, chCtx chainContext, -) error { +) (uint64, error) { eventRecord := event.BuildEventRecord() recordBytes, err := rlp.EncodeToBytes(eventRecord) if err != nil { - return err + return 0, err } method := "commitState" t := event.Time.Unix() data, err := gc.stateReceiverABI.Pack(method, big.NewInt(0).SetInt64(t), recordBytes) if err != nil { log.Error("Unable to pack tx for commitState", "error", err) - return err + return 0, err } log.Info("→ committing new state", "eventRecord", event.String()) msg := getSystemMessage(common.HexToAddress(gc.StateReceiverContract), data) - if err := applyMessage(msg, state, header, gc.chainConfig, chCtx); err != nil { - return err + gasUsed, err := applyMessage(msg, state, header, gc.chainConfig, chCtx) + if err != nil { + return 0, err } - return nil + return gasUsed, nil } func (gc *GenesisContractsClient) LastStateId(snapshotNumber uint64) (*big.Int, error) { From c8f8465edb87ac64472576b62d42f1548dac08db Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 10 May 2022 14:59:44 +0530 Subject: [PATCH 097/190] Added logging for state-sync total gas usage --- consensus/bor/bor.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 70e45bab22..091192a491 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1174,7 +1174,7 @@ func (c *Bor) CommitStates( } } - totalGas := 10000000 /// limit on gas for state sync per block + totalGas := 0 /// limit on gas for state sync per block chainID := c.chainConfig.ChainID.String() for _, eventRecord := range eventRecords { @@ -1198,13 +1198,14 @@ func (c *Bor) CommitStates( if err != nil { return nil, err } - totalGas -= int(gasUsed) - if totalGas < 0 { - break - } + totalGas += int(gasUsed) + // if totalGas < 0 { + // break + // } lastStateID++ } + log.Info("StateSyncGas", "gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1) return stateSyncs, nil } From 8b8395870c6d0a4b06a84f8e650d63238ffe0ee7 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 10 May 2022 15:06:19 +0530 Subject: [PATCH 098/190] Added number of event-records in log --- consensus/bor/bor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 091192a491..5b52edbf74 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1205,7 +1205,7 @@ func (c *Bor) CommitStates( lastStateID++ } - log.Info("StateSyncGas", "gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1) + log.Info("StateSyncGas", "gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1, "TotalRecords", len(eventRecords)) return stateSyncs, nil } From dba374026f365505da843d1b3cc38690807c0789 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 20 May 2022 12:32:37 +0530 Subject: [PATCH 099/190] Minor Changes --- consensus/bor/bor.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 5b52edbf74..db50f958b0 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1199,13 +1199,10 @@ func (c *Bor) CommitStates( return nil, err } totalGas += int(gasUsed) - // if totalGas < 0 { - // break - // } lastStateID++ } - log.Info("StateSyncGas", "gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1, "TotalRecords", len(eventRecords)) + log.Info("StateSyncData", "Gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1, "TotalRecords", len(eventRecords)) return stateSyncs, nil } From b88353c27d967ccc8b3b655ce684ed63643ae5f4 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 20 May 2022 14:20:59 +0530 Subject: [PATCH 100/190] Minor Fix --- consensus/bor/bor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index db50f958b0..2eb2645f18 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1202,7 +1202,7 @@ func (c *Bor) CommitStates( lastStateID++ } - log.Info("StateSyncData", "Gas", totalGas, "Block-number", number, "FromStateID", lastStateID+1, "TotalRecords", len(eventRecords)) + log.Info("StateSyncData", "Gas", totalGas, "Block-number", number, "LastStateID", lastStateID, "TotalRecords", len(eventRecords)) return stateSyncs, nil } From 20d99d94dfcb760cc969ac6b593427d9c2c1afce Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 20 May 2022 15:57:08 +0530 Subject: [PATCH 101/190] Adding individual gasUsed --- consensus/bor/clerk.go | 7 ++++--- consensus/bor/genesis_contracts_client.go | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/consensus/bor/clerk.go b/consensus/bor/clerk.go index d7e6982873..5524e249f2 100644 --- a/consensus/bor/clerk.go +++ b/consensus/bor/clerk.go @@ -23,10 +23,10 @@ type EventRecordWithTime struct { Time time.Time `json:"record_time" yaml:"record_time"` } -// String returns the string representatin of span -func (e *EventRecordWithTime) String() string { +// String returns the string representation of EventRecord +func (e *EventRecordWithTime) String(gasUsed uint64) string { return fmt.Sprintf( - "id %v, contract %v, data: %v, txHash: %v, logIndex: %v, chainId: %v, time %s", + "id %v, contract %v, data: %v, txHash: %v, logIndex: %v, chainId: %v, time %s, gasUsed %d", e.ID, e.Contract.String(), e.Data.String(), @@ -34,6 +34,7 @@ func (e *EventRecordWithTime) String() string { e.LogIndex, e.ChainID, e.Time.Format(time.RFC3339), + gasUsed, ) } diff --git a/consensus/bor/genesis_contracts_client.go b/consensus/bor/genesis_contracts_client.go index 456e3fe2e5..79a2a254c4 100644 --- a/consensus/bor/genesis_contracts_client.go +++ b/consensus/bor/genesis_contracts_client.go @@ -66,9 +66,10 @@ func (gc *GenesisContractsClient) CommitState( log.Error("Unable to pack tx for commitState", "error", err) return 0, err } - log.Info("→ committing new state", "eventRecord", event.String()) msg := getSystemMessage(common.HexToAddress(gc.StateReceiverContract), data) gasUsed, err := applyMessage(msg, state, header, gc.chainConfig, chCtx) + // Logging event log with time and individual gasUsed + log.Info("→ committing new state", "eventRecord", event.String(gasUsed)) if err != nil { return 0, err } From 59337a7a07bb6eba8dbead9f5e862d37946da367 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 20 May 2022 17:32:49 +0530 Subject: [PATCH 102/190] Minor Fix --- consensus/bor/errors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/bor/errors.go b/consensus/bor/errors.go index a1e60d1e21..df01b405b6 100644 --- a/consensus/bor/errors.go +++ b/consensus/bor/errors.go @@ -134,7 +134,7 @@ type InvalidStateReceivedError struct { func (e *InvalidStateReceivedError) Error() string { return fmt.Sprintf( - "Received invalid event %s at block %d. Requested events until %s. Last state id was %d", + "Received invalid event %v at block %d. Requested events until %s. Last state id was %d", e.Event, e.Number, e.To.Format(time.RFC3339), From 1b530440550fcfeb9fac2c81f7f949667650d1d9 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Mon, 23 May 2022 14:06:51 +0530 Subject: [PATCH 103/190] internal/cli/server, eth: add option to disable personal wallet endpoints (#394) * initial disable-bor-wallet implementation * fixes and enhancements * update docs using clidoc * fixes in clique auth --- docs/cli/server.md | 2 + eth/backend.go | 53 ++++++++++------ internal/cli/server/config.go | 12 +++- internal/cli/server/flags.go | 5 ++ internal/cli/server/server.go | 114 +++++++++++++++++++++++++++------- 5 files changed, 144 insertions(+), 42 deletions(-) diff --git a/docs/cli/server.md b/docs/cli/server.md index ba6f3389c5..f730d1b5f7 100644 --- a/docs/cli/server.md +++ b/docs/cli/server.md @@ -36,6 +36,8 @@ The ```bor server``` command runs the Bor client. - ```gpo.ignoreprice```: Gas price below which gpo will ignore transactions +- ```disable-bor-wallet```: Disable the personal wallet endpoints + - ```grpc.addr```: Address and port to bind the GRPC server - ```dev```: Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled diff --git a/eth/backend.go b/eth/backend.go index 05d6c5c927..f40e011f8d 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -82,6 +82,7 @@ type Ethereum struct { eventMux *event.TypeMux engine consensus.Engine accountManager *accounts.Manager + authorized bool // If consensus engine is authorized with keystore bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests bloomIndexer *core.ChainIndexer // Bloom indexer operating during block imports @@ -153,6 +154,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { chainDb: chainDb, eventMux: stack.EventMux(), accountManager: stack.AccountManager(), + authorized: false, engine: nil, closeBloomHandler: make(chan struct{}), networkID: config.NetworkId, @@ -485,29 +487,34 @@ func (s *Ethereum) StartMining(threads int) error { log.Error("Cannot start mining without etherbase", "err", err) return fmt.Errorf("etherbase missing: %v", err) } - var cli *clique.Clique - if c, ok := s.engine.(*clique.Clique); ok { - cli = c - } else if cl, ok := s.engine.(*beacon.Beacon); ok { - if c, ok := cl.InnerEngine().(*clique.Clique); ok { + + // If personal endpoints are disabled, the server creating + // this Ethereum instance has already Authorized consensus. + if !s.authorized { + var cli *clique.Clique + if c, ok := s.engine.(*clique.Clique); ok { cli = c + } else if cl, ok := s.engine.(*beacon.Beacon); ok { + if c, ok := cl.InnerEngine().(*clique.Clique); ok { + cli = c + } } - } - if cli != nil { - wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) - if wallet == nil || err != nil { - log.Error("Etherbase account unavailable locally", "err", err) - return fmt.Errorf("signer missing: %v", err) + if cli != nil { + wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) + if wallet == nil || err != nil { + log.Error("Etherbase account unavailable locally", "err", err) + return fmt.Errorf("signer missing: %v", err) + } + cli.Authorize(eb, wallet.SignData) } - cli.Authorize(eb, wallet.SignData) - } - if bor, ok := s.engine.(*bor.Bor); ok { - wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) - if wallet == nil || err != nil { - log.Error("Etherbase account unavailable locally", "err", err) - return fmt.Errorf("signer missing: %v", err) + if bor, ok := s.engine.(*bor.Bor); ok { + wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) + if wallet == nil || err != nil { + log.Error("Etherbase account unavailable locally", "err", err) + return fmt.Errorf("signer missing: %v", err) + } + bor.Authorize(eb, wallet.SignData) } - bor.Authorize(eb, wallet.SignData) } // If mining is started, we can disable the transaction rejection mechanism // introduced to speed sync times. @@ -553,6 +560,14 @@ func (s *Ethereum) SyncMode() downloader.SyncMode { return mode } +// SetAuthorized sets the authorized bool variable +// denoting that consensus has been authorized while creation +func (s *Ethereum) SetAuthorized(authorized bool) { + s.lock.Lock() + s.authorized = authorized + s.lock.Unlock() +} + // Protocols returns all the currently configured // network protocols to start. func (s *Ethereum) Protocols() []p2p.Protocol { diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index e74964606e..5a0d44c115 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -368,6 +368,9 @@ type AccountsConfig struct { // UseLightweightKDF enables a faster but less secure encryption of accounts UseLightweightKDF bool `hcl:"use-lightweight-kdf,optional"` + + // DisableBorWallet disables the personal wallet endpoints + DisableBorWallet bool `hcl:"disable-bor-wallet,optional"` } type DeveloperConfig struct { @@ -496,6 +499,7 @@ func DefaultConfig() *Config { PasswordFile: "", AllowInsecureUnlock: false, UseLightweightKDF: false, + DisableBorWallet: false, }, GRPC: &GRPCConfig{ Addr: ":3131", @@ -611,7 +615,7 @@ func (c *Config) loadChain() error { return nil } -func (c *Config) buildEth(stack *node.Node) (*ethconfig.Config, error) { +func (c *Config) buildEth(accountManager *accounts.Manager) (*ethconfig.Config, error) { dbHandles, err := makeDatabaseHandles() if err != nil { return nil, err @@ -686,7 +690,7 @@ func (c *Config) buildEth(stack *node.Node) (*ethconfig.Config, error) { if c.Developer.Enabled { // Get a keystore var ks *keystore.KeyStore - if keystores := stack.AccountManager().Backends(keystore.KeyStoreType); len(keystores) > 0 { + if keystores := accountManager.Backends(keystore.KeyStoreType); len(keystores) > 0 { ks = keystores[0].(*keystore.KeyStore) } @@ -712,6 +716,10 @@ func (c *Config) buildEth(stack *node.Node) (*ethconfig.Config, error) { } log.Info("Using developer account", "address", developer.Address) + // Set the Etherbase + c.Sealer.Etherbase = developer.Address.Hex() + n.Miner.Etherbase = developer.Address + // get developer mode chain config c.chain = chains.GetDeveloperChain(c.Developer.Period, developer.Address) diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index ce93e8c071..62bc534dac 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -530,6 +530,11 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.cliConfig.Accounts.UseLightweightKDF, Group: "Account Management", }) + f.BoolFlag((&flagset.BoolFlag{ + Name: "disable-bor-wallet", + Usage: "Disable the personal wallet endpoints", + Value: &c.cliConfig.Accounts.DisableBorWallet, + })) // grpc f.StringFlag(&flagset.StringFlag{ diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index 5d3d307d2a..6b4e7ed4da 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -10,7 +10,11 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/consensus/beacon" + "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/ethstats" @@ -67,50 +71,115 @@ func NewServer(config *Config) (*Server, error) { if err != nil { return nil, err } - srv.node = stack // setup account manager (only keystore) - { - keydir := stack.KeyStoreDir() - n, p := keystore.StandardScryptN, keystore.StandardScryptP - if config.Accounts.UseLightweightKDF { - n, p = keystore.LightScryptN, keystore.LightScryptP - } - stack.AccountManager().AddBackend(keystore.NewKeyStore(keydir, n, p)) + // create a new account manager, only for the scope of this function + accountManager := accounts.NewManager(&accounts.Config{}) + + // register backend to account manager with keystore for signing + keydir := stack.KeyStoreDir() + n, p := keystore.StandardScryptN, keystore.StandardScryptP + if config.Accounts.UseLightweightKDF { + n, p = keystore.LightScryptN, keystore.LightScryptP } - // register the ethereum backend - ethCfg, err := config.buildEth(stack) - if err != nil { - return nil, err - } + // proceed to authorize the local account manager in any case + accountManager.AddBackend(keystore.NewKeyStore(keydir, n, p)) - backend, err := eth.New(stack, ethCfg) - if err != nil { - return nil, err + // flag to set if we're authorizing consensus here + authorized := false + + // check if personal wallet endpoints are disabled or not + if !config.Accounts.DisableBorWallet { + // add keystore globally to the node's account manager if personal wallet is enabled + stack.AccountManager().AddBackend(keystore.NewKeyStore(keydir, n, p)) + + // register the ethereum backend + ethCfg, err := config.buildEth(stack.AccountManager()) + if err != nil { + return nil, err + } + backend, err := eth.New(stack, ethCfg) + if err != nil { + return nil, err + } + srv.backend = backend + } else { + // register the ethereum backend (with temporary created account manager) + ethCfg, err := config.buildEth(accountManager) + if err != nil { + return nil, err + } + backend, err := eth.New(stack, ethCfg) + if err != nil { + return nil, err + } + srv.backend = backend + + // authorize only if mining or in developer mode + if config.Sealer.Enabled || config.Developer.Enabled { + // get the etherbase + eb, err := srv.backend.Etherbase() + if err != nil { + log.Error("Cannot start mining without etherbase", "err", err) + return nil, fmt.Errorf("etherbase missing: %v", err) + } + + // Authorize the clique consensus (if chosen) to sign using wallet signer + var cli *clique.Clique + if c, ok := srv.backend.Engine().(*clique.Clique); ok { + cli = c + } else if cl, ok := srv.backend.Engine().(*beacon.Beacon); ok { + if c, ok := cl.InnerEngine().(*clique.Clique); ok { + cli = c + } + } + if cli != nil { + wallet, err := accountManager.Find(accounts.Account{Address: eb}) + if wallet == nil || err != nil { + log.Error("Etherbase account unavailable locally", "err", err) + return nil, fmt.Errorf("signer missing: %v", err) + } + cli.Authorize(eb, wallet.SignData) + authorized = true + } + + // Authorize the bor consensus (if chosen) to sign using wallet signer + if bor, ok := srv.backend.Engine().(*bor.Bor); ok { + wallet, err := accountManager.Find(accounts.Account{Address: eb}) + if wallet == nil || err != nil { + log.Error("Etherbase account unavailable locally", "err", err) + return nil, fmt.Errorf("signer missing: %v", err) + } + bor.Authorize(eb, wallet.SignData) + authorized = true + } + } } - srv.backend = backend + + // set the auth status in backend + srv.backend.SetAuthorized(authorized) // debug tracing is enabled by default - stack.RegisterAPIs(tracers.APIs(backend.APIBackend)) + stack.RegisterAPIs(tracers.APIs(srv.backend.APIBackend)) // graphql is started from another place if config.JsonRPC.Graphql.Enabled { - if err := graphql.New(stack, backend.APIBackend, config.JsonRPC.Cors, config.JsonRPC.VHost); err != nil { + if err := graphql.New(stack, srv.backend.APIBackend, config.JsonRPC.Cors, config.JsonRPC.VHost); err != nil { return nil, fmt.Errorf("failed to register the GraphQL service: %v", err) } } // register ethash service if config.Ethstats != "" { - if err := ethstats.New(stack, backend.APIBackend, backend.Engine(), config.Ethstats); err != nil { + if err := ethstats.New(stack, srv.backend.APIBackend, srv.backend.Engine(), config.Ethstats); err != nil { return nil, err } } // sealing (if enabled) or in dev mode if config.Sealer.Enabled || config.Developer.Enabled { - if err := backend.StartMining(1); err != nil { + if err := srv.backend.StartMining(1); err != nil { return nil, err } } @@ -119,6 +188,9 @@ func NewServer(config *Config) (*Server, error) { return nil, err } + // Set the node instance + srv.node = stack + // start the node if err := srv.node.Start(); err != nil { return nil, err From 2323f2c96e5a198a24e08de5c09e3b58825e5887 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Mon, 23 May 2022 15:27:35 +0530 Subject: [PATCH 104/190] fix: modify build eth fn definition for account unlock handling (#412) --- internal/cli/server/config.go | 8 ++++---- internal/cli/server/config_test.go | 2 +- internal/cli/server/server.go | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 5a0d44c115..3e9a5a9c77 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -615,7 +615,7 @@ func (c *Config) loadChain() error { return nil } -func (c *Config) buildEth(accountManager *accounts.Manager) (*ethconfig.Config, error) { +func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (*ethconfig.Config, error) { dbHandles, err := makeDatabaseHandles() if err != nil { return nil, err @@ -670,15 +670,15 @@ func (c *Config) buildEth(accountManager *accounts.Manager) (*ethconfig.Config, // unlock accounts if len(c.Accounts.Unlock) > 0 { if !stack.Config().InsecureUnlockAllowed && stack.Config().ExtRPCEnabled() { - return nil, fmt.Errorf("Account unlock with HTTP access is forbidden!") + return nil, fmt.Errorf("account unlock with HTTP access is forbidden") } - ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + ks := accountManager.Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) passwords, err := MakePasswordListFromFile(c.Accounts.PasswordFile) if err != nil { return nil, err } if len(passwords) < len(c.Accounts.Unlock) { - return nil, fmt.Errorf("Number of passwords provided (%v) is less than number of accounts (%v) to unlock", + return nil, fmt.Errorf("number of passwords provided (%v) is less than number of accounts (%v) to unlock", len(passwords), len(c.Accounts.Unlock)) } for i, account := range c.Accounts.Unlock { diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index 4e6f3ef499..d83182af88 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -16,7 +16,7 @@ func TestConfigDefault(t *testing.T) { _, err := config.buildNode() assert.NoError(t, err) - _, err = config.buildEth(nil) + _, err = config.buildEth(nil, nil) assert.NoError(t, err) } diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index 6b4e7ed4da..371e588d02 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -95,7 +95,7 @@ func NewServer(config *Config) (*Server, error) { stack.AccountManager().AddBackend(keystore.NewKeyStore(keydir, n, p)) // register the ethereum backend - ethCfg, err := config.buildEth(stack.AccountManager()) + ethCfg, err := config.buildEth(stack, stack.AccountManager()) if err != nil { return nil, err } @@ -106,7 +106,7 @@ func NewServer(config *Config) (*Server, error) { srv.backend = backend } else { // register the ethereum backend (with temporary created account manager) - ethCfg, err := config.buildEth(accountManager) + ethCfg, err := config.buildEth(stack, accountManager) if err != nil { return nil, err } From 12ab0f0240625f890355d4c29d523bbfeafc7478 Mon Sep 17 00:00:00 2001 From: Jerry Date: Thu, 19 May 2022 17:55:23 -0700 Subject: [PATCH 105/190] Lint consensus/bor module Cleanup, lint, and enable linters for consenssus/bor module. Disabled linter "gomnd" and "tagliatelle" because they are not easy to fix and the return on the time investment is very low. Disabled linter "prealloc" because it is not easy to guess and pre-allocate the slice accurately in many cases. --- .github/workflows/ci.yml | 2 +- .golangci.yml | 10 +- Makefile | 4 +- consensus/bor/api.go | 42 +++++++- consensus/bor/bor.go | 123 +++++++++++++++++----- consensus/bor/bor_test.go | 7 +- consensus/bor/clerk.go | 2 +- consensus/bor/genesis_contracts_client.go | 10 ++ consensus/bor/merkle.go | 16 +-- consensus/bor/rest.go | 14 ++- consensus/bor/snapshot.go | 24 +++-- consensus/bor/snapshot_test.go | 22 ++++ consensus/bor/validator.go | 9 ++ consensus/bor/validator_set.go | 76 ++++++++++--- 14 files changed, 291 insertions(+), 70 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7db530c346..72647b56eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ on: pull_request: branches: - "**" - types: [opened, synchronize] + types: [opened, synchronize, edited] concurrency: group: build-${{ github.event.pull_request.number || github.ref }} diff --git a/.golangci.yml b/.golangci.yml index 7dc4fc37e3..daea4e1e0b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -28,7 +28,7 @@ linters: - exportloopref - gocognit - gofmt - - gomnd + # - gomnd - gomoddirectives - gosec - makezero @@ -38,11 +38,11 @@ linters: - noctx #- nosprintfhostport # TODO: do we use IPv6? - paralleltest - - prealloc + # - prealloc - predeclared #- promlinter #- revive - - tagliatelle + # - tagliatelle - tenv - thelper - tparallel @@ -65,7 +65,7 @@ linters-settings: local-prefixes: github.com/ethereum/go-ethereum nestif: - min-complexity: 3 + min-complexity: 5 prealloc: for-loops: true @@ -183,4 +183,4 @@ issues: max-issues-per-linter: 0 max-same-issues: 0 #new: true - new-from-rev: origin/master \ No newline at end of file + # new-from-rev: origin/master \ No newline at end of file diff --git a/Makefile b/Makefile index b82757e7fb..53b3cd9fdb 100644 --- a/Makefile +++ b/Makefile @@ -65,7 +65,9 @@ escape: cd $(path) && go test -gcflags "-m -m" -run none -bench=BenchmarkJumpdest* -benchmem -memprofile mem.out lint: - @./build/bin/golangci-lint run --config ./.golangci.yml + @./build/bin/golangci-lint run --config ./.golangci.yml \ + internal/cli \ + consensus/bor lintci-deps: rm -f ./build/bin/golangci-lint diff --git a/consensus/bor/api.go b/consensus/bor/api.go index 8f172e47a6..361e439bf7 100644 --- a/consensus/bor/api.go +++ b/consensus/bor/api.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/rpc" + lru "github.com/hashicorp/golang-lru" "github.com/xsleonard/go-merkle" "golang.org/x/crypto/sha3" @@ -44,6 +45,7 @@ func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) { if header == nil { return nil, errUnknownBlock } + return api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) } @@ -59,11 +61,11 @@ type difficultiesKV struct { } func rankMapDifficulties(values map[common.Address]uint64) []difficultiesKV { - var ss []difficultiesKV for k, v := range values { ss = append(ss, difficultiesKV{k, v}) } + sort.Slice(ss, func(i, j int) bool { return ss[i].Difficulty > ss[j].Difficulty }) @@ -74,11 +76,15 @@ func rankMapDifficulties(values map[common.Address]uint64) []difficultiesKV { // GetSnapshotProposerSequence retrieves the in-turn signers of all sprints in a span func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigners, error) { snapNumber := *number - 1 + var difficulties = make(map[common.Address]uint64) + snap, err := api.GetSnapshot(&snapNumber) + if err != nil { return BlockSigners{}, err } + proposer := snap.ValidatorSet.GetProposer().Address proposerIndex, _ := snap.ValidatorSet.GetByAddress(proposer) @@ -88,6 +94,7 @@ func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigne if tempIndex < proposerIndex { tempIndex = tempIndex + len(signers) } + difficulties[signers[i]] = uint64(len(signers) - (tempIndex - proposerIndex)) } @@ -97,6 +104,7 @@ func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigne if err != nil { return BlockSigners{}, err } + diff := int(difficulties[*author]) blockSigners := &BlockSigners{ Signers: rankedDifficulties, @@ -111,9 +119,11 @@ func (api *API) GetSnapshotProposerSequence(number *rpc.BlockNumber) (BlockSigne func (api *API) GetSnapshotProposer(number *rpc.BlockNumber) (common.Address, error) { *number -= 1 snap, err := api.GetSnapshot(number) + if err != nil { return common.Address{}, err } + return snap.ValidatorSet.GetProposer().Address, nil } @@ -130,7 +140,9 @@ func (api *API) GetAuthor(number *rpc.BlockNumber) (*common.Address, error) { if header == nil { return nil, errUnknownBlock } + author, err := api.bor.Author(header) + return &author, err } @@ -140,6 +152,7 @@ func (api *API) GetSnapshotAtHash(hash common.Hash) (*Snapshot, error) { if header == nil { return nil, errUnknownBlock } + return api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) } @@ -156,10 +169,13 @@ func (api *API) GetSigners(number *rpc.BlockNumber) ([]common.Address, error) { if header == nil { return nil, errUnknownBlock } + snap, err := api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) + if err != nil { return nil, err } + return snap.signers(), nil } @@ -169,10 +185,13 @@ func (api *API) GetSignersAtHash(hash common.Hash) ([]common.Address, error) { if header == nil { return nil, errUnknownBlock } + snap, err := api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) + if err != nil { return nil, err } + return snap.signers(), nil } @@ -182,6 +201,7 @@ func (api *API) GetCurrentProposer() (common.Address, error) { if err != nil { return common.Address{}, err } + return snap.ValidatorSet.GetProposer().Address, nil } @@ -191,6 +211,7 @@ func (api *API) GetCurrentValidators() ([]*Validator, error) { if err != nil { return make([]*Validator, 0), err } + return snap.ValidatorSet.Validators, nil } @@ -199,26 +220,36 @@ func (api *API) GetRootHash(start uint64, end uint64) (string, error) { if err := api.initializeRootHashCache(); err != nil { return "", err } + key := getRootHashKey(start, end) + if root, known := api.rootHashCache.Get(key); known { return root.(string), nil } - length := uint64(end - start + 1) + + length := end - start + 1 + if length > MaxCheckpointLength { return "", &MaxCheckpointLengthExceededError{start, end} } + currentHeaderNumber := api.chain.CurrentHeader().Number.Uint64() + if start > end || end > currentHeaderNumber { return "", &InvalidStartEndBlockError{start, end, currentHeaderNumber} } + blockHeaders := make([]*types.Header, end-start+1) wg := new(sync.WaitGroup) concurrent := make(chan bool, 20) + for i := start; i <= end; i++ { wg.Add(1) concurrent <- true + go func(number uint64) { - blockHeaders[number-start] = api.chain.GetHeaderByNumber(uint64(number)) + blockHeaders[number-start] = api.chain.GetHeaderByNumber(number) + <-concurrent wg.Done() }(i) @@ -227,6 +258,7 @@ func (api *API) GetRootHash(start uint64, end uint64) (string, error) { close(concurrent) headers := make([][32]byte, nextPowerOfTwo(length)) + for i := 0; i < len(blockHeaders); i++ { blockHeader := blockHeaders[i] header := crypto.Keccak256(appendBytes32( @@ -237,6 +269,7 @@ func (api *API) GetRootHash(start uint64, end uint64) (string, error) { )) var arr [32]byte + copy(arr[:], header) headers[i] = arr } @@ -245,8 +278,10 @@ func (api *API) GetRootHash(start uint64, end uint64) (string, error) { if err := tree.Generate(convert(headers), sha3.NewLegacyKeccak256()); err != nil { return "", err } + root := hex.EncodeToString(tree.Root().Hash) api.rootHashCache.Add(key, root) + return root, nil } @@ -255,6 +290,7 @@ func (api *API) initializeRootHashCache() error { if api.rootHashCache == nil { api.rootHashCache, err = lru.NewARC(10) } + return err } diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 2623011d79..ada601f838 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -32,7 +32,6 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" @@ -56,9 +55,6 @@ var ( uncleHash = types.CalcUncleHash(nil) // Always Keccak256(RLP([])) as uncles are meaningless outside of PoW. - diffInTurn = big.NewInt(2) // Block difficulty for in-turn signatures - diffNoTurn = big.NewInt(1) // Block difficulty for out-of-turn signatures - validatorHeaderBytesLength = common.AddressLength + 20 // address + power systemAddress = common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE") ) @@ -72,18 +68,6 @@ var ( // that is not part of the local blockchain. errUnknownBlock = errors.New("unknown block") - // errInvalidCheckpointBeneficiary is returned if a checkpoint/epoch transition - // block has a beneficiary set to non-zeroes. - errInvalidCheckpointBeneficiary = errors.New("beneficiary in checkpoint block non-zero") - - // errInvalidVote is returned if a nonce value is something else that the two - // allowed constants of 0x00..0 or 0xff..f. - errInvalidVote = errors.New("vote nonce not 0x00..0 or 0xff..f") - - // errInvalidCheckpointVote is returned if a checkpoint/epoch transition block - // has a vote nonce set to non-zeroes. - errInvalidCheckpointVote = errors.New("vote nonce in checkpoint block non-zero") - // errMissingVanity is returned if a block's extra-data section is shorter than // 32 bytes, which is required to store the signer vanity. errMissingVanity = errors.New("extra-data 32 byte vanity prefix missing") @@ -136,6 +120,7 @@ func ecrecover(header *types.Header, sigcache *lru.ARCCache, c *params.BorConfig if len(header.Extra) < extraSeal { return common.Address{}, errMissingSignature } + signature := header.Extra[len(header.Extra)-extraSeal:] // Recover the public key and the Ethereum address @@ -143,10 +128,13 @@ func ecrecover(header *types.Header, sigcache *lru.ARCCache, c *params.BorConfig if err != nil { return common.Address{}, err } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) sigcache.Add(hash, signer) + return signer, nil } @@ -155,6 +143,7 @@ func SealHash(header *types.Header, c *params.BorConfig) (hash common.Hash) { hasher := sha3.NewLegacyKeccak256() encodeSigHeader(hasher, header, c) hasher.Sum(hash[:0]) + return hash } @@ -176,11 +165,13 @@ func encodeSigHeader(w io.Writer, header *types.Header, c *params.BorConfig) { header.MixDigest, header.Nonce, } + if c.IsJaipur(header.Number.Uint64()) { if header.BaseFee != nil { enc = append(enc, header.BaseFee) } } + if err := rlp.Encode(w, enc); err != nil { panic("can't encode: " + err.Error()) } @@ -194,9 +185,11 @@ func CalcProducerDelay(number uint64, succession int, c *params.BorConfig) uint6 if number%c.Sprint == 0 { delay = c.ProducerDelay } + if succession > 0 { delay += uint64(succession) * c.CalculateBackupMultiplier(number) } + return delay } @@ -210,6 +203,7 @@ func CalcProducerDelay(number uint64, succession int, c *params.BorConfig) uint6 func BorRLP(header *types.Header, c *params.BorConfig) []byte { b := new(bytes.Buffer) encodeSigHeader(b, header, c) + return b.Bytes() } @@ -233,7 +227,6 @@ type Bor struct { HeimdallClient IHeimdallClient WithoutHeimdall bool - scope event.SubscriptionScope // The fields below are for testing only fakeDiff bool // Skip difficulty verifications } @@ -314,6 +307,7 @@ func (c *Bor) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types. } } }() + return abort, results } @@ -325,6 +319,7 @@ func (c *Bor) verifyHeader(chain consensus.ChainHeaderReader, header *types.Head if header.Number == nil { return errUnknownBlock } + number := header.Number.Uint64() // Don't waste time checking blocks from the future @@ -344,32 +339,40 @@ func (c *Bor) verifyHeader(chain consensus.ChainHeaderReader, header *types.Head if !isSprintEnd && signersBytes != 0 { return errExtraValidators } + if isSprintEnd && signersBytes%validatorHeaderBytesLength != 0 { return errInvalidSpanValidators } + // Ensure that the mix digest is zero as we don't have fork protection currently if header.MixDigest != (common.Hash{}) { return errInvalidMixDigest } + // Ensure that the block doesn't contain any uncles which are meaningless in PoA if header.UncleHash != uncleHash { return errInvalidUncleHash } + // Ensure that the block's difficulty is meaningful (may not be correct at this point) if number > 0 { if header.Difficulty == nil { return errInvalidDifficulty } } + // Verify that the gas limit is <= 2^63-1 - cap := uint64(0x7fffffffffffffff) - if header.GasLimit > cap { - return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, cap) + gasCap := uint64(0x7fffffffffffffff) + + if header.GasLimit > gasCap { + return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, gasCap) } + // If all checks passed, validate any special fields for hard forks if err := misc.VerifyForkHashes(chain.Config(), header, false); err != nil { return err } + // All basic checks passed, verify cascading fields return c.verifyCascadingFields(chain, header, parents) } @@ -380,9 +383,11 @@ func validateHeaderExtraField(extraBytes []byte) error { if len(extraBytes) < extraVanity { return errMissingVanity } + if len(extraBytes) < extraVanity+extraSeal { return errMissingSignature } + return nil } @@ -393,12 +398,14 @@ func validateHeaderExtraField(extraBytes []byte) error { func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header) error { // The genesis block is the always valid dead-end number := header.Number.Uint64() + if number == 0 { return nil } // Ensure that the block's timestamp isn't too close to it's parent var parent *types.Header + if len(parents) > 0 { parent = parents[len(parents)-1] } else { @@ -413,11 +420,13 @@ func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *t if header.GasUsed > header.GasLimit { return fmt.Errorf("invalid gasUsed: have %d, gasLimit %d", header.GasUsed, header.GasLimit) } + if !chain.Config().IsLondon(header.Number) { // Verify BaseFee not present before EIP-1559 fork. if header.BaseFee != nil { return fmt.Errorf("invalid baseFee before fork: have %d, want ", header.BaseFee) } + if err := misc.VerifyGaslimit(parent.GasLimit, header.GasLimit); err != nil { return err } @@ -432,6 +441,7 @@ func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *t // Retrieve the snapshot needed to verify this header and cache it snap, err := c.snapshot(chain, number-1, header.ParentHash, parents) + if err != nil { return err } @@ -444,6 +454,7 @@ func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *t currentValidators := snap.ValidatorSet.Copy().Validators // sort validator by address sort.Sort(ValidatorsByAddress(currentValidators)) + for i, validator := range currentValidators { copy(validatorsBytes[i*validatorHeaderBytesLength:], validator.HeaderBytes()) } @@ -458,6 +469,7 @@ func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *t } // snapshot retrieves the authorization snapshot at a given point in time. +// nolint: gocognit func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash common.Hash, parents []*types.Header) (*Snapshot, error) { // Search for a snapshot in memory or on disk for checkpoints var ( @@ -465,10 +477,12 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co snap *Snapshot ) + //nolint:govet for snap == nil { // If an in-memory snapshot was found, use that if s, ok := c.recents.Get(hash); ok { snap = s.(*Snapshot) + break } @@ -476,7 +490,9 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co if number%checkpointInterval == 0 { if s, err := loadSnapshot(c.config, c.signatures, c.db, hash, c.ethAPI); err == nil { log.Trace("Loaded snapshot from disk", "number", number, "hash", hash) + snap = s + break } } @@ -486,6 +502,7 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co // up more headers than allowed to be reorged (chain reinit from a freezer), // consider the checkpoint trusted and snapshot it. // TODO fix this + // nolint:nestif if number == 0 { checkpoint := chain.GetHeaderByNumber(number) if checkpoint != nil { @@ -503,7 +520,9 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co if err := snap.store(c.db); err != nil { return nil, err } + log.Info("Stored checkpoint snapshot to disk", "number", number, "hash", hash) + break } } @@ -516,6 +535,7 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co if header.Hash() != hash || header.Number.Uint64() != number { return nil, consensus.ErrUnknownAncestor } + parents = parents[:len(parents)-1] } else { // No explicit parents (or no more left), reach out to the database @@ -524,6 +544,7 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co return nil, consensus.ErrUnknownAncestor } } + headers = append(headers, header) number, hash = number-1, header.ParentHash } @@ -542,6 +563,7 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co if err != nil { return nil, err } + c.recents.Add(snap.Hash, snap) // If we've generated a new checkpoint snapshot, save to disk @@ -549,8 +571,10 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co if err = snap.store(c.db); err != nil { return nil, err } + log.Trace("Stored snapshot to disk", "number", snap.Number, "hash", snap.Hash) } + return snap, err } @@ -560,6 +584,7 @@ func (c *Bor) VerifyUncles(chain consensus.ChainReader, block *types.Block) erro if len(block.Uncles()) > 0 { return errors.New("uncles not allowed") } + return nil } @@ -590,6 +615,7 @@ func (c *Bor) verifySeal(chain consensus.ChainHeaderReader, header *types.Header if err != nil { return err } + if !snap.ValidatorSet.HasAddress(signer.Bytes()) { // Check the UnauthorizedSignerError.Error() msg to see why we pass number-1 return &UnauthorizedSignerError{number - 1, signer.Bytes()} @@ -643,6 +669,7 @@ func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header) e if len(header.Extra) < extraVanity { header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, extraVanity-len(header.Extra))...) } + header.Extra = header.Extra[:extraVanity] // get validator set if number @@ -654,6 +681,7 @@ func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header) e // sort validator by address sort.Sort(ValidatorsByAddress(newValidators)) + for _, validator := range newValidators { header.Extra = append(header.Extra, validator.HeaderBytes()...) } @@ -673,7 +701,7 @@ func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header) e var succession int // if signer is not empty - if bytes.Compare(c.signer.Bytes(), common.Address{}.Bytes()) != 0 { + if !bytes.Equal(c.signer.Bytes(), common.Address{}.Bytes()) { succession, err = snap.GetSignerSuccessionNumber(c.signer) if err != nil { return err @@ -684,6 +712,7 @@ func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header) e if header.Time < uint64(time.Now().Unix()) { header.Time = uint64(time.Now().Unix()) } + return nil } @@ -693,7 +722,9 @@ func (c *Bor) Finalize(chain consensus.ChainHeaderReader, header *types.Header, stateSyncData := []*types.StateSyncData{} var err error + headerNumber := header.Number.Uint64() + if headerNumber%c.config.Sprint == 0 { cx := chainContext{Chain: chain, Bor: c} // check and commit span @@ -728,13 +759,17 @@ func (c *Bor) Finalize(chain consensus.ChainHeaderReader, header *types.Header, func decodeGenesisAlloc(i interface{}) (core.GenesisAlloc, error) { var alloc core.GenesisAlloc + b, err := json.Marshal(i) + if err != nil { return nil, err } + if err := json.Unmarshal(b, &alloc); err != nil { return nil, err } + return alloc, nil } @@ -745,12 +780,14 @@ func (c *Bor) changeContractCodeIfNeeded(headerNumber uint64, state *state.State if err != nil { return fmt.Errorf("failed to decode genesis alloc: %v", err) } + for addr, account := range allocs { log.Info("change contract code", "address", addr) state.SetCode(addr, account.Code) } } } + return nil } @@ -856,10 +893,12 @@ func (c *Bor) Seal(chain consensus.ChainHeaderReader, block *types.Block, result if err != nil { return err } + copy(header.Extra[len(header.Extra)-extraSeal:], sighash) // Wait until sealing is terminated or delay timeout. log.Trace("Waiting for slot to sign and propagate", "delay", common.PrettyDuration(delay)) + go func() { select { case <-stop: @@ -874,6 +913,7 @@ func (c *Bor) Seal(chain consensus.ChainHeaderReader, block *types.Block, result "in-turn-signer", snap.ValidatorSet.GetProposer().Address.Hex(), ) } + log.Info( "Sealing successful", "number", number, @@ -887,6 +927,7 @@ func (c *Bor) Seal(chain consensus.ChainHeaderReader, block *types.Block, result log.Warn("Sealing result was not read by miner", "number", number, "sealhash", SealHash(header, c.config)) } }() + return nil } @@ -898,6 +939,7 @@ func (c *Bor) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64, par if err != nil { return nil } + return new(big.Int).SetUint64(snap.Difficulty(c.signer)) } @@ -948,6 +990,7 @@ func (c *Bor) GetCurrentSpan(headerHash common.Hash) (*Span, error) { To: &toAddress, Data: &msgData, }, blockNr, nil) + if err != nil { return nil, err } @@ -998,15 +1041,16 @@ func (c *Bor) GetCurrentValidators(headerHash common.Hash, blockNumber uint64) ( To: &toAddress, Data: &msgData, }, blockNr, nil) + if err != nil { panic(err) - // return nil, err } var ( ret0 = new([]common.Address) ret1 = new([]*big.Int) ) + out := &[]interface{}{ ret0, ret1, @@ -1034,13 +1078,16 @@ func (c *Bor) checkAndCommitSpan( ) error { headerNumber := header.Number.Uint64() span, err := c.GetCurrentSpan(header.ParentHash) + if err != nil { return err } + if c.needToCommitSpan(span, headerNumber) { err := c.fetchAndCommitSpan(span.ID+1, state, header, chain) return err } + return nil } @@ -1072,10 +1119,11 @@ func (c *Bor) fetchAndCommitSpan( var heimdallSpan HeimdallSpan if c.WithoutHeimdall { - s, err := c.getNextHeimdallSpanForTest(newSpanID, state, header, chain) + s, err := c.getNextHeimdallSpanForTest(newSpanID, header, chain) if err != nil { return err } + heimdallSpan = *s } else { response, err := c.HeimdallClient.FetchWithRetry(fmt.Sprintf("bor/span/%d", newSpanID), "") @@ -1102,7 +1150,9 @@ func (c *Bor) fetchAndCommitSpan( for _, val := range heimdallSpan.ValidatorSet.Validators { validators = append(validators, val.MinimalVal()) } + validatorBytes, err := rlp.EncodeToBytes(validators) + if err != nil { return err } @@ -1112,13 +1162,16 @@ func (c *Bor) fetchAndCommitSpan( for _, val := range heimdallSpan.SelectedProducers { producers = append(producers, val.MinimalVal()) } + producerBytes, err := rlp.EncodeToBytes(producers) + if err != nil { return err } // method method := "commitSpan" + log.Info("✅ Committing new span", "id", heimdallSpan.ID, "startBlock", heimdallSpan.StartBlock, @@ -1156,6 +1209,7 @@ func (c *Bor) CommitStates( stateSyncs := make([]*types.StateSyncData, 0) number := header.Number.Uint64() _lastStateID, err := c.GenesisContractsClient.LastStateId(number - 1) + if err != nil { return nil, err } @@ -1166,7 +1220,13 @@ func (c *Bor) CommitStates( "Fetching state updates from Heimdall", "fromID", lastStateID+1, "to", to.Format(time.RFC3339)) + eventRecords, err := c.HeimdallClient.FetchStateSyncEvents(lastStateID+1, to.Unix()) + + if err != nil { + log.Error("Error occurred when fetching state sync events", err) + } + if c.config.OverrideStateSyncRecords != nil { if val, ok := c.config.OverrideStateSyncRecords[strconv.FormatUint(number, 10)]; ok { eventRecords = eventRecords[0:val] @@ -1174,10 +1234,12 @@ func (c *Bor) CommitStates( } chainID := c.chainConfig.ChainID.String() + for _, eventRecord := range eventRecords { if eventRecord.ID <= lastStateID { continue } + if err := validateEventRecord(eventRecord, number, to, lastStateID, chainID); err != nil { log.Error(err.Error()) break @@ -1196,6 +1258,7 @@ func (c *Bor) CommitStates( } lastStateID++ } + return stateSyncs, nil } @@ -1204,6 +1267,7 @@ func validateEventRecord(eventRecord *EventRecordWithTime, number uint64, to tim if lastStateID+1 != eventRecord.ID || eventRecord.ChainID != chainID || !eventRecord.Time.Before(to) { return &InvalidStateReceivedError{number, lastStateID, &to, eventRecord} } + return nil } @@ -1217,12 +1281,12 @@ func (c *Bor) SetHeimdallClient(h IHeimdallClient) { func (c *Bor) getNextHeimdallSpanForTest( newSpanID uint64, - state *state.StateDB, header *types.Header, chain core.ChainContext, ) (*HeimdallSpan, error) { headerNumber := header.Number.Uint64() span, err := c.GetCurrentSpan(header.ParentHash) + if err != nil { return nil, err } @@ -1242,12 +1306,14 @@ func (c *Bor) getNextHeimdallSpanForTest( } else { span.StartBlock = span.EndBlock + 1 } + span.EndBlock = span.StartBlock + (100 * c.config.Sprint) - 1 selectedProducers := make([]Validator, len(snap.ValidatorSet.Validators)) for i, v := range snap.ValidatorSet.Validators { selectedProducers[i] = *v } + heimdallSpan := &HeimdallSpan{ Span: *span, ValidatorSet: *snap.ValidatorSet, @@ -1335,10 +1401,11 @@ func applyMessage( func validatorContains(a []*Validator, x *Validator) (*Validator, bool) { for _, n := range a { - if bytes.Compare(n.Address.Bytes(), x.Address.Bytes()) == 0 { + if bytes.Equal(n.Address.Bytes(), x.Address.Bytes()) { return n, true } } + return nil, false } @@ -1347,6 +1414,7 @@ func getUpdatedValidatorSet(oldValidatorSet *ValidatorSet, newVals []*Validator) oldVals := v.Validators var changes []*Validator + for _, ov := range oldVals { if f, ok := validatorContains(newVals, ov); ok { ov.VotingPower = f.VotingPower @@ -1363,7 +1431,10 @@ func getUpdatedValidatorSet(oldValidatorSet *ValidatorSet, newVals []*Validator) } } - v.UpdateWithChangeSet(changes) + if err := v.UpdateWithChangeSet(changes); err != nil { + log.Error("Error while updating change set", err) + } + return v } diff --git a/consensus/bor/bor_test.go b/consensus/bor/bor_test.go index b0ebc96861..6225532ca9 100644 --- a/consensus/bor/bor_test.go +++ b/consensus/bor/bor_test.go @@ -4,6 +4,8 @@ import ( "math/big" "testing" + "github.com/stretchr/testify/assert" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" @@ -12,10 +14,11 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" - "github.com/stretchr/testify/assert" ) func TestGenesisContractChange(t *testing.T) { + t.Parallel() + addr0 := common.Address{0x1} b := &Bor{ @@ -101,6 +104,8 @@ func TestGenesisContractChange(t *testing.T) { } func TestEncodeSigHeaderJaipur(t *testing.T) { + t.Parallel() + // As part of the EIP-1559 fork in mumbai, an incorrect seal hash // was used for Bor that did not included the BaseFee. The Jaipur // block is a hard fork to fix that. diff --git a/consensus/bor/clerk.go b/consensus/bor/clerk.go index d7e6982873..ca610282a5 100644 --- a/consensus/bor/clerk.go +++ b/consensus/bor/clerk.go @@ -23,7 +23,7 @@ type EventRecordWithTime struct { Time time.Time `json:"record_time" yaml:"record_time"` } -// String returns the string representatin of span +// String returns the string representations of span func (e *EventRecordWithTime) String() string { return fmt.Sprintf( "id %v, contract %v, data: %v, txHash: %v, logIndex: %v, chainId: %v, time %s", diff --git a/consensus/bor/genesis_contracts_client.go b/consensus/bor/genesis_contracts_client.go index 582358e0cb..2b36b6e5e0 100644 --- a/consensus/bor/genesis_contracts_client.go +++ b/consensus/bor/genesis_contracts_client.go @@ -38,6 +38,7 @@ func NewGenesisContractsClient( ) *GenesisContractsClient { vABI, _ := abi.JSON(strings.NewReader(validatorsetABI)) sABI, _ := abi.JSON(strings.NewReader(stateReceiverABI)) + return &GenesisContractsClient{ validatorSetABI: vABI, stateReceiverABI: sABI, @@ -56,21 +57,27 @@ func (gc *GenesisContractsClient) CommitState( ) error { eventRecord := event.BuildEventRecord() recordBytes, err := rlp.EncodeToBytes(eventRecord) + if err != nil { return err } + method := "commitState" t := event.Time.Unix() data, err := gc.stateReceiverABI.Pack(method, big.NewInt(0).SetInt64(t), recordBytes) + if err != nil { log.Error("Unable to pack tx for commitState", "error", err) return err } + log.Info("→ committing new state", "eventRecord", event.String()) + msg := getSystemMessage(common.HexToAddress(gc.StateReceiverContract), data) if err := applyMessage(msg, state, header, gc.chainConfig, chCtx); err != nil { return err } + return nil } @@ -78,6 +85,7 @@ func (gc *GenesisContractsClient) LastStateId(snapshotNumber uint64) (*big.Int, blockNr := rpc.BlockNumber(snapshotNumber) method := "lastStateId" data, err := gc.stateReceiverABI.Pack(method) + if err != nil { log.Error("Unable to pack tx for LastStateId", "error", err) return nil, err @@ -91,6 +99,7 @@ func (gc *GenesisContractsClient) LastStateId(snapshotNumber uint64) (*big.Int, To: &toAddress, Data: &msgData, }, rpc.BlockNumberOrHash{BlockNumber: &blockNr}, nil) + if err != nil { return nil, err } @@ -99,5 +108,6 @@ func (gc *GenesisContractsClient) LastStateId(snapshotNumber uint64) (*big.Int, if err := gc.stateReceiverABI.UnpackIntoInterface(ret, method, result); err != nil { return nil, err } + return *ret, nil } diff --git a/consensus/bor/merkle.go b/consensus/bor/merkle.go index bdfbaba983..5c61eb4a12 100644 --- a/consensus/bor/merkle.go +++ b/consensus/bor/merkle.go @@ -2,12 +2,12 @@ package bor func appendBytes32(data ...[]byte) []byte { var result []byte + for _, v := range data { - paddedV, err := convertTo32(v) - if err == nil { - result = append(result, paddedV[:]...) - } + paddedV := convertTo32(v) + result = append(result, paddedV[:]...) } + return result } @@ -24,25 +24,29 @@ func nextPowerOfTwo(n uint64) uint64 { n |= n >> 16 n |= n >> 32 n++ + return n } -func convertTo32(input []byte) (output [32]byte, err error) { +func convertTo32(input []byte) (output [32]byte) { l := len(input) if l > 32 || l == 0 { return } + copy(output[32-l:], input[:]) + return } func convert(input []([32]byte)) [][]byte { var output [][]byte + for _, in := range input { newInput := make([]byte, len(in[:])) copy(newInput, in[:]) output = append(output, newInput) - } + return output } diff --git a/consensus/bor/rest.go b/consensus/bor/rest.go index 3ef531de18..49ecb38af5 100644 --- a/consensus/bor/rest.go +++ b/consensus/bor/rest.go @@ -40,39 +40,49 @@ func NewHeimdallClient(urlString string) (*HeimdallClient, error) { h := &HeimdallClient{ urlString: urlString, client: http.Client{ - Timeout: time.Duration(5 * time.Second), + Timeout: 5 * time.Second, }, closeCh: make(chan struct{}), } + return h, nil } func (h *HeimdallClient) FetchStateSyncEvents(fromID uint64, to int64) ([]*EventRecordWithTime, error) { eventRecords := make([]*EventRecordWithTime, 0) + for { queryParams := fmt.Sprintf("from-id=%d&to-time=%d&limit=%d", fromID, to, stateFetchLimit) log.Info("Fetching state sync events", "queryParams", queryParams) response, err := h.FetchWithRetry("clerk/event-record/list", queryParams) + if err != nil { return nil, err } + var _eventRecords []*EventRecordWithTime + if response.Result == nil { // status 204 break } + if err := json.Unmarshal(response.Result, &_eventRecords); err != nil { return nil, err } + eventRecords = append(eventRecords, _eventRecords...) + if len(_eventRecords) < stateFetchLimit { break } + fromID += uint64(stateFetchLimit) } sort.SliceStable(eventRecords, func(i, j int) bool { return eventRecords[i].ID < eventRecords[j].ID }) + return eventRecords, nil } @@ -130,7 +140,7 @@ func (h *HeimdallClient) FetchWithRetry(rawPath string, rawQuery string) (*Respo // internal fetch method func (h *HeimdallClient) internalFetch(u *url.URL) (*ResponseWithHeight, error) { - res, err := h.client.Get(u.String()) + res, err := h.client.Get(u.String()) // nolint: noctx if err != nil { return nil, err } diff --git a/consensus/bor/snapshot.go b/consensus/bor/snapshot.go index 8d212f33ef..ef92cc99b4 100644 --- a/consensus/bor/snapshot.go +++ b/consensus/bor/snapshot.go @@ -25,13 +25,6 @@ type Snapshot struct { Recents map[uint64]common.Address `json:"recents"` // Set of recent signers for spam protections } -// signersAscending implements the sort interface to allow sorting a list of addresses -type signersAscending []common.Address - -func (s signersAscending) Len() int { return len(s) } -func (s signersAscending) Less(i, j int) bool { return bytes.Compare(s[i][:], s[j][:]) < 0 } -func (s signersAscending) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - // newSnapshot creates a new snapshot with the specified startup parameters. This // method does not initialize the set of recent signers, so only ever use if for // the genesis block. @@ -52,6 +45,7 @@ func newSnapshot( ValidatorSet: NewValidatorSet(validators), Recents: make(map[uint64]common.Address), } + return snap } @@ -61,10 +55,13 @@ func loadSnapshot(config *params.BorConfig, sigcache *lru.ARCCache, db ethdb.Dat if err != nil { return nil, err } + snap := new(Snapshot) + if err := json.Unmarshal(blob, snap); err != nil { return nil, err } + snap.config = config snap.sigcache = sigcache snap.ethAPI = ethAPI @@ -83,6 +80,7 @@ func (s *Snapshot) store(db ethdb.Database) error { if err != nil { return err } + return db.Put(append([]byte("bor-"), s.Hash[:]...), blob) } @@ -115,6 +113,7 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { return nil, errOutOfRangeChain } } + if headers[0].Number.Uint64() != s.Number+1 { return nil, errOutOfRangeChain } @@ -126,7 +125,7 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { number := header.Number.Uint64() // Delete the oldest signer from the recent list to allow it signing again - if number >= s.config.Sprint && number-s.config.Sprint >= 0 { + if number >= s.config.Sprint { delete(snap.Recents, number-s.config.Sprint) } @@ -153,6 +152,7 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { if err := validateHeaderExtraField(header.Extra); err != nil { return nil, err } + validatorBytes := header.Extra[extraVanity : len(header.Extra)-extraSeal] // get validators from headers and use that for new validator set @@ -162,6 +162,7 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { snap.ValidatorSet = v } } + snap.Number += uint64(len(headers)) snap.Hash = headers[len(headers)-1].Hash() @@ -173,10 +174,13 @@ func (s *Snapshot) GetSignerSuccessionNumber(signer common.Address) (int, error) validators := s.ValidatorSet.Validators proposer := s.ValidatorSet.GetProposer().Address proposerIndex, _ := s.ValidatorSet.GetByAddress(proposer) + if proposerIndex == -1 { return -1, &UnauthorizedProposerError{s.Number, proposer.Bytes()} } + signerIndex, _ := s.ValidatorSet.GetByAddress(signer) + if signerIndex == -1 { return -1, &UnauthorizedSignerError{s.Number, signer.Bytes()} } @@ -187,6 +191,7 @@ func (s *Snapshot) GetSignerSuccessionNumber(signer common.Address) (int, error) tempIndex = tempIndex + len(validators) } } + return tempIndex - proposerIndex, nil } @@ -196,13 +201,14 @@ func (s *Snapshot) signers() []common.Address { for _, sig := range s.ValidatorSet.Validators { sigs = append(sigs, sig.Address) } + return sigs } // Difficulty returns the difficulty for a particular signer at the current snapshot number func (s *Snapshot) Difficulty(signer common.Address) uint64 { // if signer is empty - if bytes.Compare(signer.Bytes(), common.Address{}.Bytes()) == 0 { + if bytes.Equal(signer.Bytes(), common.Address{}.Bytes()) { return 1 } diff --git a/consensus/bor/snapshot_test.go b/consensus/bor/snapshot_test.go index 6bb8547843..2bbbc32123 100644 --- a/consensus/bor/snapshot_test.go +++ b/consensus/bor/snapshot_test.go @@ -16,6 +16,8 @@ const ( ) func TestGetSignerSuccessionNumber_ProposerIsSigner(t *testing.T) { + t.Parallel() + validators := buildRandomValidatorSet(numVals) validatorSet := NewValidatorSet(validators) snap := Snapshot{ @@ -25,17 +27,22 @@ func TestGetSignerSuccessionNumber_ProposerIsSigner(t *testing.T) { // proposer is signer signer := validatorSet.Proposer.Address successionNumber, err := snap.GetSignerSuccessionNumber(signer) + if err != nil { t.Fatalf("%s", err) } + assert.Equal(t, 0, successionNumber) } func TestGetSignerSuccessionNumber_SignerIndexIsLarger(t *testing.T) { + t.Parallel() + validators := buildRandomValidatorSet(numVals) // sort validators by address, which is what NewValidatorSet also does sort.Sort(ValidatorsByAddress(validators)) + proposerIndex := 32 signerIndex := 56 // give highest ProposerPriority to a particular val, so that they become the proposer @@ -47,13 +54,17 @@ func TestGetSignerSuccessionNumber_SignerIndexIsLarger(t *testing.T) { // choose a signer at an index greater than proposer index signer := snap.ValidatorSet.Validators[signerIndex].Address successionNumber, err := snap.GetSignerSuccessionNumber(signer) + if err != nil { t.Fatalf("%s", err) } + assert.Equal(t, signerIndex-proposerIndex, successionNumber) } func TestGetSignerSuccessionNumber_SignerIndexIsSmaller(t *testing.T) { + t.Parallel() + validators := buildRandomValidatorSet(numVals) proposerIndex := 98 signerIndex := 11 @@ -66,13 +77,17 @@ func TestGetSignerSuccessionNumber_SignerIndexIsSmaller(t *testing.T) { // choose a signer at an index greater than proposer index signer := snap.ValidatorSet.Validators[signerIndex].Address successionNumber, err := snap.GetSignerSuccessionNumber(signer) + if err != nil { t.Fatalf("%s", err) } + assert.Equal(t, signerIndex+numVals-proposerIndex, successionNumber) } func TestGetSignerSuccessionNumber_ProposerNotFound(t *testing.T) { + t.Parallel() + validators := buildRandomValidatorSet(numVals) snap := Snapshot{ ValidatorSet: NewValidatorSet(validators), @@ -89,6 +104,8 @@ func TestGetSignerSuccessionNumber_ProposerNotFound(t *testing.T) { } func TestGetSignerSuccessionNumber_SignerNotFound(t *testing.T) { + t.Parallel() + validators := buildRandomValidatorSet(numVals) snap := Snapshot{ ValidatorSet: NewValidatorSet(validators), @@ -101,9 +118,12 @@ func TestGetSignerSuccessionNumber_SignerNotFound(t *testing.T) { assert.Equal(t, dummySignerAddress.Bytes(), e.Signer) } +// nolint: unparam func buildRandomValidatorSet(numVals int) []*Validator { rand.Seed(time.Now().Unix()) + validators := make([]*Validator, numVals) + for i := 0; i < numVals; i++ { validators[i] = &Validator{ Address: randomAddress(), @@ -114,11 +134,13 @@ func buildRandomValidatorSet(numVals int) []*Validator { // sort validators by address, which is what NewValidatorSet also does sort.Sort(ValidatorsByAddress(validators)) + return validators } func randomAddress() common.Address { bytes := make([]byte, 32) rand.Read(bytes) + return common.BytesToAddress(bytes) } diff --git a/consensus/bor/validator.go b/consensus/bor/validator.go index 00e9fdc645..57905fdf89 100644 --- a/consensus/bor/validator.go +++ b/consensus/bor/validator.go @@ -43,9 +43,12 @@ func (v *Validator) Cmp(other *Validator) *Validator { if v == nil { return other } + if other == nil { return v } + + // nolint:nestif if v.ProposerPriority > other.ProposerPriority { return v } else if v.ProposerPriority < other.ProposerPriority { @@ -66,6 +69,7 @@ func (v *Validator) String() string { if v == nil { return "nil-Validator" } + return fmt.Sprintf("Validator{%v Power:%v Priority:%v}", v.Address.Hex(), v.VotingPower, @@ -87,6 +91,7 @@ func (v *Validator) HeaderBytes() []byte { result := make([]byte, 40) copy(result[:20], v.Address.Bytes()) copy(result[20:], v.PowerBytes()) + return result } @@ -95,6 +100,7 @@ func (v *Validator) PowerBytes() []byte { powerBytes := big.NewInt(0).SetInt64(v.VotingPower).Bytes() result := make([]byte, 20) copy(result[20-len(powerBytes):], powerBytes) + return result } @@ -114,6 +120,7 @@ func ParseValidators(validatorsBytes []byte) ([]*Validator, error) { } result := make([]*Validator, len(validatorsBytes)/40) + for i := 0; i < len(validatorsBytes); i += 40 { address := make([]byte, 20) power := make([]byte, 20) @@ -142,6 +149,7 @@ func SortMinimalValByAddress(a []MinimalVal) []MinimalVal { sort.Slice(a, func(i, j int) bool { return bytes.Compare(a[i].Signer.Bytes(), a[j].Signer.Bytes()) < 0 }) + return a } @@ -150,5 +158,6 @@ func ValidatorsToMinimalValidators(vals []Validator) (minVals []MinimalVal) { for _, val := range vals { minVals = append(minVals, val.MinimalVal()) } + return } diff --git a/consensus/bor/validator_set.go b/consensus/bor/validator_set.go index 0b5c10ebd0..892891bbda 100644 --- a/consensus/bor/validator_set.go +++ b/consensus/bor/validator_set.go @@ -56,12 +56,15 @@ type ValidatorSet struct { func NewValidatorSet(valz []*Validator) *ValidatorSet { vals := &ValidatorSet{} err := vals.updateWithChangeSet(valz, false) + if err != nil { panic(fmt.Sprintf("cannot create validator set: %s", err)) } + if len(valz) > 0 { vals.IncrementProposerPriority(1) } + return vals } @@ -72,9 +75,10 @@ func (vals *ValidatorSet) IsNilOrEmpty() bool { // Increment ProposerPriority and update the proposer on a copy, and return it. func (vals *ValidatorSet) CopyIncrementProposerPriority(times int) *ValidatorSet { - copy := vals.Copy() - copy.IncrementProposerPriority(times) - return copy + validatorCopy := vals.Copy() + validatorCopy.IncrementProposerPriority(times) + + return validatorCopy } // IncrementProposerPriority increments ProposerPriority of each validator and updates the @@ -84,6 +88,7 @@ func (vals *ValidatorSet) IncrementProposerPriority(times int) { if vals.IsNilOrEmpty() { panic("empty validator set") } + if times <= 0 { panic("Cannot call IncrementProposerPriority with non-positive times") } @@ -120,6 +125,7 @@ func (vals *ValidatorSet) RescalePriorities(diffMax int64) { // NOTE: This may make debugging priority issues easier as well. diff := computeMaxMinPriorityDiff(vals) ratio := (diff + diffMax - 1) / diffMax + if diff > diffMax { for _, val := range vals.Validators { val.ProposerPriority = val.ProposerPriority / ratio @@ -145,10 +151,13 @@ func (vals *ValidatorSet) incrementProposerPriority() *Validator { func (vals *ValidatorSet) computeAvgProposerPriority() int64 { n := int64(len(vals.Validators)) sum := big.NewInt(0) + for _, val := range vals.Validators { sum.Add(sum, big.NewInt(val.ProposerPriority)) } + avg := sum.Div(sum, big.NewInt(n)) + if avg.IsInt64() { return avg.Int64() } @@ -162,17 +171,22 @@ func computeMaxMinPriorityDiff(vals *ValidatorSet) int64 { if vals.IsNilOrEmpty() { panic("empty validator set") } + max := int64(math.MinInt64) min := int64(math.MaxInt64) + for _, v := range vals.Validators { if v.ProposerPriority < min { min = v.ProposerPriority } + if v.ProposerPriority > max { max = v.ProposerPriority } } + diff := max - min + if diff < 0 { return -1 * diff } else { @@ -185,6 +199,7 @@ func (vals *ValidatorSet) getValWithMostPriority() *Validator { for _, val := range vals.Validators { res = res.Cmp(val) } + return res } @@ -192,7 +207,9 @@ func (vals *ValidatorSet) shiftByAvgProposerPriority() { if vals.IsNilOrEmpty() { panic("empty validator set") } + avgProposerPriority := vals.computeAvgProposerPriority() + for _, val := range vals.Validators { val.ProposerPriority = safeSubClip(val.ProposerPriority, avgProposerPriority) } @@ -203,10 +220,13 @@ func validatorListCopy(valsList []*Validator) []*Validator { if valsList == nil { return nil } + valsCopy := make([]*Validator, len(valsList)) + for i, val := range valsList { valsCopy[i] = val.Copy() } + return valsCopy } @@ -225,6 +245,7 @@ func (vals *ValidatorSet) HasAddress(address []byte) bool { idx := sort.Search(len(vals.Validators), func(i int) bool { return bytes.Compare(address, vals.Validators[i].Address.Bytes()) <= 0 }) + return idx < len(vals.Validators) && bytes.Equal(vals.Validators[idx].Address.Bytes(), address) } @@ -237,6 +258,7 @@ func (vals *ValidatorSet) GetByAddress(address common.Address) (index int, val * if idx < len(vals.Validators) && bytes.Equal(vals.Validators[idx].Address.Bytes(), address.Bytes()) { return idx, vals.Validators[idx].Copy() } + return -1, nil } @@ -247,7 +269,9 @@ func (vals *ValidatorSet) GetByIndex(index int) (address []byte, val *Validator) if index < 0 || index >= len(vals.Validators) { return nil, nil } + val = vals.Validators[index] + return val.Address.Bytes(), val.Copy() } @@ -258,7 +282,6 @@ func (vals *ValidatorSet) Size() int { // Force recalculation of the set's total voting power. func (vals *ValidatorSet) updateTotalVotingPower() error { - sum := int64(0) for _, val := range vals.Validators { // mind overflow @@ -267,7 +290,9 @@ func (vals *ValidatorSet) updateTotalVotingPower() error { return &TotalVotingPowerExceededError{sum, vals.Validators} } } + vals.totalVotingPower = sum + return nil } @@ -276,11 +301,13 @@ func (vals *ValidatorSet) updateTotalVotingPower() error { func (vals *ValidatorSet) TotalVotingPower() int64 { if vals.totalVotingPower == 0 { log.Info("invoking updateTotalVotingPower before returning it") + if err := vals.updateTotalVotingPower(); err != nil { // Can/should we do better? panic(err) } } + return vals.totalVotingPower } @@ -290,9 +317,11 @@ func (vals *ValidatorSet) GetProposer() (proposer *Validator) { if len(vals.Validators) == 0 { return nil } + if vals.Proposer == nil { vals.Proposer = vals.findProposer() } + return vals.Proposer.Copy() } @@ -303,6 +332,7 @@ func (vals *ValidatorSet) findProposer() *Validator { proposer = proposer.Cmp(val) } } + return proposer } @@ -343,6 +373,7 @@ func processChanges(origChanges []*Validator) (updates, removals []*Validator, e removals = make([]*Validator, 0, len(changes)) updates = make([]*Validator, 0, len(changes)) + var prevAddr common.Address // Scan changes by address and append valid validators to updates or removals lists. @@ -351,22 +382,27 @@ func processChanges(origChanges []*Validator) (updates, removals []*Validator, e err = fmt.Errorf("duplicate entry %v in %v", valUpdate, changes) return nil, nil, err } + if valUpdate.VotingPower < 0 { err = fmt.Errorf("voting power can't be negative: %v", valUpdate) return nil, nil, err } + if valUpdate.VotingPower > MaxTotalVotingPower { err = fmt.Errorf("to prevent clipping/ overflow, voting power can't be higher than %v: %v ", MaxTotalVotingPower, valUpdate) return nil, nil, err } + if valUpdate.VotingPower == 0 { removals = append(removals, valUpdate) } else { updates = append(updates, valUpdate) } + prevAddr = valUpdate.Address } + return updates, removals, err } @@ -382,12 +418,12 @@ func processChanges(origChanges []*Validator) (updates, removals []*Validator, e // by processChanges for duplicates and invalid values. // No changes are made to the validator set 'vals'. func verifyUpdates(updates []*Validator, vals *ValidatorSet) (updatedTotalVotingPower int64, numNewValidators int, err error) { - updatedTotalVotingPower = vals.TotalVotingPower() for _, valUpdate := range updates { address := valUpdate.Address _, val := vals.GetByAddress(address) + if val == nil { // New validator, add its voting power the the total. updatedTotalVotingPower += valUpdate.VotingPower @@ -396,11 +432,14 @@ func verifyUpdates(updates []*Validator, vals *ValidatorSet) (updatedTotalVoting // Updated validator, add the difference in power to the total. updatedTotalVotingPower += valUpdate.VotingPower - val.VotingPower } + overflow := updatedTotalVotingPower > MaxTotalVotingPower + if overflow { err = fmt.Errorf( "failed to add/update validator %v, total voting power would exceed the max allowed %v", valUpdate, MaxTotalVotingPower) + return 0, 0, err } } @@ -414,10 +453,10 @@ func verifyUpdates(updates []*Validator, vals *ValidatorSet) (updatedTotalVoting // 'updates' parameter must be a list of unique validators to be added or updated. // No changes are made to the validator set 'vals'. func computeNewPriorities(updates []*Validator, vals *ValidatorSet, updatedTotalVotingPower int64) { - for _, valUpdate := range updates { address := valUpdate.Address _, val := vals.GetByAddress(address) + if val == nil { // add val // Set ProposerPriority to -C*totalVotingPower (with C ~= 1.125) to make sure validators can't @@ -432,7 +471,6 @@ func computeNewPriorities(updates []*Validator, vals *ValidatorSet, updatedTotal valUpdate.ProposerPriority = val.ProposerPriority } } - } // Merges the vals' validator list with the updates list. @@ -440,7 +478,6 @@ func computeNewPriorities(updates []*Validator, vals *ValidatorSet, updatedTotal // Expects updates to be a list of updates sorted by address with no duplicates or errors, // must have been validated with verifyUpdates() and priorities computed with computeNewPriorities(). func (vals *ValidatorSet) applyUpdates(updates []*Validator) { - existing := vals.Validators merged := make([]*Validator, len(existing)+len(updates)) i := 0 @@ -478,24 +515,25 @@ func (vals *ValidatorSet) applyUpdates(updates []*Validator) { // Checks that the validators to be removed are part of the validator set. // No changes are made to the validator set 'vals'. func verifyRemovals(deletes []*Validator, vals *ValidatorSet) error { - for _, valUpdate := range deletes { address := valUpdate.Address _, val := vals.GetByAddress(address) + if val == nil { return fmt.Errorf("failed to find validator %X to remove", address) } } + if len(deletes) > len(vals.Validators) { panic("more deletes than validators") } + return nil } // Removes the validators specified in 'deletes' from validator set 'vals'. // Should not fail as verification has been done before. func (vals *ValidatorSet) applyRemovals(deletes []*Validator) { - existing := vals.Validators merged := make([]*Validator, len(existing)-len(deletes)) @@ -509,6 +547,7 @@ func (vals *ValidatorSet) applyRemovals(deletes []*Validator) { merged[i] = existing[0] i++ } + existing = existing[1:] } @@ -526,7 +565,6 @@ func (vals *ValidatorSet) applyRemovals(deletes []*Validator) { // are not allowed and will trigger an error if present in 'changes'. // The 'allowDeletes' flag is set to false by NewValidatorSet() and to true by UpdateWithChangeSet(). func (vals *ValidatorSet) updateWithChangeSet(changes []*Validator, allowDeletes bool) error { - if len(changes) <= 0 { return nil } @@ -596,19 +634,19 @@ func (vals *ValidatorSet) UpdateWithChangeSet(changes []*Validator) error { func IsErrTooMuchChange(err error) bool { switch err.(type) { - case errTooMuchChange: + case tooMuchChangeError: return true default: return false } } -type errTooMuchChange struct { +type tooMuchChangeError struct { got int64 needed int64 } -func (e errTooMuchChange) Error() string { +func (e tooMuchChangeError) Error() string { return fmt.Sprintf("Invalid commit -- insufficient old voting power: got %v, needed %v", e.got, e.needed) } @@ -622,11 +660,14 @@ func (vals *ValidatorSet) StringIndented(indent string) string { if vals == nil { return "nil-ValidatorSet" } + var valStrings []string + vals.Iterate(func(index int, val *Validator) bool { valStrings = append(valStrings, val.String()) return false }) + return fmt.Sprintf(`ValidatorSet{ %s Proposer: %v %s Validators: @@ -636,7 +677,6 @@ func (vals *ValidatorSet) StringIndented(indent string) string { indent, indent, strings.Join(valStrings, "\n"+indent+" "), indent) - } //------------------------------------- @@ -668,6 +708,7 @@ func safeAdd(a, b int64) (int64, bool) { } else if b < 0 && a < math.MinInt64-b { return -1, true } + return a + b, false } @@ -677,6 +718,7 @@ func safeSub(a, b int64) (int64, bool) { } else if b < 0 && a > math.MaxInt64+b { return -1, true } + return a - b, false } @@ -686,8 +728,10 @@ func safeAddClip(a, b int64) int64 { if b < 0 { return math.MinInt64 } + return math.MaxInt64 } + return c } @@ -697,7 +741,9 @@ func safeSubClip(a, b int64) int64 { if b > 0 { return math.MinInt64 } + return math.MaxInt64 } + return c } From 2b089ee6d3e54fbaf0051babd06608e32769e8b8 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Tue, 24 May 2022 14:32:44 +0530 Subject: [PATCH 106/190] fix: return value for no remote block --- eth/downloader/whitelist/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go index 2ddad0e5ab..f12639454f 100644 --- a/eth/downloader/whitelist/service.go +++ b/eth/downloader/whitelist/service.go @@ -56,7 +56,7 @@ func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber } if len(headers) == 0 { - return true, fmt.Errorf("%w: last checkpoint %d", ErrNoRemoteCheckoint, lastCheckpointBlockNum) + return false, fmt.Errorf("%w: last checkpoint %d", ErrNoRemoteCheckoint, lastCheckpointBlockNum) } reqBlockNum := headers[0].Number.Uint64() From c46a29340dc4c6512d52b4fcb7f629aeb6ed3da2 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Tue, 24 May 2022 14:34:26 +0530 Subject: [PATCH 107/190] handle all errors --- eth/downloader/downloader.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 4420ca2c1b..12b4a90dde 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -797,8 +797,7 @@ func (d *Downloader) getFetchHeadersByNumber(p *peerConnection) func(number uint // the head links match), we do a binary search to find the common ancestor. func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) (uint64, error) { // Check the validity of chain to be downloaded - // TODO: we can use a mock and - if _, err := d.IsValidChain(remoteHeader, d.getFetchHeadersByNumber(p)); errors.Is(err, whitelist.ErrCheckpointMismatch) { + if _, err := d.IsValidChain(remoteHeader, d.getFetchHeadersByNumber(p)); err != nil { return 0, err } From 9c861920d5b797bbf607413ac128f9ecbd775816 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Tue, 24 May 2022 15:41:26 +0530 Subject: [PATCH 108/190] modularise fake chain validator in downloader --- eth/downloader/downloader_test.go | 50 +++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 9d847e382e..f141e9d019 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -1394,27 +1394,42 @@ func testCheckpointEnforcement(t *testing.T, protocol uint, mode SyncMode) { } } +// whitelistFake is a mock for the chain validator service type whitelistFake struct { - err error - res bool + // count denotes the number of times the validate function was called + count int + + // validate is the dynamic function to be called while syncing + validate func(count int) (bool, error) } -func newWhitelistFake(res bool, err error) *whitelistFake { - return &whitelistFake{err, res} +// newWhitelistFake returns a new mock whitelist +func newWhitelistFake(validate func(count int) (bool, error)) *whitelistFake { + return &whitelistFake{0, validate} } +// IsValidChain is the mock function which the downloader will use to validate the chain +// to be received from a peer. func (w *whitelistFake) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) { - return w.res, w.err + defer func() { + w.count++ + }() + return w.validate(w.count) } func (w *whitelistFake) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) {} +// TestFakedSyncProgress66WhitelistMismatch tests if in case of whitelisted +// checkpoint mismatch with opposite peer, the sync should fail. func TestFakedSyncProgress66WhitelistMismatch(t *testing.T) { protocol := uint(eth.ETH66) mode := FullSync tester := newTester() - tester.downloader.ChainValidator = newWhitelistFake(true, whitelist.ErrCheckpointMismatch) + validate := func(count int) (bool, error) { + return false, whitelist.ErrCheckpointMismatch + } + tester.downloader.ChainValidator = newWhitelistFake(validate) defer tester.terminate() @@ -1426,3 +1441,26 @@ func TestFakedSyncProgress66WhitelistMismatch(t *testing.T) { t.Fatal("succeeded attacker synchronisation") } } + +// TestFakedSyncProgress66WhitelistMatch tests if in case of whitelisted +// checkpoint match with opposite peer, the sync should succeed. +func TestFakedSyncProgress66WhitelistMatch(t *testing.T) { + protocol := uint(eth.ETH66) + mode := FullSync + + tester := newTester() + validate := func(count int) (bool, error) { + return true, nil + } + tester.downloader.ChainValidator = newWhitelistFake(validate) + + defer tester.terminate() + + chainA := testChainForkLightA.blocks + tester.newPeer("light", protocol, chainA[1:]) + + // Synchronise with the peer and make sure all blocks were retrieved + if err := tester.sync("light", nil, mode); err != nil { + t.Fatal("succeeded attacker synchronisation") + } +} From cb9d29151c4c4883e0a3875da2995b292892bad7 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Tue, 24 May 2022 16:29:39 +0530 Subject: [PATCH 109/190] add more tests --- eth/downloader/downloader_test.go | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index f141e9d019..cb0e656e39 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -43,6 +43,7 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" + "github.com/stretchr/testify/assert" ) // downloadTester is a test simulator for mocking out local block chain. @@ -1464,3 +1465,37 @@ func TestFakedSyncProgress66WhitelistMatch(t *testing.T) { t.Fatal("succeeded attacker synchronisation") } } + +// TestFakedSyncProgress66NoRemoteCheckpoint tests if in case of missing/invalid +// checkpointed blocks with opposite peer, the sync should fail initially but +// with the retry mechanism, it should succeed eventually. +func TestFakedSyncProgress66NoRemoteCheckpoint(t *testing.T) { + protocol := uint(eth.ETH66) + mode := FullSync + + tester := newTester() + validate := func(count int) (bool, error) { + // only return the `ErrNoRemoteCheckoint` error for the first call + if count == 0 { + return false, whitelist.ErrNoRemoteCheckoint + } + return true, nil + } + tester.downloader.ChainValidator = newWhitelistFake(validate) + + defer tester.terminate() + + chainA := testChainForkLightA.blocks + tester.newPeer("light", protocol, chainA[1:]) + + // Synchronise with the peer and make sure all blocks were retrieved + // Should fail in first attempt + if err := tester.sync("light", nil, mode); err != nil { + assert.Equal(t, whitelist.ErrNoRemoteCheckoint, err, "failed synchronisation") + } + + // Try syncing again, should succeed + if err := tester.sync("light", nil, mode); err != nil { + t.Fatal("succeeded attacker synchronisation") + } +} From 2ba7c036a7d029974471f13add74d644ea489489 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Tue, 24 May 2022 17:13:49 +0530 Subject: [PATCH 110/190] fix tests --- eth/downloader/whitelist/service_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/eth/downloader/whitelist/service_test.go b/eth/downloader/whitelist/service_test.go index de1e902e99..79a92da826 100644 --- a/eth/downloader/whitelist/service_test.go +++ b/eth/downloader/whitelist/service_test.go @@ -57,7 +57,8 @@ func TestIsValidChain(t *testing.T) { return nil, nil, nil } - // case2: false fetchHeadersByNumber function provided, should consider the chain as valid + // case2: false fetchHeadersByNumber function provided, should consider the chain as invalid + // and throw `ErrNoRemoteCheckoint` error res, err = s.IsValidChain(nil, falseFetchHeadersByNumber) if err == nil { t.Fatal("expected error, got nil") @@ -67,7 +68,7 @@ func TestIsValidChain(t *testing.T) { t.Fatalf("expected error ErrNoRemoteCheckoint, got %v", err) } - assert.Equal(t, res, true, "expected chain to be valid") + assert.Equal(t, res, false, "expected chain to be invalid") // case3: correct fetchHeadersByNumber function provided, should consider the chain as valid // create a mock function, returning a the required header From 45a72bc49e40516b2d8969a3849d82655f0927f2 Mon Sep 17 00:00:00 2001 From: Jerry Date: Fri, 20 May 2022 13:49:37 -0700 Subject: [PATCH 111/190] Lint internal/cli --- internal/cli/account.go | 1 + internal/cli/account_import.go | 5 +++++ internal/cli/account_list.go | 5 +++++ internal/cli/account_new.go | 1 + internal/cli/attach.go | 27 ++++++++++++++++++++------- internal/cli/bootnode.go | 12 +++++++++++- internal/cli/bor_fingerprint.go | 12 +++++++++--- internal/cli/chain.go | 1 + internal/cli/chain_sethead.go | 4 ++++ internal/cli/chain_watch.go | 8 +++++++- internal/cli/command.go | 17 +++++++++++++++-- internal/cli/debug.go | 15 ++++++++++++--- internal/cli/markdown_test.go | 1 + internal/cli/peers.go | 1 + internal/cli/peers_add.go | 2 ++ internal/cli/peers_list.go | 5 +++++ internal/cli/peers_remove.go | 2 ++ internal/cli/peers_status.go | 4 ++++ internal/cli/status.go | 5 +++++ internal/cli/version.go | 2 ++ 20 files changed, 113 insertions(+), 17 deletions(-) diff --git a/internal/cli/account.go b/internal/cli/account.go index 7ce6c09b63..bb8b30b892 100644 --- a/internal/cli/account.go +++ b/internal/cli/account.go @@ -19,6 +19,7 @@ func (a *Account) MarkDown() string { "- [```account list```](./account_list.md): List the wallets in the Bor client.", "- [```account import```](./account_import.md): Import an account to the Bor client.", } + return strings.Join(items, "\n\n") } diff --git a/internal/cli/account_import.go b/internal/cli/account_import.go index d7ab14601a..a3f65ab512 100644 --- a/internal/cli/account_import.go +++ b/internal/cli/account_import.go @@ -20,6 +20,7 @@ func (a *AccountImportCommand) MarkDown() string { "The ```account import``` command imports an account in Json format to the Bor data directory.", a.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -58,7 +59,9 @@ func (a *AccountImportCommand) Run(args []string) int { a.UI.Error("Expected one argument") return 1 } + key, err := crypto.LoadECDSA(args[0]) + if err != nil { a.UI.Error(fmt.Sprintf("Failed to load the private key '%s': %v", args[0], err)) return 1 @@ -80,6 +83,8 @@ func (a *AccountImportCommand) Run(args []string) int { if err != nil { utils.Fatalf("Could not create the account: %v", err) } + a.UI.Output(fmt.Sprintf("Account created: %s", acct.Address.String())) + return 0 } diff --git a/internal/cli/account_list.go b/internal/cli/account_list.go index db77158b8e..854934c447 100644 --- a/internal/cli/account_list.go +++ b/internal/cli/account_list.go @@ -19,6 +19,7 @@ func (a *AccountListCommand) MarkDown() string { "The `account list` command lists all the accounts in the Bor data directory.", a.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -53,7 +54,9 @@ func (a *AccountListCommand) Run(args []string) int { a.UI.Error(fmt.Sprintf("Failed to get keystore: %v", err)) return 1 } + a.UI.Output(formatAccounts(keystore.Accounts())) + return 0 } @@ -64,10 +67,12 @@ func formatAccounts(accts []accounts.Account) string { rows := make([]string, len(accts)+1) rows[0] = "Index|Address" + for i, d := range accts { rows[i+1] = fmt.Sprintf("%d|%s", i, d.Address.String()) } + return formatList(rows) } diff --git a/internal/cli/account_new.go b/internal/cli/account_new.go index f6591fc53b..aef272a389 100644 --- a/internal/cli/account_new.go +++ b/internal/cli/account_new.go @@ -18,6 +18,7 @@ func (a *AccountNewCommand) MarkDown() string { "The `account new` command creates a new local account file on the Bor data directory. Bor should not be running to execute this command.", a.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } diff --git a/internal/cli/attach.go b/internal/cli/attach.go index df1c76ff3d..1aa888c12b 100644 --- a/internal/cli/attach.go +++ b/internal/cli/attach.go @@ -6,12 +6,12 @@ import ( "path/filepath" "strings" - "github.com/ethereum/go-ethereum/internal/cli/flagset" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/internal/cli/flagset" "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rpc" + "github.com/mitchellh/cli" ) @@ -33,6 +33,7 @@ func (c *AttachCommand) MarkDown() string { "Connect to remote Bor IPC console.", c.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -49,7 +50,6 @@ func (c *AttachCommand) Synopsis() string { } func (c *AttachCommand) Flags() *flagset.Flagset { - f := flagset.NewFlagSet("attach") f.StringFlag(&flagset.StringFlag{ @@ -75,13 +75,13 @@ func (c *AttachCommand) Flags() *flagset.Flagset { // Run implements the cli.Command interface func (c *AttachCommand) Run(args []string) int { - flags := c.Flags() //check if first arg is flag or IPC location if len(args) == 0 { args = append(args, "") } + if args[0] != "" && strings.HasPrefix(args[0], "--") { if err := flags.Parse(args); err != nil { c.UI.Error(err.Error()) @@ -94,6 +94,7 @@ func (c *AttachCommand) Run(args []string) int { return 1 } } + if err := c.remoteConsole(); err != nil { c.UI.Error(err.Error()) return 1 @@ -104,25 +105,30 @@ func (c *AttachCommand) Run(args []string) int { // remoteConsole will connect to a remote bor instance, attaching a JavaScript // console to it. +// nolint: unparam func (c *AttachCommand) remoteConsole() error { // Attach to a remotely running geth instance and start the JavaScript console - path := node.DefaultDataDir() if c.Endpoint == "" { if c.Meta.dataDir != "" { path = c.Meta.dataDir } + if path != "" { homeDir, _ := os.UserHomeDir() path = filepath.Join(homeDir, "/.bor/data") } + c.Endpoint = fmt.Sprintf("%s/bor.ipc", path) } + client, err := dialRPC(c.Endpoint) + if err != nil { utils.Fatalf("Unable to attach to remote bor: %v", err) } + config := console.Config{ DataDir: path, DocRoot: c.JSpathFlag, @@ -134,7 +140,12 @@ func (c *AttachCommand) remoteConsole() error { if err != nil { utils.Fatalf("Failed to start the JavaScript console: %v", err) } - defer console.Stop(false) + + defer func() { + if err := console.Stop(false); err != nil { + c.UI.Error(err.Error()) + } + }() if c.ExecCMD != "" { console.Evaluate(c.ExecCMD) @@ -159,6 +170,7 @@ func dialRPC(endpoint string) (*rpc.Client, error) { // these prefixes. endpoint = endpoint[4:] } + return rpc.Dial(endpoint) } @@ -175,5 +187,6 @@ func (c *AttachCommand) makeConsolePreloads() []string { for _, file := range strings.Split(c.PreloadJSFlag, ",") { preloads = append(preloads, strings.TrimSpace(file)) } + return preloads } diff --git a/internal/cli/bootnode.go b/internal/cli/bootnode.go index f9127494a6..9e1a0fcde9 100644 --- a/internal/cli/bootnode.go +++ b/internal/cli/bootnode.go @@ -19,6 +19,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/mitchellh/cli" ) @@ -45,6 +46,7 @@ func (c *BootnodeCommand) MarkDown() string { "# Bootnode", c.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -103,6 +105,7 @@ func (b *BootnodeCommand) Synopsis() string { } // Run implements the cli.Command interface +// nolint: gocognit func (b *BootnodeCommand) Run(args []string) int { flags := b.Flags() if err := flags.Parse(args); err != nil { @@ -118,6 +121,7 @@ func (b *BootnodeCommand) Run(args []string) int { } else { glogger.Verbosity(log.LvlInfo) } + log.Root().SetHandler(glogger) natm, err := nat.Parse(b.nat) @@ -128,6 +132,7 @@ func (b *BootnodeCommand) Run(args []string) int { // create a one time key var nodeKey *ecdsa.PrivateKey + // nolint: nestif if b.nodeKey != "" { // try to read the key either from file or command line if _, err := os.Stat(b.nodeKey); errors.Is(err, os.ErrNotExist) { @@ -157,7 +162,7 @@ func (b *BootnodeCommand) Run(args []string) int { } // save the public key pubRaw := fmt.Sprintf("%x", crypto.FromECDSAPub(&nodeKey.PublicKey)[1:]) - if err := ioutil.WriteFile(filepath.Join(path, "pub.key"), []byte(pubRaw), 0755); err != nil { + if err := ioutil.WriteFile(filepath.Join(path, "pub.key"), []byte(pubRaw), 0600); err != nil { b.UI.Error(fmt.Sprintf("failed to write node pub key: %v", err)) return 1 } @@ -169,7 +174,9 @@ func (b *BootnodeCommand) Run(args []string) int { b.UI.Error(fmt.Sprintf("could not resolve udp addr '%s': %v", b.listenAddr, err)) return 1 } + conn, err := net.ListenUDP("udp", addr) + if err != nil { b.UI.Error(fmt.Sprintf("failed to listen udp addr '%s': %v", b.listenAddr, err)) return 1 @@ -180,7 +187,9 @@ func (b *BootnodeCommand) Run(args []string) int { if !realaddr.IP.IsLoopback() { go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") } + if ext, err := natm.ExternalIP(); err == nil { + // nolint: govet realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port} } } @@ -198,6 +207,7 @@ func (b *BootnodeCommand) Run(args []string) int { PrivateKey: nodeKey, Log: log.Root(), } + if b.v5 { if _, err := discover.ListenV5(conn, ln, cfg); err != nil { utils.Fatalf("%v", err) diff --git a/internal/cli/bor_fingerprint.go b/internal/cli/bor_fingerprint.go index e9f4e70398..4e21f02956 100644 --- a/internal/cli/bor_fingerprint.go +++ b/internal/cli/bor_fingerprint.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/params" + "github.com/mitchellh/cli" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/disk" @@ -25,6 +26,7 @@ func (c *FingerprintCommand) MarkDown() string { "# Fingerprint", "Display the system fingerprint", } + return strings.Join(items, "\n\n") } @@ -45,6 +47,7 @@ func getCoresCount(cp []cpu.InfoStat) int { for i := 0; i < len(cp); i++ { cores += int(cp[i].Cores) } + return cores } @@ -76,6 +79,7 @@ func formatFingerprint(borFingerprint *BorFingerprint) string { fmt.Sprintf("RAM :: total : %v GB, free : %v GB, used : %v GB", borFingerprint.MemoryDetails.TotalMem, borFingerprint.MemoryDetails.FreeMem, borFingerprint.MemoryDetails.UsedMem), fmt.Sprintf("STORAGE :: total : %v GB, free : %v GB, used : %v GB", borFingerprint.DiskDetails.TotalDisk, borFingerprint.DiskDetails.FreeDisk, borFingerprint.DiskDetails.UsedDisk), }) + return base } @@ -85,13 +89,13 @@ func convertBytesToGB(bytesValue uint64) float64 { // Checks if fio exists on the node func (c *FingerprintCommand) checkFio() error { - cmd := exec.Command("/bin/sh", "-c", "fio -v") _, err := cmd.CombinedOutput() if err != nil { message := "\nFio package not installed. Install Fio for IOPS Benchmarking :\n\nDebianOS : 'sudo apt-get update && sudo apt-get install fio -y'\nAWS AMI/CentOS : 'sudo yum install fio -y'\nOracle LinuxOS : 'sudo dnf install fio -y'\n" c.UI.Output(message) + return err } @@ -101,9 +105,12 @@ func (c *FingerprintCommand) checkFio() error { // Run the IOPS benchmark for the node func (c *FingerprintCommand) benchmark() error { var b []byte + err := c.checkFio() + if err != nil { - return nil + // Missing Fio is not a fatal error. A message will be logged in console when it is missing in "checkFio()". + return nil //nolint:nilerr } c.UI.Output("\nRunning a 10 second test...\n") @@ -123,7 +130,6 @@ func (c *FingerprintCommand) benchmark() error { // Run implements the cli.Command interface func (c *FingerprintCommand) Run(args []string) int { - v, err := mem.VirtualMemory() if err != nil { c.UI.Error(err.Error()) diff --git a/internal/cli/chain.go b/internal/cli/chain.go index 896ce42cc4..9a7e9e8537 100644 --- a/internal/cli/chain.go +++ b/internal/cli/chain.go @@ -19,6 +19,7 @@ func (c *ChainCommand) MarkDown() string { "- [```chain sethead```](./chain_sethead.md): Set the current chain to a certain block.", "- [```chain watch```](./chain_watch.md): Watch the chainHead, reorg and fork events in real-time.", } + return strings.Join(items, "\n\n") } diff --git a/internal/cli/chain_sethead.go b/internal/cli/chain_sethead.go index 4d34479e0b..718ada4648 100644 --- a/internal/cli/chain_sethead.go +++ b/internal/cli/chain_sethead.go @@ -26,6 +26,7 @@ func (a *ChainSetHeadCommand) MarkDown() string { "- ```number```: The block number to roll back.", a.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -45,6 +46,7 @@ func (c *ChainSetHeadCommand) Flags() *flagset.Flagset { Default: false, Value: &c.yes, }) + return flags } @@ -88,6 +90,7 @@ func (c *ChainSetHeadCommand) Run(args []string) int { c.UI.Error(err.Error()) return 1 } + if response != "y" { c.UI.Output("set head aborted") return 0 @@ -100,5 +103,6 @@ func (c *ChainSetHeadCommand) Run(args []string) int { } c.UI.Output("Done!") + return 0 } diff --git a/internal/cli/chain_watch.go b/internal/cli/chain_watch.go index 72bd21b85d..17a65a8d99 100644 --- a/internal/cli/chain_watch.go +++ b/internal/cli/chain_watch.go @@ -24,6 +24,7 @@ func (c *ChainWatchCommand) MarkDown() string { "# Chain watch", "The ```chain watch``` command is used to view the chainHead, reorg and fork events in real-time.", } + return strings.Join(items, "\n\n") } @@ -70,7 +71,10 @@ func (c *ChainWatchCommand) Run(args []string) int { go func() { <-signalCh - sub.CloseSend() + + if err := sub.CloseSend(); err != nil { + c.UI.Error(err.Error()) + } }() for { @@ -80,6 +84,7 @@ func (c *ChainWatchCommand) Run(args []string) int { c.UI.Output(err.Error()) break } + c.UI.Output(formatHeadEvent(msg)) } @@ -95,5 +100,6 @@ func formatHeadEvent(msg *proto.ChainWatchResponse) string { } else if msg.Type == core.Chain2HeadReorgEvent { out = fmt.Sprintf("Reorg Detected \nAdded : %v \nRemoved : %v", msg.Newchain, msg.Oldchain) } + return out } diff --git a/internal/cli/command.go b/internal/cli/command.go index d1851594a7..34f7c4ef12 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -9,11 +9,16 @@ import ( "github.com/ethereum/go-ethereum/internal/cli/server" "github.com/ethereum/go-ethereum/internal/cli/server/proto" "github.com/ethereum/go-ethereum/node" + "github.com/mitchellh/cli" "github.com/ryanuber/columnize" "google.golang.org/grpc" ) +const ( + emptyPlaceHolder = "" +) + type MarkDownCommand interface { MarkDown cli.Command @@ -48,6 +53,7 @@ func Run(args []string) int { fmt.Fprintf(os.Stderr, "Error executing CLI: %s\n", err.Error()) return 1 } + return exitCode } @@ -64,6 +70,7 @@ func Commands() map[string]MarkDownCommandFactory { meta := &Meta{ UI: ui, } + return map[string]MarkDownCommandFactory{ "server": func() (MarkDownCommand, error) { return &server.Command{ @@ -180,6 +187,7 @@ func (m *Meta2) NewFlagSet(n string) *flagset.Flagset { Usage: "Address of the grpc endpoint", Default: "127.0.0.1:3131", }) + return f } @@ -188,6 +196,7 @@ func (m *Meta2) Conn() (*grpc.ClientConn, error) { if err != nil { return nil, fmt.Errorf("failed to connect to server: %v", err) } + return conn, nil } @@ -196,6 +205,7 @@ func (m *Meta2) BorConn() (proto.BorClient, error) { if err != nil { return nil, err } + return proto.NewBorClient(conn), nil } @@ -243,18 +253,21 @@ func (m *Meta) GetKeystore() (*keystore.KeyStore, error) { scryptP := keystore.StandardScryptP keys := keystore.NewKeyStore(keydir, scryptN, scryptP) + return keys, nil } func formatList(in []string) string { columnConf := columnize.DefaultConfig() - columnConf.Empty = "" + columnConf.Empty = emptyPlaceHolder + return columnize.Format(in, columnConf) } func formatKV(in []string) string { columnConf := columnize.DefaultConfig() - columnConf.Empty = "" + columnConf.Empty = emptyPlaceHolder columnConf.Glue = " = " + return columnize.Format(in, columnConf) } diff --git a/internal/cli/debug.go b/internal/cli/debug.go index 66e936995c..fb998ee4b9 100644 --- a/internal/cli/debug.go +++ b/internal/cli/debug.go @@ -18,8 +18,9 @@ import ( "github.com/ethereum/go-ethereum/internal/cli/flagset" "github.com/ethereum/go-ethereum/internal/cli/server/proto" - "github.com/golang/protobuf/jsonpb" - gproto "github.com/golang/protobuf/proto" + + "github.com/golang/protobuf/jsonpb" // nolint:staticcheck + gproto "github.com/golang/protobuf/proto" // nolint:staticcheck "github.com/golang/protobuf/ptypes/empty" grpc_net_conn "github.com/mitchellh/go-grpc-net-conn" ) @@ -55,6 +56,7 @@ func (d *DebugCommand) MarkDown() string { d.Flags().MarkDown(), } items = append(items, examples...) + return strings.Join(items, "\n\n") } @@ -112,6 +114,7 @@ func (d *DebugCommand) Run(args []string) int { // User specified output directory tmp = filepath.Join(d.output, stamped) _, err := os.Stat(tmp) + if !os.IsNotExist(err) { d.UI.Error("Output directory already exists") return 1 @@ -139,6 +142,7 @@ func (d *DebugCommand) Run(args []string) int { req := &proto.PprofRequest{ Seconds: int64(d.seconds), } + switch profile { case "cpu": req.Type = proto.PprofRequest_CPU @@ -148,7 +152,9 @@ func (d *DebugCommand) Run(args []string) int { req.Type = proto.PprofRequest_LOOKUP req.Profile = profile } + stream, err := clt.Pprof(ctx, req) + if err != nil { return err } @@ -157,6 +163,7 @@ func (d *DebugCommand) Run(args []string) int { if err != nil { return err } + if _, ok := msg.Event.(*proto.PprofResponse_Open_); !ok { return fmt.Errorf("expected open message") } @@ -179,6 +186,7 @@ func (d *DebugCommand) Run(args []string) int { if _, err := io.Copy(file, conn); err != nil { return err } + return nil } @@ -210,7 +218,7 @@ func (d *DebugCommand) Run(args []string) int { d.UI.Output(err.Error()) return 1 } - if err := ioutil.WriteFile(filepath.Join(tmp, "status.json"), []byte(data), 0644); err != nil { + if err := ioutil.WriteFile(filepath.Join(tmp, "status.json"), []byte(data), 0600); err != nil { d.UI.Output(fmt.Sprintf("Failed to write status: %v", err)) return 1 } @@ -230,6 +238,7 @@ func (d *DebugCommand) Run(args []string) int { } d.UI.Output(fmt.Sprintf("Created debug archive: %s", archiveFile)) + return 0 } diff --git a/internal/cli/markdown_test.go b/internal/cli/markdown_test.go index 13a5c4ece3..30c272a220 100644 --- a/internal/cli/markdown_test.go +++ b/internal/cli/markdown_test.go @@ -7,6 +7,7 @@ import ( ) func TestCodeBlock(t *testing.T) { + t.Parallel() assert := assert.New(t) lines := []string{ diff --git a/internal/cli/peers.go b/internal/cli/peers.go index ee70a747b8..fbbca24fad 100644 --- a/internal/cli/peers.go +++ b/internal/cli/peers.go @@ -21,6 +21,7 @@ func (a *PeersCommand) MarkDown() string { "- [```peers remove```](./peers_remove.md): Disconnects the local client from a connected peer if exists.", "- [```peers status```](./peers_status.md): Display the status of a peer by its id.", } + return strings.Join(items, "\n\n") } diff --git a/internal/cli/peers_add.go b/internal/cli/peers_add.go index ae84f4e0c1..3df1a6b6cb 100644 --- a/internal/cli/peers_add.go +++ b/internal/cli/peers_add.go @@ -22,6 +22,7 @@ func (p *PeersAddCommand) MarkDown() string { "The ```peers add ``` command joins the local client to another remote peer.", p.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -79,5 +80,6 @@ func (c *PeersAddCommand) Run(args []string) int { c.UI.Error(err.Error()) return 1 } + return 0 } diff --git a/internal/cli/peers_list.go b/internal/cli/peers_list.go index 56dfdc317d..4a572447c1 100644 --- a/internal/cli/peers_list.go +++ b/internal/cli/peers_list.go @@ -21,6 +21,7 @@ func (p *PeersListCommand) MarkDown() string { "The ```peers list``` command lists the connected peers.", p.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -60,12 +61,14 @@ func (c *PeersListCommand) Run(args []string) int { req := &proto.PeersListRequest{} resp, err := borClt.PeersList(context.Background(), req) + if err != nil { c.UI.Error(err.Error()) return 1 } c.UI.Output(formatPeers(resp.Peers)) + return 0 } @@ -76,6 +79,7 @@ func formatPeers(peers []*proto.Peer) string { rows := make([]string, len(peers)+1) rows[0] = "ID|Enode|Name|Caps|Static|Trusted" + for i, d := range peers { enode := strings.TrimPrefix(d.Enode, "enode://") @@ -87,5 +91,6 @@ func formatPeers(peers []*proto.Peer) string { d.Static, d.Trusted) } + return formatList(rows) } diff --git a/internal/cli/peers_remove.go b/internal/cli/peers_remove.go index 5cd3796e3c..f53284c40c 100644 --- a/internal/cli/peers_remove.go +++ b/internal/cli/peers_remove.go @@ -22,6 +22,7 @@ func (p *PeersRemoveCommand) MarkDown() string { "The ```peers remove ``` command disconnects the local client from a connected peer if exists.", p.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -79,5 +80,6 @@ func (c *PeersRemoveCommand) Run(args []string) int { c.UI.Error(err.Error()) return 1 } + return 0 } diff --git a/internal/cli/peers_status.go b/internal/cli/peers_status.go index bb8d385291..f5d700a273 100644 --- a/internal/cli/peers_status.go +++ b/internal/cli/peers_status.go @@ -21,6 +21,7 @@ func (p *PeersStatusCommand) MarkDown() string { "The ```peers status ``` command displays the status of a peer by its id.", p.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } @@ -68,12 +69,14 @@ func (c *PeersStatusCommand) Run(args []string) int { Enode: args[0], } resp, err := borClt.PeersStatus(context.Background(), req) + if err != nil { c.UI.Error(err.Error()) return 1 } c.UI.Output(formatPeer(resp.Peer)) + return 0 } @@ -87,5 +90,6 @@ func formatPeer(peer *proto.Peer) string { fmt.Sprintf("Static|%v", peer.Static), fmt.Sprintf("Trusted|%v", peer.Trusted), }) + return base } diff --git a/internal/cli/status.go b/internal/cli/status.go index c4165b0a2e..2a8b7d7470 100644 --- a/internal/cli/status.go +++ b/internal/cli/status.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/internal/cli/server/proto" + "github.com/golang/protobuf/ptypes/empty" ) @@ -20,6 +21,7 @@ func (p *StatusCommand) MarkDown() string { "# Status", "The ```status``` command outputs the status of the client.", } + return strings.Join(items, "\n\n") } @@ -56,6 +58,7 @@ func (c *StatusCommand) Run(args []string) int { } c.UI.Output(printStatus(status)) + return 0 } @@ -69,6 +72,7 @@ func printStatus(status *proto.StatusResponse) string { forks := make([]string, len(status.Forks)+1) forks[0] = "Name|Block|Enabled" + for i, d := range status.Forks { forks[i+1] = fmt.Sprintf("%s|%d|%v", d.Name, d.Block, !d.Disabled) } @@ -92,5 +96,6 @@ func printStatus(status *proto.StatusResponse) string { "\nForks", formatList(forks), } + return strings.Join(full, "\n") } diff --git a/internal/cli/version.go b/internal/cli/version.go index 080cf41221..cd155f43a7 100644 --- a/internal/cli/version.go +++ b/internal/cli/version.go @@ -4,6 +4,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/params" + "github.com/mitchellh/cli" ) @@ -27,6 +28,7 @@ func (d *VersionCommand) MarkDown() string { "The ```bor version``` command outputs the version of the binary.", } items = append(items, examples...) + return strings.Join(items, "\n\n") } From 2e2557a2d004006e72be463d45a3b4a04c397cd2 Mon Sep 17 00:00:00 2001 From: Jerry Date: Tue, 24 May 2022 13:08:45 -0700 Subject: [PATCH 112/190] Enable prealloc check and improve address comparison --- .golangci.yml | 2 +- consensus/bor/api.go | 2 +- consensus/bor/bor.go | 19 ++++++++++--------- consensus/bor/merkle.go | 2 +- consensus/bor/snapshot.go | 3 +-- consensus/bor/validator_set.go | 2 +- internal/cli/attach.go | 5 +++-- 7 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index daea4e1e0b..b063984061 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -38,7 +38,7 @@ linters: - noctx #- nosprintfhostport # TODO: do we use IPv6? - paralleltest - # - prealloc + - prealloc - predeclared #- promlinter #- revive diff --git a/consensus/bor/api.go b/consensus/bor/api.go index 361e439bf7..364fc448b8 100644 --- a/consensus/bor/api.go +++ b/consensus/bor/api.go @@ -61,7 +61,7 @@ type difficultiesKV struct { } func rankMapDifficulties(values map[common.Address]uint64) []difficultiesKV { - var ss []difficultiesKV + ss := make([]difficultiesKV, 0, len(values)) for k, v := range values { ss = append(ss, difficultiesKV{k, v}) } diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index ada601f838..62336e73f0 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -472,10 +472,9 @@ func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *t // nolint: gocognit func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash common.Hash, parents []*types.Header) (*Snapshot, error) { // Search for a snapshot in memory or on disk for checkpoints - var ( - headers []*types.Header - snap *Snapshot - ) + var snap *Snapshot + + headers := make([]*types.Header, 0, 16) //nolint:govet for snap == nil { @@ -549,6 +548,8 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co number, hash = number-1, header.ParentHash } + log.Info("Snapshot has been found in %d headers depth.", len(headers)) + // check if snapshot is nil if snap == nil { return nil, fmt.Errorf("Unknown error while retrieving snapshot at block number %v", number) @@ -701,7 +702,7 @@ func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header) e var succession int // if signer is not empty - if !bytes.Equal(c.signer.Bytes(), common.Address{}.Bytes()) { + if c.signer != (common.Address{}) { succession, err = snap.GetSignerSuccessionNumber(c.signer) if err != nil { return err @@ -1146,7 +1147,7 @@ func (c *Bor) fetchAndCommitSpan( } // get validators bytes - var validators []MinimalVal + validators := make([]MinimalVal, 0, len(heimdallSpan.ValidatorSet.Validators)) for _, val := range heimdallSpan.ValidatorSet.Validators { validators = append(validators, val.MinimalVal()) } @@ -1158,7 +1159,7 @@ func (c *Bor) fetchAndCommitSpan( } // get producers bytes - var producers []MinimalVal + producers := make([]MinimalVal, 0, len(heimdallSpan.SelectedProducers)) for _, val := range heimdallSpan.SelectedProducers { producers = append(producers, val.MinimalVal()) } @@ -1401,7 +1402,7 @@ func applyMessage( func validatorContains(a []*Validator, x *Validator) (*Validator, bool) { for _, n := range a { - if bytes.Equal(n.Address.Bytes(), x.Address.Bytes()) { + if n.Address == x.Address { return n, true } } @@ -1413,7 +1414,7 @@ func getUpdatedValidatorSet(oldValidatorSet *ValidatorSet, newVals []*Validator) v := oldValidatorSet oldVals := v.Validators - var changes []*Validator + changes := make([]*Validator, 0, len(oldVals)) for _, ov := range oldVals { if f, ok := validatorContains(newVals, ov); ok { diff --git a/consensus/bor/merkle.go b/consensus/bor/merkle.go index 5c61eb4a12..ef1b4eb87e 100644 --- a/consensus/bor/merkle.go +++ b/consensus/bor/merkle.go @@ -40,7 +40,7 @@ func convertTo32(input []byte) (output [32]byte) { } func convert(input []([32]byte)) [][]byte { - var output [][]byte + output := make([][]byte, 0, len(input)) for _, in := range input { newInput := make([]byte, len(in[:])) diff --git a/consensus/bor/snapshot.go b/consensus/bor/snapshot.go index ef92cc99b4..606c28340b 100644 --- a/consensus/bor/snapshot.go +++ b/consensus/bor/snapshot.go @@ -1,7 +1,6 @@ package bor import ( - "bytes" "encoding/json" lru "github.com/hashicorp/golang-lru" @@ -208,7 +207,7 @@ func (s *Snapshot) signers() []common.Address { // Difficulty returns the difficulty for a particular signer at the current snapshot number func (s *Snapshot) Difficulty(signer common.Address) uint64 { // if signer is empty - if bytes.Equal(signer.Bytes(), common.Address{}.Bytes()) { + if signer == (common.Address{}) { return 1 } diff --git a/consensus/bor/validator_set.go b/consensus/bor/validator_set.go index 892891bbda..ee14ef2cb1 100644 --- a/consensus/bor/validator_set.go +++ b/consensus/bor/validator_set.go @@ -255,7 +255,7 @@ func (vals *ValidatorSet) GetByAddress(address common.Address) (index int, val * idx := sort.Search(len(vals.Validators), func(i int) bool { return bytes.Compare(address.Bytes(), vals.Validators[i].Address.Bytes()) <= 0 }) - if idx < len(vals.Validators) && bytes.Equal(vals.Validators[idx].Address.Bytes(), address.Bytes()) { + if idx < len(vals.Validators) && vals.Validators[idx].Address == address { return idx, vals.Validators[idx].Copy() } diff --git a/internal/cli/attach.go b/internal/cli/attach.go index 1aa888c12b..134a282180 100644 --- a/internal/cli/attach.go +++ b/internal/cli/attach.go @@ -182,9 +182,10 @@ func (c *AttachCommand) makeConsolePreloads() []string { return nil } // Otherwise resolve absolute paths and return them - var preloads []string + splitFlags := strings.Split(c.PreloadJSFlag, ",") + preloads := make([]string, 0, len(splitFlags)) - for _, file := range strings.Split(c.PreloadJSFlag, ",") { + for _, file := range splitFlags { preloads = append(preloads, strings.TrimSpace(file)) } From 4fb3f5ddeeae8a8dc01b86b3a1483324d8da622c Mon Sep 17 00:00:00 2001 From: SHIVAM SHARMA Date: Fri, 27 May 2022 21:07:55 +0530 Subject: [PATCH 113/190] Modifying miner.recommit flag and its adjustment function. (#370) * changed min/max/current recommit values * Remove Hardcoded min/max * Code Sanitization * Skipping tests for constant recommit interval * Adding default miner.recommit value * Minor Change --- eth/ethconfig/config.go | 2 +- miner/worker.go | 39 +++++++++++++++++++++------------------ miner/worker_test.go | 5 +++++ 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 6ab43891f7..9f64b09ac5 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -88,7 +88,7 @@ var Defaults = Config{ Miner: miner.Config{ GasCeil: 8000000, GasPrice: big.NewInt(params.GWei), - Recommit: 3 * time.Second, + Recommit: 125 * time.Second, }, TxPool: core.DefaultTxPoolConfig, RPCGasCap: 50000000, diff --git a/miner/worker.go b/miner/worker.go index c3a5e1c9ba..1da8a529d7 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -389,24 +389,27 @@ func (w *worker) close() { // recalcRecommit recalculates the resubmitting interval upon feedback. func recalcRecommit(minRecommit, prev time.Duration, target float64, inc bool) time.Duration { - var ( - prevF = float64(prev.Nanoseconds()) - next float64 - ) - if inc { - next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target+intervalAdjustBias) - max := float64(maxRecommitInterval.Nanoseconds()) - if next > max { - next = max - } - } else { - next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target-intervalAdjustBias) - min := float64(minRecommit.Nanoseconds()) - if next < min { - next = min - } - } - return time.Duration(int64(next)) + // var ( + // prevF = float64(prev.Nanoseconds()) + // next float64 + // ) + // if inc { + // next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target+intervalAdjustBias) + // max := float64(maxRecommitInterval.Nanoseconds()) + // if next > max { + // next = max + // } + // } else { + // next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target-intervalAdjustBias) + // min := float64(minRecommit.Nanoseconds()) + // if next < min { + // next = min + // } + // } + // log.Info("Recalc Commit", "Prev", prev, "Next", next) + + //returning the Same prev value to keep the recommit interval constant + return time.Duration(int64(prev)) } // newWorkLoop is a standalone goroutine to submit new sealing work upon received events. diff --git a/miner/worker_test.go b/miner/worker_test.go index dd029433b8..20dc3238da 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -434,10 +434,15 @@ func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, en } func TestAdjustIntervalEthash(t *testing.T) { + // Skipping this test as recommit interval would remain constant + t.Skip() testAdjustInterval(t, ethashChainConfig, ethash.NewFaker()) } func TestAdjustIntervalClique(t *testing.T) { + + // Skipping this test as recommit interval would remain constant + t.Skip() testAdjustInterval(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } From 5092006b27988adf9c2d2195c38ed967d4affd37 Mon Sep 17 00:00:00 2001 From: Jerry Date: Fri, 27 May 2022 14:40:04 -0700 Subject: [PATCH 114/190] Fix default Dockerfile for new CLI --- Dockerfile | 4 +++- consensus/bor/bor.go | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8af791ab3f..7a2770ce9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,9 @@ RUN apt-get update -y && apt-get upgrade -y \ WORKDIR ${BOR_DIR} COPY . . -RUN make bor-all +RUN make bor + +RUN cp build/bin/bor /usr/local/bin/ ENV SHELL /bin/bash EXPOSE 8545 8546 8547 30303 30303/udp diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 62336e73f0..9e43e67037 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -548,7 +548,7 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co number, hash = number-1, header.ParentHash } - log.Info("Snapshot has been found in %d headers depth.", len(headers)) + log.Info("Snapshot has been found in", "headers depth", len(headers)) // check if snapshot is nil if snap == nil { From 3f5fe0e3875f7e56be709e853efdaf58855d68ab Mon Sep 17 00:00:00 2001 From: Krishna Upadhyaya Date: Mon, 30 May 2022 13:59:30 +0530 Subject: [PATCH 115/190] Increased default value of rpc.txfeecap to 5 --- eth/ethconfig/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 9f64b09ac5..cb0c5a0aae 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -94,7 +94,7 @@ var Defaults = Config{ RPCGasCap: 50000000, RPCEVMTimeout: 5 * time.Second, GPO: FullNodeGPO, - RPCTxFeeCap: 1, // 1 ether + RPCTxFeeCap: 5, // 5 matic } func init() { From 3ae87c0d464981a82bf4912618baa029c9b5b1ea Mon Sep 17 00:00:00 2001 From: Jerry Date: Thu, 26 May 2022 14:36:12 -0700 Subject: [PATCH 116/190] Read static-nodes and trusted-nodes from default files if not specified in CLI --- internal/cli/server/config.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index f3ab7ed0d6..a93c4f057f 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -935,9 +935,15 @@ func (c *Config) buildNode() (*node.Config, error) { if cfg.P2P.StaticNodes, err = parseBootnodes(c.P2P.Discovery.StaticNodes); err != nil { return nil, err } + if len(cfg.P2P.StaticNodes) == 0 { + cfg.P2P.StaticNodes = cfg.StaticNodes() + } if cfg.P2P.TrustedNodes, err = parseBootnodes(c.P2P.Discovery.TrustedNodes); err != nil { return nil, err } + if len(cfg.P2P.TrustedNodes) == 0 { + cfg.P2P.TrustedNodes = cfg.TrustedNodes() + } } if c.P2P.NoDiscover { From 4cec5f01c3e8530b7a193479a5f88f05491d5590 Mon Sep 17 00:00:00 2001 From: Jerry Date: Thu, 26 May 2022 15:36:38 -0700 Subject: [PATCH 117/190] Add ability to parse legacy genesis file --- internal/cli/server/chains/chain.go | 15 ++++ internal/cli/server/chains/chain_test.go | 10 +++ .../chains/test_files/chain_legacy_test.json | 83 +++++++++++++++++++ .../server/chains/test_files/wrong_chain.json | 1 + 4 files changed, 109 insertions(+) create mode 100644 internal/cli/server/chains/test_files/chain_legacy_test.json create mode 100644 internal/cli/server/chains/test_files/wrong_chain.json diff --git a/internal/cli/server/chains/chain.go b/internal/cli/server/chains/chain.go index 4fc7bad5d1..32f5159b38 100644 --- a/internal/cli/server/chains/chain.go +++ b/internal/cli/server/chains/chain.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/log" ) type Chain struct { @@ -59,5 +60,19 @@ func importChain(content []byte) (*Chain, error) { return nil, err } + if chain.Genesis == nil { + log.Info("Try reading as legacy genesis") + var genesis core.Genesis + if err := json.Unmarshal(content, &genesis); err != nil { + return nil, err + } + if genesis.Config != nil { + chain.Genesis = &genesis + chain.NetworkId = genesis.Config.ChainID.Uint64() + } else { + return nil, fmt.Errorf("unable to parse chain config") + } + } + return chain, nil } diff --git a/internal/cli/server/chains/chain_test.go b/internal/cli/server/chains/chain_test.go index 0f309b2919..8f57b7d220 100644 --- a/internal/cli/server/chains/chain_test.go +++ b/internal/cli/server/chains/chain_test.go @@ -18,6 +18,16 @@ func TestChain_ImportFromFile(t *testing.T) { args: args{filename: "test_files/chain_test.json"}, wantErr: false, }, + { + name: "ImportFromFile correct legacy json file", + args: args{filename: "test_files/chain_legacy_test.json"}, + wantErr: false, + }, + { + name: "ImportFromFile wrong json file", + args: args{filename: "test_files/wrong_chain.json"}, + wantErr: true, + }, { name: "ImportFromFile nonexistent json file", args: args{filename: "test_files/chain_test_nonexistent.json"}, diff --git a/internal/cli/server/chains/test_files/chain_legacy_test.json b/internal/cli/server/chains/test_files/chain_legacy_test.json new file mode 100644 index 0000000000..5702eaca40 --- /dev/null +++ b/internal/cli/server/chains/test_files/chain_legacy_test.json @@ -0,0 +1,83 @@ +{ + "config":{ + "chainId":80001, + "homesteadBlock":0, + "daoForkSupport":true, + "eip150Block":0, + "eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block":0, + "eip158Block":0, + "byzantiumBlock":0, + "constantinopleBlock":0, + "petersburgBlock":0, + "istanbulBlock":2722000, + "muirGlacierBlock":2722000, + "berlinBlock":13996000, + "londonBlock":13996000, + "bor":{ + "period":{ + "0":2 + }, + "producerDelay":6, + "sprint":64, + "backupMultiplier":{ + "0":2 + }, + "validatorContract":"0x0000000000000000000000000000000000001000", + "stateReceiverContract":"0x0000000000000000000000000000000000001001", + "overrideStateSyncRecords":null, + "blockAlloc":{ + "22244000":{ + "0000000000000000000000000000000000001010":{ + "balance":"0x0", + "code":"0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610caa565b005b3480156103eb57600080fd5b506103f4610dfc565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e05565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fc1565b005b3480156104e857600080fd5b506104f1611090565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b506105486110b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110dc565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b506106046110fd565b005b34801561061257600080fd5b5061061b6111cd565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506111d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b50610758611358565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af611381565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de6113d8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e611411565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061144e565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b50610964611474565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b8101908080359060200190929190505050611501565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611521565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a65611541565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a90611548565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb61154e565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115db565b005b348015610b2e57600080fd5b50610b376115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b60003390506000610cba826110dc565b9050610cd18360065461161e90919063ffffffff16565b600681905550600083118015610ce657508234145b610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610dd4876110dc565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610e0d611381565b610e1657600080fd5b600081118015610e535750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611da96023913960400191505060405180910390fd5b6000610eb3836110dc565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610f00573d6000803e3d6000fd5b50610f168360065461163e90919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f68585610f98896110dc565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611027576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611d866023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061108c8261165d565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b611105611381565b61110e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b60008060008060418551146111ee5760009350505050611352565b602085015192506040850151915060ff6041860151169050601b8160ff16101561121957601b810190505b601b8160ff16141580156112315750601c8160ff1614155b156112425760009350505050611352565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561129f573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b6000813414611460576000905061146e565b61146b338484611755565b90505b92915050565b6040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b602083106114c357805182526020820191506020810190506020830392506114a0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061153761153286868686611b12565b611be8565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611dcc605291396040516020018082805190602001908083835b6020831061159d578051825260208201915060208101905060208303925061157a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b6115e3611381565b6115ec57600080fd5b6115f58161165d565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282111561162d57600080fd5b600082840390508091505092915050565b60008082840190508381101561165357600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561169757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b810190808051906020019092919050505090506118d9868686611c32565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d6020811015611a0b57600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b6000806040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b60208310611b645780518252602082019150602081019050602083039250611b41565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e27742073656e6420746f204d524332300000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d1a573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a72315820ccd6c2a9c259832bbb367986ee06cd87af23022681b0cb22311a864b701d939564736f6c63430005100032" + } + } + }, + "burntContract":{ + "22640000":"0x70bcA57F4579f58670aB2d18Ef16e02C17553C38" + }, + "jaipurBlock":22770000 + } + }, + "nonce":"0x0", + "timestamp":"0x5ce28211", + "extraData":"0x", + "gasLimit":"0x989680", + "difficulty":"0x1", + "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase":"0x0000000000000000000000000000000000000000", + "alloc":{ + "0000000000000000000000000000000000001000":{ + "code":"0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806360c8614d1161010f578063af26aa96116100a2578063d5b844eb11610071578063d5b844eb14610666578063dcf2793a14610684578063e3b7c924146106b6578063f59cf565146106d4576101f0565b8063af26aa96146105c7578063b71d7a69146105e7578063b7ab4db514610617578063c1b3c91914610636576101f0565b806370ba5707116100de57806370ba57071461052b57806398ab2b621461055b5780639d11b80714610579578063ae756451146105a9576101f0565b806360c8614d1461049c57806365b3a1e2146104bc57806366332354146104db578063687a9bd6146104f9576101f0565b80633434735f1161018757806344d6528f1161015657806344d6528f146103ee5780634dbc959f1461041e57806355614fcc1461043c578063582a8d081461046c576101f0565b80633434735f1461035257806335ddfeea1461037057806343ee8213146103a057806344c15cb1146103be576101f0565b806323f2a73f116101c357806323f2a73f146102a45780632bc06564146102d45780632de3a180146102f25780632eddf35214610322576101f0565b8063047a6c5b146101f55780630c35b1cb146102275780631270b5741461025857806323c2a2b414610288575b600080fd5b61020f600480360361020a9190810190612b24565b610706565b60405161021e93929190613463565b60405180910390f35b610241600480360361023c9190810190612b24565b61075d565b60405161024f929190613284565b60405180910390f35b610272600480360361026d9190810190612b4d565b610939565b60405161027f91906132bb565b60405180910390f35b6102a2600480360361029d9190810190612c2c565b610a91565b005b6102be60048036036102b99190810190612b4d565b61112a565b6040516102cb91906132bb565b60405180910390f35b6102dc611281565b6040516102e99190613411565b60405180910390f35b61030c60048036036103079190810190612a81565b611286565b60405161031991906132d6565b60405180910390f35b61033c60048036036103379190810190612b24565b611307565b6040516103499190613411565b60405180910390f35b61035a611437565b6040516103679190613269565b60405180910390f35b61038a60048036036103859190810190612abd565b61144f565b60405161039791906132bb565b60405180910390f35b6103a861151a565b6040516103b591906132d6565b60405180910390f35b6103d860048036036103d39190810190612b89565b611531565b6040516103e59190613411565b60405180910390f35b61040860048036036104039190810190612b4d565b611619565b60405161041591906133f6565b60405180910390f35b610426611781565b6040516104339190613411565b60405180910390f35b61045660048036036104519190810190612a06565b611791565b60405161046391906132bb565b60405180910390f35b61048660048036036104819190810190612a2f565b6117ab565b60405161049391906132d6565b60405180910390f35b6104a4611829565b6040516104b393929190613463565b60405180910390f35b6104c461189d565b6040516104d2929190613284565b60405180910390f35b6104e3611b6e565b6040516104f09190613411565b60405180910390f35b610513600480360361050e9190810190612bf0565b611b73565b6040516105229392919061342c565b60405180910390f35b61054560048036036105409190810190612a06565b611bd7565b60405161055291906132bb565b60405180910390f35b610563611bf1565b60405161057091906132d6565b60405180910390f35b610593600480360361058e9190810190612b24565b611c08565b6040516105a09190613411565b60405180910390f35b6105b1611d39565b6040516105be91906132d6565b60405180910390f35b6105cf611d50565b6040516105de93929190613463565b60405180910390f35b61060160048036036105fc9190810190612b24565b611db1565b60405161060e9190613411565b60405180910390f35b61061f611eb1565b60405161062d929190613284565b60405180910390f35b610650600480360361064b9190810190612b24565b611ec5565b60405161065d9190613411565b60405180910390f35b61066e611ee6565b60405161067b919061349a565b60405180910390f35b61069e60048036036106999190810190612bf0565b611eeb565b6040516106ad9392919061342c565b60405180910390f35b6106be611f4f565b6040516106cb9190613411565b60405180910390f35b6106ee60048036036106e99190810190612b24565b611f61565b6040516106fd93929190613463565b60405180910390f35b60008060006002600085815260200190815260200160002060000154600260008681526020019081526020016000206001015460026000878152602001908152602001600020600201549250925092509193909250565b60608060ff83116107795761077061189d565b91509150610934565b600061078484611db1565b9050606060016000838152602001908152602001600020805490506040519080825280602002602001820160405280156107cd5781602001602082028038833980820191505090505b509050606060016000848152602001908152602001600020805490506040519080825280602002602001820160405280156108175781602001602082028038833980820191505090505b50905060008090505b60016000858152602001908152602001600020805490508110156109295760016000858152602001908152602001600020818154811061085c57fe5b906000526020600020906003020160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061089a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600085815260200190815260200160002081815481106108f257fe5b90600052602060002090600302016001015482828151811061091057fe5b6020026020010181815250508080600101915050610820565b508181945094505050505b915091565b6000606060016000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a0c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190610970565b50505050905060008090505b8151811015610a84578373ffffffffffffffffffffffffffffffffffffffff16828281518110610a4457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff161415610a7757600192505050610a8b565b8080600101915050610a18565b5060009150505b92915050565b73fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906133d6565b60405180910390fd5b6000610b1d611781565b90506000811415610b3157610b30611f8b565b5b610b456001826122ac90919063ffffffff16565b8814610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90613356565b60405180910390fd5b868611610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906133b6565b60405180910390fd5b6000604060018989030181610bd957fe5b0614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613396565b60405180910390fd5b8660026000838152602001908152602001600020600101541115610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90613336565b60405180910390fd5b6000600260008a81526020019081526020016000206000015414610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613376565b60405180910390fd5b604051806060016040528089815260200188815260200187815250600260008a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600388908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008a815260200190815260200160002081610d669190612800565b506000600160008a815260200190815260200160002081610d879190612800565b506060610ddf610dda87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b8151811015610f51576060610e0e838381518110610e0157fe5b60200260200101516122f9565b90506000808c81526020019081526020016000208054809190600101610e349190612800565b506040518060600160405280610e5d83600081518110610e5057fe5b60200260200101516123d6565b8152602001610e7f83600181518110610e7257fe5b60200260200101516123d6565b8152602001610ea183600281518110610e9457fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff168152506000808d81526020019081526020016000208381548110610ed757fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610de7565b506060610fa9610fa486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b815181101561111d576060610fd8838381518110610fcb57fe5b60200260200101516122f9565b9050600160008d81526020019081526020016000208054809190600101610fff9190612800565b5060405180606001604052806110288360008151811061101b57fe5b60200260200101516123d6565b815260200161104a8360018151811061103d57fe5b60200260200101516123d6565b815260200161106c8360028151811061105f57fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff16815250600160008e815260200190815260200160002083815481106110a357fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610fb1565b5050505050505050505050565b60006060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156111fc578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611160565b50505050905060008090505b8151811015611274578373ffffffffffffffffffffffffffffffffffffffff1682828151811061123457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff1614156112675760019250505061127b565b8080600101915050611208565b5060009150505b92915050565b604081565b60006002600160f81b84846040516020016112a3939291906131d6565b6040516020818303038152906040526040516112bf9190613213565b602060405180830381855afa1580156112dc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506112ff9190810190612a58565b905092915050565b60006060600080848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156113d9578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508152602001906001019061133d565b505050509050600080905060008090505b825181101561142c5761141d83828151811061140257fe5b602002602001015160200151836122ac90919063ffffffff16565b915080806001019150506113ea565b508092505050919050565b73fffffffffffffffffffffffffffffffffffffffe81565b600080600080859050600060218087518161146657fe5b04029050600081111561147f5761147c876117ab565b91505b6000602190505b818111611509576000600182038801519050818801519550806000602081106114ab57fe5b1a60f81b9450600060f81b857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156114f0576114e98685611286565b93506114fd565b6114fa8487611286565b93505b50602181019050611486565b508782149450505050509392505050565b60405161152690613254565b604051809103902081565b60008060009050600080905060008090505b84518167ffffffffffffffff16101561160c57606061156e868367ffffffffffffffff16604161246a565b9050600061158582896124f690919063ffffffff16565b905061158f612832565b6115998a83611619565b90506115a58a8361112a565b80156115dc57508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16115b156115fe578194506115fb8160200151876122ac90919063ffffffff16565b95505b505050604181019050611543565b5081925050509392505050565b611621612832565b6060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156116f1578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611655565b50505050905060008090505b8151811015611779578373ffffffffffffffffffffffffffffffffffffffff1682828151811061172957fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff16141561176c5781818151811061175d57fe5b60200260200101519250611779565b80806001019150506116fd565b505092915050565b600061178c43611db1565b905090565b60006117a461179e611781565b8361112a565b9050919050565b60006002600060f81b836040516020016117c69291906131aa565b6040516020818303038152906040526040516117e29190613213565b602060405180830381855afa1580156117ff573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506118229190810190612a58565b9050919050565b60008060008061184a600161183c611781565b6122ac90919063ffffffff16565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b606080606060056040519080825280602002602001820160405280156118d25781602001602082028038833980820191505090505b50905073c26880a0af2ea0c7e8130e6ec47af756465452e8816000815181106118f757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073be188d6641e8b680743a4815dfa0f6208038960f8160018151811061195357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c275dc8be39f50d12f66b6a63629c39da5bae5bd816002815181106119af57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073f903ba9e006193c1527bfbe65fe2123704ea3f9981600381518110611a0b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073928ed6a3e94437bbd316ccad78479f1d163a6a8c81600481518110611a6757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606005604051908082528060200260200182016040528015611ad35781602001602082028038833980820191505090505b50905061271081600081518110611ae657fe5b60200260200101818152505061271081600181518110611b0257fe5b60200260200101818152505061271081600281518110611b1e57fe5b60200260200101818152505061271081600381518110611b3a57fe5b60200260200101818152505061271081600481518110611b5657fe5b60200260200101818152505081819350935050509091565b60ff81565b60016020528160005260406000208181548110611b8c57fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b6000611bea611be4611781565b83610939565b9050919050565b604051611bfd9061322a565b604051809103902081565b6000606060016000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611cdb578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611c3f565b505050509050600080905060008090505b8251811015611d2e57611d1f838281518110611d0457fe5b602002602001015160200151836122ac90919063ffffffff16565b91508080600101915050611cec565b508092505050919050565b604051611d459061323f565b604051809103902081565b600080600080611d5e611781565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b60008060038054905090505b6000811115611e7157611dce612869565b6002600060036001850381548110611de257fe5b906000526020600020015481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905083816020015111158015611e3f57506000816040015114155b8015611e4f575080604001518411155b15611e6257806000015192505050611eac565b50808060019003915050611dbd565b5060006003805490501115611ea757600360016003805490500381548110611e9557fe5b90600052602060002001549050611eac565b600090505b919050565b606080611ebd4361075d565b915091509091565b60038181548110611ed257fe5b906000526020600020016000915090505481565b600281565b60006020528160005260406000208181548110611f0457fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b600060404381611f5b57fe5b04905090565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b606080611f9661189d565b8092508193505050600080905060405180606001604052808281526020016000815260200160ff81525060026000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600381908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008381526020019081526020016000208161203f9190612800565b50600060016000838152602001908152602001600020816120609190612800565b5060008090505b83518110156121825760008083815260200190815260200160002080548091906001016120949190612800565b5060405180606001604052808281526020018483815181106120b257fe5b602002602001015181526020018583815181106120cb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815250600080848152602001908152602001600020828154811061210957fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612067565b5060008090505b83518110156122a6576001600083815260200190815260200160002080548091906001016121b79190612800565b5060405180606001604052808281526020018483815181106121d557fe5b602002602001015181526020018583815181106121ee57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681525060016000848152602001908152602001600020828154811061222d57fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612189565b50505050565b6000808284019050838110156122c157600080fd5b8091505092915050565b6122d361288a565b600060208301905060405180604001604052808451815260200182815250915050919050565b606061230482612600565b61230d57600080fd5b60006123188361264e565b905060608160405190808252806020026020018201604052801561235657816020015b6123436128a4565b81526020019060019003908161233b5790505b509050600061236885602001516126bf565b8560200151019050600080600090505b848110156123c95761238983612748565b91506040518060400160405280838152602001848152508482815181106123ac57fe5b602002602001018190525081830192508080600101915050612378565b5082945050505050919050565b60008082600001511180156123f057506021826000015111155b6123f957600080fd5b600061240883602001516126bf565b9050600081846000015103905060008083866020015101905080519150602083101561243b57826020036101000a820491505b81945050505050919050565b6000601582600001511461245a57600080fd5b612463826123d6565b9050919050565b60608183018451101561247c57600080fd5b6060821560008114612499576040519150602082016040526124ea565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156124d757805183526020830192506020810190506124ba565b50868552601f19601f8301166040525050505b50809150509392505050565b600080600080604185511461251157600093505050506125fa565b602085015192506040850151915060ff6041860151169050601b8160ff16101561253c57601b810190505b601b8160ff16141580156125545750601c8160ff1614155b1561256557600093505050506125fa565b60006001878386866040516000815260200160405260405161258a94939291906132f1565b6020604051602081039080840390855afa1580156125ac573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125f257600080fd5b809450505050505b92915050565b600080826000015114156126175760009050612649565b60008083602001519050805160001a915060c060ff168260ff16101561264257600092505050612649565b6001925050505b919050565b6000808260000151141561266557600090506126ba565b6000809050600061267984602001516126bf565b84602001510190506000846000015185602001510190505b808210156126b3576126a282612748565b820191508280600101935050612691565b8293505050505b919050565b600080825160001a9050608060ff168110156126df576000915050612743565b60b860ff16811080612704575060c060ff168110158015612703575060f860ff1681105b5b15612713576001915050612743565b60c060ff168110156127335760018060b80360ff16820301915050612743565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561276957600191506127f6565b60b860ff16811015612786576001608060ff1682030191506127f5565b60c060ff168110156127b65760b78103600185019450806020036101000a855104600182018101935050506127f4565b60f860ff168110156127d357600160c060ff1682030191506127f3565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b81548183558181111561282d5760030281600302836000526020600020918201910161282c91906128be565b5b505050565b60405180606001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180606001604052806000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604051806040016040528060008152602001600081525090565b61291191905b8082111561290d5760008082016000905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506003016128c4565b5090565b90565b60008135905061292381613693565b92915050565b600081359050612938816136aa565b92915050565b60008151905061294d816136aa565b92915050565b60008083601f84011261296557600080fd5b8235905067ffffffffffffffff81111561297e57600080fd5b60208301915083600182028301111561299657600080fd5b9250929050565b600082601f8301126129ae57600080fd5b81356129c16129bc826134e2565b6134b5565b915080825260208301602083018583830111156129dd57600080fd5b6129e883828461363d565b50505092915050565b600081359050612a00816136c1565b92915050565b600060208284031215612a1857600080fd5b6000612a2684828501612914565b91505092915050565b600060208284031215612a4157600080fd5b6000612a4f84828501612929565b91505092915050565b600060208284031215612a6a57600080fd5b6000612a788482850161293e565b91505092915050565b60008060408385031215612a9457600080fd5b6000612aa285828601612929565b9250506020612ab385828601612929565b9150509250929050565b600080600060608486031215612ad257600080fd5b6000612ae086828701612929565b9350506020612af186828701612929565b925050604084013567ffffffffffffffff811115612b0e57600080fd5b612b1a8682870161299d565b9150509250925092565b600060208284031215612b3657600080fd5b6000612b44848285016129f1565b91505092915050565b60008060408385031215612b6057600080fd5b6000612b6e858286016129f1565b9250506020612b7f85828601612914565b9150509250929050565b600080600060608486031215612b9e57600080fd5b6000612bac868287016129f1565b9350506020612bbd86828701612929565b925050604084013567ffffffffffffffff811115612bda57600080fd5b612be68682870161299d565b9150509250925092565b60008060408385031215612c0357600080fd5b6000612c11858286016129f1565b9250506020612c22858286016129f1565b9150509250929050565b600080600080600080600060a0888a031215612c4757600080fd5b6000612c558a828b016129f1565b9750506020612c668a828b016129f1565b9650506040612c778a828b016129f1565b955050606088013567ffffffffffffffff811115612c9457600080fd5b612ca08a828b01612953565b9450945050608088013567ffffffffffffffff811115612cbf57600080fd5b612ccb8a828b01612953565b925092505092959891949750929550565b6000612ce88383612d0c565b60208301905092915050565b6000612d00838361317d565b60208301905092915050565b612d15816135b2565b82525050565b612d24816135b2565b82525050565b6000612d358261352e565b612d3f8185613569565b9350612d4a8361350e565b8060005b83811015612d7b578151612d628882612cdc565b9750612d6d8361354f565b925050600181019050612d4e565b5085935050505092915050565b6000612d9382613539565b612d9d818561357a565b9350612da88361351e565b8060005b83811015612dd9578151612dc08882612cf4565b9750612dcb8361355c565b925050600181019050612dac565b5085935050505092915050565b612def816135c4565b82525050565b612e06612e01826135d0565b61367f565b82525050565b612e15816135fc565b82525050565b612e2c612e27826135fc565b613689565b82525050565b6000612e3d82613544565b612e47818561358b565b9350612e5781856020860161364c565b80840191505092915050565b6000612e706004836135a7565b91507f766f7465000000000000000000000000000000000000000000000000000000006000830152600482019050919050565b6000612eb0602d83613596565b91507f537461727420626c6f636b206d7573742062652067726561746572207468616e60008301527f2063757272656e74207370616e000000000000000000000000000000000000006020830152604082019050919050565b6000612f16600f83613596565b91507f496e76616c6964207370616e20696400000000000000000000000000000000006000830152602082019050919050565b6000612f56601383613596565b91507f5370616e20616c726561647920657869737473000000000000000000000000006000830152602082019050919050565b6000612f96604583613596565b91507f446966666572656e6365206265747765656e20737461727420616e6420656e6460008301527f20626c6f636b206d75737420626520696e206d756c7469706c6573206f66207360208301527f7072696e740000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613022602a83613596565b91507f456e6420626c6f636b206d7573742062652067726561746572207468616e207360008301527f7461727420626c6f636b000000000000000000000000000000000000000000006020830152604082019050919050565b6000613088601283613596565b91507f4e6f742053797374656d204164646573732100000000000000000000000000006000830152602082019050919050565b60006130c86005836135a7565b91507f38303030310000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613108600e836135a7565b91507f6865696d64616c6c2d38303030310000000000000000000000000000000000006000830152600e82019050919050565b606082016000820151613151600085018261317d565b506020820151613164602085018261317d565b5060408201516131776040850182612d0c565b50505050565b61318681613626565b82525050565b61319581613626565b82525050565b6131a481613630565b82525050565b60006131b68285612df5565b6001820191506131c68284612e1b565b6020820191508190509392505050565b60006131e28286612df5565b6001820191506131f28285612e1b565b6020820191506132028284612e1b565b602082019150819050949350505050565b600061321f8284612e32565b915081905092915050565b600061323582612e63565b9150819050919050565b600061324a826130bb565b9150819050919050565b600061325f826130fb565b9150819050919050565b600060208201905061327e6000830184612d1b565b92915050565b6000604082019050818103600083015261329e8185612d2a565b905081810360208301526132b28184612d88565b90509392505050565b60006020820190506132d06000830184612de6565b92915050565b60006020820190506132eb6000830184612e0c565b92915050565b60006080820190506133066000830187612e0c565b613313602083018661319b565b6133206040830185612e0c565b61332d6060830184612e0c565b95945050505050565b6000602082019050818103600083015261334f81612ea3565b9050919050565b6000602082019050818103600083015261336f81612f09565b9050919050565b6000602082019050818103600083015261338f81612f49565b9050919050565b600060208201905081810360008301526133af81612f89565b9050919050565b600060208201905081810360008301526133cf81613015565b9050919050565b600060208201905081810360008301526133ef8161307b565b9050919050565b600060608201905061340b600083018461313b565b92915050565b6000602082019050613426600083018461318c565b92915050565b6000606082019050613441600083018661318c565b61344e602083018561318c565b61345b6040830184612d1b565b949350505050565b6000606082019050613478600083018661318c565b613485602083018561318c565b613492604083018461318c565b949350505050565b60006020820190506134af600083018461319b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156134d857600080fd5b8060405250919050565b600067ffffffffffffffff8211156134f957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006135bd82613606565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561366a57808201518184015260208101905061364f565b83811115613679576000848401525b50505050565b6000819050919050565b6000819050919050565b61369c816135b2565b81146136a757600080fd5b50565b6136b3816135fc565b81146136be57600080fd5b50565b6136ca81613626565b81146136d557600080fd5b5056fea365627a7a723158208f52ee07630ffe523cc6ad3e15f437f973dcfa36729cd697f9b0fc4a145a48f06c6578706572696d656e74616cf564736f6c634300050b0040", + "balance":"0x0" + }, + "0000000000000000000000000000000000001001":{ + "code":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c806319494a17146100465780633434735f146100e15780635407ca671461012b575b600080fd5b6100c76004803603604081101561005c57600080fd5b81019080803590602001909291908035906020019064010000000081111561008357600080fd5b82018360208201111561009557600080fd5b803590602001918460018302840111640100000000831117156100b757600080fd5b9091929391929390505050610149565b604051808215151515815260200191505060405180910390f35b6100e961047a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610133610492565b6040518082815260200191505060405180910390f35b600073fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f742053797374656d2041646465737321000000000000000000000000000081525060200191505060405180910390fd5b606061025761025285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610498565b6104c6565b905060006102788260008151811061026b57fe5b60200260200101516105a3565b905080600160005401146102f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f537461746549647320617265206e6f742073657175656e7469616c000000000081525060200191505060405180910390fd5b600080815480929190600101919050555060006103248360018151811061031757fe5b6020026020010151610614565b905060606103458460028151811061033857fe5b6020026020010151610637565b9050610350826106c3565b1561046f576000624c4b409050606084836040516024018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103aa57808201518184015260208101905061038f565b50505050905090810190601f1680156103d75780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f26c53bea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008082516020840160008887f1965050505b505050509392505050565b73fffffffffffffffffffffffffffffffffffffffe81565b60005481565b6104a0610943565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606104d1826106dc565b6104da57600080fd5b60006104e58361072a565b905060608160405190808252806020026020018201604052801561052357816020015b61051061095d565b8152602001906001900390816105085790505b5090506000610535856020015161079b565b8560200151019050600080600090505b848110156105965761055683610824565b915060405180604001604052808381526020018481525084828151811061057957fe5b602002602001018190525081830192508080600101915050610545565b5082945050505050919050565b60008082600001511180156105bd57506021826000015111155b6105c657600080fd5b60006105d5836020015161079b565b9050600081846000015103905060008083866020015101905080519150602083101561060857826020036101000a820491505b81945050505050919050565b6000601582600001511461062757600080fd5b610630826105a3565b9050919050565b6060600082600001511161064a57600080fd5b6000610659836020015161079b565b905060008184600001510390506060816040519080825280601f01601f19166020018201604052801561069b5781602001600182028038833980820191505090505b50905060008160200190506106b78487602001510182856108dc565b81945050505050919050565b600080823b905060008163ffffffff1611915050919050565b600080826000015114156106f35760009050610725565b60008083602001519050805160001a915060c060ff168260ff16101561071e57600092505050610725565b6001925050505b919050565b600080826000015114156107415760009050610796565b60008090506000610755846020015161079b565b84602001510190506000846000015185602001510190505b8082101561078f5761077e82610824565b82019150828060010193505061076d565b8293505050505b919050565b600080825160001a9050608060ff168110156107bb57600091505061081f565b60b860ff168110806107e0575060c060ff1681101580156107df575060f860ff1681105b5b156107ef57600191505061081f565b60c060ff1681101561080f5760018060b80360ff1682030191505061081f565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561084557600191506108d2565b60b860ff16811015610862576001608060ff1682030191506108d1565b60c060ff168110156108925760b78103600185019450806020036101000a855104600182018101935050506108d0565b60f860ff168110156108af57600160c060ff1682030191506108cf565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156108ea5761093e565b5b602060ff16811061091a5782518252602060ff1683019250602060ff1682019150602060ff16810390506108eb565b6000600182602060ff16036101000a03905080198451168184511681811785525050505b505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fea265627a7a7231582083fbdacb76f32b4112d0f7db9a596937925824798a0026ba0232322390b5263764736f6c634300050b0032", + "balance":"0x0" + }, + "0000000000000000000000000000000000001010":{ + "code":"0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610e06565b005b3480156103eb57600080fd5b506103f4610f58565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f61565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061111d565b005b3480156104e857600080fd5b506104f16111ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b50610548611212565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611238565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b50610604611259565b005b34801561061257600080fd5b5061061b611329565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061132f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b506107586114b4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af6114dd565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de611534565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e61156d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115aa565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b506109646115d0565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b810190808035906020019092919050505061165d565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061167d565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a6561169d565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a906116a4565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb6116aa565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611737565b005b348015610b2e57600080fd5b50610b37611754565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b6000808511610c4857600080fd5b6000831480610c575750824311155b610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5369676e6174757265206973206578706972656400000000000000000000000081525060200191505060405180910390fd5b6000610cd73387878761167d565b9050600015156005600083815260200190815260200160002060009054906101000a900460ff16151514610d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f536967206465616374697661746564000000000000000000000000000000000081525060200191505060405180910390fd5b60016005600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610ded8189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061132f565b9150610dfa82848861177a565b50509695505050505050565b60003390506000610e1682611238565b9050610e2d83600654611b3790919063ffffffff16565b600681905550600083118015610e4257508234145b610eb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610f3087611238565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610f696114dd565b610f7257600080fd5b600081118015610faf5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e636023913960400191505060405180910390fd5b600061100f83611238565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561105c573d6000803e3d6000fd5b5061107283600654611b5790919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f685856110f489611238565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611183576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e406023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111e882611b76565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b6112616114dd565b61126a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b600080600080604185511461134a57600093505050506114ae565b602085015192506040850151915060ff6041860151169050601b8160ff16101561137557601b810190505b601b8160ff161415801561138d5750601c8160ff1614155b1561139e57600093505050506114ae565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113fb573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b60008134146115bc57600090506115ca565b6115c733848461177a565b90505b92915050565b6040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b6020831061161f57805182526020820191506020810190506020830392506115fc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061169361168e86868686611c6e565b611d44565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611e86605291396040516020018082805190602001908083835b602083106116f957805182526020820191506020810190506020830392506116d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b61173f6114dd565b61174857600080fd5b61175181611b76565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117fa57600080fd5b505afa15801561180e573d6000803e3d6000fd5b505050506040513d602081101561182457600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118b657600080fd5b505afa1580156118ca573d6000803e3d6000fd5b505050506040513d60208110156118e057600080fd5b810190808051906020019092919050505090506118fe868686611d8e565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d6020811015611a3057600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611abe57600080fd5b505afa158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b600082821115611b4657600080fd5b600082840390508091505092915050565b600080828401905083811015611b6c57600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bb057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b60208310611cc05780518252602082019150602081019050602083039250611c9d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611dd4573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a723158208f81700133738d766ae3d68af591ad588b0125bd91449192179f460893f79f6b64736f6c634300050b0032", + "balance":"0x204fcd4f31349d83b6e00000" + }, + "928ed6a3e94437bbd316ccad78479f1d163a6a8c":{ + "balance":"0x3635c9adc5dea00000" + }, + "be188d6641e8b680743a4815dfa0f6208038960f":{ + "balance":"0x3635c9adc5dea00000" + }, + "c26880a0af2ea0c7e8130e6ec47af756465452e8":{ + "balance":"0x3635c9adc5dea00000" + }, + "c275dc8be39f50d12f66b6a63629c39da5bae5bd":{ + "balance":"0x3635c9adc5dea00000" + }, + "f903ba9e006193c1527bfbe65fe2123704ea3f99":{ + "balance":"0x3635c9adc5dea00000" + } + }, + "number":"0x0", + "gasUsed":"0x0", + "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas":null +} diff --git a/internal/cli/server/chains/test_files/wrong_chain.json b/internal/cli/server/chains/test_files/wrong_chain.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/internal/cli/server/chains/test_files/wrong_chain.json @@ -0,0 +1 @@ +{} \ No newline at end of file From 96ac8d16d4dc66c6eb4d28c8c7e9a70063d330b5 Mon Sep 17 00:00:00 2001 From: Jerry Date: Tue, 31 May 2022 18:52:18 -0700 Subject: [PATCH 118/190] Overwrite default config with CLI input even when the input value is considered as empty This change will fix two issues: 1. When CLI sets a flag to an empty value in Go, e.g. 0 as to Uint64, the flag will be skipped and never set correctly. This problem could be solved by using option "WithOverwriteWithEmptyValue" when merge two configs. 2. The default non-empty value in server config will be overwritten to an empty value after flag initialization. This problem is solved by explicitly providing default value to all flags that have a default value option. --- internal/cli/server/config.go | 7 +- internal/cli/server/config_test.go | 5 +- internal/cli/server/flags.go | 652 ++++++++++++++++------------- 3 files changed, 366 insertions(+), 298 deletions(-) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index a93c4f057f..4c17a58fc8 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -956,14 +956,9 @@ func (c *Config) buildNode() (*node.Config, error) { func (c *Config) Merge(cc ...*Config) error { for _, elem := range cc { - if err := mergo.Merge(c, elem, mergo.WithOverride, mergo.WithAppendSlice); err != nil { + if err := mergo.Merge(c, elem, mergo.WithOverwriteWithEmptyValue, mergo.WithAppendSlice); err != nil { return fmt.Errorf("failed to merge configurations: %v", err) } - - // override max peers - if elem.P2P.MaxPeers == 0 { - c.P2P.MaxPeers = 0 - } } return nil } diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index c897fa789c..7368478123 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -54,14 +54,11 @@ func TestConfigMerge(t *testing.T) { } expected := &Config{ Chain: "1", - NoSnapshot: true, + NoSnapshot: false, RequiredBlocks: map[string]string{ "a": "b", "b": "c", }, - TxPool: &TxPoolConfig{ - LifeTime: 5 * time.Second, - }, P2P: &P2PConfig{ MaxPeers: 10, Discovery: &P2PDiscovery{ diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index 1fec151e61..6269e1c6fa 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -10,24 +10,28 @@ func (c *Command) Flags() *flagset.Flagset { f := flagset.NewFlagSet("server") f.StringFlag(&flagset.StringFlag{ - Name: "chain", - Usage: "Name of the chain to sync", - Value: &c.cliConfig.Chain, + Name: "chain", + Usage: "Name of the chain to sync", + Value: &c.cliConfig.Chain, + Default: c.cliConfig.Chain, }) f.StringFlag(&flagset.StringFlag{ - Name: "name", - Usage: "Name/Identity of the node", - Value: &c.cliConfig.Name, + Name: "name", + Usage: "Name/Identity of the node", + Value: &c.cliConfig.Name, + Default: c.cliConfig.Name, }) f.StringFlag(&flagset.StringFlag{ - Name: "log-level", - Usage: "Set log level for the server", - Value: &c.cliConfig.LogLevel, + Name: "log-level", + Usage: "Set log level for the server", + Value: &c.cliConfig.LogLevel, + Default: c.cliConfig.LogLevel, }) f.StringFlag(&flagset.StringFlag{ - Name: "datadir", - Usage: "Path of the data directory to store information", - Value: &c.cliConfig.DataDir, + Name: "datadir", + Usage: "Path of the data directory to store information", + Value: &c.cliConfig.DataDir, + Default: c.cliConfig.DataDir, }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "config", @@ -35,14 +39,16 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.configFile, }) f.StringFlag(&flagset.StringFlag{ - Name: "syncmode", - Usage: `Blockchain sync mode ("fast", "full", or "snap")`, - Value: &c.cliConfig.SyncMode, + Name: "syncmode", + Usage: `Blockchain sync mode ("fast", "full", or "snap")`, + Value: &c.cliConfig.SyncMode, + Default: c.cliConfig.SyncMode, }) f.StringFlag(&flagset.StringFlag{ - Name: "gcmode", - Usage: `Blockchain garbage collection mode ("full", "archive")`, - Value: &c.cliConfig.GcMode, + Name: "gcmode", + Usage: `Blockchain garbage collection mode ("full", "archive")`, + Value: &c.cliConfig.GcMode, + Default: c.cliConfig.GcMode, }) f.MapStringFlag(&flagset.MapStringFlag{ Name: "requiredblocks", @@ -50,21 +56,24 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.cliConfig.RequiredBlocks, }) f.BoolFlag(&flagset.BoolFlag{ - Name: "no-snapshot", - Usage: `Disables the snapshot-database mode (default = false)`, - Value: &c.cliConfig.NoSnapshot, + Name: "no-snapshot", + Usage: `Disables the snapshot-database mode (default = false)`, + Value: &c.cliConfig.NoSnapshot, + Default: c.cliConfig.NoSnapshot, }) // heimdall f.StringFlag(&flagset.StringFlag{ - Name: "bor.heimdall", - Usage: "URL of Heimdall service", - Value: &c.cliConfig.Heimdall.URL, + Name: "bor.heimdall", + Usage: "URL of Heimdall service", + Value: &c.cliConfig.Heimdall.URL, + Default: c.cliConfig.Heimdall.URL, }) f.BoolFlag(&flagset.BoolFlag{ - Name: "bor.withoutheimdall", - Usage: "Run without Heimdall service (for testing purpose)", - Value: &c.cliConfig.Heimdall.Without, + Name: "bor.withoutheimdall", + Usage: "Run without Heimdall service (for testing purpose)", + Value: &c.cliConfig.Heimdall.Without, + Default: c.cliConfig.Heimdall.Without, }) // txpool options @@ -75,90 +84,104 @@ func (c *Command) Flags() *flagset.Flagset { Group: "Transaction Pool", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "txpool.nolocals", - Usage: "Disables price exemptions for locally submitted transactions", - Value: &c.cliConfig.TxPool.NoLocals, - Group: "Transaction Pool", + Name: "txpool.nolocals", + Usage: "Disables price exemptions for locally submitted transactions", + Value: &c.cliConfig.TxPool.NoLocals, + Default: c.cliConfig.TxPool.NoLocals, + Group: "Transaction Pool", }) f.StringFlag(&flagset.StringFlag{ - Name: "txpool.journal", - Usage: "Disk journal for local transaction to survive node restarts", - Value: &c.cliConfig.TxPool.Journal, - Group: "Transaction Pool", + Name: "txpool.journal", + Usage: "Disk journal for local transaction to survive node restarts", + Value: &c.cliConfig.TxPool.Journal, + Default: c.cliConfig.TxPool.Journal, + Group: "Transaction Pool", }) f.DurationFlag(&flagset.DurationFlag{ - Name: "txpool.rejournal", - Usage: "Time interval to regenerate the local transaction journal", - Value: &c.cliConfig.TxPool.Rejournal, - Group: "Transaction Pool", + Name: "txpool.rejournal", + Usage: "Time interval to regenerate the local transaction journal", + Value: &c.cliConfig.TxPool.Rejournal, + Default: c.cliConfig.TxPool.Rejournal, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.pricelimit", - Usage: "Minimum gas price limit to enforce for acceptance into the pool", - Value: &c.cliConfig.TxPool.PriceLimit, - Group: "Transaction Pool", + Name: "txpool.pricelimit", + Usage: "Minimum gas price limit to enforce for acceptance into the pool", + Value: &c.cliConfig.TxPool.PriceLimit, + Default: c.cliConfig.TxPool.PriceLimit, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.pricebump", - Usage: "Price bump percentage to replace an already existing transaction", - Value: &c.cliConfig.TxPool.PriceBump, - Group: "Transaction Pool", + Name: "txpool.pricebump", + Usage: "Price bump percentage to replace an already existing transaction", + Value: &c.cliConfig.TxPool.PriceBump, + Default: c.cliConfig.TxPool.PriceBump, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.accountslots", - Usage: "Minimum number of executable transaction slots guaranteed per account", - Value: &c.cliConfig.TxPool.AccountSlots, - Group: "Transaction Pool", + Name: "txpool.accountslots", + Usage: "Minimum number of executable transaction slots guaranteed per account", + Value: &c.cliConfig.TxPool.AccountSlots, + Default: c.cliConfig.TxPool.AccountSlots, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.globalslots", - Usage: "Maximum number of executable transaction slots for all accounts", - Value: &c.cliConfig.TxPool.GlobalSlots, - Group: "Transaction Pool", + Name: "txpool.globalslots", + Usage: "Maximum number of executable transaction slots for all accounts", + Value: &c.cliConfig.TxPool.GlobalSlots, + Default: c.cliConfig.TxPool.GlobalSlots, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.accountqueue", - Usage: "Maximum number of non-executable transaction slots permitted per account", - Value: &c.cliConfig.TxPool.AccountQueue, - Group: "Transaction Pool", + Name: "txpool.accountqueue", + Usage: "Maximum number of non-executable transaction slots permitted per account", + Value: &c.cliConfig.TxPool.AccountQueue, + Default: c.cliConfig.TxPool.AccountQueue, + Group: "Transaction Pool", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txpool.globalqueue", - Usage: "Maximum number of non-executable transaction slots for all accounts", - Value: &c.cliConfig.TxPool.GlobalQueue, - Group: "Transaction Pool", + Name: "txpool.globalqueue", + Usage: "Maximum number of non-executable transaction slots for all accounts", + Value: &c.cliConfig.TxPool.GlobalQueue, + Default: c.cliConfig.TxPool.GlobalQueue, + Group: "Transaction Pool", }) f.DurationFlag(&flagset.DurationFlag{ - Name: "txpool.lifetime", - Usage: "Maximum amount of time non-executable transaction are queued", - Value: &c.cliConfig.TxPool.LifeTime, - Group: "Transaction Pool", + Name: "txpool.lifetime", + Usage: "Maximum amount of time non-executable transaction are queued", + Value: &c.cliConfig.TxPool.LifeTime, + Default: c.cliConfig.TxPool.LifeTime, + Group: "Transaction Pool", }) // sealer options f.BoolFlag(&flagset.BoolFlag{ - Name: "mine", - Usage: "Enable mining", - Value: &c.cliConfig.Sealer.Enabled, - Group: "Sealer", + Name: "mine", + Usage: "Enable mining", + Value: &c.cliConfig.Sealer.Enabled, + Default: c.cliConfig.Sealer.Enabled, + Group: "Sealer", }) f.StringFlag(&flagset.StringFlag{ - Name: "miner.etherbase", - Usage: "Public address for block mining rewards (default = first account)", - Value: &c.cliConfig.Sealer.Etherbase, - Group: "Sealer", + Name: "miner.etherbase", + Usage: "Public address for block mining rewards (default = first account)", + Value: &c.cliConfig.Sealer.Etherbase, + Default: c.cliConfig.Sealer.Etherbase, + Group: "Sealer", }) f.StringFlag(&flagset.StringFlag{ - Name: "miner.extradata", - Usage: "Block extra data set by the miner (default = client version)", - Value: &c.cliConfig.Sealer.ExtraData, - Group: "Sealer", + Name: "miner.extradata", + Usage: "Block extra data set by the miner (default = client version)", + Value: &c.cliConfig.Sealer.ExtraData, + Default: c.cliConfig.Sealer.ExtraData, + Group: "Sealer", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "miner.gaslimit", - Usage: "Target gas ceiling for mined blocks", - Value: &c.cliConfig.Sealer.GasCeil, - Group: "Sealer", + Name: "miner.gaslimit", + Usage: "Target gas ceiling for mined blocks", + Value: &c.cliConfig.Sealer.GasCeil, + Default: c.cliConfig.Sealer.GasCeil, + Group: "Sealer", }) f.BigIntFlag(&flagset.BigIntFlag{ Name: "miner.gasprice", @@ -169,21 +192,24 @@ func (c *Command) Flags() *flagset.Flagset { // ethstats f.StringFlag(&flagset.StringFlag{ - Name: "ethstats", - Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)", - Value: &c.cliConfig.Ethstats, + Name: "ethstats", + Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)", + Value: &c.cliConfig.Ethstats, + Default: c.cliConfig.Ethstats, }) // gas price oracle f.Uint64Flag(&flagset.Uint64Flag{ - Name: "gpo.blocks", - Usage: "Number of recent blocks to check for gas prices", - Value: &c.cliConfig.Gpo.Blocks, + Name: "gpo.blocks", + Usage: "Number of recent blocks to check for gas prices", + Value: &c.cliConfig.Gpo.Blocks, + Default: c.cliConfig.Gpo.Blocks, }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "gpo.percentile", - Usage: "Suggested gas price is the given percentile of a set of recent transaction gas prices", - Value: &c.cliConfig.Gpo.Percentile, + Name: "gpo.percentile", + Usage: "Suggested gas price is the given percentile of a set of recent transaction gas prices", + Value: &c.cliConfig.Gpo.Percentile, + Default: c.cliConfig.Gpo.Percentile, }) f.BigIntFlag(&flagset.BigIntFlag{ Name: "gpo.maxprice", @@ -198,90 +224,104 @@ func (c *Command) Flags() *flagset.Flagset { // cache options f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache", - Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node)", - Value: &c.cliConfig.Cache.Cache, - Group: "Cache", + Name: "cache", + Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node)", + Value: &c.cliConfig.Cache.Cache, + Default: c.cliConfig.Cache.Cache, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache.database", - Usage: "Percentage of cache memory allowance to use for database io", - Value: &c.cliConfig.Cache.PercDatabase, - Group: "Cache", + Name: "cache.database", + Usage: "Percentage of cache memory allowance to use for database io", + Value: &c.cliConfig.Cache.PercDatabase, + Default: c.cliConfig.Cache.PercDatabase, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache.trie", - Usage: "Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode)", - Value: &c.cliConfig.Cache.PercTrie, - Group: "Cache", + Name: "cache.trie", + Usage: "Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode)", + Value: &c.cliConfig.Cache.PercTrie, + Default: c.cliConfig.Cache.PercTrie, + Group: "Cache", }) f.StringFlag(&flagset.StringFlag{ - Name: "cache.trie.journal", - Usage: "Disk journal directory for trie cache to survive node restarts", - Value: &c.cliConfig.Cache.Journal, - Group: "Cache", + Name: "cache.trie.journal", + Usage: "Disk journal directory for trie cache to survive node restarts", + Value: &c.cliConfig.Cache.Journal, + Default: c.cliConfig.Cache.Journal, + Group: "Cache", }) f.DurationFlag(&flagset.DurationFlag{ - Name: "cache.trie.rejournal", - Usage: "Time interval to regenerate the trie cache journal", - Value: &c.cliConfig.Cache.Rejournal, - Group: "Cache", + Name: "cache.trie.rejournal", + Usage: "Time interval to regenerate the trie cache journal", + Value: &c.cliConfig.Cache.Rejournal, + Default: c.cliConfig.Cache.Rejournal, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache.gc", - Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)", - Value: &c.cliConfig.Cache.PercGc, - Group: "Cache", + Name: "cache.gc", + Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)", + Value: &c.cliConfig.Cache.PercGc, + Default: c.cliConfig.Cache.PercGc, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "cache.snapshot", - Usage: "Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode)", - Value: &c.cliConfig.Cache.PercSnapshot, - Group: "Cache", + Name: "cache.snapshot", + Usage: "Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode)", + Value: &c.cliConfig.Cache.PercSnapshot, + Default: c.cliConfig.Cache.PercSnapshot, + Group: "Cache", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "cache.noprefetch", - Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)", - Value: &c.cliConfig.Cache.NoPrefetch, - Group: "Cache", + Name: "cache.noprefetch", + Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)", + Value: &c.cliConfig.Cache.NoPrefetch, + Default: c.cliConfig.Cache.NoPrefetch, + Group: "Cache", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "cache.preimages", - Usage: "Enable recording the SHA3/keccak preimages of trie keys", - Value: &c.cliConfig.Cache.Preimages, - Group: "Cache", + Name: "cache.preimages", + Usage: "Enable recording the SHA3/keccak preimages of trie keys", + Value: &c.cliConfig.Cache.Preimages, + Default: c.cliConfig.Cache.Preimages, + Group: "Cache", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "txlookuplimit", - Usage: "Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain)", - Value: &c.cliConfig.Cache.TxLookupLimit, - Group: "Cache", + Name: "txlookuplimit", + Usage: "Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain)", + Value: &c.cliConfig.Cache.TxLookupLimit, + Default: c.cliConfig.Cache.TxLookupLimit, + Group: "Cache", }) // rpc options f.Uint64Flag(&flagset.Uint64Flag{ - Name: "rpc.gascap", - Usage: "Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite)", - Value: &c.cliConfig.JsonRPC.GasCap, - Group: "JsonRPC", + Name: "rpc.gascap", + Usage: "Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite)", + Value: &c.cliConfig.JsonRPC.GasCap, + Default: c.cliConfig.JsonRPC.GasCap, + Group: "JsonRPC", }) f.Float64Flag(&flagset.Float64Flag{ - Name: "rpc.txfeecap", - Usage: "Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap)", - Value: &c.cliConfig.JsonRPC.TxFeeCap, - Group: "JsonRPC", + Name: "rpc.txfeecap", + Usage: "Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap)", + Value: &c.cliConfig.JsonRPC.TxFeeCap, + Default: c.cliConfig.JsonRPC.TxFeeCap, + Group: "JsonRPC", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "ipcdisable", - Usage: "Disable the IPC-RPC server", - Value: &c.cliConfig.JsonRPC.IPCDisable, - Group: "JsonRPC", + Name: "ipcdisable", + Usage: "Disable the IPC-RPC server", + Value: &c.cliConfig.JsonRPC.IPCDisable, + Default: c.cliConfig.JsonRPC.IPCDisable, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ - Name: "ipcpath", - Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", - Value: &c.cliConfig.JsonRPC.IPCPath, - Group: "JsonRPC", + Name: "ipcpath", + Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", + Value: &c.cliConfig.JsonRPC.IPCPath, + Default: c.cliConfig.JsonRPC.IPCPath, + Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "jsonrpc.corsdomain", @@ -298,28 +338,32 @@ func (c *Command) Flags() *flagset.Flagset { // http options f.BoolFlag(&flagset.BoolFlag{ - Name: "http", - Usage: "Enable the HTTP-RPC server", - Value: &c.cliConfig.JsonRPC.Http.Enabled, - Group: "JsonRPC", + Name: "http", + Usage: "Enable the HTTP-RPC server", + Value: &c.cliConfig.JsonRPC.Http.Enabled, + Default: c.cliConfig.JsonRPC.Http.Enabled, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ - Name: "http.addr", - Usage: "HTTP-RPC server listening interface", - Value: &c.cliConfig.JsonRPC.Http.Host, - Group: "JsonRPC", + Name: "http.addr", + Usage: "HTTP-RPC server listening interface", + Value: &c.cliConfig.JsonRPC.Http.Host, + Default: c.cliConfig.JsonRPC.Http.Host, + Group: "JsonRPC", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "http.port", - Usage: "HTTP-RPC server listening port", - Value: &c.cliConfig.JsonRPC.Http.Port, - Group: "JsonRPC", + Name: "http.port", + Usage: "HTTP-RPC server listening port", + Value: &c.cliConfig.JsonRPC.Http.Port, + Default: c.cliConfig.JsonRPC.Http.Port, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ - Name: "http.rpcprefix", - Usage: "HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", - Value: &c.cliConfig.JsonRPC.Http.Prefix, - Group: "JsonRPC", + Name: "http.rpcprefix", + Usage: "HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", + Value: &c.cliConfig.JsonRPC.Http.Prefix, + Default: c.cliConfig.JsonRPC.Http.Prefix, + Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "http.modules", @@ -330,28 +374,32 @@ func (c *Command) Flags() *flagset.Flagset { // ws options f.BoolFlag(&flagset.BoolFlag{ - Name: "ws", - Usage: "Enable the WS-RPC server", - Value: &c.cliConfig.JsonRPC.Ws.Enabled, - Group: "JsonRPC", + Name: "ws", + Usage: "Enable the WS-RPC server", + Value: &c.cliConfig.JsonRPC.Ws.Enabled, + Default: c.cliConfig.JsonRPC.Ws.Enabled, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ - Name: "ws.addr", - Usage: "WS-RPC server listening interface", - Value: &c.cliConfig.JsonRPC.Ws.Host, - Group: "JsonRPC", + Name: "ws.addr", + Usage: "WS-RPC server listening interface", + Value: &c.cliConfig.JsonRPC.Ws.Host, + Default: c.cliConfig.JsonRPC.Ws.Host, + Group: "JsonRPC", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "ws.port", - Usage: "WS-RPC server listening port", - Value: &c.cliConfig.JsonRPC.Ws.Port, - Group: "JsonRPC", + Name: "ws.port", + Usage: "WS-RPC server listening port", + Value: &c.cliConfig.JsonRPC.Ws.Port, + Default: c.cliConfig.JsonRPC.Ws.Port, + Group: "JsonRPC", }) f.StringFlag(&flagset.StringFlag{ - Name: "ws.rpcprefix", - Usage: "HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", - Value: &c.cliConfig.JsonRPC.Ws.Prefix, - Group: "JsonRPC", + Name: "ws.rpcprefix", + Usage: "HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", + Value: &c.cliConfig.JsonRPC.Ws.Prefix, + Default: c.cliConfig.JsonRPC.Ws.Prefix, + Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "ws.modules", @@ -362,24 +410,27 @@ func (c *Command) Flags() *flagset.Flagset { // graphql options f.BoolFlag(&flagset.BoolFlag{ - Name: "graphql", - Usage: "Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.", - Value: &c.cliConfig.JsonRPC.Graphql.Enabled, - Group: "JsonRPC", + Name: "graphql", + Usage: "Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.", + Value: &c.cliConfig.JsonRPC.Graphql.Enabled, + Default: c.cliConfig.JsonRPC.Graphql.Enabled, + Group: "JsonRPC", }) // p2p options f.StringFlag(&flagset.StringFlag{ - Name: "bind", - Usage: "Network binding address", - Value: &c.cliConfig.P2P.Bind, - Group: "P2P", + Name: "bind", + Usage: "Network binding address", + Value: &c.cliConfig.P2P.Bind, + Default: c.cliConfig.P2P.Bind, + Group: "P2P", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "port", - Usage: "Network listening port", - Value: &c.cliConfig.P2P.Port, - Group: "P2P", + Name: "port", + Usage: "Network listening port", + Value: &c.cliConfig.P2P.Port, + Default: c.cliConfig.P2P.Port, + Group: "P2P", }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "bootnodes", @@ -388,78 +439,90 @@ func (c *Command) Flags() *flagset.Flagset { Group: "P2P", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "maxpeers", - Usage: "Maximum number of network peers (network disabled if set to 0)", - Value: &c.cliConfig.P2P.MaxPeers, - Group: "P2P", + Name: "maxpeers", + Usage: "Maximum number of network peers (network disabled if set to 0)", + Value: &c.cliConfig.P2P.MaxPeers, + Default: c.cliConfig.P2P.MaxPeers, + Group: "P2P", }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "maxpendpeers", - Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", - Value: &c.cliConfig.P2P.MaxPendPeers, - Group: "P2P", + Name: "maxpendpeers", + Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", + Value: &c.cliConfig.P2P.MaxPendPeers, + Default: c.cliConfig.P2P.MaxPendPeers, + Group: "P2P", }) f.StringFlag(&flagset.StringFlag{ - Name: "nat", - Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:)", - Value: &c.cliConfig.P2P.NAT, - Group: "P2P", + Name: "nat", + Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:)", + Value: &c.cliConfig.P2P.NAT, + Default: c.cliConfig.P2P.NAT, + Group: "P2P", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "nodiscover", - Usage: "Disables the peer discovery mechanism (manual peer addition)", - Value: &c.cliConfig.P2P.NoDiscover, - Group: "P2P", + Name: "nodiscover", + Usage: "Disables the peer discovery mechanism (manual peer addition)", + Value: &c.cliConfig.P2P.NoDiscover, + Default: c.cliConfig.P2P.NoDiscover, + Group: "P2P", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "v5disc", - Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism", - Value: &c.cliConfig.P2P.Discovery.V5Enabled, - Group: "P2P", + Name: "v5disc", + Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism", + Value: &c.cliConfig.P2P.Discovery.V5Enabled, + Default: c.cliConfig.P2P.Discovery.V5Enabled, + Group: "P2P", }) // metrics f.BoolFlag(&flagset.BoolFlag{ - Name: "metrics", - Usage: "Enable metrics collection and reporting", - Value: &c.cliConfig.Telemetry.Enabled, - Group: "Telemetry", + Name: "metrics", + Usage: "Enable metrics collection and reporting", + Value: &c.cliConfig.Telemetry.Enabled, + Default: c.cliConfig.Telemetry.Enabled, + Group: "Telemetry", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "metrics.expensive", - Usage: "Enable expensive metrics collection and reporting", - Value: &c.cliConfig.Telemetry.Expensive, - Group: "Telemetry", + Name: "metrics.expensive", + Usage: "Enable expensive metrics collection and reporting", + Value: &c.cliConfig.Telemetry.Expensive, + Default: c.cliConfig.Telemetry.Expensive, + Group: "Telemetry", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "metrics.influxdb", - Usage: "Enable metrics export/push to an external InfluxDB database (v1)", - Value: &c.cliConfig.Telemetry.InfluxDB.V1Enabled, - Group: "Telemetry", + Name: "metrics.influxdb", + Usage: "Enable metrics export/push to an external InfluxDB database (v1)", + Value: &c.cliConfig.Telemetry.InfluxDB.V1Enabled, + Default: c.cliConfig.Telemetry.InfluxDB.V1Enabled, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.endpoint", - Usage: "InfluxDB API endpoint to report metrics to", - Value: &c.cliConfig.Telemetry.InfluxDB.Endpoint, - Group: "Telemetry", + Name: "metrics.influxdb.endpoint", + Usage: "InfluxDB API endpoint to report metrics to", + Value: &c.cliConfig.Telemetry.InfluxDB.Endpoint, + Default: c.cliConfig.Telemetry.InfluxDB.Endpoint, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.database", - Usage: "InfluxDB database name to push reported metrics to", - Value: &c.cliConfig.Telemetry.InfluxDB.Database, - Group: "Telemetry", + Name: "metrics.influxdb.database", + Usage: "InfluxDB database name to push reported metrics to", + Value: &c.cliConfig.Telemetry.InfluxDB.Database, + Default: c.cliConfig.Telemetry.InfluxDB.Database, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.username", - Usage: "Username to authorize access to the database", - Value: &c.cliConfig.Telemetry.InfluxDB.Username, - Group: "Telemetry", + Name: "metrics.influxdb.username", + Usage: "Username to authorize access to the database", + Value: &c.cliConfig.Telemetry.InfluxDB.Username, + Default: c.cliConfig.Telemetry.InfluxDB.Username, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.password", - Usage: "Password to authorize access to the database", - Value: &c.cliConfig.Telemetry.InfluxDB.Password, - Group: "Telemetry", + Name: "metrics.influxdb.password", + Usage: "Password to authorize access to the database", + Value: &c.cliConfig.Telemetry.InfluxDB.Password, + Default: c.cliConfig.Telemetry.InfluxDB.Password, + Group: "Telemetry", }) f.MapStringFlag(&flagset.MapStringFlag{ Name: "metrics.influxdb.tags", @@ -468,41 +531,47 @@ func (c *Command) Flags() *flagset.Flagset { Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.prometheus-addr", - Usage: "Address for Prometheus Server", - Value: &c.cliConfig.Telemetry.PrometheusAddr, - Group: "Telemetry", + Name: "metrics.prometheus-addr", + Usage: "Address for Prometheus Server", + Value: &c.cliConfig.Telemetry.PrometheusAddr, + Default: c.cliConfig.Telemetry.PrometheusAddr, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.opencollector-endpoint", - Usage: "OpenCollector Endpoint (host:port)", - Value: &c.cliConfig.Telemetry.OpenCollectorEndpoint, - Group: "Telemetry", + Name: "metrics.opencollector-endpoint", + Usage: "OpenCollector Endpoint (host:port)", + Value: &c.cliConfig.Telemetry.OpenCollectorEndpoint, + Default: c.cliConfig.Telemetry.OpenCollectorEndpoint, + Group: "Telemetry", }) // influx db v2 f.BoolFlag(&flagset.BoolFlag{ - Name: "metrics.influxdbv2", - Usage: "Enable metrics export/push to an external InfluxDB v2 database", - Value: &c.cliConfig.Telemetry.InfluxDB.V2Enabled, - Group: "Telemetry", + Name: "metrics.influxdbv2", + Usage: "Enable metrics export/push to an external InfluxDB v2 database", + Value: &c.cliConfig.Telemetry.InfluxDB.V2Enabled, + Default: c.cliConfig.Telemetry.InfluxDB.V2Enabled, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.token", - Usage: "Token to authorize access to the database (v2 only)", - Value: &c.cliConfig.Telemetry.InfluxDB.Token, - Group: "Telemetry", + Name: "metrics.influxdb.token", + Usage: "Token to authorize access to the database (v2 only)", + Value: &c.cliConfig.Telemetry.InfluxDB.Token, + Default: c.cliConfig.Telemetry.InfluxDB.Token, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.bucket", - Usage: "InfluxDB bucket name to push reported metrics to (v2 only)", - Value: &c.cliConfig.Telemetry.InfluxDB.Bucket, - Group: "Telemetry", + Name: "metrics.influxdb.bucket", + Usage: "InfluxDB bucket name to push reported metrics to (v2 only)", + Value: &c.cliConfig.Telemetry.InfluxDB.Bucket, + Default: c.cliConfig.Telemetry.InfluxDB.Bucket, + Group: "Telemetry", }) f.StringFlag(&flagset.StringFlag{ - Name: "metrics.influxdb.organization", - Usage: "InfluxDB organization name (v2 only)", - Value: &c.cliConfig.Telemetry.InfluxDB.Organization, - Group: "Telemetry", + Name: "metrics.influxdb.organization", + Usage: "InfluxDB organization name (v2 only)", + Value: &c.cliConfig.Telemetry.InfluxDB.Organization, + Default: c.cliConfig.Telemetry.InfluxDB.Organization, + Group: "Telemetry", }) // account @@ -513,46 +582,53 @@ func (c *Command) Flags() *flagset.Flagset { Group: "Account Management", }) f.StringFlag(&flagset.StringFlag{ - Name: "password", - Usage: "Password file to use for non-interactive password input", - Value: &c.cliConfig.Accounts.PasswordFile, - Group: "Account Management", + Name: "password", + Usage: "Password file to use for non-interactive password input", + Value: &c.cliConfig.Accounts.PasswordFile, + Default: c.cliConfig.Accounts.PasswordFile, + Group: "Account Management", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "allow-insecure-unlock", - Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", - Value: &c.cliConfig.Accounts.AllowInsecureUnlock, - Group: "Account Management", + Name: "allow-insecure-unlock", + Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", + Value: &c.cliConfig.Accounts.AllowInsecureUnlock, + Default: c.cliConfig.Accounts.AllowInsecureUnlock, + Group: "Account Management", }) f.BoolFlag(&flagset.BoolFlag{ - Name: "lightkdf", - Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", - Value: &c.cliConfig.Accounts.UseLightweightKDF, - Group: "Account Management", + Name: "lightkdf", + Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", + Value: &c.cliConfig.Accounts.UseLightweightKDF, + Default: c.cliConfig.Accounts.UseLightweightKDF, + Group: "Account Management", }) f.BoolFlag((&flagset.BoolFlag{ - Name: "disable-bor-wallet", - Usage: "Disable the personal wallet endpoints", - Value: &c.cliConfig.Accounts.DisableBorWallet, + Name: "disable-bor-wallet", + Usage: "Disable the personal wallet endpoints", + Value: &c.cliConfig.Accounts.DisableBorWallet, + Default: c.cliConfig.Accounts.DisableBorWallet, })) // grpc f.StringFlag(&flagset.StringFlag{ - Name: "grpc.addr", - Usage: "Address and port to bind the GRPC server", - Value: &c.cliConfig.GRPC.Addr, + Name: "grpc.addr", + Usage: "Address and port to bind the GRPC server", + Value: &c.cliConfig.GRPC.Addr, + Default: c.cliConfig.GRPC.Addr, }) // developer f.BoolFlag(&flagset.BoolFlag{ - Name: "dev", - Usage: "Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled", - Value: &c.cliConfig.Developer.Enabled, + Name: "dev", + Usage: "Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled", + Value: &c.cliConfig.Developer.Enabled, + Default: c.cliConfig.Developer.Enabled, }) f.Uint64Flag(&flagset.Uint64Flag{ - Name: "dev.period", - Usage: "Block period to use in developer mode (0 = mine only if transaction pending)", - Value: &c.cliConfig.Developer.Period, + Name: "dev.period", + Usage: "Block period to use in developer mode (0 = mine only if transaction pending)", + Value: &c.cliConfig.Developer.Period, + Default: c.cliConfig.Developer.Period, }) return f } From d4e7603315cfb0df7c08e284983c5e937d2b2ff1 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 2 Jun 2022 16:23:38 +0530 Subject: [PATCH 119/190] add debug rpc endpoints for checkpoint whitelist service --- eth/api_backend.go | 8 ++++++++ eth/downloader/downloader.go | 2 ++ eth/downloader/downloader_test.go | 6 ++++++ eth/downloader/whitelist/service.go | 16 ++++++++++------ internal/ethapi/api.go | 11 +++++++++++ internal/ethapi/backend.go | 2 ++ internal/web3ext/web3ext.go | 10 ++++++++++ les/api_backend.go | 15 +++++++++++---- 8 files changed, 60 insertions(+), 10 deletions(-) diff --git a/eth/api_backend.go b/eth/api_backend.go index 6577ac1e1a..c33f3cf6f2 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -359,3 +359,11 @@ func (b *EthAPIBackend) StateAtBlock(ctx context.Context, block *types.Block, re func (b *EthAPIBackend) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (core.Message, vm.BlockContext, *state.StateDB, error) { return b.eth.stateAtTransaction(block, txIndex, reexec) } + +func (b *EthAPIBackend) GetCheckpointWhitelist() map[uint64]common.Hash { + return b.eth.Downloader().ChainValidator.GetCheckpointWhitelist() +} + +func (b *EthAPIBackend) PurgeCheckpointWhitelist() { + b.eth.Downloader().ChainValidator.PurgeCheckpointWhitelist() +} diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 12b4a90dde..fa53fe39c0 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -157,6 +157,8 @@ type Downloader struct { type ChainValidator interface { IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) + GetCheckpointWhitelist() map[uint64]common.Hash + PurgeCheckpointWhitelist() } // LightChain encapsulates functions required to synchronise a light chain. diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index cb0e656e39..3a188298dc 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -1420,6 +1420,12 @@ func (w *whitelistFake) IsValidChain(remoteHeader *types.Header, fetchHeadersByN func (w *whitelistFake) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) {} +func (w *whitelistFake) GetCheckpointWhitelist() map[uint64]common.Hash { + return nil +} + +func (w *whitelistFake) PurgeCheckpointWhitelist() {} + // TestFakedSyncProgress66WhitelistMismatch tests if in case of whitelisted // checkpoint mismatch with opposite peer, the sync should fail. func TestFakedSyncProgress66WhitelistMismatch(t *testing.T) { diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go index f12639454f..62bc842186 100644 --- a/eth/downloader/whitelist/service.go +++ b/eth/downloader/whitelist/service.go @@ -82,12 +82,16 @@ func (w *Service) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash } } -// PurgeWhitelistMap purges data from checkpoint whitelist map -func (w *Service) purgeWhitelistMap() error { - for k := range w.checkpointWhitelist { - delete(w.checkpointWhitelist, k) - } - return nil +// GetCheckpointWhitelist returns the existing whitelisted +// entries of checkpoint of the form block number -> block hash. +func (w *Service) GetCheckpointWhitelist() map[uint64]common.Hash { + return w.checkpointWhitelist +} + +// PurgeCheckpointWhitelist purges data from checkpoint whitelist map +func (w *Service) PurgeCheckpointWhitelist() { + w.checkpointWhitelist = make(map[uint64]common.Hash) + w.checkpointOrder = make([]uint64, 0) } // EnqueueWhitelistBlock enqueues blockNumber, blockHash to the checkpoint whitelist map diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 15536d5d72..59b6feba52 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -2156,6 +2156,17 @@ func (api *PrivateDebugAPI) SetHead(number hexutil.Uint64) { api.b.SetHead(uint64(number)) } +// GetCheckpointWhitelist retrieves the current checkpoint whitelist +// entries (of the form block number -> block hash) +func (api *PrivateDebugAPI) GetCheckpointWhitelist() map[uint64]common.Hash { + return api.b.GetCheckpointWhitelist() +} + +// PurgeCheckpointWhitelist purges the current checkpoint whitelist entries +func (api *PrivateDebugAPI) PurgeCheckpointWhitelist() { + api.b.PurgeCheckpointWhitelist() +} + // PublicNetAPI offers network related RPC methods type PublicNetAPI struct { net *p2p.Server diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 97ce7c24cf..1287640b83 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -99,6 +99,8 @@ type Backend interface { GetBorBlockTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) GetBorBlockTransactionWithBlockHash(ctx context.Context, txHash common.Hash, blockHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) SubscribeChain2HeadEvent(ch chan<- core.Chain2HeadEvent) event.Subscription + GetCheckpointWhitelist() map[uint64]common.Hash + PurgeCheckpointWhitelist() ChainConfig() *params.ChainConfig Engine() consensus.Engine diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index dd8b34e025..dcdd5baf23 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -474,6 +474,16 @@ web3._extend({ params: 2, inputFormatter:[web3._extend.formatters.inputBlockNumberFormatter, web3._extend.formatters.inputBlockNumberFormatter], }), + new web3._extend.Method({ + name: 'getCheckpointWhitelist', + call: 'debug_getCheckpointWhitelist', + params: 0, + }), + new web3._extend.Method({ + name: 'purgeCheckpointWhitelist', + call: 'debug_purgeCheckpointWhitelist', + params: 0, + }), ], properties: [] }); diff --git a/les/api_backend.go b/les/api_backend.go index e9e51c4ecc..c716a3967f 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -337,17 +337,24 @@ func (b *LesApiBackend) StateAtTransaction(ctx context.Context, block *types.Blo // func (b *LesApiBackend) GetBorBlockReceipt(ctx context.Context, hash common.Hash) (*types.Receipt, error) { - return nil, errors.New("Not implemented") + return nil, errors.New("not implemented") } func (b *LesApiBackend) GetBorBlockLogs(ctx context.Context, hash common.Hash) ([]*types.Log, error) { - return nil, errors.New("Not implemented") + return nil, errors.New("not implemented") } func (b *LesApiBackend) GetBorBlockTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { - return nil, common.Hash{}, 0, 0, errors.New("Not implemented") + return nil, common.Hash{}, 0, 0, errors.New("not implemented") } func (b *LesApiBackend) GetBorBlockTransactionWithBlockHash(ctx context.Context, txHash common.Hash, blockHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { - return nil, common.Hash{}, 0, 0, errors.New("Not implemented") + return nil, common.Hash{}, 0, 0, errors.New("not implemented") +} + +func (b *LesApiBackend) GetCheckpointWhitelist() map[uint64]common.Hash { + return nil +} + +func (b *LesApiBackend) PurgeCheckpointWhitelist() { } From 8255d194ae43333ab06ccb413999e5ceb9efdf75 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 2 Jun 2022 16:34:46 +0530 Subject: [PATCH 120/190] minor fixes and enhancements --- consensus/bor/rest.go | 6 +++--- eth/backend.go | 8 +++---- eth/downloader/whitelist/service.go | 6 ++++++ eth/handler_bor.go | 33 +++++++++++++++++++++++------ 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/consensus/bor/rest.go b/consensus/bor/rest.go index 627262ffe6..cee7c11063 100644 --- a/consensus/bor/rest.go +++ b/consensus/bor/rest.go @@ -91,17 +91,17 @@ func (h *HeimdallClient) FetchStateSyncEvents(fromID uint64, to int64) ([]*Event // FetchLatestCheckpoint fetches the latest bor submitted checkpoint from heimdall func (h *HeimdallClient) FetchLatestCheckpoint() (*Checkpoint, error) { - var checkpoint Checkpoint + checkpoint := &Checkpoint{} response, err := h.Fetch("/checkpoints/latest", "") if err != nil { return nil, err } - if err := json.Unmarshal(response.Result, &checkpoint); err != nil { + if err = json.Unmarshal(response.Result, checkpoint); err != nil { return nil, err } - return &checkpoint, nil + return checkpoint, nil } // Fetch fetches response from heimdall diff --git a/eth/backend.go b/eth/backend.go index 8f3930f605..bd941a6b11 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -605,7 +605,7 @@ func (s *Ethereum) startCheckpointWhitelistService() { return } - log.Warn("the first run", "err", err) + log.Warn("unable to whitelist checkpoint - first run", "err", err) } ticker := time.NewTicker(100 * time.Second) @@ -616,7 +616,7 @@ func (s *Ethereum) startCheckpointWhitelistService() { case <-ticker.C: err := s.handleWhitelistCheckpoint() if err != nil { - log.Warn("couldn't get whitelist checkpoint", "err", err) + log.Warn("unable to whitelist checkpoint", "err", err) } case <-s.closeCh: return @@ -625,8 +625,8 @@ func (s *Ethereum) startCheckpointWhitelistService() { } var ( - ErrNotBorConsensus = errors.New("not Bor consensus was given") - ErrBorConsensusWithoutHeimdall = errors.New("Bor consensus without Heimdall") + ErrNotBorConsensus = errors.New("not bor consensus was given") + ErrBorConsensusWithoutHeimdall = errors.New("bor consensus without heimdall") ) // handleWhitelistCheckpoint handles the checkpoint whitelist mechanism. diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go index 62bc842186..c3b6ad6462 100644 --- a/eth/downloader/whitelist/service.go +++ b/eth/downloader/whitelist/service.go @@ -85,11 +85,17 @@ func (w *Service) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash // GetCheckpointWhitelist returns the existing whitelisted // entries of checkpoint of the form block number -> block hash. func (w *Service) GetCheckpointWhitelist() map[uint64]common.Hash { + w.m.Lock() + defer w.m.Unlock() + return w.checkpointWhitelist } // PurgeCheckpointWhitelist purges data from checkpoint whitelist map func (w *Service) PurgeCheckpointWhitelist() { + w.m.Lock() + defer w.m.Unlock() + w.checkpointWhitelist = make(map[uint64]common.Hash) w.checkpointOrder = make([]uint64, 0) } diff --git a/eth/handler_bor.go b/eth/handler_bor.go index ad1ef16288..11896f3c47 100644 --- a/eth/handler_bor.go +++ b/eth/handler_bor.go @@ -12,6 +12,27 @@ import ( "github.com/ethereum/go-ethereum/rpc" ) +var ( + // errCheckpoint is returned when we are unable to fetch the + // latest checkpoint from the local heimdall. + errCheckpoint = errors.New("failed to fetch latest checkpoint") + + // errMissingCheckpoint is returned when we don't have the + // checkpoint blocks locally, yet. + errMissingCheckpoint = errors.New("missing checkpoint blocks") + + // errRootHash is returned when we aren't able to calculate the root hash + // locally for a range of blocks. + errRootHash = errors.New("failed to get local root hash") + + // errCheckpointRootHashMismatch is returned when the local root hash + // doesn't match with the root hash in checkpoint. + errCheckpointRootHashMismatch = errors.New("checkpoint roothash mismatch") + + // errEndBlock is returned when we're unable to fetch a block locally. + errEndBlock = errors.New("failed to get end block") +) + // fetchWhitelistCheckpoint fetched the latest checkpoint from it's local heimdall // and verifies the data against bor data. func (h *ethHandler) fetchWhitelistCheckpoint(bor *bor.Bor) (uint64, common.Hash, error) { @@ -19,33 +40,33 @@ func (h *ethHandler) fetchWhitelistCheckpoint(bor *bor.Bor) (uint64, common.Hash checkpoint, err := bor.HeimdallClient.FetchLatestCheckpoint() if err != nil { log.Debug("Failed to fetch latest checkpoint for whitelisting") - return 0, common.Hash{}, errors.New("failed to fetch latest checkpoint") + return 0, common.Hash{}, errCheckpoint } // check if we have the checkpoint blocks head := h.ethAPI.BlockNumber() if head < hexutil.Uint64(checkpoint.EndBlock.Uint64()) { - log.Debug("Head block behing checkpoint block", "head", head, "checkpoint end block", checkpoint.EndBlock) - return 0, common.Hash{}, errors.New("missing checkpoint blocks") + log.Debug("Head block behind checkpoint block", "head", head, "checkpoint end block", checkpoint.EndBlock) + return 0, common.Hash{}, errMissingCheckpoint } // verify the root hash of checkpoint roothash, err := h.ethAPI.GetRootHash(context.Background(), checkpoint.StartBlock.Uint64(), checkpoint.EndBlock.Uint64()) if err != nil { log.Debug("Failed to get root hash of checkpoint while whitelisting") - return 0, common.Hash{}, errors.New("failed to get local root hash") + return 0, common.Hash{}, errRootHash } if roothash != checkpoint.RootHash.String()[2:] { log.Warn("Checkpoint root hash mismatch while whitelisting", "expected", checkpoint.RootHash.String()[2:], "got", roothash) - return 0, common.Hash{}, errors.New("checkpoint roothash mismatch") + return 0, common.Hash{}, errCheckpointRootHashMismatch } // fetch the end checkpoint block hash block, err := h.ethAPI.GetBlockByNumber(context.Background(), rpc.BlockNumber(checkpoint.EndBlock.Uint64()), false) if err != nil { log.Debug("Failed to get end block hash of checkpoint while whitelisting") - return 0, common.Hash{}, errors.New("failed to get end block") + return 0, common.Hash{}, errEndBlock } hash := fmt.Sprintf("%v", block["hash"]) From 57e829fae9003903e25604a1d135a650be65400d Mon Sep 17 00:00:00 2001 From: Karlo Date: Fri, 3 Jun 2022 11:07:36 +0200 Subject: [PATCH 121/190] avoid capping warnings for gas set by internal system transactions --- internal/ethapi/transaction_args.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/ethapi/transaction_args.go b/internal/ethapi/transaction_args.go index 9c5950af58..2c3520a885 100644 --- a/internal/ethapi/transaction_args.go +++ b/internal/ethapi/transaction_args.go @@ -183,12 +183,15 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (t // Set sender address or use zero address if none specified. addr := args.from() + // Gas set for system calls + systemCallGas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2)) + // Set default gas & gas price if none were set gas := globalGasCap if gas == 0 { gas = uint64(math.MaxUint64 / 2) } - if args.Gas != nil { + if args.Gas != nil && *args.Gas != systemCallGas { gas = uint64(*args.Gas) } if globalGasCap != 0 && globalGasCap < gas { From c9a3b9971b62f14a7936b3c445d755164bcb8de6 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 3 Jun 2022 12:31:48 +0300 Subject: [PATCH 122/190] use typed mocks --- Makefile | 3 + consensus/bor/rest.go | 1 + go.mod | 3 +- go.sum | 1 + tests/bor/bor_test.go | 92 ++++++++------- tests/bor/mocks/IHeimdallClient.go | 181 ++++++++++++++--------------- tests/deps/fake.go | 7 ++ 7 files changed, 154 insertions(+), 134 deletions(-) create mode 100644 tests/deps/fake.go diff --git a/Makefile b/Makefile index 6469b8510f..b283928b81 100644 --- a/Makefile +++ b/Makefile @@ -64,6 +64,9 @@ devtools: env GOBIN= go install github.com/fjl/gencodec@latest env GOBIN= go install github.com/golang/protobuf/protoc-gen-go@latest env GOBIN= go install ./cmd/abigen + PATH=$(GOBIN):$(PATH) go generate ./common + PATH=$(GOBIN):$(PATH) go generate ./core/types + PATH=$(GOBIN):$(PATH) go generate ./consensus/bor @type "solc" 2> /dev/null || echo 'Please install solc' @type "protoc" 2> /dev/null || echo 'Please install protoc' diff --git a/consensus/bor/rest.go b/consensus/bor/rest.go index 9bec44c62f..86f6146e77 100644 --- a/consensus/bor/rest.go +++ b/consensus/bor/rest.go @@ -35,6 +35,7 @@ type Checkpoint struct { Timestamp uint64 `json:"timestamp"` } +//go:generate mockgen -destination=../../tests/bor/mocks/IHeimdallClient.go -package=mocks . IHeimdallClient type IHeimdallClient interface { Fetch(path string, query string) (*ResponseWithHeight, error) FetchWithRetry(path string, query string) (*ResponseWithHeight, error) diff --git a/go.mod b/go.mod index edd6d6887a..176df53a40 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( github.com/go-ole/go-ole v1.2.1 // indirect github.com/go-stack/stack v1.8.0 github.com/golang-jwt/jwt/v4 v4.3.0 + github.com/golang/mock v1.3.1 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa @@ -83,5 +84,5 @@ require ( gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 gopkg.in/urfave/cli.v1 v1.20.0 - gotest.tools v2.2.0+incompatible // indirect + gotest.tools v2.2.0+incompatible ) diff --git a/go.sum b/go.sum index 19a6002886..ec2f200044 100644 --- a/go.sum +++ b/go.sum @@ -194,6 +194,7 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index 460b296f31..b922ff9c41 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -8,6 +8,10 @@ import ( "testing" "time" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "golang.org/x/crypto/sha3" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/bor" "github.com/ethereum/go-ethereum/consensus/ethash" @@ -19,9 +23,6 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/tests/bor/mocks" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "golang.org/x/crypto/sha3" ) var ( @@ -32,13 +33,12 @@ var ( func TestInsertingSpanSizeBlocks(t *testing.T) { init := buildEthereumInstance(t, rawdb.NewMemoryDatabase()) - chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() - _bor := engine.(*bor.Bor) - h, heimdallSpan := getMockedHeimdallClient(t) + h, heimdallSpan, ctrl := getMockedHeimdallClient(t) + defer ctrl.Finish() _bor.SetHeimdallClient(h) @@ -52,7 +52,6 @@ func TestInsertingSpanSizeBlocks(t *testing.T) { insertNewBlock(t, chain, block) } - assert.True(t, h.AssertCalled(t, "FetchWithRetry", spanPath, "")) validators, err := _bor.GetCurrentValidators(block.Hash(), spanSize) // check validator set at the first block of new span if err != nil { t.Fatalf("%s", err) @@ -74,7 +73,6 @@ func TestFetchStateSyncEvents(t *testing.T) { // A. Insert blocks for 0th sprint db := init.ethereum.ChainDb() block := init.genesis.ToBlock(db) - // Insert sprintSize # of blocks so that span is fetched at the start of a new sprint for i := uint64(1); i < sprintSize; i++ { block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) @@ -82,8 +80,13 @@ func TestFetchStateSyncEvents(t *testing.T) { } // B. Before inserting 1st block of the next sprint, mock heimdall deps + // B.1 Mock /bor/span/1 + res, _ := loadSpanFromFile(t) - // B.1 /bor/span/1 + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + h := mocks.NewMockIHeimdallClient(ctrl) // B.2 Mock State Sync events fromID := uint64(1) @@ -96,18 +99,12 @@ func TestFetchStateSyncEvents(t *testing.T) { eventRecords := generateFakeStateSyncEvents(sample, eventCount) // Mock - res, _ := loadSpanFromFile(t) - h := &mocks.IHeimdallClient{} - h.On("FetchWithRetry", spanPath, "").Return(res, nil) - h.On("FetchLatestCheckpoint").Maybe().Return(mock.Anything, nil) - h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) + h.EXPECT().FetchWithRetry(spanPath, "").Return(res, nil).AnyTimes() + h.EXPECT().FetchStateSyncEvents(fromID, to).Return(eventRecords, nil).AnyTimes() _bor.SetHeimdallClient(h) block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) insertNewBlock(t, chain, block) - - assert.True(t, h.AssertCalled(t, "FetchWithRetry", spanPath, "")) - assert.True(t, h.AssertCalled(t, "FetchStateSyncEvents", fromID, to)) } func TestFetchStateSyncEvents_2(t *testing.T) { @@ -118,9 +115,12 @@ func TestFetchStateSyncEvents_2(t *testing.T) { // Mock /bor/span/1 res, _ := loadSpanFromFile(t) - h := &mocks.IHeimdallClient{} - h.On("FetchWithRetry", spanPath, "").Return(res, nil) - h.On("FetchLatestCheckpoint").Maybe().Return(mock.Anything, nil) + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + h := mocks.NewMockIHeimdallClient(ctrl) + h.EXPECT().FetchWithRetry(spanPath, "").Return(res, nil).AnyTimes() // Mock State Sync events // at # sprintSize, events are fetched for [fromID, (block-sprint).Time) @@ -139,7 +139,7 @@ func TestFetchStateSyncEvents_2(t *testing.T) { buildStateEvent(sample, 6, 4), // id = 6, time = 4 } - h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) + h.EXPECT().FetchStateSyncEvents(fromID, to).Return(eventRecords, nil).AnyTimes() _bor.SetHeimdallClient(h) // Insert blocks for 0th sprint @@ -150,9 +150,6 @@ func TestFetchStateSyncEvents_2(t *testing.T) { insertNewBlock(t, chain, block) } - assert.True(t, h.AssertCalled(t, "FetchWithRetry", spanPath, "")) - assert.True(t, h.AssertCalled(t, "FetchStateSyncEvents", fromID, to)) - lastStateID, _ := _bor.GenesisContractsClient.LastStateId(sprintSize) // state 6 was not written @@ -166,13 +163,13 @@ func TestFetchStateSyncEvents_2(t *testing.T) { buildStateEvent(sample, 6, 4), } - h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) + h.EXPECT().FetchStateSyncEvents(fromID, to).Return(eventRecords, nil).AnyTimes() + for i := sprintSize + 1; i <= spanSize; i++ { block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) insertNewBlock(t, chain, block) } - assert.True(t, h.AssertCalled(t, "FetchStateSyncEvents", fromID, to)) lastStateID, _ = _bor.GenesisContractsClient.LastStateId(spanSize) assert.Equal(t, uint64(6), lastStateID.Uint64()) } @@ -181,9 +178,11 @@ func TestOutOfTurnSigning(t *testing.T) { init := buildEthereumInstance(t, rawdb.NewMemoryDatabase()) chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() - _bor := engine.(*bor.Bor) - h, _ := getMockedHeimdallClient(t) + + h, _, ctrl := getMockedHeimdallClient(t) + defer ctrl.Finish() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -212,7 +211,6 @@ func TestOutOfTurnSigning(t *testing.T) { header := block.Header() header.Time += (bor.CalcProducerDelay(header.Number.Uint64(), expectedSuccessionNumber, init.genesis.Config.Bor) - bor.CalcProducerDelay(header.Number.Uint64(), 0, init.genesis.Config.Bor)) - sign(t, header, signerKey, init.genesis.Config.Bor) block = types.NewBlockWithHeader(header) @@ -233,9 +231,11 @@ func TestSignerNotFound(t *testing.T) { init := buildEthereumInstance(t, rawdb.NewMemoryDatabase()) chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() - _bor := engine.(*bor.Bor) - h, _ := getMockedHeimdallClient(t) + + h, _, ctrl := getMockedHeimdallClient(t) + defer ctrl.Finish() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -254,17 +254,16 @@ func TestSignerNotFound(t *testing.T) { bor.UnauthorizedSignerError{Number: 0, Signer: addr.Bytes()}) } -func getMockedHeimdallClient(t *testing.T) (*mocks.IHeimdallClient, *bor.HeimdallSpan) { +func getMockedHeimdallClient(t *testing.T) (*mocks.MockIHeimdallClient, *bor.HeimdallSpan, *gomock.Controller) { + ctrl := gomock.NewController(t) + h := mocks.NewMockIHeimdallClient(ctrl) + res, heimdallSpan := loadSpanFromFile(t) - h := &mocks.IHeimdallClient{} - h.On("FetchWithRetry", "bor/span/1", "").Return(res, nil) - h.On( - "FetchStateSyncEvents", - mock.AnythingOfType("uint64"), - mock.AnythingOfType("int64")).Return([]*bor.EventRecordWithTime{getSampleEventRecord(t)}, nil) - h.On("FetchLatestCheckpoint").Maybe().Return(mock.Anything, nil) - - return h, heimdallSpan + + h.EXPECT().FetchWithRetry(spanPath, "").Return(res, nil).AnyTimes() + h.EXPECT().FetchStateSyncEvents(gomock.Any(), gomock.Any()).Return(getEventRecords(t), nil).AnyTimes() + + return h, heimdallSpan, ctrl } func generateFakeStateSyncEvents(sample *bor.EventRecordWithTime, count int) []*bor.EventRecordWithTime { @@ -299,6 +298,16 @@ func getSampleEventRecord(t *testing.T) *bor.EventRecordWithTime { return _eventRecords[0] } +func getEventRecords(t *testing.T) []*bor.EventRecordWithTime { + res := stateSyncEventsPayload(t) + var _eventRecords []*bor.EventRecordWithTime + if err := json.Unmarshal(res.Result, &_eventRecords); err != nil { + t.Fatalf("%s", err) + } + + return _eventRecords +} + // TestEIP1559Transition tests the following: // // 1. A transaction whose gasFeeCap is greater than the baseFee is valid. @@ -503,6 +512,7 @@ func TestEIP1559Transition(t *testing.T) { tx, _ = types.SignTx(tx, signer, key3) b.AddTx(tx) + }) if n, err := chain.InsertChain(blocks); err != nil { diff --git a/tests/bor/mocks/IHeimdallClient.go b/tests/bor/mocks/IHeimdallClient.go index 3ee599bb2e..9420c261fb 100644 --- a/tests/bor/mocks/IHeimdallClient.go +++ b/tests/bor/mocks/IHeimdallClient.go @@ -1,110 +1,107 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ethereum/go-ethereum/consensus/bor (interfaces: IHeimdallClient) +// Package mocks is a generated GoMock package. package mocks import ( + reflect "reflect" + bor "github.com/ethereum/go-ethereum/consensus/bor" - mock "github.com/stretchr/testify/mock" + gomock "github.com/golang/mock/gomock" ) -// IHeimdallClient is an autogenerated mock type for the IHeimdallClient type -type IHeimdallClient struct { - mock.Mock +// MockIHeimdallClient is a mock of IHeimdallClient interface. +type MockIHeimdallClient struct { + ctrl *gomock.Controller + recorder *MockIHeimdallClientMockRecorder +} + +// MockIHeimdallClientMockRecorder is the mock recorder for MockIHeimdallClient. +type MockIHeimdallClientMockRecorder struct { + mock *MockIHeimdallClient +} + +// NewMockIHeimdallClient creates a new mock instance. +func NewMockIHeimdallClient(ctrl *gomock.Controller) *MockIHeimdallClient { + mock := &MockIHeimdallClient{ctrl: ctrl} + mock.recorder = &MockIHeimdallClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockIHeimdallClient) EXPECT() *MockIHeimdallClientMockRecorder { + return m.recorder +} + +// Close mocks base method. +func (m *MockIHeimdallClient) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close. +func (mr *MockIHeimdallClientMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockIHeimdallClient)(nil).Close)) +} + +// Fetch mocks base method. +func (m *MockIHeimdallClient) Fetch(arg0, arg1 string) (*bor.ResponseWithHeight, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fetch", arg0, arg1) + ret0, _ := ret[0].(*bor.ResponseWithHeight) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fetch indicates an expected call of Fetch. +func (mr *MockIHeimdallClientMockRecorder) Fetch(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockIHeimdallClient)(nil).Fetch), arg0, arg1) +} + +// FetchLatestCheckpoint mocks base method. +func (m *MockIHeimdallClient) FetchLatestCheckpoint() (*bor.Checkpoint, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchLatestCheckpoint") + ret0, _ := ret[0].(*bor.Checkpoint) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// Close provides a mock function with given fields: -func (_m *IHeimdallClient) Close() { - _m.Called() +// FetchLatestCheckpoint indicates an expected call of FetchLatestCheckpoint. +func (mr *MockIHeimdallClientMockRecorder) FetchLatestCheckpoint() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchLatestCheckpoint", reflect.TypeOf((*MockIHeimdallClient)(nil).FetchLatestCheckpoint)) } -// Fetch provides a mock function with given fields: path, query -func (_m *IHeimdallClient) Fetch(path string, query string) (*bor.ResponseWithHeight, error) { - ret := _m.Called(path, query) - - var r0 *bor.ResponseWithHeight - if rf, ok := ret.Get(0).(func(string, string) *bor.ResponseWithHeight); ok { - r0 = rf(path, query) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*bor.ResponseWithHeight) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, string) error); ok { - r1 = rf(path, query) - } else { - r1 = ret.Error(1) - } - - return r0, r1 +// FetchStateSyncEvents mocks base method. +func (m *MockIHeimdallClient) FetchStateSyncEvents(arg0 uint64, arg1 int64) ([]*bor.EventRecordWithTime, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchStateSyncEvents", arg0, arg1) + ret0, _ := ret[0].([]*bor.EventRecordWithTime) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// FetchLatestCheckpoint provides a mock function with given fields: -func (_m *IHeimdallClient) FetchLatestCheckpoint() (*bor.Checkpoint, error) { - ret := _m.Called() - - var r0 *bor.Checkpoint - if rf, ok := ret.Get(0).(func() *bor.Checkpoint); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*bor.Checkpoint) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 +// FetchStateSyncEvents indicates an expected call of FetchStateSyncEvents. +func (mr *MockIHeimdallClientMockRecorder) FetchStateSyncEvents(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchStateSyncEvents", reflect.TypeOf((*MockIHeimdallClient)(nil).FetchStateSyncEvents), arg0, arg1) } -// FetchStateSyncEvents provides a mock function with given fields: fromID, to -func (_m *IHeimdallClient) FetchStateSyncEvents(fromID uint64, to int64) ([]*bor.EventRecordWithTime, error) { - ret := _m.Called(fromID, to) - - var r0 []*bor.EventRecordWithTime - if rf, ok := ret.Get(0).(func(uint64, int64) []*bor.EventRecordWithTime); ok { - r0 = rf(fromID, to) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*bor.EventRecordWithTime) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(uint64, int64) error); ok { - r1 = rf(fromID, to) - } else { - r1 = ret.Error(1) - } - - return r0, r1 +// FetchWithRetry mocks base method. +func (m *MockIHeimdallClient) FetchWithRetry(arg0, arg1 string) (*bor.ResponseWithHeight, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchWithRetry", arg0, arg1) + ret0, _ := ret[0].(*bor.ResponseWithHeight) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// FetchWithRetry provides a mock function with given fields: path, query -func (_m *IHeimdallClient) FetchWithRetry(path string, query string) (*bor.ResponseWithHeight, error) { - ret := _m.Called(path, query) - - var r0 *bor.ResponseWithHeight - if rf, ok := ret.Get(0).(func(string, string) *bor.ResponseWithHeight); ok { - r0 = rf(path, query) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*bor.ResponseWithHeight) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, string) error); ok { - r1 = rf(path, query) - } else { - r1 = ret.Error(1) - } - - return r0, r1 +// FetchWithRetry indicates an expected call of FetchWithRetry. +func (mr *MockIHeimdallClientMockRecorder) FetchWithRetry(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWithRetry", reflect.TypeOf((*MockIHeimdallClient)(nil).FetchWithRetry), arg0, arg1) } diff --git a/tests/deps/fake.go b/tests/deps/fake.go new file mode 100644 index 0000000000..cd04ffa070 --- /dev/null +++ b/tests/deps/fake.go @@ -0,0 +1,7 @@ +package deps + +// it is a fake file to lock deps +//nolint:typecheck +import ( + _ "github.com/golang/mock/mockgen/model" +) From 494687fc484f1ed8654933a08863058f3c6c3b9f Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 3 Jun 2022 13:47:22 +0300 Subject: [PATCH 123/190] fix --- cover.out | 36702 ++++++++++++++++++++++++++++++++++++++++ tests/bor/bor_test.go | 2 + 2 files changed, 36704 insertions(+) create mode 100644 cover.out diff --git a/cover.out b/cover.out new file mode 100644 index 0000000000..0a5f97fd58 --- /dev/null +++ b/cover.out @@ -0,0 +1,36702 @@ +mode: set +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:20.37,21.23 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:24.2,24.32 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:21.23,23.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:29.41,31.16 2 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:34.2,35.11 2 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:43.2,43.38 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:46.2,46.10 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:31.16,33.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:35.11,39.26 4 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:39.26,41.4 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:43.38,45.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:51.41,53.16 2 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:56.2,56.25 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:59.2,59.10 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:53.16,55.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:56.25,58.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:64.37,65.23 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:68.2,68.32 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:65.23,67.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:73.41,75.16 2 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:78.2,79.11 2 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:87.2,87.38 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:90.2,90.10 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:75.16,77.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:79.11,83.26 4 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:83.26,85.4 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:87.38,89.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:95.41,97.16 2 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:100.2,100.25 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:103.2,103.10 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:97.16,99.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:100.25,102.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:108.36,109.23 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:112.2,112.31 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:109.23,111.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:117.40,119.16 2 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:122.2,123.11 2 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:131.2,131.38 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:134.2,134.10 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:119.16,121.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:123.11,127.26 4 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:127.26,129.4 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:131.38,133.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:139.40,141.16 2 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:144.2,144.25 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:147.2,147.10 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:141.16,143.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:144.25,146.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:151.31,152.23 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:155.2,155.25 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:152.23,154.3 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:160.35,163.11 3 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:171.2,171.38 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:176.2,176.14 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:163.11,165.26 2 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:165.26,166.18 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:166.18,168.5 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:171.38,172.16 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:172.16,174.4 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:181.35,182.30 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:187.2,187.14 1 0 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:182.30,183.16 1 1 +github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:183.16,185.4 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:60.40,61.58 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:64.2,66.12 3 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:61.58,63.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:71.44,73.20 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:77.2,77.20 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:84.2,87.25 3 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:93.2,93.28 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:96.2,96.66 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:73.20,75.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:77.20,78.19 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:81.3,81.14 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:78.19,80.4 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:87.25,88.13 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:88.13,91.4 2 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:93.28,95.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:102.63,103.24 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:106.2,106.25 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:111.2,111.40 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:103.24,105.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:106.25,110.3 3 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:115.65,117.16 2 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:120.2,120.23 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:123.2,123.17 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:117.16,119.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:120.23,122.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:130.77,132.17 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:136.2,137.20 2 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:140.2,140.17 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:148.2,149.16 2 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:152.2,152.44 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:169.2,169.25 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:132.17,134.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:137.20,139.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:140.17,142.19 2 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:145.3,145.24 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:142.19,144.4 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:149.16,151.3 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:152.44,153.47 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:153.47,155.24 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:158.4,158.24 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:162.4,162.22 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:165.4,166.9 2 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:155.24,157.5 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:158.24,160.5 1 1 +github.com/ethereum/go-ethereum/common/bitutil/compress.go:162.22,164.5 1 1 +github.com/ethereum/go-ethereum/accounts/accounts.go:184.35,187.2 2 1 +github.com/ethereum/go-ethereum/accounts/accounts.go:196.48,201.2 4 1 +github.com/ethereum/go-ethereum/accounts/errors.go:59.46,63.2 1 0 +github.com/ethereum/go-ethereum/accounts/errors.go:66.44,68.2 1 0 +github.com/ethereum/go-ethereum/accounts/hd.go:68.63,73.9 3 1 +github.com/ethereum/go-ethereum/accounts/hd.go:87.2,87.26 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:90.2,90.39 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:117.2,117.20 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:74.28,75.50 1 0 +github.com/ethereum/go-ethereum/accounts/hd.go:77.46,78.116 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:80.47,81.30 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:83.10,84.56 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:87.26,89.3 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:90.39,96.40 3 1 +github.com/ethereum/go-ethereum/accounts/hd.go:101.3,102.10 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:105.3,106.66 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:112.3,115.33 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:96.40,99.4 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:102.10,104.4 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:106.66,107.18 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:110.4,110.93 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:107.18,109.5 1 0 +github.com/ethereum/go-ethereum/accounts/hd.go:122.44,124.33 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:135.2,135.15 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:124.33,126.30 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:130.3,131.15 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:126.30,129.4 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:131.15,133.4 1 1 +github.com/ethereum/go-ethereum/accounts/hd.go:139.58,141.2 1 0 +github.com/ethereum/go-ethereum/accounts/hd.go:144.59,147.46 3 0 +github.com/ethereum/go-ethereum/accounts/hd.go:150.2,151.12 2 0 +github.com/ethereum/go-ethereum/accounts/hd.go:147.46,149.3 1 0 +github.com/ethereum/go-ethereum/accounts/hd.go:156.65,161.31 4 1 +github.com/ethereum/go-ethereum/accounts/hd.go:161.31,164.3 2 1 +github.com/ethereum/go-ethereum/accounts/hd.go:170.68,175.31 4 1 +github.com/ethereum/go-ethereum/accounts/hd.go:175.31,179.3 2 1 +github.com/ethereum/go-ethereum/accounts/manager.go:66.63,69.35 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:73.2,76.35 3 0 +github.com/ethereum/go-ethereum/accounts/manager.go:80.2,90.35 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:94.2,96.11 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:69.35,71.3 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:76.35,78.3 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:90.35,93.3 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:100.34,104.2 3 0 +github.com/ethereum/go-ethereum/accounts/manager.go:107.37,109.2 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:113.48,117.2 3 0 +github.com/ethereum/go-ethereum/accounts/manager.go:121.29,123.15 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:133.2,133.6 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:123.15,125.35 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:128.3,129.19 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:125.35,127.4 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:133.6,134.10 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:135.30,138.22 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:144.4,147.23 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:148.34,157.26 8 0 +github.com/ethereum/go-ethereum/accounts/manager.go:158.26,164.10 3 0 +github.com/ethereum/go-ethereum/accounts/manager.go:139.23,140.49 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:141.23,142.48 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:170.58,175.2 3 0 +github.com/ethereum/go-ethereum/accounts/manager.go:178.39,183.2 3 0 +github.com/ethereum/go-ethereum/accounts/manager.go:186.45,190.2 3 0 +github.com/ethereum/go-ethereum/accounts/manager.go:193.55,198.16 4 0 +github.com/ethereum/go-ethereum/accounts/manager.go:201.2,201.44 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:206.2,206.30 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:198.16,200.3 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:201.44,202.29 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:202.29,204.4 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:210.48,215.36 4 0 +github.com/ethereum/go-ethereum/accounts/manager.go:220.2,220.18 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:215.36,216.45 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:216.45,218.4 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:226.58,230.36 3 0 +github.com/ethereum/go-ethereum/accounts/manager.go:235.2,235.31 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:230.36,231.31 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:231.31,233.4 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:240.74,242.2 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:248.56,249.33 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:257.2,257.14 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:249.33,250.49 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:251.3,251.22 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:255.3,255.71 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:250.49,250.97 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:251.22,253.12 2 0 +github.com/ethereum/go-ethereum/accounts/manager.go:262.55,263.33 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:271.2,271.14 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:263.33,264.49 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:265.3,265.22 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:269.3,269.44 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:264.49,264.97 1 0 +github.com/ethereum/go-ethereum/accounts/manager.go:265.22,267.12 1 0 +github.com/ethereum/go-ethereum/accounts/sort.go:22.44,22.61 1 0 +github.com/ethereum/go-ethereum/accounts/sort.go:23.44,23.71 1 0 +github.com/ethereum/go-ethereum/accounts/sort.go:24.44,24.81 1 0 +github.com/ethereum/go-ethereum/accounts/sort.go:29.43,29.60 1 0 +github.com/ethereum/go-ethereum/accounts/sort.go:30.43,30.70 1 0 +github.com/ethereum/go-ethereum/accounts/sort.go:31.43,31.84 1 0 +github.com/ethereum/go-ethereum/accounts/url.go:44.40,46.39 2 1 +github.com/ethereum/go-ethereum/accounts/url.go:49.2,52.8 1 1 +github.com/ethereum/go-ethereum/accounts/url.go:46.39,48.3 1 1 +github.com/ethereum/go-ethereum/accounts/url.go:56.30,57.20 1 1 +github.com/ethereum/go-ethereum/accounts/url.go:60.2,60.15 1 1 +github.com/ethereum/go-ethereum/accounts/url.go:57.20,59.3 1 1 +github.com/ethereum/go-ethereum/accounts/url.go:64.38,66.19 2 0 +github.com/ethereum/go-ethereum/accounts/url.go:69.2,69.12 1 0 +github.com/ethereum/go-ethereum/accounts/url.go:66.19,68.3 1 0 +github.com/ethereum/go-ethereum/accounts/url.go:73.44,75.2 1 1 +github.com/ethereum/go-ethereum/accounts/url.go:78.49,81.16 3 1 +github.com/ethereum/go-ethereum/accounts/url.go:84.2,85.16 2 1 +github.com/ethereum/go-ethereum/accounts/url.go:88.2,90.12 3 1 +github.com/ethereum/go-ethereum/accounts/url.go:81.16,83.3 1 0 +github.com/ethereum/go-ethereum/accounts/url.go:85.16,87.3 1 0 +github.com/ethereum/go-ethereum/accounts/url.go:99.31,100.28 1 1 +github.com/ethereum/go-ethereum/accounts/url.go:103.2,103.46 1 1 +github.com/ethereum/go-ethereum/accounts/url.go:100.28,102.3 1 1 +github.com/ethereum/go-ethereum/common/size.go:28.38,29.23 1 1 +github.com/ethereum/go-ethereum/common/size.go:29.23,31.3 1 0 +github.com/ethereum/go-ethereum/common/size.go:31.8,31.27 1 1 +github.com/ethereum/go-ethereum/common/size.go:31.27,33.3 1 0 +github.com/ethereum/go-ethereum/common/size.go:33.8,33.24 1 1 +github.com/ethereum/go-ethereum/common/size.go:33.24,35.3 1 1 +github.com/ethereum/go-ethereum/common/size.go:35.8,35.21 1 1 +github.com/ethereum/go-ethereum/common/size.go:35.21,37.3 1 1 +github.com/ethereum/go-ethereum/common/size.go:37.8,39.3 1 1 +github.com/ethereum/go-ethereum/common/size.go:44.46,45.23 1 0 +github.com/ethereum/go-ethereum/common/size.go:45.23,47.3 1 0 +github.com/ethereum/go-ethereum/common/size.go:47.8,47.27 1 0 +github.com/ethereum/go-ethereum/common/size.go:47.27,49.3 1 0 +github.com/ethereum/go-ethereum/common/size.go:49.8,49.24 1 0 +github.com/ethereum/go-ethereum/common/size.go:49.24,51.3 1 0 +github.com/ethereum/go-ethereum/common/size.go:51.8,51.21 1 0 +github.com/ethereum/go-ethereum/common/size.go:51.21,53.3 1 0 +github.com/ethereum/go-ethereum/common/size.go:53.8,55.3 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:26.51,28.16 2 0 +github.com/ethereum/go-ethereum/common/test_utils.go:31.2,31.53 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:38.2,38.12 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:28.16,30.3 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:31.53,32.51 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:36.3,36.65 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:32.51,35.4 2 0 +github.com/ethereum/go-ethereum/common/test_utils.go:42.53,44.33 2 0 +github.com/ethereum/go-ethereum/common/test_utils.go:52.2,52.8 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:44.33,45.25 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:48.3,48.16 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:45.25,47.4 1 0 +github.com/ethereum/go-ethereum/common/test_utils.go:48.16,50.4 1 0 +github.com/ethereum/go-ethereum/common/types.go:53.33,57.2 3 1 +github.com/ethereum/go-ethereum/common/types.go:61.33,61.66 1 0 +github.com/ethereum/go-ethereum/common/types.go:65.31,65.65 1 0 +github.com/ethereum/go-ethereum/common/types.go:68.30,68.45 1 0 +github.com/ethereum/go-ethereum/common/types.go:71.30,71.68 1 0 +github.com/ethereum/go-ethereum/common/types.go:74.28,74.59 1 0 +github.com/ethereum/go-ethereum/common/types.go:78.39,80.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:84.31,86.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:90.43,95.11 4 1 +github.com/ethereum/go-ethereum/common/types.go:96.16,97.19 1 1 +github.com/ethereum/go-ethereum/common/types.go:100.3,100.15 1 1 +github.com/ethereum/go-ethereum/common/types.go:103.3,103.14 1 1 +github.com/ethereum/go-ethereum/common/types.go:104.16,105.16 1 1 +github.com/ethereum/go-ethereum/common/types.go:106.11,110.13 4 1 +github.com/ethereum/go-ethereum/common/types.go:111.11,112.35 1 1 +github.com/ethereum/go-ethereum/common/types.go:113.10,114.41 1 1 +github.com/ethereum/go-ethereum/common/types.go:97.19,99.4 1 1 +github.com/ethereum/go-ethereum/common/types.go:100.15,102.4 1 1 +github.com/ethereum/go-ethereum/common/types.go:119.50,121.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:124.50,126.2 1 1 +github.com/ethereum/go-ethereum/common/types.go:129.45,131.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:135.35,136.21 1 1 +github.com/ethereum/go-ethereum/common/types.go:140.2,140.32 1 1 +github.com/ethereum/go-ethereum/common/types.go:136.21,138.3 1 0 +github.com/ethereum/go-ethereum/common/types.go:144.65,146.34 2 0 +github.com/ethereum/go-ethereum/common/types.go:149.2,149.27 1 0 +github.com/ethereum/go-ethereum/common/types.go:146.34,148.3 1 0 +github.com/ethereum/go-ethereum/common/types.go:153.44,155.9 2 1 +github.com/ethereum/go-ethereum/common/types.go:158.2,158.29 1 1 +github.com/ethereum/go-ethereum/common/types.go:161.2,162.12 2 1 +github.com/ethereum/go-ethereum/common/types.go:155.9,157.3 1 1 +github.com/ethereum/go-ethereum/common/types.go:158.29,160.3 1 1 +github.com/ethereum/go-ethereum/common/types.go:166.45,168.2 1 1 +github.com/ethereum/go-ethereum/common/types.go:171.53,171.81 1 0 +github.com/ethereum/go-ethereum/common/types.go:174.58,176.31 2 0 +github.com/ethereum/go-ethereum/common/types.go:182.2,182.12 1 0 +github.com/ethereum/go-ethereum/common/types.go:177.14,178.39 1 0 +github.com/ethereum/go-ethereum/common/types.go:179.10,180.57 1 0 +github.com/ethereum/go-ethereum/common/types.go:189.60,191.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:194.55,196.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:205.39,209.2 3 1 +github.com/ethereum/go-ethereum/common/types.go:213.39,213.75 1 0 +github.com/ethereum/go-ethereum/common/types.go:217.37,217.74 1 1 +github.com/ethereum/go-ethereum/common/types.go:221.34,222.20 1 1 +github.com/ethereum/go-ethereum/common/types.go:225.2,225.46 1 1 +github.com/ethereum/go-ethereum/common/types.go:222.20,224.3 1 1 +github.com/ethereum/go-ethereum/common/types.go:229.33,229.48 1 1 +github.com/ethereum/go-ethereum/common/types.go:232.30,232.58 1 0 +github.com/ethereum/go-ethereum/common/types.go:235.31,237.2 1 1 +github.com/ethereum/go-ethereum/common/types.go:240.34,242.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:244.40,251.32 5 1 +github.com/ethereum/go-ethereum/common/types.go:262.2,262.15 1 1 +github.com/ethereum/go-ethereum/common/types.go:251.32,253.15 2 1 +github.com/ethereum/go-ethereum/common/types.go:258.3,258.35 1 1 +github.com/ethereum/go-ethereum/common/types.go:253.15,255.4 1 1 +github.com/ethereum/go-ethereum/common/types.go:255.9,257.4 1 1 +github.com/ethereum/go-ethereum/common/types.go:258.35,260.4 1 1 +github.com/ethereum/go-ethereum/common/types.go:265.31,270.2 4 1 +github.com/ethereum/go-ethereum/common/types.go:274.46,275.11 1 1 +github.com/ethereum/go-ethereum/common/types.go:276.16,277.27 1 1 +github.com/ethereum/go-ethereum/common/types.go:278.11,282.13 4 1 +github.com/ethereum/go-ethereum/common/types.go:283.16,286.19 2 1 +github.com/ethereum/go-ethereum/common/types.go:289.3,289.15 1 1 +github.com/ethereum/go-ethereum/common/types.go:292.3,292.15 1 1 +github.com/ethereum/go-ethereum/common/types.go:293.11,294.35 1 1 +github.com/ethereum/go-ethereum/common/types.go:295.10,296.44 1 1 +github.com/ethereum/go-ethereum/common/types.go:286.19,288.4 1 1 +github.com/ethereum/go-ethereum/common/types.go:289.15,291.4 1 1 +github.com/ethereum/go-ethereum/common/types.go:302.38,303.21 1 1 +github.com/ethereum/go-ethereum/common/types.go:306.2,306.35 1 1 +github.com/ethereum/go-ethereum/common/types.go:303.21,305.3 1 0 +github.com/ethereum/go-ethereum/common/types.go:310.48,312.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:315.53,317.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:320.53,322.2 1 1 +github.com/ethereum/go-ethereum/common/types.go:325.47,327.9 2 1 +github.com/ethereum/go-ethereum/common/types.go:330.2,330.32 1 1 +github.com/ethereum/go-ethereum/common/types.go:333.2,334.12 2 1 +github.com/ethereum/go-ethereum/common/types.go:327.9,329.3 1 1 +github.com/ethereum/go-ethereum/common/types.go:330.32,332.3 1 1 +github.com/ethereum/go-ethereum/common/types.go:338.48,340.2 1 1 +github.com/ethereum/go-ethereum/common/types.go:343.58,343.86 1 0 +github.com/ethereum/go-ethereum/common/types.go:346.61,348.31 2 0 +github.com/ethereum/go-ethereum/common/types.go:354.2,354.12 1 0 +github.com/ethereum/go-ethereum/common/types.go:349.14,350.39 1 0 +github.com/ethereum/go-ethereum/common/types.go:351.10,352.60 1 0 +github.com/ethereum/go-ethereum/common/types.go:361.63,363.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:366.58,368.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:378.57,380.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:383.79,384.28 1 0 +github.com/ethereum/go-ethereum/common/types.go:387.2,388.75 2 0 +github.com/ethereum/go-ethereum/common/types.go:384.28,386.3 1 0 +github.com/ethereum/go-ethereum/common/types.go:392.63,393.80 1 1 +github.com/ethereum/go-ethereum/common/types.go:396.2,396.44 1 1 +github.com/ethereum/go-ethereum/common/types.go:393.80,395.3 1 1 +github.com/ethereum/go-ethereum/common/types.go:400.59,401.82 1 0 +github.com/ethereum/go-ethereum/common/types.go:404.2,404.55 1 0 +github.com/ethereum/go-ethereum/common/types.go:401.82,403.3 1 0 +github.com/ethereum/go-ethereum/common/types.go:408.47,410.2 1 0 +github.com/ethereum/go-ethereum/common/types.go:413.45,414.24 1 0 +github.com/ethereum/go-ethereum/common/types.go:417.2,417.56 1 0 +github.com/ethereum/go-ethereum/common/types.go:414.24,416.3 1 0 +github.com/ethereum/go-ethereum/common/types.go:421.50,423.2 1 1 +github.com/ethereum/go-ethereum/common/types.go:426.47,428.2 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:26.31,27.20 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:30.2,30.19 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:33.2,33.21 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:27.20,29.3 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:30.19,32.3 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:37.47,38.14 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:41.2,44.8 3 1 +github.com/ethereum/go-ethereum/common/bytes.go:38.14,40.3 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:48.35,50.2 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:53.34,55.2 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:58.29,59.21 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:62.2,62.32 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:67.2,67.13 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:59.21,61.3 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:62.32,63.25 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:63.25,65.4 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:71.33,73.2 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:76.35,79.2 2 1 +github.com/ethereum/go-ethereum/common/bytes.go:82.50,84.20 2 0 +github.com/ethereum/go-ethereum/common/bytes.go:87.2,87.19 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:90.2,92.11 3 0 +github.com/ethereum/go-ethereum/common/bytes.go:84.20,86.3 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:87.19,89.3 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:96.48,97.21 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:101.2,104.15 3 1 +github.com/ethereum/go-ethereum/common/bytes.go:97.21,99.3 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:108.47,109.21 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:113.2,116.15 3 1 +github.com/ethereum/go-ethereum/common/bytes.go:109.21,111.3 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:120.38,122.28 2 0 +github.com/ethereum/go-ethereum/common/bytes.go:127.2,127.16 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:122.28,123.18 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:123.18,124.9 1 0 +github.com/ethereum/go-ethereum/common/bytes.go:131.39,133.23 2 1 +github.com/ethereum/go-ethereum/common/bytes.go:138.2,138.16 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:133.23,134.20 1 1 +github.com/ethereum/go-ethereum/common/bytes.go:134.20,135.9 1 1 +github.com/ethereum/go-ethereum/common/debug.go:28.35,38.2 6 0 +github.com/ethereum/go-ethereum/common/debug.go:41.42,52.2 3 0 +github.com/ethereum/go-ethereum/common/format.go:34.41,36.65 2 0 +github.com/ethereum/go-ethereum/common/format.go:39.2,39.14 1 0 +github.com/ethereum/go-ethereum/common/format.go:36.65,38.3 1 0 +github.com/ethereum/go-ethereum/common/format.go:62.36,65.24 2 0 +github.com/ethereum/go-ethereum/common/format.go:69.2,71.32 2 0 +github.com/ethereum/go-ethereum/common/format.go:81.2,81.15 1 0 +github.com/ethereum/go-ethereum/common/format.go:65.24,67.3 1 0 +github.com/ethereum/go-ethereum/common/format.go:71.32,72.23 1 0 +github.com/ethereum/go-ethereum/common/format.go:72.23,76.28 3 0 +github.com/ethereum/go-ethereum/common/format.go:76.28,77.10 1 0 +github.com/ethereum/go-ethereum/common/path.go:29.44,31.2 1 0 +github.com/ethereum/go-ethereum/common/path.go:34.38,36.38 2 0 +github.com/ethereum/go-ethereum/common/path.go:40.2,40.13 1 0 +github.com/ethereum/go-ethereum/common/path.go:36.38,38.3 1 0 +github.com/ethereum/go-ethereum/common/path.go:44.59,45.30 1 0 +github.com/ethereum/go-ethereum/common/path.go:48.2,48.41 1 0 +github.com/ethereum/go-ethereum/common/path.go:45.30,47.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/helpers.go:55.49,57.29 2 0 +github.com/ethereum/go-ethereum/common/compiler/helpers.go:64.2,64.29 1 0 +github.com/ethereum/go-ethereum/common/compiler/helpers.go:57.29,59.17 2 0 +github.com/ethereum/go-ethereum/common/compiler/helpers.go:62.3,62.24 1 0 +github.com/ethereum/go-ethereum/common/compiler/helpers.go:59.17,61.4 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:61.40,67.47 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:70.2,70.10 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:67.47,69.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:74.54,75.16 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:78.2,82.16 5 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:85.2,86.23 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:89.2,90.57 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:93.2,93.57 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:96.2,96.57 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:99.2,99.15 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:75.16,77.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:82.16,84.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:86.23,88.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:90.57,92.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:93.57,95.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:96.57,98.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:103.79,104.22 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:107.2,108.16 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:111.2,114.27 4 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:104.22,106.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:108.16,110.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:118.88,119.27 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:122.2,123.16 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:126.2,127.16 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:130.2,132.27 3 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:119.27,121.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:123.16,125.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:127.16,129.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:135.84,139.34 4 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:142.2,142.105 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:139.34,141.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:154.162,156.62 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:161.2,162.43 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:191.2,191.23 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:156.62,159.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:162.43,165.64 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:168.3,189.4 4 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:165.64,167.4 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:196.164,198.62 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:202.2,203.43 2 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:223.2,223.23 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:198.62,200.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/solidity.go:203.43,222.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:36.37,41.2 2 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:44.49,45.17 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:48.2,52.16 5 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:55.2,56.23 2 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:59.2,60.57 2 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:63.2,63.57 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:66.2,66.57 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:69.2,69.15 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:45.17,47.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:52.16,54.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:56.23,58.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:60.57,62.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:63.57,65.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:66.57,68.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:73.86,74.27 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:77.2,78.16 2 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:81.2,82.16 2 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:85.2,87.27 3 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:74.27,76.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:78.16,80.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:82.16,84.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:90.81,94.34 4 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:98.2,98.102 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:94.34,96.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:110.159,112.62 2 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:117.2,118.33 2 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:143.2,143.23 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:112.62,114.3 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:118.33,120.24 1 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:123.3,141.4 2 0 +github.com/ethereum/go-ethereum/common/compiler/vyper.go:120.24,121.12 1 0 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:27.40,30.73 2 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:34.2,35.21 2 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:38.2,38.73 1 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:42.2,42.73 1 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:45.2,45.23 1 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:30.73,32.3 1 0 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:35.21,37.3 1 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:38.73,40.3 1 0 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:42.73,44.3 1 0 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:50.29,52.73 2 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:55.2,55.28 1 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:52.73,54.3 1 0 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:60.29,63.73 2 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:67.2,67.27 1 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:70.2,70.28 1 1 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:63.73,65.3 1 0 +github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:67.27,69.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:78.123,91.2 6 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:96.86,98.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:101.42,104.2 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:108.37,112.84 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:117.2,117.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:112.84,113.13 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:121.39,126.2 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:128.58,129.112 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:131.2,132.86 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:129.113,129.114 0 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:147.80,151.45 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:154.2,155.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:158.2,159.12 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:151.45,153.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:155.16,157.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:163.114,164.86 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:167.2,168.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:171.2,171.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:164.86,166.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:168.16,170.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:175.119,180.16 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:184.2,184.39 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:180.16,182.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:188.124,193.16 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:197.2,197.42 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:193.16,195.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:201.120,206.16 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:210.2,210.40 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:206.16,208.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:214.139,219.16 4 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:223.2,224.20 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:219.16,221.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:228.112,233.20 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:236.2,236.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:233.20,235.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:243.121,248.15 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:251.2,252.15 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:255.2,255.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:248.15,250.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:252.15,254.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:259.101,264.2 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:267.101,268.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:272.2,273.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:277.2,277.34 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:268.35,270.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:273.18,275.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:282.102,287.2 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:291.102,292.63 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:296.2,297.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:301.2,301.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:292.63,294.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:297.18,299.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:305.103,309.35 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:313.2,314.19 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:318.2,318.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:309.35,311.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:314.19,316.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:323.103,327.61 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:331.2,331.67 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:327.61,329.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:335.103,339.40 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:343.2,344.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:348.2,348.46 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:339.40,341.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:344.18,346.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:352.131,356.40 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:365.2,366.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:370.2,371.39 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:375.2,375.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:356.40,358.40 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:362.3,362.34 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:358.40,360.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:366.18,368.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:371.39,373.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:379.104,384.2 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:386.64,389.22 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:392.2,395.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:389.22,391.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:407.39,409.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:412.47,414.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:417.123,421.86 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:424.2,425.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:428.2,429.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:433.2,433.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:436.2,436.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:421.86,423.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:425.16,427.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:429.16,431.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:433.27,435.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:440.108,446.16 5 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:450.2,450.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:453.2,453.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:446.16,448.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:450.27,452.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:458.104,463.2 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:467.83,471.44 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:474.2,474.27 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:471.44,473.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:479.84,481.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:485.100,495.30 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:501.2,502.78 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:512.2,512.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:532.2,535.70 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:551.2,551.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:568.2,568.15 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:584.2,584.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:495.30,497.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:497.8,499.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:502.78,504.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:504.8,504.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:504.33,506.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:506.8,506.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:506.34,508.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:508.8,510.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:512.26,515.24 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:521.3,522.54 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:515.24,516.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:519.4,519.40 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:516.38,518.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:522.54,524.23 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:527.4,529.27 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:524.23,526.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:535.70,542.17 5 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:548.3,548.32 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:542.17,543.44 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:546.4,546.25 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:543.44,545.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:551.16,558.17 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:561.3,561.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:558.17,560.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:561.13,563.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:563.9,565.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:568.15,570.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:573.3,573.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:570.17,572.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:573.13,574.53 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:581.4,581.68 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:574.53,575.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:578.5,578.25 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:575.33,577.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:589.160,591.78 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:594.2,595.50 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:622.2,622.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:625.2,625.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:629.2,641.68 8 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:591.78,593.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:595.50,597.27 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:600.3,600.64 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:597.27,599.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:601.8,603.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:603.27,606.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:606.9,608.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:611.4,611.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:615.4,616.66 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:608.29,610.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:611.29,613.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:616.66,618.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:622.19,624.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:625.23,627.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:645.94,651.16 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:655.2,657.16 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:660.2,661.25 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:665.2,665.124 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:671.2,675.12 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:651.16,653.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:657.16,659.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:661.25,663.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:665.124,666.52 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:669.3,669.41 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:666.52,668.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:682.109,684.28 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:701.2,702.16 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:705.2,706.28 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:709.2,709.17 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:684.28,687.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:687.8,690.29 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:693.3,694.27 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:698.3,698.117 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:690.29,692.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:694.27,696.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:702.16,704.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:706.28,708.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:714.149,719.16 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:723.2,723.64 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:719.16,721.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:723.64,725.7 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:725.7,726.11 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:727.24,728.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:737.28,738.15 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:739.16,740.15 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:728.31,729.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:730.23,730.23 0 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:731.30,732.17 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:733.18,734.17 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:747.122,752.64 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:752.64,754.7 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:754.7,755.11 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:756.24,757.12 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:764.28,765.15 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:766.16,767.15 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:758.21,758.21 0 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:759.29,760.16 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:761.17,762.16 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:775.71,779.45 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:783.2,783.146 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:786.2,791.12 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:779.45,781.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:783.146,785.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:795.58,797.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:804.48,804.73 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:805.48,805.60 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:806.48,806.63 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:807.48,807.71 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:808.48,808.77 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:809.48,809.78 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:810.48,810.78 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:811.48,811.72 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:812.48,812.74 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:813.48,813.73 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:814.48,814.79 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:823.52,823.68 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:824.52,824.76 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:826.108,827.36 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:830.2,830.60 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:827.36,829.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:833.101,835.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:837.101,839.19 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:842.2,842.70 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:839.19,841.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:845.97,847.19 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:850.2,851.21 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:854.2,855.35 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:858.2,858.18 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:847.19,849.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:851.21,853.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:855.35,857.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:861.94,863.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:865.92,867.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:869.104,871.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:873.88,875.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:877.95,879.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:881.57,881.75 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:883.91,884.24 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:887.44,888.64 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:888.64,891.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:13.108,15.19 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:18.2,19.20 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:23.2,23.21 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:15.19,17.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:19.20,21.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:26.103,28.34 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:32.2,32.26 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:28.34,30.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:36.100,38.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:31.65,32.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:35.2,35.47 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:32.21,34.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:40.54,41.64 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:45.2,45.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:49.2,49.48 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:55.2,55.57 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:58.2,58.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:41.64,43.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:45.43,47.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:49.48,50.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:50.20,52.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:55.57,57.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:63.51,64.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:69.2,69.40 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:64.38,66.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:69.40,71.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:71.8,71.57 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:71.57,73.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:73.8,75.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:80.47,82.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:13.27,15.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:17.27,19.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:21.38,23.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:25.81,26.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:29.2,31.73 3 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:34.2,34.40 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:41.2,41.72 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:26.33,28.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:31.73,33.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:34.40,36.81 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:39.3,39.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:36.81,37.9 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:44.72,46.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:48.76,50.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:54.2,54.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:67.2,67.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:50.16,52.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:54.38,57.41 3 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:61.3,61.39 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:64.3,65.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:57.41,60.4 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:61.39,63.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:70.82,71.64 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:74.2,75.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:78.2,79.38 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:86.2,86.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:89.2,89.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:71.64,73.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:75.16,77.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:79.38,81.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:84.3,84.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:81.17,83.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:86.38,88.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:92.71,93.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:96.2,96.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:93.33,95.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:96.33,98.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:98.8,100.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:103.69,105.27 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:120.2,120.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:105.27,108.32 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:108.32,110.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:110.9,110.55 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:110.55,112.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:115.4,115.93 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:112.18,114.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:116.9,118.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:127.74,129.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:132.2,133.56 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:141.2,141.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:146.2,147.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:151.2,151.60 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:129.16,131.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:133.56,135.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:135.8,137.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:137.17,139.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:141.19,143.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:147.16,149.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:36.50,37.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:52.2,52.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:37.21,38.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:39.10,40.22 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:41.11,42.48 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:43.11,44.48 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:45.11,46.48 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:47.11,49.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:53.9,54.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:55.10,56.54 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:57.10,58.54 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:59.10,60.54 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:61.10,67.24 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:72.3,72.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:67.24,71.4 3 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:77.42,78.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:83.2,83.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:78.30,79.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:79.13,81.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:84.9,85.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:86.9,87.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:88.10,89.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:96.73,97.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:100.2,100.67 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:105.2,105.8 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:97.23,99.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:100.67,102.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:102.8,104.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:109.63,110.25 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:114.2,117.31 3 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:110.25,112.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:122.81,123.14 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:126.2,126.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:131.2,133.20 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:145.2,147.57 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:158.2,158.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:123.14,125.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:126.33,128.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:133.20,136.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:136.8,136.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:136.27,139.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:139.8,141.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:147.57,149.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:154.3,154.48 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:149.17,151.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:161.65,164.40 3 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:188.2,188.32 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:164.40,166.49 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:183.3,183.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:186.3,186.60 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:166.49,178.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:178.9,178.56 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:178.56,182.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:183.17,185.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:193.70,194.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:198.2,205.30 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:214.2,214.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:194.28,196.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:205.30,207.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:207.17,209.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:210.8,212.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:215.15,216.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:223.3,223.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:224.15,225.53 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:226.15,227.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:234.3,234.53 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:235.16,236.51 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:237.21,238.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:239.14,240.32 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:241.17,242.50 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:243.14,244.47 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:245.15,246.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:247.20,248.41 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:249.18,250.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:251.10,252.54 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:216.23,218.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:221.4,221.44 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:218.18,220.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:227.29,229.36 2 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:232.4,232.55 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:229.36,231.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:257.88,262.40 4 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:266.2,266.32 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:270.2,276.29 6 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:280.2,280.37 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:283.2,285.8 3 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:262.40,264.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:266.32,268.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:276.29,278.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:280.37,282.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:289.69,293.31 3 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:296.2,296.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:299.2,299.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:293.31,295.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/unpack.go:296.26,298.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error.go:42.52,47.31 3 1 +github.com/ethereum/go-ethereum/accounts/abi/error.go:66.2,76.3 4 1 +github.com/ethereum/go-ethereum/accounts/abi/error.go:47.31,48.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error.go:58.3,59.20 2 1 +github.com/ethereum/go-ethereum/accounts/abi/error.go:63.3,63.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error.go:48.23,54.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/error.go:54.9,56.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error.go:59.20,61.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error.go:79.33,81.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error.go:83.58,84.19 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error.go:87.2,87.38 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error.go:90.2,90.34 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error.go:84.19,86.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/error.go:87.38,89.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/event.go:59.77,64.31 3 1 +github.com/ethereum/go-ethereum/accounts/abi/event.go:83.2,95.3 4 1 +github.com/ethereum/go-ethereum/accounts/abi/event.go:64.31,65.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/event.go:75.3,76.20 2 1 +github.com/ethereum/go-ethereum/accounts/abi/event.go:80.3,80.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/event.go:65.23,71.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/event.go:71.9,73.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/event.go:76.20,78.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/event.go:98.32,100.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:94.155,100.31 2 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:104.2,104.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:112.2,116.25 2 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:122.2,123.27 2 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:126.2,126.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:129.2,130.25 2 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:137.2,151.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:100.31,103.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:104.33,106.27 2 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:106.27,108.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:116.25,119.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:123.27,125.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:126.17,128.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:130.25,132.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:132.8,132.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:132.31,134.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:134.8,134.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:134.35,136.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:154.38,156.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/method.go:159.40,161.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/method.go:165.39,167.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:31.49,34.2 2 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:38.70,39.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:40.21,41.36 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:42.16,43.80 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:44.17,45.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:49.3,49.60 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:50.14,51.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:54.3,54.51 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:55.15,56.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:59.3,59.54 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:62.3,62.71 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:63.32,64.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:67.3,67.61 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:68.10,69.79 1 0 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:45.43,47.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:51.26,53.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:56.43,58.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:59.54,61.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:64.43,66.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:74.42,75.36 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:76.83,77.62 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:78.78,79.49 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:80.19,81.72 1 1 +github.com/ethereum/go-ethereum/accounts/abi/pack.go:82.10,83.28 1 0 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:38.65,40.49 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:44.2,44.73 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:47.2,47.14 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:40.49,42.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:44.73,45.13 1 0 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:52.46,53.77 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:56.2,56.10 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:53.77,55.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:61.59,62.14 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:74.2,74.14 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:84.2,84.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:62.14,63.15 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:64.10,65.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:66.11,67.36 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:68.11,69.36 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:70.11,71.36 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:75.9,76.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:77.10,78.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:79.10,80.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:81.10,82.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:89.62,93.2 3 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:99.40,101.9 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:117.2,117.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:102.67,103.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:104.84,105.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:106.53,107.15 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:108.90,109.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:110.39,111.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:112.40,113.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:114.10,115.81 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:123.45,125.33 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:130.2,130.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:134.2,134.65 1 0 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:125.33,126.59 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:126.59,128.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:130.18,133.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:137.45,138.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:141.2,143.27 3 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:146.2,146.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:151.2,151.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:155.2,155.65 1 0 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:138.31,140.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:143.27,145.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:146.27,147.59 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:147.59,149.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:151.18,154.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:158.46,159.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:169.2,169.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:159.38,162.49 3 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:165.3,165.49 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:162.49,164.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:165.49,167.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:179.99,186.38 4 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:222.2,222.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:259.2,259.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:186.38,190.66 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:194.3,195.10 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:199.3,199.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:203.3,204.32 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:216.3,216.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:190.66,191.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:195.10,196.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:199.20,201.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:204.32,205.22 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:205.22,206.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:210.5,212.17 3 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:206.30,208.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:216.13,218.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:222.35,226.28 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:234.3,234.32 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:244.3,244.40 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:248.3,248.51 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:226.28,228.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:234.32,237.50 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:240.4,240.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:237.50,239.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:244.40,246.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:248.51,252.4 2 1 +github.com/ethereum/go-ethereum/accounts/abi/reflect.go:252.9,257.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:47.42,51.41 3 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:54.2,54.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:51.41,53.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:62.71,64.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:72.2,73.12 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:76.2,77.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:81.2,81.45 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:64.16,67.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:70.3,70.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:67.17,69.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:73.12,75.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:77.16,79.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:84.74,88.41 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:94.2,94.39 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:97.2,97.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:100.2,100.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:88.41,89.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:92.3,92.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:89.24,91.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:94.39,96.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:97.17,99.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:104.72,106.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:109.2,109.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:106.16,108.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:115.83,117.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:120.2,121.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:124.2,124.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:117.16,119.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:121.16,123.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:128.94,130.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:133.2,133.36 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:130.16,132.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:137.50,156.54 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:159.2,162.31 4 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:195.2,195.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:156.54,158.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:162.31,163.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:164.22,165.125 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:166.19,167.59 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:168.4,168.144 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:169.19,172.25 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:175.4,175.110 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:176.18,179.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:182.4,182.42 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:185.4,185.108 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:186.16,187.59 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:188.4,188.80 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:189.16,190.63 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:191.11,192.93 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:167.59,167.97 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:172.25,174.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:179.24,181.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:182.42,184.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:187.59,187.96 2 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:200.61,201.22 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:204.2,204.37 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:209.2,209.63 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:201.22,203.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:204.37,205.42 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:205.42,207.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:214.62,215.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:220.2,220.62 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:215.35,216.51 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:216.51,218.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:224.36,226.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:229.35,231.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:240.48,241.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:244.2,244.44 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:247.2,249.16 3 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:252.2,252.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:241.19,243.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:244.44,246.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:249.16,251.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:262.71,265.26 3 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:269.2,269.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/abi.go:265.26,268.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:45.60,48.16 3 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:52.2,53.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:56.2,59.12 3 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:48.16,50.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:53.16,55.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:63.51,65.32 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:70.2,70.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:65.32,66.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:66.19,68.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:74.43,76.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:79.71,80.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:86.2,86.37 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:80.20,81.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:84.3,84.37 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:81.26,83.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:90.87,92.14 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:95.2,95.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:101.2,102.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:105.2,105.45 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:108.2,108.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:92.14,94.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:95.20,96.26 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:99.3,99.13 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:96.26,98.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:102.16,104.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:105.45,107.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:112.76,114.46 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:117.2,117.22 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:123.2,123.25 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:126.2,126.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:114.46,116.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:117.22,118.26 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:121.3,121.13 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:118.26,120.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:123.25,125.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:130.90,134.34 3 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:137.2,137.22 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:134.34,136.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:141.91,145.22 3 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:177.2,177.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:146.22,148.38 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:151.3,153.17 3 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:156.3,156.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:165.36,166.42 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:169.3,169.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:174.10,175.77 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:148.38,150.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:153.17,155.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:156.38,158.24 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:161.4,161.75 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:158.24,160.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:161.75,163.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:166.42,168.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:169.33,170.84 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:170.84,172.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:183.77,187.41 4 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:211.2,211.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:187.41,189.56 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:206.3,206.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:209.3,209.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:189.56,201.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:201.9,201.63 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:201.63,205.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:206.17,208.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:216.75,218.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:221.70,224.31 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:229.2,233.33 3 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:236.2,237.25 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:258.2,260.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:224.31,226.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:233.33,235.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:237.25,241.17 3 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:245.3,245.32 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:241.17,243.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:245.32,252.4 3 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:252.9,255.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:264.39,266.26 2 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:271.2,271.32 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:266.26,267.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/argument.go:267.17,269.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:31.66,33.31 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:98.2,98.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:33.31,34.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:34.31,38.31 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:95.4,95.40 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:39.21,40.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:41.24,42.66 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:43.18,45.52 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:46.14,47.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:50.14,51.47 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:52.15,53.47 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:54.15,55.47 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:56.15,57.40 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:58.15,60.52 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:61.16,63.52 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:64.16,66.52 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:67.16,69.52 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:70.16,72.28 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:73.16,75.28 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:77.12,87.12 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:47.13,49.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:89.93,90.59 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:91.13,92.66 1 0 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:101.47,103.14 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:108.2,108.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:111.2,111.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:103.14,107.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:108.34,110.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:115.81,117.44 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:117.44,120.4 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:124.99,126.44 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:126.44,128.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:136.109,138.32 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:142.2,142.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:172.2,172.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:138.32,140.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:142.29,143.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:146.3,147.21 2 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:169.3,169.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:143.19,145.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:148.16,149.59 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:150.44,153.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:154.19,155.72 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:158.4,160.18 3 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:161.11,164.18 3 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:155.72,157.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/topics.go:164.18,166.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:68.100,70.52 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:73.2,77.32 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:115.2,116.23 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:119.2,123.28 3 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:137.2,137.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:214.2,214.8 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:70.52,72.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:77.32,80.57 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:84.3,86.17 3 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:90.3,95.21 4 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:112.3,112.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:80.57,82.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:86.17,88.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:95.21,100.4 3 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:100.9,100.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:100.28,105.18 4 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:108.4,108.53 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:105.18,107.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:109.9,111.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:116.23,118.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:123.28,126.17 3 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:126.17,128.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:129.8,130.56 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:130.56,134.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:138.13,140.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:141.14,143.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:144.14,145.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:146.17,148.20 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:149.16,150.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:151.15,152.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:158.15,167.34 4 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:189.3,201.74 8 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:207.18,209.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:210.10,211.59 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:152.19,154.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:154.9,157.4 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:167.34,169.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:172.4,173.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:176.4,185.32 6 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:169.18,171.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:173.18,175.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:185.32,187.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:201.74,205.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:218.38,219.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:220.13,221.39 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:222.14,223.38 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:224.14,225.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:226.16,227.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:228.15,229.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:230.15,231.51 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:232.15,233.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:234.17,235.42 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:236.20,237.58 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:238.15,239.50 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:240.14,242.54 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:243.20,245.54 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:246.18,247.54 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:248.10,249.24 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:253.81,255.21 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:259.2,260.26 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:264.2,264.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:255.21,257.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:260.26,263.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:268.37,270.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:272.53,275.40 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:279.2,279.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:275.40,277.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:280.24,283.31 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:289.3,291.16 3 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:294.3,295.32 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:308.3,308.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:309.15,320.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:324.3,325.37 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:328.3,329.37 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:346.3,346.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:348.10,349.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:283.31,286.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:291.16,293.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:295.32,297.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:300.4,300.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:304.4,306.31 3 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:297.18,299.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:300.18,302.13 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:320.17,322.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:325.37,327.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:329.37,331.24 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:334.4,335.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:338.4,338.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:331.24,333.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:335.18,337.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/type.go:338.28,342.5 3 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:342.10,344.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:355.43,357.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:366.33,367.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:375.2,375.106 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:367.20,368.37 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:373.3,373.15 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:368.37,369.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:369.28,371.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:386.30,387.47 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:400.2,400.11 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:387.47,389.49 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:392.3,392.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:389.49,391.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:393.8,393.48 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:393.48,395.37 2 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:398.3,398.15 1 1 +github.com/ethereum/go-ethereum/accounts/abi/type.go:395.37,397.4 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:57.36,57.54 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:60.43,61.21 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:64.2,64.25 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:67.2,68.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:71.2,71.15 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:61.21,63.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:64.25,66.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:68.16,70.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:75.38,77.16 2 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:80.2,80.12 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:77.16,78.13 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:84.30,89.2 4 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:92.49,94.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:97.2,98.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:101.2,101.17 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:94.16,96.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:98.16,100.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:106.44,108.16 2 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:111.2,111.12 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:108.16,109.13 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:115.36,119.2 3 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:123.13,127.23 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:128.9,129.22 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:130.9,131.21 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:132.10,133.31 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:139.48,141.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:144.2,144.19 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:147.2,149.23 3 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:164.2,165.17 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:141.16,143.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:144.19,146.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:149.23,151.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:154.3,154.35 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:162.3,162.14 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:151.16,153.4 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:154.35,156.24 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:159.4,160.29 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:156.24,158.5 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:170.43,172.16 2 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:175.2,175.12 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:172.16,173.13 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:179.40,180.38 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:180.38,182.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:182.8,182.21 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:182.21,184.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:184.8,186.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:189.37,191.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:193.56,194.21 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:197.2,197.25 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:200.2,201.21 2 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:204.2,204.39 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:207.2,207.19 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:194.21,196.3 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:197.25,199.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:201.21,203.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:204.39,206.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:212.35,213.9 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:214.30,215.26 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:216.30,217.31 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:218.30,219.31 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:220.10,221.19 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:225.32,226.44 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:234.2,234.45 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:237.2,237.26 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:240.2,240.12 1 0 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:226.44,227.18 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:228.25,229.25 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:230.26,231.20 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:234.45,236.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:237.26,239.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:40.46,45.2 4 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:48.51,49.22 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:52.2,52.70 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:49.22,51.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:56.51,58.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:61.2,62.47 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:67.2,67.12 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:58.16,60.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:62.47,64.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:64.8,66.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:71.32,73.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:76.56,76.82 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:79.59,81.31 2 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:91.2,91.12 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:82.14,84.17 2 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:87.3,87.12 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:88.10,89.58 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:84.17,86.4 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:97.68,98.22 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:101.2,101.89 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:98.22,100.3 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:107.66,109.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:112.2,112.28 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:116.2,116.24 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:121.2,122.12 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:109.16,111.3 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:112.28,114.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:116.24,117.35 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:117.35,119.4 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:128.76,130.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:133.2,133.28 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:137.2,137.24 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:142.2,143.12 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:130.16,132.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:133.28,135.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:137.24,138.35 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:138.35,140.4 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:155.44,157.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:160.49,161.22 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:164.2,164.68 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:161.22,163.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:168.49,170.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:173.2,173.19 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:176.2,178.23 3 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:193.2,196.12 4 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:170.16,172.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:173.19,175.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:178.23,180.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:183.3,183.35 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:191.3,191.14 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:180.16,182.4 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:183.35,185.24 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:188.4,189.29 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:185.24,187.5 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:200.32,202.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:205.31,207.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:210.54,210.81 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:213.57,215.31 2 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:225.2,225.12 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:216.14,217.40 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:218.13,221.16 3 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:222.10,223.59 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:233.47,238.2 4 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:241.52,242.22 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:245.2,245.71 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:242.22,244.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:249.52,251.16 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:254.2,254.19 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:257.2,258.27 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:266.2,267.12 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:251.16,253.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:254.19,256.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:258.27,260.23 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:263.3,264.13 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:260.23,262.4 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:271.33,273.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:276.57,276.82 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:279.60,281.31 2 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:289.2,289.12 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:282.14,283.40 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:284.13,285.21 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:286.10,287.57 1 0 +github.com/ethereum/go-ethereum/common/hexutil/json.go:297.45,299.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:302.50,303.22 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:306.2,306.69 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:303.22,305.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:310.50,313.53 3 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:318.2,319.12 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:313.53,315.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:315.8,315.23 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:315.23,317.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:323.31,325.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:327.34,329.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:331.43,333.2 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:335.63,336.21 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:339.2,339.30 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:344.2,344.23 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:347.2,347.19 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:336.21,338.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:339.30,341.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:341.8,341.23 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:341.23,343.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:344.23,346.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:350.60,351.21 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:354.2,354.31 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:357.2,358.21 2 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:361.2,361.39 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:364.2,364.19 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:351.21,353.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:354.31,356.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:358.21,360.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:361.39,363.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:367.55,368.34 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:371.2,371.12 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:368.34,370.3 1 1 +github.com/ethereum/go-ethereum/common/hexutil/json.go:374.43,376.2 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:46.51,50.2 3 0 +github.com/ethereum/go-ethereum/common/math/big.go:53.61,55.9 2 1 +github.com/ethereum/go-ethereum/common/math/big.go:58.2,59.12 2 1 +github.com/ethereum/go-ethereum/common/math/big.go:55.9,57.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:63.57,64.14 1 0 +github.com/ethereum/go-ethereum/common/math/big.go:67.2,67.55 1 0 +github.com/ethereum/go-ethereum/common/math/big.go:64.14,66.3 1 0 +github.com/ethereum/go-ethereum/common/math/big.go:75.41,79.2 3 0 +github.com/ethereum/go-ethereum/common/math/big.go:82.56,84.9 2 0 +github.com/ethereum/go-ethereum/common/math/big.go:87.2,88.12 2 0 +github.com/ethereum/go-ethereum/common/math/big.go:84.9,86.3 1 0 +github.com/ethereum/go-ethereum/common/math/big.go:92.52,94.2 1 0 +github.com/ethereum/go-ethereum/common/math/big.go:97.38,98.14 1 0 +github.com/ethereum/go-ethereum/common/math/big.go:101.2,101.42 1 0 +github.com/ethereum/go-ethereum/common/math/big.go:98.14,100.3 1 0 +github.com/ethereum/go-ethereum/common/math/big.go:106.45,107.13 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:110.2,112.53 3 1 +github.com/ethereum/go-ethereum/common/math/big.go:117.2,117.33 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:120.2,120.19 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:107.13,109.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:112.53,114.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:114.8,116.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:117.33,119.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:124.41,126.9 2 1 +github.com/ethereum/go-ethereum/common/math/big.go:129.2,129.10 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:126.9,127.41 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:133.34,136.2 2 1 +github.com/ethereum/go-ethereum/common/math/big.go:139.37,140.18 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:143.2,143.10 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:140.18,142.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:147.37,148.18 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:151.2,151.10 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:148.18,150.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:155.34,156.34 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:161.2,161.19 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:156.34,157.19 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:157.19,159.4 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:166.52,167.28 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:170.2,172.12 3 1 +github.com/ethereum/go-ethereum/common/math/big.go:167.28,169.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:178.51,182.21 3 1 +github.com/ethereum/go-ethereum/common/math/big.go:185.2,189.28 3 1 +github.com/ethereum/go-ethereum/common/math/big.go:182.21,184.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:196.51,197.20 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:200.2,200.47 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:197.20,199.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:205.44,207.34 2 1 +github.com/ethereum/go-ethereum/common/math/big.go:207.34,208.43 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:208.43,212.4 3 1 +github.com/ethereum/go-ethereum/common/math/big.go:217.32,219.2 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:223.35,225.2 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:234.32,235.22 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:238.2,238.35 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:235.22,237.3 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:246.44,249.39 2 1 +github.com/ethereum/go-ethereum/common/math/big.go:258.2,258.15 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:249.39,250.33 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:250.33,251.19 1 1 +github.com/ethereum/go-ethereum/common/math/big.go:254.4,255.14 2 1 +github.com/ethereum/go-ethereum/common/math/big.go:251.19,253.5 1 1 +github.com/ethereum/go-ethereum/common/math/integer.go:45.60,47.9 2 1 +github.com/ethereum/go-ethereum/common/math/integer.go:50.2,51.12 2 1 +github.com/ethereum/go-ethereum/common/math/integer.go:47.9,49.3 1 1 +github.com/ethereum/go-ethereum/common/math/integer.go:55.55,57.2 1 0 +github.com/ethereum/go-ethereum/common/math/integer.go:61.43,62.13 1 1 +github.com/ethereum/go-ethereum/common/math/integer.go:65.2,65.53 1 1 +github.com/ethereum/go-ethereum/common/math/integer.go:69.2,70.22 2 1 +github.com/ethereum/go-ethereum/common/math/integer.go:62.13,64.3 1 1 +github.com/ethereum/go-ethereum/common/math/integer.go:65.53,68.3 2 1 +github.com/ethereum/go-ethereum/common/math/integer.go:74.39,76.9 2 1 +github.com/ethereum/go-ethereum/common/math/integer.go:79.2,79.10 1 1 +github.com/ethereum/go-ethereum/common/math/integer.go:76.9,77.49 1 1 +github.com/ethereum/go-ethereum/common/math/integer.go:83.42,86.2 2 1 +github.com/ethereum/go-ethereum/common/math/integer.go:89.42,92.2 2 1 +github.com/ethereum/go-ethereum/common/math/integer.go:95.42,98.2 2 1 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:34.20,36.2 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:39.47,41.2 1 1 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:44.48,46.2 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:80.31,82.2 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:85.40,87.2 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:90.53,92.32 2 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:101.2,101.28 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:92.32,96.10 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:97.22,97.22 0 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:98.11,98.11 0 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:105.55,107.27 2 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:108.2,108.11 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:107.27,107.44 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:112.60,114.2 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:121.47,123.2 1 0 +github.com/ethereum/go-ethereum/common/mclock/mclock.go:125.43,127.2 1 0 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:50.28,51.19 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:51.19,53.3 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:57.42,63.55 5 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:67.2,70.24 3 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:63.55,66.3 2 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:70.24,72.3 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:76.40,81.2 3 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:84.42,89.27 4 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:89.27,91.3 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:95.35,100.2 3 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:103.44,105.2 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:108.57,114.31 5 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:115.2,116.14 2 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:114.31,114.49 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:121.59,123.2 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:127.65,132.2 3 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:134.68,142.2 6 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:144.33,148.18 3 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:151.2,154.13 4 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:148.18,150.3 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:157.44,158.18 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:162.2,165.18 4 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:170.2,170.23 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:158.18,159.57 1 0 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:165.18,167.3 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:167.8,169.3 1 0 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:173.40,174.18 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:177.2,177.14 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:174.18,175.53 1 0 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:182.34,184.2 1 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:186.44,188.2 1 0 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:190.39,194.2 3 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:196.44,200.2 3 1 +github.com/ethereum/go-ethereum/common/mclock/simclock.go:202.42,209.2 6 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:56.55,59.16 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:62.2,62.19 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:65.2,65.13 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:59.16,60.61 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:62.19,64.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:69.47,71.2 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:74.82,78.2 3 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:83.64,84.25 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:87.2,87.16 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:94.2,100.29 5 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:104.2,104.26 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:84.25,85.31 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:87.16,88.73 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:100.29,102.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:107.60,108.25 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:114.2,114.18 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:121.2,123.20 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:108.25,109.31 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:114.18,116.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:123.20,124.39 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:124.39,126.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:130.66,131.38 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:137.2,141.16 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:131.38,135.3 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:145.62,148.38 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:151.2,152.19 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:157.2,157.81 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:148.38,150.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:152.19,154.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:161.58,162.25 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:165.2,167.36 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:175.2,176.14 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:162.25,163.31 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:167.36,168.31 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:171.3,171.31 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:168.31,170.4 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:171.31,173.4 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:176.14,178.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:178.8,180.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:183.63,185.38 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:188.2,188.12 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:185.38,187.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:191.56,192.25 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:195.2,196.38 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:192.25,193.31 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:196.38,198.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:202.60,203.21 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:206.2,207.31 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:210.2,210.17 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:203.21,205.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:207.31,209.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:214.48,220.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:224.59,225.60 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:228.2,228.97 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:225.60,227.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:233.92,234.60 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:237.2,237.102 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:240.2,240.16 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:234.60,236.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:237.102,239.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:246.82,247.48 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:250.2,251.40 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:247.48,249.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:255.38,257.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:260.58,263.38 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:270.2,271.12 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:263.38,266.32 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:266.32,268.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:276.52,277.32 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:284.2,284.30 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:277.32,279.55 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:279.55,281.14 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:289.63,290.31 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:293.2,293.26 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:296.2,296.29 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:290.31,292.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:293.26,295.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:299.53,301.38 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:306.2,306.17 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:301.38,302.85 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:302.85,304.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:323.76,324.38 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:324.38,326.11 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:326.11,327.9 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:339.91,349.36 6 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:370.2,370.31 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:349.36,350.63 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:354.3,354.32 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:358.3,358.50 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:363.3,363.33 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:368.3,368.31 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:350.63,353.4 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:354.32,357.4 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:358.50,362.4 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:363.33,365.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:365.9,367.4 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:384.127,388.36 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:408.2,408.55 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:388.36,391.17 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:399.3,400.15 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:391.17,395.4 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:395.9,398.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:400.15,405.4 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:416.100,418.36 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:418.36,421.17 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:421.17,431.4 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:431.9,433.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:442.62,448.44 4 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:465.2,465.37 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:470.2,470.36 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:475.2,475.30 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:448.44,449.81 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:461.3,461.6 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:449.81,452.4 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:452.9,455.76 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:459.4,459.25 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:455.76,458.5 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:465.37,468.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:470.36,473.3 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:480.69,482.36 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:489.2,489.41 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:492.2,492.12 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:482.36,485.17 3 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:485.17,487.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:489.41,490.40 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:497.63,505.23 4 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:516.2,516.37 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:521.2,521.30 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:505.23,506.75 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:512.3,512.26 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:506.75,508.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:508.9,511.4 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:516.37,519.3 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:528.94,530.23 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:535.2,536.16 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:540.2,540.40 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:545.2,545.54 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:550.2,551.16 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:556.2,556.67 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:561.2,567.54 4 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:572.2,575.12 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:530.23,532.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:536.16,538.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:540.40,542.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:545.54,547.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:551.16,553.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:556.67,558.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:567.54,569.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:590.75,592.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:597.41,598.20 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:599.24,600.14 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:601.10,602.15 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:611.42,613.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:617.43,619.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:621.64,622.17 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:625.2,626.52 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:630.2,638.10 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:622.17,624.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:626.52,629.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:648.43,650.2 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:652.53,654.2 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:656.48,660.2 3 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:665.40,666.34 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:671.2,671.21 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:666.34,668.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:668.8,668.41 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:668.41,670.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:674.40,675.34 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:680.2,680.21 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:675.34,677.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:677.8,677.41 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:677.41,679.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:683.36,685.14 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:691.2,691.10 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:685.14,686.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:689.3,689.23 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:686.12,688.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:694.36,696.14 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:702.2,702.10 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:696.14,697.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:700.3,700.23 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:697.12,699.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:129.107,132.49 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:136.2,136.35 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:139.2,143.16 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:146.2,150.20 4 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:132.49,134.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:136.35,138.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:143.16,145.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:154.77,159.2 4 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:161.78,179.40 2 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:184.2,184.43 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:179.40,180.28 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:180.28,182.4 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:184.43,185.40 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:190.83,194.26 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:197.2,197.20 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:200.2,200.14 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:194.26,196.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:197.20,199.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:210.63,214.2 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:248.8,253.47 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:258.2,279.53 8 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:285.2,285.10 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:253.47,255.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:279.53,280.61 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:280.61,281.87 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:290.68,292.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:295.102,297.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:302.135,306.12 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:317.2,317.23 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:306.12,307.34 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:307.34,310.11 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:311.17,312.11 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:313.24,313.24 0 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:324.116,325.26 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:328.2,331.45 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:335.2,335.63 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:340.2,344.39 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:347.2,347.65 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:351.2,351.41 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:355.2,355.35 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:359.2,359.16 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:365.2,366.27 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:370.2,370.77 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:374.2,374.56 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:325.26,327.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:331.45,333.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:335.63,337.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:344.39,346.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:347.65,349.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:351.41,353.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:355.35,357.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:359.16,360.31 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:360.31,362.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:366.27,368.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:370.77,372.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:379.56,380.35 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:383.2,383.45 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:386.2,386.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:380.35,382.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:383.45,385.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:393.125,396.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:401.2,402.22 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:408.2,408.95 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:413.2,413.38 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:416.2,416.45 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:429.2,429.64 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:434.2,435.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:440.2,440.44 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:457.2,457.45 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:396.17,398.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:402.22,404.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:404.8,406.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:408.95,410.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:413.38,415.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:416.45,418.28 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:421.3,421.79 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:418.28,420.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:421.79,423.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:424.8,424.88 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:424.88,427.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:429.64,431.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:435.16,437.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:440.44,447.47 5 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:451.3,451.58 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:447.47,449.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:451.58,453.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:461.136,468.18 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:532.2,532.17 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:537.2,537.38 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:541.2,542.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:545.2,548.61 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:554.2,554.18 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:468.18,470.39 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:476.3,476.37 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:489.3,489.18 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:512.3,513.23 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:527.3,528.45 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:470.39,472.9 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:476.37,477.88 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:477.88,480.10 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:489.18,491.25 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:491.25,497.19 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:502.5,503.44 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:506.5,507.10 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:497.19,499.6 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:503.44,505.6 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:513.23,516.65 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:519.4,519.38 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:516.65,518.5 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:520.9,523.21 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:523.21,525.5 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:532.17,534.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:537.38,539.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:542.16,544.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:548.61,549.41 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:552.3,552.81 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:549.41,551.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:559.83,560.29 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:563.2,563.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:560.29,562.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:568.89,570.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:576.114,579.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:583.2,584.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:589.2,590.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:593.2,593.51 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:598.2,599.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:603.2,604.22 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:610.2,610.96 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:615.2,615.17 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:622.2,622.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:579.17,581.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:584.16,586.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:590.16,592.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:593.51,596.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:599.16,601.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:604.22,606.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:606.8,606.23 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:606.23,608.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:610.96,612.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:615.17,617.47 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:617.47,619.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:627.86,635.16 5 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:640.2,643.37 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:646.2,649.37 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:663.2,670.19 4 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:674.2,676.68 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:683.2,684.45 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:687.2,687.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:635.16,637.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:643.37,645.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:649.37,651.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:656.3,657.43 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:651.17,653.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:657.43,659.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:670.19,672.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:676.68,678.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:678.17,680.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:684.45,686.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:692.153,697.39 4 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:715.2,715.73 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:721.2,726.32 4 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:697.39,700.65 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:705.3,705.25 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:700.65,703.4 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:705.25,708.18 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:708.18,711.5 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:715.73,718.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:729.67,732.16 3 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:735.2,735.50 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:738.2,738.19 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:732.16,734.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:735.50,737.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:741.91,742.61 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:754.2,754.12 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:742.61,743.58 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:743.58,745.18 2 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:748.4,748.38 1 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:745.18,747.5 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:748.38,751.5 2 1 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:759.213,764.39 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:784.2,784.74 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:790.2,801.19 6 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:764.39,769.17 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:774.3,774.25 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:769.17,772.4 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:774.25,777.18 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:777.18,780.5 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:784.74,787.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:806.65,812.2 4 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:816.132,820.17 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:824.2,824.77 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:829.2,834.16 5 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:839.2,839.51 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:844.2,845.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:850.2,856.16 4 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:859.2,863.12 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:890.2,890.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:820.17,822.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:824.77,827.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:834.16,836.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:839.51,842.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:845.16,847.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:856.16,858.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:863.12,864.10 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:884.3,884.10 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:865.15,867.10 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:868.28,869.18 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:877.4,882.5 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:869.18,876.5 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:885.42,885.42 0 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:886.11,887.110 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:896.109,898.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:901.2,901.58 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:898.16,900.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:905.58,907.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:911.65,918.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:921.29,924.2 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:927.69,938.16 6 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:943.2,951.16 5 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:956.2,961.83 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:966.2,972.19 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:938.16,941.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:951.16,953.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:961.83,963.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:976.102,987.16 6 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:993.2,1001.16 5 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1006.2,1015.83 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1019.2,1020.26 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1027.2,1027.18 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:987.16,990.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1001.16,1002.13 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1015.83,1017.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1020.26,1025.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1034.9,1037.16 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1040.2,1040.44 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1044.2,1044.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1037.16,1039.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1040.44,1043.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1047.70,1049.17 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1054.2,1054.24 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1059.2,1059.88 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1063.2,1063.14 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1049.17,1051.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1054.24,1056.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1059.88,1061.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1071.9,1074.23 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1092.2,1092.60 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1101.2,1102.59 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1105.2,1106.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1111.2,1112.53 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1115.2,1116.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1121.2,1138.16 4 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1144.2,1148.12 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1074.23,1076.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1079.3,1079.20 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1076.17,1078.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1080.8,1082.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1086.3,1086.72 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1082.17,1084.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1086.72,1088.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1092.60,1098.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1102.59,1104.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1106.16,1108.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1112.53,1114.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1116.16,1118.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1138.16,1141.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1156.35,1160.16 4 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1164.2,1171.46 5 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1177.2,1180.43 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1205.2,1206.24 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1160.16,1162.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1171.46,1172.87 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1172.87,1174.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1180.43,1181.36 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1184.3,1184.92 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1189.3,1198.17 4 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1201.3,1203.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1181.36,1182.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1184.92,1186.9 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1198.17,1200.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1209.131,1211.103 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1214.2,1214.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1211.103,1213.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1217.52,1219.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1230.26,1233.16 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1238.2,1241.16 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1246.2,1247.24 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1252.2,1255.49 3 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1258.2,1265.26 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1233.16,1235.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1241.16,1243.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1247.24,1249.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1249.8,1251.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1255.49,1257.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1278.49,1280.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1282.80,1284.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1291.40,1291.65 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1292.40,1292.52 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1293.40,1293.56 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1294.40,1294.63 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1295.40,1295.69 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1296.40,1296.64 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1297.40,1297.66 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1298.40,1298.65 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1301.70,1312.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1321.19,1338.16 5 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1342.2,1343.21 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1338.16,1340.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1346.73,1347.22 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1352.2,1352.19 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1347.22,1348.63 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1348.63,1350.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1355.96,1360.29 4 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1370.2,1370.29 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1376.2,1377.10 2 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1360.29,1361.50 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1367.3,1367.32 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1361.50,1363.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1363.9,1365.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1370.29,1371.51 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1371.51,1373.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/bor.go:1380.48,1382.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:14.56,21.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:29.52,35.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:42.59,49.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:59.53,66.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:73.44,79.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:87.52,93.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:101.50,107.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:118.47,126.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/errors.go:135.52,143.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:31.47,31.64 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:32.47,32.93 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:33.47,33.74 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:45.13,56.2 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:59.161,61.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:64.2,65.51 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:68.2,73.67 4 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:77.2,77.18 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:61.16,63.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:65.51,67.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:73.67,75.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:81.51,83.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:86.2,86.59 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:83.16,85.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:90.37,100.39 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:104.2,104.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:100.39,102.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:107.70,109.23 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:113.2,113.38 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:118.2,118.46 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:122.2,124.33 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:165.2,168.18 3 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:109.23,111.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:113.38,114.67 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:114.67,116.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:118.46,120.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:124.33,129.63 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:134.3,135.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:140.3,140.52 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:144.3,144.66 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:149.3,152.52 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:129.63,131.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:135.17,137.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:140.52,142.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:144.66,146.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:152.52,153.65 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:156.4,162.25 5 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:153.65,155.5 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:172.82,176.25 4 1 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:179.2,180.23 2 1 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:184.2,185.32 2 1 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:190.2,190.39 1 1 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:176.25,178.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:180.23,182.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:185.32,186.32 1 1 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:186.32,188.4 1 1 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:194.47,196.48 2 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:199.2,199.13 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:196.48,198.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:203.61,205.66 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:209.2,218.31 7 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:222.2,222.62 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:205.66,207.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:218.31,220.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:53.67,62.2 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:64.104,66.6 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:87.2,87.53 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:90.2,90.26 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:66.6,70.17 4 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:73.3,74.29 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:77.3,77.73 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:80.3,81.43 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:84.3,84.36 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:70.17,72.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:74.29,75.9 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:77.73,79.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:81.43,82.9 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:87.53,89.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:94.71,98.16 3 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:101.2,101.67 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:105.2,105.24 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:98.16,100.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:101.67,103.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:109.94,111.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:115.2,118.27 3 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:111.16,113.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:122.103,124.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:128.2,136.30 5 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:141.2,144.6 3 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:124.16,126.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:136.30,138.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:144.6,147.10 3 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:148.20,150.35 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:151.19,153.32 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:153.32,155.5 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:161.81,163.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:166.2,169.52 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:174.2,175.27 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:180.2,181.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:185.2,185.56 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:189.2,189.23 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:163.16,165.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:169.52,171.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:175.27,177.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:181.16,183.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:185.56,187.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/rest.go:193.34,196.2 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:24.73,30.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:34.39,37.2 2 1 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:41.54,43.14 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:46.2,46.18 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:49.2,49.49 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:43.14,45.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:46.18,48.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:49.49,51.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:51.8,51.56 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:51.56,53.3 1 1 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:53.8,55.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:55.17,57.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:57.9,57.24 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:57.24,59.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:59.9,60.48 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:65.37,66.14 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:69.2,72.22 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:66.14,68.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:76.52,78.27 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:82.2,82.34 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:78.27,80.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:86.42,91.2 4 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:94.41,99.2 4 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:102.45,108.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:111.68,112.34 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:116.2,117.48 2 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:127.2,127.20 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:112.34,114.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:117.48,125.3 5 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:141.59,142.36 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:145.2,145.10 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:142.36,144.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:149.77,150.27 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:153.2,153.8 1 0 +github.com/ethereum/go-ethereum/consensus/bor/validator.go:150.27,152.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:34.73,37.55 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:43.2,43.19 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:46.2,46.80 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:37.55,39.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:39.8,41.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:43.19,45.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:50.77,53.55 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:59.2,59.19 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:62.2,63.21 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:53.55,55.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:55.8,57.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:59.19,61.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:67.72,69.19 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:72.2,72.80 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:69.19,71.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:76.79,79.55 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:85.2,85.19 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:88.2,89.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:92.2,92.28 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:79.55,81.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:81.8,83.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:85.19,87.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:89.16,91.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:96.78,98.19 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:101.2,102.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:105.2,105.28 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:98.19,100.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:102.16,104.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:109.62,111.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:114.2,114.53 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:111.16,113.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:118.62,120.16 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:123.2,123.42 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:120.16,122.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:127.71,128.54 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:131.2,132.54 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:135.2,136.34 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:139.2,140.46 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:143.2,146.32 4 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:155.2,159.41 4 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:173.2,174.83 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:177.2,179.18 3 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:128.54,130.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:132.54,134.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:136.34,138.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:140.46,142.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:146.32,149.26 3 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:149.26,153.4 3 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:159.41,171.3 5 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:174.83,176.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:182.49,184.30 2 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:187.2,187.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:184.30,186.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/api.go:190.54,192.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/clerk.go:27.61,39.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/clerk.go:41.63,50.2 1 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:38.27,49.2 3 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:56.19,59.16 3 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:62.2,65.16 4 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:69.2,73.16 4 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:76.2,76.21 1 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:59.16,61.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:65.16,68.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:73.16,75.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:79.88,83.16 4 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:88.2,96.16 5 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:100.2,101.85 2 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:104.2,104.18 1 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:83.16,86.3 2 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:96.16,98.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:101.85,103.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:3.43,5.25 2 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:11.2,11.15 1 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:5.25,7.17 2 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:7.17,9.4 1 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:14.38,15.12 1 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:19.2,27.10 9 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:15.12,17.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:30.61,32.22 2 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:35.2,36.8 2 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:32.22,34.3 1 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:39.43,41.27 2 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:47.2,47.15 1 0 +github.com/ethereum/go-ethereum/consensus/bor/merkle.go:41.27,46.3 3 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:39.73,42.55 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:48.2,48.19 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:51.2,51.83 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:42.55,44.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:44.8,46.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:48.19,50.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:55.72,57.19 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:60.2,60.83 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:57.19,59.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:64.79,67.55 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:73.2,73.19 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:76.2,77.16 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:80.2,80.28 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:67.55,69.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:69.8,71.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:73.19,75.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:77.16,79.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:84.78,86.19 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:89.2,90.16 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:93.2,93.28 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:86.19,88.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:90.16,92.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:97.53,102.50 4 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:105.2,105.18 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:102.50,104.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:110.60,115.2 3 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:119.49,124.2 3 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:136.43,144.16 3 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:147.2,152.21 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:156.2,157.28 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:160.2,160.31 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:175.2,179.8 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:144.16,146.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:152.21,155.3 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:157.28,159.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:160.31,162.15 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:165.3,165.40 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:168.3,170.17 3 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:173.3,173.23 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:162.15,164.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:165.40,167.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:170.17,172.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:187.68,190.53 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:195.2,196.53 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:199.2,200.16 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:203.2,204.12 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:190.53,193.3 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:196.53,198.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:200.16,202.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:210.89,211.32 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:226.2,227.65 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:230.2,231.66 2 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:234.2,234.34 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:211.32,214.27 3 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:221.3,221.20 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:224.3,224.35 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:214.27,216.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:216.9,216.50 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:216.50,218.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:218.9,218.54 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:218.54,220.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:221.20,223.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:227.65,229.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/api.go:231.66,233.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:146.86,149.49 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:153.2,153.35 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:156.2,160.16 3 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:163.2,167.20 4 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:149.49,151.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:153.35,155.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:160.16,162.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:191.66,194.21 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:198.2,207.3 3 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:194.21,196.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:212.71,214.2 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:217.105,219.2 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:224.138,228.12 3 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:239.2,239.23 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:228.12,229.34 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:229.34,232.11 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:233.17,234.11 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:235.24,235.24 0 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:246.119,247.26 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:250.2,253.45 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:257.2,258.57 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:262.2,262.98 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:265.2,265.64 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:269.2,269.37 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:272.2,272.47 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:276.2,277.38 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:280.2,280.58 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:284.2,284.41 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:288.2,288.35 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:292.2,292.16 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:298.2,298.42 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:302.2,302.77 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:306.2,306.56 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:247.26,249.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:253.45,255.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:258.57,260.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:262.98,264.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:265.64,267.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:269.37,271.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:272.47,274.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:277.38,279.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:280.58,282.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:284.41,286.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:288.35,290.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:292.16,293.117 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:293.117,295.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:298.42,300.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:302.77,304.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:313.128,316.17 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:320.2,321.22 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:326.2,326.95 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:329.2,329.47 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:333.2,333.38 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:336.2,336.45 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:349.2,350.16 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:354.2,354.32 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:365.2,365.44 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:316.17,318.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:321.22,323.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:323.8,325.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:326.95,328.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:329.47,331.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:333.38,335.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:336.45,338.28 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:341.3,341.79 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:338.28,340.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:341.79,343.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:344.8,344.88 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:344.88,347.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:350.16,352.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:354.32,356.41 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:359.3,360.67 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:356.41,358.4 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:360.67,362.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:369.139,375.18 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:430.2,430.38 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:433.2,434.16 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:437.2,440.61 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:446.2,446.18 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:375.18,377.39 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:382.3,382.37 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:393.3,393.147 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:411.3,412.23 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:426.3,427.45 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:377.39,379.9 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:382.37,383.78 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:383.78,386.10 3 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:393.147,395.25 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:395.25,399.39 3 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:402.5,403.44 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:406.5,407.10 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:399.39,401.6 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:403.44,405.6 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:412.23,415.65 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:418.4,418.38 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:415.65,417.5 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:419.9,422.21 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:422.21,424.5 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:430.38,432.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:434.16,436.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:440.61,441.41 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:444.3,444.88 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:441.41,443.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:451.86,452.29 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:455.2,455.12 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:452.29,454.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:462.98,465.17 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:469.2,470.16 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:473.2,473.40 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:476.2,476.41 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:485.2,485.17 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:494.2,494.12 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:465.17,467.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:470.16,472.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:473.40,475.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:476.41,477.23 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:477.23,479.69 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:479.69,481.5 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:485.17,487.55 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:490.3,490.56 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:487.55,489.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:490.56,492.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:499.89,507.16 5 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:510.2,510.32 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:532.2,535.37 2 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:538.2,540.32 2 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:545.2,552.19 4 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:555.2,556.45 2 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:559.2,559.12 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:507.16,509.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:510.32,515.47 3 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:521.3,521.25 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:529.3,529.19 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:515.47,516.42 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:516.42,518.5 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:521.25,523.36 2 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:523.36,525.5 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:525.10,527.5 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:535.37,537.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:540.32,541.41 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:541.41,543.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:552.19,554.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:556.45,558.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:564.156,568.2 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:572.216,578.2 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:582.68,588.2 4 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:592.135,597.17 3 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:601.2,601.60 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:605.2,611.16 5 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:614.2,614.56 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:618.2,618.41 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:627.2,628.44 2 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:636.2,637.16 2 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:640.2,643.12 3 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:657.2,657.12 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:597.17,599.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:601.60,603.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:611.16,613.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:614.56,616.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:618.41,619.23 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:619.23,621.87 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:621.87,623.5 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:628.44,634.3 3 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:637.16,639.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:643.12,644.10 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:650.3,650.10 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:645.15,646.10 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:647.28,647.28 0 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:651.42,651.42 0 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:652.11,653.81 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:664.112,666.16 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:669.2,669.39 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:666.16,668.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:672.69,673.40 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:676.2,676.37 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:673.40,675.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:680.61,682.2 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:685.32,687.2 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:691.68,698.2 1 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:701.56,706.2 4 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:715.45,719.2 3 0 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:721.57,739.27 2 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:742.2,742.43 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:739.27,741.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/clique.go:742.43,743.40 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:65.47,65.64 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:66.47,66.93 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:67.47,67.74 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:72.140,82.33 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:85.2,85.13 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:82.33,84.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:89.128,91.16 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:94.2,95.51 2 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:98.2,101.18 3 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:91.16,93.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:95.51,97.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:105.51,107.16 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:110.2,110.62 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:107.16,109.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:114.37,125.32 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:128.2,128.39 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:131.2,131.38 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:134.2,136.12 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:125.32,127.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:128.39,130.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:131.38,133.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:141.75,144.2 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:147.70,149.38 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:153.2,153.37 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:159.2,159.13 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:149.38,151.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:153.37,156.3 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:156.8,158.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:163.72,166.9 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:170.2,170.34 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:174.2,174.21 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:180.2,180.13 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:166.9,168.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:170.34,172.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:174.21,177.3 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:177.8,179.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:185.70,187.23 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:191.2,191.38 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:196.2,196.46 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:200.2,206.33 3 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:300.2,300.39 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:303.2,306.18 3 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:187.23,189.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:191.38,192.67 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:192.67,194.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:196.46,198.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:206.33,209.33 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:214.3,214.64 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:218.3,219.17 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:222.3,222.41 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:225.3,225.39 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:230.3,233.35 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:244.3,245.10 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:253.3,253.44 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:262.3,262.78 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:295.3,295.41 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:209.33,212.4 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:214.64,216.4 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:219.17,221.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:222.41,224.4 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:225.39,226.24 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:226.24,228.5 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:233.35,234.64 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:234.64,240.10 3 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:246.52,247.20 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:248.52,249.21 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:250.11,251.30 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:253.44,260.4 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:262.78,263.23 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:286.4,286.41 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:292.4,292.39 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:263.23,265.5 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:265.10,269.66 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:273.5,273.42 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:269.66,271.6 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:273.42,274.49 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:274.49,282.7 3 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:286.41,287.49 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:287.49,290.6 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:295.41,298.4 2 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:300.39,302.3 1 0 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:310.47,312.29 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:315.2,316.13 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:312.29,314.3 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:320.70,322.57 2 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:325.2,325.58 1 1 +github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:322.57,324.3 1 0 +github.com/ethereum/go-ethereum/common/prque/prque.go:30.44,32.2 1 1 +github.com/ethereum/go-ethereum/common/prque/prque.go:35.54,37.2 1 0 +github.com/ethereum/go-ethereum/common/prque/prque.go:40.56,42.2 1 1 +github.com/ethereum/go-ethereum/common/prque/prque.go:45.45,48.2 2 0 +github.com/ethereum/go-ethereum/common/prque/prque.go:52.44,55.2 2 1 +github.com/ethereum/go-ethereum/common/prque/prque.go:58.39,60.2 1 0 +github.com/ethereum/go-ethereum/common/prque/prque.go:63.43,64.11 1 0 +github.com/ethereum/go-ethereum/common/prque/prque.go:67.2,67.31 1 0 +github.com/ethereum/go-ethereum/common/prque/prque.go:64.11,66.3 1 0 +github.com/ethereum/go-ethereum/common/prque/prque.go:71.30,73.2 1 1 +github.com/ethereum/go-ethereum/common/prque/prque.go:76.28,78.2 1 1 +github.com/ethereum/go-ethereum/common/prque/prque.go:81.25,83.2 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:45.68,53.2 7 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:57.41,58.26 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:67.2,67.23 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:70.2,72.10 3 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:58.26,63.3 4 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:63.8,63.34 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:63.34,66.3 2 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:67.23,69.3 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:77.42,80.18 3 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:84.2,85.23 2 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:88.2,88.8 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:80.18,83.3 2 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:85.23,87.3 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:92.28,94.2 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:98.38,100.18 2 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:103.2,103.14 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:100.18,102.3 1 0 +github.com/ethereum/go-ethereum/common/prque/sstack.go:107.33,110.23 3 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:114.2,114.43 1 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:110.23,113.3 2 1 +github.com/ethereum/go-ethereum/common/prque/sstack.go:118.26,120.2 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:56.166,70.2 4 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:73.29,76.2 2 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:79.31,81.54 2 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:81.54,85.3 3 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:89.49,91.28 2 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:94.2,96.40 3 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:91.28,93.3 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:100.44,102.2 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:105.39,107.2 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:110.48,115.57 2 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:120.2,120.24 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:115.57,119.3 3 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:125.37,126.27 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:132.2,132.27 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:135.2,135.11 1 0 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:126.27,127.99 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:130.3,130.11 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:127.99,129.4 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:132.27,134.3 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:141.84,143.22 2 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:143.22,147.129 4 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:147.129,149.38 2 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:155.4,155.29 1 0 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:149.38,150.31 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:153.5,153.11 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:150.31,152.6 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:161.43,164.2 2 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:167.51,168.15 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:171.2,171.76 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:168.15,170.3 1 0 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:175.34,177.2 1 0 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:180.32,182.2 1 0 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:185.60,186.17 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:186.17,188.3 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:188.8,190.3 1 1 +github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:194.60,196.2 1 1 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:47.87,49.32 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:53.2,54.81 2 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:58.2,58.27 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:68.2,68.12 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:49.32,51.3 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:54.81,56.3 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:58.27,59.59 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:59.59,61.4 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:62.8,63.58 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:63.58,65.4 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:74.47,76.46 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:81.2,81.45 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:76.46,78.3 1 0 +github.com/ethereum/go-ethereum/consensus/misc/dao.go:81.45,84.3 2 0 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:32.90,35.37 2 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:38.2,38.72 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:42.2,42.27 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:46.2,47.46 2 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:51.2,51.12 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:35.37,37.3 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:38.72,40.3 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:42.27,44.3 1 0 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:47.46,50.3 1 0 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:55.77,57.37 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:61.2,67.39 2 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:70.2,70.38 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:57.37,59.3 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:67.39,69.3 1 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:70.38,81.3 5 1 +github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:81.8,92.3 5 1 +github.com/ethereum/go-ethereum/consensus/misc/forks.go:30.91,32.11 1 0 +github.com/ethereum/go-ethereum/consensus/misc/forks.go:36.2,36.77 1 0 +github.com/ethereum/go-ethereum/consensus/misc/forks.go:42.2,42.12 1 0 +github.com/ethereum/go-ethereum/consensus/misc/forks.go:32.11,34.3 1 0 +github.com/ethereum/go-ethereum/consensus/misc/forks.go:36.77,37.81 1 0 +github.com/ethereum/go-ethereum/consensus/misc/forks.go:37.81,39.4 1 0 +github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:28.66,31.14 2 1 +github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:34.2,35.27 2 1 +github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:38.2,38.41 1 1 +github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:41.2,41.12 1 1 +github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:31.14,33.3 1 1 +github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:35.27,37.3 1 1 +github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:38.41,40.3 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:38.63,42.2 3 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:45.44,46.54 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:51.2,51.16 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:62.2,62.35 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:67.2,68.20 2 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:79.2,79.13 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:46.54,49.3 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:51.16,53.20 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:56.3,56.10 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:53.20,55.4 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:57.8,60.3 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:62.35,65.3 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:68.20,71.64 3 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:75.3,75.32 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:71.64,74.4 2 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:76.8,78.3 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:83.46,85.2 1 1 +github.com/ethereum/go-ethereum/core/asm/asm.go:88.44,90.2 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:93.47,95.2 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:98.45,100.2 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:103.43,105.16 2 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:109.2,110.16 2 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:117.2,117.19 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:105.16,107.3 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:110.16,111.43 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:111.43,113.4 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:113.9,115.4 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:121.51,125.16 3 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:132.2,132.35 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:135.2,135.20 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:125.16,126.43 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:126.43,128.4 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:128.9,130.4 1 0 +github.com/ethereum/go-ethereum/core/asm/asm.go:132.35,134.3 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:43.40,48.2 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:59.42,61.20 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:86.2,86.13 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:61.20,62.16 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:83.3,84.11 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:63.15,65.21 2 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:68.4,68.20 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:69.20,70.27 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:71.16,72.10 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:73.17,75.10 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:76.14,78.48 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:65.21,67.5 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:78.48,80.5 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:86.13,88.3 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:97.48,101.28 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:108.2,109.29 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:117.2,117.20 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:101.28,102.41 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:102.41,104.4 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:109.29,110.24 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:111.18,112.45 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:113.15,114.31 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:122.33,126.2 3 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:130.40,132.24 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:136.2,137.20 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:152.2,152.37 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:156.2,156.12 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:132.24,134.3 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:138.11,139.13 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:140.15,141.50 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:144.16,145.19 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:146.15,147.13 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:148.10,149.85 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:141.50,143.4 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:152.37,154.3 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:160.62,162.19 2 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:165.2,166.22 2 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:162.19,164.3 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:172.56,175.26 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:227.2,227.12 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:175.26,177.21 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:195.3,196.13 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:178.15,180.27 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:181.20,183.50 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:184.14,188.18 4 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:189.16,190.11 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:191.11,192.69 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:197.8,197.33 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:197.33,202.21 3 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:217.3,217.22 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:221.3,222.19 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:203.15,205.23 2 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:208.20,209.55 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:210.14,212.56 2 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:213.11,214.69 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:205.23,207.5 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:217.22,219.4 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:223.8,225.3 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:231.35,233.2 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:236.43,237.13 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:240.2,240.32 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:237.13,239.3 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:245.29,247.2 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:250.29,252.2 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:255.38,257.2 1 1 +github.com/ethereum/go-ethereum/core/asm/compiler.go:266.40,268.2 1 0 +github.com/ethereum/go-ethereum/core/asm/compiler.go:270.50,276.2 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:62.37,63.37 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:66.2,66.29 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:63.37,65.3 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:98.50,106.12 3 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:115.2,115.11 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:106.12,108.22 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:111.3,112.18 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:108.22,110.4 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:119.36,120.27 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:124.2,126.13 3 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:120.27,123.3 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:130.26,132.2 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:135.29,139.2 3 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:142.26,144.2 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:147.43,148.43 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:152.2,154.14 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:148.43,150.3 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:159.41,160.44 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:162.2,162.12 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:160.45,161.3 0 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:167.49,169.75 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:175.2,175.13 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:169.75,170.13 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:170.13,172.4 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:179.31,181.2 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:184.35,187.13 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:191.2,192.17 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:187.13,189.3 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:196.32,197.6 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:197.6,198.25 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:199.18,204.21 4 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:205.36,206.21 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:207.19,208.14 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:209.32,210.21 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:211.20,212.20 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:213.17,215.19 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:216.17,217.26 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:218.11,219.14 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:226.35,231.2 3 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:236.33,242.2 3 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:247.40,248.27 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:252.2,252.16 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:248.27,250.3 1 0 +github.com/ethereum/go-ethereum/core/asm/lexer.go:255.34,257.20 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:260.2,264.16 3 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:257.20,259.3 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:267.35,270.21 2 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:278.2,278.16 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:270.21,275.3 3 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:275.8,277.3 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:281.28,283.2 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:285.27,287.2 1 1 +github.com/ethereum/go-ethereum/core/asm/lexer.go:289.28,291.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:90.47,93.17 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:96.2,96.67 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:101.2,101.18 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:93.17,95.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:96.67,98.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:98.8,100.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:117.156,125.2 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:129.179,134.16 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:137.2,138.16 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:141.2,142.30 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:134.16,136.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:138.16,140.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:149.114,151.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:154.2,154.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:158.2,159.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:162.2,168.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:197.2,197.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:202.2,203.58 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:151.17,153.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:154.20,156.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:159.16,161.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:168.18,170.10 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:173.3,174.37 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:170.10,172.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:174.37,176.64 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:176.64,178.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:178.10,178.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:178.29,180.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:182.8,184.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:187.3,187.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:184.17,186.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:187.23,189.81 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:189.81,191.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:191.10,191.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:191.29,193.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:197.24,201.3 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:207.120,210.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:215.2,215.44 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:210.16,212.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:220.102,224.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:228.82,232.2 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:234.149,237.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:241.2,242.22 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:250.2,251.22 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:257.2,257.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:261.2,262.24 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:270.2,271.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:274.2,283.33 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:237.18,239.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:242.22,244.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:247.3,247.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:244.17,246.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:251.22,256.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:257.34,259.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:262.24,265.17 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:265.17,267.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:271.16,273.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:286.128,287.52 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:291.2,292.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:296.2,297.21 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:305.2,306.24 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:314.2,315.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:318.2,326.33 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:287.52,289.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:292.18,294.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:297.21,299.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:302.3,302.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:299.17,301.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:306.24,309.17 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:309.17,311.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:315.16,317.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:329.166,330.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:338.2,347.67 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:330.21,332.98 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:332.98,334.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:334.9,334.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:334.28,336.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:350.70,351.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:351.23,353.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:353.8,355.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:360.122,361.78 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:365.2,369.26 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:382.2,382.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:386.2,386.24 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:389.2,390.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:393.2,393.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:396.2,396.92 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:399.2,399.22 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:361.78,363.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:369.26,371.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:371.8,373.101 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:373.101,375.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:375.9,375.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:375.33,377.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:377.9,380.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:382.16,384.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:386.24,388.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:390.16,392.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:393.17,395.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:396.92,398.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:404.135,406.17 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:410.2,413.16 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:417.2,424.21 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:430.2,431.16 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:434.2,434.69 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:445.2,445.16 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:448.2,448.23 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:406.17,408.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:413.16,415.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:424.21,426.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:431.16,433.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:434.69,435.28 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:442.3,442.13 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:435.28,436.11 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:437.21,437.21 0 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:438.16,439.15 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:445.16,447.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:453.133,455.17 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:459.2,462.16 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:466.2,472.23 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:475.2,476.16 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:479.2,479.23 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:455.17,457.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:462.16,464.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:472.23,474.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:476.16,478.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:483.87,484.45 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:487.2,487.23 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:492.2,493.49 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:498.2,498.54 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:484.45,486.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:487.23,488.73 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:488.73,490.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:493.49,494.18 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:494.18,496.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:502.105,503.45 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:506.2,506.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:511.2,512.49 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:517.2,517.61 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:503.45,505.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:506.23,507.67 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:507.67,509.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:512.49,513.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:513.18,515.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:522.57,523.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:526.2,526.12 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:523.16,525.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:50.179,61.34 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:213.2,213.34 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:218.2,234.51 5 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:238.2,238.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:246.2,246.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:61.34,64.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:68.3,68.48 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:76.3,92.51 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:98.3,98.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:139.3,139.42 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:169.3,169.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:172.3,172.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:176.3,176.43 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:180.3,194.21 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:198.3,198.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:64.17,66.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:68.48,69.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:72.4,72.12 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:69.26,71.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:92.51,93.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:93.29,95.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:98.43,104.30 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:107.4,107.35 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:110.4,114.44 5 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:122.4,124.46 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:133.4,133.29 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:104.30,106.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:107.35,109.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:114.44,115.25 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:118.5,118.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:115.25,117.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:118.30,120.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:124.46,125.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:128.5,128.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:125.26,127.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:128.31,130.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:133.29,135.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:135.10,137.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:139.42,141.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:145.4,149.40 3 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:152.4,157.44 5 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:166.4,166.82 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:141.26,142.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:149.40,151.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:157.44,158.25 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:161.5,161.30 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:158.25,160.6 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:161.30,163.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:169.27,171.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:172.26,174.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:176.43,178.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:194.21,196.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:198.35,200.18 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:203.4,203.15 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:200.18,202.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:203.15,206.34 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:206.34,208.6 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:213.34,216.3 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:234.51,236.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:238.20,240.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:243.3,243.27 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:240.17,242.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:257.44,258.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:259.21,260.26 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:261.29,263.19 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:267.3,267.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:268.24,269.44 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:270.19,271.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:272.22,273.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:274.10,276.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:264.30,265.53 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:283.71,284.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:285.19,286.55 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:287.19,288.74 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:289.19,290.48 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:291.10,292.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:297.46,298.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:299.21,300.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:301.29,305.22 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:310.3,310.22 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:314.3,322.22 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:325.3,325.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:326.37,327.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:328.18,329.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:330.20,331.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:332.22,333.20 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:334.10,335.23 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:305.22,307.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:310.22,312.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:322.22,324.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:341.43,342.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:354.2,354.19 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:343.17,344.17 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:345.16,346.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:347.17,348.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:349.16,350.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:351.16,352.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:360.73,361.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:362.19,363.55 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:364.32,365.62 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:366.10,367.33 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:380.76,389.44 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:392.2,392.14 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:389.44,391.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:397.78,406.44 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:409.2,409.14 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:406.44,408.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:422.77,423.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:424.19,432.37 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:435.3,436.40 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:440.3,441.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:444.3,448.14 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:449.19,450.80 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:451.19,452.54 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:453.10,454.31 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:432.37,434.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:436.40,439.4 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:441.17,443.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:461.79,462.16 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:463.19,471.37 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:474.3,475.40 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:479.3,480.17 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:483.3,487.14 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:488.32,489.68 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:490.10,491.33 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:471.37,473.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:475.40,478.4 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:480.17,482.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:498.42,498.77 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:504.62,505.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:506.16,507.18 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:508.17,509.16 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:510.10,512.22 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:515.3,515.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:512.22,514.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:516.30,517.22 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:520.4,520.66 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:522.11,523.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:517.22,519.5 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:530.56,531.39 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:534.2,534.10 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:531.39,533.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:548.40,549.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:553.2,554.49 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:549.21,551.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:559.42,560.19 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:563.2,564.27 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:577.2,577.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:560.19,562.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:564.27,566.21 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:571.3,572.35 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:575.3,575.23 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:566.21,568.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:572.35,574.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:582.33,583.13 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:584.19,585.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:586.19,587.28 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:588.19,589.14 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:590.10,591.15 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:32.101,37.6 4 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:37.6,39.17 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:43.3,43.40 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:50.3,50.10 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:39.17,41.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:43.40,45.4 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:45.9,47.4 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:51.21,52.25 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:53.24,53.24 0 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:60.104,61.20 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:64.2,65.16 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:68.2,68.51 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:74.2,75.34 2 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:78.2,78.37 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:61.20,63.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:65.16,67.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:68.51,70.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:75.34,77.3 1 1 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:46.79,49.16 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:52.2,53.16 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:56.2,56.48 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:49.16,51.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:53.16,55.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:63.106,68.91 3 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:68.91,69.34 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:72.4,73.18 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:76.4,76.46 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:69.34,71.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:73.18,75.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:86.62,92.91 4 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:92.91,93.26 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:96.4,97.18 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:100.4,100.46 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:93.26,95.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:97.18,99.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:108.108,110.16 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:113.2,114.16 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:117.2,117.63 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:110.16,112.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:114.16,116.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:122.135,123.20 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:126.2,129.91 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:123.20,125.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:129.91,130.34 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:133.4,134.18 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:137.4,137.46 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:130.34,132.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:134.18,136.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:145.100,147.20 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:150.2,153.91 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:147.20,149.3 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:153.91,154.26 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:157.4,158.18 2 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:161.4,161.46 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:154.26,156.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:158.18,160.5 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:169.95,172.100 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:172.100,173.34 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:176.4,176.49 1 0 +github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:173.34,175.5 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:69.77,75.43 3 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:84.2,84.52 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:75.43,76.19 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:81.3,82.8 2 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:76.19,79.12 2 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:88.42,94.2 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:98.41,102.17 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:102.17,104.4 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:109.78,110.24 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:111.2,111.41 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:110.24,110.36 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:117.94,125.29 4 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:131.2,134.27 2 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:125.29,128.3 2 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:134.27,155.30 2 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:194.3,195.13 2 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:155.30,158.20 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:163.4,163.26 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:174.4,174.27 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:185.4,185.39 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:192.4,192.38 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:158.20,159.13 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:163.26,166.39 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:170.5,170.15 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:166.39,168.6 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:174.27,175.27 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:175.27,177.29 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:180.6,180.16 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:177.29,179.7 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:185.39,186.27 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:186.27,189.6 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:201.54,205.2 3 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:208.43,212.2 3 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:215.55,221.39 4 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:237.2,237.34 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:245.2,245.34 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:252.2,252.37 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:255.2,255.14 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:221.39,224.46 2 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:227.3,227.49 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:231.3,232.18 2 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:224.46,225.12 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:227.49,228.12 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:232.18,234.4 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:237.34,238.39 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:238.39,239.27 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:239.27,241.5 1 0 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:245.34,246.29 1 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:246.29,249.4 2 1 +github.com/ethereum/go-ethereum/core/forkid/forkid.go:252.37,254.3 1 1 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:39.112,41.16 2 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:44.2,44.67 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:41.16,43.3 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:48.63,50.2 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:53.71,55.2 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:59.162,62.33 2 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:73.2,73.14 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:62.33,63.28 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:63.28,65.18 2 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:68.4,68.62 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:65.18,66.13 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:68.62,70.5 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:81.178,87.33 2 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:95.2,95.99 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:87.33,88.25 1 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:91.3,93.29 3 0 +github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:88.25,90.4 1 0 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:45.54,46.21 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:49.2,50.44 2 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:53.2,53.15 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:46.21,48.3 1 0 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:50.44,52.3 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:58.67,60.29 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:63.2,63.24 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:67.2,69.51 3 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:84.2,85.12 2 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:60.29,62.3 1 0 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:63.24,65.3 1 0 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:69.51,71.21 2 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:74.3,82.59 9 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:71.21,72.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:90.54,91.29 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:94.2,94.33 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:97.2,97.27 1 1 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:91.29,93.3 1 0 +github.com/ethereum/go-ethereum/core/bloombits/generator.go:94.33,96.3 1 0 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:38.46,42.33 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:45.2,45.13 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:42.33,44.3 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:92.66,105.33 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:124.2,124.44 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:131.2,131.10 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:105.33,107.23 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:110.3,111.33 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:119.3,119.23 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:107.23,108.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:111.33,112.21 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:116.4,116.43 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:112.21,114.10 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:119.23,121.4 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:124.44,125.50 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:125.50,126.46 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:126.46,128.5 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:137.42,138.36 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:141.2,141.39 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:138.36,140.3 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:147.111,149.43 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:152.2,160.41 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:163.2,167.12 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:214.2,214.21 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:149.43,151.3 1 0 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:160.41,162.3 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:167.12,171.7 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:171.7,172.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:173.24,174.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:176.27,178.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:182.5,185.22 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:188.5,189.19 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:193.5,193.36 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:178.12,180.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:185.22,187.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:189.19,191.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:193.36,196.19 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:203.6,203.44 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:196.19,197.19 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:200.7,200.15 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:197.19,199.8 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:203.44,204.14 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:205.27,206.14 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:207.25,207.25 0 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:224.100,229.12 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:242.2,245.34 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:249.2,252.13 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:229.12,233.63 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:233.63,234.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:235.24,236.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:237.88,237.88 0 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:245.34,247.3 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:259.145,263.29 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:272.2,276.12 4 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:319.2,319.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:376.2,376.16 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:263.29,264.28 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:264.28,269.4 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:276.12,281.16 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:289.3,289.7 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:281.16,282.48 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:282.48,283.44 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:283.44,285.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:289.7,290.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:291.24,292.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:294.32,296.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:300.5,300.49 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:310.5,310.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:296.12,298.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:300.49,301.45 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:301.45,302.14 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:303.27,304.14 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:305.40,305.40 0 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:311.25,312.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:313.28,313.28 0 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:319.12,325.7 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:325.7,326.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:327.24,328.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:330.33,332.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:336.5,337.45 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:360.5,360.24 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:363.5,363.29 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:366.5,366.36 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:332.12,334.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:337.45,339.41 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:353.6,353.25 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:339.41,341.14 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:346.7,346.27 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:342.27,343.14 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:344.29,344.29 0 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:346.27,349.8 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:349.13,351.8 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:353.25,355.7 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:355.12,357.7 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:360.24,362.6 1 0 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:363.29,365.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:366.36,367.13 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:368.26,369.13 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:370.64,370.64 0 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:381.76,394.27 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:406.2,406.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:394.27,395.10 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:396.34,398.18 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:399.11,402.30 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:406.6,407.10 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:408.19,412.19 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:416.22,419.54 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:420.4,423.23 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:427.32,430.30 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:436.4,437.26 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:440.4,441.18 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:443.32,445.45 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:447.34,450.67 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:457.4,460.35 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:464.33,472.42 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:480.4,484.24 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:498.4,498.38 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:412.19,414.5 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:419.54,419.88 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:423.23,425.5 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:430.30,431.32 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:431.32,433.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:437.26,439.5 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:450.67,453.5 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:453.10,456.5 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:460.35,462.5 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:472.42,473.25 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:477.5,478.38 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:473.25,475.14 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:484.24,486.37 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:490.5,492.35 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:486.37,487.56 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:488.6,488.83 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:487.56,487.86 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:492.35,494.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:498.38,500.5 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:523.34,524.21 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:524.21,528.3 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:532.40,537.2 3 0 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:542.59,545.9 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:546.16,547.18 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:548.39,550.17 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:556.56,559.9 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:560.16,561.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:562.37,564.24 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:570.73,573.9 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:574.16,575.13 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:576.39,582.30 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:588.89,590.2 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:598.93,599.6 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:599.6,602.10 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:606.3,606.37 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:619.3,622.10 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:602.10,604.4 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:606.37,607.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:608.18,612.11 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:614.28,614.28 0 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:623.17,626.10 2 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:628.23,633.27 3 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:639.4,639.66 1 1 +github.com/ethereum/go-ethereum/core/bloombits/matcher.go:633.27,638.5 4 0 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:49.40,54.2 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:59.125,68.2 4 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:73.29,77.40 3 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:77.40,78.24 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:78.24,80.4 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:87.134,93.6 3 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:93.6,94.10 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:95.15,96.10 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:98.30,100.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:104.4,107.35 3 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:113.4,116.14 2 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:123.4,123.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:100.11,102.5 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:107.35,112.5 2 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:116.14,117.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:118.17,119.12 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:120.57,120.57 0 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:124.16,125.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:126.25,126.25 0 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:134.116,140.6 3 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:140.6,141.10 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:142.15,143.10 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:145.26,147.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:151.4,155.11 4 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:161.4,161.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:147.11,149.5 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:156.16,157.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:158.20,158.20 0 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:162.16,163.11 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:164.28,164.28 0 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:171.63,175.35 3 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:175.35,176.67 1 1 +github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:176.67,179.4 2 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:32.26,34.2 1 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:37.57,40.14 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:40.14,43.41 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:46.3,46.43 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:43.41,44.40 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:52.57,55.38 1 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:59.2,61.36 2 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:55.38,56.39 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:65.38,66.28 1 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:66.28,68.3 1 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:72.59,73.15 1 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:77.2,77.32 1 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:84.2,84.8 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:73.15,75.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:77.32,82.3 3 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:88.52,89.15 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:93.2,93.32 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:97.2,97.12 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:89.15,91.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:93.32,95.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:101.28,103.2 1 1 +github.com/ethereum/go-ethereum/core/vm/memory.go:106.32,108.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:111.26,113.22 2 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:122.2,122.37 1 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:113.22,115.45 2 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:115.45,118.4 2 0 +github.com/ethereum/go-ethereum/core/vm/memory.go:119.8,121.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:19.51,21.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:23.54,25.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:27.56,29.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:31.50,33.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:35.53,37.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:39.47,41.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:43.49,45.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:47.48,49.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:51.48,53.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:55.49,57.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:59.46,61.14 2 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:64.2,65.14 2 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:68.2,68.11 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:71.2,71.17 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:61.14,63.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:65.14,67.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:68.11,70.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:73.54,75.14 2 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:78.2,79.14 2 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:82.2,82.11 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:85.2,85.17 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:75.14,77.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:79.14,81.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:82.11,84.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:88.52,90.14 2 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:93.2,94.14 2 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:97.2,97.11 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:100.2,100.17 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:90.14,92.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:94.14,96.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:97.11,99.3 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:103.48,105.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:107.48,109.2 1 0 +github.com/ethereum/go-ethereum/core/vm/memory_table.go:111.45,113.2 1 0 +github.com/ethereum/go-ethereum/core/vm/opcodes.go:27.32,28.12 1 0 +github.com/ethereum/go-ethereum/core/vm/opcodes.go:32.2,32.14 1 0 +github.com/ethereum/go-ethereum/core/vm/opcodes.go:29.253,30.14 1 0 +github.com/ethereum/go-ethereum/core/vm/opcodes.go:387.34,389.19 2 0 +github.com/ethereum/go-ethereum/core/vm/opcodes.go:393.2,393.12 1 0 +github.com/ethereum/go-ethereum/core/vm/opcodes.go:389.19,391.3 1 0 +github.com/ethereum/go-ethereum/core/vm/opcodes.go:543.36,545.2 1 0 +github.com/ethereum/go-ethereum/core/vm/stack.go:27.26,29.3 1 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:39.24,41.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:43.28,46.2 2 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:49.39,51.2 1 0 +github.com/ethereum/go-ethereum/core/vm/stack.go:53.39,56.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:58.42,62.2 3 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:64.28,66.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:68.30,70.2 1 0 +github.com/ethereum/go-ethereum/core/vm/stack.go:72.29,74.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:76.38,78.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:81.43,83.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack.go:86.26,88.22 2 0 +github.com/ethereum/go-ethereum/core/vm/stack.go:95.2,95.30 1 0 +github.com/ethereum/go-ethereum/core/vm/stack.go:88.22,89.31 1 0 +github.com/ethereum/go-ethereum/core/vm/stack.go:89.31,91.4 1 0 +github.com/ethereum/go-ethereum/core/vm/stack.go:92.8,94.3 1 0 +github.com/ethereum/go-ethereum/core/vm/common.go:27.56,28.19 1 0 +github.com/ethereum/go-ethereum/core/vm/common.go:31.2,31.47 1 0 +github.com/ethereum/go-ethereum/core/vm/common.go:28.19,30.3 1 0 +github.com/ethereum/go-ethereum/core/vm/common.go:37.78,39.19 1 0 +github.com/ethereum/go-ethereum/core/vm/common.go:43.2,44.14 2 0 +github.com/ethereum/go-ethereum/core/vm/common.go:47.2,49.28 2 0 +github.com/ethereum/go-ethereum/core/vm/common.go:39.19,41.3 1 0 +github.com/ethereum/go-ethereum/core/vm/common.go:44.14,46.3 1 0 +github.com/ethereum/go-ethereum/core/vm/common.go:54.61,56.20 2 1 +github.com/ethereum/go-ethereum/core/vm/common.go:59.2,60.18 2 1 +github.com/ethereum/go-ethereum/core/vm/common.go:63.2,63.57 1 1 +github.com/ethereum/go-ethereum/core/vm/common.go:56.20,58.3 1 1 +github.com/ethereum/go-ethereum/core/vm/common.go:60.18,62.3 1 1 +github.com/ethereum/go-ethereum/core/vm/common.go:67.37,68.30 1 1 +github.com/ethereum/go-ethereum/core/vm/common.go:72.2,72.25 1 1 +github.com/ethereum/go-ethereum/core/vm/common.go:68.30,70.3 1 0 +github.com/ethereum/go-ethereum/core/vm/common.go:75.29,76.25 1 1 +github.com/ethereum/go-ethereum/core/vm/common.go:81.2,81.13 1 1 +github.com/ethereum/go-ethereum/core/vm/common.go:76.25,77.16 1 1 +github.com/ethereum/go-ethereum/core/vm/common.go:77.16,79.4 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:29.90,33.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:35.90,39.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:41.90,45.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:47.90,51.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:53.91,57.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:59.90,63.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:65.91,69.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:71.90,75.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:77.97,81.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:83.90,87.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:89.89,91.13 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:96.2,96.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:91.13,93.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:93.8,95.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:99.89,101.13 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:106.2,106.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:101.13,103.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:103.8,105.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:109.90,111.14 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:116.2,116.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:111.14,113.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:113.8,115.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:119.90,121.14 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:126.2,126.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:121.14,123.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:123.8,125.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:129.89,131.13 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:136.2,136.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:131.13,133.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:133.8,135.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:139.93,141.16 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:146.2,146.17 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:141.16,143.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:143.8,145.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:149.90,153.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:155.89,159.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:161.90,165.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:167.91,171.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:173.93,175.16 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:180.2,180.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:175.16,177.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:177.8,179.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:183.93,187.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:192.90,195.25 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:200.2,200.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:195.25,197.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:197.8,199.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:206.90,209.25 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:214.2,214.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:209.25,211.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:211.8,213.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:220.90,222.25 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:231.2,233.17 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:222.25,223.24 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:229.3,229.18 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:223.24,225.4 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:225.9,228.4 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:236.96,240.31 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:245.2,249.40 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:253.2,254.17 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:240.31,242.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:242.8,244.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:249.40,251.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:256.94,259.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:261.94,266.2 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:268.93,271.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:272.93,275.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:277.96,281.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:283.99,285.59 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:291.2,291.17 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:285.59,288.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:288.8,290.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:294.99,297.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:299.99,306.14 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:310.2,314.17 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:306.14,308.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:317.101,320.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:322.101,330.14 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:334.2,337.61 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:340.2,341.17 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:330.14,332.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:337.61,339.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:344.98,348.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:350.95,355.2 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:357.95,364.14 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:367.2,370.17 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:364.14,366.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:373.98,382.14 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:385.2,389.17 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:382.14,384.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:418.98,421.44 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:426.2,426.17 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:421.44,423.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:423.8,425.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:429.95,433.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:435.96,438.14 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:442.2,444.17 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:449.2,449.37 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:454.2,454.17 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:438.14,441.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:444.17,446.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:446.8,448.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:449.37,451.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:451.8,453.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:457.95,460.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:462.96,466.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:468.93,472.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:474.97,478.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:480.93,484.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:486.95,489.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:491.90,494.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:496.92,501.2 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:503.93,508.2 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:510.94,514.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:516.92,522.2 5 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:524.93,525.26 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:528.2,532.17 4 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:525.26,527.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:535.91,536.51 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:539.2,540.41 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:543.2,544.17 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:536.51,538.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:540.41,542.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:547.92,548.51 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:551.2,552.20 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:558.2,558.17 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:548.51,550.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:552.20,553.42 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:556.3,556.25 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:553.42,555.4 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:561.95,563.2 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:565.89,568.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:570.92,573.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:575.90,578.2 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:580.93,581.26 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:584.2,590.41 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:594.2,599.21 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:603.2,608.78 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:615.2,618.36 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:622.2,623.17 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:581.26,583.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:590.41,592.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:599.21,601.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:608.78,610.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:610.8,610.60 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:610.60,612.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:612.8,614.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:618.36,621.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:626.94,627.26 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:630.2,645.25 6 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:648.2,651.19 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:656.2,659.36 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:663.2,664.17 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:627.26,629.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:645.25,647.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:651.19,653.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:653.8,655.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:659.36,662.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:667.91,679.45 7 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:682.2,686.21 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:691.2,693.16 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:698.2,699.47 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:703.2,706.17 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:679.45,681.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:686.21,689.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:693.16,695.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:695.8,697.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:699.47,702.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:709.95,723.21 8 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:728.2,729.16 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:734.2,735.47 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:739.2,742.17 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:723.21,726.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:729.16,731.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:731.8,733.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:735.47,738.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:745.99,758.16 8 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:763.2,764.47 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:768.2,771.17 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:758.16,760.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:760.8,762.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:764.47,767.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:774.97,787.16 8 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:792.2,793.47 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:797.2,800.17 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:787.16,789.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:789.8,791.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:793.47,796.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:803.93,808.2 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:810.93,816.2 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:818.96,820.2 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:822.91,824.2 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:826.99,827.26 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:830.2,834.27 5 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:838.2,838.26 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:827.26,829.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:834.27,837.3 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:844.38,845.92 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:845.92,846.27 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:849.3,852.29 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:857.3,867.18 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:846.27,848.4 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:852.29,855.4 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:872.92,878.19 3 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:883.2,883.17 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:878.19,880.3 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:880.8,882.3 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:887.60,888.92 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:888.92,892.28 3 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:896.3,897.37 2 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:901.3,906.18 4 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:892.28,894.4 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:897.37,899.4 1 0 +github.com/ethereum/go-ethereum/core/vm/instructions.go:911.40,912.92 1 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:912.92,915.3 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:919.41,922.92 2 1 +github.com/ethereum/go-ethereum/core/vm/instructions.go:922.92,925.3 2 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:68.62,70.26 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:104.2,107.3 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:70.26,71.10 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:93.3,93.37 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:72.31,73.40 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:74.32,75.41 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:76.32,77.41 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:78.34,79.43 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:80.40,81.49 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:82.35,83.44 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:84.32,85.49 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:86.32,87.51 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:88.35,89.44 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:90.11,91.43 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:93.37,95.48 2 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:100.4,100.25 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:95.48,99.5 2 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:116.104,120.15 2 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:124.2,124.30 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:131.2,134.29 2 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:138.2,161.15 2 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:164.2,166.18 2 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:181.2,181.6 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:242.2,242.25 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:246.2,246.17 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:120.15,120.33 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:124.30,126.16 2 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:126.16,126.39 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:134.29,136.3 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:161.15,163.3 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:166.18,167.16 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:167.16,168.18 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:168.18,169.16 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:169.16,171.6 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:171.11,173.6 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:181.6,182.19 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:188.3,192.53 4 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:197.3,197.29 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:200.3,200.34 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:230.3,230.19 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:235.3,236.17 2 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:239.3,239.7 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:182.19,185.4 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:192.53,194.4 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:194.9,194.39 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:194.39,196.4 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:197.29,199.4 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:200.34,207.35 2 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:220.4,223.51 4 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:226.4,226.22 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:207.35,209.17 2 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:214.5,214.79 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:209.17,211.6 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:214.79,216.6 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:223.51,225.5 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:226.22,228.5 1 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:230.19,233.4 2 0 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:236.17,237.9 1 1 +github.com/ethereum/go-ethereum/core/vm/interpreter.go:242.25,244.3 1 1 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:27.55,28.106 1 1 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:28.106,30.52 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:34.3,41.103 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:52.3,54.23 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:59.3,60.26 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:71.3,71.34 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:78.3,78.24 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:94.3,94.55 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:30.52,32.4 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:41.103,45.20 3 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:45.20,49.86 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:54.23,58.4 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:60.26,61.35 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:64.4,64.32 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:69.4,69.83 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:61.35,63.5 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:64.32,66.5 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:71.34,72.34 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:72.34,74.5 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:74.10,74.39 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:74.39,76.5 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:78.24,79.35 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:79.35,83.5 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:83.10,90.5 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:103.114,107.92 3 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:113.2,113.47 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:107.92,112.3 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:121.120,124.16 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:127.2,129.44 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:138.2,138.17 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:124.16,126.3 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:129.44,133.121 3 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:136.3,136.18 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:133.121,135.4 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:148.121,151.44 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:157.2,157.15 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:151.44,156.3 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:160.67,161.106 1 1 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:161.106,168.18 4 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:181.3,182.31 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:189.3,190.29 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:168.18,172.34 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:172.34,174.5 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:182.31,184.4 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:223.57,224.110 1 1 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:243.2,243.16 1 1 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:224.110,229.48 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:235.3,235.91 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:238.3,238.69 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:241.3,241.18 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:229.48,233.4 2 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:235.91,237.4 1 0 +github.com/ethereum/go-ethereum/core/vm/operations_acl.go:238.69,240.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas.go:37.95,38.14 1 0 +github.com/ethereum/go-ethereum/core/vm/gas.go:48.2,48.26 1 0 +github.com/ethereum/go-ethereum/core/vm/gas.go:52.2,52.31 1 0 +github.com/ethereum/go-ethereum/core/vm/gas.go:38.14,44.54 3 0 +github.com/ethereum/go-ethereum/core/vm/gas.go:44.54,46.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas.go:48.26,50.3 1 0 +github.com/ethereum/go-ethereum/core/vm/eips.go:39.49,41.9 2 1 +github.com/ethereum/go-ethereum/core/vm/eips.go:44.2,45.12 2 1 +github.com/ethereum/go-ethereum/core/vm/eips.go:41.9,43.3 1 0 +github.com/ethereum/go-ethereum/core/vm/eips.go:48.32,51.2 2 0 +github.com/ethereum/go-ethereum/core/vm/eips.go:52.34,54.28 2 0 +github.com/ethereum/go-ethereum/core/vm/eips.go:57.2,58.13 2 0 +github.com/ethereum/go-ethereum/core/vm/eips.go:54.28,56.3 1 0 +github.com/ethereum/go-ethereum/core/vm/eips.go:66.32,79.2 4 1 +github.com/ethereum/go-ethereum/core/vm/eips.go:81.98,85.2 3 0 +github.com/ethereum/go-ethereum/core/vm/eips.go:89.32,97.2 1 1 +github.com/ethereum/go-ethereum/core/vm/eips.go:100.94,104.2 3 0 +github.com/ethereum/go-ethereum/core/vm/eips.go:107.32,110.2 2 1 +github.com/ethereum/go-ethereum/core/vm/eips.go:114.32,148.2 21 1 +github.com/ethereum/go-ethereum/core/vm/eips.go:154.32,157.2 2 1 +github.com/ethereum/go-ethereum/core/vm/eips.go:161.32,169.2 1 1 +github.com/ethereum/go-ethereum/core/vm/eips.go:172.94,176.2 3 0 +github.com/ethereum/go-ethereum/core/vm/errors.go:52.44,54.2 1 0 +github.com/ethereum/go-ethereum/core/vm/errors.go:63.43,65.2 1 0 +github.com/ethereum/go-ethereum/core/vm/errors.go:72.43,72.97 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:44.77,46.9 2 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:56.2,57.14 2 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:47.31,48.43 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:49.33,50.45 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:51.34,52.46 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:53.10,54.46 1 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:128.123,139.2 3 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:143.57,146.2 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:150.26,152.2 1 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:155.34,157.2 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:160.47,162.2 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:168.149,170.45 1 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:174.2,174.89 1 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:177.2,180.30 3 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:196.2,199.22 2 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:214.2,214.18 1 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:235.2,235.16 1 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:244.2,244.22 1 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:170.45,172.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:174.89,176.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:180.30,181.68 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:194.3,194.34 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:181.68,183.24 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:192.4,192.24 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:183.24,184.23 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:184.23,187.6 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:187.11,190.6 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:199.22,200.21 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:200.21,202.53 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:202.53,204.5 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:205.9,208.32 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:208.32,210.5 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:214.18,216.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:216.8,220.21 2 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:220.21,222.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:222.9,230.4 5 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:235.16,237.34 2 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:237.34,239.4 1 1 +github.com/ethereum/go-ethereum/core/vm/evm.go:254.153,256.45 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:263.2,263.68 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:266.2,269.22 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:277.2,277.59 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:288.2,288.16 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:294.2,294.22 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:256.45,258.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:263.68,265.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:269.22,271.31 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:271.31,273.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:277.59,279.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:279.8,287.3 5 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:288.16,290.34 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:290.34,292.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:302.141,304.45 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:307.2,310.22 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:318.2,318.59 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:328.2,328.16 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:334.2,334.22 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:304.45,306.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:310.22,312.31 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:312.31,314.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:318.59,320.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:320.8,327.3 5 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:328.16,330.34 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:330.34,332.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:341.139,343.45 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:351.2,360.22 3 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:367.2,367.59 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:384.2,384.16 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:390.2,390.22 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:343.45,345.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:360.22,362.31 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:362.31,364.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:367.59,369.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:369.8,383.3 5 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:384.16,386.34 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:386.34,388.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:398.42,399.31 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:402.2,402.15 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:399.31,401.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:406.174,409.45 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:412.2,412.68 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:415.2,416.21 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:419.2,422.29 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:426.2,427.110 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:431.2,433.29 3 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:436.2,443.22 4 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:451.2,456.76 3 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:461.2,461.78 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:469.2,469.16 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:481.2,481.79 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:488.2,488.22 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:495.2,495.40 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:409.45,411.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:412.68,414.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:416.21,418.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:422.29,424.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:427.110,429.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:433.29,435.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:443.22,444.21 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:444.21,446.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:446.9,448.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:456.76,458.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:461.78,463.3 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:469.16,471.37 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:471.37,473.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:473.9,475.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:481.79,483.34 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:483.34,485.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:488.22,489.21 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:489.21,491.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:491.9,493.4 1 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:499.158,502.2 2 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:508.182,512.2 3 0 +github.com/ethereum/go-ethereum/core/vm/evm.go:515.51,515.77 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:29.68,30.21 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:38.2,38.31 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:41.2,44.36 3 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:55.2,55.15 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:30.21,32.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:38.31,40.3 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:44.36,54.3 7 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:65.44,66.106 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:66.106,69.17 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:73.3,74.15 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:78.3,78.82 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:82.3,82.57 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:85.3,85.18 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:69.17,71.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:74.15,76.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:78.82,80.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:82.57,84.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:96.108,104.69 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:134.2,135.22 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:138.2,139.25 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:148.2,148.33 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:155.2,155.23 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:162.2,162.38 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:104.69,110.10 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:111.52,112.35 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:113.52,115.37 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:116.11,117.37 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:135.22,137.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:139.25,140.34 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:143.3,143.31 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:146.3,146.39 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:140.34,142.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:143.31,145.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:148.33,149.33 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:149.33,151.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:151.9,151.38 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:151.38,153.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:155.23,156.34 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:156.34,158.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:158.9,160.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:178.115,180.51 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:184.2,190.22 3 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:193.2,194.25 2 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:203.2,203.33 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:210.2,210.23 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:217.2,217.36 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:180.51,182.3 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:190.22,192.3 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:194.25,195.34 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:198.3,198.31 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:201.3,201.43 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:195.34,197.4 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:198.31,200.4 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:203.33,204.33 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:204.33,206.4 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:206.9,206.38 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:206.38,208.4 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:210.23,211.34 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:211.34,213.4 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:213.9,215.4 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:220.35,221.106 1 1 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:221.106,223.15 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:227.3,228.17 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:232.3,232.65 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:235.3,235.72 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:239.3,240.89 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:243.3,243.65 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:246.3,246.18 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:223.15,225.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:228.17,230.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:232.65,234.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:235.72,237.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:240.89,242.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:243.65,245.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:250.111,252.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:255.2,256.14 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:259.2,259.94 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:262.2,262.58 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:265.2,265.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:252.16,254.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:256.14,258.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:259.94,261.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:262.58,264.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:271.116,273.2 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:284.109,286.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:289.2,290.14 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:293.2,293.94 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:296.2,296.58 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:299.2,299.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:286.16,288.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:290.14,292.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:293.94,295.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:296.58,298.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:302.113,309.64 3 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:312.2,312.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:309.64,311.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:315.111,322.64 3 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:325.2,325.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:322.64,324.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:328.106,334.29 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:341.2,341.20 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:344.2,345.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:348.2,349.60 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:353.2,354.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:357.2,357.66 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:360.2,360.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:334.29,335.51 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:335.51,337.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:338.8,338.40 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:338.40,340.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:341.20,343.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:345.16,347.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:349.60,351.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:354.16,356.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:357.66,359.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:363.110,365.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:368.2,372.31 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:375.2,375.60 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:378.2,379.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:382.2,382.66 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:385.2,385.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:365.16,367.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:372.31,374.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:375.60,377.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:379.16,381.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:382.66,384.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:388.114,390.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:393.2,394.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:397.2,398.66 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:401.2,401.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:390.16,392.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:394.16,396.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:398.66,400.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:404.112,406.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:409.2,410.16 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:413.2,414.66 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:417.2,417.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:406.16,408.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:410.16,412.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:414.66,416.3 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:420.114,423.29 2 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:437.2,437.50 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:440.2,440.17 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:423.29,427.30 3 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:427.30,429.92 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:429.92,431.5 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:432.9,432.41 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:432.41,434.4 1 0 +github.com/ethereum/go-ethereum/core/vm/gas_table.go:437.50,439.3 1 0 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:63.39,64.24 1 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:78.2,78.11 1 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:64.24,65.16 1 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:74.3,74.51 1 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:65.16,66.47 1 0 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:74.51,75.90 1 0 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:81.41,90.2 3 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:94.42,99.2 4 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:103.42,107.2 3 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:111.44,119.2 5 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:123.50,158.2 7 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:162.45,194.2 6 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:197.50,202.2 3 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:205.52,215.2 9 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:219.45,230.2 3 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:234.44,1039.28 2 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:1045.2,1045.22 1 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:1039.28,1040.19 1 1 +github.com/ethereum/go-ethereum/core/vm/jump_table.go:1040.19,1042.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:41.47,41.78 1 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:66.96,69.42 2 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:78.2,82.10 3 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:69.42,72.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:72.8,74.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:85.58,89.46 2 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:93.2,93.39 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:96.2,96.24 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:89.46,91.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:93.39,95.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:101.46,103.23 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:109.2,109.35 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:126.2,126.23 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:129.2,129.38 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:103.23,105.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:109.35,112.13 2 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:119.3,120.37 2 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:112.13,117.4 2 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:126.23,128.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:134.43,142.2 4 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:145.43,146.29 1 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:150.2,150.13 1 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:146.29,148.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:157.44,159.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:162.49,163.17 1 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:166.2,167.13 2 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:163.17,165.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:171.45,173.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:176.37,178.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contract.go:182.85,186.2 3 1 +github.com/ethereum/go-ethereum/core/vm/contract.go:190.88,194.2 3 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:116.13,117.47 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:120.2,120.47 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:123.2,123.46 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:126.2,126.44 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:117.47,119.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:120.47,122.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:123.46,125.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:126.44,128.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:132.61,133.9 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:134.22,135.36 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:136.24,137.38 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:138.25,139.39 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:140.10,141.39 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:150.131,152.27 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:155.2,157.33 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:152.27,154.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:163.54,165.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:167.55,179.79 6 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:184.2,190.16 5 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:195.2,195.72 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:179.79,181.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:190.16,192.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:205.55,207.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:208.56,211.2 2 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:220.58,222.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:223.59,227.2 3 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:236.53,238.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:239.51,241.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:274.48,275.9 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:291.2,291.10 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:276.25,277.14 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:278.27,283.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:284.10,289.4 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:295.54,301.21 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:307.2,308.53 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:318.2,319.44 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:322.2,323.27 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:327.2,330.15 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:355.2,359.23 4 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:362.2,362.21 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:301.21,303.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:303.8,305.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:308.53,310.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:310.8,311.28 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:311.28,313.4 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:313.9,315.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:319.44,321.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:323.27,326.3 2 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:330.15,346.24 6 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:350.3,350.25 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:353.3,353.22 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:346.24,348.4 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:350.25,352.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:359.23,361.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:365.55,371.21 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:377.2,377.33 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:381.2,386.23 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:390.2,390.80 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:371.21,373.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:373.8,375.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:377.33,379.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:386.23,389.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:395.52,397.45 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:400.2,400.15 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:397.45,399.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:405.52,407.45 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:410.2,410.15 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:407.45,409.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:415.48,417.16 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:420.2,421.16 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:424.2,426.27 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:417.16,419.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:421.16,423.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:434.61,436.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:438.62,440.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:447.62,449.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:451.63,453.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:457.54,459.16 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:462.2,464.27 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:459.16,461.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:472.67,474.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:476.68,478.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:485.68,487.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:489.69,491.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:506.52,508.24 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:512.2,516.39 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:529.2,529.32 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:532.2,532.25 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:508.24,510.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:516.39,518.17 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:521.3,522.17 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:525.3,526.21 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:518.17,520.4 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:522.17,524.4 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:529.32,531.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:540.65,542.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:544.66,546.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:553.66,555.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:557.67,559.2 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:563.52,566.38 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:569.2,569.52 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:566.38,568.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:583.53,585.38 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:588.2,588.85 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:592.2,600.25 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:604.2,604.26 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:608.2,615.25 5 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:619.2,619.20 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:585.38,587.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:588.85,590.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:600.25,603.3 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:604.26,607.3 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:615.25,618.3 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:633.58,635.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:637.59,641.23 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:644.2,651.54 4 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:655.2,655.54 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:660.2,664.30 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:641.23,643.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:651.54,653.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:655.54,657.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:671.58,673.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:675.59,679.23 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:682.2,689.54 4 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:693.2,700.30 4 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:679.23,681.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:689.54,691.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:707.63,710.12 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:715.2,716.65 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:722.2,722.64 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:710.12,713.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:716.65,718.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:718.8,720.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:725.64,730.44 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:733.2,741.25 5 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:753.2,757.30 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:730.44,732.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:741.25,745.63 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:749.3,749.51 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:745.63,747.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:764.58,766.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:768.59,772.23 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:775.2,783.54 5 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:787.2,787.54 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:792.2,795.30 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:772.23,774.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:783.54,785.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:787.54,789.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:802.58,804.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:806.59,810.23 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:813.2,820.54 4 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:824.2,831.30 4 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:810.23,812.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:820.54,822.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:838.63,841.12 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:846.2,847.65 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:853.2,853.64 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:841.12,844.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:847.65,849.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:849.8,851.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:856.64,861.44 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:864.2,872.25 5 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:884.2,888.30 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:861.44,863.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:872.25,876.63 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:880.3,880.51 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:876.63,878.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:895.60,897.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:899.61,907.44 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:912.2,916.25 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:944.2,947.15 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:950.2,950.17 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:907.44,909.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:916.25,922.17 4 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:926.3,927.17 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:933.3,933.32 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:936.3,936.32 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:941.3,941.20 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:922.17,924.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:927.17,929.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:933.32,935.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:936.32,938.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:947.15,949.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:955.60,956.19 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:960.2,960.26 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:965.2,967.17 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:956.19,958.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:960.26,961.26 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:961.26,963.4 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:974.58,976.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:978.59,982.22 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:987.2,988.16 2 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:993.2,997.16 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1002.2,1002.30 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:982.22,984.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:988.16,990.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:997.16,999.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1009.58,1011.2 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1013.59,1017.23 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1022.2,1024.16 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1027.2,1029.16 3 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1032.2,1039.16 4 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1044.2,1044.30 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1017.23,1019.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1024.16,1026.3 1 0 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1029.16,1031.3 1 1 +github.com/ethereum/go-ethereum/core/vm/contracts.go:1039.16,1041.3 1 1 +github.com/ethereum/go-ethereum/core/vm/stack_table.go:23.30,25.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack_table.go:26.30,28.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack_table.go:30.29,32.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack_table.go:33.29,35.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack_table.go:37.34,39.2 1 1 +github.com/ethereum/go-ethereum/core/vm/stack_table.go:40.35,42.2 1 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:33.37,35.2 1 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:37.50,40.31 3 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:40.31,42.3 1 0 +github.com/ethereum/go-ethereum/core/vm/analysis.go:45.37,49.2 3 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:51.38,56.2 4 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:59.50,61.2 1 0 +github.com/ethereum/go-ethereum/core/vm/analysis.go:64.37,70.2 2 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:75.51,76.47 1 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:117.2,117.13 1 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:76.47,79.32 3 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:82.3,83.19 2 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:93.3,93.18 1 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:79.32,80.12 1 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:83.19,84.39 1 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:88.4,88.37 1 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:84.39,87.5 2 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:88.37,91.5 2 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:94.10,96.11 2 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:97.10,99.11 2 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:100.10,102.11 2 1 +github.com/ethereum/go-ethereum/core/vm/analysis.go:103.10,105.11 2 0 +github.com/ethereum/go-ethereum/core/vm/analysis.go:106.10,108.11 2 0 +github.com/ethereum/go-ethereum/core/vm/analysis.go:109.10,111.11 2 0 +github.com/ethereum/go-ethereum/core/vm/analysis.go:112.10,114.11 2 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:122.78,128.12 2 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:133.2,133.10 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:128.12,130.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:130.8,132.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:138.48,140.28 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:143.2,146.49 4 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:149.2,149.35 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:140.28,142.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:146.49,148.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:153.72,156.2 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:159.51,160.28 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:163.2,166.25 4 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:160.28,162.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:171.50,173.9 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:174.18,175.13 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:176.24,179.40 2 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:182.3,183.27 2 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:184.10,187.17 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:190.3,190.26 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:179.40,181.4 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:187.17,189.4 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:196.51,197.31 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:208.2,208.25 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:197.31,201.17 3 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:204.3,205.28 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:201.17,203.4 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:212.47,213.17 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:216.2,216.14 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:213.17,215.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:217.42,220.17 3 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:223.3,224.28 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:225.10,226.31 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:220.17,222.4 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:230.53,233.2 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:235.61,236.9 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:246.2,246.12 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:237.66,238.37 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:239.62,240.33 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:241.52,242.34 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:243.10,244.68 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:249.43,250.27 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:256.2,256.20 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:250.27,251.38 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:254.3,254.36 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:251.38,253.4 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:261.45,264.29 3 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:267.2,267.13 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:264.29,266.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:276.59,282.29 6 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:287.2,289.18 3 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:282.29,283.44 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:283.44,285.4 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:294.60,297.16 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:303.2,303.56 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:306.2,306.58 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:309.2,309.42 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:297.16,299.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:303.56,305.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:306.58,308.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:312.70,314.55 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:317.2,317.74 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:320.2,322.34 3 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:325.2,327.12 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:314.55,316.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:317.74,319.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:322.34,324.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:330.72,332.55 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:335.2,335.74 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:338.2,343.34 6 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:346.2,348.12 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:332.55,334.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:335.74,337.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:343.34,345.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:351.72,353.55 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:356.2,356.74 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:359.2,365.34 7 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:368.2,368.12 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:353.55,355.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:356.74,358.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:365.34,367.3 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:375.30,375.48 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:378.56,381.16 3 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:382.20,383.22 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:384.24,386.22 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:387.24,389.22 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:390.10,390.10 0 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:399.118,403.25 3 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:406.2,406.31 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:438.2,438.12 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:403.25,405.3 1 0 +github.com/ethereum/go-ethereum/core/types/receipt.go:406.31,417.25 6 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:423.3,423.13 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:429.3,429.40 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:417.25,421.4 2 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:423.13,425.4 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:425.9,427.4 1 1 +github.com/ethereum/go-ethereum/core/types/receipt.go:429.40,436.4 6 1 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:25.60,29.2 3 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:32.57,34.2 1 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:37.39,39.2 1 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:43.108,55.37 8 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:60.2,60.41 1 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:68.2,68.12 1 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:55.37,57.3 1 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:60.41,67.3 6 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:73.104,78.33 2 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:78.33,85.3 6 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:89.55,92.51 2 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:96.2,96.15 1 0 +github.com/ethereum/go-ethereum/core/types/bor_receipt.go:92.51,94.3 1 0 +github.com/ethereum/go-ethereum/core/types/log.go:86.44,89.2 2 1 +github.com/ethereum/go-ethereum/core/types/log.go:92.46,95.16 3 1 +github.com/ethereum/go-ethereum/core/types/log.go:98.2,98.12 1 1 +github.com/ethereum/go-ethereum/core/types/log.go:95.16,97.3 1 1 +github.com/ethereum/go-ethereum/core/types/log.go:106.54,109.2 2 1 +github.com/ethereum/go-ethereum/core/types/log.go:114.56,116.16 2 1 +github.com/ethereum/go-ethereum/core/types/log.go:119.2,121.16 3 1 +github.com/ethereum/go-ethereum/core/types/log.go:139.2,139.12 1 1 +github.com/ethereum/go-ethereum/core/types/log.go:116.16,118.3 1 1 +github.com/ethereum/go-ethereum/core/types/log.go:121.16,127.3 1 1 +github.com/ethereum/go-ethereum/core/types/log.go:127.8,131.17 3 0 +github.com/ethereum/go-ethereum/core/types/log.go:131.17,137.4 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:17.47,56.2 20 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:59.52,79.52 3 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:82.2,82.27 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:85.2,86.26 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:89.2,90.25 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:93.2,94.21 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:97.2,98.23 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:101.2,102.28 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:105.2,106.22 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:109.2,110.27 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:113.2,114.23 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:117.2,118.25 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:121.2,122.24 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:125.2,126.21 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:129.2,130.22 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:133.2,134.26 2 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:137.2,137.22 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:140.2,140.24 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:143.2,143.12 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:79.52,81.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:82.27,84.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:86.26,88.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:90.25,92.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:94.21,96.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:98.23,100.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:102.28,104.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:106.22,108.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:110.27,112.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:114.23,116.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:118.25,120.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:122.24,124.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:126.21,128.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:130.22,132.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:134.26,136.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:137.22,139.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_json.go:140.24,142.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:54.53,61.30 4 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:98.2,98.27 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:62.17,71.31 9 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:72.21,83.31 11 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:84.21,96.31 12 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:102.57,104.52 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:109.2,110.18 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:271.2,274.12 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:104.52,106.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:111.20,114.20 3 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:117.3,117.23 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:120.3,121.26 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:124.3,125.21 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:128.3,129.23 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:132.3,133.22 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:136.3,137.19 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:140.3,141.19 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:144.3,145.19 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:148.3,150.20 3 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:156.24,160.28 3 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:163.3,163.25 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:166.3,167.20 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:170.3,170.23 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:173.3,174.26 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:177.3,178.21 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:181.3,182.23 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:185.3,186.22 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:189.3,190.19 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:193.3,194.19 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:197.3,198.19 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:201.3,203.20 3 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:209.24,213.28 3 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:216.3,216.25 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:219.3,220.20 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:223.3,223.23 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:226.3,227.38 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:230.3,231.30 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:234.3,235.21 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:238.3,239.23 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:242.3,243.22 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:246.3,247.19 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:250.3,251.19 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:254.3,255.19 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:258.3,260.20 3 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:266.10,267.31 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:114.20,116.4 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:117.23,119.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:121.26,123.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:125.21,127.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:129.23,131.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:133.22,135.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:137.19,139.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:141.19,143.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:145.19,147.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:150.20,151.74 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:151.74,153.5 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:160.28,162.4 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:163.25,165.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:167.20,169.4 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:170.23,172.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:174.26,176.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:178.21,180.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:182.23,184.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:186.22,188.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:190.19,192.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:194.19,196.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:198.19,200.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:203.20,204.75 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:204.75,206.5 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:213.28,215.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:216.25,218.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:220.20,222.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:223.23,225.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:227.38,229.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:231.30,233.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:235.21,237.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:239.23,241.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:243.22,245.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:247.19,249.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:251.19,253.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:255.19,257.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:260.20,261.75 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:261.75,263.5 1 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:45.35,49.2 3 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:53.36,54.21 1 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:57.2,57.37 1 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:54.21,55.66 1 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:61.31,63.2 1 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:66.43,71.2 4 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:76.31,78.2 1 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:81.31,83.2 1 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:86.40,91.2 2 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:94.46,96.2 1 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:99.51,101.2 1 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:104.43,107.35 3 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:115.2,115.12 1 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:107.35,108.36 1 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:108.36,110.33 2 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:110.33,112.5 1 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:119.36,122.27 3 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:128.2,128.15 1 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:122.27,124.32 2 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:124.32,126.4 1 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:132.33,136.2 3 0 +github.com/ethereum/go-ethereum/core/types/bloom9.go:139.84,155.2 12 1 +github.com/ethereum/go-ethereum/core/types/bloom9.go:158.53,160.2 1 0 +github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:11.56,15.24 4 0 +github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:23.2,26.18 4 0 +github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:15.24,17.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:17.8,18.31 1 0 +github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:21.3,21.29 1 0 +github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:18.31,20.4 1 0 +github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:13.52,22.2 5 1 +github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:25.57,31.52 3 1 +github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:34.2,34.24 1 1 +github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:37.2,38.28 2 1 +github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:41.2,42.12 2 1 +github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:31.52,33.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:34.24,36.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:38.28,40.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:11.50,21.27 10 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:29.2,29.23 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:37.2,44.11 8 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:54.2,55.18 2 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:21.27,23.3 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:23.8,24.34 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:27.3,27.32 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:24.34,26.4 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:29.23,31.3 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:31.8,32.30 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:35.3,35.28 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:32.30,34.4 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:44.11,45.25 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:45.25,47.4 1 0 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:47.9,48.32 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:51.4,51.30 1 1 +github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:48.32,50.5 1 0 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:16.44,39.2 12 0 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:42.49,55.52 3 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:58.2,58.24 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:61.2,62.23 2 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:65.2,66.21 2 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:69.2,70.28 2 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:73.2,73.23 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:76.2,77.24 2 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:80.2,80.26 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:83.2,83.22 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:86.2,86.24 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:89.2,89.12 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:55.52,57.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:58.24,60.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:62.23,64.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:66.21,68.3 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:70.28,72.3 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:73.23,75.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:77.24,79.3 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:80.26,82.3 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:83.22,85.3 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_json.go:86.24,88.3 1 1 +github.com/ethereum/go-ethereum/core/types/gen_log_rlp.go:11.50,16.35 5 1 +github.com/ethereum/go-ethereum/core/types/gen_log_rlp.go:19.2,22.18 4 1 +github.com/ethereum/go-ethereum/core/types/gen_log_rlp.go:16.35,18.3 1 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:31.26,31.62 1 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:36.26,36.54 1 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:40.45,47.2 6 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:51.66,59.2 7 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:77.75,84.2 3 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:87.67,97.47 5 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:102.2,102.20 1 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:107.2,107.37 1 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:112.2,112.22 1 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:97.47,101.3 3 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:102.20,106.3 3 1 +github.com/ethereum/go-ethereum/core/types/hashing.go:107.37,111.3 3 1 +github.com/ethereum/go-ethereum/core/types/legacy.go:28.55,30.50 2 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:33.2,34.50 2 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:37.2,39.50 2 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:42.2,42.67 1 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:30.50,32.3 1 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:34.50,36.3 1 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:39.50,41.3 1 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:47.62,49.56 2 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:52.2,52.37 1 0 +github.com/ethereum/go-ethereum/core/types/legacy.go:49.56,51.3 1 0 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:37.40,39.27 2 0 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:42.2,42.12 1 0 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:39.27,41.3 1 0 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:59.39,75.21 3 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:78.2,78.23 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:81.2,81.24 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:84.2,84.17 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:87.2,87.17 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:90.2,90.17 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:93.2,93.12 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:75.21,77.3 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:78.23,80.3 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:81.24,83.3 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:84.17,86.3 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:87.17,89.3 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:90.17,92.3 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:97.49,97.76 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:98.49,98.70 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:99.49,99.73 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:100.49,100.67 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:101.49,101.66 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:102.49,102.71 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:103.49,103.71 1 0 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:104.49,104.71 1 0 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:105.49,105.68 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:106.49,106.68 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:107.49,107.65 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:109.65,111.2 1 1 +github.com/ethereum/go-ethereum/core/types/access_list_tx.go:113.71,115.2 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:43.39,60.21 3 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:63.2,63.23 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:66.2,66.25 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:69.2,69.25 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:72.2,72.17 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:75.2,75.17 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:78.2,78.17 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:81.2,81.12 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:60.21,62.3 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:63.23,65.3 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:66.25,68.3 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:69.25,71.3 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:72.17,74.3 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:75.17,77.3 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:78.17,80.3 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:85.49,85.76 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:86.49,86.70 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:87.49,87.73 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:88.49,88.67 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:89.49,89.66 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:90.49,90.72 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:91.49,91.72 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:92.49,92.72 1 0 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:93.49,93.68 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:94.49,94.68 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:95.49,95.65 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:97.65,99.2 1 1 +github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:101.71,103.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:40.74,42.9 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:54.2,54.15 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:43.36,44.43 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:45.36,46.44 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:47.36,48.43 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:49.39,50.29 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:51.10,52.28 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:64.54,65.27 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:76.2,76.26 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:65.27,66.32 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:69.3,69.32 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:72.3,72.32 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:66.32,68.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:69.32,71.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:72.32,74.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:86.54,87.20 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:90.2,90.33 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:87.20,89.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:94.85,97.16 3 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:100.2,100.33 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:97.16,99.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:104.86,108.16 4 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:111.2,111.33 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:108.16,110.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:116.81,118.16 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:121.2,121.11 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:118.16,119.13 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:131.69,132.37 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:142.2,143.16 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:146.2,147.18 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:132.37,137.36 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:137.36,139.4 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:143.16,145.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:180.47,182.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:184.71,185.35 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:188.2,192.38 3 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:195.2,195.48 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:185.35,187.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:192.38,194.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:198.45,201.2 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:203.98,205.9 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:210.2,210.70 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:213.2,215.21 3 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:205.9,207.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:210.70,212.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:220.57,221.35 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:224.2,236.5 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:221.35,223.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:243.48,245.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:247.43,249.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:251.46,254.2 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:256.72,258.19 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:272.2,272.38 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:275.2,275.48 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:259.20,260.22 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:263.3,264.17 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:265.24,268.42 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:269.10,270.49 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:260.22,262.4 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:272.38,274.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:278.99,279.35 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:293.2,293.21 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:280.17,281.49 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:282.21,285.71 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:288.3,289.33 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:290.10,291.46 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:285.71,287.4 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:298.58,299.19 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:300.20,309.5 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:310.24,322.6 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:323.10,328.23 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:338.53,339.20 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:342.2,345.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:339.20,341.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:348.42,350.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:352.45,355.2 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:359.71,360.31 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:363.2,363.21 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:366.2,366.38 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:369.2,372.48 4 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:360.31,362.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:363.21,365.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:366.38,368.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:377.98,378.31 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:381.2,382.27 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:386.2,386.21 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:378.31,380.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:382.27,385.3 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:391.57,401.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:407.45,409.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:411.48,414.2 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:418.102,420.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:422.75,423.31 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:426.2,427.49 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:423.31,425.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:432.44,434.2 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:436.47,439.2 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:441.74,442.31 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:445.2,446.50 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:442.31,444.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:451.101,452.31 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:455.2,456.21 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:452.31,454.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:461.60,470.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:472.53,473.40 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:476.2,479.16 4 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:473.40,474.100 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:482.99,483.21 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:486.2,487.57 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:491.2,498.16 7 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:501.2,501.34 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:504.2,506.18 3 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:483.21,485.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:487.57,489.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:498.16,500.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:501.34,503.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:510.41,511.22 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:518.2,519.32 2 0 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:511.22,513.25 2 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:516.3,516.46 1 1 +github.com/ethereum/go-ethereum/core/types/transaction_signing.go:513.25,515.4 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:38.133,47.2 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:51.119,59.2 1 0 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:62.35,75.21 2 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:78.2,78.24 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:81.2,81.17 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:84.2,84.17 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:87.2,87.17 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:90.2,90.12 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:75.21,77.3 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:78.24,80.3 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:81.17,83.3 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:84.17,86.3 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:87.17,89.3 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:94.45,94.68 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:95.45,95.75 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:96.45,96.59 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:97.45,97.63 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:98.45,98.62 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:99.45,99.67 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:100.45,100.67 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:101.45,101.67 1 0 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:102.45,102.64 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:103.45,103.64 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:104.45,104.61 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:106.61,108.2 1 1 +github.com/ethereum/go-ethereum/core/types/legacy_tx.go:110.67,112.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:62.39,66.2 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:91.53,92.31 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:96.2,99.44 4 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:102.2,102.35 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:92.31,94.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:99.44,101.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:106.59,109.2 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:114.56,115.31 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:118.2,120.25 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:115.31,117.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:124.55,126.9 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:127.18,128.13 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:129.24,133.17 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:136.3,136.13 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:137.10,140.37 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:143.3,144.17 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:147.3,147.13 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:133.17,135.4 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:140.37,142.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:144.17,146.4 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:153.56,154.31 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:165.2,166.16 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:169.2,170.12 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:154.31,158.17 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:161.3,162.13 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:158.17,160.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:166.16,168.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:174.62,175.17 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:178.2,178.14 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:175.17,177.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:179.24,182.21 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:183.24,186.21 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:187.10,188.36 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:193.59,196.14 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:196.14,198.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:201.90,202.40 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:206.2,207.21 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:220.2,220.58 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:224.2,224.12 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:202.40,204.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:207.21,210.3 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:210.8,210.27 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:210.27,215.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:215.8,219.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:220.58,222.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:227.36,228.21 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:233.2,233.13 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:228.21,231.3 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:237.41,238.31 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:239.17,240.43 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:241.10,242.14 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:247.37,249.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:254.43,256.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:259.38,259.64 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:262.48,262.80 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:265.37,265.62 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:268.44,268.92 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:271.45,271.94 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:274.45,274.94 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:277.41,277.86 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:280.39,280.66 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:284.45,286.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:289.40,293.2 3 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:297.64,299.2 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:302.61,304.2 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:307.60,309.2 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:312.61,314.2 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:317.60,319.2 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:324.76,325.20 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:328.2,330.34 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:333.2,333.76 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:325.20,327.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:330.34,332.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:338.72,341.2 2 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:344.85,345.20 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:348.2,348.82 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:345.20,347.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:352.84,353.20 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:356.2,356.52 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:353.20,355.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:360.43,361.41 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:365.2,366.31 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:371.2,372.10 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:361.41,363.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:366.31,368.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:368.8,370.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:377.50,378.41 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:381.2,384.30 4 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:378.41,380.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:389.87,391.16 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:394.2,396.53 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:391.16,393.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:403.33,403.50 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:408.59,410.31 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:410.31,412.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:412.8,414.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:418.51,422.23 3 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:426.2,426.23 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:432.2,432.13 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:422.23,424.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:426.23,427.38 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:427.38,429.4 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:440.40,440.57 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:441.40,441.78 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:442.40,442.67 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:453.84,455.16 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:458.2,461.8 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:455.16,457.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:468.37,468.54 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:469.47,473.14 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:476.2,476.16 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:473.14,475.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:478.42,478.69 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:480.48,482.2 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:484.46,490.2 5 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:507.136,510.32 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:521.2,529.3 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:510.32,514.32 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:518.3,519.25 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:514.32,516.12 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:533.59,534.23 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:537.2,537.22 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:534.23,536.3 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:541.47,543.47 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:550.2,550.20 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:543.47,544.71 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:544.71,548.4 3 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:556.45,558.2 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:577.204,591.2 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:594.79,608.20 2 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:611.2,613.17 3 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:608.20,610.3 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:616.42,616.59 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:617.42,617.57 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:618.42,618.63 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:619.42,619.64 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:620.42,620.64 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:621.42,621.61 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:622.42,622.63 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:623.42,623.60 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:624.42,624.59 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:625.42,625.65 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:626.42,626.61 1 0 +github.com/ethereum/go-ethereum/core/types/transaction.go:629.56,630.14 1 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:633.2,634.13 2 1 +github.com/ethereum/go-ethereum/core/types/transaction.go:630.14,632.3 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:45.39,49.2 3 0 +github.com/ethereum/go-ethereum/core/types/block.go:52.37,54.2 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:57.51,59.2 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:62.56,64.2 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:111.37,113.2 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:119.44,121.2 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:127.38,128.45 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:131.2,131.25 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:136.2,136.43 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:139.2,139.22 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:144.2,144.12 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:128.45,130.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:131.25,132.53 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:132.53,134.4 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:136.43,138.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:139.22,140.47 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:140.47,142.4 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:149.35,151.2 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:154.39,156.2 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:199.116,203.19 2 0 +github.com/ethereum/go-ethereum/core/types/block.go:211.2,211.24 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:218.2,218.22 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:228.2,228.10 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:203.19,205.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:205.8,209.3 3 0 +github.com/ethereum/go-ethereum/core/types/block.go:211.24,213.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:213.8,216.3 2 0 +github.com/ethereum/go-ethereum/core/types/block.go:218.22,220.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:220.8,223.25 3 0 +github.com/ethereum/go-ethereum/core/types/block.go:223.25,225.4 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:234.48,236.2 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:240.36,242.56 2 0 +github.com/ethereum/go-ethereum/core/types/block.go:245.2,245.48 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:248.2,248.22 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:251.2,251.22 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:255.2,255.13 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:242.56,244.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:245.48,247.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:248.22,250.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:251.22,254.3 2 0 +github.com/ethereum/go-ethereum/core/types/block.go:259.48,262.38 3 1 +github.com/ethereum/go-ethereum/core/types/block.go:265.2,267.12 3 1 +github.com/ethereum/go-ethereum/core/types/block.go:262.38,264.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:271.46,277.2 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:281.45,281.64 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:282.45,282.70 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:284.60,285.45 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:290.2,290.12 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:285.45,286.33 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:286.33,288.4 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:293.39,293.83 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:294.39,294.67 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:295.39,295.66 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:296.39,296.87 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:297.39,297.63 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:299.43,299.78 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:300.43,300.72 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:301.43,301.96 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:302.43,302.68 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:303.43,303.71 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:304.43,304.67 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:305.43,305.73 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:306.43,306.69 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:307.43,307.74 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:308.43,308.72 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:309.43,309.86 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:311.36,312.29 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:315.2,315.43 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:312.29,314.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:318.34,318.65 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:321.30,321.72 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:325.43,326.40 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:329.2,332.30 4 0 +github.com/ethereum/go-ethereum/core/types/block.go:326.40,328.3 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:337.37,339.2 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:343.53,346.2 2 0 +github.com/ethereum/go-ethereum/core/types/block.go:348.50,349.22 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:352.2,352.24 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:349.22,351.3 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:357.49,365.2 2 0 +github.com/ethereum/go-ethereum/core/types/block.go:368.80,375.24 3 0 +github.com/ethereum/go-ethereum/core/types/block.go:378.2,378.14 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:375.24,377.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:383.36,384.40 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:387.2,389.10 3 1 +github.com/ethereum/go-ethereum/core/types/block.go:384.40,386.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:396.57,399.16 2 1 +github.com/ethereum/go-ethereum/core/types/block.go:402.2,403.16 2 1 +github.com/ethereum/go-ethereum/core/types/block.go:406.2,406.27 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:409.2,409.39 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:399.16,401.3 1 1 +github.com/ethereum/go-ethereum/core/types/block.go:403.16,405.3 1 0 +github.com/ethereum/go-ethereum/core/types/block.go:406.27,408.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:17.48,46.2 15 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:49.53,65.52 3 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:68.2,68.21 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:71.2,71.26 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:74.2,74.23 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:77.2,77.34 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:80.2,81.22 2 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:84.2,85.21 2 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:88.2,89.23 2 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:92.2,93.32 2 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:96.2,96.24 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:99.2,100.26 2 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:103.2,103.28 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:106.2,106.33 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:109.2,109.12 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:65.52,67.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:68.21,70.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:71.26,73.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:74.23,76.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:77.34,79.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:81.22,83.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:85.21,87.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:89.23,91.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:93.32,95.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:96.24,98.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:100.26,102.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:103.28,105.3 1 0 +github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:106.33,108.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:42.59,44.9 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:54.2,61.10 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:44.9,53.3 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:67.78,69.9 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:96.2,97.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:106.2,113.10 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:69.9,73.17 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:84.3,92.11 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:73.17,81.4 4 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:97.16,105.3 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:119.39,120.26 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:124.2,124.14 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:129.2,129.14 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:134.2,135.57 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:144.2,146.13 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:120.26,122.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:124.14,128.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:129.14,133.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:135.57,139.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:139.8,139.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:139.22,142.13 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:151.41,153.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:156.46,158.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:165.44,166.25 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:170.2,171.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:175.2,175.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:166.25,168.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:171.16,174.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:183.41,184.24 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:187.2,188.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:192.2,192.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:184.24,186.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:188.16,191.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:196.37,199.2 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:203.65,206.2 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:210.84,213.2 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:39.40,39.59 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:43.50,48.43 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:55.2,55.42 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:49.10,50.14 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:51.9,52.15 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:59.45,61.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:81.136,83.17 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:86.2,92.42 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:114.2,115.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:83.17,85.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:92.42,93.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:112.3,112.29 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:93.22,98.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:98.9,108.18 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:108.18,109.10 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:120.32,125.41 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:170.2,171.22 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:125.41,130.7 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:130.7,132.21 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:144.4,145.48 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:132.21,141.10 7 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:145.48,147.10 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:148.10,157.51 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:157.51,159.14 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:160.11,164.14 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:175.37,176.28 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:179.2,179.19 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:205.2,205.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:222.2,222.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:176.28,178.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:179.19,183.17 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:188.3,188.62 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:192.3,192.48 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:183.17,185.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:185.9,187.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:188.62,191.4 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:192.48,194.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:205.6,206.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:209.3,209.17 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:214.3,214.62 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:218.3,218.48 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:206.18,208.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:209.17,211.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:211.9,213.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:214.62,217.4 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:218.48,219.9 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:231.44,235.44 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:242.2,242.32 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:246.2,250.62 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:260.2,261.59 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:284.2,285.17 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:288.2,288.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:235.44,240.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:242.32,244.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:250.62,253.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:253.8,253.54 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:253.54,257.3 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:261.59,265.14 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:268.3,268.31 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:272.3,273.63 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:280.3,282.51 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:265.14,267.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:268.31,271.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:273.63,275.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:275.9,275.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:275.22,277.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:285.17,287.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:292.49,296.2 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:300.39,302.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:305.44,307.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:311.42,313.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:317.39,319.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:323.35,324.34 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:327.2,327.20 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:324.34,326.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:331.33,332.34 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:335.2,335.15 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:332.34,334.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:341.102,343.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:348.123,350.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:186.146,194.12 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:198.2,199.14 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:203.2,203.16 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:212.2,212.18 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:216.2,216.18 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:194.12,196.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:199.14,202.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:203.16,204.14 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:209.3,209.18 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:204.14,208.4 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:212.18,215.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:221.28,226.33 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:232.2,235.17 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:226.33,227.42 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:227.42,229.9 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:235.17,237.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:243.26,248.33 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:272.2,284.38 8 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:248.33,249.32 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:250.19,252.29 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:258.4,260.23 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:262.19,266.23 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:268.11,269.55 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:252.29,256.5 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:284.38,286.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:291.57,296.2 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:301.80,305.17 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:308.2,309.18 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:312.2,313.6 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:328.2,328.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:305.17,307.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:309.18,311.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:313.6,314.56 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:317.3,319.18 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:322.3,323.20 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:326.3,326.17 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:314.56,315.9 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:319.18,320.9 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:323.20,324.9 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:333.193,340.29 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:344.2,345.19 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:348.2,355.12 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:340.29,342.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:345.19,347.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:367.56,370.17 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:373.2,374.9 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:378.2,379.48 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:382.2,391.17 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:401.2,405.35 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:411.2,412.34 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:419.2,419.35 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:425.2,425.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:437.2,437.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:370.17,372.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:374.9,376.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:379.48,381.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:391.17,400.3 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:405.35,406.40 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:406.40,409.4 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:412.34,414.40 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:417.3,417.25 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:414.40,416.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:419.35,420.19 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:420.19,422.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:425.22,427.36 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:435.3,435.26 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:427.36,428.51 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:431.4,431.41 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:428.51,430.5 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:431.41,433.5 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:451.60,453.32 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:464.2,464.38 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:498.2,506.13 7 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:453.32,455.49 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:455.49,457.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:457.9,460.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:465.18,466.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:468.18,481.25 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:484.3,485.47 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:494.10,495.55 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:481.25,483.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:485.47,490.53 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:490.53,492.5 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:514.47,521.26 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:527.2,531.16 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:534.2,538.39 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:567.2,567.45 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:591.2,591.55 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:617.2,624.38 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:627.2,641.51 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:646.2,646.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:521.26,525.3 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:531.16,532.38 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:538.39,540.74 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:544.3,548.17 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:564.3,564.15 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:540.74,541.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:548.17,557.48 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:557.48,558.41 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:561.5,561.18 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:558.41,560.6 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:567.45,569.74 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:573.3,583.47 6 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:569.74,570.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:583.47,584.40 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:587.4,587.17 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:584.40,586.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:591.55,593.81 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:597.3,599.42 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:593.81,594.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:599.42,601.91 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:604.4,604.21 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:612.4,613.56 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:601.91,602.13 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:604.21,608.5 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:608.10,611.5 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:624.38,626.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:641.51,645.3 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:655.63,658.17 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:662.2,667.60 4 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:670.2,671.33 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:676.2,676.54 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:680.2,681.16 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:685.2,686.18 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:658.17,660.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:667.60,669.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:671.33,673.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:676.54,678.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:681.16,683.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:692.42,702.33 5 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:728.2,731.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:702.33,703.32 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:704.19,706.29 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:712.4,714.23 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:716.19,720.23 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:722.11,723.55 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:706.29,710.5 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:736.93,738.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:741.2,741.8 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:744.2,744.46 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:738.16,740.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:741.8,743.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:749.114,751.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:754.2,754.8 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:757.2,757.55 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:751.16,753.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:754.8,756.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:762.47,764.16 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:767.2,769.185 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:783.2,783.16 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:786.2,786.17 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:789.2,789.12 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:764.16,766.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:769.185,771.17 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:774.3,777.17 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:780.3,780.19 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:771.17,773.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:777.17,779.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:783.16,785.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:786.17,788.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:794.39,796.29 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:800.2,800.17 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:803.2,803.30 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:796.29,798.8 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:800.17,802.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:804.18,805.15 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:806.18,807.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:808.10,809.50 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:815.39,817.22 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:820.2,820.25 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:817.22,819.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:825.43,830.18 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:833.2,835.36 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:830.18,832.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:839.39,844.2 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/sort.go:29.28,29.46 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/sort.go:33.38,33.86 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/sort.go:36.33,36.64 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:39.93,44.23 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:47.2,47.42 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:50.2,50.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:44.23,46.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:47.42,49.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:55.95,57.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:60.2,60.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:57.16,58.13 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:65.48,67.56 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:70.2,70.28 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:73.2,73.32 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:76.2,76.21 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:67.56,69.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:70.28,72.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:73.32,75.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:80.50,82.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:85.2,85.35 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/account.go:82.16,84.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:48.41,50.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:53.40,55.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:59.35,64.2 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:68.66,70.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:73.2,73.20 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:76.2,77.55 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:80.2,80.21 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:70.16,72.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:73.20,75.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:77.55,78.13 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:85.67,91.14 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:96.2,96.69 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:100.2,103.57 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:109.2,113.27 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:118.2,118.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:91.14,93.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:96.69,98.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:103.57,107.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:113.27,115.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:115.8,117.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:123.84,129.14 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:132.2,136.65 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:140.2,143.53 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:149.2,153.27 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:158.2,158.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:129.14,131.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:136.65,138.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:143.53,147.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:153.27,155.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:155.8,157.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:164.180,166.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:108.76,110.29 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:114.2,114.21 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:124.2,131.21 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:141.2,141.23 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:110.29,112.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:115.25,116.72 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:117.29,121.8 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:131.21,132.72 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:132.72,139.4 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:147.114,156.38 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:159.2,170.13 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:156.38,158.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:174.85,182.18 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:187.2,188.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:191.2,192.9 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:202.2,203.40 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:182.18,186.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:188.16,189.13 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:193.21,194.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:195.37,196.19 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:197.40,198.38 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:199.10,200.90 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:218.41,220.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:224.42,226.26 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:229.2,229.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:226.26,228.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:234.87,235.40 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:241.2,241.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:235.40,237.44 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:237.44,239.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:251.193,262.18 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:294.2,294.23 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:299.2,299.30 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:308.2,308.32 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:323.2,324.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:329.2,330.19 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:334.2,334.19 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:337.2,337.51 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:347.2,347.17 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:361.2,369.6 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:262.18,264.48 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:267.3,267.23 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:273.3,275.28 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:264.48,265.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:267.23,271.9 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:275.28,277.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:277.9,279.18 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:279.18,288.5 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:288.10,290.5 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:294.23,296.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:296.8,298.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:299.30,300.24 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:300.24,302.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:302.9,304.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:308.32,310.28 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:313.3,313.49 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:320.3,320.51 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:310.28,312.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:313.49,319.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:324.16,327.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:330.19,332.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:334.19,336.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:337.51,346.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:347.17,348.50 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:348.50,357.4 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:384.221,387.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:390.2,394.21 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:397.2,400.20 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:413.2,421.34 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:431.2,432.26 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:442.2,443.15 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:451.2,469.18 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:508.2,508.21 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:512.2,513.29 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:519.2,522.23 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:527.2,532.49 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:387.16,389.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:394.21,396.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:400.20,407.63 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:411.3,411.57 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:407.63,407.105 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:407.119,409.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:421.34,423.24 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:426.3,426.16 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:423.24,425.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:432.26,436.35 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:439.3,440.38 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:436.35,438.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:443.15,445.17 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:445.17,448.4 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:469.18,470.55 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:474.3,477.23 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:502.3,503.69 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:506.3,506.33 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:470.55,472.9 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:477.23,478.58 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:500.4,500.9 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:478.58,481.64 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:484.5,488.13 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:481.64,483.6 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:489.10,489.23 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:489.23,492.59 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:497.5,498.24 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:492.59,494.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:494.11,496.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:503.69,505.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:508.21,510.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:513.29,514.56 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:517.3,517.15 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:514.56,516.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:522.23,524.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:524.8,526.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:539.54,544.27 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:549.2,557.54 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:595.2,595.75 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:719.2,719.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:741.2,742.38 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:749.2,761.14 8 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:544.27,548.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:557.54,558.10 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:562.3,562.63 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:588.3,588.41 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:592.3,592.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:559.30,559.30 0 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:560.11,560.11 0 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:562.63,563.56 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:572.4,574.40 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:577.4,583.20 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:563.56,567.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:574.40,576.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:583.20,586.5 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:588.41,591.4 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:595.75,600.13 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:614.3,620.52 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:624.3,624.66 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:643.3,646.98 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:650.3,650.47 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:655.3,655.28 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:714.3,715.13 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:600.13,607.117 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:610.4,611.14 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:607.117,609.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:620.52,622.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:624.66,626.14 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:640.4,641.20 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:626.14,627.48 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:630.5,630.30 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:633.5,633.38 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:627.48,629.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:630.30,632.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:634.10,639.5 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:646.98,648.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:650.47,652.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:655.28,663.117 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:666.4,666.64 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:663.117,665.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:667.9,671.107 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:674.4,674.77 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:699.4,700.8 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:671.107,673.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:674.77,675.33 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:679.5,679.15 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:684.5,684.14 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:690.5,694.73 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:697.5,697.15 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:675.33,677.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:679.15,683.6 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:684.14,687.6 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:687.11,689.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:694.73,696.6 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:700.8,702.19 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:705.5,705.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:708.5,708.60 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:702.19,704.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:705.18,706.11 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:708.60,709.11 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:719.6,722.17 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:730.3,730.16 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:733.3,733.54 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:736.3,736.35 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:722.17,723.20 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:726.4,727.10 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:723.20,725.5 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:730.16,731.9 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:733.54,734.9 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:742.38,748.3 4 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:766.37,767.37 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:773.2,773.12 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:767.37,769.20 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:769.20,771.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:86.72,89.53 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:93.2,96.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:89.53,91.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:100.44,105.20 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:109.2,109.23 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:112.2,112.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:117.2,120.13 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:105.20,106.68 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:109.23,111.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:112.22,115.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:125.46,127.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:130.51,132.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:142.49,145.9 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:152.2,153.22 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:156.2,156.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:145.9,146.52 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:150.3,150.81 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:146.52,149.4 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:153.22,155.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:160.43,160.44 0 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:170.72,176.2 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:179.44,181.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:185.2,185.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:195.2,195.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:181.18,183.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:185.6,186.20 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:191.3,191.77 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:186.20,190.4 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:191.77,192.9 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:203.46,204.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:207.2,207.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:204.18,206.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:211.51,213.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:216.49,218.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:221.42,223.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:223.18,226.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:250.101,255.53 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:259.2,263.15 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:255.53,257.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:267.44,272.20 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:276.2,276.23 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:279.2,279.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:284.2,287.13 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:272.20,273.68 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:276.23,278.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:279.22,282.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:292.46,294.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:297.51,299.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:309.46,312.9 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:316.2,317.9 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:320.2,321.22 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:324.2,324.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:312.9,313.89 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:317.9,318.86 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:321.22,323.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:328.43,328.44 0 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:342.101,349.2 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:352.44,354.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:358.2,358.6 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:368.2,368.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:354.18,356.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:358.6,359.20 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:364.3,364.95 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:359.20,363.4 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:364.95,365.9 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:376.46,377.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:380.2,380.22 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:377.18,379.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:384.51,386.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:389.46,391.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:394.42,396.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:396.18,399.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:69.56,70.29 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:73.2,74.67 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:79.2,80.49 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:88.2,89.77 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:70.29,72.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:74.67,77.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:81.25,82.36 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:83.29,84.91 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:85.10,86.33 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:93.103,98.29 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:101.2,102.67 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:111.2,112.23 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:116.2,120.16 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:124.2,124.31 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:131.2,132.40 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:138.2,138.51 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:143.2,144.16 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:147.2,148.33 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:98.29,100.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:102.67,104.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:112.23,115.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:120.16,123.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:124.31,127.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:132.40,134.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:138.51,141.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:144.16,146.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:152.138,155.40 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:160.2,161.33 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:164.2,171.16 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:183.2,183.43 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:197.2,197.21 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:218.2,218.29 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:155.40,157.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:161.33,163.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:171.16,174.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:183.43,187.16 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:194.3,194.89 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:187.16,189.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:197.21,200.28 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:203.3,207.33 4 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:210.3,216.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:200.28,202.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:207.33,209.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:223.70,226.40 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:233.2,234.45 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:237.2,238.34 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:241.2,242.44 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:245.2,246.33 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:253.2,254.43 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:257.2,258.32 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:269.2,269.92 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:226.40,228.20 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:231.3,231.52 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:228.20,230.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:234.45,236.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:238.34,240.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:242.44,244.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:246.33,247.26 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:247.26,249.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:249.9,251.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:254.43,256.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:258.32,260.34 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:267.3,267.34 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:260.34,261.30 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:261.30,263.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:263.10,265.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:274.73,277.24 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:286.2,289.14 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:293.2,296.21 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:277.24,281.36 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:281.36,283.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:289.14,291.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:301.73,304.16 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:308.2,311.16 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:315.2,315.52 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:318.2,319.35 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:322.2,322.54 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:325.2,326.41 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:329.2,329.53 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:332.2,333.42 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:342.2,342.52 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:345.2,346.18 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:304.16,306.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:311.16,313.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:315.52,317.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:319.35,321.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:322.54,324.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:326.41,328.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:329.53,331.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:333.42,336.31 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:340.3,340.80 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:336.31,339.4 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:342.52,344.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:34.152,45.18 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:48.2,48.16 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:80.2,81.38 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:84.2,84.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:87.2,87.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:90.2,90.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:45.18,47.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:48.16,51.36 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:54.3,54.25 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:57.3,57.51 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:61.3,64.23 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:51.36,52.9 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:54.25,55.12 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:57.51,58.9 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:64.23,67.40 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:70.4,74.52 4 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:67.40,69.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:74.52,77.5 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:81.38,83.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:84.18,86.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:87.12,89.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:54.71,56.2 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:59.92,61.2 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:66.105,69.16 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:72.2,74.186 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:97.2,97.16 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:100.2,100.17 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:103.2,103.12 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:69.16,71.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:74.186,76.28 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:84.3,85.17 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:88.3,91.17 3 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:94.3,94.19 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:76.28,78.22 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:81.4,81.40 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:78.22,80.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:85.17,87.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:91.17,93.4 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:97.16,99.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:100.17,102.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:122.40,128.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:131.79,137.2 4 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:140.56,145.2 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:148.97,154.44 5 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:154.44,156.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:160.77,167.2 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:170.37,179.23 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:206.2,206.46 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:179.23,181.79 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:181.79,188.42 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:201.4,203.9 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:188.42,190.60 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:190.60,196.80 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:196.80,198.7 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:210.41,216.21 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:219.2,220.39 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:216.21,218.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:224.54,228.6 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:228.6,229.10 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:230.18,232.32 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:233.26,234.15 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:237.4,237.10 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:234.15,236.5 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:245.196,254.12 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:259.2,259.28 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:269.2,271.31 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:276.2,276.48 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:289.2,295.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:353.2,353.35 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:360.2,360.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:254.12,257.3 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:259.28,261.13 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:261.13,264.4 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:271.31,273.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:276.48,279.32 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:284.3,287.22 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:279.32,280.51 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:280.51,282.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:295.16,296.33 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:339.3,343.57 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:296.33,301.27 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:335.4,335.38 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:301.27,303.19 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:303.19,305.6 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:306.10,309.37 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:314.5,315.19 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:318.5,318.31 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:330.5,331.19 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:309.37,312.6 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:315.19,317.6 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:318.31,320.20 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:324.6,324.53 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:328.6,328.20 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:320.20,323.7 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:324.53,327.7 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:331.19,333.6 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:336.9,338.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:343.57,344.34 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:349.4,349.37 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:344.34,346.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:346.10,348.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:353.35,354.33 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:354.33,356.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:356.9,358.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:363.87,365.23 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:368.2,369.15 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:374.2,374.13 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:365.23,367.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:369.15,371.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:371.8,373.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:80.13,89.60 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:89.60,91.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:131.65,131.91 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:132.65,132.91 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:133.65,133.91 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:134.65,134.91 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:135.65,135.77 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:136.45,138.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:145.64,145.90 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:146.64,146.90 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:147.64,147.90 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:148.64,148.90 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:149.64,149.76 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:150.44,152.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:159.64,159.90 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:160.64,160.90 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:161.64,161.90 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:162.64,162.90 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:163.64,163.76 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:164.44,167.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:171.182,181.33 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:190.2,190.42 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:198.2,198.42 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:208.2,209.11 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:182.18,183.21 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:184.18,185.28 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:186.10,187.31 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:190.42,191.18 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:195.3,196.56 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:191.18,192.54 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:198.42,199.19 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:203.3,203.30 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:199.19,200.54 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:203.30,206.4 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:214.49,218.30 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:223.2,226.46 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:234.2,234.35 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:237.2,237.35 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:240.2,240.49 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:248.2,251.79 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:218.30,220.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:226.46,230.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:230.8,232.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:234.35,236.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:237.35,239.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:240.49,241.34 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:241.34,243.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:255.41,257.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:260.40,262.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:266.35,268.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:272.66,274.16 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:277.2,277.20 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:280.2,281.55 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:284.2,284.21 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:274.16,276.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:277.20,279.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:281.55,282.13 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:291.67,296.10 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:299.2,300.10 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:303.2,307.19 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:312.2,312.31 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:296.10,298.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:300.10,302.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:307.19,310.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:318.78,324.16 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:328.2,328.42 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:336.2,336.39 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:344.2,344.44 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:348.2,349.35 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:324.16,326.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:328.42,334.3 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:336.39,342.3 5 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:344.44,346.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:357.84,362.10 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:365.2,366.10 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:369.2,373.19 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:378.2,378.48 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:362.10,364.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:366.10,368.3 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:373.19,376.3 2 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:384.95,390.16 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:394.2,394.52 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:408.2,408.46 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:416.2,416.44 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:420.2,421.52 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:390.16,392.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:394.52,395.43 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:395.43,398.29 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:403.4,404.20 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:398.29,400.5 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:400.10,402.5 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:408.46,414.3 5 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:416.44,418.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:426.180,428.2 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:433.41,436.9 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:442.2,449.46 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:453.2,453.35 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:458.2,458.41 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:462.2,462.51 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:476.2,486.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:436.9,438.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:449.46,450.38 1 0 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:453.35,457.3 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:458.41,460.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:462.51,464.52 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:469.3,470.42 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:473.3,473.46 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:464.52,466.12 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:470.42,472.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:493.50,499.17 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:503.2,507.35 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:510.2,510.35 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:515.2,517.23 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:499.17,501.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:507.35,509.3 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:510.35,511.41 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:511.41,513.4 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:529.81,532.47 3 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:538.2,538.55 1 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:542.2,550.28 6 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:553.2,556.32 4 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:532.47,536.3 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:538.55,541.3 2 1 +github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:550.28,552.3 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:29.68,32.2 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:36.114,38.9 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:42.2,42.15 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:46.2,47.26 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:38.9,41.3 1 0 +github.com/ethereum/go-ethereum/core/state/access_list.go:42.15,45.3 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:51.34,55.2 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:58.41,60.32 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:63.2,64.34 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:71.2,71.11 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:60.32,62.3 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:64.34,66.26 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:69.3,69.27 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:66.26,68.4 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:76.63,77.50 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:80.2,81.13 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:77.50,79.3 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:89.108,91.31 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:99.2,100.33 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:106.2,106.21 1 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:91.31,97.3 4 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:100.33,104.3 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:113.76,116.13 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:119.2,124.23 3 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:116.13,117.62 1 0 +github.com/ethereum/go-ethereum/core/state/access_list.go:124.23,127.3 2 1 +github.com/ethereum/go-ethereum/core/state/access_list.go:134.61,136.2 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:112.46,114.2 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:119.77,126.2 2 1 +github.com/ethereum/go-ethereum/core/state/database.go:135.63,137.16 2 1 +github.com/ethereum/go-ethereum/core/state/database.go:140.2,140.16 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:137.16,139.3 1 0 +github.com/ethereum/go-ethereum/core/state/database.go:144.80,146.16 2 1 +github.com/ethereum/go-ethereum/core/state/database.go:149.2,149.16 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:146.16,148.3 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:153.44,154.23 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:155.24,156.18 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:157.10,158.47 1 0 +github.com/ethereum/go-ethereum/core/state/database.go:163.83,164.68 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:167.2,168.19 2 1 +github.com/ethereum/go-ethereum/core/state/database.go:173.2,173.37 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:164.68,166.3 1 1 +github.com/ethereum/go-ethereum/core/state/database.go:168.19,172.3 3 1 +github.com/ethereum/go-ethereum/core/state/database.go:179.93,180.68 1 0 +github.com/ethereum/go-ethereum/core/state/database.go:183.2,184.19 2 0 +github.com/ethereum/go-ethereum/core/state/database.go:189.2,189.37 1 0 +github.com/ethereum/go-ethereum/core/state/database.go:180.68,182.3 1 0 +github.com/ethereum/go-ethereum/core/state/database.go:184.19,188.3 3 0 +github.com/ethereum/go-ethereum/core/state/database.go:193.84,194.54 1 0 +github.com/ethereum/go-ethereum/core/state/database.go:197.2,198.23 2 0 +github.com/ethereum/go-ethereum/core/state/database.go:194.54,196.3 1 0 +github.com/ethereum/go-ethereum/core/state/database.go:202.46,204.2 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:48.52,52.2 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:57.37,59.21 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:63.2,63.34 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:67.2,67.22 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:59.21,61.3 1 0 +github.com/ethereum/go-ethereum/core/state/iterator.go:63.34,66.3 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:71.38,73.21 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:77.2,77.23 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:81.2,81.22 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:91.2,91.20 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:96.2,96.42 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:104.2,104.24 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:108.2,109.85 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:112.2,113.16 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:116.2,117.27 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:120.2,120.51 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:128.2,129.12 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:73.21,75.3 1 0 +github.com/ethereum/go-ethereum/core/state/iterator.go:77.23,79.3 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:81.22,82.42 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:88.3,88.13 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:82.42,83.32 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:86.4,86.19 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:83.32,85.5 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:91.20,94.3 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:96.42,97.32 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:100.3,101.13 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:97.32,99.4 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:104.24,106.3 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:109.85,111.3 1 0 +github.com/ethereum/go-ethereum/core/state/iterator.go:113.16,115.3 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:117.27,119.3 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:120.51,124.17 4 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:124.17,126.4 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:134.41,139.21 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:143.2,143.9 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:154.2,154.13 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:139.21,141.3 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:144.24,146.35 2 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:149.22,150.51 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:151.25,152.62 1 1 +github.com/ethereum/go-ethereum/core/state/iterator.go:146.35,148.4 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:37.31,39.2 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:43.40,44.28 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:48.2,48.8 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:44.28,46.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:51.33,53.28 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:57.2,57.12 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:53.28,55.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:97.36,99.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:102.91,103.25 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:106.2,106.26 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:109.2,109.34 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:112.2,120.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:103.25,105.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:106.26,108.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:109.34,111.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:124.52,126.2 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:129.43,130.20 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:130.20,132.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:135.38,137.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:139.31,143.25 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:143.25,147.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:150.49,151.19 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:168.2,168.15 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:151.19,154.57 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:159.3,159.20 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:154.57,158.4 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:159.20,162.18 3 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:162.18,165.5 2 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:172.74,174.26 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:178.2,179.11 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:183.2,183.37 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:174.26,176.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:179.11,181.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:187.83,189.26 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:193.2,193.54 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:196.2,196.51 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:200.2,204.22 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:221.2,221.36 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:232.2,233.18 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:240.2,241.14 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:189.26,191.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:193.54,195.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:196.51,198.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:204.22,211.66 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:214.3,216.31 3 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:211.66,213.4 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:216.31,218.4 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:221.36,224.31 3 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:227.3,227.17 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:224.31,226.4 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:227.17,230.4 2 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:233.18,235.17 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:238.3,238.26 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:235.17,237.4 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:245.69,247.26 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:252.2,253.19 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:257.2,262.24 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:247.26,250.3 2 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:253.19,255.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:271.71,273.26 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:276.2,276.34 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:273.26,275.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:276.34,278.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:283.56,285.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:289.47,291.41 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:297.2,297.96 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:300.2,300.29 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:291.41,293.36 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:293.36,295.4 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:297.96,299.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:300.29,302.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:307.52,310.32 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:314.2,314.30 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:318.2,324.43 5 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:354.2,354.28 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:357.2,357.31 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:360.2,360.11 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:310.32,312.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:314.30,315.31 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:315.31,315.75 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:324.43,326.36 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:329.3,332.31 3 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:342.3,342.23 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:352.3,352.62 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:326.36,327.12 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:332.31,335.4 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:335.9,340.4 3 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:342.23,343.22 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:350.4,350.48 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:343.22,345.63 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:345.63,348.6 2 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:354.28,356.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:357.31,359.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:364.47,366.29 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:370.2,370.30 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:373.2,373.29 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:366.29,368.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:370.30,371.31 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:371.31,371.74 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:378.60,380.29 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:383.2,383.20 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:387.2,387.30 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:390.2,391.16 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:394.2,394.23 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:380.29,382.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:383.20,385.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:387.30,388.31 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:388.31,388.75 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:391.16,393.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:399.51,402.24 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:408.2,408.53 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:402.24,403.16 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:406.3,406.9 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:403.16,405.4 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:413.51,414.24 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:417.2,417.53 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:414.24,416.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:420.51,426.2 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:428.51,430.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:432.58,434.19 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:437.2,444.20 8 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:434.19,436.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:452.48,454.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:457.48,458.19 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:461.2,461.46 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:464.2,465.16 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:468.2,469.13 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:458.19,460.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:461.46,463.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:465.16,467.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:475.49,476.19 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:479.2,479.46 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:482.2,483.16 2 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:486.2,486.13 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:476.19,478.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:479.46,481.3 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:483.16,485.3 1 0 +github.com/ethereum/go-ethereum/core/state/state_object.go:489.66,497.2 3 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:499.66,503.2 3 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:505.46,511.2 2 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:513.46,515.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:517.41,519.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:521.42,523.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:525.38,527.2 1 1 +github.com/ethereum/go-ethereum/core/state/state_object.go:532.40,533.54 1 0 +github.com/ethereum/go-ethereum/core/state/sync.go:30.127,33.19 2 1 +github.com/ethereum/go-ethereum/core/state/sync.go:40.2,41.91 2 1 +github.com/ethereum/go-ethereum/core/state/sync.go:55.2,56.15 2 1 +github.com/ethereum/go-ethereum/core/state/sync.go:33.19,34.88 1 0 +github.com/ethereum/go-ethereum/core/state/sync.go:34.88,36.4 1 0 +github.com/ethereum/go-ethereum/core/state/sync.go:41.91,42.20 1 1 +github.com/ethereum/go-ethereum/core/state/sync.go:47.3,48.65 2 1 +github.com/ethereum/go-ethereum/core/state/sync.go:51.3,53.13 3 1 +github.com/ethereum/go-ethereum/core/state/sync.go:42.20,43.46 1 0 +github.com/ethereum/go-ethereum/core/state/sync.go:43.46,45.5 1 0 +github.com/ethereum/go-ethereum/core/state/sync.go:48.65,50.4 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:70.41,72.2 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:75.68,77.2 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:87.49,89.2 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:92.76,94.2 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:102.76,113.32 2 0 +github.com/ethereum/go-ethereum/core/state/dump.go:116.2,116.23 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:113.32,115.3 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:120.49,124.2 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:128.87,130.17 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:133.2,143.16 5 1 +github.com/ethereum/go-ethereum/core/state/dump.go:195.2,195.26 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:198.2,201.16 2 1 +github.com/ethereum/go-ethereum/core/state/dump.go:130.17,132.3 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:143.16,145.58 2 1 +github.com/ethereum/go-ethereum/core/state/dump.go:148.3,156.23 3 1 +github.com/ethereum/go-ethereum/core/state/dump.go:164.3,166.21 3 1 +github.com/ethereum/go-ethereum/core/state/dump.go:169.3,169.24 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:181.3,183.41 3 1 +github.com/ethereum/go-ethereum/core/state/dump.go:188.3,188.43 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:145.58,146.14 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:156.23,159.30 2 0 +github.com/ethereum/go-ethereum/core/state/dump.go:162.4,162.30 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:159.30,160.13 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:166.21,168.4 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:169.24,172.25 3 1 +github.com/ethereum/go-ethereum/core/state/dump.go:172.25,174.19 2 0 +github.com/ethereum/go-ethereum/core/state/dump.go:178.5,178.98 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:174.19,176.14 2 0 +github.com/ethereum/go-ethereum/core/state/dump.go:183.41,187.4 2 0 +github.com/ethereum/go-ethereum/core/state/dump.go:188.43,189.17 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:192.4,192.9 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:189.17,191.5 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:195.26,197.3 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:205.50,211.2 3 1 +github.com/ethereum/go-ethereum/core/state/dump.go:214.49,217.16 3 1 +github.com/ethereum/go-ethereum/core/state/dump.go:220.2,220.13 1 1 +github.com/ethereum/go-ethereum/core/state/dump.go:217.16,219.3 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:224.73,226.2 1 0 +github.com/ethereum/go-ethereum/core/state/dump.go:229.63,235.2 3 0 +github.com/ethereum/go-ethereum/core/state/journal.go:44.28,48.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:51.46,53.42 2 1 +github.com/ethereum/go-ethereum/core/state/journal.go:53.42,55.3 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:60.58,61.50 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:72.2,72.34 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:61.50,66.50 2 1 +github.com/ethereum/go-ethereum/core/state/journal.go:66.50,67.49 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:67.49,69.5 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:78.46,80.2 1 0 +github.com/ethereum/go-ethereum/core/state/journal.go:83.32,85.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:143.49,146.2 2 1 +github.com/ethereum/go-ethereum/core/state/journal.go:148.56,150.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:152.48,154.39 2 1 +github.com/ethereum/go-ethereum/core/state/journal.go:154.39,156.3 1 0 +github.com/ethereum/go-ethereum/core/state/journal.go:159.55,161.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:163.44,165.16 2 1 +github.com/ethereum/go-ethereum/core/state/journal.go:165.16,168.3 2 1 +github.com/ethereum/go-ethereum/core/state/journal.go:171.51,173.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:177.43,178.2 0 1 +github.com/ethereum/go-ethereum/core/state/journal.go:180.49,182.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:184.44,186.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:188.51,190.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:192.42,194.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:196.49,198.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:200.41,202.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:204.48,206.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:208.44,210.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:212.51,214.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:216.43,218.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:220.50,222.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:224.43,226.20 2 1 +github.com/ethereum/go-ethereum/core/state/journal.go:231.2,231.13 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:226.20,228.3 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:228.8,230.3 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:234.50,236.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:238.48,240.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:242.55,244.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:246.57,257.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:259.64,261.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:263.54,265.2 1 1 +github.com/ethereum/go-ethereum/core/state/journal.go:267.61,269.2 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:50.57,53.2 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:55.46,56.24 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:128.81,130.16 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:133.2,147.22 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:154.2,154.17 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:130.16,132.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:147.22,148.59 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:148.59,152.4 3 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:160.53,161.25 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:165.2,165.19 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:161.25,164.3 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:165.19,167.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:172.36,173.25 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:173.25,176.3 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:180.39,181.20 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:181.20,183.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:186.33,188.2 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:190.42,198.2 6 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:200.81,202.25 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:205.2,205.13 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:202.25,204.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:208.39,210.29 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:213.2,213.13 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:210.29,212.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:217.66,218.37 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:218.37,223.3 4 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:227.54,229.2 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:232.41,235.2 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:239.41,241.20 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:244.2,244.17 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:241.20,242.88 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:249.51,251.2 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:255.51,258.2 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:261.60,263.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:266.2,266.20 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:263.24,265.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:269.56,271.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:275.2,275.10 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:271.24,273.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:279.33,281.2 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:283.55,285.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:288.2,288.12 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:285.24,287.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:291.56,293.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:296.2,296.10 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:293.24,295.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:299.64,301.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:304.2,304.51 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:301.24,303.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:308.79,310.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:313.2,313.22 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:310.24,312.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:317.67,319.2 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:322.74,326.2 3 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:329.88,332.17 3 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:335.2,336.19 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:332.17,334.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:340.88,342.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:345.2,345.22 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:342.24,344.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:349.39,351.2 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:355.57,357.24 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:360.2,362.26 3 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:357.24,359.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:365.57,367.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:370.2,370.14 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:367.24,369.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:378.68,380.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:380.24,382.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:386.68,388.24 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:388.24,390.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:393.68,395.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:395.24,397.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:400.63,402.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:402.24,404.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:407.61,409.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:409.24,411.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:414.73,416.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:416.24,418.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:423.88,425.24 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:425.24,427.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:435.53,437.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:440.2,448.13 4 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:437.24,439.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:456.55,458.30 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:462.2,463.68 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:471.2,471.19 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:458.30,459.31 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:459.31,459.72 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:463.68,465.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:471.19,473.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:477.55,479.30 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:483.2,484.50 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:479.30,480.31 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:480.31,480.72 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:484.50,486.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:492.68,493.70 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:496.2,496.12 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:493.70,495.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:503.75,505.45 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:509.2,510.19 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:535.2,535.17 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:555.2,557.12 3 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:505.45,507.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:510.19,513.31 3 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:516.3,516.17 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:513.31,515.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:516.17,517.18 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:520.4,526.31 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:529.4,529.36 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:517.18,519.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:526.31,528.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:529.36,531.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:535.17,538.31 3 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:541.3,541.17 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:545.3,545.20 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:548.3,549.52 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:538.31,540.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:541.17,544.4 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:545.20,547.4 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:549.52,552.4 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:560.55,562.2 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:565.73,567.24 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:570.2,570.20 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:567.24,569.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:575.81,579.34 3 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:585.2,586.17 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:591.2,592.34 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:595.2,595.20 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:579.34,581.20 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:581.20,583.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:586.17,588.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:588.8,590.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:592.34,594.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:608.54,610.17 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:610.17,612.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:615.100,617.15 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:620.2,622.16 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:641.2,641.12 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:617.15,619.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:622.16,624.50 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:631.3,631.24 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:624.50,625.23 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:628.4,628.12 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:625.23,627.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:631.24,633.18 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:636.4,636.45 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:633.18,635.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:636.45,638.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:646.35,662.38 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:680.2,680.42 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:686.2,686.40 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:692.2,692.33 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:700.2,700.42 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:708.2,713.25 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:716.2,716.20 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:741.2,741.14 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:662.38,667.51 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:667.51,675.4 3 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:680.42,681.51 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:684.3,684.47 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:681.51,683.4 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:686.40,687.51 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:690.3,690.45 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:687.51,689.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:692.33,694.26 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:698.3,698.25 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:694.26,697.4 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:700.42,702.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:713.25,715.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:716.20,725.37 4 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:728.3,729.36 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:732.3,733.35 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:725.37,727.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:729.36,731.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:733.35,735.26 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:738.4,738.31 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:735.26,737.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:745.34,750.2 4 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:753.47,755.61 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:758.2,758.71 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:761.2,765.43 3 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:755.61,757.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:758.71,759.64 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:769.38,771.2 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:776.53,778.38 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:812.2,812.57 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:816.2,816.27 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:778.38,780.13 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:789.3,789.58 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:804.3,810.79 3 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:780.13,787.12 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:789.58,796.21 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:796.21,800.5 3 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:801.9,803.4 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:812.57,814.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:822.73,834.25 3 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:845.2,845.42 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:853.2,853.23 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:858.2,859.42 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:869.2,869.23 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:872.2,872.36 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:876.2,876.30 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:879.2,879.22 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:834.25,835.16 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:835.16,838.4 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:845.42,846.48 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:846.48,848.4 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:853.23,854.59 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:854.59,856.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:859.42,860.47 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:867.3,867.59 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:860.47,863.4 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:863.9,866.4 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:869.23,871.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:872.36,874.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:876.30,877.31 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:877.31,877.71 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:884.54,887.2 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:889.43,890.32 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:894.2,894.41 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:890.32,893.3 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:898.72,899.20 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:903.2,908.40 4 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:923.2,923.34 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:926.2,926.32 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:932.2,933.30 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:938.2,939.113 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:948.2,948.16 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:951.2,951.30 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:964.2,964.19 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:983.2,983.18 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:899.20,901.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:908.40,909.48 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:909.48,911.40 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:916.4,917.18 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:920.4,920.33 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:911.40,914.5 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:917.18,919.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:923.34,925.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:926.32,927.44 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:927.44,929.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:933.30,935.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:939.113,940.57 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:943.3,943.32 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:946.3,946.13 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:940.57,942.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:943.32,945.4 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:948.16,950.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:951.30,962.3 9 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:964.19,965.31 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:969.3,969.46 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:981.3,981.78 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:965.31,966.32 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:966.32,966.74 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:969.46,970.103 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:977.4,977.49 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:970.103,972.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:977.49,979.5 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:995.134,1000.16 3 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:1004.2,1004.35 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:1007.2,1007.26 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:1000.16,1003.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:1004.35,1006.3 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:1007.26,1009.38 2 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:1009.38,1011.4 1 0 +github.com/ethereum/go-ethereum/core/state/statedb.go:1016.63,1017.35 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:1017.35,1019.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:1023.78,1025.13 2 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:1032.2,1032.13 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:1025.13,1031.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:1032.13,1037.3 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:1041.65,1043.2 1 1 +github.com/ethereum/go-ethereum/core/state/statedb.go:1046.115,1048.2 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:55.89,73.2 3 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:77.34,78.37 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:104.2,104.18 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:78.37,81.22 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:81.22,82.30 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:82.30,87.38 4 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:90.5,90.55 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:87.38,89.6 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:91.10,96.38 4 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:99.5,99.55 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:96.38,98.6 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:111.49,128.22 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:135.2,135.40 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:138.2,138.13 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:128.22,129.38 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:132.3,132.14 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:129.38,131.4 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:135.40,137.3 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:142.68,144.22 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:148.2,149.20 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:153.2,153.24 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:144.22,146.3 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:149.20,152.3 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:158.54,160.22 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:169.2,170.20 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:176.2,179.17 3 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:183.2,183.13 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:160.22,162.18 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:166.3,166.29 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:162.18,165.4 2 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:170.20,173.3 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:179.17,182.3 2 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:188.64,189.49 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:189.49,191.3 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:218.63,230.2 3 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:233.47,240.9 4 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:241.29,241.29 0 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:242.10,242.10 0 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:248.35,250.9 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:251.21,253.14 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:255.17,257.21 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:260.3,260.33 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:257.21,259.4 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:266.31,267.9 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:272.2,272.11 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:268.17,268.17 0 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:269.10,270.17 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:277.30,283.16 3 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:287.2,290.6 2 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:283.16,286.3 2 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:290.6,291.10 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:292.18,300.31 5 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:324.24,326.33 1 0 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:328.18,330.10 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:300.31,301.12 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:302.20,307.12 4 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:309.26,311.35 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:313.13,315.44 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:315.44,317.7 1 1 +github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:317.12,320.7 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:64.35,66.2 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:69.60,74.2 4 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:77.39,80.25 3 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:83.2,84.10 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:80.25,82.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:89.52,91.25 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:94.2,95.10 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:91.25,93.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:99.39,101.25 2 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:104.2,104.19 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:101.25,103.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:108.67,111.2 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:115.86,117.2 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:120.51,122.2 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:127.48,130.2 2 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:135.64,138.49 3 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:141.2,144.33 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:148.2,148.24 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:152.2,153.29 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:156.2,156.18 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:138.49,140.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:144.33,146.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:148.24,150.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:153.29,155.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:160.47,161.17 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:164.2,164.61 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:161.17,163.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:168.60,170.14 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:173.2,173.57 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:170.14,172.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:176.48,177.48 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:180.2,180.47 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:177.48,179.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:184.59,186.51 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:191.2,191.19 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:186.51,188.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:188.8,188.23 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:188.23,190.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:195.56,197.16 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:200.2,205.16 5 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:210.2,210.43 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:214.2,214.32 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:197.16,199.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:205.16,207.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:207.8,207.26 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:207.26,209.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:210.43,212.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:219.64,220.26 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:229.2,229.15 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:220.26,222.10 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:223.38,224.17 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:225.19,226.17 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:233.45,234.20 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:234.20,236.10 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:237.22,238.14 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:239.19,240.14 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:241.31,242.67 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:243.15,244.66 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:251.58,254.2 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:257.47,259.2 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:263.74,264.54 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:269.2,269.44 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:273.2,273.77 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:264.54,266.3 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:269.44,271.3 1 0 +github.com/ethereum/go-ethereum/crypto/crypto.go:276.56,279.2 2 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:281.30,282.23 1 1 +github.com/ethereum/go-ethereum/crypto/crypto.go:282.23,284.3 1 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:32.50,34.2 1 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:37.59,39.16 2 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:43.2,44.57 2 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:39.16,41.3 1 0 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:55.77,56.37 1 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:59.2,61.43 3 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:56.37,58.3 1 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:67.65,69.2 1 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:72.64,74.14 2 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:77.2,77.57 1 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:74.14,76.3 1 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:81.53,83.2 1 1 +github.com/ethereum/go-ethereum/crypto/signature_cgo.go:86.28,88.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:43.77,59.46 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:64.2,64.39 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:70.2,70.86 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:76.2,76.22 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:59.46,61.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:61.8,63.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:64.39,66.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:70.86,75.3 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:82.78,104.12 6 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:112.2,114.9 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:119.2,119.39 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:124.2,124.86 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:128.2,128.22 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:104.12,107.3 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:107.8,107.21 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:107.21,109.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:109.8,111.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:114.9,116.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:116.8,118.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:119.39,121.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:124.86,127.3 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:134.104,138.58 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:138.58,149.47 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:152.3,153.11 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:159.3,159.13 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:163.3,170.11 7 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:176.3,176.36 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:181.3,182.34 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:189.3,189.19 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:149.47,151.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:153.11,156.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:156.9,158.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:159.13,161.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:170.11,172.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:172.9,174.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:176.36,178.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:182.34,183.93 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:183.93,187.5 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:60.13,67.2 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:71.28,74.2 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:77.79,79.16 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:82.2,83.16 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:87.2,87.34 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:94.2,94.10 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:101.2,101.48 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:79.16,81.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:83.16,86.3 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:87.34,88.25 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:88.25,92.4 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:94.10,95.36 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:95.36,99.4 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:105.76,108.11 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:111.2,112.16 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:116.2,121.23 6 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:108.11,110.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:112.16,114.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:127.136,129.62 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:133.2,136.16 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:139.2,139.77 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:145.2,146.16 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:151.2,156.36 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:159.2,159.37 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:162.2,162.46 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:165.2,165.30 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:129.62,131.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:136.16,138.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:139.77,143.3 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:146.16,150.3 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:156.36,158.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:159.37,161.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:162.46,164.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:182.81,183.19 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:186.2,186.70 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:189.2,189.49 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:183.19,185.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:186.70,188.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:195.62,201.9 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:211.2,211.48 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:217.2,217.21 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:201.9,202.44 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:208.3,208.29 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:202.44,204.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:204.9,207.4 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:211.48,216.3 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:231.41,233.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:236.71,237.19 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:237.19,240.11 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:244.3,244.16 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:250.3,251.24 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:254.3,264.17 6 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:268.3,271.95 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:272.3,272.17 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:279.3,279.49 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:240.11,242.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:244.16,248.4 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:251.24,253.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:264.17,267.4 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:271.95,271.135 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:272.17,277.4 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:279.49,283.4 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:288.29,289.19 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:289.19,293.3 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:308.43,310.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:313.73,314.19 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:314.19,321.11 5 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:326.3,326.16 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:336.3,337.24 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:340.3,350.17 6 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:354.3,360.98 4 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:361.3,361.17 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:368.3,368.49 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:321.11,324.4 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:326.16,334.4 5 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:337.24,339.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:350.17,353.4 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:360.98,360.141 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:361.17,366.4 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:368.49,372.4 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:379.36,381.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:384.31,385.19 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:385.19,389.3 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:393.42,396.2 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:399.44,402.2 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:461.65,462.23 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:465.2,465.29 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:469.2,469.54 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:472.2,472.58 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:475.2,482.34 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:485.2,486.15 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:462.23,464.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:465.29,468.3 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:469.54,471.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:472.58,474.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:482.34,484.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:491.56,493.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:498.25,505.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:510.41,518.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:523.50,531.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:535.29,542.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:546.26,548.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:551.37,553.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:556.48,557.29 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:565.2,565.12 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:557.29,559.27 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:562.3,563.25 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:559.27,561.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:571.50,580.20 5 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:584.2,584.16 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:580.20,583.3 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:593.66,600.35 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:618.2,618.16 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:600.35,601.13 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:601.13,604.22 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:604.22,607.5 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:609.8,613.21 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:613.21,616.4 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:623.37,628.2 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:635.47,640.26 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:645.2,646.9 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:640.26,643.3 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:647.35,647.35 0 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:648.10,648.10 0 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:656.42,658.78 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:661.2,663.9 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:671.2,671.49 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:658.78,660.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:664.40,664.40 0 1 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:665.30,667.33 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:675.73,692.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:696.36,698.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/mmap_help_other.go:30.47,36.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:51.140,53.80 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:64.2,64.26 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:68.2,72.24 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:80.2,81.18 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:84.2,84.17 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:88.2,88.26 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:91.2,95.31 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:103.2,103.12 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:127.2,127.12 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:53.80,56.10 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:61.3,61.13 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:57.42,57.42 0 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:58.11,59.126 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:64.26,66.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:72.24,74.17 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:78.3,78.55 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:74.17,77.4 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:81.18,83.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:84.17,86.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:88.26,90.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:95.31,97.33 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:97.33,100.4 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:103.12,105.10 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:125.3,125.14 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:106.15,108.16 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:109.26,111.11 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:116.4,116.16 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:117.24,120.67 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:112.27,112.27 0 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:113.12,114.128 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:120.67,122.5 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:132.115,150.6 5 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:187.2,187.28 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:150.6,151.10 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:152.16,156.16 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:158.11,161.35 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:166.4,167.51 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:182.4,182.11 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:161.35,164.5 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:167.51,174.12 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:180.5,180.17 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:175.42,176.93 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:177.18,178.94 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:245.84,265.2 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:267.31,268.15 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:275.2,278.6 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:268.15,273.3 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:278.6,279.10 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:280.27,285.18 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:287.32,289.29 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:295.35,297.65 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:303.35,306.22 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:308.31,311.33 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:315.4,315.16 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:317.19,319.34 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:325.4,325.29 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:333.24,334.10 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:289.29,291.5 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:291.10,293.5 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:297.65,299.5 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:299.10,301.5 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:311.33,314.5 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:319.34,320.47 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:320.47,322.6 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:325.29,326.38 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:326.38,327.72 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:327.72,329.7 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:346.53,356.2 7 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:360.37,366.32 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:372.2,373.35 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:366.32,368.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:368.8,370.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:373.35,375.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:378.103,382.16 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:386.2,392.16 6 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:382.16,385.3 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:392.16,394.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:394.8,397.3 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:403.109,404.27 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:409.2,410.18 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:415.2,420.17 5 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:427.2,427.22 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:431.2,437.70 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:448.2,449.14 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:404.27,407.3 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:410.18,413.3 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:420.17,421.64 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:421.64,424.4 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:427.22,430.3 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:437.70,438.10 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:439.30,441.15 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:442.11,444.16 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:53.37,55.22 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:58.2,58.29 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:55.22,57.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:64.38,66.65 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:69.2,69.13 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:66.65,68.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:74.39,76.22 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:79.2,79.31 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:76.22,78.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:85.40,87.64 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:90.2,90.13 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:87.64,89.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:100.37,108.9 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:111.2,112.40 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:108.9,109.42 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:112.40,116.3 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:121.36,123.25 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:126.2,127.46 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:130.2,130.13 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:123.25,125.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:127.46,129.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:139.62,144.15 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:154.2,171.12 12 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:182.2,186.70 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:191.2,193.35 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:207.2,207.23 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:144.15,148.30 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:151.3,151.90 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:148.30,150.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:171.12,172.7 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:172.7,173.11 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:174.16,175.11 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:176.39,177.186 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:186.70,189.3 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:193.35,194.29 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:194.29,204.4 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:207.23,209.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:213.26,214.38 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:214.38,216.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:223.30,225.2 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:228.43,229.32 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:229.32,231.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:236.81,244.33 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:247.2,251.35 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:255.2,255.46 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:260.2,260.29 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:263.2,264.12 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:244.33,246.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:251.35,253.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:255.46,258.3 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:260.29,262.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:269.67,274.15 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:285.2,303.31 13 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:333.2,333.13 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:274.15,278.30 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:281.3,281.90 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:278.30,280.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:303.31,304.19 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:304.19,314.30 6 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:318.4,319.47 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:314.30,316.5 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:319.47,321.16 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:324.5,326.70 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:321.16,323.6 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:326.70,328.6 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:338.109,352.32 8 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:356.2,358.36 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:366.2,366.35 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:369.2,372.26 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:375.2,375.58 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:352.32,354.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:358.36,360.51 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:363.3,363.21 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:360.51,362.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:366.35,368.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:372.26,374.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:381.94,384.40 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:393.2,393.45 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:384.40,388.34 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:391.3,391.14 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:388.34,390.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:399.82,400.40 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:404.2,404.63 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:400.40,403.3 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:41.46,42.30 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:46.2,50.9 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:55.2,55.9 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:42.30,44.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:51.75,51.75 0 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:52.34,53.39 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:56.24,57.19 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:58.21,59.26 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:66.83,67.30 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:71.2,72.9 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:82.2,83.19 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:67.30,69.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:78.4,78.4 0 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:79.34,80.15 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:92.74,93.30 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:97.2,98.9 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:105.2,106.13 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:93.30,95.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:99.91,99.91 0 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:100.34,101.15 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/api.go:110.38,112.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:94.76,96.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:100.110,102.43 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:106.2,107.51 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:110.2,111.19 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:115.2,115.83 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:102.43,104.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:107.51,109.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:111.19,113.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:121.143,123.64 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:132.2,133.28 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:138.2,145.31 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:154.2,155.12 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:181.2,181.25 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:123.64,125.37 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:128.3,128.24 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:125.37,127.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:133.28,135.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:145.31,146.13 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:146.13,147.30 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:147.30,150.5 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:155.12,162.7 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:162.7,163.11 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:164.22,165.33 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:169.25,170.52 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:176.17,177.11 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:165.33,168.6 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:170.52,172.31 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:172.31,174.7 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:184.148,186.16 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:191.2,191.19 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:194.2,194.89 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:186.16,188.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:188.8,188.65 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:188.65,190.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:191.19,193.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:199.91,201.43 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:205.2,205.37 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:208.2,208.30 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:212.2,215.25 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:234.2,238.39 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:257.2,257.12 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:201.43,203.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:205.37,207.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:208.30,210.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:215.25,217.28 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:220.3,222.55 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:232.3,232.55 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:217.28,218.9 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:222.55,225.23 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:228.4,228.44 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:225.23,226.10 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:228.44,230.5 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:238.39,241.28 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:244.3,247.29 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:250.3,250.83 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:253.3,253.119 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:241.28,243.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:247.29,249.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:250.83,252.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:253.119,255.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:263.145,265.61 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:269.2,269.12 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:274.2,274.32 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:278.2,280.42 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:284.2,284.42 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:288.2,288.38 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:292.2,292.45 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:305.2,305.90 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:309.2,309.10 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:315.2,315.78 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:318.2,318.77 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:321.2,321.12 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:265.61,267.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:269.12,270.66 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:270.66,272.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:274.32,276.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:280.42,282.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:284.42,286.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:288.38,290.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:292.45,294.28 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:297.3,297.79 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:294.28,296.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:297.79,299.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:300.8,300.88 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:300.88,303.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:305.90,307.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:309.10,310.65 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:310.65,312.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:315.78,317.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:318.77,320.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:327.117,329.2 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:334.93,336.9 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:337.35,338.45 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:339.29,340.45 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:341.34,342.45 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:343.37,344.52 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:345.32,346.47 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:347.32,348.47 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:349.10,350.46 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:367.100,371.58 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:371.58,388.47 7 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:394.3,394.28 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:398.3,403.42 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:408.3,409.50 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:413.3,418.32 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:423.3,423.11 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:388.47,390.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:390.9,392.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:394.28,396.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:403.42,405.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:409.50,411.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:418.32,422.4 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:430.74,450.27 8 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:454.2,459.41 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:463.2,468.31 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:473.2,473.10 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:450.27,452.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:459.41,461.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:468.31,472.3 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:479.73,488.71 7 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:493.2,493.44 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:497.2,499.31 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:506.2,506.13 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:488.71,490.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:490.8,492.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:493.44,495.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:499.31,505.3 4 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:517.111,519.80 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:527.2,527.26 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:531.2,531.35 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:535.2,542.13 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:556.2,556.14 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:570.2,570.47 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:573.2,574.51 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:577.2,577.12 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:519.80,521.48 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:524.3,524.13 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:521.48,523.4 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:527.26,529.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:531.35,533.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:542.13,544.26 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:544.26,550.4 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:550.9,553.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:556.14,560.40 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:563.3,567.27 2 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:560.40,562.4 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:570.47,572.3 1 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:574.51,576.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:582.94,584.19 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:587.2,588.12 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:584.19,586.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:593.161,597.2 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:601.221,607.2 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:610.73,628.27 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:631.2,633.13 3 1 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:628.27,630.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:645.120,648.39 2 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:651.2,651.44 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:655.2,657.31 3 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:667.2,667.43 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:648.39,650.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:651.44,653.3 1 0 +github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:657.31,666.3 7 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:28.80,32.31 3 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:43.2,43.21 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:32.31,34.21 2 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:37.3,37.20 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:41.3,41.36 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:34.21,36.4 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:37.20,40.4 2 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:46.87,53.35 6 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:172.2,179.18 8 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:53.35,171.3 113 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_ref.go:10.80,12.2 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:50.51,51.21 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:54.2,54.38 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:59.2,59.33 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:62.2,71.15 4 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:51.21,53.3 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:54.38,58.3 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:59.33,61.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:84.50,85.16 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:88.2,88.21 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:85.16,86.44 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:91.27,94.2 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:96.23,106.45 8 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:109.2,110.20 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:106.45,108.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:113.49,114.17 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:119.2,119.22 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:123.2,124.29 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:129.2,129.18 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:142.2,142.21 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:155.2,155.30 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:169.2,169.8 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:114.17,117.3 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:119.22,121.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:124.29,127.3 2 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:129.18,131.25 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:136.3,139.40 4 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:131.25,135.4 3 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:142.21,153.3 8 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:155.30,156.33 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:159.3,167.30 7 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:156.33,158.4 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:172.46,174.21 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:174.21,176.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/register.go:15.13,16.33 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/register.go:20.2,20.33 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/register.go:25.2,25.33 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/register.go:30.2,32.53 3 1 +github.com/ethereum/go-ethereum/crypto/blake2b/register.go:16.33,19.3 2 0 +github.com/ethereum/go-ethereum/crypto/blake2b/register.go:20.33,23.3 2 0 +github.com/ethereum/go-ethereum/crypto/blake2b/register.go:25.33,28.3 2 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:53.37,57.2 3 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:60.40,66.2 5 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:69.40,75.2 5 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:79.44,79.75 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:83.44,83.78 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:87.44,87.78 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:97.51,97.82 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:103.76,105.11 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:108.2,108.44 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:105.11,107.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:111.59,112.37 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:115.2,115.21 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:118.2,124.15 4 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:112.37,114.3 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:115.21,117.3 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:127.59,132.45 4 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:141.2,144.22 4 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:147.2,151.39 3 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:132.45,134.18 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:137.3,138.18 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:134.18,136.4 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:144.22,146.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:151.39,153.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:156.73,160.31 3 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:171.2,171.21 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:160.31,162.21 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:165.3,165.20 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:169.3,169.29 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:162.21,164.4 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:165.20,168.4 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:190.50,191.19 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:194.2,196.25 3 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:199.2,205.15 6 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:191.19,193.3 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:196.25,198.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:208.50,209.60 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:212.2,212.29 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:215.2,216.25 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:219.2,226.12 8 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:209.60,211.3 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:212.29,214.3 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:216.25,218.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:229.34,229.54 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:231.29,231.46 1 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:233.26,237.18 4 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:237.18,240.3 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:243.53,246.18 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:258.2,258.42 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:267.2,267.16 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:271.2,271.8 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:246.18,248.21 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:252.3,255.20 4 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:248.21,251.4 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:258.42,260.19 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:263.3,264.13 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:260.19,262.4 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:267.16,269.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:274.41,278.2 3 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:280.45,286.22 5 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:289.2,294.22 4 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:286.22,288.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:294.22,296.3 1 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:299.46,303.2 3 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:305.46,309.2 3 0 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:311.47,314.2 2 1 +github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:316.47,319.2 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:44.52,49.25 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:55.2,58.25 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:69.2,71.12 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:49.25,52.3 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:58.25,61.26 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:66.3,67.67 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:61.26,64.4 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:74.51,78.31 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:78.31,79.36 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:79.36,80.21 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:80.21,82.5 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:87.50,91.27 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:97.2,98.27 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:104.2,104.12 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:91.27,92.26 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:92.26,94.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:98.27,99.31 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:99.31,101.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:108.33,112.22 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:112.22,114.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:28.51,29.6 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:29.6,31.33 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:31.33,33.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:44.51,46.16 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:50.2,50.42 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:46.16,48.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:53.30,55.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:59.45,60.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:63.2,64.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:60.16,62.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:68.48,69.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:72.2,73.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:69.16,71.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:77.32,78.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:81.2,82.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:78.16,80.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:86.29,87.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:90.2,91.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:87.16,89.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:95.29,96.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:99.2,100.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:96.16,98.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:104.31,108.16 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:112.2,114.22 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:117.2,124.12 6 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:108.16,110.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:114.22,116.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:129.50,132.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:136.2,136.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:141.2,142.42 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:145.2,145.53 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:149.2,153.36 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:166.2,166.28 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:132.25,134.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:136.16,138.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:138.8,140.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:142.42,144.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:145.53,147.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:153.36,158.3 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:158.8,162.23 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:162.23,164.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:176.51,178.16 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:182.2,182.42 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:178.16,180.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:185.30,187.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:191.45,192.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:195.2,196.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:192.16,194.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:200.48,201.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:204.2,205.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:201.16,203.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:209.32,210.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:213.2,214.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:210.16,212.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:218.29,219.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:222.2,223.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:219.16,221.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:227.29,228.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:231.2,232.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:228.16,230.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:236.31,240.16 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:244.2,246.22 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:249.2,260.12 10 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:240.16,242.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:246.22,248.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:265.50,268.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:272.2,272.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:275.2,276.44 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:279.2,279.55 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:282.2,282.57 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:285.2,285.57 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:289.2,294.38 5 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:307.2,307.28 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:268.25,270.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:272.16,274.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:276.44,278.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:279.55,281.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:282.57,284.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:285.57,287.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:294.38,299.3 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:299.8,303.23 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:303.23,305.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:317.31,319.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:322.42,326.30 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:332.2,332.41 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:326.30,327.49 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:330.3,330.39 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:327.49,328.12 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:338.33,340.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:342.30,344.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:347.48,348.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:351.2,352.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:348.16,350.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:356.32,357.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:360.2,361.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:357.16,359.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:365.29,366.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:369.2,370.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:366.16,368.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:374.29,375.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:378.2,379.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:375.16,377.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:383.29,387.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:390.31,394.16 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:399.2,427.12 27 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:394.16,397.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:432.50,436.26 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:440.2,440.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:444.2,445.46 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:448.2,448.57 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:451.2,451.59 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:454.2,454.59 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:457.2,457.59 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:460.2,460.59 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:463.2,463.59 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:466.2,466.59 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:469.2,469.59 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:472.2,472.59 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:475.2,475.60 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:478.2,478.60 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:481.2,494.29 13 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:436.26,438.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:440.16,442.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:445.46,447.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:448.57,450.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:451.59,453.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:454.59,456.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:457.59,459.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:460.59,462.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:463.59,465.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:466.59,468.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:469.59,471.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:472.59,474.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:475.60,477.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:478.60,480.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/constants.go:11.39,14.2 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:23.38,29.2 5 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:31.41,36.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:39.39,41.20 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:45.2,51.19 6 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:41.20,43.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:54.36,59.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:61.40,63.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:65.44,66.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:70.2,70.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:80.2,117.22 23 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:121.2,149.21 19 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:66.20,69.3 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:70.20,73.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:117.22,120.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:152.44,183.2 24 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:185.58,198.45 10 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:206.2,206.12 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:198.45,200.26 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:200.26,202.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:202.9,204.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:209.35,210.23 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:219.2,230.18 9 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:210.23,212.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:212.8,212.30 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:212.30,217.3 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:233.41,238.2 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:10.33,11.12 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:18.2,19.12 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:11.12,13.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:13.8,16.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:22.31,24.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:26.27,31.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:33.30,40.34 5 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:49.2,50.12 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:40.34,41.39 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:41.39,42.32 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:45.4,45.31 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:42.32,44.5 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:53.35,54.31 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:54.31,55.32 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:55.32,57.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:61.42,63.31 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:70.2,70.26 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:78.2,78.55 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:63.31,65.32 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:65.32,67.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:70.26,71.19 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:74.3,74.19 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:71.19,73.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:74.19,76.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:81.28,81.48 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:82.28,82.53 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:17.33,19.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:21.38,25.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:27.34,31.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:33.33,37.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:39.31,41.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:43.30,45.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:47.44,51.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:53.38,57.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:60.44,65.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:68.46,73.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:75.46,80.2 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:82.41,86.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:88.41,92.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:94.41,105.2 8 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:107.53,111.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:113.54,117.43 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:126.2,127.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:117.43,119.24 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:119.24,121.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:121.9,123.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:130.41,144.2 10 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:146.41,160.2 9 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:13.33,18.2 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:20.32,22.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:24.35,28.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:30.32,34.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:36.31,40.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:42.30,45.2 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:47.29,50.2 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:52.41,56.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:58.35,62.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:64.38,68.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:70.38,74.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:78.38,92.2 11 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:94.49,98.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:101.37,122.2 15 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:124.38,138.2 9 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:140.38,156.2 10 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:3.99,50.2 29 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:52.89,92.2 26 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:94.41,112.2 14 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:122.50,141.45 13 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:178.2,206.12 19 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:141.45,143.31 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:147.3,150.28 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:159.3,160.11 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:143.31,145.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:151.10,152.60 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:153.11,154.59 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:155.11,156.12 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:212.44,261.2 36 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:263.54,267.38 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:270.2,270.12 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:267.38,269.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:33.38,37.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:39.41,44.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:47.39,49.20 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:53.2,57.16 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:60.2,62.24 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:49.20,51.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:57.16,59.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:65.36,70.2 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:72.40,74.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:76.44,79.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:83.2,83.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:89.2,109.22 16 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:113.2,132.16 16 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:79.20,82.3 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:83.20,86.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:109.22,112.3 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:135.44,162.2 21 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:164.58,167.40 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:176.2,176.12 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:167.40,169.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:169.25,171.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:171.9,173.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:179.35,180.17 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:189.2,196.14 8 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:180.17,182.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:182.8,182.25 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:182.25,187.3 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:199.41,204.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:13.32,15.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:17.35,22.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:24.32,29.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:31.31,36.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:38.30,40.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:42.29,44.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:46.35,51.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:53.41,61.2 6 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:64.43,71.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:73.43,78.2 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:80.38,85.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:87.38,92.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:94.38,122.2 20 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:124.50,129.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:131.46,136.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:139.38,147.2 6 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:149.38,169.2 15 1 +github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:171.38,213.2 22 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:62.54,64.2 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:67.57,74.2 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:83.56,87.2 3 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:90.53,93.2 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:97.106,99.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:102.2,107.19 6 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:110.2,111.8 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:99.16,101.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:107.19,109.3 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:116.45,118.2 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:121.97,122.38 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:125.2,125.44 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:129.2,130.14 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:134.2,137.16 4 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:122.38,124.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:125.44,127.3 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:130.14,132.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:146.64,149.54 3 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:157.2,157.18 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:149.54,156.3 6 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:161.39,163.2 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:166.75,174.2 7 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:178.71,184.2 5 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:187.77,191.2 3 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:194.92,196.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:200.2,201.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:204.2,209.8 5 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:196.16,198.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:201.16,203.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:214.76,216.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:220.2,224.8 4 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:216.16,218.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:232.87,234.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:238.2,239.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:243.2,244.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:248.2,252.47 4 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:256.2,263.16 7 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:234.16,236.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:239.16,241.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:244.16,246.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:252.47,254.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:267.72,268.17 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:271.2,272.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:276.2,285.14 3 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:295.2,301.16 6 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:305.2,306.16 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:309.2,312.50 3 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:316.2,316.47 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:268.17,270.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:272.16,274.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:286.15,288.33 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:291.10,292.34 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:288.33,290.4 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:301.16,303.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:306.16,308.3 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:312.50,314.3 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/params.go:123.67,125.2 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/params.go:129.66,131.2 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/params.go:133.57,135.19 2 1 +github.com/ethereum/go-ethereum/crypto/ecies/params.go:140.2,140.31 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/params.go:143.2,143.20 1 1 +github.com/ethereum/go-ethereum/crypto/ecies/params.go:135.19,136.57 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/params.go:136.57,138.4 1 0 +github.com/ethereum/go-ethereum/crypto/ecies/params.go:140.31,142.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:42.39,45.15 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:48.2,51.25 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:58.2,58.11 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:45.15,47.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:51.25,57.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:61.38,63.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:65.48,66.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:69.2,70.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:73.2,73.32 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:66.19,68.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:70.16,72.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:76.32,84.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:86.30,89.25 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:100.2,100.12 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:89.25,99.3 9 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:103.30,105.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:107.35,108.26 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:111.2,111.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:108.26,110.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:114.26,122.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:124.25,126.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:128.46,130.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:133.2,133.27 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:130.16,132.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:136.30,138.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:140.28,143.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:145.29,148.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:150.29,152.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:154.28,156.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:158.32,159.26 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:166.2,166.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:159.26,160.21 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:160.21,162.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:162.9,162.28 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:162.28,164.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:169.35,171.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:173.26,177.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:179.30,186.2 6 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:188.29,197.2 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:199.27,203.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:205.26,209.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:211.33,215.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:217.47,219.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:222.2,223.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:226.2,226.28 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:219.16,221.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:223.16,225.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:229.28,231.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:233.29,235.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:237.35,239.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:241.27,243.20 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:247.2,248.20 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:243.20,246.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:251.27,256.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:258.26,263.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:265.33,270.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:272.47,274.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:277.2,278.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:281.2,282.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:285.2,285.33 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:274.16,276.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:278.16,280.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:282.16,284.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:288.28,290.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:292.29,294.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:296.35,298.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:300.29,304.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:306.28,310.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:312.36,316.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:318.49,320.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:323.2,324.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:327.2,327.29 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:320.16,322.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:324.16,326.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:330.29,332.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:334.30,336.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:338.37,340.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:32.27,34.30 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:37.2,37.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:34.30,36.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:40.20,43.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:45.50,46.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:49.2,50.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:53.2,54.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:57.2,57.28 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:46.19,48.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:50.16,52.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:54.16,56.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:60.38,65.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:67.26,69.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:71.27,73.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:75.26,77.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:79.33,82.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:84.36,87.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:89.34,92.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:94.33,97.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:99.36,102.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:104.34,107.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:109.33,112.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:114.36,117.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:119.30,122.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:124.33,134.2 9 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:136.36,146.2 9 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:148.33,155.2 6 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:157.36,164.2 6 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:166.42,171.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:173.33,181.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:183.34,192.2 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:194.41,197.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:199.42,201.39 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:207.2,207.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:201.39,203.20 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:203.20,205.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:210.51,212.18 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:216.2,216.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:212.18,215.3 2 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:219.54,220.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:220.18,223.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:226.36,233.31 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:238.2,242.23 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:233.31,237.3 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:245.50,252.2 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:21.33,24.25 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:27.2,36.8 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:39.2,52.8 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:59.2,61.26 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:64.2,64.13 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:24.25,26.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:36.8,38.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:52.8,55.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:55.8,58.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:61.26,63.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:69.44,70.14 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:73.2,75.25 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:78.2,86.8 9 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:89.2,102.8 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:109.2,111.26 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:114.2,114.13 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:70.14,72.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:75.25,77.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:86.8,88.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:102.8,105.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:105.8,108.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:111.26,113.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:35.29,38.31 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:41.2,41.31 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:44.2,44.34 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:38.31,40.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:41.31,43.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:47.30,49.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:52.2,52.22 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:49.16,51.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:55.27,57.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:59.52,60.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:63.2,65.16 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:68.2,69.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:72.2,72.29 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:60.20,62.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:65.16,67.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:69.16,71.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:75.40,81.2 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:83.28,85.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:87.29,89.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:91.28,93.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:95.35,100.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:102.35,106.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:108.35,113.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:115.32,119.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:121.38,125.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:127.35,138.2 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:140.45,164.2 23 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:166.35,178.2 11 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:180.38,192.2 11 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:194.47,204.2 9 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:206.36,216.2 9 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:218.57,229.2 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:231.44,233.39 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:239.2,239.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:233.39,235.20 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:235.20,237.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:242.54,244.39 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:250.2,250.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:244.39,246.20 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:246.20,248.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:253.53,257.15 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:258.9,259.9 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:260.9,261.24 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:262.10,263.62 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:267.56,271.15 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:272.9,273.9 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:274.9,275.24 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:276.10,277.62 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:33.27,35.30 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:38.2,38.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:35.30,37.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:41.26,43.14 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:46.2,46.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:43.14,45.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:49.49,50.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:53.2,55.16 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:58.2,59.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:62.2,63.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:66.2,66.33 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:50.18,52.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:55.16,57.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:59.16,61.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:63.16,65.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:69.38,76.2 6 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:78.26,80.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:82.27,84.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:86.26,88.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:90.33,95.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:97.36,102.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:104.33,109.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:111.36,116.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:118.33,123.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:125.36,130.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:132.30,137.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:139.33,165.2 25 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:167.36,193.2 25 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:195.33,214.2 18 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:216.50,234.2 17 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:236.47,254.2 17 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:256.42,262.2 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:264.42,270.2 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:272.49,277.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:279.42,281.39 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:287.2,287.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:281.39,283.20 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:283.20,285.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:290.34,313.2 22 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:315.51,320.19 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:321.9,322.9 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:323.9,326.24 3 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:327.10,329.53 2 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:333.54,339.19 6 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:340.9,341.9 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:342.9,346.24 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:347.10,349.52 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:32.27,34.2 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:37.22,40.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:43.26,45.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:48.31,50.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:53.18,56.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:59.27,61.2 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:65.47,67.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:70.2,70.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:73.2,73.15 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:67.16,69.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:70.19,72.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:77.35,79.2 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:82.33,86.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:89.23,91.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:94.30,96.2 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:99.30,101.2 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:104.30,106.2 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:109.30,111.2 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:114.39,116.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:119.31,121.2 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:20.29,29.35 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:39.2,45.13 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:29.35,38.3 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:49.38,50.14 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:54.2,60.35 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:70.2,76.13 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:50.14,52.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:60.35,69.3 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:24.40,26.19 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:29.2,30.19 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:33.2,34.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:26.19,28.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:30.19,32.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:37.40,39.19 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:42.2,43.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:39.19,41.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:46.41,48.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:51.2,51.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:54.2,55.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:48.16,50.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:51.19,53.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:58.28,62.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:64.28,68.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:70.33,74.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:76.23,78.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:80.25,82.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:84.32,86.35 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:92.2,92.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:86.35,88.20 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:88.20,90.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:95.26,96.16 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:100.2,108.27 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:133.2,133.12 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:138.2,138.28 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:143.2,143.36 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:146.2,150.29 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:153.2,153.12 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:96.16,99.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:108.27,109.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:113.3,113.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:130.3,130.9 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:109.17,111.9 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:113.17,116.4 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:116.9,116.24 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:116.24,119.4 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:119.9,119.27 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:119.27,124.4 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:124.9,129.4 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:133.12,136.3 2 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:138.28,141.3 2 0 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:143.36,145.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:150.29,152.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:156.26,161.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:163.43,167.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:31.45,36.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:39.35,45.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:58.18,60.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:62.24,63.14 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:66.2,67.18 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:63.14,65.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:70.25,72.25 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:75.2,75.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:72.25,74.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:79.27,81.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:83.62,85.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:88.2,89.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:92.2,93.37 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:85.16,87.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:89.16,91.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:101.53,102.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:105.2,106.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:109.2,110.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:114.2,114.32 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:117.2,119.21 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:122.2,122.15 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:102.20,104.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:106.16,108.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:110.16,112.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:114.32,116.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:119.21,121.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:126.55,127.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:130.2,132.16 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:135.2,136.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:139.2,140.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:143.2,144.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:147.2,151.32 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:127.20,129.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:132.16,134.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:136.16,138.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:140.16,142.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:144.16,146.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:157.41,159.17 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:162.2,165.12 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:159.17,161.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:169.45,180.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:183.29,185.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:188.30,190.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:193.29,196.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:199.38,201.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:204.42,205.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:208.2,208.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:211.2,220.45 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:205.18,207.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:208.18,210.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:224.49,228.2 3 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:231.41,232.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:235.2,244.25 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:232.17,234.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:248.40,250.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:253.42,254.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:257.2,257.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:266.2,266.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:254.17,256.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:257.20,265.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:270.47,272.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:275.2,275.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:278.2,287.22 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:293.2,314.10 22 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:272.18,274.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:275.18,277.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:287.22,288.23 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:291.3,291.18 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:288.23,290.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:318.45,320.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:323.2,346.10 24 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:320.17,322.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:350.42,355.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:358.45,363.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:366.60,370.25 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:376.2,376.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:370.25,371.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:374.3,374.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:371.20,373.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:380.40,382.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:388.91,389.32 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:392.2,393.23 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:396.2,400.34 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:403.2,406.21 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:430.2,431.41 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:437.2,437.24 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:389.32,391.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:393.23,395.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:400.34,402.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:406.21,409.36 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:412.3,412.36 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:420.3,421.41 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:425.3,428.11 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:409.36,411.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:412.36,415.18 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:418.4,418.52 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:415.18,417.5 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:421.41,424.4 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:431.41,432.34 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:435.3,435.30 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:432.34,434.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:444.54,447.16 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:450.2,455.25 6 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:447.16,449.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:24.45,26.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:39.33,52.2 6 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:59.40,61.26 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:64.2,65.35 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:61.26,63.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:69.60,71.18 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:75.2,75.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:71.18,74.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:79.63,83.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:86.34,89.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:91.38,93.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:95.33,98.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:100.58,132.2 30 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:134.61,163.2 27 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:165.73,167.29 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:170.2,172.39 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:167.29,169.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:172.39,174.20 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:179.3,179.6 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:174.20,178.4 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:183.38,186.34 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:189.2,193.48 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:212.2,212.22 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:186.34,188.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:193.48,194.14 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:197.3,197.38 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:202.3,202.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:210.3,210.6 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:194.14,196.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:197.38,201.4 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:202.20,204.39 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:204.39,208.5 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:215.34,219.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:221.36,255.2 31 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:257.36,259.23 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:262.2,264.10 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:259.23,261.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:268.31,270.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:273.30,277.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:280.27,282.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:43.23,55.361 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:55.361,63.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:66.26,78.361 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:78.361,86.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:89.24,97.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:99.27,107.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:109.23,121.361 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:121.361,129.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:132.26,144.361 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:144.361,152.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:155.24,164.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:166.23,174.12 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:174.12,182.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:185.26,193.12 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:193.12,201.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:204.27,212.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:214.24,215.16 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:219.2,225.57 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:215.16,218.3 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:228.23,231.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:336.2,336.361 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:231.2,247.3 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:248.2,264.3 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:265.2,281.3 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:282.2,298.3 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:299.2,315.3 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:316.2,332.3 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:336.361,344.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:347.23,352.2 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:440.2,440.361 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:352.2,368.3 14 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:369.2,384.3 13 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:385.2,399.3 12 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:400.2,413.3 11 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:414.2,425.3 9 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:426.2,436.3 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:440.361,448.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:468.58,475.2 6 0 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:478.40,484.2 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:487.51,493.2 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:496.54,504.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:507.60,520.2 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:522.57,532.2 8 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:534.58,546.2 9 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:548.55,557.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:559.57,567.2 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:30.45,35.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:38.35,43.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:55.18,58.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:60.25,62.25 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:65.2,65.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:62.25,64.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:69.27,71.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:73.62,75.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:78.2,79.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:82.2,83.37 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:75.16,77.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:79.16,81.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:91.53,92.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:95.2,96.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:99.2,100.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:104.2,104.32 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:107.2,109.21 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:112.2,112.15 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:92.19,94.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:96.16,98.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:100.16,102.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:104.32,106.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:109.21,111.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:116.55,117.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:120.2,123.16 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:127.2,128.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:131.2,133.32 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:117.20,119.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:123.16,125.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:128.16,130.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:139.41,141.17 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:144.2,147.12 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:141.17,143.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:151.45,159.2 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:162.29,164.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:167.30,169.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:172.29,175.2 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:178.38,180.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:183.42,184.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:187.2,187.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:190.2,199.45 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:184.18,186.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:187.18,189.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:203.49,207.2 3 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:210.41,211.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:214.2,223.25 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:211.17,213.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:227.40,229.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:232.42,233.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:236.2,236.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:245.2,245.10 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:233.17,235.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:236.20,244.3 7 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:249.47,251.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:254.2,254.18 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:257.2,266.22 10 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:272.2,293.10 22 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:251.18,253.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:254.18,256.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:266.22,267.23 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:270.3,270.18 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:267.23,269.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:297.45,299.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:302.2,325.10 24 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:299.17,301.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:329.42,334.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:337.45,342.2 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:345.60,349.25 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:355.2,355.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:349.25,350.20 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:353.3,353.17 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:350.20,352.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:359.40,361.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:367.91,368.32 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:371.2,372.23 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:375.2,379.34 5 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:382.2,385.21 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:409.2,410.41 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:416.2,416.24 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:368.32,370.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:372.23,374.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:379.34,381.3 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:385.21,388.36 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:391.3,391.36 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:399.3,400.41 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:404.3,407.11 4 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:388.36,390.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:391.36,394.18 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:397.4,397.52 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:394.18,396.5 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:400.41,403.4 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:410.41,411.34 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:414.3,414.30 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:411.34,413.4 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:423.54,425.16 2 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:428.2,433.25 6 1 +github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:425.16,427.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:26.38,28.2 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:32.52,33.19 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:37.2,37.26 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:42.2,44.17 3 1 +github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:33.19,35.3 1 0 +github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:37.26,38.26 1 1 +github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:38.26,40.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:43.46,50.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:52.38,54.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:56.40,61.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:63.41,68.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:71.39,80.42 8 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:83.2,85.24 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:80.42,82.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:88.36,90.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:92.40,94.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:96.58,99.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:103.2,103.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:109.2,129.22 16 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:133.2,167.14 30 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:99.20,102.3 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:103.20,106.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:129.22,132.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:170.58,206.2 29 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:208.84,213.40 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:222.2,225.10 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:213.40,215.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:215.25,217.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:217.9,219.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:230.59,231.17 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:234.2,234.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:241.2,254.10 12 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:231.17,233.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:234.20,240.3 5 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:257.60,263.2 5 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:41.51,45.6 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:55.2,55.42 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:45.6,47.17 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:50.3,50.19 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:47.17,49.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:50.19,51.9 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:58.30,60.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:63.69,65.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:69.45,70.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:73.2,74.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:70.16,72.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:78.48,79.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:82.2,83.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:79.16,81.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:88.32,89.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:92.2,93.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:89.16,91.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:97.29,98.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:101.2,102.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:98.16,100.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:106.31,110.22 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:114.2,123.12 7 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:110.22,112.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:128.50,131.26 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:135.2,135.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:138.2,139.23 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:142.2,143.23 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:147.2,147.44 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:160.2,160.28 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:131.26,133.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:135.16,137.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:139.23,141.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:143.23,145.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:147.44,152.3 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:152.8,156.23 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:156.23,158.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:170.51,174.6 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:184.2,184.42 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:174.6,176.17 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:179.3,179.19 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:176.17,178.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:179.19,180.9 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:187.30,189.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:193.57,195.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:199.45,200.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:203.2,204.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:200.16,202.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:208.48,209.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:212.2,213.10 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:209.16,211.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:218.32,219.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:222.2,223.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:219.16,221.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:227.31,231.22 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:235.2,248.12 11 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:231.22,233.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:253.50,256.26 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:260.2,260.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:263.2,264.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:267.2,268.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:271.2,272.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:275.2,276.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:280.2,283.23 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:296.2,296.28 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:256.26,258.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:260.16,262.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:264.25,266.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:268.25,270.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:272.25,274.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:276.25,278.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:283.23,288.3 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:288.8,292.23 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:292.23,294.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:305.30,307.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:310.48,311.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:314.2,315.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:311.16,313.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:319.32,320.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:323.2,324.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:320.16,322.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:328.29,329.16 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:332.2,333.10 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:329.16,331.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:337.31,371.2 28 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:375.46,379.27 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:383.2,383.16 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:387.2,400.16 13 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:379.27,381.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:383.16,385.3 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:404.31,406.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:409.42,415.30 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:421.2,424.20 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:415.30,416.49 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:419.3,419.51 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:416.49,417.12 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:434.36,435.17 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:439.2,441.12 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:445.2,447.11 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:435.17,437.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:441.12,443.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:450.38,451.17 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:454.2,455.14 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:451.17,453.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:458.33,460.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/constants.go:11.39,14.2 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:28.46,35.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:37.38,40.2 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:42.40,47.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:49.41,54.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:57.39,63.37 6 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:66.2,66.23 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:63.37,65.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:69.36,71.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:73.40,75.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:77.58,78.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:82.2,82.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:92.2,131.22 26 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:135.2,180.14 36 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:78.20,81.3 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:82.20,85.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:131.22,134.3 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:183.58,226.2 36 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:228.84,233.40 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:242.2,245.10 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:233.40,235.25 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:235.25,237.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:237.9,239.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:250.59,251.59 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:254.2,254.20 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:261.2,278.10 16 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:251.59,253.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:254.20,260.3 5 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:281.46,286.2 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:21.36,23.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:25.33,27.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:29.35,32.2 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:34.38,38.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:40.34,44.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:46.33,50.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:52.27,55.2 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:57.31,60.2 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:62.30,65.2 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:67.44,71.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:73.43,77.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:80.58,85.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:88.60,93.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:95.41,99.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:101.41,105.2 3 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:107.55,125.2 15 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:127.67,131.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:133.68,138.43 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:147.2,152.10 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:138.43,140.24 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:140.24,142.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:142.9,144.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:155.55,178.2 17 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:180.55,200.2 13 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:21.34,23.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:25.32,29.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:31.34,34.2 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:36.35,40.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:42.32,46.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:48.31,52.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:54.26,55.39 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:58.2,58.39 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:55.39,57.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:58.39,60.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:63.30,65.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:67.29,68.21 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:71.2,72.41 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:68.21,70.3 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:75.41,79.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:81.40,85.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:87.38,91.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:93.38,97.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:99.38,103.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:105.65,110.43 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:119.2,124.10 4 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:110.43,112.24 2 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:112.24,114.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:114.9,116.4 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:129.52,146.2 13 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:148.53,152.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:155.51,172.2 11 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:174.52,193.2 12 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:195.52,219.2 16 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:221.32,223.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:225.32,227.2 1 0 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:21.34,23.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:25.32,27.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:29.34,33.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:35.35,40.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:42.32,47.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:49.31,54.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:56.26,60.2 3 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:62.30,64.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:66.29,68.2 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:70.40,75.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:77.55,85.2 6 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:88.43,95.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:97.38,102.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:104.38,109.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:111.38,116.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:118.52,172.2 43 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:174.64,179.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:181.50,186.2 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:189.46,199.2 9 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:201.52,239.2 31 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:241.52,296.2 33 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:7.113,83.2 56 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:85.103,152.2 51 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:154.55,182.2 23 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:192.64,213.45 15 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:258.2,302.12 34 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:213.45,215.31 2 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:219.3,226.28 7 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:235.3,240.11 6 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:215.31,217.4 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:227.10,228.66 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:229.11,230.65 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:231.11,232.12 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:308.58,386.2 64 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:388.68,393.38 4 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:396.2,396.12 1 1 +github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:393.38,395.3 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:38.98,40.16 2 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:43.2,43.25 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:46.2,46.33 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:49.2,49.55 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:40.16,42.3 1 0 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:43.25,45.3 1 0 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:46.33,48.3 1 0 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:56.110,58.52 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:61.2,61.50 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:64.2,64.28 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:67.2,67.26 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:71.2,72.16 2 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:75.2,76.16 2 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:81.2,99.52 15 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:58.52,60.3 1 0 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:61.50,63.3 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:64.28,66.3 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:67.26,69.3 1 1 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:72.16,74.3 1 0 +github.com/ethereum/go-ethereum/crypto/signify/signify.go:76.16,78.3 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:53.38,57.2 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:60.80,69.2 4 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:72.74,76.34 3 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:84.2,84.12 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:76.34,77.18 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:80.3,80.20 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:77.18,79.4 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:80.20,82.4 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:103.36,107.2 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:110.65,119.2 4 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:122.59,126.33 3 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:134.2,134.12 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:126.33,127.18 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:130.3,130.24 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:127.18,129.4 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/queue.go:130.24,132.4 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:39.62,58.2 3 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:68.55,69.62 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:72.2,76.3 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:69.62,70.59 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:89.161,91.45 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:98.2,99.18 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:124.2,124.63 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:140.2,140.91 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:150.2,154.50 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:169.2,169.45 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:183.2,183.30 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:198.2,198.46 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:91.45,94.3 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:99.18,105.20 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:112.3,112.55 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:116.3,117.85 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:120.3,120.36 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:105.20,108.4 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:112.55,115.4 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:117.85,119.4 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:124.63,130.57 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:134.3,134.69 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:130.57,133.4 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:134.69,137.4 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:140.91,142.66 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:142.66,144.4 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:145.8,149.3 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:154.50,155.57 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:159.3,160.24 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:155.57,157.4 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:160.24,163.4 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:163.9,163.109 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:163.109,166.4 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:169.45,171.23 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:175.3,175.96 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:171.23,174.4 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:175.96,178.4 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:183.30,188.17 4 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:192.3,196.47 4 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:188.17,191.4 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:203.98,209.2 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:213.144,214.43 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:217.2,218.58 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:223.2,223.49 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:233.2,233.93 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:214.43,216.3 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:218.58,221.3 2 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:223.49,224.122 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:231.3,231.56 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:224.122,230.4 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:237.101,240.17 3 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:243.2,243.18 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:240.17,242.3 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:247.103,250.16 3 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:256.2,256.82 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:267.2,268.19 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:289.2,293.21 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:297.2,297.35 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:301.2,301.85 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:306.2,307.78 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:314.2,314.54 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:318.2,319.82 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:250.16,253.3 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:256.82,260.3 3 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:268.19,276.95 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:284.3,285.62 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:276.95,279.4 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:293.21,296.3 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:297.35,300.3 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:301.85,305.3 3 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:307.78,310.3 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:314.54,317.3 2 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:323.103,333.2 8 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:336.68,340.2 3 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:344.134,347.16 3 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:350.2,350.49 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:347.16,349.3 1 1 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:354.75,355.25 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:358.2,358.12 1 0 +github.com/ethereum/go-ethereum/eth/catalyst/api.go:355.25,357.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:50.44,52.34 2 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:52.34,53.43 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:53.43,57.4 3 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:82.58,91.2 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:94.57,106.2 7 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:111.86,112.19 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:116.2,124.8 8 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:112.19,114.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:128.77,131.38 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:134.2,134.38 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:137.2,138.40 2 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:141.2,141.80 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:131.38,133.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:134.38,136.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:138.40,140.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:146.103,158.20 10 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:161.2,172.20 11 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:175.2,196.21 19 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:199.2,200.21 2 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:203.2,206.19 3 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:158.20,160.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:172.20,174.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:196.21,198.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:200.21,202.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:210.72,213.2 2 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:217.91,247.2 21 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:251.73,253.2 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:257.57,264.2 6 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:268.66,270.30 2 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:273.2,273.18 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:276.2,278.8 3 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:270.30,272.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:273.18,275.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:283.13,293.2 6 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:296.23,298.2 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/panic_cb.go:17.64,18.47 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/panic_cb.go:22.62,23.45 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:24.91,27.22 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:31.2,47.23 12 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:50.2,50.24 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:53.2,53.14 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:56.2,56.13 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:27.22,28.43 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:47.23,49.3 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:50.24,52.3 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:53.14,55.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:47.13,52.2 3 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:70.54,71.20 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:74.2,74.23 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:77.2,78.60 2 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:82.2,87.103 2 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:91.2,98.17 4 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:71.20,73.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:74.23,76.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:78.60,80.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:87.103,89.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:105.60,106.20 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:109.2,109.44 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:113.2,118.107 2 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:121.2,121.20 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:106.20,108.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:109.44,111.3 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:118.107,120.3 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:126.58,127.64 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:130.2,133.101 4 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:127.64,129.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:138.54,139.23 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:142.2,149.91 2 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:152.2,152.74 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:139.23,141.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:149.91,151.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:156.43,165.91 2 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:168.2,168.12 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:165.91,166.30 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:171.39,172.20 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:175.2,175.18 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:178.2,178.12 1 1 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:172.20,174.3 1 0 +github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:175.18,177.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:21.44,27.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:36.192,43.37 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:49.2,54.16 4 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:58.2,58.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:62.2,66.86 3 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:70.2,70.37 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:43.37,46.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:54.16,56.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:58.23,60.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:66.86,68.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:73.83,80.37 4 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:80.37,82.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:87.67,92.2 3 0 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:95.46,101.2 4 0 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:104.75,105.46 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:105.46,110.3 3 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:114.48,115.32 1 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:115.32,120.3 3 1 +github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:124.32,126.2 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:75.37,75.54 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:76.42,78.2 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:79.47,81.2 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:86.74,88.71 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:91.2,91.65 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:96.2,97.27 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:101.2,101.82 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:106.2,107.39 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:115.2,116.45 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:120.2,125.32 4 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:88.71,90.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:91.65,93.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:93.8,95.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:97.27,100.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:101.82,104.3 2 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:107.39,109.36 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:112.3,112.9 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:109.36,111.4 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:116.45,119.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:125.32,127.81 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:131.3,131.48 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:127.81,130.4 2 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:140.154,147.41 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:160.2,160.25 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:168.2,168.40 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:174.2,174.43 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:177.2,177.70 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:147.41,148.100 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:148.100,151.4 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:151.9,155.19 3 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:155.19,157.5 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:160.25,162.97 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:162.97,164.4 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:164.9,166.4 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:168.40,170.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:170.8,170.57 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:170.57,172.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:174.43,176.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:193.188,194.16 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:197.2,198.33 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:201.2,201.28 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:205.2,205.38 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:213.2,219.31 3 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:222.2,229.38 4 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:232.2,232.54 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:279.2,285.29 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:300.2,300.23 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:303.2,303.33 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:308.2,309.80 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:194.16,196.3 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:198.33,200.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:201.28,204.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:205.38,206.23 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:209.3,209.42 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:206.23,208.4 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:209.42,211.4 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:219.31,221.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:229.38,231.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:232.54,233.13 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:233.13,234.8 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:234.8,237.32 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:241.5,242.71 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:237.32,239.6 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:242.71,247.6 4 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:247.11,253.56 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:253.56,256.7 2 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:256.12,257.38 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:266.7,266.48 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:273.7,273.22 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:257.38,259.48 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:259.48,262.9 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:263.13,265.8 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:266.48,268.27 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:268.27,270.9 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:285.29,287.22 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:290.3,291.34 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:287.22,289.4 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:291.34,293.4 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:293.9,295.24 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:295.24,297.5 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:300.23,302.3 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:303.33,305.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:305.8,307.3 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:80.62,82.16 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:86.2,87.17 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:94.2,95.46 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:99.2,100.52 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:106.2,107.26 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:111.2,112.25 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:117.2,129.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:82.16,85.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:87.17,90.3 2 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:90.8,90.26 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:90.26,93.3 2 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:95.46,98.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:100.52,103.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:103.8,103.36 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:103.36,105.3 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:107.26,110.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:112.25,115.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:132.38,135.12 3 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:135.12,137.29 2 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:137.29,138.41 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:141.4,141.30 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:138.41,140.5 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:152.76,160.26 6 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:163.2,170.26 6 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:173.2,180.46 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:186.2,186.14 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:211.2,212.22 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:216.2,216.36 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:219.2,224.37 5 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:160.26,162.3 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:170.26,172.3 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:180.46,185.3 4 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:186.14,188.21 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:192.3,197.27 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:203.3,203.86 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:209.3,209.43 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:188.21,191.4 2 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:197.27,199.4 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:203.86,208.4 4 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:212.22,215.3 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:216.36,218.3 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:237.70,242.2 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:244.30,244.51 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:245.35,247.2 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:248.40,254.2 3 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:260.171,262.18 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:270.2,276.32 6 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:289.2,289.9 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:262.18,263.10 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:267.3,267.9 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:264.36,264.36 0 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:265.15,265.15 0 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:276.32,278.55 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:281.3,282.47 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:278.55,279.12 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:282.47,284.28 2 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:284.28,285.10 1 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:290.38,290.38 0 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:291.14,291.14 0 0 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:297.42,297.59 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:298.42,298.71 1 1 +github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:299.42,299.69 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:45.93,51.2 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:53.45,55.17 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:58.2,58.26 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:55.17,56.50 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:64.65,70.9 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:89.2,90.15 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:93.2,94.16 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:97.2,97.17 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:72.32,73.76 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:76.3,76.82 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:79.3,79.26 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:83.70,84.50 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:85.10,86.60 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:73.76,75.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:76.82,78.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:79.26,81.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:90.15,92.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:94.16,96.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:102.65,104.64 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:107.2,110.73 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:116.2,117.15 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:120.2,121.16 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:126.2,126.9 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:190.2,190.17 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:104.64,106.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:110.73,112.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:112.8,114.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:117.15,119.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:121.16,123.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:127.76,129.17 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:132.3,133.17 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:137.81,140.17 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:143.3,144.69 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:158.76,162.17 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:165.3,167.17 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:170.3,172.86 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:176.69,179.17 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:182.3,182.85 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:186.10,188.18 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:129.17,131.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:133.17,135.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:140.17,142.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:144.69,145.70 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:149.4,150.18 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:153.4,153.86 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:145.70,147.5 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:150.18,152.5 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:153.86,155.5 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:162.17,164.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:167.17,169.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:172.86,174.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:179.17,181.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:182.85,184.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:193.84,196.16 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:199.2,200.15 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:203.2,203.64 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:196.16,198.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:200.15,202.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:206.77,217.16 9 0 +github.com/ethereum/go-ethereum/console/bridge.go:220.2,221.15 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:224.2,224.64 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:217.16,219.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:221.15,223.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:231.68,232.29 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:236.2,238.104 2 1 +github.com/ethereum/go-ethereum/console/bridge.go:243.2,244.73 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:259.2,260.75 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:268.2,269.15 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:272.2,272.62 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:232.29,234.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:238.104,240.3 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:244.73,247.17 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:250.3,250.34 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:247.17,249.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:251.8,252.61 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:255.3,255.28 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:252.61,254.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:260.75,261.34 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:264.3,264.30 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:261.34,263.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:269.15,271.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:278.59,279.45 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:282.2,288.80 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:291.2,291.80 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:296.2,296.53 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:308.2,309.15 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:312.2,312.52 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:279.45,281.3 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:288.80,290.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:291.80,293.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:296.53,299.17 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:302.3,302.34 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:299.17,301.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:303.8,303.57 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:303.57,305.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:309.15,311.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:316.60,317.45 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:320.2,321.80 2 1 +github.com/ethereum/go-ethereum/console/bridge.go:324.2,326.35 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:317.45,319.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:321.80,323.3 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:331.66,338.16 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:341.2,341.16 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:347.2,347.16 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:355.2,357.70 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:360.2,360.34 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:374.2,374.35 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:338.16,340.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:341.16,342.105 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:345.3,345.40 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:342.105,344.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:347.16,348.105 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:351.3,351.39 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:348.105,350.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:357.70,359.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:360.34,362.67 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:365.3,365.27 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:369.3,369.18 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:372.3,372.26 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:362.67,364.4 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:365.27,368.4 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:369.18,370.9 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:384.59,387.16 2 1 +github.com/ethereum/go-ethereum/console/bridge.go:391.2,398.22 3 1 +github.com/ethereum/go-ethereum/console/bridge.go:408.2,409.27 2 1 +github.com/ethereum/go-ethereum/console/bridge.go:448.2,449.11 2 1 +github.com/ethereum/go-ethereum/console/bridge.go:454.2,454.65 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:458.2,458.20 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:387.16,389.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:398.22,401.3 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:401.8,405.3 3 1 +github.com/ethereum/go-ethereum/console/bridge.go:409.27,415.74 5 1 +github.com/ethereum/go-ethereum/console/bridge.go:444.3,444.30 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:415.74,416.21 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:416.21,420.5 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:420.10,423.18 3 1 +github.com/ethereum/go-ethereum/console/bridge.go:426.5,427.19 2 1 +github.com/ethereum/go-ethereum/console/bridge.go:423.18,425.6 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:427.19,429.6 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:429.11,431.6 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:433.9,436.38 3 0 +github.com/ethereum/go-ethereum/console/bridge.go:439.4,439.42 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:442.4,442.43 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:436.38,438.5 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:439.42,441.5 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:449.11,451.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:451.8,453.3 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:454.65,457.3 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:461.74,465.17 4 0 +github.com/ethereum/go-ethereum/console/bridge.go:468.2,468.24 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:465.17,467.3 1 0 +github.com/ethereum/go-ethereum/console/bridge.go:472.34,475.2 2 0 +github.com/ethereum/go-ethereum/console/bridge.go:477.60,479.14 2 1 +github.com/ethereum/go-ethereum/console/bridge.go:482.2,482.23 1 1 +github.com/ethereum/go-ethereum/console/bridge.go:479.14,481.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:90.43,92.28 1 1 +github.com/ethereum/go-ethereum/console/console.go:95.2,95.25 1 1 +github.com/ethereum/go-ethereum/console/console.go:98.2,98.27 1 1 +github.com/ethereum/go-ethereum/console/console.go:103.2,115.58 2 1 +github.com/ethereum/go-ethereum/console/console.go:118.2,118.53 1 1 +github.com/ethereum/go-ethereum/console/console.go:122.2,125.21 3 1 +github.com/ethereum/go-ethereum/console/console.go:92.28,94.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:95.25,97.3 1 1 +github.com/ethereum/go-ethereum/console/console.go:98.27,100.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:115.58,117.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:118.53,120.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:130.48,135.43 3 1 +github.com/ethereum/go-ethereum/console/console.go:138.2,138.43 1 1 +github.com/ethereum/go-ethereum/console/console.go:143.2,143.35 1 1 +github.com/ethereum/go-ethereum/console/console.go:149.2,149.31 1 1 +github.com/ethereum/go-ethereum/console/console.go:160.2,160.23 1 1 +github.com/ethereum/go-ethereum/console/console.go:169.2,169.12 1 1 +github.com/ethereum/go-ethereum/console/console.go:135.43,137.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:138.43,140.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:143.35,146.3 2 1 +github.com/ethereum/go-ethereum/console/console.go:149.31,150.43 1 1 +github.com/ethereum/go-ethereum/console/console.go:150.43,152.48 2 0 +github.com/ethereum/go-ethereum/console/console.go:155.4,155.46 1 0 +github.com/ethereum/go-ethereum/console/console.go:152.48,154.5 1 0 +github.com/ethereum/go-ethereum/console/console.go:160.23,161.62 1 1 +github.com/ethereum/go-ethereum/console/console.go:167.3,167.51 1 1 +github.com/ethereum/go-ethereum/console/console.go:161.62,163.4 1 1 +github.com/ethereum/go-ethereum/console/console.go:163.9,166.4 2 0 +github.com/ethereum/go-ethereum/console/console.go:172.39,173.35 1 1 +github.com/ethereum/go-ethereum/console/console.go:173.35,178.3 4 1 +github.com/ethereum/go-ethereum/console/console.go:181.50,184.61 3 1 +github.com/ethereum/go-ethereum/console/console.go:187.2,187.58 1 1 +github.com/ethereum/go-ethereum/console/console.go:190.2,190.69 1 1 +github.com/ethereum/go-ethereum/console/console.go:193.2,194.35 2 1 +github.com/ethereum/go-ethereum/console/console.go:201.2,201.12 1 1 +github.com/ethereum/go-ethereum/console/console.go:184.61,186.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:187.58,189.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:190.69,192.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:194.35,200.3 5 1 +github.com/ethereum/go-ethereum/console/console.go:205.42,208.16 2 1 +github.com/ethereum/go-ethereum/console/console.go:211.2,212.24 2 1 +github.com/ethereum/go-ethereum/console/console.go:225.2,225.35 1 1 +github.com/ethereum/go-ethereum/console/console.go:233.2,233.12 1 1 +github.com/ethereum/go-ethereum/console/console.go:208.16,210.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:212.24,213.20 1 1 +github.com/ethereum/go-ethereum/console/console.go:216.3,217.43 2 1 +github.com/ethereum/go-ethereum/console/console.go:213.20,214.12 1 1 +github.com/ethereum/go-ethereum/console/console.go:217.43,218.57 1 1 +github.com/ethereum/go-ethereum/console/console.go:218.57,220.5 1 0 +github.com/ethereum/go-ethereum/console/console.go:225.35,227.29 2 1 +github.com/ethereum/go-ethereum/console/console.go:227.29,228.37 1 1 +github.com/ethereum/go-ethereum/console/console.go:228.37,230.5 1 1 +github.com/ethereum/go-ethereum/console/console.go:237.63,238.51 1 1 +github.com/ethereum/go-ethereum/console/console.go:238.51,242.3 3 1 +github.com/ethereum/go-ethereum/console/console.go:251.66,253.42 2 1 +github.com/ethereum/go-ethereum/console/console.go:256.2,265.58 10 1 +github.com/ethereum/go-ethereum/console/console.go:253.42,255.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:268.34,271.46 3 0 +github.com/ethereum/go-ethereum/console/console.go:271.46,273.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:273.8,275.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:280.68,282.42 2 0 +github.com/ethereum/go-ethereum/console/console.go:285.2,286.20 2 0 +github.com/ethereum/go-ethereum/console/console.go:282.42,284.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:291.86,293.32 1 0 +github.com/ethereum/go-ethereum/console/console.go:298.2,299.27 2 0 +github.com/ethereum/go-ethereum/console/console.go:313.2,313.75 1 0 +github.com/ethereum/go-ethereum/console/console.go:293.32,295.3 1 0 +github.com/ethereum/go-ethereum/console/console.go:299.27,301.117 1 0 +github.com/ethereum/go-ethereum/console/console.go:305.3,305.50 1 0 +github.com/ethereum/go-ethereum/console/console.go:310.3,311.8 2 0 +github.com/ethereum/go-ethereum/console/console.go:301.117,302.12 1 0 +github.com/ethereum/go-ethereum/console/console.go:305.50,307.12 2 0 +github.com/ethereum/go-ethereum/console/console.go:318.29,332.17 2 1 +github.com/ethereum/go-ethereum/console/console.go:336.2,336.58 1 1 +github.com/ethereum/go-ethereum/console/console.go:344.2,345.34 2 1 +github.com/ethereum/go-ethereum/console/console.go:332.17,334.3 1 1 +github.com/ethereum/go-ethereum/console/console.go:336.58,338.34 2 1 +github.com/ethereum/go-ethereum/console/console.go:341.3,342.62 2 1 +github.com/ethereum/go-ethereum/console/console.go:338.34,340.4 1 1 +github.com/ethereum/go-ethereum/console/console.go:350.46,351.15 1 1 +github.com/ethereum/go-ethereum/console/console.go:356.2,359.25 2 1 +github.com/ethereum/go-ethereum/console/console.go:351.15,352.31 1 1 +github.com/ethereum/go-ethereum/console/console.go:352.31,354.4 1 0 +github.com/ethereum/go-ethereum/console/console.go:364.38,377.6 5 1 +github.com/ethereum/go-ethereum/console/console.go:377.6,378.10 1 1 +github.com/ethereum/go-ethereum/console/console.go:379.14,381.47 2 0 +github.com/ethereum/go-ethereum/console/console.go:382.30,384.47 2 0 +github.com/ethereum/go-ethereum/console/console.go:385.20,386.10 1 1 +github.com/ethereum/go-ethereum/console/console.go:391.39,392.9 1 0 +github.com/ethereum/go-ethereum/console/console.go:393.38,393.38 0 0 +github.com/ethereum/go-ethereum/console/console.go:394.10,394.10 0 0 +github.com/ethereum/go-ethereum/console/console.go:398.41,399.9 1 1 +github.com/ethereum/go-ethereum/console/console.go:400.26,400.26 0 0 +github.com/ethereum/go-ethereum/console/console.go:401.10,401.10 0 1 +github.com/ethereum/go-ethereum/console/console.go:406.37,407.9 1 0 +github.com/ethereum/go-ethereum/console/console.go:408.41,408.41 0 0 +github.com/ethereum/go-ethereum/console/console.go:409.19,409.19 0 0 +github.com/ethereum/go-ethereum/console/console.go:415.33,425.15 2 1 +github.com/ethereum/go-ethereum/console/console.go:430.2,433.6 3 1 +github.com/ethereum/go-ethereum/console/console.go:425.15,427.3 1 1 +github.com/ethereum/go-ethereum/console/console.go:433.6,437.10 2 1 +github.com/ethereum/go-ethereum/console/console.go:438.31,440.10 2 0 +github.com/ethereum/go-ethereum/console/console.go:442.27,447.10 2 0 +github.com/ethereum/go-ethereum/console/console.go:449.26,450.37 1 1 +github.com/ethereum/go-ethereum/console/console.go:456.4,456.10 1 1 +github.com/ethereum/go-ethereum/console/console.go:458.28,460.46 1 1 +github.com/ethereum/go-ethereum/console/console.go:463.4,463.40 1 1 +github.com/ethereum/go-ethereum/console/console.go:467.4,469.20 3 1 +github.com/ethereum/go-ethereum/console/console.go:475.4,475.20 1 1 +github.com/ethereum/go-ethereum/console/console.go:450.37,454.13 2 0 +github.com/ethereum/go-ethereum/console/console.go:460.46,462.5 1 0 +github.com/ethereum/go-ethereum/console/console.go:463.40,464.13 1 0 +github.com/ethereum/go-ethereum/console/console.go:469.20,471.5 1 1 +github.com/ethereum/go-ethereum/console/console.go:471.10,473.5 1 0 +github.com/ethereum/go-ethereum/console/console.go:475.20,476.80 1 1 +github.com/ethereum/go-ethereum/console/console.go:484.5,485.15 2 1 +github.com/ethereum/go-ethereum/console/console.go:476.80,477.108 1 1 +github.com/ethereum/go-ethereum/console/console.go:477.108,479.28 2 1 +github.com/ethereum/go-ethereum/console/console.go:479.28,481.8 1 1 +github.com/ethereum/go-ethereum/console/console.go:492.91,493.24 1 1 +github.com/ethereum/go-ethereum/console/console.go:493.24,495.17 2 1 +github.com/ethereum/go-ethereum/console/console.go:495.17,497.4 1 1 +github.com/ethereum/go-ethereum/console/console.go:497.9,499.4 1 1 +github.com/ethereum/go-ethereum/console/console.go:505.37,513.26 2 1 +github.com/ethereum/go-ethereum/console/console.go:543.2,543.16 1 1 +github.com/ethereum/go-ethereum/console/console.go:513.26,514.12 1 1 +github.com/ethereum/go-ethereum/console/console.go:515.13,517.32 1 1 +github.com/ethereum/go-ethereum/console/console.go:520.18,521.52 1 1 +github.com/ethereum/go-ethereum/console/console.go:527.4,527.23 1 1 +github.com/ethereum/go-ethereum/console/console.go:528.17,529.17 1 1 +github.com/ethereum/go-ethereum/console/console.go:532.4,532.23 1 1 +github.com/ethereum/go-ethereum/console/console.go:533.17,534.17 1 1 +github.com/ethereum/go-ethereum/console/console.go:537.4,537.23 1 1 +github.com/ethereum/go-ethereum/console/console.go:538.11,539.23 1 1 +github.com/ethereum/go-ethereum/console/console.go:517.32,519.5 1 1 +github.com/ethereum/go-ethereum/console/console.go:521.52,523.5 1 1 +github.com/ethereum/go-ethereum/console/console.go:523.10,523.40 1 1 +github.com/ethereum/go-ethereum/console/console.go:523.40,526.5 2 1 +github.com/ethereum/go-ethereum/console/console.go:529.17,531.5 1 1 +github.com/ethereum/go-ethereum/console/console.go:534.17,536.5 1 1 +github.com/ethereum/go-ethereum/console/console.go:547.46,549.2 1 1 +github.com/ethereum/go-ethereum/console/console.go:552.45,553.23 1 1 +github.com/ethereum/go-ethereum/console/console.go:559.2,560.12 2 1 +github.com/ethereum/go-ethereum/console/console.go:553.23,557.3 2 1 +github.com/ethereum/go-ethereum/console/console.go:563.40,564.98 1 1 +github.com/ethereum/go-ethereum/console/console.go:567.2,567.35 1 0 +github.com/ethereum/go-ethereum/console/console.go:564.98,566.3 1 1 +github.com/ethereum/go-ethereum/eth/backend.go:110.73,112.45 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:115.2,115.32 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:118.2,118.81 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:122.2,122.51 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:131.2,139.16 5 0 +github.com/ethereum/go-ethereum/eth/backend.go:142.2,143.79 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:146.2,148.127 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:151.2,172.40 4 0 +github.com/ethereum/go-ethereum/eth/backend.go:175.2,176.30 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:179.2,188.22 6 0 +github.com/ethereum/go-ethereum/eth/backend.go:191.2,193.32 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:203.2,220.16 3 0 +github.com/ethereum/go-ethereum/eth/backend.go:223.2,230.62 3 0 +github.com/ethereum/go-ethereum/eth/backend.go:235.2,237.33 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:240.2,245.23 4 0 +github.com/ethereum/go-ethereum/eth/backend.go:248.2,260.17 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:264.2,270.16 5 0 +github.com/ethereum/go-ethereum/eth/backend.go:273.2,274.16 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:279.2,289.17 6 0 +github.com/ethereum/go-ethereum/eth/backend.go:112.45,114.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:115.32,117.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:118.81,121.3 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:122.51,123.31 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:129.3,129.28 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:123.31,126.4 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:126.9,128.4 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:139.16,141.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:143.79,145.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:148.127,150.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:172.40,174.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:176.30,178.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:188.22,190.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:193.32,194.62 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:194.62,196.4 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:196.9,196.69 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:196.69,197.24 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:200.4,200.63 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:197.24,199.5 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:220.16,222.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:230.62,234.3 3 0 +github.com/ethereum/go-ethereum/eth/backend.go:237.33,239.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:245.23,247.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:260.17,262.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:270.16,272.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:274.16,276.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:292.41,293.21 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:302.2,302.54 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:306.2,306.14 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:293.21,301.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:302.54,305.3 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:311.37,371.2 5 0 +github.com/ethereum/go-ethereum/eth/backend.go:373.59,375.2 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:377.63,382.37 4 0 +github.com/ethereum/go-ethereum/eth/backend.go:385.2,385.63 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:397.2,397.79 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:382.37,384.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:385.63,386.59 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:386.59,395.4 6 0 +github.com/ethereum/go-ethereum/eth/backend.go:405.60,407.16 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:412.2,415.25 4 0 +github.com/ethereum/go-ethereum/eth/backend.go:420.2,420.49 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:425.2,425.14 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:407.16,410.3 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:415.25,417.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:420.49,421.24 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:421.24,423.4 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:431.62,448.44 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:451.2,451.31 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:448.44,450.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:455.59,461.2 4 0 +github.com/ethereum/go-ethereum/eth/backend.go:466.51,471.39 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:479.2,479.19 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:522.2,522.12 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:471.39,473.19 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:476.3,476.25 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:473.19,475.4 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:479.19,488.17 6 0 +github.com/ethereum/go-ethereum/eth/backend.go:492.3,493.45 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:500.3,500.17 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:508.3,508.41 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:518.3,520.23 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:488.17,491.4 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:493.45,495.4 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:495.9,495.53 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:495.53,496.54 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:496.54,498.5 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:500.17,502.35 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:506.4,506.38 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:502.35,505.5 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:508.41,510.35 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:514.4,514.38 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:510.35,513.5 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:527.33,532.39 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:536.2,536.16 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:532.39,534.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:539.41,539.68 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:540.41,540.59 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:542.56,542.83 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:543.56,543.79 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:544.56,544.75 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:545.56,545.77 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:546.56,546.75 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:547.56,547.76 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:548.56,548.71 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:549.56,549.87 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:550.56,550.111 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:551.56,551.103 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:552.56,552.85 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:553.56,553.81 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:554.56,554.75 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:555.51,558.2 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:562.47,564.32 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:567.2,567.15 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:564.32,566.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:572.34,583.28 5 0 +github.com/ethereum/go-ethereum/eth/backend.go:591.2,595.12 3 0 +github.com/ethereum/go-ethereum/eth/backend.go:583.28,584.50 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:587.3,587.34 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:584.50,586.4 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:600.54,603.16 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:611.2,614.6 3 0 +github.com/ethereum/go-ethereum/eth/backend.go:603.16,604.91 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:608.3,608.69 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:604.91,606.4 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:614.6,615.10 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:616.19,618.18 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:621.20,622.10 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:618.18,620.5 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:633.54,637.9 3 0 +github.com/ethereum/go-ethereum/eth/backend.go:641.2,641.25 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:645.2,646.16 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:651.2,653.12 2 0 +github.com/ethereum/go-ethereum/eth/backend.go:637.9,639.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:641.25,643.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:646.16,648.3 1 0 +github.com/ethereum/go-ethereum/eth/backend.go:658.33,684.2 14 0 +github.com/ethereum/go-ethereum/eth/backend.go:691.63,693.2 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:46.61,47.43 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:47.43,48.13 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:48.13,49.8 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:49.8,50.12 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:51.34,52.12 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:54.41,57.44 3 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:69.6,69.21 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:57.44,59.99 2 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:59.99,60.92 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:60.92,62.9 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:62.14,64.9 1 0 +github.com/ethereum/go-ethereum/eth/bloombits.go:65.13,67.8 1 0 +github.com/ethereum/go-ethereum/eth/peerset.go:62.28,68.2 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:73.65,76.62 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:80.2,84.31 4 1 +github.com/ethereum/go-ethereum/eth/peerset.go:87.2,87.34 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:91.2,91.37 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:96.2,97.12 2 1 +github.com/ethereum/go-ethereum/eth/peerset.go:76.62,78.3 1 0 +github.com/ethereum/go-ethereum/eth/peerset.go:84.31,86.3 1 0 +github.com/ethereum/go-ethereum/eth/peerset.go:87.34,89.3 1 0 +github.com/ethereum/go-ethereum/eth/peerset.go:91.37,95.3 3 1 +github.com/ethereum/go-ethereum/eth/peerset.go:102.74,104.64 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:108.2,111.31 3 1 +github.com/ethereum/go-ethereum/eth/peerset.go:115.2,115.34 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:120.2,120.37 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:127.2,131.20 4 1 +github.com/ethereum/go-ethereum/eth/peerset.go:104.64,106.3 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:111.31,114.3 2 0 +github.com/ethereum/go-ethereum/eth/peerset.go:115.34,118.3 2 0 +github.com/ethereum/go-ethereum/eth/peerset.go:120.37,125.3 3 1 +github.com/ethereum/go-ethereum/eth/peerset.go:136.71,141.15 3 1 +github.com/ethereum/go-ethereum/eth/peerset.go:144.2,145.31 2 1 +github.com/ethereum/go-ethereum/eth/peerset.go:148.2,151.16 2 1 +github.com/ethereum/go-ethereum/eth/peerset.go:155.2,156.12 2 1 +github.com/ethereum/go-ethereum/eth/peerset.go:141.15,143.3 1 0 +github.com/ethereum/go-ethereum/eth/peerset.go:145.31,147.3 1 0 +github.com/ethereum/go-ethereum/eth/peerset.go:151.16,154.3 2 1 +github.com/ethereum/go-ethereum/eth/peerset.go:161.52,166.9 4 1 +github.com/ethereum/go-ethereum/eth/peerset.go:169.2,170.25 2 1 +github.com/ethereum/go-ethereum/eth/peerset.go:173.2,173.12 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:166.9,168.3 1 0 +github.com/ethereum/go-ethereum/eth/peerset.go:170.25,172.3 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:177.45,182.2 3 1 +github.com/ethereum/go-ethereum/eth/peerset.go:186.67,191.29 4 1 +github.com/ethereum/go-ethereum/eth/peerset.go:196.2,196.13 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:191.29,192.26 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:192.26,194.4 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:201.73,206.29 4 1 +github.com/ethereum/go-ethereum/eth/peerset.go:211.2,211.13 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:206.29,207.32 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:207.32,209.4 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:217.30,222.2 3 1 +github.com/ethereum/go-ethereum/eth/peerset.go:225.34,230.2 3 1 +github.com/ethereum/go-ethereum/eth/peerset.go:234.50,242.29 4 1 +github.com/ethereum/go-ethereum/eth/peerset.go:247.2,247.17 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:242.29,243.63 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:243.63,245.4 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:251.28,255.29 3 1 +github.com/ethereum/go-ethereum/eth/peerset.go:258.2,258.18 1 1 +github.com/ethereum/go-ethereum/eth/peerset.go:255.29,257.3 1 1 +github.com/ethereum/go-ethereum/eth/peer.go:42.39,50.2 2 0 +github.com/ethereum/go-ethereum/eth/peer.go:64.41,68.2 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:48.160,56.15 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:62.2,62.17 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:118.2,123.35 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:154.2,154.12 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:158.2,158.21 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:56.15,58.17 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:58.17,60.4 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:62.17,63.17 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:73.3,74.77 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:63.17,67.73 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:67.73,70.5 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:75.8,86.17 3 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:93.3,93.39 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:108.3,108.17 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:86.17,88.18 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:88.18,90.5 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:93.39,94.32 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:97.4,98.21 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:101.4,104.18 3 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:94.32,96.5 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:98.21,100.5 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:104.18,105.10 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:108.17,109.22 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:110.32,111.88 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:112.12,113.20 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:123.35,125.51 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:130.3,131.70 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:134.3,135.17 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:139.3,140.17 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:144.3,145.17 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:148.3,149.32 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:152.3,152.16 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:125.51,128.4 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:131.70,133.4 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:135.17,137.4 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:140.17,143.4 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:145.17,147.4 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:149.32,151.4 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:154.12,157.3 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:162.144,164.28 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:168.2,169.19 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:174.2,175.16 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:178.2,178.52 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:182.2,183.44 2 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:201.2,201.122 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:164.28,166.3 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:169.19,171.3 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:175.16,177.3 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:178.52,180.3 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:183.44,188.21 4 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:192.3,194.94 3 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:199.3,199.65 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:188.21,190.4 1 0 +github.com/ethereum/go-ethereum/eth/state_accessor.go:194.94,196.4 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:17.113,19.63 2 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:25.2,25.16 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:29.2,30.16 2 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:33.2,33.18 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:19.63,20.30 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:20.30,22.4 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:25.16,27.3 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:30.16,32.3 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:37.107,39.20 2 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:43.2,43.21 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:39.20,41.3 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:47.102,49.20 2 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:52.2,52.26 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:49.20,51.3 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:56.144,59.2 2 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:61.182,64.2 2 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:67.99,69.2 1 0 +github.com/ethereum/go-ethereum/eth/bor_api_backend.go:72.101,74.2 1 0 +github.com/ethereum/go-ethereum/eth/discovery.go:36.35,38.2 1 0 +github.com/ethereum/go-ethereum/eth/discovery.go:41.63,45.12 3 0 +github.com/ethereum/go-ethereum/eth/discovery.go:45.12,47.7 2 0 +github.com/ethereum/go-ethereum/eth/discovery.go:47.7,48.11 1 0 +github.com/ethereum/go-ethereum/eth/discovery.go:49.19,50.34 1 0 +github.com/ethereum/go-ethereum/eth/discovery.go:51.21,54.11 1 0 +github.com/ethereum/go-ethereum/eth/discovery.go:60.50,63.2 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:135.58,137.28 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:140.2,153.40 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:177.2,177.30 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:183.2,183.20 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:205.2,208.48 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:226.2,226.28 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:229.2,229.53 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:292.2,294.59 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:301.2,303.15 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:137.28,139.3 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:153.40,163.62 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:163.62,166.4 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:167.8,168.45 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:168.45,171.4 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:171.9,174.4 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:177.30,180.3 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:183.20,186.42 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:192.3,193.45 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:186.42,189.4 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:193.45,196.66 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:196.66,198.5 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:208.48,211.30 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:219.3,219.58 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:224.3,224.62 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:211.30,214.4 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:219.58,220.34 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:220.34,222.5 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:226.28,228.3 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:229.53,232.30 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:250.3,250.62 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:259.3,259.42 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:263.3,263.28 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:286.3,287.17 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:290.3,290.16 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:232.30,235.23 3 0 +github.com/ethereum/go-ethereum/eth/handler.go:241.4,242.64 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:235.23,240.5 4 0 +github.com/ethereum/go-ethereum/eth/handler.go:250.62,253.4 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:259.42,262.4 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:263.28,270.33 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:284.4,284.17 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:270.33,272.19 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:275.5,276.54 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:280.5,280.68 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:272.19,274.6 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:276.54,279.6 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:280.68,282.6 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:287.17,289.4 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:294.59,296.15 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:299.3,299.30 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:296.15,298.4 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:308.73,312.16 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:317.2,317.40 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:320.2,332.100 5 1 +github.com/ethereum/go-ethereum/eth/handler.go:336.2,337.41 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:348.2,348.39 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:353.2,356.57 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:360.2,363.14 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:367.2,367.83 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:371.2,371.17 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:377.2,388.41 5 1 +github.com/ethereum/go-ethereum/eth/handler.go:435.2,435.43 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:472.2,472.22 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:312.16,315.3 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:317.40,319.3 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:332.100,335.3 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:337.41,338.18 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:338.18,342.69 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:342.69,344.5 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:348.39,349.44 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:349.44,351.4 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:356.57,359.3 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:363.14,365.3 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:367.83,370.3 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:371.17,372.64 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:372.64,375.4 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:388.41,391.96 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:395.3,395.13 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:391.96,393.4 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:395.13,399.11 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:400.24,402.26 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:415.5,415.25 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:419.5,419.46 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:423.5,423.20 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:425.21,427.28 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:429.16,429.16 0 0 +github.com/ethereum/go-ethereum/eth/handler.go:402.26,406.45 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:411.6,412.12 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:406.45,410.7 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:415.25,418.6 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:419.46,422.6 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:435.43,437.84 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:440.3,440.44 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:437.84,439.4 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:440.44,444.11 3 0 +github.com/ethereum/go-ethereum/eth/handler.go:445.24,447.26 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:454.5,454.25 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:458.5,458.74 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:463.5,464.20 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:465.21,467.28 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:447.26,452.6 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:454.25,457.6 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:458.74,462.6 3 0 +github.com/ethereum/go-ethereum/eth/handler.go:479.81,483.60 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:487.2,487.22 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:483.60,486.3 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:491.41,493.17 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:493.17,495.3 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:499.45,502.18 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:509.2,510.17 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:515.2,518.25 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:521.2,524.51 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:502.18,505.3 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:505.8,507.3 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:510.17,513.3 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:518.25,520.3 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:524.51,526.3 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:529.39,546.2 10 1 +github.com/ethereum/go-ethereum/eth/handler.go:548.26,565.2 7 1 +github.com/ethereum/go-ethereum/eth/handler.go:569.70,572.29 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:576.2,576.57 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:581.2,585.15 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:603.2,603.47 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:572.29,574.3 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:576.57,577.41 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:577.41,579.4 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:585.15,588.89 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:595.3,596.33 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:599.3,600.9 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:588.89,590.4 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:590.9,593.4 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:596.33,598.4 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:603.47,604.30 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:607.3,607.136 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:604.30,606.4 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:615.65,627.25 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:639.2,639.34 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:644.2,644.34 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:649.2,651.57 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:627.25,631.42 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:635.3,635.42 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:631.42,633.4 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:635.42,637.4 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:639.34,643.3 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:644.34,648.3 3 1 +github.com/ethereum/go-ethereum/eth/handler.go:655.40,658.42 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:658.42,659.55 1 0 +github.com/ethereum/go-ethereum/eth/handler.go:659.55,662.4 2 0 +github.com/ethereum/go-ethereum/eth/handler.go:667.37,669.6 2 1 +github.com/ethereum/go-ethereum/eth/handler.go:669.6,670.10 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:671.27,672.38 1 1 +github.com/ethereum/go-ethereum/eth/handler.go:673.25,674.10 1 1 +github.com/ethereum/go-ethereum/eth/handler_eth.go:36.47,36.65 1 1 +github.com/ethereum/go-ethereum/eth/handler_eth.go:37.47,37.66 1 1 +github.com/ethereum/go-ethereum/eth/handler_eth.go:40.70,42.2 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:45.56,46.46 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:49.2,49.12 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:46.46,48.3 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:54.39,56.2 1 1 +github.com/ethereum/go-ethereum/eth/handler_eth.go:60.70,62.33 1 1 +github.com/ethereum/go-ethereum/eth/handler_eth.go:63.33,65.55 2 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:67.27,68.63 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:70.45,71.48 1 1 +github.com/ethereum/go-ethereum/eth/handler_eth.go:73.31,74.56 1 1 +github.com/ethereum/go-ethereum/eth/handler_eth.go:76.37,77.55 1 1 +github.com/ethereum/go-ethereum/eth/handler_eth.go:79.10,80.62 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:86.105,90.29 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:96.2,100.35 2 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:106.2,106.42 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:109.2,109.12 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:90.29,94.3 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:100.35,101.47 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:101.47,104.4 2 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:106.42,108.3 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:114.98,118.29 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:124.2,133.46 3 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:137.2,137.12 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:118.29,122.3 1 0 +github.com/ethereum/go-ethereum/eth/handler_eth.go:133.46,136.3 2 0 +github.com/ethereum/go-ethereum/eth/handler_snap.go:29.48,29.66 1 1 +github.com/ethereum/go-ethereum/eth/handler_snap.go:32.73,34.2 1 0 +github.com/ethereum/go-ethereum/eth/handler_snap.go:37.57,38.46 1 0 +github.com/ethereum/go-ethereum/eth/handler_snap.go:43.2,43.12 1 0 +github.com/ethereum/go-ethereum/eth/handler_snap.go:38.46,39.23 1 0 +github.com/ethereum/go-ethereum/eth/handler_snap.go:39.23,41.4 1 0 +github.com/ethereum/go-ethereum/eth/handler_snap.go:48.73,50.2 1 1 +github.com/ethereum/go-ethereum/eth/api.go:51.59,53.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:56.67,58.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:61.66,63.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:66.57,68.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:77.53,79.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:82.42,84.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:93.55,95.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:102.55,103.20 1 0 +github.com/ethereum/go-ethereum/eth/api.go:106.2,106.36 1 0 +github.com/ethereum/go-ethereum/eth/api.go:103.20,105.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:111.36,113.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:116.66,117.62 1 0 +github.com/ethereum/go-ethereum/eth/api.go:120.2,120.18 1 0 +github.com/ethereum/go-ethereum/eth/api.go:117.62,119.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:124.68,131.2 5 0 +github.com/ethereum/go-ethereum/eth/api.go:134.71,137.2 2 0 +github.com/ethereum/go-ethereum/eth/api.go:140.73,143.2 2 0 +github.com/ethereum/go-ethereum/eth/api.go:146.63,148.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:158.57,160.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:164.97,165.33 1 0 +github.com/ethereum/go-ethereum/eth/api.go:168.2,168.33 1 0 +github.com/ethereum/go-ethereum/eth/api.go:172.2,172.41 1 0 +github.com/ethereum/go-ethereum/eth/api.go:178.2,179.16 2 0 +github.com/ethereum/go-ethereum/eth/api.go:182.2,185.36 3 0 +github.com/ethereum/go-ethereum/eth/api.go:191.2,191.18 1 0 +github.com/ethereum/go-ethereum/eth/api.go:198.2,198.18 1 0 +github.com/ethereum/go-ethereum/eth/api.go:165.33,167.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:168.33,171.3 2 0 +github.com/ethereum/go-ethereum/eth/api.go:172.41,176.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:179.16,181.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:185.36,188.3 2 0 +github.com/ethereum/go-ethereum/eth/api.go:191.18,192.77 1 0 +github.com/ethereum/go-ethereum/eth/api.go:192.77,194.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:195.8,195.67 1 0 +github.com/ethereum/go-ethereum/eth/api.go:195.67,197.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:201.67,202.23 1 0 +github.com/ethereum/go-ethereum/eth/api.go:208.2,208.13 1 0 +github.com/ethereum/go-ethereum/eth/api.go:202.23,203.47 1 0 +github.com/ethereum/go-ethereum/eth/api.go:203.47,205.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:212.68,215.16 2 0 +github.com/ethereum/go-ethereum/eth/api.go:218.2,221.36 3 0 +github.com/ethereum/go-ethereum/eth/api.go:228.2,231.28 3 0 +github.com/ethereum/go-ethereum/eth/api.go:257.2,257.18 1 0 +github.com/ethereum/go-ethereum/eth/api.go:215.16,217.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:221.36,222.55 1 0 +github.com/ethereum/go-ethereum/eth/api.go:222.55,224.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:231.28,233.33 1 0 +github.com/ethereum/go-ethereum/eth/api.go:243.3,243.23 1 0 +github.com/ethereum/go-ethereum/eth/api.go:247.3,247.49 1 0 +github.com/ethereum/go-ethereum/eth/api.go:252.3,252.69 1 0 +github.com/ethereum/go-ethereum/eth/api.go:255.3,255.22 1 0 +github.com/ethereum/go-ethereum/eth/api.go:233.33,235.50 2 0 +github.com/ethereum/go-ethereum/eth/api.go:240.4,241.11 2 0 +github.com/ethereum/go-ethereum/eth/api.go:235.50,236.10 1 0 +github.com/ethereum/go-ethereum/eth/api.go:237.10,237.25 1 0 +github.com/ethereum/go-ethereum/eth/api.go:237.25,239.5 1 0 +github.com/ethereum/go-ethereum/eth/api.go:243.23,244.9 1 0 +github.com/ethereum/go-ethereum/eth/api.go:247.49,249.12 2 0 +github.com/ethereum/go-ethereum/eth/api.go:252.69,254.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:268.55,270.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:273.83,278.39 2 0 +github.com/ethereum/go-ethereum/eth/api.go:285.2,286.38 2 0 +github.com/ethereum/go-ethereum/eth/api.go:291.2,291.18 1 0 +github.com/ethereum/go-ethereum/eth/api.go:294.2,295.16 2 0 +github.com/ethereum/go-ethereum/eth/api.go:298.2,298.35 1 0 +github.com/ethereum/go-ethereum/eth/api.go:278.39,284.3 2 0 +github.com/ethereum/go-ethereum/eth/api.go:286.38,288.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:288.8,290.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:291.18,293.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:295.16,297.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:309.57,311.2 1 0 +github.com/ethereum/go-ethereum/eth/api.go:314.100,315.78 1 0 +github.com/ethereum/go-ethereum/eth/api.go:318.2,318.44 1 0 +github.com/ethereum/go-ethereum/eth/api.go:315.78,317.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:330.88,336.31 2 0 +github.com/ethereum/go-ethereum/eth/api.go:355.2,355.21 1 0 +github.com/ethereum/go-ethereum/eth/api.go:336.31,341.60 2 0 +github.com/ethereum/go-ethereum/eth/api.go:346.3,346.111 1 0 +github.com/ethereum/go-ethereum/eth/api.go:349.3,353.5 1 0 +github.com/ethereum/go-ethereum/eth/api.go:341.60,343.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:343.9,345.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:346.111,348.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:362.173,366.46 3 0 +github.com/ethereum/go-ethereum/eth/api.go:400.2,407.60 2 0 +github.com/ethereum/go-ethereum/eth/api.go:410.2,410.40 1 0 +github.com/ethereum/go-ethereum/eth/api.go:366.46,367.39 1 0 +github.com/ethereum/go-ethereum/eth/api.go:367.39,372.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:372.9,374.39 2 0 +github.com/ethereum/go-ethereum/eth/api.go:379.4,379.20 1 0 +github.com/ethereum/go-ethereum/eth/api.go:382.4,383.18 2 0 +github.com/ethereum/go-ethereum/eth/api.go:374.39,376.5 1 0 +github.com/ethereum/go-ethereum/eth/api.go:376.10,378.5 1 0 +github.com/ethereum/go-ethereum/eth/api.go:379.20,381.5 1 0 +github.com/ethereum/go-ethereum/eth/api.go:383.18,385.5 1 0 +github.com/ethereum/go-ethereum/eth/api.go:387.8,387.49 1 0 +github.com/ethereum/go-ethereum/eth/api.go:387.49,389.19 2 0 +github.com/ethereum/go-ethereum/eth/api.go:392.3,393.17 2 0 +github.com/ethereum/go-ethereum/eth/api.go:389.19,391.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:393.17,395.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:396.8,398.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:407.60,409.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:427.179,430.18 2 0 +github.com/ethereum/go-ethereum/eth/api.go:433.2,434.16 2 0 +github.com/ethereum/go-ethereum/eth/api.go:437.2,438.15 2 0 +github.com/ethereum/go-ethereum/eth/api.go:441.2,441.48 1 0 +github.com/ethereum/go-ethereum/eth/api.go:430.18,432.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:434.16,436.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:438.15,440.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:444.93,447.46 3 1 +github.com/ethereum/go-ethereum/eth/api.go:460.2,460.15 1 1 +github.com/ethereum/go-ethereum/eth/api.go:464.2,464.20 1 1 +github.com/ethereum/go-ethereum/eth/api.go:447.46,449.17 2 1 +github.com/ethereum/go-ethereum/eth/api.go:452.3,453.53 2 1 +github.com/ethereum/go-ethereum/eth/api.go:457.3,457.49 1 1 +github.com/ethereum/go-ethereum/eth/api.go:449.17,451.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:453.53,456.4 2 1 +github.com/ethereum/go-ethereum/eth/api.go:460.15,463.3 2 1 +github.com/ethereum/go-ethereum/eth/api.go:472.116,476.23 3 0 +github.com/ethereum/go-ethereum/eth/api.go:480.2,480.19 1 0 +github.com/ethereum/go-ethereum/eth/api.go:492.2,492.54 1 0 +github.com/ethereum/go-ethereum/eth/api.go:476.23,478.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:480.19,483.24 3 0 +github.com/ethereum/go-ethereum/eth/api.go:483.24,485.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:486.8,488.22 2 0 +github.com/ethereum/go-ethereum/eth/api.go:488.22,490.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:500.126,503.23 3 0 +github.com/ethereum/go-ethereum/eth/api.go:507.2,507.20 1 0 +github.com/ethereum/go-ethereum/eth/api.go:519.2,519.54 1 0 +github.com/ethereum/go-ethereum/eth/api.go:503.23,505.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:507.20,510.24 3 0 +github.com/ethereum/go-ethereum/eth/api.go:510.24,512.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:513.8,515.22 2 0 +github.com/ethereum/go-ethereum/eth/api.go:515.22,517.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:522.110,523.64 1 0 +github.com/ethereum/go-ethereum/eth/api.go:526.2,529.16 3 0 +github.com/ethereum/go-ethereum/eth/api.go:532.2,533.16 2 0 +github.com/ethereum/go-ethereum/eth/api.go:536.2,540.18 4 0 +github.com/ethereum/go-ethereum/eth/api.go:547.2,547.19 1 0 +github.com/ethereum/go-ethereum/eth/api.go:523.64,525.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:529.16,531.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:533.16,535.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:540.18,542.17 2 0 +github.com/ethereum/go-ethereum/eth/api.go:545.3,545.52 1 0 +github.com/ethereum/go-ethereum/eth/api.go:542.17,544.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:555.90,558.50 3 0 +github.com/ethereum/go-ethereum/eth/api.go:562.2,562.61 1 0 +github.com/ethereum/go-ethereum/eth/api.go:573.2,580.47 2 0 +github.com/ethereum/go-ethereum/eth/api.go:583.2,583.43 1 0 +github.com/ethereum/go-ethereum/eth/api.go:586.2,586.18 1 0 +github.com/ethereum/go-ethereum/eth/api.go:589.2,589.17 1 0 +github.com/ethereum/go-ethereum/eth/api.go:592.2,592.53 1 0 +github.com/ethereum/go-ethereum/eth/api.go:608.2,608.40 1 0 +github.com/ethereum/go-ethereum/eth/api.go:558.50,561.3 2 0 +github.com/ethereum/go-ethereum/eth/api.go:562.61,564.22 1 0 +github.com/ethereum/go-ethereum/eth/api.go:571.3,571.34 1 0 +github.com/ethereum/go-ethereum/eth/api.go:564.22,566.20 2 0 +github.com/ethereum/go-ethereum/eth/api.go:569.4,569.33 1 0 +github.com/ethereum/go-ethereum/eth/api.go:566.20,568.5 1 0 +github.com/ethereum/go-ethereum/eth/api.go:580.47,582.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:583.43,585.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:586.18,588.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:589.17,591.3 1 0 +github.com/ethereum/go-ethereum/eth/api.go:592.53,593.42 1 0 +github.com/ethereum/go-ethereum/eth/api.go:597.3,597.23 1 0 +github.com/ethereum/go-ethereum/eth/api.go:600.3,601.15 2 0 +github.com/ethereum/go-ethereum/eth/api.go:604.3,604.52 1 0 +github.com/ethereum/go-ethereum/eth/api.go:593.42,596.4 2 0 +github.com/ethereum/go-ethereum/eth/api.go:597.23,598.12 1 0 +github.com/ethereum/go-ethereum/eth/api.go:601.15,603.4 1 0 +github.com/ethereum/go-ethereum/eth/api.go:604.52,606.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:52.59,54.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:56.53,58.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:60.48,63.2 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:65.108,67.38 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:72.2,72.37 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:75.2,75.64 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:67.38,70.3 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:72.37,74.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:78.127,79.47 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:82.2,82.42 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:92.2,92.79 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:79.47,81.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:82.42,84.20 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:87.3,87.106 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:90.3,90.21 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:84.20,86.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:87.106,89.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:95.100,97.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:99.106,101.38 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:106.2,106.37 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:109.2,109.63 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:101.38,104.3 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:106.37,108.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:112.98,114.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:116.125,117.47 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:120.2,120.42 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:134.2,134.79 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:117.47,119.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:120.42,122.20 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:125.3,125.106 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:128.3,129.19 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:132.3,132.20 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:122.20,124.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:125.106,127.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:129.19,131.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:137.82,139.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:141.132,143.38 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:148.2,149.16 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:152.2,152.19 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:155.2,156.29 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:143.38,146.3 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:149.16,151.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:152.19,154.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:159.151,160.47 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:163.2,163.42 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:177.2,177.84 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:160.47,162.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:163.42,165.17 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:168.3,168.20 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:171.3,171.106 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:174.3,175.30 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:165.17,167.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:168.20,170.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:171.106,173.4 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:180.100,182.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:184.96,187.19 3 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:190.2,191.17 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:194.2,194.18 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:187.19,189.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:191.17,193.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:197.79,198.69 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:201.2,201.12 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:198.69,200.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:204.167,205.26 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:206.2,206.21 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:209.2,211.97 3 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:205.26,205.40 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:206.21,208.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:214.103,216.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:218.94,220.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:222.91,224.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:226.99,228.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:230.99,232.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:234.87,236.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:238.88,240.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:242.75,245.32 3 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:248.2,248.17 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:245.32,247.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:251.81,253.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:255.138,258.2 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:260.96,262.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:264.59,266.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:268.120,270.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:272.105,274.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:276.47,278.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:280.93,282.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:284.62,286.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:288.81,290.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:292.227,294.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:296.50,298.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:300.51,302.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:304.60,306.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:308.46,310.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:312.51,314.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:316.44,318.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:320.55,322.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:324.47,326.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:328.56,331.2 2 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:333.95,334.42 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:334.42,336.3 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:339.51,341.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:343.55,345.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:347.46,349.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:351.56,353.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:355.167,357.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:359.168,361.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:363.73,365.2 1 0 +github.com/ethereum/go-ethereum/eth/api_backend.go:367.52,369.2 1 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:38.90,41.16 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:47.2,48.57 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:54.2,55.16 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:60.2,60.50 1 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:66.2,67.16 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:72.2,74.66 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:41.16,44.3 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:48.57,51.3 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:55.16,58.3 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:60.50,63.3 2 0 +github.com/ethereum/go-ethereum/eth/handler_bor.go:67.16,70.3 2 0 +github.com/ethereum/go-ethereum/eth/sync.go:39.49,48.32 3 1 +github.com/ethereum/go-ethereum/eth/sync.go:51.2,51.19 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:57.2,58.25 2 1 +github.com/ethereum/go-ethereum/eth/sync.go:61.2,61.44 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:48.32,50.3 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:51.19,53.3 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:58.25,60.3 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:83.52,88.2 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:93.61,94.9 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:95.36,96.14 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:97.29,98.15 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:103.31,117.6 9 1 +github.com/ethereum/go-ethereum/eth/sync.go:117.6,118.39 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:121.3,121.10 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:118.39,120.4 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:122.25,122.25 0 1 +github.com/ethereum/go-ethereum/eth/sync.go:124.27,132.95 4 0 +github.com/ethereum/go-ethereum/eth/sync.go:136.21,137.20 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:139.30,145.24 3 1 +github.com/ethereum/go-ethereum/eth/sync.go:148.4,148.10 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:132.95,135.5 2 0 +github.com/ethereum/go-ethereum/eth/sync.go:145.24,147.5 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:154.50,155.22 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:166.2,166.36 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:170.2,171.15 2 1 +github.com/ethereum/go-ethereum/eth/sync.go:176.2,176.39 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:182.2,183.17 2 1 +github.com/ethereum/go-ethereum/eth/sync.go:186.2,188.27 3 1 +github.com/ethereum/go-ethereum/eth/sync.go:198.2,198.11 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:155.22,157.3 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:166.36,168.3 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:171.15,173.3 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:173.8,173.43 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:173.43,175.3 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:176.39,178.3 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:183.17,185.3 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:188.27,192.140 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:196.3,196.13 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:192.140,195.4 2 0 +github.com/ethereum/go-ethereum/eth/sync.go:201.71,204.2 2 1 +github.com/ethereum/go-ethereum/eth/sync.go:206.75,208.50 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:215.2,215.75 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:223.2,225.32 3 1 +github.com/ethereum/go-ethereum/eth/sync.go:208.50,212.3 3 0 +github.com/ethereum/go-ethereum/eth/sync.go:215.75,216.73 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:216.73,220.4 3 0 +github.com/ethereum/go-ethereum/eth/sync.go:229.51,231.12 2 0 +github.com/ethereum/go-ethereum/eth/sync.go:231.12,231.50 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:235.49,236.36 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:255.2,256.16 2 1 +github.com/ethereum/go-ethereum/eth/sync.go:259.2,259.41 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:265.2,266.44 2 1 +github.com/ethereum/go-ethereum/eth/sync.go:273.2,273.26 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:282.2,282.12 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:236.36,247.71 2 1 +github.com/ethereum/go-ethereum/eth/sync.go:247.71,249.4 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:249.9,249.30 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:249.30,252.4 2 0 +github.com/ethereum/go-ethereum/eth/sync.go:256.16,258.3 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:259.41,262.3 2 1 +github.com/ethereum/go-ethereum/eth/sync.go:266.44,269.65 1 1 +github.com/ethereum/go-ethereum/eth/sync.go:269.65,271.4 1 0 +github.com/ethereum/go-ethereum/eth/sync.go:273.26,281.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:97.92,99.43 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:124.2,124.18 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:99.43,106.55 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:106.55,110.57 3 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:110.57,112.6 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:114.33,116.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:117.44,119.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:138.65,147.2 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:152.48,153.6 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:153.6,154.54 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:154.54,157.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:186.55,189.16 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:192.2,192.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:195.2,203.21 3 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:214.2,214.51 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:217.2,217.58 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:189.16,191.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:192.31,194.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:203.21,205.31 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:205.31,206.37 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:211.4,211.96 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:206.37,210.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:214.51,216.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:32.78,35.43 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:38.2,39.61 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:35.43,37.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:44.115,45.21 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:45.21,48.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:48.8,50.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:53.124,66.65 5 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:139.2,139.16 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:66.65,70.15 3 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:83.3,83.20 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:86.3,86.60 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:93.3,93.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:70.15,71.13 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:71.13,74.22 3 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:74.22,76.6 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:77.10,79.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:80.9,82.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:83.20,84.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:86.60,88.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:88.9,91.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:94.34,97.21 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:103.35,109.23 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:126.22,128.43 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:134.23,136.41 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:97.21,99.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:99.10,102.5 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:109.23,113.5 3 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:113.10,114.63 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:114.63,117.41 3 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:117.41,119.7 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:119.12,121.7 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:122.11,124.6 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:128.43,130.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:130.10,132.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:142.109,144.29 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:147.2,147.42 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:164.2,169.19 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:176.2,177.20 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:144.29,146.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:147.42,152.21 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:155.3,156.21 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:161.3,161.17 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:152.21,154.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:156.21,157.58 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:157.58,159.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:169.19,172.3 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:172.8,175.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:177.20,181.66 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:185.3,186.61 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:189.3,190.17 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:181.66,184.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:186.61,188.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:192.2,193.55 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:201.3,201.17 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:193.55,195.21 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:198.4,199.38 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:195.21,196.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:205.77,208.43 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:211.2,212.60 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:208.43,210.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:217.100,223.35 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:233.2,233.15 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:223.35,225.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:228.3,228.53 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:225.32,226.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:228.53,231.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:236.74,239.43 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:242.2,243.54 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:239.43,241.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:248.88,254.35 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:270.2,270.14 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:254.35,256.34 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:260.3,261.36 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:265.3,265.35 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:256.34,257.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:261.36,264.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:265.35,268.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:273.74,276.43 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:279.2,280.57 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:276.43,278.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:285.94,291.35 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:311.2,311.17 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:291.35,293.34 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:297.3,298.21 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:304.3,304.61 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:293.34,294.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:298.21,299.105 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:299.105,300.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:304.61,306.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:306.9,309.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:314.75,317.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:321.2,321.29 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:325.2,325.34 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:317.40,319.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:321.29,323.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:328.69,331.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:334.2,334.42 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:337.2,337.84 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:341.2,341.107 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:345.2,351.34 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:331.40,333.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:334.42,336.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:337.84,340.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:341.107,344.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:354.75,357.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:360.2,360.33 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:367.2,371.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:357.40,359.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:360.33,362.49 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:365.3,365.16 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:362.49,364.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:374.74,377.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:380.2,380.33 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:392.2,396.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:377.40,379.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:380.33,386.46 3 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:390.3,390.49 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:386.46,389.4 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:399.71,402.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:405.2,409.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:402.40,404.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:412.71,415.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:418.2,418.33 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:426.2,430.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:415.40,417.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:418.33,421.46 3 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:424.3,424.16 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:421.46,423.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:433.87,436.26 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:439.2,440.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:444.2,444.28 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:447.2,447.34 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:436.26,438.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:440.40,442.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:444.28,446.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:450.84,453.43 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:456.2,457.70 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:453.43,455.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:460.130,467.29 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:485.2,485.20 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:467.29,468.33 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:472.3,473.16 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:477.3,477.56 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:468.33,469.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:473.16,474.12 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:477.56,479.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:479.9,483.4 3 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:488.73,490.26 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:494.2,495.41 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:498.2,498.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:505.2,505.35 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:490.26,492.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:495.41,497.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:498.25,500.16 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:503.3,503.34 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:500.16,502.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:508.81,510.26 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:514.2,515.41 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:518.2,518.50 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:525.2,527.60 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:510.26,512.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:515.41,517.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:518.50,520.16 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:523.3,523.34 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:520.16,522.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:37.144,43.12 3 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:53.2,53.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:56.2,58.25 3 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:68.2,72.41 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:75.2,75.12 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:43.12,52.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:53.12,55.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:58.25,59.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:60.22,61.18 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:64.20,65.30 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:61.18,63.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:72.41,74.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:79.118,81.16 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:84.2,84.27 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:87.2,87.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:91.2,91.44 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:94.2,94.33 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:97.2,97.47 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:100.2,100.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:103.2,103.50 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:106.2,106.12 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:81.16,83.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:84.27,86.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:87.31,89.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:91.44,93.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:94.33,96.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:97.47,99.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:100.31,102.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:103.50,105.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:105.67,110.26 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:113.2,113.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:110.26,112.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:141.54,142.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:145.2,145.20 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:148.2,148.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:142.32,144.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:145.20,147.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:153.56,155.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:156.18,157.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:158.18,160.28 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:161.17,163.30 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:164.10,165.62 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:195.52,196.52 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:201.2,201.47 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:204.2,204.12 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:196.52,198.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:201.47,203.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:244.82,249.26 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:252.2,252.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:249.26,251.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:330.36,330.55 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:331.36,331.56 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:333.44,333.71 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:334.44,334.72 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:336.42,336.67 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:337.42,337.68 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:339.45,339.73 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:340.45,340.74 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:342.42,342.67 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:343.42,343.68 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:345.44,345.71 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:346.44,346.72 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:348.41,348.65 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:349.41,349.66 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:351.38,351.59 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:352.38,352.60 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:354.41,354.65 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:355.41,355.66 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:357.38,357.59 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:358.38,358.60 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:360.41,360.65 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:361.41,361.66 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:363.38,363.59 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:364.38,364.60 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:366.56,366.95 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:367.56,367.96 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:369.51,369.85 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:370.51,370.86 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:372.48,372.79 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:373.48,373.80 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:42.34,43.6 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:43.6,44.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:45.33,46.62 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:49.4,49.110 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:51.37,52.105 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:55.4,55.84 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:57.17,58.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:46.62,48.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:52.105,54.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:66.40,73.6 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:73.6,75.36 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:105.3,105.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:75.36,82.62 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:89.4,92.20 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:82.62,83.48 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:87.5,87.18 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:83.48,86.6 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:92.20,94.15 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:94.15,95.52 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:99.6,100.59 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:95.52,98.7 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:106.34,108.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:112.4,113.33 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:118.15,119.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:121.15,122.17 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:124.17,125.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:108.14,109.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:113.33,116.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:133.39,140.6 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:140.6,142.36 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:172.3,172.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:142.36,149.73 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:156.4,159.24 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:149.73,150.42 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:150.42,153.6 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:159.24,161.15 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:161.15,162.67 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:166.6,167.76 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:162.67,165.7 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:173.33,175.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:179.4,180.36 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:185.15,186.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:188.15,189.17 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:191.17,192.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:175.14,176.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:180.36,183.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:35.35,37.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:41.67,45.12 3 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:45.12,47.7 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:47.7,48.11 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:49.19,50.35 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:51.21,54.11 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:61.56,65.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:61.33,62.19 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:65.2,69.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:62.19,64.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:70.36,71.41 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:74.3,75.13 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:76.21,77.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:71.41,73.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:122.52,131.9 5 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:132.30,133.22 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:134.16,135.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:141.83,149.9 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:150.30,152.38 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:157.3,157.22 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:166.3,166.10 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:180.16,181.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:152.38,154.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:157.22,159.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:167.25,168.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:169.11,172.11 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:173.29,174.22 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:175.26,176.15 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:188.29,191.6 2 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:191.6,192.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:193.33,201.18 6 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:205.34,209.18 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:214.4,215.24 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:217.33,224.11 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:249.17,250.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:201.18,203.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:209.18,211.13 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:225.24,229.38 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:231.34,236.105 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:238.12,246.28 3 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:60.24,61.11 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:64.2,64.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:61.11,63.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:97.84,122.2 6 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:127.24,129.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:132.28,134.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:137.31,139.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:142.55,148.2 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:151.55,157.2 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:160.50,162.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:165.56,167.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:171.44,174.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:178.50,181.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:192.63,194.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:197.2,197.45 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:194.25,196.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:203.60,204.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:205.31,207.28 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:208.16,209.74 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:219.72,223.2 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:228.71,229.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:230.30,232.28 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:233.16,234.75 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:239.102,248.2 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:252.81,257.35 3 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:261.2,261.51 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:257.35,260.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:267.58,268.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:269.34,271.34 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:272.10,273.98 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:278.68,285.2 2 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:289.67,290.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:291.65,293.34 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:294.10,295.97 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:300.78,305.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:308.76,314.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:317.62,322.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:325.75,330.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:334.90,353.47 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:356.2,356.17 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:353.47,355.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:361.132,380.47 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:383.2,383.17 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:380.47,382.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:388.129,407.47 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:410.2,410.17 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:407.47,409.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:415.91,429.47 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:432.2,432.17 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:429.47,431.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:437.93,451.47 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:454.2,454.17 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:451.47,453.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:458.93,472.47 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:475.2,475.17 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:472.47,474.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:479.55,488.2 4 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:497.41,502.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:505.49,506.57 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:509.2,509.30 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:506.57,508.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:509.30,511.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:515.54,517.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:520.40,522.2 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:140.52,141.26 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:144.2,144.33 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:141.26,143.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:148.55,149.26 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:152.2,152.28 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:149.26,151.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:201.276,227.2 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:231.32,233.2 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:237.31,239.2 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:244.70,253.9 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:254.25,255.13 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:256.16,257.23 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:262.71,267.9 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:268.22,269.13 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:270.16,271.23 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:277.108,283.9 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:289.2,289.9 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:295.2,295.9 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:284.32,284.32 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:285.16,286.13 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:290.77,290.77 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:291.16,292.13 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:296.24,297.22 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:298.16,299.13 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:305.173,311.9 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:317.2,317.9 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:323.2,323.9 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:312.30,312.30 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:313.16,314.18 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:318.101,318.101 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:319.16,320.18 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:324.24,325.40 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:326.16,327.18 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:333.31,344.6 6 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:344.6,346.42 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:352.3,353.24 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:380.3,380.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:346.42,347.48 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:347.48,349.5 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:353.24,356.32 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:360.4,361.25 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:369.4,369.120 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:373.4,373.15 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:356.32,358.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:361.25,363.33 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:366.5,366.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:363.33,365.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:369.120,371.13 2 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:373.15,375.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:375.10,377.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:381.17,383.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:385.35,390.25 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:395.4,395.32 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:399.4,399.112 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:405.4,405.50 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:408.4,408.52 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:411.4,413.79 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:416.4,416.29 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:420.25,426.15 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:429.4,429.39 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:431.25,434.23 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:436.23,440.45 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:460.4,460.38 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:489.4,489.33 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:491.26,495.43 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:507.4,507.38 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:534.4,534.39 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:536.35,541.11 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:546.4,551.40 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:600.4,601.11 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:607.4,607.40 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:618.4,618.42 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:622.4,622.35 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:628.33,631.11 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:636.4,639.29 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:682.4,683.11 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:689.4,689.33 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:390.25,393.10 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:395.32,396.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:399.112,402.10 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:405.50,406.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:408.52,409.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:413.79,415.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:416.29,418.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:426.15,427.13 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:440.45,444.16 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:447.5,447.48 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:444.16,446.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:447.48,453.88 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:453.88,456.7 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:460.38,465.26 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:465.26,466.31 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:469.6,469.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:466.31,468.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:469.34,471.33 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:471.33,475.22 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:478.8,483.91 4 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:475.22,477.9 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:495.43,501.32 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:501.32,504.6 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:507.38,511.32 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:514.5,517.48 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:511.32,513.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:517.48,521.20 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:524.6,530.51 5 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:521.20,523.7 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:542.25,542.25 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:543.18,544.11 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:551.40,555.166 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:555.166,557.51 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:565.6,565.17 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:574.6,574.33 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:557.51,561.15 4 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:565.17,566.35 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:570.7,571.15 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:566.35,569.8 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:574.33,579.91 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:590.7,590.48 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:579.91,587.16 6 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:591.12,594.7 2 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:595.11,598.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:602.72,602.72 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:603.18,604.11 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:607.40,609.40 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:612.5,613.28 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:609.40,610.14 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:613.28,615.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:618.42,620.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:622.35,623.64 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:623.64,625.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:632.25,632.25 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:633.18,634.11 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:639.29,640.73 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:640.73,647.47 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:674.6,674.17 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:647.47,648.64 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:651.7,651.39 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:654.7,654.49 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:657.7,657.37 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:660.7,660.44 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:664.7,665.34 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:648.64,649.16 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:651.39,653.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:654.49,655.16 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:657.37,659.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:660.44,661.16 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:665.34,669.8 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:669.13,671.8 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:674.17,678.15 4 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:684.24,684.24 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:685.18,686.11 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:689.33,690.64 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:690.64,692.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:699.59,701.27 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:706.2,706.13 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:711.2,712.40 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:717.2,717.51 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:701.27,703.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:706.13,709.3 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:712.40,713.40 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:713.40,715.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:721.65,723.25 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:727.2,728.38 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:733.2,733.52 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:723.25,725.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:728.38,729.40 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:729.40,731.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:738.87,743.19 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:749.2,750.24 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:757.2,757.97 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:764.2,764.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:743.19,745.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:745.8,747.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:750.24,755.3 4 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:757.97,762.3 4 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:764.34,766.20 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:771.3,774.31 4 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:777.3,777.120 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:766.20,768.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:768.9,770.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:774.31,776.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:784.73,788.12 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:788.12,789.16 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:791.3,792.20 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:797.3,797.83 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:803.3,803.69 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:808.3,808.28 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:789.16,789.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:792.20,795.4 2 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:797.83,801.4 3 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:803.69,806.4 2 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:808.28,810.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:817.70,822.12 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:822.12,823.16 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:826.3,827.20 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:832.3,832.53 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:848.3,848.63 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:853.3,857.28 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:823.16,823.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:827.20,830.4 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:833.12,836.36 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:838.33,838.33 0 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:841.11,845.10 3 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:848.63,851.4 2 0 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:857.28,859.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:865.53,867.46 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:880.2,880.51 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:889.2,889.43 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:895.2,898.53 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:867.46,868.40 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:874.3,875.34 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:868.40,870.41 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:870.41,872.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:875.34,877.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:880.51,882.40 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:885.3,885.27 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:882.40,884.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:889.43,891.40 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:891.40,893.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:898.53,900.40 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:903.3,903.29 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:900.40,902.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:909.54,910.45 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:910.45,912.35 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:915.3,915.25 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:912.35,914.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:183.147,185.2 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:191.51,212.2 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:216.69,229.30 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:241.2,245.24 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:248.2,252.9 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:229.30,230.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:231.22,232.15 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:234.37,235.17 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:237.11,238.37 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:245.24,247.3 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:253.28,254.13 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:255.16,256.23 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:264.87,266.12 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:273.2,280.27 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:305.2,305.12 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:314.2,314.9 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:266.12,268.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:268.8,270.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:280.27,284.88 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:291.3,291.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:303.3,303.39 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:284.88,285.63 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:288.4,288.36 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:285.63,287.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:292.19,292.19 0 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:294.45,295.15 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:297.90,298.17 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:300.11,301.17 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:305.12,309.3 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:309.8,313.3 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:315.77,316.13 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:317.16,318.23 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:324.45,325.9 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:326.37,327.13 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:328.16,329.23 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:335.29,337.2 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:341.28,343.2 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:345.28,353.6 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:353.6,354.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:671.3,679.20 7 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:355.26,361.30 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:369.4,370.29 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:375.4,378.36 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:430.4,430.39 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:435.4,435.52 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:439.22,443.43 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:467.4,467.27 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:471.4,471.24 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:475.25,480.38 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:515.4,519.53 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:521.32,524.41 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:560.4,560.23 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:614.25,616.43 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:630.4,631.55 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:652.4,652.43 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:662.4,662.22 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:667.17,668.10 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:361.30,367.10 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:370.29,373.5 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:378.36,382.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:395.5,395.33 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:409.5,409.32 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:420.5,423.63 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:382.34,386.64 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:391.6,391.14 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:386.64,388.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:388.12,390.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:395.33,399.64 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:404.6,404.14 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:399.64,401.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:401.12,403.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:409.32,412.64 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:417.6,417.14 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:412.64,414.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:414.12,416.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:423.63,425.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:425.11,427.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:430.39,432.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:435.52,437.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:443.43,444.78 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:444.78,446.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:449.6,450.41 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:462.6,463.30 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:446.34,447.63 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:450.41,451.59 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:456.7,457.38 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:460.7,460.33 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:451.59,453.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:453.13,455.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:457.38,459.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:467.27,469.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:471.24,473.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:480.38,481.77 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:481.77,485.38 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:507.6,507.37 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:511.6,511.35 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:485.38,487.28 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:493.7,493.41 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:496.7,496.36 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:499.7,500.38 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:503.7,505.31 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:487.28,488.41 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:488.41,489.17 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:493.41,494.66 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:496.36,498.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:500.38,502.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:507.37,509.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:524.41,525.38 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:525.38,526.43 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:532.6,533.30 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:526.43,528.26 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:528.26,530.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:534.11,535.43 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:541.6,547.95 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:555.6,555.30 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:535.43,537.26 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:537.26,539.8 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:547.95,549.24 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:553.7,553.32 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:549.24,552.8 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:560.23,566.19 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:570.5,575.42 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:578.5,579.37 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:585.5,585.37 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:611.5,611.57 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:566.19,568.11 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:575.42,577.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:579.37,580.38 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:580.38,582.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:585.37,587.27 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:592.6,592.39 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:607.6,608.30 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:587.27,588.40 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:588.40,589.16 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:592.39,593.21 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:600.7,600.38 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:593.21,596.50 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:596.50,598.9 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:600.38,601.42 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:604.8,604.46 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:601.42,602.103 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:616.43,617.46 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:624.5,625.28 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:617.46,619.36 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:619.36,622.7 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:625.28,627.6 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:631.55,632.41 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:649.5,649.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:632.41,634.31 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:640.6,641.38 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:647.6,647.30 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:634.31,635.44 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:635.44,636.16 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:641.38,643.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:643.12,646.7 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:652.43,653.46 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:659.5,659.35 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:653.46,655.37 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:655.37,657.7 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:662.22,665.5 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:679.20,681.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:691.80,692.19 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:695.2,698.38 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:706.2,706.81 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:692.19,694.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:698.38,699.26 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:699.26,701.65 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:701.65,702.10 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:706.81,708.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:725.83,726.19 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:729.2,732.33 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:744.2,744.80 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:726.19,728.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:732.33,734.24 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:737.3,737.26 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:734.24,735.12 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:737.26,739.64 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:739.64,740.10 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:744.80,746.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:750.112,753.20 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:759.2,759.23 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:763.2,765.43 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:808.2,808.33 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:753.20,755.33 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:755.33,757.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:759.23,761.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:765.43,766.30 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:769.3,769.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:772.3,773.64 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:793.3,793.22 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:766.30,768.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:769.34,771.4 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:773.64,774.38 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:790.4,790.15 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:774.38,778.40 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:781.5,786.39 4 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:778.40,779.100 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:786.39,788.6 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:793.22,797.47 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:797.47,800.52 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:800.52,803.6 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:808.33,810.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:815.82,817.19 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:824.2,825.26 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:828.2,830.28 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:817.19,818.27 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:821.3,821.9 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:818.27,820.4 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:825.26,827.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:830.28,832.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:837.98,839.19 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:848.2,849.27 2 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:852.2,854.28 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:839.19,840.28 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:845.3,845.9 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:840.28,841.17 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:841.17,843.5 1 0 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:849.27,851.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:854.28,855.16 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:855.16,857.4 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:863.43,867.33 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:867.33,869.3 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:874.38,875.34 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:875.34,876.39 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:876.39,877.51 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:877.51,879.5 1 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:886.47,890.33 3 1 +github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:890.33,892.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:91.35,93.2 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:100.56,102.2 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:104.87,106.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:109.2,109.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:112.2,113.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:116.2,116.15 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:106.16,108.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:109.27,111.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:113.16,115.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:121.69,123.2 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:127.98,129.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:132.2,132.18 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:135.2,135.19 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:129.16,131.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:132.18,134.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:140.90,142.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:145.2,145.18 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:148.2,148.19 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:142.16,144.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:145.18,147.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:156.123,158.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:161.2,161.26 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:164.2,164.35 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:158.16,160.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:161.26,163.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:224.125,226.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:229.2,230.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:233.2,233.41 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:236.2,236.46 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:226.16,228.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:230.16,232.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:233.41,235.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:242.122,245.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:248.2,253.43 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:256.2,258.22 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:261.2,267.34 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:304.2,310.12 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:403.2,403.12 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:430.2,430.17 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:245.16,247.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:253.43,255.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:258.22,260.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:267.34,269.13 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:269.13,273.28 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:273.28,277.50 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:295.5,295.12 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:277.50,285.20 4 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:291.6,292.51 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:285.20,288.12 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:296.26,296.26 0 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:297.30,298.12 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:310.12,320.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:334.3,336.70 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:320.16,324.11 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:332.4,332.18 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:325.23,326.158 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:327.34,328.161 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:329.12,330.145 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:336.70,338.11 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:344.4,345.32 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:348.4,352.42 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:357.4,358.18 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:364.4,365.18 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:369.4,369.60 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:384.4,387.18 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:392.4,393.11 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:398.4,398.30 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:339.29,340.11 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:341.12,341.12 0 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:345.32,347.5 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:352.42,355.5 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:358.18,360.10 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:365.18,367.10 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:369.60,374.34 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:378.5,379.59 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:374.34,376.6 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:379.59,382.6 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:387.18,389.10 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:394.138,394.138 0 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:395.29,396.11 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:403.12,408.28 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:408.28,421.62 6 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:421.62,422.58 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:425.5,426.11 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:422.58,424.6 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:435.128,437.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:440.2,440.43 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:437.16,439.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:445.120,447.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:450.2,450.43 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:447.16,449.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:455.116,457.65 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:460.2,460.43 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:457.65,459.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:465.117,467.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:470.2,470.42 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:467.16,469.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:476.117,478.18 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:481.2,481.43 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:478.18,480.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:487.123,489.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:492.2,492.57 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:489.16,491.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:497.118,499.18 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:503.2,503.18 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:506.2,506.28 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:509.2,510.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:513.2,514.43 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:517.2,518.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:521.2,528.42 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:549.2,549.19 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:499.18,502.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:503.18,505.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:506.28,508.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:510.16,512.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:514.43,516.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:518.16,520.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:528.42,535.95 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:547.3,547.70 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:535.95,544.4 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:555.126,557.18 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:560.2,560.57 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:557.18,559.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:566.116,567.28 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:570.2,571.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:574.2,575.43 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:578.2,579.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:583.2,592.24 3 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:595.2,596.34 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:619.2,621.25 3 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:637.2,641.19 3 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:644.2,644.21 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:567.28,569.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:571.16,573.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:575.43,577.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:579.16,581.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:592.24,594.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:596.34,598.13 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:598.13,602.27 3 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:602.27,610.19 4 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:614.5,614.54 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:610.19,612.14 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:621.25,629.95 5 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:635.3,635.65 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:629.95,631.9 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:641.19,643.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:650.125,652.55 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:657.2,657.28 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:660.2,661.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:664.2,665.43 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:668.2,669.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:673.2,677.19 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:681.2,697.46 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:708.2,708.42 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:762.2,762.19 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:652.55,653.40 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:653.40,655.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:657.28,659.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:661.16,663.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:665.43,667.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:669.16,671.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:677.19,680.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:697.46,703.67 4 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:703.67,706.4 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:708.42,719.55 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:740.3,743.20 4 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:746.3,746.18 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:750.3,750.17 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:755.3,758.26 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:719.55,722.14 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:725.4,726.18 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:729.4,737.5 3 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:722.14,724.5 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:726.18,728.5 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:743.20,745.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:746.18,749.4 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:750.17,752.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:758.26,759.9 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:767.60,768.42 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:773.2,773.14 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:768.42,769.24 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:769.24,771.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:778.115,780.15 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:789.2,789.16 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:794.2,794.22 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:797.2,798.43 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:801.2,802.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:805.2,806.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:809.2,814.61 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:780.15,783.16 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:783.16,787.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:789.16,791.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:794.22,796.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:798.43,800.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:802.16,804.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:806.16,808.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:821.160,827.42 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:834.2,834.16 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:838.2,839.43 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:842.2,843.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:847.2,847.19 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:853.2,854.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:857.2,860.19 3 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:868.2,868.73 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:827.42,829.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:829.8,829.53 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:829.53,831.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:831.8,833.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:834.16,836.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:839.43,841.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:843.16,845.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:847.19,848.62 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:848.62,850.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:854.16,856.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:860.19,867.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:874.173,881.9 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:909.2,915.16 4 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:920.2,920.33 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:882.21,883.39 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:884.28,887.28 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:892.3,892.55 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:905.10,906.49 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:887.28,888.70 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:888.70,890.5 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:892.55,894.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:894.9,896.14 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:902.4,903.14 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:896.14,898.63 2 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:898.63,900.6 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:915.16,917.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:921.28,924.31 2 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:927.3,932.9 1 1 +github.com/ethereum/go-ethereum/eth/tracers/api.go:934.14,935.28 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:937.10,938.51 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:924.31,926.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/api.go:943.38,953.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/tracers.go:55.55,56.14 1 0 +github.com/ethereum/go-ethereum/eth/tracers/tracers.go:56.14,58.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/tracers.go:58.8,60.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/tracers.go:65.53,66.33 1 0 +github.com/ethereum/go-ethereum/eth/tracers/tracers.go:71.2,71.44 1 0 +github.com/ethereum/go-ethereum/eth/tracers/tracers.go:66.33,67.51 1 0 +github.com/ethereum/go-ethereum/eth/tracers/tracers.go:67.51,69.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:37.33,39.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:42.57,44.41 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:44.41,46.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:50.72,56.2 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:60.51,62.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:65.2,65.23 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:70.2,70.26 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:76.2,76.30 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:93.2,93.13 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:62.27,64.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:65.23,66.32 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:66.32,68.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:70.26,71.29 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:71.29,73.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:76.30,79.36 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:82.3,82.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:87.3,87.32 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:79.36,81.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:82.27,83.38 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:83.38,85.5 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:87.32,88.33 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:88.33,90.5 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:97.52,99.30 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:106.2,106.12 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:99.30,101.27 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:104.3,104.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:101.27,103.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:119.121,123.35 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:126.2,127.25 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:135.2,138.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:123.35,125.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:127.25,128.37 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:131.3,131.39 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:128.37,130.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:131.39,133.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:141.150,142.2 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:145.144,149.58 4 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:153.2,153.138 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:159.2,159.107 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:149.58,152.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:153.138,155.33 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:155.33,157.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:159.107,161.33 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:161.33,163.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:167.129,168.2 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:170.97,170.98 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:172.137,173.2 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:175.81,175.82 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:178.58,180.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:183.64,185.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:18.50,51.2 17 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:54.55,70.52 3 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:73.2,73.19 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:76.2,76.19 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:79.2,79.20 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:82.2,82.24 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:85.2,85.23 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:88.2,88.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:91.2,91.22 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:94.2,94.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:97.2,97.24 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:100.2,100.22 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:103.2,103.30 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:106.2,106.20 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:109.2,109.12 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:70.52,72.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:73.19,75.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:76.19,78.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:79.20,81.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:82.24,84.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:85.23,87.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:88.27,90.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:91.22,93.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:94.27,96.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:97.24,99.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:100.22,102.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:103.30,105.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:106.20,108.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:40.33,42.28 2 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:45.2,45.12 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:42.28,44.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:90.37,92.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:95.42,96.18 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:99.2,99.11 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:96.18,98.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:118.49,122.16 2 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:125.2,125.15 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:122.16,124.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:129.32,134.2 4 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:137.145,139.2 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:144.140,149.52 4 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:153.2,154.24 2 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:159.2,160.25 2 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:166.2,170.66 4 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:194.2,195.28 2 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:200.2,201.30 2 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:149.52,151.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:154.24,157.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:160.25,162.37 2 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:162.37,164.4 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:170.66,173.43 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:177.3,177.38 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:173.43,175.4 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:177.38,184.4 3 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:184.9,184.46 1 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:184.46,192.4 3 1 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:195.28,198.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:206.127,207.2 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:210.94,213.17 3 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:213.17,215.17 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:215.17,217.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:221.135,222.2 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:224.79,224.80 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:227.49,227.66 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:230.38,230.54 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:233.40,233.59 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:236.53,237.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:237.27,239.21 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:242.3,244.25 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:250.3,250.26 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:254.3,254.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:260.3,260.30 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:264.3,264.23 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:239.21,241.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:244.25,246.45 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:246.45,248.5 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:250.26,253.4 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:254.27,256.37 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:256.37,258.5 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:260.30,263.4 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:269.53,270.27 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:270.27,273.36 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:277.3,278.23 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:273.36,275.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:290.65,292.18 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:295.2,295.10 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:292.18,294.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:298.141,300.13 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:310.2,313.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:300.13,304.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:304.8,308.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:317.136,321.25 3 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:330.2,332.16 3 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:321.25,324.37 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:327.3,328.34 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:324.37,326.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:332.16,334.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:337.122,339.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:341.91,344.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:346.131,347.2 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:349.75,349.76 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:38.63,40.18 2 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:43.2,43.10 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:40.18,42.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:46.128,48.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:50.131,53.2 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:56.138,70.24 4 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:73.2,73.25 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:76.2,76.28 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:79.2,79.23 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:70.24,72.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:73.25,75.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:76.28,78.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:83.92,91.16 3 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:94.2,94.93 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:91.16,93.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:97.133,98.2 0 0 +github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:100.77,100.78 0 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter_system.go:12.90,13.51 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter_system.go:13.51,15.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter_system.go:19.91,32.2 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:70.116,75.24 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:82.2,82.35 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:89.2,98.15 6 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:75.24,77.37 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:80.3,80.36 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:77.37,79.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:82.35,84.35 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:87.3,87.36 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:84.35,86.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:103.117,108.2 3 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:112.93,119.2 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:123.66,125.32 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:136.2,137.19 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:140.2,142.19 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:145.2,146.17 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:150.2,155.59 3 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:165.2,167.18 3 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:125.32,127.17 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:130.3,130.20 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:133.3,133.34 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:127.17,129.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:130.20,132.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:137.19,139.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:142.19,144.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:146.17,148.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:155.59,156.20 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:161.3,161.17 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:156.20,158.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:158.9,160.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:161.17,163.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:172.85,177.16 3 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:180.2,187.6 4 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:177.16,179.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:187.6,188.10 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:189.32,191.11 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:198.4,202.35 3 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:205.4,206.18 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:209.4,209.33 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:211.21,212.26 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:191.11,193.19 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:196.5,196.21 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:193.19,195.6 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:202.35,204.5 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:206.18,208.5 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:219.87,222.41 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:233.2,233.18 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:222.41,224.34 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:227.3,228.17 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:231.3,231.32 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:224.34,226.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:228.17,230.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:237.102,238.54 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:245.2,245.18 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:238.54,240.17 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:243.3,243.32 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:240.17,242.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:250.105,253.16 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:256.2,257.32 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:260.2,261.19 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:276.2,276.17 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:253.16,255.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:257.32,259.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:261.19,263.40 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:274.3,274.19 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:263.40,265.18 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:268.4,269.37 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:272.4,272.66 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:265.18,267.5 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:269.37,271.5 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter.go:279.66,280.33 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:286.2,286.14 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:280.33,281.16 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:281.16,283.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:290.130,293.27 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:322.2,322.12 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:293.27,294.89 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:297.3,297.83 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:301.3,301.62 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:305.3,305.36 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:308.3,308.30 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:320.3,320.25 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:294.89,295.12 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:297.83,298.12 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:301.62,302.12 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:305.36,306.17 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:308.30,310.30 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:316.4,316.14 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:310.30,311.31 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:311.31,313.11 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:316.14,317.18 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:325.94,326.24 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:339.2,339.29 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:351.2,351.13 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:326.24,328.34 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:334.3,334.16 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:328.34,329.38 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:329.38,331.10 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:334.16,336.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:339.29,341.29 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:347.3,347.16 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:341.29,342.39 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:342.39,344.10 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter.go:347.16,349.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:123.67,146.111 8 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:150.2,151.10 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:146.111,148.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:163.45,165.2 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:168.40,169.26 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:169.26,171.7 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:188.3,188.14 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:171.7,176.11 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:177.35,178.24 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:179.22,179.22 0 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:180.24,180.24 0 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:181.25,181.25 0 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:193.67,197.2 3 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:202.112,204.27 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:209.2,209.25 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:216.2,216.68 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:220.2,220.66 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:224.2,224.40 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:228.2,228.67 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:232.2,232.46 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:235.2,235.76 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:204.27,206.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:206.8,208.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:209.25,211.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:211.8,213.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:216.68,218.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:220.66,222.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:224.40,226.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:228.67,230.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:232.46,234.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:240.115,253.2 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:257.103,270.2 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:274.110,287.2 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:291.84,303.2 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:307.85,319.2 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:323.73,324.18 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:327.2,327.46 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:324.18,326.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:327.46,329.27 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:329.27,331.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:335.80,336.18 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:339.2,339.53 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:336.18,338.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:339.53,341.27 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:341.27,343.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:347.89,348.46 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:348.46,350.27 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:350.27,352.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:356.81,358.28 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:361.2,361.61 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:358.28,360.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:361.61,363.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:366.82,367.48 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:370.2,370.56 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:367.48,369.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:370.56,371.84 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:371.84,372.48 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:372.48,373.121 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:373.121,375.6 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:381.104,384.17 3 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:387.2,390.33 3 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:405.2,405.31 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:409.2,409.44 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:384.17,386.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:390.33,391.51 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:395.3,395.50 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:391.51,394.4 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:395.50,398.19 3 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:398.19,401.5 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:405.31,407.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:409.44,411.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:415.140,416.50 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:451.2,451.12 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:416.50,421.17 4 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:424.3,425.33 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:432.3,433.57 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:449.3,449.14 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:421.17,423.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:425.33,426.29 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:426.29,430.5 3 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:433.57,436.18 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:439.4,440.37 2 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:447.4,447.62 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:436.18,438.5 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:440.37,441.38 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:441.38,445.6 3 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:455.36,457.15 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:466.2,467.63 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:471.2,471.6 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:457.15,464.3 6 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:467.63,469.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:471.6,472.10 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:473.25,474.32 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:475.26,476.28 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:477.28,478.35 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:479.33,480.35 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:481.27,482.34 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:483.31,484.38 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:486.26,487.48 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:494.4,494.22 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:496.28,497.48 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:504.4,504.16 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:507.26,508.10 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:509.27,510.10 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:511.29,512.10 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:513.28,514.10 1 0 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:487.48,491.5 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:491.10,493.5 1 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:497.48,501.5 2 1 +github.com/ethereum/go-ethereum/eth/filters/filter_system.go:501.10,503.5 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:64.112,75.2 3 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:79.64,83.6 4 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:83.6,86.34 3 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:95.3,100.33 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:103.3,103.20 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:86.34,87.11 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:88.24,90.28 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:91.12,92.13 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:100.33,102.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:114.66,124.12 5 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:142.2,142.24 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:124.12,125.7 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:125.7,126.11 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:127.28,129.56 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:132.5,132.27 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:133.30,137.11 4 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:129.56,131.6 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:147.100,149.16 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:153.2,155.12 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:177.2,177.20 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:149.16,151.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:155.12,159.7 3 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:159.7,160.11 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:161.30,164.30 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:167.24,169.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:170.29,172.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:164.30,166.6 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:184.53,194.12 5 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:212.2,212.21 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:194.12,195.7 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:195.7,196.11 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:197.24,199.53 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:202.5,202.27 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:203.27,207.11 4 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:199.53,201.6 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:216.86,218.16 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:222.2,224.12 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:242.2,242.20 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:218.16,220.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:224.12,228.7 3 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:228.7,229.11 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:230.24,231.34 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:232.24,234.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:235.29,237.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:246.103,248.16 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:252.2,258.16 3 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:262.2,262.12 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:280.2,280.20 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:248.16,250.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:258.16,260.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:262.12,264.7 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:264.7,265.11 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:266.31,267.30 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:270.24,272.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:273.29,275.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:267.30,269.6 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:300.76,303.16 3 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:307.2,311.12 4 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:329.2,329.24 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:303.16,305.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:311.12,312.7 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:312.7,313.11 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:314.21,316.51 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:319.5,319.27 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:320.25,324.11 4 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:316.51,318.6 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:335.101,336.28 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:341.2,345.27 4 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:371.2,372.16 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:376.2,376.26 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:387.2,387.30 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:336.28,338.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:345.27,349.18 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:349.18,351.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:352.8,355.28 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:358.3,359.26 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:363.3,365.18 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:355.28,357.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:359.26,361.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:365.18,367.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:372.16,374.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:376.26,379.17 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:383.3,383.65 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:379.17,381.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:393.61,396.11 3 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:399.2,400.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:404.2,404.14 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:396.11,398.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:400.11,402.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:411.97,416.41 4 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:420.2,421.29 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:438.2,439.16 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:442.2,442.30 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:416.41,418.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:421.29,424.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:424.8,427.30 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:430.3,431.28 2 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:435.3,435.84 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:427.30,429.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:431.28,433.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:439.16,441.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:452.78,456.40 3 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:476.2,476.56 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:456.40,457.25 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:462.3,464.16 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:457.25,461.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:465.60,468.36 3 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:469.58,472.32 3 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:481.55,482.19 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:485.2,485.15 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:482.19,484.3 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:490.49,491.17 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:494.2,494.13 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:491.17,493.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:498.62,508.51 3 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:512.2,512.26 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:528.2,530.26 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:558.2,558.25 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:597.2,597.12 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:508.51,510.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:512.26,513.49 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:517.3,517.33 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:513.49,516.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:518.8,519.27 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:523.3,523.25 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:519.27,521.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:523.25,525.4 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:530.26,532.42 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:533.22,534.33 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:545.15,547.18 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:550.4,550.43 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:551.11,552.51 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:534.33,535.41 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:535.41,537.20 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:540.6,540.51 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:537.20,539.7 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:541.11,543.6 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:547.18,549.5 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:558.25,560.32 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:560.32,561.29 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:562.13,562.13 0 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:565.16,568.19 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:571.5,571.40 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:573.23,575.36 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:591.12,592.42 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:568.19,570.6 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:575.36,576.25 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:581.6,581.44 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:576.25,579.12 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:581.44,583.21 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:586.7,586.54 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:583.21,585.8 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:587.12,589.7 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:600.54,602.50 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:605.2,605.38 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:602.50,604.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/api.go:608.49,610.47 2 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:613.2,613.35 1 1 +github.com/ethereum/go-ethereum/eth/filters/api.go:610.47,612.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:16.77,18.2 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:20.109,21.28 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:26.2,29.27 3 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:47.2,48.16 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:51.2,51.30 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:21.28,23.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:29.27,32.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:32.8,35.28 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:38.3,39.26 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:43.3,43.100 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:35.28,37.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:39.26,41.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:48.16,50.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:55.120,57.16 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:61.2,62.12 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:83.2,83.20 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:57.16,59.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:62.12,66.7 3 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:66.7,67.11 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:68.30,70.58 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:73.24,75.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:76.29,78.11 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_api.go:70.58,72.6 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:43.155,50.2 4 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:54.151,59.2 3 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:63.132,71.2 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:75.78,77.32 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:86.2,87.19 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:90.2,92.19 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:97.2,100.17 3 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:105.2,105.42 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:77.32,79.21 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:82.3,82.38 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:79.21,81.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:87.19,89.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:92.19,94.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:100.17,102.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:110.99,113.54 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:132.2,132.18 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:113.54,115.34 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:120.3,121.35 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:126.3,127.17 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:130.3,130.32 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:115.34,117.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:121.35,122.12 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:127.17,129.4 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:136.119,137.55 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:140.2,140.18 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:137.55,139.3 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:143.53,145.12 2 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:149.2,149.19 1 0 +github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:145.12,147.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/discovery.go:30.35,32.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:86.76,88.59 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:93.2,94.43 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:116.2,116.18 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:88.59,91.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:94.43,101.55 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:101.55,102.76 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:102.76,104.6 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:106.33,108.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:109.44,111.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:121.48,122.6 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:122.6,123.54 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:123.54,126.4 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:133.55,136.16 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:139.2,139.31 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:142.2,145.21 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:157.2,157.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:136.16,138.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:139.31,141.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:145.21,147.31 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:147.31,148.37 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:153.4,153.96 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:148.37,152.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:158.38,161.42 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:165.3,172.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:174.35,177.41 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:181.3,181.42 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:186.3,188.35 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:190.39,193.42 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:197.3,204.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:206.36,209.41 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:213.3,213.35 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:220.3,222.35 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:224.35,227.42 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:231.3,237.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:239.32,242.41 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:245.3,247.35 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:249.35,252.42 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:256.3,257.17 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:261.3,264.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:266.32,269.41 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:272.3,274.35 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:276.10,277.59 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:161.42,163.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:177.41,179.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:181.42,182.78 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:182.78,184.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:193.42,195.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:209.41,211.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:213.35,214.36 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:214.36,215.65 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:215.65,217.6 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:227.42,229.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:242.41,244.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:252.42,254.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:257.17,259.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:269.41,271.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:283.113,284.35 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:288.2,289.16 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:292.2,293.16 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:297.2,302.16 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:322.2,326.58 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:330.2,330.29 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:336.2,337.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:340.2,340.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:284.35,286.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:289.16,291.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:293.16,295.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:302.16,315.48 5 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:318.3,318.23 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:315.48,316.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:318.23,319.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:326.58,329.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:330.29,331.53 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:331.53,334.4 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:337.40,339.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:343.117,344.35 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:352.2,360.39 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:448.2,448.22 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:344.35,346.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:360.39,363.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:367.3,368.26 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:371.3,372.25 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:376.3,377.17 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:381.3,386.17 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:407.3,413.41 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:363.24,364.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:368.26,370.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:372.25,374.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:377.17,379.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:386.17,387.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:391.4,403.45 5 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:387.25,389.10 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:403.45,404.10 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:413.41,417.18 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:420.4,421.73 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:424.4,425.18 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:428.4,429.60 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:433.4,433.31 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:439.4,439.42 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:445.4,445.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:417.18,419.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:421.73,423.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:425.18,427.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:429.60,432.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:433.31,434.59 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:434.59,437.6 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:439.42,441.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:453.89,454.35 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:457.2,457.38 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:461.2,465.34 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:478.2,478.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:454.35,456.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:457.38,459.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:465.34,466.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:474.3,474.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:466.24,470.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:470.9,470.73 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:470.73,473.4 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:474.24,475.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:483.115,484.35 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:488.2,491.16 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:495.2,496.17 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:504.2,509.36 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:557.2,557.19 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:484.35,486.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:491.16,494.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:496.17,502.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:509.36,510.23 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:553.3,553.98 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:511.10,513.76 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:515.10,519.18 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:522.4,523.30 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:525.11,529.36 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:532.4,534.18 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:537.4,537.37 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:519.18,520.10 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:529.36,530.10 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:534.18,535.10 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:537.37,540.19 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:543.5,547.100 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:540.19,541.11 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:547.100,548.11 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:553.98,554.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:565.49,567.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:38.69,47.2 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:50.71,57.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:60.28,62.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:65.31,67.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:70.33,72.2 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:76.112,87.2 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:92.132,93.41 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:98.2,106.4 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:93.41,95.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:95.8,97.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:110.86,119.2 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:123.107,133.2 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:101.72,106.33 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:113.2,113.30 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:106.33,108.17 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:111.3,111.41 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:108.17,110.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:141.70,146.32 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:154.2,154.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:146.32,149.30 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:149.30,152.4 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:196.45,196.73 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:197.45,197.74 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:199.42,199.67 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:200.42,200.68 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:202.46,202.75 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:203.46,203.76 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:205.43,205.69 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:206.43,206.70 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:208.42,208.67 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:209.42,209.68 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:211.39,211.61 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:212.39,212.62 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:214.42,214.67 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:215.42,215.68 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:217.39,217.61 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:218.39,218.62 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:35.61,48.2 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:51.33,53.14 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:56.2,57.13 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:53.14,55.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:61.41,63.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:66.39,69.14 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:72.2,72.42 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:69.14,71.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:76.41,81.2 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:456.48,481.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:484.48,489.30 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:495.2,508.12 10 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:489.30,494.3 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:512.46,515.31 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:521.2,536.12 11 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:515.31,520.3 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:543.69,556.34 6 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:560.2,561.60 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:565.2,565.15 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:573.2,576.15 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:582.2,585.15 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:596.2,619.6 8 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:556.34,558.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:561.60,564.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:565.15,566.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:569.3,570.21 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:566.32,568.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:576.15,577.36 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:577.36,580.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:585.15,594.3 8 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:619.6,623.61 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:627.3,631.24 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:637.3,637.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:670.3,670.18 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:623.61,625.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:631.24,635.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:638.19,638.19 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:640.19,640.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:642.25,643.24 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:644.17,645.23 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:647.33,648.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:649.34,650.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:651.33,652.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:653.38,654.36 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:655.38,656.36 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:658.30,659.33 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:660.31,661.34 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:662.30,663.33 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:664.35,665.38 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:666.35,667.38 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:676.35,679.65 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:727.2,741.42 9 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:679.65,680.59 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:680.59,682.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:682.9,683.40 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:686.4,687.33 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:708.4,721.10 12 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:683.40,685.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:687.33,690.44 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:694.5,696.44 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:690.44,692.7 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:696.44,697.39 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:697.39,700.46 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:704.7,704.60 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:700.46,702.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:741.42,743.32 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:747.3,749.42 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:753.3,761.69 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:743.32,746.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:749.42,751.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:766.35,768.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:781.2,795.16 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:798.2,798.45 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:768.31,769.47 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:772.3,772.42 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:769.47,771.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:772.42,773.37 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:773.37,774.52 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:774.52,776.6 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:795.16,796.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:802.59,819.21 5 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:823.2,823.26 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:819.21,822.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:828.38,830.23 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:834.2,834.36 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:841.2,841.23 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:830.23,832.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:834.36,835.22 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:835.22,838.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:841.23,848.3 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:853.38,854.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:854.31,855.48 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:855.48,857.39 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:863.4,863.25 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:868.4,868.41 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:873.4,877.22 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:857.39,858.25 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:858.25,861.6 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:863.25,865.13 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:868.41,869.24 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:869.24,871.6 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:877.22,879.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:886.117,896.34 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:903.2,903.26 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:906.2,909.31 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:896.34,897.40 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:900.3,901.86 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:897.40,898.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:903.26,905.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:909.31,911.41 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:917.3,917.27 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:920.3,929.7 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:940.3,952.64 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:957.3,961.29 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:978.3,978.17 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:911.41,912.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:917.27,919.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:929.7,931.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:934.4,934.41 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:937.4,937.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:931.18,932.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:934.41,935.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:952.64,956.4 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:961.29,965.28 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:968.4,968.28 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:971.4,971.100 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:965.28,967.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:968.28,970.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:971.100,974.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:983.120,993.35 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1000.2,1000.26 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1003.2,1006.31 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:993.35,994.40 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:997.3,998.83 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:994.40,995.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1000.26,1002.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1006.31,1008.22 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1012.3,1012.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1018.3,1018.27 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1021.3,1030.7 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1041.3,1041.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1044.3,1045.36 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1052.3,1063.64 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1068.3,1072.13 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1008.22,1009.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1012.31,1013.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1018.27,1020.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1030.7,1032.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1035.4,1035.42 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1038.4,1038.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1032.18,1033.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1035.42,1036.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1041.32,1043.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1045.36,1048.26 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1048.26,1049.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1063.64,1067.4 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1072.13,1076.79 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1076.79,1079.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1086.117,1096.34 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1103.2,1103.26 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1106.2,1109.31 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1096.34,1097.40 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1100.3,1101.87 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1097.40,1098.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1103.26,1105.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1109.31,1111.22 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1115.3,1115.59 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1121.3,1121.27 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1124.3,1133.7 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1146.3,1146.27 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1149.3,1149.27 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1152.3,1159.48 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1175.3,1175.21 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1190.3,1190.25 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1193.3,1206.21 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1210.3,1210.64 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1215.3,1219.29 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1234.3,1234.21 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1111.22,1112.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1115.59,1116.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1121.27,1123.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1133.7,1135.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1138.4,1138.41 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1141.4,1141.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1135.18,1136.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1138.41,1139.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1146.27,1148.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1149.27,1151.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1159.48,1160.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1171.4,1171.22 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1160.32,1162.22 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1166.5,1169.10 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1162.22,1163.14 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1171.22,1172.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1175.21,1177.48 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1177.48,1183.37 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1183.37,1184.11 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1190.25,1191.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1206.21,1209.4 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1210.64,1214.4 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1219.29,1224.22 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1227.4,1227.103 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1224.22,1226.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1227.103,1230.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1234.21,1236.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1242.132,1252.39 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1259.2,1259.26 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1262.2,1265.70 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1252.39,1253.40 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1256.3,1257.83 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1253.40,1254.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1259.26,1261.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1265.70,1273.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1283.3,1283.35 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1289.3,1289.27 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1292.3,1301.7 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1312.3,1312.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1315.3,1320.49 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1331.3,1343.64 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1348.3,1352.29 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1273.18,1275.31 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1278.4,1278.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1275.31,1277.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1278.31,1280.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1283.35,1285.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1289.27,1291.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1301.7,1303.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1306.4,1306.46 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1309.4,1309.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1303.18,1304.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1306.46,1307.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1312.32,1314.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1320.49,1327.26 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1327.26,1328.10 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1343.64,1347.4 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1352.29,1356.87 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1356.87,1359.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1366.132,1376.39 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1383.2,1383.26 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1386.2,1389.70 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1376.39,1377.40 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1380.3,1381.83 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1377.40,1378.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1383.26,1385.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1389.70,1397.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1407.3,1407.35 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1413.3,1413.27 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1416.3,1425.7 4 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1436.3,1436.32 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1439.3,1440.40 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1448.3,1459.64 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1464.3,1468.13 4 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1397.18,1399.31 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1402.4,1402.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1399.31,1401.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1402.31,1404.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1407.35,1409.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1413.27,1415.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1425.7,1427.18 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1430.4,1430.46 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1433.4,1433.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1427.18,1428.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1430.46,1431.13 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1436.32,1438.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1440.40,1444.26 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1444.26,1445.10 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1459.64,1463.4 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1468.13,1472.79 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1472.79,1475.5 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1482.46,1486.36 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1491.2,1492.37 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1497.2,1498.36 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1503.2,1504.41 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1509.2,1510.41 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1515.2,1518.34 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1521.2,1521.35 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1524.2,1524.34 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1527.2,1527.39 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1530.2,1530.39 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1486.36,1487.23 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1487.23,1489.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1492.37,1493.23 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1493.23,1495.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1498.36,1499.23 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1499.23,1501.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1504.41,1505.23 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1505.23,1507.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1510.41,1511.23 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1511.23,1513.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1518.34,1520.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1521.35,1523.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1524.34,1526.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1527.39,1529.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1530.39,1532.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1537.68,1538.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1539.25,1539.25 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1541.20,1541.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1543.19,1543.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1553.60,1555.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1561.2,1571.25 6 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1556.19,1558.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1559.10,1559.10 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1571.25,1573.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1578.70,1579.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1580.25,1580.25 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1582.20,1582.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1584.19,1584.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1594.62,1596.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1602.2,1612.34 6 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1597.19,1599.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1600.10,1600.10 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1612.34,1614.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1619.68,1620.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1621.25,1621.25 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1623.20,1623.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1625.19,1625.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1635.60,1637.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1643.2,1653.24 6 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1638.19,1640.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1641.10,1641.10 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1653.24,1655.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1655.8,1656.40 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1656.40,1658.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1664.78,1665.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1666.25,1666.25 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1668.20,1668.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1670.19,1670.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1680.70,1682.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1688.2,1698.34 6 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1683.19,1685.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1686.10,1686.10 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1698.34,1700.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1705.78,1706.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1707.25,1707.25 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1709.20,1709.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1711.19,1711.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1721.70,1723.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1729.2,1739.34 6 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1724.19,1726.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1727.10,1727.10 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1739.34,1741.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1746.63,1753.34 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1771.2,1781.39 8 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1815.2,1815.38 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1823.2,1823.24 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1753.34,1757.15 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1761.3,1761.14 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1757.15,1759.12 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1761.14,1766.9 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1781.39,1783.51 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1791.3,1791.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1783.51,1784.76 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1784.76,1788.5 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1791.32,1792.63 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1792.63,1797.61 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1807.5,1808.20 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1797.61,1799.39 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1802.6,1803.41 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1799.39,1801.7 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1804.11,1806.6 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1815.38,1816.34 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1816.34,1819.4 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1823.24,1826.3 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1833.65,1839.34 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1858.2,1859.38 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1862.2,1869.24 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1839.34,1843.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1848.3,1848.49 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1855.3,1856.37 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1843.18,1845.12 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1848.49,1849.76 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1849.76,1852.5 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1859.38,1861.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1869.24,1872.3 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1879.63,1881.24 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1884.2,1886.41 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1890.2,1896.39 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2043.2,2043.24 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2064.2,2064.38 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2067.2,2073.28 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1881.24,1883.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1886.41,1888.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1896.39,1898.27 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1904.3,1904.48 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2020.3,2022.50 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2032.3,2032.43 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1898.27,1900.12 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1904.48,1905.23 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1908.4,1913.95 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1919.4,1919.93 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1924.4,1924.64 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1992.4,1992.26 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1905.23,1906.13 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1913.95,1916.5 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1919.93,1921.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1924.64,1927.57 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1927.57,1933.23 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1942.6,1942.81 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1950.6,1955.45 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1959.6,1966.19 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1981.6,1981.33 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1984.6,1988.28 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1933.23,1935.7 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1942.81,1943.68 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1946.7,1946.125 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1943.68,1945.8 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1947.12,1949.7 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1955.45,1957.8 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1966.19,1969.46 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1973.7,1979.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1969.46,1971.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1981.33,1983.7 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1992.26,1997.63 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2004.5,2004.19 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2010.5,2010.17 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1997.63,1999.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2002.6,2002.20 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1999.18,2001.7 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2004.19,2008.6 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2010.17,2012.6 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2012.11,2014.6 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2022.50,2024.44 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2027.4,2027.15 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2024.44,2026.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2032.43,2037.52 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2037.52,2039.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2043.24,2044.23 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2056.3,2056.82 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2044.23,2045.61 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2045.61,2047.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2047.10,2047.39 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2047.39,2049.53 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2049.53,2050.54 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2050.54,2052.7 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2056.82,2057.55 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2060.4,2060.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2057.55,2059.5 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2064.38,2066.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2073.28,2076.3 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2083.73,2084.34 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2107.2,2108.57 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2111.2,2111.38 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2114.2,2114.113 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2084.34,2088.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2093.3,2097.14 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2088.18,2090.12 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2098.12,2098.12 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2099.33,2100.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2101.29,2102.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2103.11,2104.69 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2108.57,2110.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2111.38,2113.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2119.73,2120.34 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2143.2,2144.57 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2147.2,2147.38 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2150.2,2150.112 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2120.34,2124.18 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2129.3,2133.14 4 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2124.18,2126.12 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2134.12,2134.12 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2135.33,2136.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2137.29,2138.24 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2139.11,2140.69 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2144.57,2146.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2147.38,2149.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2156.56,2159.16 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2162.2,2171.41 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2175.2,2175.34 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2193.2,2193.38 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2196.2,2200.34 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2207.2,2212.15 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2217.2,2217.67 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2223.2,2223.114 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2159.16,2161.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2171.41,2173.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2175.34,2176.44 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2179.3,2184.24 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2176.44,2177.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2184.24,2186.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2189.4,2189.38 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2186.18,2187.15 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2193.38,2195.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2200.34,2201.44 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2204.3,2204.28 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2201.44,2203.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2212.15,2213.50 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2213.50,2215.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2217.67,2218.47 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2221.3,2221.24 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2218.47,2220.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2228.118,2230.35 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2233.2,2233.29 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2236.2,2243.37 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2246.2,2246.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2251.2,2252.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2258.2,2263.25 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2272.2,2272.63 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2281.2,2286.29 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2289.2,2290.29 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2293.2,2296.19 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2299.2,2300.16 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2306.2,2307.35 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2314.2,2320.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2325.2,2325.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2230.35,2232.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2233.29,2235.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2243.37,2245.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2247.30,2247.30 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2248.10,2248.10 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2252.9,2257.3 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2263.25,2267.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2272.63,2280.3 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2286.29,2288.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2290.29,2292.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2296.19,2298.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2300.16,2305.3 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2307.35,2309.55 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2312.3,2312.16 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2309.55,2310.14 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2321.31,2321.31 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2322.20,2322.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2323.19,2323.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2330.82,2335.13 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2338.2,2338.47 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2335.13,2337.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2343.82,2345.33 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2348.2,2355.37 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2358.2,2358.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2363.2,2364.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2370.2,2375.25 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2384.2,2384.25 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2393.2,2401.44 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2422.2,2427.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2432.2,2432.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2345.33,2347.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2355.37,2357.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2359.30,2359.30 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2360.10,2360.10 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2364.9,2369.3 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2375.25,2379.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2384.25,2392.3 5 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2401.44,2407.67 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2410.3,2410.26 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2416.3,2419.43 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2407.67,2409.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2410.26,2413.12 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2428.31,2428.31 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2429.20,2429.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2430.19,2430.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2437.118,2444.33 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2448.2,2448.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2454.2,2454.29 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2457.2,2464.37 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2467.2,2467.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2472.2,2473.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2479.2,2484.25 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2492.2,2492.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2498.2,2498.37 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2508.2,2508.22 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2515.2,2520.35 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2560.2,2569.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2574.2,2574.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2444.33,2447.3 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2448.32,2449.32 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2452.3,2452.28 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2449.32,2451.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2454.29,2456.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2464.37,2466.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2468.30,2468.30 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2469.10,2469.10 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2473.9,2478.3 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2484.25,2488.3 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2492.31,2497.3 4 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2498.37,2503.3 4 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2508.22,2514.3 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2520.35,2523.33 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2526.3,2527.25 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2532.3,2533.22 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2523.33,2525.4 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2527.25,2528.31 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2528.31,2530.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2533.22,2537.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2537.18,2541.5 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2542.9,2548.21 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2551.4,2552.18 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2548.21,2550.5 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2552.18,2556.5 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2570.31,2570.31 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2571.20,2571.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2572.19,2572.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2579.82,2581.33 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2584.2,2591.37 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2594.2,2594.9 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2599.2,2600.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2606.2,2611.25 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2620.2,2620.25 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2629.2,2637.44 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2658.2,2664.9 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2669.2,2669.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2581.33,2583.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2591.37,2593.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2595.30,2595.30 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2596.10,2596.10 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2600.9,2605.3 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2611.25,2615.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2620.25,2628.3 5 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2637.44,2643.67 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2646.3,2646.26 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2652.3,2655.51 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2643.67,2645.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2646.26,2649.12 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2665.31,2665.31 0 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2666.20,2666.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2667.19,2667.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2674.86,2676.33 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2679.2,2686.37 4 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2689.2,2689.9 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2694.2,2695.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2701.2,2706.25 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2715.2,2715.25 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2724.2,2732.44 5 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2753.2,2758.9 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2763.2,2763.12 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2676.33,2678.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2686.37,2688.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2690.30,2690.30 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2691.10,2691.10 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2695.9,2700.3 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2706.25,2710.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2715.25,2723.3 5 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2732.44,2738.67 4 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2741.3,2741.26 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2747.3,2750.51 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2738.67,2740.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2741.26,2744.12 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2759.31,2759.31 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2760.20,2760.20 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2761.19,2761.19 0 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2770.66,2771.21 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2781.2,2781.21 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2786.2,2786.54 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2790.2,2790.12 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2771.21,2773.58 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2776.3,2779.80 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2773.58,2775.4 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2781.21,2785.3 3 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2786.54,2789.3 2 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2797.37,2798.22 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2802.2,2802.29 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2798.22,2801.3 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2806.49,2808.53 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2812.2,2813.17 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2816.2,2817.31 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2820.2,2821.32 2 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2824.2,2830.20 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2833.2,2844.108 4 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2808.53,2810.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2813.17,2815.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2817.31,2819.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2821.32,2823.3 1 0 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2830.20,2832.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2848.49,2850.53 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2853.2,2863.81 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2850.53,2852.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2869.75,2870.29 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2873.2,2875.23 3 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2879.2,2879.45 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2870.29,2872.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2875.23,2878.3 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2890.34,2892.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2894.44,2896.2 1 1 +github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2898.39,2901.2 2 1 +github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:12.116,14.110 2 0 +github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:17.2,17.22 1 0 +github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:14.110,16.3 1 0 +github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:21.101,24.28 3 0 +github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:27.2,27.15 1 0 +github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:24.28,26.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:40.43,42.2 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:44.71,46.16 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:49.2,49.26 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:46.16,48.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:53.39,55.2 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:57.27,59.2 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:64.66,67.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:70.2,70.33 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:67.16,69.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:77.92,79.2 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:81.138,84.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:87.2,87.16 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:84.16,86.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:95.93,97.2 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:100.68,104.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:112.107,115.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:121.2,123.51 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:126.2,126.51 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:130.2,130.73 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:133.2,133.74 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:136.2,136.71 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:140.2,141.31 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:164.2,165.39 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:171.2,171.66 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:115.16,117.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:117.8,117.26 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:117.26,119.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:123.51,125.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:126.51,128.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:130.73,132.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:133.74,135.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:136.71,138.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:141.31,144.23 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:151.3,151.58 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:154.3,154.23 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:144.23,150.4 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:151.58,153.4 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:154.23,155.28 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:158.4,158.24 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:155.28,157.5 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:158.24,160.5 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:165.39,166.21 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:169.3,169.17 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:166.21,168.4 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:175.94,178.31 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:181.2,181.18 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:178.31,180.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:186.95,189.31 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:192.2,192.18 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:189.31,191.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:206.59,207.52 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:210.2,210.45 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:207.52,209.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:214.127,217.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:224.2,224.47 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:227.2,227.46 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:217.16,219.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:219.8,219.24 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:219.24,221.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:221.8,221.62 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:221.62,223.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:224.47,226.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:236.136,239.16 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:244.2,248.123 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:251.2,251.60 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:254.2,254.23 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:239.16,241.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:248.123,250.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:251.60,253.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:258.94,262.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:265.122,268.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:271.2,271.17 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:276.2,276.47 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:279.2,279.21 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:268.16,270.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:271.17,273.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:273.8,273.62 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:273.62,275.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:276.47,278.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:284.103,287.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:292.2,292.15 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:287.16,288.15 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:288.15,290.4 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:297.85,299.67 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:303.2,304.54 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:307.2,308.48 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:311.2,311.32 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:299.67,301.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:304.54,306.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:308.48,310.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:316.113,318.2 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:323.68,326.67 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:329.2,329.46 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:332.2,332.21 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:326.67,328.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:329.46,331.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:337.114,341.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:345.129,349.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:353.109,357.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:361.110,365.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:370.96,373.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:376.2,377.20 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:373.16,375.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:381.136,383.16 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:386.2,386.48 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:383.16,385.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:389.63,394.24 2 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:407.2,407.17 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:394.24,396.45 2 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:396.45,398.4 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:399.8,400.25 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:405.3,405.44 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:400.25,402.4 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:402.9,404.4 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:413.99,417.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:420.114,424.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:427.94,431.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:435.95,439.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:442.78,446.2 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:456.113,459.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:462.2,462.17 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:459.16,461.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:467.120,470.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:473.2,473.17 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:470.16,472.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:478.98,481.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:484.2,484.17 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:481.16,483.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:489.74,491.68 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:494.2,494.30 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:491.68,493.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:499.75,501.80 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:504.2,504.30 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:501.80,503.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:511.90,514.16 3 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:517.2,517.25 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:514.16,516.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:524.85,526.16 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:529.2,529.83 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:526.16,528.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:532.44,533.19 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:536.2,537.30 2 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:540.2,540.34 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:533.19,535.3 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:537.30,539.3 1 1 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:543.50,548.23 2 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:551.2,551.22 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:554.2,554.18 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:557.2,557.25 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:560.2,560.12 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:548.23,550.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:551.22,553.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:554.18,556.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:557.25,559.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:586.63,587.14 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:590.2,608.3 1 0 +github.com/ethereum/go-ethereum/ethclient/ethclient.go:587.14,589.3 1 0 +github.com/ethereum/go-ethereum/ethclient/signer.go:37.89,40.2 1 0 +github.com/ethereum/go-ethereum/ethclient/signer.go:42.59,45.2 2 0 +github.com/ethereum/go-ethereum/ethclient/signer.go:47.82,48.34 1 0 +github.com/ethereum/go-ethereum/ethclient/signer.go:51.2,51.20 1 0 +github.com/ethereum/go-ethereum/ethclient/signer.go:48.34,50.3 1 0 +github.com/ethereum/go-ethereum/ethclient/signer.go:54.47,55.43 1 0 +github.com/ethereum/go-ethereum/ethclient/signer.go:57.68,58.43 1 0 +github.com/ethereum/go-ethereum/ethclient/signer.go:60.109,61.43 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:43.31,45.35 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:48.2,48.33 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:45.35,47.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:54.13,55.44 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:59.2,59.44 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:55.44,58.3 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:68.54,76.2 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:79.44,83.2 3 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:86.51,90.2 3 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:99.54,102.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:103.2,105.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:106.2,108.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:109.2,109.33 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:102.51,102.88 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:105.51,105.95 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:108.51,108.96 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:118.57,119.18 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:122.2,122.30 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:128.2,128.32 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:134.2,134.44 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:119.18,121.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:122.30,127.3 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:128.32,133.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:138.55,139.48 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:145.2,145.58 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:139.48,144.3 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:150.58,154.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:162.2,165.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:172.2,172.34 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:154.51,161.3 5 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:165.51,171.3 4 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:181.48,182.44 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:188.2,188.35 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:182.44,187.3 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:193.57,196.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:197.2,200.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:207.2,207.31 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:196.51,196.98 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:200.51,206.3 4 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:217.54,221.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:225.2,228.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:232.2,235.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:242.2,245.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:255.2,258.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:262.2,262.33 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:221.51,224.3 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:228.51,231.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:235.51,241.3 4 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:245.51,254.3 6 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:258.51,261.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:272.60,276.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:281.2,284.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:289.2,292.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:296.2,299.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:306.2,306.35 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:276.51,280.3 3 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:284.51,288.3 3 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:292.51,295.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:299.51,305.3 4 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:318.24,325.2 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:327.49,330.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:331.2,333.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:334.2,336.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:337.2,339.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:340.2,342.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:343.2,345.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:353.2,353.35 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:330.51,330.87 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:333.51,333.88 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:336.51,336.86 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:339.51,339.88 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:342.51,342.87 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:345.51,346.21 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:351.3,351.11 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:346.21,348.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:348.9,350.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:362.36,366.2 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:368.55,371.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:372.2,374.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:375.2,377.51 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:385.2,385.35 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:371.51,371.91 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:374.51,374.89 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:377.51,378.26 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:383.3,383.11 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:378.26,380.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:380.9,382.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:427.79,428.37 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:431.2,431.16 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:434.2,450.38 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:459.2,459.73 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:463.2,463.74 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:474.2,474.77 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:485.2,485.78 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:499.2,499.79 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:521.2,521.81 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:532.2,532.73 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:550.2,550.64 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:554.2,559.60 4 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:562.2,564.61 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:567.2,573.25 6 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:576.2,600.58 15 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:601.2,603.58 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:604.2,606.58 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:607.2,609.58 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:610.2,612.58 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:613.2,615.58 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:623.2,636.20 9 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:428.37,430.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:431.16,433.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:450.38,453.36 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:453.36,456.4 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:459.73,462.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:463.74,465.49 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:470.3,472.11 3 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:465.49,467.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:467.9,469.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:474.77,476.49 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:481.3,483.11 3 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:476.49,478.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:478.9,480.4 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:485.78,487.49 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:492.3,497.11 5 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:487.49,489.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:489.9,491.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:499.79,501.49 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:507.3,510.49 3 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:515.3,519.11 5 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:501.49,503.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:503.9,505.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:510.49,512.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:512.9,514.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:521.81,523.46 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:529.3,530.11 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:523.46,524.17 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:524.17,527.5 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:532.73,539.50 5 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:546.3,547.11 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:539.50,545.4 3 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:550.64,553.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:559.60,561.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:564.61,566.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:573.25,575.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:600.58,600.101 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:603.58,603.102 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:606.58,606.103 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:609.58,609.104 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:612.58,612.105 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:615.58,616.31 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:621.3,621.11 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:616.31,618.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:618.9,620.4 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:640.38,643.2 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:647.95,650.27 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:653.2,656.15 3 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:661.2,661.11 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:667.2,671.39 4 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:675.2,675.54 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:650.27,652.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:656.15,659.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:661.11,663.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:671.39,674.3 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:678.49,680.2 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:683.143,686.12 3 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:689.2,707.16 14 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:710.2,710.40 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:686.12,688.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:707.16,709.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:714.138,715.21 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:718.2,718.20 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:722.2,722.43 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:727.2,739.16 11 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:744.2,744.63 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:715.21,717.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:718.20,720.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:722.43,726.3 3 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:739.16,742.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:744.63,746.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:750.124,751.20 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:755.2,758.64 3 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:751.20,753.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:758.64,760.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:764.92,769.16 4 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:769.16,771.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:775.132,776.26 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:779.2,779.20 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:783.2,783.43 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:788.2,794.18 7 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:798.2,798.60 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:776.26,778.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:779.20,781.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:783.43,786.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:794.18,796.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:798.60,800.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:805.76,806.26 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:810.2,810.43 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:815.2,818.16 4 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:823.2,823.65 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:806.26,808.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:810.43,813.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:818.16,821.3 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:823.65,825.3 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:829.59,833.32 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:836.2,840.16 3 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:844.2,847.24 3 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:833.32,835.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:840.16,842.3 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:851.69,854.2 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:856.55,857.27 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:858.14,859.26 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:860.14,861.22 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:862.14,864.44 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:865.22,867.35 2 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:868.16,869.23 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:870.11,871.19 1 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:872.12,873.20 1 1 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:874.19,876.35 2 0 +github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:877.10,878.50 1 0 +github.com/ethereum/go-ethereum/core/vm/runtime/env.go:24.34,42.2 3 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:53.31,54.28 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:74.2,74.27 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:77.2,77.21 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:80.2,80.23 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:83.2,83.25 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:86.2,86.22 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:89.2,89.28 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:92.2,92.26 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:97.2,97.24 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:54.28,72.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:74.27,76.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:77.21,79.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:80.23,82.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:83.25,85.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:86.22,88.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:89.28,91.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:92.26,93.46 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:93.46,95.4 1 0 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:97.24,99.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:107.79,108.16 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:111.2,113.22 2 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:116.2,121.108 2 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:124.2,136.28 4 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:108.16,110.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:113.22,115.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:121.108,123.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:140.80,141.16 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:144.2,146.22 2 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:149.2,153.108 2 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:157.2,163.40 2 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:141.16,143.3 1 0 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:146.22,148.3 1 0 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:153.108,155.3 1 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:171.86,179.108 5 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:183.2,190.30 2 1 +github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:179.108,181.3 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:54.22,58.2 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:62.37,66.2 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:70.35,76.2 4 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:79.51,83.18 3 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:86.2,87.16 2 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:83.18,85.3 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:91.53,95.18 3 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:98.2,98.41 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:101.2,101.33 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:95.18,97.3 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:98.41,100.3 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:105.57,109.18 3 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:112.2,113.12 2 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:109.18,111.3 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:117.46,121.18 3 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:124.2,125.12 2 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:121.18,123.3 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:130.44,134.2 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:137.60,141.2 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:146.77,158.25 4 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:167.2,168.27 2 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:171.2,174.3 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:158.25,159.34 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:162.3,162.16 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:159.34,160.12 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:162.16,164.4 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:168.27,170.3 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:180.59,182.2 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:185.59,187.2 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:191.63,193.2 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:199.31,204.2 3 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:223.46,227.2 3 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:230.42,234.2 3 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:237.33,239.2 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:242.31,246.36 3 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:253.2,253.12 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:246.36,247.22 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:251.3,251.49 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:247.22,249.12 2 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:257.25,260.2 2 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:263.54,264.36 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:275.2,275.12 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:264.36,265.22 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:271.3,271.61 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:265.22,266.49 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:269.4,269.12 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:266.49,268.5 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:271.61,273.4 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:289.33,291.16 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:296.2,296.22 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:300.2,300.25 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:291.16,294.3 2 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:296.22,299.3 2 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:305.35,307.2 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:312.34,313.22 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:316.2,316.12 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:313.22,315.3 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:322.36,323.24 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:326.2,326.12 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:323.24,325.3 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:331.31,333.2 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:343.42,348.30 4 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:351.2,351.30 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:348.30,350.3 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:356.53,360.20 3 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:363.2,364.16 2 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:360.20,362.3 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:369.55,373.20 3 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:376.2,376.43 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:379.2,379.33 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:373.20,375.3 1 0 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:376.43,378.3 1 1 +github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:384.33,389.2 3 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:42.33,44.2 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:48.122,55.95 3 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:58.2,58.69 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:55.95,57.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:81.134,103.38 6 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:110.2,118.21 2 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:103.38,109.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:140.160,147.2 3 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:150.72,154.2 3 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:157.76,161.2 3 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:166.71,168.2 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:171.75,175.2 3 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:178.125,180.2 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:182.44,183.19 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:186.2,187.30 2 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:190.2,190.34 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:183.19,185.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:187.30,189.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:193.50,198.23 2 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:201.2,201.22 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:204.2,204.18 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:207.2,207.25 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:210.2,210.12 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:198.23,200.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:201.22,203.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:204.18,206.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:207.25,209.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:213.79,214.22 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:217.2,225.41 3 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:234.2,234.16 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:214.22,216.3 1 0 +github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:225.41,233.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:87.99,88.63 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:88.63,90.23 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:93.3,93.27 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:97.3,100.15 4 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:90.23,92.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:93.27,95.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:100.15,102.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:109.104,114.22 5 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:117.2,121.59 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:124.2,124.16 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:128.2,149.17 15 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:114.22,116.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:121.59,123.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:124.16,126.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:153.68,160.24 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:163.2,163.16 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:160.24,162.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:168.35,172.24 3 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:180.2,180.22 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:172.24,175.32 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:178.3,178.20 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:175.32,177.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:184.51,186.2 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:189.53,191.16 2 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:194.2,194.17 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:191.16,193.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:198.57,200.2 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:203.46,205.2 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:209.44,214.2 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:217.60,222.2 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:227.77,229.2 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:236.59,238.16 2 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:241.2,241.33 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:238.16,240.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:245.59,247.2 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:256.63,258.2 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:261.35,263.2 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:282.50,285.25 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:289.2,306.46 6 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:462.2,462.17 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:465.2,465.14 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:285.25,287.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:306.46,309.17 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:315.3,316.70 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:319.3,319.22 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:324.3,327.46 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:330.3,330.30 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:346.3,346.30 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:349.3,349.30 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:352.3,352.30 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:355.3,355.31 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:359.3,360.17 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:365.3,371.127 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:376.3,377.17 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:382.3,382.33 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:385.3,385.32 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:390.3,391.67 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:395.3,399.17 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:404.3,406.21 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:411.3,411.82 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:416.3,416.84 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:421.3,421.30 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:424.3,424.31 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:427.3,430.17 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:436.3,442.167 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:447.3,453.10 5 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:309.17,312.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:316.70,318.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:319.22,322.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:327.46,329.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:330.30,332.23 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:335.4,335.40 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:332.23,333.10 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:335.40,337.19 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:342.5,342.35 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:337.19,340.14 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:346.30,348.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:349.30,351.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:352.30,354.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:355.31,357.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:360.17,363.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:371.127,374.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:377.17,380.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:382.33,384.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:385.32,387.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:391.67,394.4 2 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:399.17,402.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:406.21,409.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:411.82,414.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:416.84,419.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:421.30,423.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:424.31,426.4 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:430.17,433.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:442.167,445.12 3 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:454.29,454.29 0 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:456.18,457.24 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:462.17,464.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:477.46,481.2 3 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:484.42,488.2 3 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:491.33,493.2 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:496.31,498.2 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:501.25,504.2 2 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:507.54,509.2 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:518.43,520.22 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:523.2,523.38 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:520.22,522.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:527.39,529.22 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:532.2,532.34 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:529.22,531.3 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:538.57,542.2 3 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:551.53,553.2 1 0 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:557.55,559.2 1 1 +github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:563.33,565.2 1 0 +github.com/ethereum/go-ethereum/event/event.go:53.74,57.17 4 1 +github.com/ethereum/go-ethereum/event/event.go:78.2,78.12 1 1 +github.com/ethereum/go-ethereum/event/event.go:57.17,62.3 2 1 +github.com/ethereum/go-ethereum/event/event.go:62.8,63.22 1 1 +github.com/ethereum/go-ethereum/event/event.go:66.3,66.27 1 1 +github.com/ethereum/go-ethereum/event/event.go:63.22,65.4 1 1 +github.com/ethereum/go-ethereum/event/event.go:66.27,69.32 3 1 +github.com/ethereum/go-ethereum/event/event.go:72.4,75.25 4 1 +github.com/ethereum/go-ethereum/event/event.go:69.32,70.70 1 1 +github.com/ethereum/go-ethereum/event/event.go:83.48,90.17 4 1 +github.com/ethereum/go-ethereum/event/event.go:94.2,96.27 3 1 +github.com/ethereum/go-ethereum/event/event.go:99.2,99.12 1 1 +github.com/ethereum/go-ethereum/event/event.go:90.17,93.3 2 1 +github.com/ethereum/go-ethereum/event/event.go:96.27,98.3 1 1 +github.com/ethereum/go-ethereum/event/event.go:105.28,108.32 3 1 +github.com/ethereum/go-ethereum/event/event.go:113.2,114.20 2 1 +github.com/ethereum/go-ethereum/event/event.go:108.32,109.28 1 1 +github.com/ethereum/go-ethereum/event/event.go:109.28,111.4 1 1 +github.com/ethereum/go-ethereum/event/event.go:117.49,120.34 3 1 +github.com/ethereum/go-ethereum/event/event.go:120.34,121.37 1 1 +github.com/ethereum/go-ethereum/event/event.go:121.37,122.22 1 1 +github.com/ethereum/go-ethereum/event/event.go:122.22,124.5 1 1 +github.com/ethereum/go-ethereum/event/event.go:124.10,126.5 1 1 +github.com/ethereum/go-ethereum/event/event.go:131.72,132.26 1 1 +github.com/ethereum/go-ethereum/event/event.go:137.2,137.11 1 1 +github.com/ethereum/go-ethereum/event/event.go:132.26,133.16 1 1 +github.com/ethereum/go-ethereum/event/event.go:133.16,135.4 1 1 +github.com/ethereum/go-ethereum/event/event.go:140.78,145.2 4 1 +github.com/ethereum/go-ethereum/event/event.go:163.48,172.2 2 1 +github.com/ethereum/go-ethereum/event/event.go:174.59,176.2 1 1 +github.com/ethereum/go-ethereum/event/event.go:178.45,181.2 2 1 +github.com/ethereum/go-ethereum/event/event.go:183.45,187.2 3 0 +github.com/ethereum/go-ethereum/event/event.go:189.43,192.14 3 1 +github.com/ethereum/go-ethereum/event/event.go:195.2,201.15 6 1 +github.com/ethereum/go-ethereum/event/event.go:192.14,194.3 1 1 +github.com/ethereum/go-ethereum/event/event.go:204.60,206.33 1 1 +github.com/ethereum/go-ethereum/event/event.go:210.2,213.9 3 1 +github.com/ethereum/go-ethereum/event/event.go:206.33,208.3 1 1 +github.com/ethereum/go-ethereum/event/event.go:214.24,214.24 0 1 +github.com/ethereum/go-ethereum/event/event.go:215.19,215.19 0 1 +github.com/ethereum/go-ethereum/event/feed.go:56.39,58.2 1 0 +github.com/ethereum/go-ethereum/event/feed.go:60.23,65.2 4 1 +github.com/ethereum/go-ethereum/event/feed.go:72.60,77.78 4 1 +github.com/ethereum/go-ethereum/event/feed.go:80.2,84.34 4 1 +github.com/ethereum/go-ethereum/event/feed.go:89.2,91.12 3 1 +github.com/ethereum/go-ethereum/event/feed.go:77.78,78.23 1 1 +github.com/ethereum/go-ethereum/event/feed.go:84.34,85.102 1 1 +github.com/ethereum/go-ethereum/event/feed.go:95.49,96.20 1 1 +github.com/ethereum/go-ethereum/event/feed.go:100.2,100.23 1 1 +github.com/ethereum/go-ethereum/event/feed.go:96.20,99.3 2 1 +github.com/ethereum/go-ethereum/event/feed.go:103.37,109.17 4 1 +github.com/ethereum/go-ethereum/event/feed.go:114.2,116.9 2 1 +github.com/ethereum/go-ethereum/event/feed.go:109.17,113.3 3 1 +github.com/ethereum/go-ethereum/event/feed.go:117.25,117.25 0 1 +github.com/ethereum/go-ethereum/event/feed.go:119.20,122.27 2 1 +github.com/ethereum/go-ethereum/event/feed.go:128.52,139.33 7 1 +github.com/ethereum/go-ethereum/event/feed.go:144.2,147.55 2 1 +github.com/ethereum/go-ethereum/event/feed.go:154.2,155.6 2 1 +github.com/ethereum/go-ethereum/event/feed.go:185.2,185.55 1 1 +github.com/ethereum/go-ethereum/event/feed.go:188.2,189.14 2 1 +github.com/ethereum/go-ethereum/event/feed.go:139.33,142.70 3 1 +github.com/ethereum/go-ethereum/event/feed.go:147.55,149.3 1 1 +github.com/ethereum/go-ethereum/event/feed.go:155.6,159.50 1 1 +github.com/ethereum/go-ethereum/event/feed.go:166.3,166.37 1 1 +github.com/ethereum/go-ethereum/event/feed.go:170.3,171.38 2 1 +github.com/ethereum/go-ethereum/event/feed.go:159.50,160.37 1 1 +github.com/ethereum/go-ethereum/event/feed.go:160.37,164.5 3 1 +github.com/ethereum/go-ethereum/event/feed.go:166.37,167.9 1 1 +github.com/ethereum/go-ethereum/event/feed.go:171.38,174.40 3 1 +github.com/ethereum/go-ethereum/event/feed.go:174.40,177.5 1 1 +github.com/ethereum/go-ethereum/event/feed.go:178.9,181.4 2 1 +github.com/ethereum/go-ethereum/event/feed.go:185.55,187.3 1 1 +github.com/ethereum/go-ethereum/event/feed.go:199.35,200.24 1 1 +github.com/ethereum/go-ethereum/event/feed.go:200.24,203.3 2 1 +github.com/ethereum/go-ethereum/event/feed.go:206.40,208.2 1 1 +github.com/ethereum/go-ethereum/event/feed.go:213.50,214.25 1 1 +github.com/ethereum/go-ethereum/event/feed.go:219.2,219.11 1 1 +github.com/ethereum/go-ethereum/event/feed.go:214.25,215.38 1 1 +github.com/ethereum/go-ethereum/event/feed.go:215.38,217.4 1 1 +github.com/ethereum/go-ethereum/event/feed.go:223.47,225.2 1 1 +github.com/ethereum/go-ethereum/event/feed.go:228.51,232.2 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:49.73,51.12 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:63.2,63.10 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:51.12,56.22 5 1 +github.com/ethereum/go-ethereum/event/subscription.go:56.22,57.18 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:60.4,60.25 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:57.18,59.5 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:73.33,75.20 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:79.2,83.9 4 1 +github.com/ethereum/go-ethereum/event/subscription.go:75.20,78.3 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:86.38,88.2 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:97.77,98.93 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:98.93,100.3 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:117.83,127.2 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:144.40,145.24 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:145.24,148.3 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:151.45,153.2 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:155.33,158.12 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:158.12,160.17 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:163.3,164.20 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:160.17,161.9 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:168.51,171.6 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:171.6,174.13 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:179.3,179.10 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:174.13,178.4 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:180.28,182.18 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:189.4,189.23 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:192.18,195.14 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:182.18,183.19 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:186.5,186.15 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:183.19,184.76 1 0 +github.com/ethereum/go-ethereum/event/subscription.go:189.23,191.5 1 0 +github.com/ethereum/go-ethereum/event/subscription.go:200.62,202.9 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:203.26,205.20 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:206.17,207.14 1 0 +github.com/ethereum/go-ethereum/event/subscription.go:211.45,212.58 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:221.2,223.9 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:212.58,214.3 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:214.8,216.32 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:216.32,218.4 1 0 +github.com/ethereum/go-ethereum/event/subscription.go:224.13,225.15 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:226.17,227.14 1 0 +github.com/ethereum/go-ethereum/event/subscription.go:252.65,255.15 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:258.2,258.20 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:261.2,263.11 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:255.15,257.3 1 0 +github.com/ethereum/go-ethereum/event/subscription.go:258.20,260.3 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:268.38,271.15 3 1 +github.com/ethereum/go-ethereum/event/subscription.go:274.2,275.25 2 1 +github.com/ethereum/go-ethereum/event/subscription.go:278.2,278.15 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:271.15,273.3 1 0 +github.com/ethereum/go-ethereum/event/subscription.go:275.25,277.3 1 1 +github.com/ethereum/go-ethereum/event/subscription.go:283.42,287.2 3 0 +github.com/ethereum/go-ethereum/event/subscription.go:289.34,294.2 4 1 +github.com/ethereum/go-ethereum/event/subscription.go:296.39,298.2 1 1 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:94.51,96.2 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:142.62,144.2 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:147.54,152.2 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:155.53,160.2 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:163.37,167.2 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:172.63,176.48 3 1 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:179.2,182.21 3 1 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:185.2,186.33 2 1 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:190.2,190.44 1 1 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:176.48,178.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:182.21,184.3 1 1 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:186.33,188.3 1 1 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:194.87,196.16 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:199.2,211.12 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:196.16,198.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:215.33,227.2 9 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:230.32,235.2 4 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:239.135,247.12 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:290.2,294.36 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:298.2,301.6 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:247.12,251.7 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:286.3,286.16 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:251.7,252.11 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:254.31,255.12 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:261.38,262.12 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:268.21,269.57 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:272.5,274.12 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:280.25,281.21 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:282.27,283.21 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:256.31,256.31 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:257.13,257.13 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:263.32,263.32 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:264.13,264.13 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:269.57,270.14 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:275.29,275.29 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:276.13,276.13 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:294.36,296.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:301.6,302.10 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:303.17,304.10 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:305.21,314.29 5 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:322.4,322.18 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:328.4,328.39 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:334.4,337.40 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:344.4,346.19 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:381.4,385.21 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:314.29,317.19 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:317.19,319.11 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:322.18,325.13 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:328.39,332.13 4 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:337.40,341.13 4 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:346.19,347.12 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:348.19,352.12 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:354.25,355.42 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:358.29,359.55 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:362.27,363.53 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:366.6,366.49 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:370.34,371.65 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:375.17,376.49 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:355.42,357.7 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:359.55,361.7 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:363.53,365.7 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:366.49,368.7 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:371.65,373.7 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:376.49,378.7 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:394.47,398.6 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:398.6,401.46 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:406.3,407.98 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:415.3,416.52 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:420.3,421.28 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:425.3,426.10 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:431.3,431.54 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:443.3,443.52 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:476.3,476.48 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:401.46,404.4 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:407.98,408.84 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:412.4,412.12 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:408.84,411.5 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:416.52,419.4 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:421.28,424.4 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:426.10,429.4 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:431.54,432.11 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:433.32,435.13 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:436.12,439.11 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:443.52,446.11 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:454.4,455.11 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:460.4,461.29 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:469.4,469.11 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:446.11,448.12 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:452.5,452.13 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:449.26,449.26 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:450.13,450.13 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:455.11,458.5 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:461.29,463.12 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:467.5,467.27 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:463.12,466.6 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:470.29,471.13 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:472.12,472.12 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:504.50,509.43 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:512.2,513.49 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:518.2,538.46 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:542.2,543.98 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:546.2,546.12 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:509.43,511.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:513.49,515.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:515.8,517.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:538.46,540.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:543.98,545.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:552.51,553.46 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:556.2,556.49 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:559.2,559.46 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:562.2,562.44 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:565.2,565.12 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:553.46,555.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:556.49,558.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:559.46,561.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:562.44,564.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:570.58,580.45 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:584.2,584.9 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:591.2,602.30 4 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:580.45,582.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:585.18,585.18 0 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:587.37,589.38 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:631.51,632.53 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:635.2,635.26 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:632.53,634.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:639.76,654.2 5 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:658.70,669.8 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:693.2,709.3 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:669.8,670.19 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:673.3,677.43 4 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:680.3,680.26 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:670.19,672.4 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:677.43,679.4 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:681.8,683.19 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:688.3,689.20 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:683.19,685.4 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:685.9,687.4 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:714.73,717.19 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:732.2,733.33 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:754.2,754.22 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:759.2,766.31 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:717.19,720.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:720.8,724.16 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:727.3,727.50 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:724.16,726.4 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:727.50,729.4 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:733.33,737.9 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:745.3,745.19 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:750.3,751.8 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:737.9,739.4 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:739.9,740.107 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:740.107,742.5 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:745.19,747.12 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:754.22,756.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:756.8,758.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:776.58,792.2 5 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:800.44,807.2 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:816.99,820.48 2 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:823.2,823.48 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:827.2,834.31 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:820.48,822.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:823.48,825.3 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:850.56,860.8 3 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:877.2,894.31 4 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:860.8,869.69 7 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:869.69,871.4 1 0 +github.com/ethereum/go-ethereum/ethstats/ethstats.go:872.8,875.3 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:83.65,88.2 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:92.52,97.2 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:99.41,111.45 5 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:115.2,117.33 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:111.45,113.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:117.33,119.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:124.49,134.2 6 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:138.38,149.31 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:171.2,171.36 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:174.2,178.31 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:149.31,151.71 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:156.3,156.71 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:164.3,164.45 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:151.71,154.4 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:156.71,161.12 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:164.45,167.12 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:171.36,173.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:178.31,180.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:185.84,194.18 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:198.2,198.12 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:194.18,197.3 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:206.31,207.6 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:207.6,209.10 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:214.3,218.34 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:223.3,223.17 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:210.21,210.21 0 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:211.41,211.41 0 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:218.34,222.4 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:228.58,230.2 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:233.51,235.2 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:239.73,244.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:247.2,247.16 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:253.2,254.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:258.2,258.12 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:244.16,246.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:247.16,249.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:254.16,257.3 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:263.79,269.12 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:273.2,273.50 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:269.12,271.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:277.117,283.12 4 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:287.2,288.57 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:283.12,285.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:294.126,296.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:299.2,300.42 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:296.16,298.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:305.150,307.16 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:310.2,313.49 3 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:307.16,309.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:317.73,319.2 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:322.53,324.44 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:330.2,330.12 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:324.44,327.3 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:327.8,329.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:340.101,342.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:346.2,349.11 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:359.2,359.17 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:365.2,366.12 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:342.16,344.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:349.11,350.21 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:357.3,357.17 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:350.21,355.4 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:359.17,362.3 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:362.8,364.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:370.72,376.2 5 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:378.102,380.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:383.2,384.20 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:380.16,382.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:387.85,390.9 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:391.17,391.17 0 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:393.13,399.29 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:403.3,403.17 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:399.29,402.4 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:409.77,411.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:416.2,418.21 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:411.16,413.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:422.110,424.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:427.2,428.55 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:433.2,433.45 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:424.16,426.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:428.55,430.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:430.8,432.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:437.104,439.41 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:442.2,442.16 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:445.2,448.38 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:453.2,453.41 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:439.41,441.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:442.16,444.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:448.38,452.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:457.102,462.38 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:467.2,467.38 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:462.38,466.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:470.86,472.73 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:475.2,477.15 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:472.73,474.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:481.88,483.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:486.2,486.60 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:483.16,485.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:491.99,493.16 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:496.2,498.15 3 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:493.16,495.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:502.35,504.19 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:504.19,506.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:83.95,86.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:89.2,90.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:94.2,94.25 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:97.2,97.17 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:86.16,88.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:90.16,92.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:94.25,96.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:101.81,104.2 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:106.85,108.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:112.2,113.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:116.2,116.33 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:130.2,130.37 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:108.16,110.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:113.16,115.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:116.33,119.17 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:119.17,128.4 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:133.63,134.30 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:137.2,137.48 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:134.30,136.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:141.81,144.58 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:147.2,148.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:151.2,154.56 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:157.2,158.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:161.2,181.26 10 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:144.58,145.59 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:148.16,150.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:154.56,155.59 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:158.16,160.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:186.78,189.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:192.2,198.41 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:189.16,191.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:202.60,205.52 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:209.2,213.64 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:227.2,227.16 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:230.2,232.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:235.2,239.8 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:205.52,207.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:213.64,215.52 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:218.3,218.47 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:215.52,217.4 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:219.8,221.52 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:224.3,224.47 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:221.52,223.4 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:227.16,229.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:232.16,234.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:242.72,243.40 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:246.2,247.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:251.2,252.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:256.2,257.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:261.2,262.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:266.2,267.38 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:271.2,272.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:275.2,275.23 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:243.40,245.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:247.16,249.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:252.16,254.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:257.16,259.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:262.16,264.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:267.38,269.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:272.16,274.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:278.109,279.37 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:282.2,283.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:286.2,288.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:291.2,291.30 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:279.37,281.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:283.16,285.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:288.16,290.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:294.109,296.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:299.2,301.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:305.2,306.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:310.2,311.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:315.2,316.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:320.2,321.38 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:325.2,326.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:329.2,329.30 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:296.16,298.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:301.16,303.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:306.16,308.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:311.16,313.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:316.16,318.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:321.38,323.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:326.16,328.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:332.68,335.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:338.2,340.36 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:356.2,356.63 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:335.16,337.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:340.36,346.3 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:346.8,346.39 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:346.39,349.27 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:352.3,353.18 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:349.27,351.4 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:362.35,364.9 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:367.2,367.12 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:364.9,366.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:32.90,34.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:37.2,39.56 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:42.2,42.25 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:45.2,45.17 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:34.16,36.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:39.56,41.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:42.25,44.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:48.80,50.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:53.2,53.40 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:50.16,52.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:56.58,57.30 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:60.2,60.48 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/plain.go:57.30,59.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:35.107,37.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:40.2,41.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:44.2,52.20 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:37.16,39.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:41.16,43.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:55.83,63.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:66.2,67.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:70.2,70.28 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:73.2,85.16 6 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:88.2,98.33 6 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:101.2,101.17 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:63.16,65.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:67.16,69.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:70.28,72.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:85.16,87.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:98.33,100.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:104.56,107.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:110.2,113.21 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:107.16,109.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:116.64,118.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:121.2,125.22 5 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:128.2,128.23 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:118.16,120.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:125.22,127.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:132.35,133.18 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:137.2,138.55 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:144.2,144.56 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:149.2,149.34 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:133.18,135.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:138.55,140.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:140.8,140.25 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:140.25,142.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:144.56,145.23 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/presale.go:145.23,147.4 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:40.86,45.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:48.2,58.27 7 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:76.2,88.39 8 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:45.16,47.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:58.27,61.21 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:66.3,69.33 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:72.3,72.33 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:61.21,63.12 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:69.33,71.4 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:72.33,74.4 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:92.38,94.76 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:98.2,98.46 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:101.2,101.14 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:94.76,96.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:98.46,100.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:94.51,103.2 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:105.51,108.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:112.2,114.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:117.2,119.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:122.2,123.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:127.2,130.12 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:108.16,110.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:114.16,116.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:119.16,121.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:123.16,125.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:133.62,135.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:138.2,143.12 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:135.16,136.62 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:149.47,152.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:155.2,157.16 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:160.2,161.51 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:164.2,164.12 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:152.16,153.77 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:157.16,158.68 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:161.51,163.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:167.43,169.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:172.2,172.46 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:169.16,171.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:175.92,177.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:180.2,184.59 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:188.2,188.20 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:177.16,179.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:184.59,187.3 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:191.73,195.65 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:200.2,201.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:204.2,204.44 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:209.2,210.22 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:195.65,197.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:201.16,203.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:204.44,208.3 3 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:213.54,215.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:218.2,218.30 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:215.16,217.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:223.49,226.2 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:228.36,231.19 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:236.2,237.86 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:231.19,233.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/key.go:233.8,235.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:36.45,38.2 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:42.51,46.57 3 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:49.2,49.22 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:46.57,48.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:54.56,54.70 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:58.40,58.54 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:62.56,64.2 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:68.66,70.2 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:74.99,76.2 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:80.104,81.2 0 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:87.90,89.26 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:93.2,93.43 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:89.26,91.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:97.107,99.2 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:102.133,104.26 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:108.2,108.87 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:104.26,106.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:113.90,115.2 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:119.123,121.26 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:125.2,125.88 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:121.26,123.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:132.128,134.26 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:138.2,138.48 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:134.26,136.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:143.161,145.26 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:149.2,149.74 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:145.26,147.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:37.44,43.2 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:48.27,49.29 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:52.2,53.13 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:49.29,51.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:56.27,58.2 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:60.26,61.15 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:67.2,69.68 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:73.2,90.22 8 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:93.2,94.6 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:61.15,66.3 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:69.68,72.3 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:90.22,92.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:94.6,95.10 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:96.17,97.10 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:98.15,100.24 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:104.21,106.27 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/watch.go:100.24,103.5 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:43.44,43.61 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:44.44,44.81 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:45.44,45.71 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:54.47,56.32 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:62.2,62.63 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:56.32,58.29 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:58.29,60.4 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:77.68,86.2 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:88.55,95.2 6 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:97.62,102.2 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:104.58,108.49 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:109.2,109.48 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:113.2,116.83 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:108.49,108.98 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:109.48,111.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:120.58,125.76 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:125.76,127.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:127.8,129.3 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:133.51,136.49 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:138.2,138.51 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:136.49,136.86 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:138.51,141.77 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:141.77,143.4 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:143.9,145.4 1 0 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:149.88,150.23 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:155.2,155.14 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:150.23,151.23 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:151.23,153.4 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:161.76,164.37 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:167.2,167.22 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:181.2,181.22 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:164.37,166.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:167.22,169.60 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:172.3,172.26 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:177.3,177.38 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:169.60,171.4 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:172.26,173.31 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:173.31,175.5 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:177.38,179.4 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:182.9,183.25 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:184.9,185.40 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:186.10,190.33 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:194.39,197.24 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:201.2,201.24 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:212.2,215.19 4 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:197.24,200.3 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:201.24,203.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:203.8,204.10 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:205.24,205.24 0 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:206.11,208.10 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:218.33,221.24 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:224.2,224.22 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:228.2,228.16 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:221.24,223.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:224.22,227.3 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:233.46,236.16 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:240.2,240.92 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:244.2,250.53 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:276.2,278.38 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:283.2,283.38 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:286.2,286.38 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:293.2,295.9 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:299.2,300.12 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:236.16,239.3 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:240.92,242.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:250.53,252.17 2 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:256.3,262.10 6 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:273.3,273.13 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:252.17,255.4 2 0 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:263.19,264.72 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:265.33,266.94 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:267.11,271.5 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:278.38,279.45 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:279.45,281.4 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:283.38,285.3 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:286.38,289.39 3 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:289.39,291.4 1 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:296.31,296.31 0 1 +github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:297.10,297.10 0 1 +github.com/ethereum/go-ethereum/graphql/graphiql.go:37.60,42.2 4 0 +github.com/ethereum/go-ethereum/graphql/graphiql.go:44.35,48.2 3 0 +github.com/ethereum/go-ethereum/graphql/graphiql.go:50.69,51.23 1 0 +github.com/ethereum/go-ethereum/graphql/graphiql.go:55.2,56.19 2 0 +github.com/ethereum/go-ethereum/graphql/graphiql.go:51.23,54.3 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:46.55,46.80 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:49.58,51.31 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:71.2,71.12 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:52.14,62.13 3 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:64.13,65.19 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:66.13,67.19 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:68.10,69.57 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:82.73,85.2 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:87.72,89.2 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:91.69,93.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:96.2,97.20 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:100.2,100.35 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:93.16,95.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:97.20,99.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:103.81,105.86 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:112.2,113.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:116.2,116.55 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:105.86,107.17 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:110.3,110.36 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:107.17,109.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:113.16,115.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:119.68,121.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:124.2,124.38 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:121.16,123.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:127.102,129.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:132.2,132.50 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:129.16,131.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:142.61,144.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:146.75,152.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:154.48,156.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:158.57,160.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:162.55,164.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:172.68,174.2 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:176.71,178.2 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:191.80,192.17 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:208.2,208.18 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:192.17,195.30 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:206.3,206.46 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:195.30,204.4 5 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:211.61,213.2 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:215.77,217.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:220.2,220.23 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:217.29,219.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:223.72,225.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:228.2,228.38 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:225.29,227.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:231.74,233.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:236.2,236.19 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:233.29,235.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:237.30,238.42 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:239.30,240.21 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:246.3,246.42 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:247.10,248.42 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:240.21,241.64 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:241.64,244.5 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:252.84,254.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:258.2,258.20 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:261.2,262.33 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:265.2,265.27 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:268.2,268.107 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:254.29,256.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:258.20,260.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:262.33,264.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:265.27,267.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:271.79,273.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:276.2,276.19 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:273.29,275.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:277.30,278.18 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:279.30,280.45 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:281.10,282.18 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:286.87,288.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:291.2,291.19 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:288.29,290.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:292.30,293.18 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:294.30,295.45 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:296.10,297.18 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:301.79,303.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:307.2,307.20 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:310.2,311.33 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:314.2,314.27 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:318.2,319.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:322.2,322.33 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:303.29,305.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:307.20,309.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:311.33,313.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:314.27,316.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:319.16,321.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:325.71,327.29 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:330.2,330.23 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:333.2,333.38 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:327.29,329.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:330.23,332.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:336.74,338.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:341.2,341.40 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:338.29,340.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:344.87,346.29 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:349.2,350.15 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:353.2,357.8 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:346.29,348.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:350.15,352.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:360.89,362.29 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:365.2,371.8 3 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:362.29,364.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:374.66,375.42 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:378.2,378.21 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:375.42,377.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:381.66,382.42 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:385.2,385.20 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:388.2,389.20 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:382.42,384.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:385.20,387.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:393.79,394.42 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:397.2,397.20 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:400.2,401.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:404.2,404.31 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:394.42,396.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:397.20,399.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:401.16,403.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:407.66,409.34 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:412.2,412.33 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:415.2,416.18 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:409.34,411.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:412.33,414.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:419.67,421.34 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:424.2,425.18 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:421.34,423.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:428.77,430.34 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:433.2,434.18 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:430.34,432.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:437.100,439.83 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:442.2,446.8 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:439.83,441.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:449.66,451.34 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:454.2,455.35 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:462.2,462.18 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:451.34,453.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:455.35,461.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:465.65,467.16 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:470.2,471.21 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:467.16,469.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:474.80,476.29 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:479.2,481.32 3 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:487.2,487.18 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:476.29,478.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:481.32,486.3 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:490.67,492.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:495.2,496.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:492.29,494.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:499.67,501.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:504.2,505.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:501.29,503.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:508.67,510.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:513.2,514.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:510.29,512.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:533.68,534.20 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:537.2,537.27 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:541.2,543.39 3 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:549.2,549.21 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:534.20,536.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:537.27,540.3 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:543.39,545.44 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:545.44,547.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:555.75,556.56 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:559.2,560.21 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:567.2,567.22 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:556.56,558.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:560.21,561.32 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:561.32,563.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:563.9,565.4 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:572.80,573.23 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:588.2,588.24 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:573.23,575.30 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:582.3,583.17 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:586.3,586.24 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:575.30,577.18 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:580.4,580.24 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:577.18,579.5 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:583.17,585.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:591.59,593.16 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:597.2,597.42 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:593.16,595.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:600.64,601.31 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:608.2,608.20 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:601.31,603.17 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:606.3,606.25 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:603.17,605.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:611.61,613.16 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:616.2,616.35 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:613.16,615.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:619.60,621.16 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:624.2,624.34 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:621.16,623.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:627.74,629.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:632.2,632.27 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:635.2,635.44 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:629.16,631.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:632.27,634.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:638.78,640.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:643.2,644.27 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:650.2,651.41 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:640.16,642.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:644.27,646.71 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:646.71,648.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:654.61,655.48 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:658.2,658.53 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:661.2,666.8 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:655.48,657.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:658.53,660.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:669.70,671.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:674.2,674.45 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:671.16,673.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:677.72,679.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:682.2,682.41 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:679.16,681.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:685.67,687.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:690.2,690.29 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:687.16,689.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:693.67,695.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:698.2,698.30 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:695.16,697.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:701.76,703.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:706.2,706.27 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:703.16,705.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:709.69,711.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:714.2,714.25 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:711.16,713.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:717.72,719.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:722.2,722.32 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:719.16,721.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:725.69,727.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:730.2,730.30 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:727.16,729.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:733.65,735.32 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:738.2,739.20 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:735.32,737.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:742.64,744.32 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:747.2,748.39 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:756.2,756.18 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:744.32,746.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:748.39,755.3 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:759.71,761.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:764.2,764.26 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:761.16,763.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:767.71,769.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:772.2,772.34 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:769.16,771.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:775.75,777.26 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:784.2,785.15 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:788.2,788.30 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:777.26,779.17 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:782.3,782.20 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:779.17,781.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:785.15,787.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:801.88,802.20 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:806.2,806.16 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:802.20,805.3 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:811.65,813.2 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:815.84,817.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:820.2,824.8 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:817.16,819.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:827.71,829.32 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:832.2,833.20 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:829.32,831.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:836.76,838.32 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:841.2,842.42 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:851.2,851.18 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:838.32,840.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:842.42,850.3 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:854.102,856.32 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:859.2,860.51 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:863.2,870.8 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:856.32,858.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:860.51,862.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:873.90,875.32 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:878.2,879.54 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:882.2,888.8 3 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:875.32,877.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:879.54,881.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:912.96,914.31 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:917.2,918.27 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:925.2,925.17 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:914.31,916.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:918.27,924.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:928.102,930.34 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:933.2,934.31 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:937.2,938.29 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:946.2,949.42 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:930.34,932.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:934.31,936.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:938.29,940.17 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:943.3,943.23 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:940.17,942.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:954.22,955.27 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:961.2,965.8 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:955.27,957.17 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:957.17,959.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:988.43,990.2 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:992.37,994.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:996.36,998.2 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1002.25,1003.27 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1009.2,1010.16 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1013.2,1014.21 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1018.2,1022.8 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1003.27,1005.17 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1005.17,1007.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1010.16,1012.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1014.21,1016.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1027.18,1028.27 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1034.2,1035.23 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1028.27,1030.17 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1030.17,1032.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1042.72,1045.2 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1047.78,1049.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1052.2,1053.25 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1061.2,1061.18 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1049.16,1051.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1053.25,1060.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1066.13,1073.2 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1077.25,1080.16 3 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1083.2,1084.21 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1088.2,1092.8 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1080.16,1082.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1084.21,1086.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1097.18,1101.2 3 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1111.20,1113.24 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1139.2,1140.16 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1145.2,1145.19 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1113.24,1114.23 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1117.3,1122.4 3 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1114.23,1116.4 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1123.8,1123.29 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1123.29,1129.3 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1129.8,1135.3 2 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1140.16,1142.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1142.8,1142.21 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1142.21,1144.3 1 1 +github.com/ethereum/go-ethereum/graphql/graphql.go:1151.22,1155.20 3 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1160.2,1160.15 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1163.2,1164.30 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1182.2,1182.17 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1155.20,1157.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1157.8,1159.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1160.15,1162.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1164.30,1174.17 4 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1180.3,1180.27 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1174.17,1176.4 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1176.9,1176.22 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1176.22,1178.9 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1185.58,1187.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1189.108,1196.16 3 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1201.2,1201.16 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1196.16,1198.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1198.8,1198.21 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1198.21,1200.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1204.116,1206.54 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1209.2,1210.18 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1206.54,1208.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1233.100,1236.34 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1239.2,1240.32 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1243.2,1244.34 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1247.2,1248.31 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1252.2,1253.42 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1236.34,1238.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1240.32,1242.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1244.34,1246.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1248.31,1250.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1256.71,1258.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1261.2,1261.60 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1264.2,1264.36 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1258.16,1260.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1261.60,1263.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1267.83,1269.16 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1272.2,1272.36 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1269.16,1271.3 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1275.70,1277.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1284.52,1286.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1287.51,1289.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1290.51,1292.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1293.53,1295.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1296.57,1298.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1299.54,1301.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1302.58,1304.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1305.52,1307.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1308.57,1310.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1311.54,1313.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1314.58,1316.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1317.54,1319.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1320.58,1322.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1323.55,1325.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1326.54,1328.2 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1347.50,1351.52 2 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1355.2,1355.34 1 0 +github.com/ethereum/go-ethereum/graphql/graphql.go:1351.52,1353.3 1 0 +github.com/ethereum/go-ethereum/graphql/service.go:32.68,38.64 2 1 +github.com/ethereum/go-ethereum/graphql/service.go:43.2,45.16 3 1 +github.com/ethereum/go-ethereum/graphql/service.go:49.2,49.30 1 1 +github.com/ethereum/go-ethereum/graphql/service.go:53.2,54.23 2 1 +github.com/ethereum/go-ethereum/graphql/service.go:38.64,41.3 2 0 +github.com/ethereum/go-ethereum/graphql/service.go:45.16,48.3 2 0 +github.com/ethereum/go-ethereum/graphql/service.go:49.30,51.3 1 1 +github.com/ethereum/go-ethereum/graphql/service.go:59.81,60.20 1 1 +github.com/ethereum/go-ethereum/graphql/service.go:64.2,64.49 1 1 +github.com/ethereum/go-ethereum/graphql/service.go:60.20,61.27 1 0 +github.com/ethereum/go-ethereum/graphql/service.go:69.88,73.16 3 1 +github.com/ethereum/go-ethereum/graphql/service.go:76.2,83.12 6 1 +github.com/ethereum/go-ethereum/graphql/service.go:73.16,75.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:16.39,22.2 2 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:29.40,31.2 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:33.33,36.31 3 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:39.2,39.42 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:36.31,38.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:42.46,44.2 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:46.35,48.2 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:57.41,63.2 2 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:72.45,78.2 2 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:87.39,93.2 2 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:102.45,108.2 2 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:116.38,117.20 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:120.2,120.25 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:117.20,119.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:123.46,127.36 3 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:132.2,132.9 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:135.2,136.12 2 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:127.36,129.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:129.8,131.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:132.9,134.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:139.45,145.2 2 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:153.43,154.20 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:157.2,157.36 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:154.20,156.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:160.51,163.2 2 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:165.55,171.2 2 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:180.49,186.2 2 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:194.41,195.20 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:198.2,199.29 2 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:202.2,202.30 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:195.20,197.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:199.29,201.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:205.49,206.20 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:209.2,209.46 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:218.2,218.12 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:206.20,208.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:209.46,210.14 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:210.14,213.20 2 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:213.20,215.5 1 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:221.51,227.2 2 1 +github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:236.47,242.2 2 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:50.51,53.16 3 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:56.2,56.29 1 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:61.2,61.16 1 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:53.16,55.3 1 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:56.29,57.32 1 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:57.32,59.4 1 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:66.56,67.19 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:70.2,73.16 4 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:67.19,69.3 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:78.54,80.2 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:82.52,84.29 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:96.2,96.16 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:84.29,95.3 9 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:114.51,119.2 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:122.48,125.2 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:128.54,129.20 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:134.2,134.28 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:129.20,133.3 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:138.46,141.14 3 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:141.14,143.3 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:143.8,145.3 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:155.53,161.2 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:163.44,165.2 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:168.50,170.2 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:172.42,174.14 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:177.2,179.20 3 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:174.14,176.3 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:189.66,191.2 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:193.59,194.17 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:218.2,218.15 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:194.17,195.16 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:202.3,203.16 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:209.3,212.17 4 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:215.3,216.19 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:195.16,196.60 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:199.4,199.19 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:196.60,198.5 1 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:203.16,207.4 3 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:212.17,214.4 1 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:222.32,223.14 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:223.14,226.3 2 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:230.37,232.23 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:237.2,237.14 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:232.23,233.15 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:233.15,235.4 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:241.36,245.2 3 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:247.48,250.12 3 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:262.2,263.17 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:250.12,252.16 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:260.3,260.13 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:252.16,253.36 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:253.36,258.5 4 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:275.23,275.24 0 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:279.23,282.2 2 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:285.20,289.2 3 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:292.27,296.2 3 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:300.36,304.2 3 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:308.52,311.55 3 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:314.2,314.38 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:311.55,313.3 1 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:318.38,321.2 2 1 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:324.54,327.2 2 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:330.38,333.2 2 0 +github.com/ethereum/go-ethereum/internal/utesting/utesting.go:336.54,339.2 2 0 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:28.58,30.33 2 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:33.2,33.16 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:30.33,32.3 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:36.71,38.21 2 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:44.2,45.36 2 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:56.2,57.52 2 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:69.2,69.45 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:80.2,81.16 2 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:38.21,40.3 1 0 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:45.36,47.56 2 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:50.3,50.23 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:47.56,49.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:57.52,58.35 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:58.35,59.23 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:59.23,61.5 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:61.10,63.5 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:69.45,71.17 2 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:71.17,72.53 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:72.53,74.5 1 1 +github.com/ethereum/go-ethereum/internal/jsre/completion.go:74.10,76.5 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:71.52,84.2 5 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:87.32,90.45 3 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:94.2,95.22 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:90.45,92.3 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:107.32,116.81 6 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:135.2,135.56 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:140.2,140.57 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:145.2,145.58 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:153.2,173.6 8 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:217.2,217.33 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:116.81,118.17 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:121.3,128.55 3 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:132.3,132.37 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:118.17,120.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:128.55,130.4 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:135.56,138.3 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:140.57,143.3 2 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:145.58,147.40 2 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:151.3,151.26 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:147.40,150.4 2 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:173.6,174.10 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:175.25,178.37 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:187.4,189.15 3 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:192.4,195.31 3 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:203.30,207.48 3 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:210.46,211.49 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:178.37,181.31 3 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:181.31,183.6 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:184.10,186.5 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:189.15,190.79 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:195.31,197.5 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:197.10,199.49 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:199.49,200.16 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:207.48,208.15 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:211.49,212.15 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:217.33,220.3 2 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:225.44,228.9 3 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:229.27,230.9 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:231.19,231.19 0 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:236.45,240.6 3 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:240.6,241.10 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:242.20,243.10 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:244.45,246.10 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:247.20,249.53 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:256.41,258.16 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:261.2,261.39 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:258.16,260.3 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:265.60,266.31 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:267.2,267.15 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:266.31,266.62 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:271.59,272.31 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:273.2,273.12 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:272.31,272.48 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:277.83,278.60 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:278.60,280.17 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:283.3,283.16 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:280.17,281.29 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:288.52,289.31 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:289.31,291.17 2 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:296.3,296.18 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:291.17,293.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:293.9,295.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:301.42,303.30 2 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:305.2,305.9 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:303.31,303.32 0 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:306.44,306.44 0 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:308.10,309.21 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:314.66,315.31 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:316.2,316.12 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:315.31,315.76 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:320.59,324.16 4 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:327.2,328.16 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:331.2,331.19 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:324.16,326.3 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:328.16,330.3 1 0 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:334.87,336.16 2 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:339.2,339.30 1 1 +github.com/ethereum/go-ethereum/internal/jsre/jsre.go:336.16,338.3 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:56.67,58.2 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:61.60,63.46 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:66.2,66.42 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:63.46,65.3 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:69.66,70.35 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:74.2,74.25 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:70.35,73.3 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:82.43,84.2 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:86.68,87.43 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:91.2,92.9 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:87.43,90.3 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:93.28,94.55 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:95.30,96.51 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:97.57,98.51 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:99.10,100.38 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:100.38,102.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:102.9,104.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:111.61,112.15 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:117.2,119.12 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:112.15,113.31 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:113.31,115.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:122.73,123.25 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:124.26,127.15 3 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:131.3,131.34 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:135.3,136.35 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:145.3,145.25 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:147.16,149.27 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:154.3,155.21 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:159.3,159.34 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:163.3,164.26 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:173.3,173.14 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:176.3,176.47 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:178.18,182.47 4 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:184.16,185.54 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:187.10,188.35 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:127.15,130.4 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:131.34,134.4 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:136.35,138.17 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:141.4,141.17 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:138.17,140.5 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:141.17,143.5 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:149.27,152.4 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:155.21,158.4 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:159.34,162.4 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:164.26,168.23 4 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:171.4,171.23 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:168.23,170.5 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:173.14,175.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:188.35,191.4 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:191.9,193.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:197.52,202.24 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:224.2,227.33 4 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:202.24,203.60 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:206.3,209.17 3 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:203.60,205.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:209.17,215.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:215.9,216.57 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:216.57,218.5 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:218.10,220.5 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:230.84,232.41 2 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:236.2,236.52 1 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:232.41,235.3 2 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:236.52,237.41 1 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:237.41,238.19 1 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:238.19,240.5 1 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:245.70,248.13 3 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:251.2,252.16 2 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:255.2,256.25 2 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:248.13,249.67 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:252.16,253.77 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:257.21,258.24 1 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:261.16,262.24 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:265.10,266.82 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:258.24,260.4 1 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:262.24,264.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:270.51,272.62 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:278.2,279.22 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:282.2,284.15 3 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:287.2,288.23 2 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:272.62,273.61 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:273.61,275.4 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:279.22,281.3 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:284.15,286.3 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:291.40,293.2 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:295.76,296.43 1 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:301.2,301.12 1 0 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:296.43,297.53 1 1 +github.com/ethereum/go-ethereum/internal/jsre/pretty.go:297.53,299.4 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:33.67,45.2 3 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:53.60,54.62 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:57.2,57.32 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:54.62,55.59 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:70.160,71.44 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:75.2,75.78 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:83.2,83.49 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:90.2,90.57 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:93.2,93.30 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:96.2,96.43 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:71.44,74.3 2 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:75.78,76.89 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:80.3,80.36 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:76.89,79.4 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:83.49,84.94 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:84.94,87.4 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:90.57,92.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:93.30,95.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:100.101,102.2 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:105.107,107.16 2 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:110.2,110.78 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:120.2,121.19 2 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:124.2,126.21 3 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:129.2,129.73 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:132.2,132.54 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:135.2,136.82 2 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:107.16,109.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:110.78,119.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:121.19,123.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:126.21,128.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:129.73,131.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:132.54,134.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:139.78,144.2 2 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:147.59,150.2 2 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:152.79,154.37 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:158.2,159.19 2 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:162.2,163.84 2 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:166.2,166.12 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:154.37,156.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:159.19,161.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:163.84,165.3 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:170.61,174.34 3 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:177.2,178.26 2 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:181.2,181.73 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:185.2,185.56 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:188.2,188.12 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:174.34,176.3 1 1 +github.com/ethereum/go-ethereum/les/catalyst/api.go:178.26,180.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:181.73,183.3 1 0 +github.com/ethereum/go-ethereum/les/catalyst/api.go:185.56,187.3 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:73.72,82.18 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:85.2,86.13 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:82.18,84.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:90.38,96.2 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:99.57,103.21 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:106.2,110.12 5 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:113.2,113.41 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:103.21,105.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:110.12,112.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:121.50,129.2 6 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:133.34,138.2 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:142.52,143.73 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:148.2,148.20 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:143.73,147.3 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:152.54,154.25 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:157.2,158.49 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:161.2,161.21 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:164.2,164.21 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:154.25,156.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:158.49,160.3 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:161.21,163.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:168.59,174.51 5 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:174.51,177.3 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:177.8,178.41 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:185.3,185.128 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:178.41,179.50 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:179.50,183.5 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:190.79,192.14 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:197.2,197.41 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:192.14,194.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:194.8,194.51 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:194.51,196.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:203.118,209.36 5 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:216.2,218.21 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:221.2,222.54 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:209.36,210.22 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:214.3,214.51 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:210.22,213.4 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:218.21,220.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:226.89,234.21 7 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:237.2,238.12 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:241.2,241.19 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:234.21,236.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:238.12,240.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:259.73,268.18 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:271.2,271.13 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:268.18,270.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:275.59,280.44 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:287.2,287.22 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:280.44,282.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:282.8,283.41 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:283.41,285.4 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:292.55,293.25 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:296.2,296.22 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:304.2,305.21 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:293.25,295.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:296.22,299.47 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:299.47,302.4 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:305.21,307.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:316.74,320.31 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:323.2,326.36 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:329.2,329.33 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:336.2,337.21 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:340.2,340.20 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:320.31,322.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:326.36,328.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:329.33,331.22 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:334.3,334.19 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:331.22,333.4 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:337.21,339.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:346.62,355.33 5 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:361.2,363.21 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:355.33,357.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:357.8,360.3 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:363.21,365.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:370.57,376.31 5 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:379.2,380.9 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:383.2,386.13 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:389.2,389.36 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:396.2,398.21 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:376.31,378.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:380.9,382.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:386.13,388.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:389.36,394.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:398.21,400.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:405.49,409.34 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:412.2,414.31 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:417.2,420.21 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:409.34,411.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:414.31,416.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:420.21,422.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:426.36,430.21 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/control.go:430.21,432.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:41.44,46.2 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:49.56,51.68 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:55.2,56.14 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:51.68,54.3 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:60.43,61.41 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:61.41,64.3 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:108.81,111.65 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:115.2,115.18 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:118.2,118.12 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:132.2,132.11 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:111.65,111.99 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:115.18,117.3 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:118.12,120.7 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:120.7,121.11 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:122.35,125.21 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:126.27,128.11 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:136.33,140.2 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:143.66,150.20 6 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:150.20,152.3 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:152.8,154.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:161.77,162.13 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:165.2,166.13 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:169.2,172.22 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:162.13,164.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:166.13,168.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:177.52,189.2 10 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:192.55,201.2 7 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:207.106,214.2 5 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:220.100,221.24 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:224.2,224.53 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:221.24,223.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:229.88,234.39 4 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:234.39,235.22 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:238.3,238.36 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:235.22,237.4 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:243.98,252.2 7 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:256.45,257.36 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:261.2,263.20 3 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:266.2,266.15 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:269.2,269.44 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:257.36,260.3 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:263.20,265.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:266.15,268.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:274.61,279.25 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:279.25,281.37 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:284.3,287.21 4 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:290.3,295.18 4 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:302.3,304.60 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:308.3,308.45 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:281.37,283.4 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:287.21,289.4 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:295.18,301.4 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:304.60,307.4 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:314.110,317.54 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:325.2,327.14 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:330.2,331.49 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:335.2,335.14 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:338.2,338.28 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:341.2,341.13 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:317.54,320.54 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:323.3,323.42 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:320.54,322.4 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:327.14,329.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:331.49,334.3 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:335.14,337.3 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:338.28,340.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:341.13,343.28 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:346.3,348.46 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:343.28,345.4 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:353.64,358.35 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:361.2,364.40 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:367.2,367.35 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:358.35,360.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:364.40,366.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:376.80,380.47 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:386.2,386.40 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:389.2,389.13 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:380.47,382.48 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:382.48,384.4 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:386.40,388.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:389.13,391.3 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:396.44,398.88 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:401.2,402.31 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:398.88,400.3 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:402.31,403.10 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:404.55,404.55 0 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:405.11,405.11 0 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:412.72,418.2 4 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:424.54,427.12 3 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:430.2,430.13 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:438.2,438.12 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:441.2,442.19 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:445.2,446.12 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:449.2,449.87 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:427.12,429.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:430.13,432.19 2 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:432.19,434.4 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:434.9,436.4 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:438.12,440.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:442.19,444.3 1 1 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:446.12,448.3 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:453.41,455.24 2 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:461.2,461.13 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:455.24,456.18 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:459.3,459.14 1 0 +github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:456.18,458.4 1 0 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:38.66,40.2 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:44.53,46.2 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:49.53,51.2 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:54.47,56.2 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:59.71,60.43 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:68.2,69.8 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:60.43,63.44 2 0 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:63.44,66.4 2 0 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:69.8,71.18 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:71.18,73.4 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:74.8,75.18 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:75.18,76.41 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:83.4,83.45 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:76.41,82.5 4 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:92.49,93.6 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:93.6,94.26 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:97.3,100.27 4 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:103.3,103.78 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:94.26,96.4 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:100.27,102.4 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:103.78,105.4 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:120.59,122.124 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:128.2,131.18 4 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:135.2,136.28 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:142.2,143.41 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:122.124,124.28 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:124.28,125.14 1 0 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:131.18,134.3 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:136.28,139.3 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:139.8,141.3 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:148.60,149.18 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:160.2,165.17 6 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:168.2,168.13 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:149.18,154.18 5 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:158.3,158.14 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:154.18,157.4 2 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:165.17,167.3 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:172.56,173.30 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:182.2,182.12 1 0 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:173.30,174.14 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:180.3,180.11 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:174.14,175.20 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:178.4,178.44 1 1 +github.com/ethereum/go-ethereum/les/utils/weighted_select.go:175.20,177.5 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:31.44,36.2 4 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:38.28,39.61 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:42.2,42.20 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:39.61,41.3 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:45.52,47.30 2 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:52.2,52.20 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:59.2,60.10 2 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:47.30,51.3 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:52.20,53.23 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:57.3,57.16 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:53.23,55.9 2 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:63.37,65.2 1 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:68.37,73.2 4 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:76.42,79.8 3 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:83.2,84.11 2 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:79.8,82.3 2 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:88.29,92.2 3 0 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:97.28,99.19 2 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:103.2,104.15 2 1 +github.com/ethereum/go-ethereum/les/utils/exec_queue.go:99.19,102.3 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:60.52,62.2 1 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:66.67,68.2 1 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:71.55,74.2 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:77.67,81.21 4 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:84.2,84.21 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:88.2,88.42 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:100.2,102.12 3 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:81.21,83.3 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:84.21,87.3 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:88.42,93.16 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:98.3,98.16 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:93.16,95.4 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:95.9,97.4 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:106.47,107.19 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:110.2,110.19 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:114.2,114.18 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:107.19,109.3 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:110.19,113.3 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:118.47,119.19 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:122.2,122.19 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:126.2,126.21 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:119.19,121.3 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:122.19,125.3 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:126.21,128.3 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:128.8,130.3 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:134.38,136.2 1 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:148.62,150.23 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:158.2,158.14 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:150.23,152.20 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:152.20,154.4 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:154.9,156.4 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:163.75,165.23 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:174.2,174.43 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:179.2,179.14 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:165.23,167.20 2 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:172.3,172.20 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:167.20,169.4 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:169.9,171.4 1 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:174.43,176.3 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:176.8,178.3 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:203.61,208.12 4 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:211.2,212.15 2 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:208.12,210.3 1 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:216.71,222.2 4 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:225.57,230.13 4 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:233.2,233.67 1 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:230.13,232.3 1 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:243.40,245.2 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:248.42,250.2 1 0 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:253.38,255.2 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:258.39,260.2 1 1 +github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:268.35,270.2 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:71.42,71.81 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:76.44,77.25 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:80.2,85.35 6 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:77.25,78.59 1 0 +github.com/ethereum/go-ethereum/les/utils/limiter.go:91.62,92.92 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:95.2,98.26 4 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:92.92,93.59 1 0 +github.com/ethereum/go-ethereum/les/utils/limiter.go:103.47,104.92 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:108.2,109.24 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:113.2,116.12 4 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:121.2,121.26 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:104.92,105.59 1 0 +github.com/ethereum/go-ethereum/les/utils/limiter.go:109.24,112.3 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:116.12,118.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:118.8,120.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:125.45,127.2 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:130.45,132.72 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:138.2,140.10 3 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:132.72,132.115 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:133.72,133.112 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:146.98,147.24 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:150.2,150.15 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:154.2,154.25 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:157.2,159.22 3 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:164.2,166.21 3 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:169.2,169.8 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:147.24,149.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:150.15,153.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:154.25,156.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:159.22,161.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:161.8,163.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:166.21,168.3 1 0 +github.com/ethereum/go-ethereum/les/utils/limiter.go:177.100,182.12 4 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:186.2,186.18 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:189.2,189.31 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:224.2,225.32 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:228.2,228.16 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:182.12,185.3 2 0 +github.com/ethereum/go-ethereum/les/utils/limiter.go:186.18,188.3 1 0 +github.com/ethereum/go-ethereum/les/utils/limiter.go:189.31,190.22 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:190.22,194.29 4 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:194.29,198.5 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:199.9,205.4 4 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:206.8,215.24 3 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:218.3,219.26 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:222.3,222.28 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:215.24,217.4 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:219.26,221.4 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:225.32,227.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:232.41,234.21 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:239.2,244.26 6 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:234.21,236.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:236.8,238.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:249.61,252.15 3 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:256.2,257.28 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:252.15,255.3 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:261.50,264.24 3 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:267.2,267.28 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:264.24,266.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:272.41,274.25 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:277.2,277.24 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:274.25,276.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:281.39,282.52 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:288.2,290.11 3 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:282.52,283.61 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:283.61,286.4 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:294.33,298.6 3 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:298.6,299.13 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:307.3,308.16 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:312.3,312.22 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:299.13,300.31 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:305.4,305.10 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:300.31,301.38 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:301.38,303.6 1 0 +github.com/ethereum/go-ethereum/les/utils/limiter.go:308.16,310.12 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:312.22,322.25 10 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:322.25,324.5 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:324.10,326.5 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:327.9,330.4 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:335.26,341.2 4 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:351.29,353.2 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:355.39,357.2 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:359.34,361.2 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:366.34,371.29 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:374.2,374.29 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:387.2,388.28 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:371.29,373.3 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:374.29,375.22 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:378.3,379.19 2 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:382.3,385.5 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:375.22,376.12 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:379.19,381.4 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:388.28,389.41 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:396.3,401.36 6 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:389.41,391.4 1 1 +github.com/ethereum/go-ethereum/les/utils/limiter.go:401.36,403.4 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:33.79,35.19 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:39.2,39.18 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:42.2,46.3 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:35.19,37.3 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:39.18,41.3 1 0 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:49.75,51.2 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:53.96,58.14 4 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:61.2,61.24 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:64.2,64.20 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:68.2,68.14 1 0 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:58.14,60.3 1 0 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:61.24,63.3 1 1 +github.com/ethereum/go-ethereum/les/utils/timeutils.go:64.20,67.3 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:142.52,143.26 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:146.2,146.33 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:143.26,145.3 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:150.55,151.26 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:154.2,154.28 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:151.26,153.3 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:203.276,229.2 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:233.32,235.2 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:239.31,241.2 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:246.70,255.9 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:256.25,257.13 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:258.16,259.23 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:264.71,269.9 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:270.22,271.13 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:272.16,273.23 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:279.108,285.9 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:291.2,291.9 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:297.2,297.9 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:286.32,286.32 0 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:287.16,288.13 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:292.77,292.77 0 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:293.16,294.13 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:298.24,299.22 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:300.16,301.13 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:307.173,313.9 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:319.2,319.9 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:325.2,325.9 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:314.30,314.30 0 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:315.16,316.18 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:320.101,320.101 0 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:321.16,322.18 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:326.24,327.40 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:328.16,329.18 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:335.31,346.6 6 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:346.6,348.42 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:354.3,355.24 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:382.3,382.10 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:348.42,349.48 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:349.48,351.5 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:355.24,358.32 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:362.4,363.25 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:371.4,371.120 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:375.4,375.15 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:358.32,360.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:363.25,365.33 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:368.5,368.10 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:365.33,367.6 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:371.120,373.13 2 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:375.15,377.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:377.10,379.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:383.17,385.10 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:387.35,392.25 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:398.4,398.31 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:406.4,406.50 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:409.4,409.52 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:412.4,414.79 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:417.4,417.29 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:421.25,427.15 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:430.4,430.39 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:432.25,435.23 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:437.23,441.45 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:461.4,461.38 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:477.4,477.33 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:479.26,483.43 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:495.4,495.38 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:506.4,506.39 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:508.35,513.11 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:518.4,523.40 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:572.4,573.11 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:579.4,579.40 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:590.4,590.42 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:594.4,594.35 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:600.33,603.11 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:608.4,611.29 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:654.4,655.11 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:661.4,661.33 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:392.25,395.10 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:398.31,399.113 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:399.113,402.11 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:406.50,407.10 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:409.52,410.10 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:414.79,416.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:417.29,419.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:427.15,428.13 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:441.45,445.16 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:448.5,448.48 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:445.16,447.6 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:448.48,454.88 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:454.88,457.7 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:461.38,466.15 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:466.15,467.31 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:470.6,470.34 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:467.31,469.7 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:470.34,473.7 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:483.43,489.32 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:489.32,492.6 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:495.38,499.32 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:502.5,503.51 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:499.32,501.6 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:514.25,514.25 0 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:515.18,516.11 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:523.40,527.166 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:527.166,529.51 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:537.6,537.17 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:546.6,546.33 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:529.51,533.15 4 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:537.17,538.35 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:542.7,543.15 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:538.35,541.8 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:546.33,551.91 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:562.7,562.48 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:551.91,559.16 6 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:563.12,566.7 2 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:567.11,570.6 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:574.72,574.72 0 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:575.18,576.11 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:579.40,581.40 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:584.5,585.28 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:581.40,582.14 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:585.28,587.6 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:590.42,592.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:594.35,595.64 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:595.64,597.6 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:604.25,604.25 0 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:605.18,606.11 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:611.29,612.73 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:612.73,619.47 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:646.6,646.17 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:619.47,620.64 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:623.7,623.39 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:626.7,626.49 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:629.7,629.37 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:632.7,632.44 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:636.7,637.34 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:620.64,621.16 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:623.39,625.8 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:626.49,627.16 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:629.37,631.8 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:632.44,633.16 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:637.34,641.8 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:641.13,643.8 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:646.17,650.15 4 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:656.24,656.24 0 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:657.18,658.11 1 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:661.33,662.64 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:662.64,664.6 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:671.59,673.27 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:678.2,678.13 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:683.2,684.40 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:689.2,689.51 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:673.27,675.3 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:678.13,681.3 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:684.40,685.40 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:685.40,687.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:693.65,695.25 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:699.2,700.38 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:705.2,705.52 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:695.25,697.3 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:700.38,701.40 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:701.40,703.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:710.87,715.19 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:721.2,722.24 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:729.2,729.97 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:736.2,736.34 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:715.19,717.3 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:717.8,719.3 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:722.24,727.3 4 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:729.97,734.3 4 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:736.34,738.20 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:743.3,746.31 4 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:749.3,749.120 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:738.20,740.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:740.9,742.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:746.31,748.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:756.73,760.12 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:760.12,761.16 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:763.3,764.20 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:769.3,769.83 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:775.3,775.69 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:780.3,780.28 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:761.16,761.34 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:764.20,767.4 2 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:769.83,773.4 3 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:775.69,778.4 2 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:780.28,782.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:789.70,794.12 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:794.12,795.16 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:798.3,799.20 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:804.3,804.53 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:820.3,820.63 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:825.3,829.28 3 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:795.16,795.34 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:799.20,802.4 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:805.12,808.36 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:810.33,810.33 0 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:813.11,817.10 3 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:820.63,823.4 2 0 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:829.28,831.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:837.53,839.46 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:852.2,852.51 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:861.2,861.43 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:867.2,870.53 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:839.46,840.40 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:846.3,847.34 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:840.40,842.41 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:842.41,844.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:847.34,849.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:852.51,854.40 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:857.3,857.27 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:854.40,856.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:861.43,863.40 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:863.40,865.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:870.53,872.40 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:875.3,875.29 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:872.40,874.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:881.54,882.45 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:882.45,884.35 2 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:887.3,887.25 1 1 +github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:884.35,886.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:33.62,35.2 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:38.53,39.51 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:42.2,42.71 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:39.51,41.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:42.71,44.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:44.8,46.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:51.64,53.2 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:61.100,63.17 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:66.2,66.19 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:69.2,69.50 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:63.17,65.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:66.19,68.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:69.50,71.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:71.8,73.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:83.89,84.19 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:87.2,87.50 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:84.19,86.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:87.50,89.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:89.8,91.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:96.86,99.19 3 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:102.2,102.50 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:99.19,101.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:102.50,104.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/api.go:104.8,106.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:42.103,50.83 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:64.2,65.11 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:50.83,52.29 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:55.3,55.29 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:58.3,58.27 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:61.3,61.19 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:52.29,54.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:55.29,57.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:58.27,60.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:70.31,71.6 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:71.6,73.43 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:77.3,78.23 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:81.3,81.66 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:73.43,75.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:78.23,80.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:89.42,94.26 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:94.26,96.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:100.28,107.2 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:42.150,50.107 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:74.2,74.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:50.107,53.27 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:57.3,60.15 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:72.3,72.19 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:53.27,55.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:60.15,62.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:62.9,64.32 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:64.32,65.22 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:65.22,68.11 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:78.38,80.38 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:91.2,91.15 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:97.2,97.13 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:105.2,106.13 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:80.38,81.29 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:84.3,84.40 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:87.3,87.29 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:81.29,83.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:84.40,86.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:87.29,89.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:91.15,95.3 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:97.13,101.3 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:101.8,104.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:110.34,115.2 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:118.45,123.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:75.44,76.17 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:85.2,85.17 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:76.17,78.32 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:83.3,83.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:78.32,82.4 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:85.17,87.32 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:92.3,92.14 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:87.32,91.4 3 0 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:98.39,99.27 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:99.27,101.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:106.105,111.2 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:115.57,117.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:122.62,127.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:139.2,139.12 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:127.35,130.20 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:133.3,133.19 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:136.3,137.36 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:130.20,132.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:133.19,135.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:144.42,148.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:153.56,160.36 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:164.2,164.19 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:172.2,172.21 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:160.36,163.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:164.19,167.37 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:167.37,170.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:177.45,179.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:179.35,180.19 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:180.19,182.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:182.9,184.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:189.39,191.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:195.2,196.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:191.35,194.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:196.35,199.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:204.69,209.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:213.2,213.19 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:216.2,216.55 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:209.35,212.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:213.19,215.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:220.51,222.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:225.53,229.40 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:232.2,233.12 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:229.40,231.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:237.54,239.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:242.56,247.39 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:250.2,251.12 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:247.39,249.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:259.112,261.34 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:264.2,266.34 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:273.2,273.22 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:278.2,278.34 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:284.2,284.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:261.34,263.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:266.34,267.34 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:267.34,271.4 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:273.22,275.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:275.8,277.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:278.34,279.34 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:279.34,282.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:110.43,111.40 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:120.4,120.48 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:111.40,119.5 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:122.41,131.4 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:136.43,137.42 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:141.4,141.48 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:137.42,140.5 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:143.41,145.53 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:148.4,148.20 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:145.53,147.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:154.200,158.30 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:164.2,172.18 8 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:176.2,176.132 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:184.2,186.34 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:158.30,158.58 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:172.18,174.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:176.132,177.63 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:177.63,181.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:186.34,187.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:187.26,190.5 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:203.42,204.27 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:208.2,208.14 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:204.27,207.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:212.49,214.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:217.38,219.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:224.54,229.34 4 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:232.2,232.30 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:235.2,235.33 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:229.34,231.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:232.30,234.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:235.33,237.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:241.55,242.19 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:242.19,244.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:250.92,252.93 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:297.2,297.88 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:252.93,253.32 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:260.3,262.30 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:265.3,265.48 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:274.3,274.13 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:253.32,254.32 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:258.4,258.10 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:254.32,257.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:262.30,264.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:265.48,273.4 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:274.13,276.15 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:286.4,286.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:276.15,279.34 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:279.34,282.6 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:283.10,285.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:286.26,288.15 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:293.5,293.55 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:288.15,290.6 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:290.11,292.6 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:297.88,298.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:298.14,300.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:300.9,302.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:307.30,309.36 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:314.2,314.36 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:321.2,322.24 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:337.2,337.35 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:309.36,313.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:314.36,315.64 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:315.64,317.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:317.9,319.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:322.24,323.93 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:323.93,325.100 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:325.100,328.24 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:333.5,333.93 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:328.24,332.6 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:341.29,342.22 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:345.2,345.24 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:351.2,352.13 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:342.22,344.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:345.24,346.91 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:346.91,349.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:356.80,357.40 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:360.2,361.24 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:368.2,368.17 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:357.40,359.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:361.24,364.29 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:364.29,366.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:372.55,373.24 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:378.2,378.28 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:373.24,377.3 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:384.37,390.69 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:394.2,404.40 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:407.2,407.44 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:410.2,411.26 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:422.2,423.24 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:390.69,392.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:404.40,406.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:407.44,409.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:411.26,415.37 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:418.3,418.31 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:415.37,417.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:418.31,420.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:427.49,432.2 4 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:436.81,441.2 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:445.71,447.16 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:450.2,451.30 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:454.2,454.22 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:447.16,449.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:451.30,453.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:458.88,460.16 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:463.2,468.85 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:476.2,476.8 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:460.16,462.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:468.85,472.33 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:472.33,474.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:482.95,484.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:493.2,493.20 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:484.35,487.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:487.8,492.3 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:505.91,522.32 7 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:537.2,538.34 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:543.2,545.23 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:548.2,548.33 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:551.2,552.26 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:522.32,525.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:525.8,534.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:538.34,540.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:545.23,547.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:548.33,550.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:552.26,558.3 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:558.8,564.3 3 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:571.56,576.2 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:579.46,581.2 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:585.65,585.79 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:586.65,586.81 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:595.58,596.68 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:600.2,600.10 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:596.68,599.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:604.45,606.2 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:53.47,54.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:57.2,58.11 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:61.2,62.26 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:65.2,65.10 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:54.11,56.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:58.11,60.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:62.26,64.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:70.47,72.11 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:75.2,75.52 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:72.11,74.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:83.70,84.21 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:92.2,92.8 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:84.21,86.20 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:86.20,88.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:88.9,90.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:96.59,102.2 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:105.61,110.39 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:113.2,114.12 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:110.39,112.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:118.108,125.26 7 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:125.26,127.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:132.49,133.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:140.2,140.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:133.18,135.30 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:138.3,138.15 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:135.30,137.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:140.18,142.30 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:145.3,145.15 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:142.30,144.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:151.106,153.29 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:156.2,156.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:159.2,159.55 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:153.29,155.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:156.11,158.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:163.61,165.28 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:165.28,167.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:171.61,173.28 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:173.28,174.22 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:174.22,176.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:176.9,178.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:188.70,190.29 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:193.2,195.32 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:199.2,200.21 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:203.2,203.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:206.2,207.26 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:210.2,210.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:190.29,192.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:195.32,198.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:200.21,202.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:203.11,205.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:207.26,209.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:219.114,221.16 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:232.2,232.29 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:236.2,236.8 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:221.16,223.30 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:226.3,226.14 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:223.30,225.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:226.14,228.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:229.8,231.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:232.29,235.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:57.60,62.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:68.99,75.2 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:83.120,89.12 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:92.2,95.84 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:89.12,91.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:104.82,113.25 7 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:117.2,117.44 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:113.25,116.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:121.57,126.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:175.183,182.30 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:186.2,187.30 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:193.2,204.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:210.2,214.12 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:227.2,227.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:182.30,185.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:187.30,191.3 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:204.35,209.3 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:214.12,215.7 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:215.7,216.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:217.37,220.21 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:221.27,223.11 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:232.55,234.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:238.65,243.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:247.60,249.16 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:252.2,254.48 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:258.2,258.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:262.2,263.44 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:267.2,269.12 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:272.2,277.32 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:289.2,289.29 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:293.2,293.52 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:302.2,302.12 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:249.16,251.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:254.48,257.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:258.26,261.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:263.44,266.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:269.12,271.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:277.32,278.29 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:281.3,281.29 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:286.3,287.8 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:278.29,279.17 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:281.29,282.17 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:282.17,283.18 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:289.29,292.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:293.52,295.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:295.8,296.53 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:300.3,300.115 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:296.53,299.4 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:306.36,316.16 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:320.2,321.16 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:325.2,325.64 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:316.16,319.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:321.16,324.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:325.64,327.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:332.32,338.35 6 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:341.2,343.18 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:338.35,340.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:347.65,351.25 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:355.2,363.11 8 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:351.25,354.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:367.49,371.39 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:371.39,374.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:379.64,384.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:388.70,389.36 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:392.2,394.16 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:397.2,399.48 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:403.2,403.27 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:407.2,408.44 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:412.2,414.55 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:423.2,423.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:389.36,391.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:394.16,396.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:399.48,402.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:403.27,406.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:408.44,411.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:414.55,416.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:416.8,417.56 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:421.3,421.141 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:417.56,420.4 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:427.69,439.16 7 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:443.2,444.16 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:448.2,448.86 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:439.16,442.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:444.16,447.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:448.86,450.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:454.53,460.2 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:465.42,471.34 5 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:476.2,478.34 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:481.2,481.15 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:471.34,475.3 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:478.34,480.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:491.59,500.49 8 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:505.2,505.12 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:500.49,504.3 3 0 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:42.139,43.36 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:52.2,58.108 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:67.2,67.107 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:83.2,83.10 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:43.36,45.15 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:48.3,49.12 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:45.15,47.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:58.108,59.64 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:59.64,64.4 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:67.107,70.27 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:74.3,75.15 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:80.3,81.18 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:70.27,72.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:75.15,77.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:77.9,79.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:87.35,90.2 2 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:92.48,96.6 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:96.6,97.36 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:100.3,100.15 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:106.3,106.36 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:97.36,99.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:100.15,102.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:106.36,110.4 3 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:116.31,121.2 4 1 +github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:124.42,128.2 3 1 +github.com/ethereum/go-ethereum/log/handler_glog.go:54.45,58.2 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:61.46,63.2 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:74.44,76.2 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:93.53,95.51 2 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:136.2,143.12 6 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:95.51,97.21 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:101.3,102.22 2 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:105.3,107.47 3 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:111.3,112.17 2 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:115.3,115.17 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:119.3,120.53 2 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:127.3,127.42 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:130.3,133.51 3 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:97.21,98.12 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:102.22,104.4 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:107.47,109.4 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:112.17,114.4 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:115.17,116.12 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:120.53,121.19 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:121.19,123.5 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:123.10,123.25 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:123.25,125.5 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:127.42,129.4 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:151.58,154.21 2 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:157.2,159.46 3 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:163.2,163.41 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:166.2,166.50 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:170.2,176.12 5 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:154.21,156.3 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:159.46,161.3 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:163.41,165.3 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:166.50,168.3 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:181.44,183.41 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:201.2,201.50 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:205.2,205.41 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:209.2,214.9 4 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:228.2,228.18 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:231.2,231.12 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:183.41,191.12 4 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:191.12,198.4 4 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:201.50,203.3 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:205.41,207.3 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:214.9,216.35 2 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:223.3,223.10 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:226.3,226.18 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:216.35,217.60 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:217.60,219.10 2 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:223.10,225.4 1 0 +github.com/ethereum/go-ethereum/log/handler_glog.go:228.18,230.3 1 0 +github.com/ethereum/go-ethereum/log/handler_go14.go:14.44,16.2 1 0 +github.com/ethereum/go-ethereum/log/handler_go14.go:18.48,20.2 1 1 +github.com/ethereum/go-ethereum/log/handler_go14.go:22.37,24.2 1 0 +github.com/ethereum/go-ethereum/log/logger.go:30.37,31.11 1 0 +github.com/ethereum/go-ethereum/log/logger.go:32.16,33.17 1 0 +github.com/ethereum/go-ethereum/log/logger.go:34.16,35.17 1 0 +github.com/ethereum/go-ethereum/log/logger.go:36.15,37.17 1 0 +github.com/ethereum/go-ethereum/log/logger.go:38.15,39.17 1 0 +github.com/ethereum/go-ethereum/log/logger.go:40.16,41.17 1 0 +github.com/ethereum/go-ethereum/log/logger.go:42.15,43.17 1 0 +github.com/ethereum/go-ethereum/log/logger.go:44.10,45.21 1 0 +github.com/ethereum/go-ethereum/log/logger.go:50.30,51.11 1 0 +github.com/ethereum/go-ethereum/log/logger.go:52.16,53.16 1 0 +github.com/ethereum/go-ethereum/log/logger.go:54.16,55.16 1 0 +github.com/ethereum/go-ethereum/log/logger.go:56.15,57.16 1 0 +github.com/ethereum/go-ethereum/log/logger.go:58.15,59.16 1 0 +github.com/ethereum/go-ethereum/log/logger.go:60.16,61.16 1 0 +github.com/ethereum/go-ethereum/log/logger.go:62.15,63.16 1 0 +github.com/ethereum/go-ethereum/log/logger.go:64.10,65.21 1 0 +github.com/ethereum/go-ethereum/log/logger.go:71.51,72.19 1 0 +github.com/ethereum/go-ethereum/log/logger.go:73.23,74.23 1 0 +github.com/ethereum/go-ethereum/log/logger.go:75.23,76.23 1 0 +github.com/ethereum/go-ethereum/log/logger.go:77.14,78.22 1 0 +github.com/ethereum/go-ethereum/log/logger.go:79.14,80.22 1 0 +github.com/ethereum/go-ethereum/log/logger.go:81.23,82.23 1 0 +github.com/ethereum/go-ethereum/log/logger.go:83.14,84.22 1 0 +github.com/ethereum/go-ethereum/log/logger.go:85.10,86.62 1 0 +github.com/ethereum/go-ethereum/log/logger.go:133.74,147.2 1 0 +github.com/ethereum/go-ethereum/log/logger.go:149.49,153.2 3 0 +github.com/ethereum/go-ethereum/log/logger.go:155.75,161.2 5 0 +github.com/ethereum/go-ethereum/log/logger.go:163.56,165.2 1 0 +github.com/ethereum/go-ethereum/log/logger.go:167.56,169.2 1 0 +github.com/ethereum/go-ethereum/log/logger.go:171.55,173.2 1 0 +github.com/ethereum/go-ethereum/log/logger.go:175.55,177.2 1 0 +github.com/ethereum/go-ethereum/log/logger.go:179.56,181.2 1 0 +github.com/ethereum/go-ethereum/log/logger.go:183.55,186.2 2 0 +github.com/ethereum/go-ethereum/log/logger.go:188.39,190.2 1 0 +github.com/ethereum/go-ethereum/log/logger.go:192.40,194.2 1 1 +github.com/ethereum/go-ethereum/log/logger.go:196.49,198.19 1 0 +github.com/ethereum/go-ethereum/log/logger.go:209.2,209.21 1 0 +github.com/ethereum/go-ethereum/log/logger.go:213.2,213.12 1 0 +github.com/ethereum/go-ethereum/log/logger.go:198.19,199.37 1 0 +github.com/ethereum/go-ethereum/log/logger.go:199.37,201.4 1 0 +github.com/ethereum/go-ethereum/log/logger.go:209.21,211.3 1 0 +github.com/ethereum/go-ethereum/log/logger.go:234.38,238.22 3 0 +github.com/ethereum/go-ethereum/log/logger.go:244.2,244.12 1 0 +github.com/ethereum/go-ethereum/log/logger.go:238.22,242.3 3 0 +github.com/ethereum/go-ethereum/log/root.go:13.13,15.2 1 1 +github.com/ethereum/go-ethereum/log/root.go:19.37,21.2 1 0 +github.com/ethereum/go-ethereum/log/root.go:24.20,26.2 1 0 +github.com/ethereum/go-ethereum/log/root.go:33.44,35.2 1 0 +github.com/ethereum/go-ethereum/log/root.go:38.44,40.2 1 0 +github.com/ethereum/go-ethereum/log/root.go:43.43,45.2 1 0 +github.com/ethereum/go-ethereum/log/root.go:48.43,50.2 1 0 +github.com/ethereum/go-ethereum/log/root.go:53.44,55.2 1 0 +github.com/ethereum/go-ethereum/log/root.go:58.43,61.2 2 0 +github.com/ethereum/go-ethereum/log/root.go:68.69,70.2 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:13.88,16.2 2 0 +github.com/ethereum/go-ethereum/log/syslog.go:20.109,23.2 2 0 +github.com/ethereum/go-ethereum/log/syslog.go:25.82,26.16 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:29.2,29.41 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:49.2,49.52 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:26.16,28.3 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:29.41,31.16 2 0 +github.com/ethereum/go-ethereum/log/syslog.go:46.3,47.21 2 0 +github.com/ethereum/go-ethereum/log/syslog.go:32.16,33.25 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:34.17,35.24 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:36.16,37.28 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:38.16,39.25 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:40.17,41.26 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:42.17,43.36 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:43.36,43.50 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:52.90,54.2 1 0 +github.com/ethereum/go-ethereum/log/syslog.go:56.111,58.2 1 0 +github.com/ethereum/go-ethereum/log/format.go:32.31,33.11 1 0 +github.com/ethereum/go-ethereum/log/format.go:33.11,35.3 1 0 +github.com/ethereum/go-ethereum/log/format.go:35.8,37.3 1 0 +github.com/ethereum/go-ethereum/log/format.go:61.48,63.2 1 1 +github.com/ethereum/go-ethereum/log/format.go:67.46,69.2 1 0 +github.com/ethereum/go-ethereum/log/format.go:88.43,89.43 1 0 +github.com/ethereum/go-ethereum/log/format.go:89.43,91.15 2 0 +github.com/ethereum/go-ethereum/log/format.go:108.3,110.47 3 0 +github.com/ethereum/go-ethereum/log/format.go:138.3,139.45 2 0 +github.com/ethereum/go-ethereum/log/format.go:143.3,144.19 2 0 +github.com/ethereum/go-ethereum/log/format.go:91.15,92.17 1 0 +github.com/ethereum/go-ethereum/log/format.go:93.17,94.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:95.18,96.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:97.17,98.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:99.17,100.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:101.18,102.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:103.18,104.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:110.47,113.41 2 0 +github.com/ethereum/go-ethereum/log/format.go:117.4,118.29 2 0 +github.com/ethereum/go-ethereum/log/format.go:122.4,125.17 2 0 +github.com/ethereum/go-ethereum/log/format.go:113.41,115.5 1 0 +github.com/ethereum/go-ethereum/log/format.go:118.29,121.5 2 0 +github.com/ethereum/go-ethereum/log/format.go:125.17,127.5 1 0 +github.com/ethereum/go-ethereum/log/format.go:127.10,129.5 1 0 +github.com/ethereum/go-ethereum/log/format.go:130.9,131.17 1 0 +github.com/ethereum/go-ethereum/log/format.go:131.17,133.5 1 0 +github.com/ethereum/go-ethereum/log/format.go:133.10,135.5 1 0 +github.com/ethereum/go-ethereum/log/format.go:139.45,141.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:153.28,154.43 1 1 +github.com/ethereum/go-ethereum/log/format.go:154.43,159.3 4 0 +github.com/ethereum/go-ethereum/log/format.go:162.73,163.35 1 0 +github.com/ethereum/go-ethereum/log/format.go:198.2,198.21 1 0 +github.com/ethereum/go-ethereum/log/format.go:163.35,164.13 1 0 +github.com/ethereum/go-ethereum/log/format.go:168.3,170.10 3 0 +github.com/ethereum/go-ethereum/log/format.go:175.3,180.54 5 0 +github.com/ethereum/go-ethereum/log/format.go:187.3,187.16 1 0 +github.com/ethereum/go-ethereum/log/format.go:193.3,194.41 2 0 +github.com/ethereum/go-ethereum/log/format.go:164.13,166.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:170.10,172.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:180.54,186.4 4 0 +github.com/ethereum/go-ethereum/log/format.go:187.16,189.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:189.9,192.4 2 0 +github.com/ethereum/go-ethereum/log/format.go:194.41,196.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:203.26,205.2 1 0 +github.com/ethereum/go-ethereum/log/format.go:210.61,212.12 2 0 +github.com/ethereum/go-ethereum/log/format.go:217.2,217.43 1 0 +github.com/ethereum/go-ethereum/log/format.go:212.12,213.53 1 0 +github.com/ethereum/go-ethereum/log/format.go:213.53,215.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:217.43,225.38 6 0 +github.com/ethereum/go-ethereum/log/format.go:233.3,236.17 3 0 +github.com/ethereum/go-ethereum/log/format.go:242.3,242.20 1 0 +github.com/ethereum/go-ethereum/log/format.go:245.3,245.11 1 0 +github.com/ethereum/go-ethereum/log/format.go:225.38,227.11 2 0 +github.com/ethereum/go-ethereum/log/format.go:230.4,231.50 2 0 +github.com/ethereum/go-ethereum/log/format.go:227.11,229.5 1 0 +github.com/ethereum/go-ethereum/log/format.go:236.17,241.4 2 0 +github.com/ethereum/go-ethereum/log/format.go:242.20,244.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:252.54,254.12 2 0 +github.com/ethereum/go-ethereum/log/format.go:260.2,260.43 1 0 +github.com/ethereum/go-ethereum/log/format.go:254.12,255.53 1 0 +github.com/ethereum/go-ethereum/log/format.go:255.53,257.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:260.43,267.38 5 0 +github.com/ethereum/go-ethereum/log/format.go:275.3,276.17 2 0 +github.com/ethereum/go-ethereum/log/format.go:283.3,283.20 1 0 +github.com/ethereum/go-ethereum/log/format.go:287.3,287.11 1 0 +github.com/ethereum/go-ethereum/log/format.go:267.38,269.11 2 0 +github.com/ethereum/go-ethereum/log/format.go:272.4,272.42 1 0 +github.com/ethereum/go-ethereum/log/format.go:269.11,271.5 1 0 +github.com/ethereum/go-ethereum/log/format.go:276.17,281.4 2 0 +github.com/ethereum/go-ethereum/log/format.go:283.20,285.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:291.59,292.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:302.2,302.27 1 0 +github.com/ethereum/go-ethereum/log/format.go:292.15,293.35 1 0 +github.com/ethereum/go-ethereum/log/format.go:293.35,294.73 1 0 +github.com/ethereum/go-ethereum/log/format.go:294.73,296.5 1 0 +github.com/ethereum/go-ethereum/log/format.go:296.10,297.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:303.17,304.30 1 0 +github.com/ethereum/go-ethereum/log/format.go:306.13,307.19 1 0 +github.com/ethereum/go-ethereum/log/format.go:309.20,310.20 1 0 +github.com/ethereum/go-ethereum/log/format.go:312.10,313.11 1 0 +github.com/ethereum/go-ethereum/log/format.go:317.53,319.22 2 0 +github.com/ethereum/go-ethereum/log/format.go:320.101,321.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:322.10,323.35 1 0 +github.com/ethereum/go-ethereum/log/format.go:328.61,329.18 1 0 +github.com/ethereum/go-ethereum/log/format.go:333.2,333.27 1 0 +github.com/ethereum/go-ethereum/log/format.go:348.2,348.10 1 0 +github.com/ethereum/go-ethereum/log/format.go:354.2,355.27 2 0 +github.com/ethereum/go-ethereum/log/format.go:329.18,331.3 1 0 +github.com/ethereum/go-ethereum/log/format.go:334.17,338.30 1 0 +github.com/ethereum/go-ethereum/log/format.go:340.16,343.15 1 0 +github.com/ethereum/go-ethereum/log/format.go:346.3,346.31 1 0 +github.com/ethereum/go-ethereum/log/format.go:343.15,345.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:348.10,349.44 1 0 +github.com/ethereum/go-ethereum/log/format.go:349.44,352.4 1 0 +github.com/ethereum/go-ethereum/log/format.go:356.12,357.31 1 0 +github.com/ethereum/go-ethereum/log/format.go:358.15,359.61 1 0 +github.com/ethereum/go-ethereum/log/format.go:360.15,361.52 1 0 +github.com/ethereum/go-ethereum/log/format.go:362.12,363.41 1 0 +github.com/ethereum/go-ethereum/log/format.go:364.13,365.41 1 0 +github.com/ethereum/go-ethereum/log/format.go:366.13,367.41 1 0 +github.com/ethereum/go-ethereum/log/format.go:368.14,369.41 1 0 +github.com/ethereum/go-ethereum/log/format.go:371.11,372.37 1 0 +github.com/ethereum/go-ethereum/log/format.go:373.13,374.37 1 0 +github.com/ethereum/go-ethereum/log/format.go:375.13,376.30 1 0 +github.com/ethereum/go-ethereum/log/format.go:377.12,378.39 1 0 +github.com/ethereum/go-ethereum/log/format.go:379.14,380.39 1 0 +github.com/ethereum/go-ethereum/log/format.go:381.14,382.31 1 0 +github.com/ethereum/go-ethereum/log/format.go:383.14,384.25 1 0 +github.com/ethereum/go-ethereum/log/format.go:385.10,386.49 1 0 +github.com/ethereum/go-ethereum/log/format.go:391.40,392.11 1 1 +github.com/ethereum/go-ethereum/log/format.go:395.2,395.45 1 1 +github.com/ethereum/go-ethereum/log/format.go:392.11,394.3 1 1 +github.com/ethereum/go-ethereum/log/format.go:399.42,401.2 1 1 +github.com/ethereum/go-ethereum/log/format.go:403.52,405.16 1 1 +github.com/ethereum/go-ethereum/log/format.go:413.2,420.19 3 1 +github.com/ethereum/go-ethereum/log/format.go:430.2,430.9 1 1 +github.com/ethereum/go-ethereum/log/format.go:434.2,434.26 1 1 +github.com/ethereum/go-ethereum/log/format.go:405.16,406.10 1 1 +github.com/ethereum/go-ethereum/log/format.go:406.10,408.4 1 1 +github.com/ethereum/go-ethereum/log/format.go:408.9,410.4 1 1 +github.com/ethereum/go-ethereum/log/format.go:420.19,421.17 1 1 +github.com/ethereum/go-ethereum/log/format.go:421.17,424.4 2 1 +github.com/ethereum/go-ethereum/log/format.go:424.9,428.4 3 1 +github.com/ethereum/go-ethereum/log/format.go:430.9,433.3 2 1 +github.com/ethereum/go-ethereum/log/format.go:438.44,439.18 1 1 +github.com/ethereum/go-ethereum/log/format.go:442.2,442.17 1 1 +github.com/ethereum/go-ethereum/log/format.go:446.2,452.50 2 1 +github.com/ethereum/go-ethereum/log/format.go:468.2,468.26 1 1 +github.com/ethereum/go-ethereum/log/format.go:439.18,441.3 1 0 +github.com/ethereum/go-ethereum/log/format.go:442.17,444.3 1 0 +github.com/ethereum/go-ethereum/log/format.go:452.50,455.10 2 1 +github.com/ethereum/go-ethereum/log/format.go:456.17,457.14 1 1 +github.com/ethereum/go-ethereum/log/format.go:458.19,462.15 4 1 +github.com/ethereum/go-ethereum/log/format.go:463.11,465.11 2 1 +github.com/ethereum/go-ethereum/log/format.go:473.36,475.22 2 0 +github.com/ethereum/go-ethereum/log/format.go:482.2,482.19 1 0 +github.com/ethereum/go-ethereum/log/format.go:485.2,485.25 1 0 +github.com/ethereum/go-ethereum/log/format.go:475.22,477.38 1 0 +github.com/ethereum/go-ethereum/log/format.go:477.38,479.9 2 0 +github.com/ethereum/go-ethereum/log/format.go:482.19,484.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:24.52,26.2 1 1 +github.com/ethereum/go-ethereum/log/handler.go:30.43,32.2 1 0 +github.com/ethereum/go-ethereum/log/handler.go:41.55,42.41 1 1 +github.com/ethereum/go-ethereum/log/handler.go:46.2,46.36 1 1 +github.com/ethereum/go-ethereum/log/handler.go:42.41,45.3 2 0 +github.com/ethereum/go-ethereum/log/handler.go:52.37,54.43 2 1 +github.com/ethereum/go-ethereum/log/handler.go:54.43,58.3 3 0 +github.com/ethereum/go-ethereum/log/handler.go:65.61,67.16 2 0 +github.com/ethereum/go-ethereum/log/handler.go:70.2,70.55 1 0 +github.com/ethereum/go-ethereum/log/handler.go:67.16,69.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:75.69,77.16 2 0 +github.com/ethereum/go-ethereum/log/handler.go:81.2,81.61 1 0 +github.com/ethereum/go-ethereum/log/handler.go:77.16,79.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:92.40,94.2 1 0 +github.com/ethereum/go-ethereum/log/handler.go:98.43,99.43 1 0 +github.com/ethereum/go-ethereum/log/handler.go:99.43,102.3 2 0 +github.com/ethereum/go-ethereum/log/handler.go:107.43,108.43 1 0 +github.com/ethereum/go-ethereum/log/handler.go:108.43,111.3 2 0 +github.com/ethereum/go-ethereum/log/handler.go:115.53,117.2 1 0 +github.com/ethereum/go-ethereum/log/handler.go:124.59,125.43 1 0 +github.com/ethereum/go-ethereum/log/handler.go:125.43,127.17 2 0 +github.com/ethereum/go-ethereum/log/handler.go:130.3,130.18 1 0 +github.com/ethereum/go-ethereum/log/handler.go:127.17,129.4 1 0 +github.com/ethereum/go-ethereum/log/handler.go:147.64,148.43 1 0 +github.com/ethereum/go-ethereum/log/handler.go:148.43,149.12 1 0 +github.com/ethereum/go-ethereum/log/handler.go:152.3,152.13 1 0 +github.com/ethereum/go-ethereum/log/handler.go:149.12,151.4 1 0 +github.com/ethereum/go-ethereum/log/handler.go:163.75,164.51 1 0 +github.com/ethereum/go-ethereum/log/handler.go:164.51,165.14 1 0 +github.com/ethereum/go-ethereum/log/handler.go:174.3,174.38 1 0 +github.com/ethereum/go-ethereum/log/handler.go:179.3,179.15 1 0 +github.com/ethereum/go-ethereum/log/handler.go:166.23,167.25 1 0 +github.com/ethereum/go-ethereum/log/handler.go:168.24,169.26 1 0 +github.com/ethereum/go-ethereum/log/handler.go:170.23,171.25 1 0 +github.com/ethereum/go-ethereum/log/handler.go:174.38,175.23 1 0 +github.com/ethereum/go-ethereum/log/handler.go:175.23,177.5 1 0 +github.com/ethereum/go-ethereum/log/handler.go:190.54,191.51 1 0 +github.com/ethereum/go-ethereum/log/handler.go:191.51,193.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:205.42,206.43 1 0 +github.com/ethereum/go-ethereum/log/handler.go:206.43,207.24 1 0 +github.com/ethereum/go-ethereum/log/handler.go:211.3,211.13 1 0 +github.com/ethereum/go-ethereum/log/handler.go:207.24,210.4 1 0 +github.com/ethereum/go-ethereum/log/handler.go:230.45,231.43 1 0 +github.com/ethereum/go-ethereum/log/handler.go:231.43,233.24 2 0 +github.com/ethereum/go-ethereum/log/handler.go:241.3,241.13 1 0 +github.com/ethereum/go-ethereum/log/handler.go:233.24,235.18 2 0 +github.com/ethereum/go-ethereum/log/handler.go:238.4,238.65 1 0 +github.com/ethereum/go-ethereum/log/handler.go:235.18,237.5 1 0 +github.com/ethereum/go-ethereum/log/handler.go:248.50,249.43 1 0 +github.com/ethereum/go-ethereum/log/handler.go:249.43,252.3 2 0 +github.com/ethereum/go-ethereum/log/handler.go:260.54,262.12 2 0 +github.com/ethereum/go-ethereum/log/handler.go:267.2,267.29 1 0 +github.com/ethereum/go-ethereum/log/handler.go:262.12,263.23 1 0 +github.com/ethereum/go-ethereum/log/handler.go:263.23,265.4 1 0 +github.com/ethereum/go-ethereum/log/handler.go:274.37,275.43 1 1 +github.com/ethereum/go-ethereum/log/handler.go:275.43,279.38 2 0 +github.com/ethereum/go-ethereum/log/handler.go:295.3,295.13 1 0 +github.com/ethereum/go-ethereum/log/handler.go:299.3,299.18 1 0 +github.com/ethereum/go-ethereum/log/handler.go:279.38,281.10 2 0 +github.com/ethereum/go-ethereum/log/handler.go:281.10,283.19 2 0 +github.com/ethereum/go-ethereum/log/handler.go:283.19,286.6 2 0 +github.com/ethereum/go-ethereum/log/handler.go:286.11,287.43 1 0 +github.com/ethereum/go-ethereum/log/handler.go:290.6,290.18 1 0 +github.com/ethereum/go-ethereum/log/handler.go:287.43,289.7 1 0 +github.com/ethereum/go-ethereum/log/handler.go:295.13,297.4 1 0 +github.com/ethereum/go-ethereum/log/handler.go:303.49,306.30 2 0 +github.com/ethereum/go-ethereum/log/handler.go:310.2,310.19 1 0 +github.com/ethereum/go-ethereum/log/handler.go:314.2,314.21 1 0 +github.com/ethereum/go-ethereum/log/handler.go:318.2,320.23 3 0 +github.com/ethereum/go-ethereum/log/handler.go:323.2,324.28 2 0 +github.com/ethereum/go-ethereum/log/handler.go:327.2,327.20 1 0 +github.com/ethereum/go-ethereum/log/handler.go:306.30,308.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:310.19,312.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:314.21,316.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:320.23,322.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:324.28,326.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:333.31,334.43 1 1 +github.com/ethereum/go-ethereum/log/handler.go:334.43,336.3 1 0 +github.com/ethereum/go-ethereum/log/handler.go:344.41,345.16 1 0 +github.com/ethereum/go-ethereum/log/handler.go:348.2,348.10 1 0 +github.com/ethereum/go-ethereum/log/handler.go:345.16,346.13 1 0 +github.com/ethereum/go-ethereum/log/handler.go:353.63,355.2 1 0 +github.com/ethereum/go-ethereum/log/handler.go:357.71,359.2 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:117.92,122.2 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:125.88,129.2 3 0 +github.com/ethereum/go-ethereum/light/postprocess.go:144.118,156.2 3 0 +github.com/ethereum/go-ethereum/light/postprocess.go:160.108,163.6 3 0 +github.com/ethereum/go-ethereum/light/postprocess.go:163.6,165.14 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:166.12,168.24 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:169.19,171.11 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:177.11,178.14 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:172.22,173.21 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:174.40,174.40 0 0 +github.com/ethereum/go-ethereum/light/postprocess.go:184.107,186.17 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:189.2,192.32 3 0 +github.com/ethereum/go-ethereum/light/postprocess.go:198.2,199.12 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:186.17,188.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:192.32,194.17 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:194.17,196.4 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:203.86,208.15 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:211.2,215.12 5 0 +github.com/ethereum/go-ethereum/light/postprocess.go:208.15,209.13 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:219.44,221.16 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:225.2,225.23 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:251.2,253.12 3 0 +github.com/ethereum/go-ethereum/light/postprocess.go:221.16,223.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:225.23,228.55 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:230.3,238.17 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:247.3,247.140 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:228.55,228.78 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:238.17,240.56 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:240.56,243.5 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:243.10,245.5 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:248.8,250.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:259.59,261.22 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:264.2,269.6 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:294.2,294.38 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:297.2,298.12 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:261.22,263.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:269.6,271.24 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:274.3,274.37 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:286.3,286.47 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:292.3,292.38 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:271.24,272.9 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:274.37,285.4 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:286.47,287.40 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:290.4,290.17 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:287.40,289.5 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:294.38,296.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:307.98,312.2 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:315.94,319.2 3 0 +github.com/ethereum/go-ethereum/light/postprocess.go:337.126,352.2 5 0 +github.com/ethereum/go-ethereum/light/postprocess.go:356.114,363.26 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:385.2,385.50 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:388.2,390.50 3 0 +github.com/ethereum/go-ethereum/light/postprocess.go:397.2,397.22 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:363.26,364.13 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:364.13,365.34 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:365.34,367.9 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:367.9,368.58 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:368.58,370.14 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:371.25,373.14 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:374.43,374.43 0 0 +github.com/ethereum/go-ethereum/light/postprocess.go:377.12,379.12 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:385.50,387.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:390.50,392.21 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:395.3,395.25 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:392.21,394.4 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:401.113,403.17 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:406.2,408.32 3 0 +github.com/ethereum/go-ethereum/light/postprocess.go:414.2,415.12 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:403.17,405.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:408.32,410.17 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:410.17,412.4 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:419.92,421.31 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:424.2,424.12 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:421.31,423.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:428.50,431.50 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:457.2,458.16 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:462.2,462.23 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:488.2,492.12 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:431.50,436.49 5 0 +github.com/ethereum/go-ethereum/light/postprocess.go:447.3,451.20 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:436.49,438.18 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:441.4,442.19 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:445.4,445.42 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:438.18,440.5 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:442.19,444.5 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:451.20,453.4 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:453.9,455.4 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:458.16,460.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:462.23,465.55 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:467.3,475.17 4 0 +github.com/ethereum/go-ethereum/light/postprocess.go:484.3,484.142 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:465.55,465.78 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:475.17,477.56 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:477.56,480.5 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:480.10,482.5 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:485.8,487.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:497.65,499.22 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:502.2,503.50 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:506.2,507.12 2 0 +github.com/ethereum/go-ethereum/light/postprocess.go:499.22,501.3 1 0 +github.com/ethereum/go-ethereum/light/postprocess.go:503.50,505.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:38.87,41.2 2 1 +github.com/ethereum/go-ethereum/light/trie.go:43.95,45.2 1 1 +github.com/ethereum/go-ethereum/light/trie.go:53.71,55.2 1 1 +github.com/ethereum/go-ethereum/light/trie.go:57.88,59.2 1 1 +github.com/ethereum/go-ethereum/light/trie.go:61.58,62.23 1 0 +github.com/ethereum/go-ethereum/light/trie.go:63.16,65.20 2 0 +github.com/ethereum/go-ethereum/light/trie.go:69.3,69.13 1 0 +github.com/ethereum/go-ethereum/light/trie.go:70.10,71.47 1 0 +github.com/ethereum/go-ethereum/light/trie.go:65.20,68.4 2 0 +github.com/ethereum/go-ethereum/light/trie.go:75.85,76.25 1 1 +github.com/ethereum/go-ethereum/light/trie.go:79.2,80.20 2 1 +github.com/ethereum/go-ethereum/light/trie.go:83.2,87.22 5 1 +github.com/ethereum/go-ethereum/light/trie.go:76.25,78.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:80.20,82.3 1 1 +github.com/ethereum/go-ethereum/light/trie.go:90.86,93.2 2 0 +github.com/ethereum/go-ethereum/light/trie.go:95.48,97.2 1 0 +github.com/ethereum/go-ethereum/light/trie.go:105.54,108.38 3 1 +github.com/ethereum/go-ethereum/light/trie.go:112.2,112.17 1 1 +github.com/ethereum/go-ethereum/light/trie.go:108.38,111.3 2 1 +github.com/ethereum/go-ethereum/light/trie.go:115.79,118.16 3 0 +github.com/ethereum/go-ethereum/light/trie.go:121.2,121.32 1 0 +github.com/ethereum/go-ethereum/light/trie.go:118.16,120.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:121.32,123.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:126.54,128.32 2 0 +github.com/ethereum/go-ethereum/light/trie.go:128.32,130.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:133.47,135.32 2 0 +github.com/ethereum/go-ethereum/light/trie.go:135.32,137.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:140.78,141.19 1 0 +github.com/ethereum/go-ethereum/light/trie.go:144.2,144.30 1 0 +github.com/ethereum/go-ethereum/light/trie.go:141.19,143.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:147.38,148.19 1 0 +github.com/ethereum/go-ethereum/light/trie.go:151.2,151.22 1 0 +github.com/ethereum/go-ethereum/light/trie.go:148.19,150.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:154.67,156.2 1 1 +github.com/ethereum/go-ethereum/light/trie.go:158.45,160.2 1 0 +github.com/ethereum/go-ethereum/light/trie.go:162.89,164.2 1 0 +github.com/ethereum/go-ethereum/light/trie.go:168.57,169.6 1 1 +github.com/ethereum/go-ethereum/light/trie.go:169.6,171.20 2 1 +github.com/ethereum/go-ethereum/light/trie.go:174.3,174.17 1 1 +github.com/ethereum/go-ethereum/light/trie.go:177.3,177.49 1 1 +github.com/ethereum/go-ethereum/light/trie.go:180.3,181.60 2 1 +github.com/ethereum/go-ethereum/light/trie.go:171.20,173.4 1 1 +github.com/ethereum/go-ethereum/light/trie.go:174.17,176.4 1 1 +github.com/ethereum/go-ethereum/light/trie.go:177.49,179.4 1 1 +github.com/ethereum/go-ethereum/light/trie.go:181.60,183.4 1 1 +github.com/ethereum/go-ethereum/light/trie.go:193.69,196.19 2 1 +github.com/ethereum/go-ethereum/light/trie.go:205.2,205.21 1 1 +github.com/ethereum/go-ethereum/light/trie.go:209.2,209.11 1 1 +github.com/ethereum/go-ethereum/light/trie.go:196.19,197.22 1 1 +github.com/ethereum/go-ethereum/light/trie.go:197.22,199.18 2 1 +github.com/ethereum/go-ethereum/light/trie.go:202.4,202.14 1 1 +github.com/ethereum/go-ethereum/light/trie.go:199.18,201.5 1 1 +github.com/ethereum/go-ethereum/light/trie.go:205.21,208.3 2 1 +github.com/ethereum/go-ethereum/light/trie.go:212.49,214.21 2 1 +github.com/ethereum/go-ethereum/light/trie.go:218.2,218.11 1 1 +github.com/ethereum/go-ethereum/light/trie.go:214.21,217.3 2 1 +github.com/ethereum/go-ethereum/light/trie.go:222.45,224.6 2 1 +github.com/ethereum/go-ethereum/light/trie.go:224.6,227.10 3 1 +github.com/ethereum/go-ethereum/light/trie.go:230.3,230.35 1 1 +github.com/ethereum/go-ethereum/light/trie.go:234.3,236.71 3 1 +github.com/ethereum/go-ethereum/light/trie.go:227.10,229.4 1 1 +github.com/ethereum/go-ethereum/light/trie.go:230.35,233.4 2 0 +github.com/ethereum/go-ethereum/light/trie.go:236.71,238.4 1 0 +github.com/ethereum/go-ethereum/light/trie.go:242.39,243.19 1 1 +github.com/ethereum/go-ethereum/light/trie.go:246.2,246.32 1 1 +github.com/ethereum/go-ethereum/light/trie.go:243.19,245.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:249.38,250.45 1 1 +github.com/ethereum/go-ethereum/light/trie.go:253.2,253.21 1 1 +github.com/ethereum/go-ethereum/light/trie.go:256.2,257.57 2 1 +github.com/ethereum/go-ethereum/light/trie.go:260.2,260.12 1 1 +github.com/ethereum/go-ethereum/light/trie.go:250.45,252.3 1 0 +github.com/ethereum/go-ethereum/light/trie.go:253.21,255.3 1 1 +github.com/ethereum/go-ethereum/light/trie.go:257.57,259.3 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:90.93,111.2 4 1 +github.com/ethereum/go-ethereum/light/txpool.go:114.70,116.2 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:121.88,124.26 3 0 +github.com/ethereum/go-ethereum/light/txpool.go:127.2,128.22 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:131.2,131.23 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:134.2,134.19 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:124.26,126.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:128.22,130.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:131.23,133.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:142.68,144.27 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:144.27,146.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:146.8,148.3 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:152.84,153.29 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:160.2,160.8 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:153.29,154.10 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:154.10,156.4 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:156.9,158.4 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:166.115,168.28 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:171.2,172.16 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:176.2,177.42 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:183.2,183.17 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:197.2,197.12 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:168.28,170.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:172.16,174.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:177.42,178.43 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:178.43,180.4 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:183.17,185.74 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:188.3,191.27 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:195.3,195.26 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:185.74,187.4 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:191.27,194.4 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:202.71,204.38 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:213.2,213.15 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:204.38,205.27 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:211.3,211.27 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:205.27,210.4 4 0 +github.com/ethereum/go-ethereum/light/txpool.go:222.106,228.33 5 1 +github.com/ethereum/go-ethereum/light/txpool.go:242.2,242.42 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:246.2,246.33 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:249.2,251.43 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:260.2,260.71 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:278.2,278.17 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:228.33,229.51 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:233.3,233.50 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:229.51,232.4 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:233.50,236.19 3 1 +github.com/ethereum/go-ethereum/light/txpool.go:236.19,239.5 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:242.42,244.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:246.33,248.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:251.43,253.97 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:256.3,256.19 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:253.97,255.4 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:260.71,262.26 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:275.3,275.23 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:262.26,263.42 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:263.42,265.41 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:265.41,267.30 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:270.6,271.30 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:267.30,269.7 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:287.33,288.6 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:288.6,289.10 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:290.33,294.32 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:297.34,298.10 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:303.52,318.2 10 1 +github.com/ethereum/go-ethereum/light/txpool.go:321.28,328.2 4 0 +github.com/ethereum/go-ethereum/light/txpool.go:332.89,334.2 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:337.43,343.2 4 0 +github.com/ethereum/go-ethereum/light/txpool.go:346.82,355.59 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:359.2,360.54 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:366.2,367.32 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:374.2,374.27 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:380.2,380.62 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:385.2,386.16 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:389.2,389.20 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:392.2,392.29 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:355.59,357.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:360.54,362.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:367.32,369.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:374.27,376.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:380.62,382.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:386.16,388.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:389.20,391.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:397.75,400.31 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:403.2,404.16 2 1 +github.com/ethereum/go-ethereum/light/txpool.go:408.2,408.38 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:425.2,425.95 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:426.2,426.12 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:400.31,402.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:404.16,406.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:408.38,414.31 4 1 +github.com/ethereum/go-ethereum/light/txpool.go:421.3,421.69 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:414.31,416.4 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:425.95,425.152 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:431.75,435.16 4 1 +github.com/ethereum/go-ethereum/light/txpool.go:439.2,439.42 1 1 +github.com/ethereum/go-ethereum/light/txpool.go:443.2,446.12 3 1 +github.com/ethereum/go-ethereum/light/txpool.go:435.16,437.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:439.42,441.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:451.77,456.25 4 0 +github.com/ethereum/go-ethereum/light/txpool.go:461.2,461.21 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:456.25,457.43 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:457.43,459.4 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:461.21,463.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:468.73,470.38 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:473.2,473.12 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:470.38,472.3 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:478.75,484.34 5 0 +github.com/ethereum/go-ethereum/light/txpool.go:488.2,488.17 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:484.34,487.3 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:493.110,499.34 4 0 +github.com/ethereum/go-ethereum/light/txpool.go:504.2,505.24 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:499.34,502.3 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:510.95,516.34 4 0 +github.com/ethereum/go-ethereum/light/txpool.go:524.2,524.38 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:516.34,518.22 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:521.3,521.32 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:518.22,519.12 1 0 +github.com/ethereum/go-ethereum/light/txpool.go:528.64,534.25 5 0 +github.com/ethereum/go-ethereum/light/txpool.go:540.2,541.28 2 0 +github.com/ethereum/go-ethereum/light/txpool.go:534.25,539.3 4 0 +github.com/ethereum/go-ethereum/light/txpool.go:545.48,552.2 5 0 +github.com/ethereum/go-ethereum/light/lightchain.go:84.148,102.16 8 1 +github.com/ethereum/go-ethereum/light/lightchain.go:105.2,106.28 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:109.2,109.23 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:112.2,112.43 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:116.2,116.35 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:123.2,123.16 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:102.16,104.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:106.28,108.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:109.23,111.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:112.43,114.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:116.35,117.56 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:117.56,121.4 3 1 +github.com/ethereum/go-ethereum/light/lightchain.go:127.74,128.32 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:132.2,132.38 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:136.2,136.34 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:139.2,139.119 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:128.32,131.3 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:132.38,135.3 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:136.34,138.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:142.47,144.2 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:147.40,149.2 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:152.55,154.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:158.45,159.75 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:172.2,175.12 4 1 +github.com/ethereum/go-ethereum/light/lightchain.go:159.75,162.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:162.8,164.20 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:164.20,167.4 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:167.9,169.4 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:180.50,186.2 4 1 +github.com/ethereum/go-ethereum/light/lightchain.go:189.41,191.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:194.31,196.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:200.67,212.38 8 0 +github.com/ethereum/go-ethereum/light/lightchain.go:215.2,217.50 3 0 +github.com/ethereum/go-ethereum/light/lightchain.go:212.38,214.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:223.49,223.69 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:226.46,228.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:230.51,231.26 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:236.91,238.46 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:242.2,243.19 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:246.2,247.16 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:251.2,252.18 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:238.46,241.3 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:243.19,245.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:247.16,249.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:257.95,259.49 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:262.2,263.19 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:266.2,267.16 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:271.2,272.18 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:259.49,261.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:263.19,265.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:267.16,269.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:277.70,280.2 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:284.108,286.46 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:289.2,290.16 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:294.2,295.19 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:286.46,288.3 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:290.16,292.3 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:300.99,302.19 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:305.2,305.40 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:302.19,304.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:310.98,312.43 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:315.2,315.39 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:312.43,314.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:320.30,321.52 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:324.2,327.32 4 0 +github.com/ethereum/go-ethereum/light/lightchain.go:321.52,323.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:333.36,335.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:339.53,344.39 4 0 +github.com/ethereum/go-ethereum/light/lightchain.go:356.2,356.38 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:344.39,351.57 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:351.57,354.4 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:356.38,358.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:363.61,364.31 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:364.31,365.29 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:366.24,367.44 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:370.4,370.25 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:371.28,372.29 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:367.44,369.5 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:377.64,380.67 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:384.2,392.12 7 0 +github.com/ethereum/go-ethereum/light/lightchain.go:380.67,382.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:395.64,402.61 5 0 +github.com/ethereum/go-ethereum/light/lightchain.go:406.2,410.12 5 0 +github.com/ethereum/go-ethereum/light/lightchain.go:402.61,404.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:424.92,425.21 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:428.2,428.49 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:431.2,432.71 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:437.2,444.35 6 1 +github.com/ethereum/go-ethereum/light/lightchain.go:449.2,453.16 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:460.2,460.15 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:425.21,427.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:428.49,430.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:432.71,434.3 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:444.35,446.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:454.24,456.59 2 1 +github.com/ethereum/go-ethereum/light/lightchain.go:457.23,458.59 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:465.53,467.2 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:471.71,473.2 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:477.95,479.15 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:482.2,483.11 2 0 +github.com/ethereum/go-ethereum/light/lightchain.go:479.15,481.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:488.80,490.2 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:494.71,496.2 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:500.71,502.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:505.67,507.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:514.125,516.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:520.70,522.2 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:526.103,527.62 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:530.2,530.47 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:527.62,529.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:534.52,534.77 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:541.102,546.52 3 0 +github.com/ethereum/go-ethereum/light/lightchain.go:549.2,549.20 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:553.2,553.88 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:565.2,565.14 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:546.52,548.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:549.20,551.3 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:553.88,558.69 3 0 +github.com/ethereum/go-ethereum/light/lightchain.go:563.3,563.14 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:558.69,562.4 3 0 +github.com/ethereum/go-ethereum/light/lightchain.go:570.35,572.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:575.37,577.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:580.89,582.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:585.97,587.2 1 1 +github.com/ethereum/go-ethereum/light/lightchain.go:590.97,592.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:596.85,598.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:602.101,604.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:607.99,609.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:612.42,614.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:617.41,619.2 1 0 +github.com/ethereum/go-ethereum/light/lightchain.go:623.97,625.2 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:40.28,44.2 1 1 +github.com/ethereum/go-ethereum/light/nodeset.go:47.56,51.40 3 1 +github.com/ethereum/go-ethereum/light/nodeset.go:54.2,60.12 5 1 +github.com/ethereum/go-ethereum/light/nodeset.go:51.40,53.3 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:64.45,70.2 4 0 +github.com/ethereum/go-ethereum/light/nodeset.go:73.52,77.44 3 0 +github.com/ethereum/go-ethereum/light/nodeset.go:80.2,80.37 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:77.44,79.3 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:84.50,87.2 2 0 +github.com/ethereum/go-ethereum/light/nodeset.go:90.35,95.2 3 0 +github.com/ethereum/go-ethereum/light/nodeset.go:98.35,103.2 3 0 +github.com/ethereum/go-ethereum/light/nodeset.go:106.40,111.31 4 0 +github.com/ethereum/go-ethereum/light/nodeset.go:114.2,114.15 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:111.31,113.3 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:118.55,122.35 3 1 +github.com/ethereum/go-ethereum/light/nodeset.go:122.35,124.3 1 1 +github.com/ethereum/go-ethereum/light/nodeset.go:131.50,132.25 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:132.25,134.3 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:138.38,142.2 3 0 +github.com/ethereum/go-ethereum/light/nodeset.go:145.56,148.2 2 0 +github.com/ethereum/go-ethereum/light/nodeset.go:151.45,152.24 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:156.34,158.25 2 0 +github.com/ethereum/go-ethereum/light/nodeset.go:161.2,161.13 1 0 +github.com/ethereum/go-ethereum/light/nodeset.go:158.25,160.3 1 0 +github.com/ethereum/go-ethereum/light/odr.go:63.48,70.2 1 1 +github.com/ethereum/go-ethereum/light/odr.go:75.71,82.2 1 1 +github.com/ethereum/go-ethereum/light/odr.go:92.56,94.2 1 1 +github.com/ethereum/go-ethereum/light/odr.go:104.56,106.2 1 1 +github.com/ethereum/go-ethereum/light/odr.go:117.57,119.2 1 1 +github.com/ethereum/go-ethereum/light/odr.go:131.60,132.20 1 1 +github.com/ethereum/go-ethereum/light/odr.go:132.20,134.3 1 1 +github.com/ethereum/go-ethereum/light/odr.go:148.55,153.2 4 0 +github.com/ethereum/go-ethereum/light/odr.go:168.57,169.50 1 0 +github.com/ethereum/go-ethereum/light/odr.go:169.50,176.3 2 0 +github.com/ethereum/go-ethereum/light/odr.go:193.61,193.62 0 0 +github.com/ethereum/go-ethereum/light/odr_util.go:39.99,46.29 3 1 +github.com/ethereum/go-ethereum/light/odr_util.go:53.2,54.48 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:57.2,63.45 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:66.2,66.22 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:46.29,47.66 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:47.66,49.4 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:54.48,56.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:63.45,65.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:70.96,72.29 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:75.2,76.16 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:80.2,80.27 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:72.29,74.3 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:76.16,78.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:84.100,86.15 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:89.2,90.16 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:93.2,93.27 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:97.2,97.56 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:86.15,88.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:90.16,92.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:93.27,95.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:101.109,102.74 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:106.2,107.16 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:110.2,110.27 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:113.2,114.45 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:117.2,117.19 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:102.74,104.3 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:107.16,109.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:110.27,112.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:114.45,116.3 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:122.105,124.16 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:127.2,128.64 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:131.2,131.18 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:124.16,126.3 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:128.64,130.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:136.107,139.16 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:142.2,143.16 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:147.2,147.87 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:139.16,141.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:143.16,145.3 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:152.117,155.21 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:170.2,170.64 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:183.2,183.22 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:155.21,157.17 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:160.3,160.28 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:163.3,164.46 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:167.3,167.24 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:157.17,159.4 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:160.28,162.4 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:164.46,166.4 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:170.64,172.17 2 1 +github.com/ethereum/go-ethereum/light/odr_util.go:175.3,178.110 3 1 +github.com/ethereum/go-ethereum/light/odr_util.go:181.3,181.62 1 1 +github.com/ethereum/go-ethereum/light/odr_util.go:172.17,174.4 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:178.110,180.4 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:188.113,191.16 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:194.2,195.35 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:198.2,198.18 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:191.16,193.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:195.35,197.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:204.111,208.21 3 0 +github.com/ethereum/go-ethereum/light/odr_util.go:218.2,219.35 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:222.2,222.18 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:208.21,210.46 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:213.3,213.24 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:210.46,212.4 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:219.35,221.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:227.103,235.35 3 0 +github.com/ethereum/go-ethereum/light/odr_util.go:252.2,252.24 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:256.2,263.45 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:266.2,266.31 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:269.2,269.20 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:235.35,240.94 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:245.3,245.24 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:248.3,249.33 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:240.94,242.12 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:245.24,247.4 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:252.24,254.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:263.45,265.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:266.31,268.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:278.135,280.100 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:283.2,286.110 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:289.2,290.112 2 0 +github.com/ethereum/go-ethereum/light/odr_util.go:293.2,293.84 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:280.100,282.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:286.110,288.3 1 0 +github.com/ethereum/go-ethereum/light/odr_util.go:290.112,292.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:208.147,209.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:212.2,237.11 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:209.23,211.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:247.55,254.9 5 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:264.2,270.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:255.47,256.52 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:257.47,258.56 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:259.27,260.57 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:261.10,262.124 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:274.43,276.2 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:280.77,282.18 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:288.2,289.87 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:293.2,293.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:282.18,285.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:285.8,287.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:289.87,292.3 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:297.87,299.2 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:304.54,307.18 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:313.2,314.47 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:318.2,320.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:307.18,310.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:310.8,312.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:314.47,317.3 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:325.97,328.13 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:332.2,334.106 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:345.2,346.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:329.33,330.13 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:334.106,336.24 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:343.3,343.13 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:336.24,340.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:340.9,342.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:352.97,354.30 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:358.2,358.57 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:361.2,364.51 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:370.2,370.22 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:384.2,387.64 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:393.2,393.72 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:402.2,402.30 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:410.2,422.14 8 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:425.2,425.36 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:354.30,356.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:358.57,360.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:364.51,366.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:370.22,371.18 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:381.3,381.18 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:371.18,375.63 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:378.4,379.21 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:375.63,377.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:387.64,388.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:389.13,389.13 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:390.11,390.11 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:393.72,394.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:394.31,395.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:396.14,396.14 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:397.12,398.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:402.30,403.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:404.25,404.25 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:405.11,406.16 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:422.14,424.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:428.41,430.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:434.97,436.15 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:445.2,445.27 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:448.2,451.30 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:456.2,457.16 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:460.2,460.38 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:467.2,470.16 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:473.2,474.73 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:477.2,481.22 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:494.2,495.52 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:498.2,498.22 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:538.2,539.27 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:542.2,543.16 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:548.2,548.22 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:557.2,557.30 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:436.15,438.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:438.17,440.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:440.9,443.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:445.27,447.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:451.30,453.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:457.16,459.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:460.38,466.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:470.16,472.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:474.73,476.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:481.22,482.40 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:482.40,484.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:484.9,486.29 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:491.4,491.54 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:486.29,488.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:495.52,497.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:498.22,513.64 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:520.3,524.38 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:531.3,531.24 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:513.64,515.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:515.9,515.44 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:515.44,517.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:517.9,519.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:524.38,527.4 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:527.9,527.32 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:527.32,529.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:531.24,532.59 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:532.59,534.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:539.27,541.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:543.16,543.54 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:544.16,544.52 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:545.16,545.54 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:546.16,546.57 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:548.22,553.44 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:553.44,553.81 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:554.8,554.29 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:554.29,556.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:562.63,565.30 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:570.2,571.37 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:582.2,584.12 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:565.30,567.13 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:567.13,567.54 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:571.37,572.27 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:578.3,578.53 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:572.27,577.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:578.53,579.9 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:590.31,595.23 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:595.23,596.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:597.21,597.21 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:599.11,600.21 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:607.31,610.2 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:614.34,617.9 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:622.2,625.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:618.18,618.18 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:619.10,620.18 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:630.104,637.22 5 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:640.2,644.6 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:637.22,639.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:644.6,645.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:646.21,647.32 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:649.31,651.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:656.4,657.49 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:663.4,664.86 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:667.4,667.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:676.4,677.77 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:680.4,680.27 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:682.18,684.31 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:686.19,686.19 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:687.22,687.22 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:651.31,653.10 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:657.49,659.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:664.86,666.5 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:667.25,668.75 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:671.5,672.26 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:668.75,670.6 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:677.77,679.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:701.87,712.21 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:717.2,718.23 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:721.2,723.14 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:726.2,726.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:730.2,731.22 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:734.2,734.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:737.2,738.14 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:741.2,742.50 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:712.21,714.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:718.23,720.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:723.14,725.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:726.15,728.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:731.22,733.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:734.15,736.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:738.14,740.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:750.98,758.14 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:766.2,770.30 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:773.2,773.36 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:779.2,779.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:797.2,798.16 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:805.2,805.41 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:809.2,810.16 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:813.2,813.22 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:759.16,760.56 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:761.16,762.60 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:763.10,764.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:770.30,772.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:773.36,776.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:779.23,781.21 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:792.3,792.33 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:781.21,783.22 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:783.22,785.36 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:788.5,788.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:785.36,786.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:792.33,794.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:798.16,800.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:805.41,807.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:810.16,812.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:816.161,828.36 7 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:889.2,889.29 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:897.2,897.30 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:828.36,829.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:830.21,831.25 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:833.31,835.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:840.4,841.25 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:846.4,846.35 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:854.4,855.43 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:879.18,881.24 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:883.19,883.19 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:884.22,884.22 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:835.31,837.10 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:841.25,844.5 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:846.35,848.64 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:848.64,851.6 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:855.43,857.77 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:861.5,865.17 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:873.5,873.14 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:857.77,858.14 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:866.19,867.41 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:868.19,869.45 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:870.13,871.42 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:873.14,875.11 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:889.29,890.29 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:894.3,895.21 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:890.29,893.4 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:900.150,905.15 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:908.2,910.20 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:975.2,975.27 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:979.2,980.19 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:905.15,907.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:910.20,920.35 5 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:920.35,921.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:922.22,923.26 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:925.32,927.32 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:932.5,933.26 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:937.5,944.17 5 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:952.5,952.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:956.5,957.40 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:961.5,962.13 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:964.19,966.25 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:968.20,968.20 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:969.23,969.23 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:927.32,929.11 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:933.26,936.6 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:945.19,946.41 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:947.19,948.45 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:949.13,950.42 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:952.15,954.11 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:957.40,960.6 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:975.27,978.3 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:991.73,1004.34 10 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1018.2,1018.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1033.2,1037.6 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1004.34,1010.15 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1010.15,1013.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1013.9,1016.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1018.25,1031.3 9 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1037.6,1038.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1039.21,1040.22 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1042.31,1044.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1048.4,1055.28 5 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1058.4,1060.16 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1090.4,1090.39 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1096.4,1096.27 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1117.4,1120.16 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1160.4,1160.24 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1188.20,1189.25 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1196.4,1201.66 4 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1207.4,1207.11 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1211.4,1211.65 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1044.31,1046.10 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1055.28,1057.5 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1060.16,1061.28 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1085.5,1087.13 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1061.28,1065.95 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1069.6,1069.99 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1073.6,1083.50 6 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1065.95,1068.7 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1069.99,1072.7 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1090.39,1093.13 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1096.27,1098.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1109.5,1110.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1098.61,1100.13 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1101.43,1103.15 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1104.24,1105.25 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1111.32,1112.16 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1113.23,1114.24 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1120.16,1122.19 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1126.5,1127.27 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1122.19,1125.6 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1128.10,1132.33 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1132.33,1135.27 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1146.6,1146.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1150.6,1150.72 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1135.27,1137.7 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1137.12,1139.71 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1139.71,1141.8 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1146.25,1148.7 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1150.72,1152.20 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1155.7,1155.34 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1152.20,1154.8 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1160.24,1162.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1167.5,1171.30 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1163.36,1163.36 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1164.23,1165.24 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1171.30,1173.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1173.11,1175.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1176.10,1179.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1180.42,1182.14 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1183.23,1184.24 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1189.25,1193.10 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1201.66,1202.12 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1203.22,1203.22 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1204.23,1204.23 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1208.31,1208.31 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1209.22,1209.22 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1225.110,1230.48 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1244.2,1251.28 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1230.48,1233.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1234.35,1234.98 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1235.76,1237.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1238.63,1238.114 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1239.42,1239.102 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1240.76,1242.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1257.53,1261.48 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1270.2,1275.12 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1261.48,1264.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1265.36,1265.98 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1266.63,1266.92 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1267.42,1267.101 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1268.76,1268.119 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1281.55,1285.48 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1296.2,1301.12 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1285.48,1288.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1289.36,1289.100 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1290.63,1290.94 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1291.42,1291.103 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1292.76,1294.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1332.106,1342.6 5 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1342.6,1343.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1344.21,1345.22 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1347.31,1351.58 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1374.4,1374.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1379.25,1381.13 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1385.4,1385.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1390.19,1392.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1397.17,1399.26 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1403.4,1403.37 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1439.4,1439.22 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1447.4,1450.31 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1494.4,1494.85 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1351.58,1354.40 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1360.5,1360.42 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1364.5,1364.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1354.40,1356.6 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1360.42,1362.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1365.44,1366.66 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1367.21,1368.90 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1369.13,1370.82 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1375.30,1375.30 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1376.12,1376.12 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1381.13,1383.5 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1386.30,1386.30 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1387.12,1387.12 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1393.30,1393.30 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1394.12,1394.12 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1399.26,1401.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1403.37,1404.47 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1404.47,1412.19 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1412.19,1415.7 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1415.12,1418.28 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1418.28,1422.8 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1422.13,1430.18 5 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1430.18,1433.9 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1439.22,1440.32 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1444.5,1444.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1440.32,1443.6 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1450.31,1452.18 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1456.5,1456.46 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1462.5,1463.17 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1466.5,1466.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1470.5,1470.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1473.5,1473.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1479.5,1479.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1482.5,1482.48 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1490.5,1490.19 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1452.18,1453.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1456.46,1457.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1463.17,1465.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1466.17,1469.6 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1470.23,1471.14 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1473.25,1475.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1475.11,1477.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1479.25,1481.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1482.48,1488.70 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1494.85,1496.5 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1504.71,1511.15 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1534.2,1536.6 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1511.15,1512.19 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1512.19,1514.25 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1518.4,1518.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1522.4,1523.25 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1527.4,1530.80 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1514.25,1517.5 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1518.61,1521.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1523.25,1526.5 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1536.6,1537.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1538.21,1540.22 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1542.36,1544.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1588.4,1589.25 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1661.4,1662.39 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1665.4,1668.66 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1544.25,1546.67 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1564.5,1564.26 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1577.5,1577.46 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1584.5,1585.15 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1546.67,1547.13 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1548.23,1548.23 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1549.24,1549.24 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1564.26,1566.86 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1566.86,1568.7 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1577.46,1579.75 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1579.75,1581.7 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1589.25,1591.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1598.5,1599.29 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1602.5,1605.46 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1640.5,1640.45 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1657.5,1658.28 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1592.23,1594.24 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1595.13,1595.13 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1599.29,1601.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1605.46,1610.30 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1613.6,1616.81 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1619.6,1619.80 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1630.6,1630.26 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1610.30,1612.7 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1616.81,1618.7 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1619.80,1623.72 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1626.7,1627.56 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1623.72,1625.8 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1630.26,1632.52 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1632.52,1634.8 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1634.13,1636.8 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1640.45,1642.103 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1651.6,1652.36 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1642.103,1643.14 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1644.25,1646.26 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1647.38,1647.38 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1652.36,1655.7 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1662.39,1664.5 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1668.66,1669.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1670.21,1670.21 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1671.13,1671.13 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1679.53,1680.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1680.6,1682.24 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1685.3,1685.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1688.3,1688.55 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1682.24,1684.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1685.31,1687.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1688.55,1690.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1694.71,1696.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1699.2,1699.9 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1705.2,1711.33 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1714.2,1714.64 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1726.2,1726.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1696.23,1698.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1700.18,1701.36 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1702.10,1702.10 0 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1711.33,1713.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1714.64,1715.27 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1724.3,1724.52 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1715.27,1717.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1717.9,1723.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1731.53,1738.15 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1745.2,1745.35 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1750.2,1758.6 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1738.15,1743.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1745.35,1746.114 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1746.114,1748.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1758.6,1762.24 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1775.3,1775.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1780.3,1784.22 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1795.3,1795.42 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1817.3,1818.61 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1821.3,1821.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1847.3,1847.54 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1762.24,1764.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1768.4,1768.11 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1764.23,1766.5 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1769.22,1771.23 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1772.12,1772.12 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1775.31,1777.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1784.22,1785.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1785.31,1790.5 3 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1791.9,1793.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1795.42,1804.128 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1804.128,1815.5 6 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1818.61,1820.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1821.15,1823.21 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1831.4,1831.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1823.21,1829.5 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1832.21,1833.24 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1836.5,1836.49 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1839.5,1839.19 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1841.35,1843.13 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1833.24,1835.6 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1836.49,1838.6 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1847.54,1849.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1853.108,1854.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1857.2,1857.80 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1862.2,1862.33 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1873.2,1873.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1854.23,1856.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1857.80,1860.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1862.33,1864.10 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1865.20,1866.35 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1867.21,1868.14 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1869.11,1870.33 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1876.93,1878.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1881.2,1881.9 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1891.2,1898.33 5 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1902.2,1902.97 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1906.2,1906.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1878.23,1880.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1882.18,1883.36 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1884.24,1885.42 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1888.10,1888.10 0 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1885.42,1887.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1898.33,1901.3 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1902.97,1905.3 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1909.66,1914.133 3 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1917.2,1917.70 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1920.2,1921.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1914.133,1916.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1917.70,1919.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1926.79,1928.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1931.116,1933.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1936.84,1938.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1941.70,1943.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1947.83,1948.33 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1949.32,1951.17 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1954.3,1954.82 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1956.33,1958.81 2 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1960.29,1961.65 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1963.29,1964.65 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1966.10,1967.63 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1951.17,1953.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1972.115,1975.15 2 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1981.2,1984.19 4 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1987.2,1987.9 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1975.15,1976.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1976.17,1978.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1984.19,1986.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1988.24,1989.13 1 1 +github.com/ethereum/go-ethereum/les/downloader/downloader.go:1990.16,1991.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/modes.go:32.37,34.2 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:37.38,38.14 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:39.16,40.16 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:41.16,42.16 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:43.16,44.16 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:45.17,46.17 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:47.10,48.19 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:52.52,53.14 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:54.16,55.29 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:56.16,57.29 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:58.16,59.29 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:60.17,61.30 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:62.10,63.55 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:67.56,68.22 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:80.2,80.12 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:69.14,70.19 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:71.14,72.19 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:73.14,74.19 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:75.15,76.20 1 0 +github.com/ethereum/go-ethereum/les/downloader/modes.go:77.10,78.82 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:48.38,50.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:62.61,65.9 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:75.2,75.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:66.29,70.14 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:71.18,73.16 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:80.37,81.6 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:81.6,82.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:83.32,84.32 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:87.20,87.20 0 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:89.19,90.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:84.32,86.5 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:97.60,105.15 3 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:113.2,121.6 6 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:105.15,108.30 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:108.30,111.4 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:121.6,127.24 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:132.3,132.10 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:127.24,130.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:134.35,136.15 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:138.17,140.14 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:143.35,147.41 3 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:150.28,153.18 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:158.4,163.33 5 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:166.24,169.18 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:173.4,178.24 5 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:181.25,185.34 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:188.4,191.31 3 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:194.33,201.46 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:210.4,210.51 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:213.4,213.29 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:153.18,155.13 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:169.18,170.13 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:185.34,186.13 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:201.46,208.5 5 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:210.51,212.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:221.146,223.22 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:252.2,252.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:223.22,228.10 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:241.3,241.17 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:244.3,247.56 4 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:230.28,232.24 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:234.24,236.23 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:238.24,239.22 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:241.17,242.12 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:252.31,254.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:296.63,309.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:314.27,316.18 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:321.2,321.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:316.18,318.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:318.8,320.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:325.34,328.2 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:331.36,332.25 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:335.2,335.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:332.25,334.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:344.40,349.15 4 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:357.2,357.28 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:407.2,407.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:349.15,351.17 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:351.17,353.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:357.28,358.40 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:361.3,363.10 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:358.40,360.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:364.18,364.18 0 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:367.19,368.30 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:370.23,371.22 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:373.27,376.57 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:399.4,401.18 3 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:376.57,380.28 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:380.28,384.6 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:384.11,392.16 5 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:392.16,395.7 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:401.18,404.5 2 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:410.46,411.57 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:414.2,416.42 3 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:419.2,419.34 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:422.2,425.12 4 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:411.57,413.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:416.42,418.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:419.34,421.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:430.35,433.26 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:433.26,441.32 4 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:441.32,443.11 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:444.34,445.52 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:446.20,446.20 0 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:447.24,447.24 0 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:455.119,457.65 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:473.2,480.35 6 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:495.2,495.35 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:513.2,514.28 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:457.65,459.30 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:465.3,465.30 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:459.30,464.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:465.30,469.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:480.35,482.33 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:486.3,486.43 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:490.3,493.28 4 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:482.33,483.9 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:486.43,487.12 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:495.35,497.33 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:501.3,501.43 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:505.3,511.28 5 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:497.33,498.9 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:501.43,502.12 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:521.57,525.30 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:532.2,532.36 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:551.2,552.40 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:567.2,567.40 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:582.2,582.24 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:525.30,526.38 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:526.38,528.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:532.36,534.14 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:547.3,548.30 2 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:535.12,538.16 3 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:539.29,540.16 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:541.33,542.15 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:543.11,544.90 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:552.40,556.46 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:561.3,561.35 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:565.3,565.27 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:556.46,558.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:561.35,563.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:567.40,571.46 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:576.3,576.35 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:580.3,580.27 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:571.46,573.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:576.35,578.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:588.71,595.2 6 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:599.93,608.52 7 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:611.2,611.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:608.52,610.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/statesync.go:611.18,613.3 0 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:41.38,41.57 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:42.38,42.63 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:43.38,43.82 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:52.36,52.55 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:53.32,54.42 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:57.2,57.22 1 0 +github.com/ethereum/go-ethereum/les/downloader/types.go:54.42,56.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:59.35,59.102 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:67.39,67.58 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:68.39,68.65 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:69.39,69.84 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:77.37,77.56 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:78.37,78.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/types.go:79.37,79.80 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:41.83,52.2 3 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:56.45,62.6 2 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:62.6,63.10 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:64.43,65.37 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:66.45,68.24 2 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:69.30,70.20 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:74.4,75.29 2 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:85.4,85.37 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:70.20,72.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:76.20,80.6 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:81.32,82.25 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:85.37,87.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:93.89,95.16 2 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:99.2,101.12 2 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:119.2,119.20 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:95.16,97.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:101.12,105.7 3 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:105.7,106.11 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:107.30,108.39 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:109.24,111.11 2 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:112.29,114.11 2 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:144.48,145.24 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:145.24,149.7 3 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:149.7,150.11 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:151.15,153.13 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:154.27,155.11 1 0 +github.com/ethereum/go-ethereum/les/downloader/api.go:163.102,166.2 2 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:91.59,91.83 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:92.106,94.2 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:95.103,97.2 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:98.63,99.64 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:101.65,102.66 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:104.65,105.66 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:109.95,117.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:120.34,130.2 7 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:133.69,135.54 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:138.2,143.12 3 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:135.54,137.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:147.67,149.53 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:152.2,154.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:163.2,163.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:149.53,151.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:154.12,157.42 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:160.3,160.31 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:157.42,159.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:167.69,169.55 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:172.2,174.12 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:183.2,183.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:169.55,171.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:174.12,177.42 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:180.3,180.33 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:177.42,179.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:187.68,189.53 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:192.2,196.12 3 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:189.53,191.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:202.80,205.2 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:210.79,213.2 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:218.81,221.2 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:226.81,229.2 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:233.70,235.26 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:238.2,238.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:235.26,237.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:243.69,245.25 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:248.2,248.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:245.25,247.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:253.71,255.27 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:258.2,258.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:255.27,257.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:263.72,265.25 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:268.2,268.12 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:265.25,267.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:274.56,278.41 3 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:284.2,284.30 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:278.41,279.31 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:279.31,281.9 2 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:289.55,295.2 4 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:310.28,315.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:318.84,320.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:323.85,325.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:329.28,333.32 3 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:333.32,335.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:344.54,347.33 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:351.2,352.54 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:355.2,359.12 4 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:347.33,350.3 2 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:352.54,354.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:364.48,367.9 3 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:371.2,376.12 5 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:367.9,370.3 2 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:380.52,385.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:388.30,393.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:396.49,401.29 4 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:404.2,404.13 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:401.29,403.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/peer.go:409.63,410.39 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:413.2,413.44 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:416.2,416.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:410.39,412.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:413.44,415.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:421.61,422.39 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:425.2,425.44 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:428.2,428.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:422.39,424.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:425.44,427.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:433.64,434.39 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:437.2,437.44 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:440.2,440.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:434.39,436.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:437.44,439.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:445.65,446.39 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:449.2,449.44 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:452.2,452.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:446.39,448.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:449.44,451.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:458.160,467.29 4 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:478.2,480.27 3 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:467.29,468.59 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:468.59,469.20 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:473.4,473.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:469.20,472.5 2 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:490.39,492.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:494.49,496.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/peer.go:498.44,501.2 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:73.71,77.25 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:80.2,80.41 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:83.2,83.13 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:77.25,79.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:80.41,82.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:87.37,88.67 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:88.67,90.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:94.38,96.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:99.41,100.70 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:100.70,102.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:106.44,109.2 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:146.69,157.2 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:160.70,180.2 14 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:184.25,189.2 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:192.38,197.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:200.37,205.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:208.39,213.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:217.40,222.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:226.39,231.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:235.41,240.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:243.29,251.2 5 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:255.73,260.28 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:264.2,272.34 8 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:260.28,261.49 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:272.34,277.3 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:282.58,290.2 5 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:294.80,300.33 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:333.2,333.16 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:300.33,303.61 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:307.3,307.75 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:314.3,314.41 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:321.3,321.52 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:329.3,331.9 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:303.61,305.9 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:307.75,309.9 2 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:314.41,316.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:316.9,319.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:321.52,322.44 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:322.44,324.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:324.10,327.5 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:340.52,342.50 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:345.2,346.52 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:365.2,366.33 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:383.2,387.48 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:393.2,393.16 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:342.50,344.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:346.52,355.52 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:360.3,362.18 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:355.52,357.9 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:366.33,369.39 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:372.3,372.43 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:375.3,375.42 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:378.3,379.61 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:369.39,371.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:372.43,374.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:375.42,377.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:387.48,392.3 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:396.39,401.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:403.39,409.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:413.76,419.41 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:423.2,424.46 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:435.2,435.28 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:439.2,439.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:442.2,448.16 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:419.41,421.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:424.46,426.36 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:432.3,432.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:426.36,427.58 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:427.58,429.13 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:435.28,437.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:439.15,441.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:454.89,459.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:464.91,469.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:484.76,487.23 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:490.2,490.33 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:494.2,498.65 5 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:549.2,549.30 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:552.2,552.39 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:557.2,557.20 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:560.2,566.37 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:487.23,489.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:490.33,492.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:498.65,507.12 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:517.3,517.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:525.3,525.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:531.3,531.22 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:540.3,542.29 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:507.12,515.12 6 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:517.15,523.9 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:525.17,529.9 2 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:531.22,537.12 5 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:542.29,544.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:544.9,546.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:549.30,551.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:552.39,555.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:557.20,559.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:570.54,574.2 3 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:578.53,582.2 3 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:586.55,590.2 3 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:593.106,594.22 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:597.2,597.41 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:600.2,600.35 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:594.22,596.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:597.41,599.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:606.39,610.48 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:616.2,616.50 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:610.48,611.42 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:614.3,614.34 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:611.42,613.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:616.50,617.42 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:620.3,620.36 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:617.42,619.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:626.69,631.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:635.68,640.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:644.70,649.2 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:657.149,660.36 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:679.2,679.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:660.36,661.41 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:661.41,666.24 2 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:669.4,669.43 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:673.4,676.24 2 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:666.24,668.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:669.43,671.5 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:689.116,694.18 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:701.2,702.20 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:705.2,712.14 5 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:721.2,721.14 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:740.2,740.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:754.2,758.98 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:761.2,761.15 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:774.2,774.32 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:777.2,777.26 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:694.18,697.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:697.8,699.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:702.20,704.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:712.14,713.49 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:713.49,716.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:716.9,716.54 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:716.54,719.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:721.14,723.38 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:723.38,725.76 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:730.4,730.39 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:736.4,736.21 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:725.76,728.10 3 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:730.39,733.10 3 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:740.15,744.18 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:748.3,751.48 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:744.18,747.4 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:758.98,760.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:761.15,766.10 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:767.32,769.34 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:770.11,770.11 0 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:774.32,776.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:783.117,787.58 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:797.2,797.54 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:802.2,803.53 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:787.58,788.87 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:791.3,791.65 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:794.3,794.13 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:788.87,790.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:791.65,793.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:797.54,801.3 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:809.89,813.58 4 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:819.2,819.54 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:823.2,824.60 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:813.58,814.92 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:817.3,817.13 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:814.92,816.4 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:819.54,822.3 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:835.65,839.20 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:842.2,846.18 3 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:852.2,858.41 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:872.2,872.45 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:887.2,887.52 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:891.2,891.18 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:894.2,894.20 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:898.2,898.18 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:901.2,901.66 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:839.20,841.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:846.18,847.42 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:847.42,849.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:858.41,860.19 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:864.3,864.45 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:868.3,869.6 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:860.19,861.9 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:864.45,866.9 2 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:872.45,873.91 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:883.3,884.13 2 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:873.91,875.4 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:875.9,881.4 2 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:887.52,889.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:891.18,893.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:894.20,896.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/queue.go:898.18,900.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/queue.go:906.55,913.2 4 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:48.44,54.2 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:58.69,63.24 4 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:66.2,67.28 2 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:63.24,65.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:78.123,84.38 5 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:87.2,87.17 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:91.2,91.36 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:84.38,86.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:87.17,90.3 2 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:98.88,104.2 4 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:108.123,113.27 4 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:119.2,119.11 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:122.2,123.42 2 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:113.27,118.3 2 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:119.11,121.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:128.48,132.23 3 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:135.2,135.55 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:138.2,138.14 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:132.23,134.3 1 0 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:135.55,137.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:145.44,149.18 2 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:158.2,159.19 2 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:149.18,150.35 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:153.3,154.41 2 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:150.35,151.9 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:154.41,155.9 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:163.62,168.23 4 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:171.2,176.55 4 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:180.2,183.16 3 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:168.23,170.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:176.55,178.3 1 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:187.46,191.29 3 1 +github.com/ethereum/go-ethereum/les/downloader/resultstore.go:191.29,193.3 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:43.32,47.2 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:49.64,51.2 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:53.60,55.2 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:57.74,59.2 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:61.68,66.20 5 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:69.2,69.24 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:66.20,68.3 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:72.60,74.2 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:76.60,81.20 5 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:84.2,84.24 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:81.20,83.3 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:87.78,88.26 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:91.2,98.24 8 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:88.26,90.3 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:101.71,105.2 3 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:107.73,111.2 3 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:113.79,116.2 2 1 +github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:118.35,120.2 1 1 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:30.49,31.71 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:31.71,34.45 2 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:37.3,42.30 3 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:64.3,66.26 3 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:34.45,36.4 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:42.30,45.25 2 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:46.25,47.37 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:48.23,49.35 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:50.30,51.42 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:52.27,53.39 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:54.23,55.35 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:56.23,57.35 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:58.32,59.44 1 0 +github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:60.12,61.77 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:85.147,99.159 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:125.2,125.119 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:133.2,133.148 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:151.2,151.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:99.159,100.42 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:108.3,108.104 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:111.3,111.40 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:118.3,118.41 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:100.42,103.70 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:106.4,106.52 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:103.70,105.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:108.104,110.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:111.40,114.20 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:114.20,116.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:118.41,119.70 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:119.70,121.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:125.119,126.69 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:126.69,129.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:133.148,134.48 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:137.3,137.48 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:140.3,140.84 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:143.3,143.84 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:146.3,149.55 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:134.48,136.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:137.48,139.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:140.84,142.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:143.84,145.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:155.31,157.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:161.30,164.2 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:169.66,173.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:176.51,178.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:183.60,188.2 4 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:191.133,193.29 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:196.2,198.25 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:266.2,266.8 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:193.29,195.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:198.25,200.21 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:204.3,205.20 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:210.3,210.25 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:215.3,215.80 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:219.3,219.25 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:222.3,222.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:231.3,232.24 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:258.3,258.113 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:263.3,264.27 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:200.21,203.4 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:205.20,209.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:210.25,214.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:215.80,218.4 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:219.25,221.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:222.16,226.17 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:226.17,228.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:232.24,241.62 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:244.4,244.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:247.4,252.28 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:241.62,243.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:244.26,246.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:252.28,254.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:255.9,257.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:258.113,261.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:272.85,274.40 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:277.2,277.70 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:280.2,281.18 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:287.2,289.29 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:292.2,296.70 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:312.2,312.20 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:317.2,318.14 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:274.40,276.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:277.70,279.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:281.18,285.3 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:289.29,291.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:296.70,298.43 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:298.43,300.62 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:303.4,303.63 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:306.4,306.29 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:300.62,302.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:303.63,305.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:306.29,308.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:312.20,314.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:314.8,316.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:322.92,323.14 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:324.31,325.45 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:326.10,327.13 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:102.186,113.38 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:116.2,118.121 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:137.2,137.126 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:147.2,147.100 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:152.2,152.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:113.38,115.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:118.121,119.22 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:119.22,128.4 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:128.9,130.81 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:133.4,134.50 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:130.81,132.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:137.126,138.80 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:138.80,139.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:142.4,142.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:139.26,141.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:142.26,144.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:147.100,148.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:148.26,150.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:160.115,164.27 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:167.2,167.27 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:170.2,170.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:173.2,174.14 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:179.2,180.28 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:184.2,193.19 10 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:164.27,166.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:167.27,169.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:170.26,172.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:174.14,178.3 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:180.28,183.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:197.60,205.9 7 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:209.2,209.9 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:212.2,213.25 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:205.9,208.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:209.9,211.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:213.25,213.52 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:217.59,220.38 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:223.2,225.25 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:220.38,222.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:225.25,225.52 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:229.51,234.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:237.40,242.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:245.51,250.2 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:253.49,255.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:258.47,260.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:264.36,265.24 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:268.2,268.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:265.24,267.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:272.42,274.17 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:274.17,276.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:276.8,278.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:282.86,285.16 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:288.2,288.98 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:285.16,287.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:292.63,294.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:298.52,301.17 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:305.2,309.25 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:301.17,304.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:315.55,318.18 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:322.2,327.21 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:332.2,333.25 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:318.18,321.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:327.21,331.3 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:340.53,341.17 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:344.2,345.34 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:349.2,352.40 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:341.17,343.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:345.34,347.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:357.55,358.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:361.2,362.34 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:365.2,367.12 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:358.18,360.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:362.34,364.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:373.68,374.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:378.2,379.25 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:382.2,382.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:385.2,385.22 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:374.18,377.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:379.25,381.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:382.14,384.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:389.72,390.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:394.2,394.15 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:390.18,393.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:398.71,399.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:403.2,403.21 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:399.18,402.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:409.62,410.64 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:413.2,417.70 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:436.2,436.45 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:410.64,412.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:417.70,421.68 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:434.3,434.66 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:421.68,423.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:423.9,425.16 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:428.4,428.40 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:431.4,432.26 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:425.16,427.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:428.40,430.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:442.76,443.33 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:466.2,467.12 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:470.2,470.8 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:443.33,448.13 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:453.3,455.18 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:448.13,450.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:450.9,452.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:455.18,456.23 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:461.4,461.33 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:456.23,458.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:458.10,460.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:461.33,463.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:467.12,469.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:482.58,483.28 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:483.28,484.20 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:487.3,487.20 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:484.20,486.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:487.20,490.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:490.9,492.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:497.62,498.34 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:512.2,513.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:498.34,505.25 7 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:505.25,508.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:508.9,509.9 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:519.58,523.30 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:527.2,529.21 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:534.2,536.25 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:523.30,526.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:529.21,531.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:531.8,533.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:554.59,560.72 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:564.2,576.23 8 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:615.2,620.24 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:623.2,623.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:560.72,562.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:576.23,578.31 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:584.3,590.27 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:596.3,597.18 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:601.3,602.19 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:611.3,612.42 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:578.31,580.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:580.9,582.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:590.27,593.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:593.9,595.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:597.18,599.9 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:602.19,608.4 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:620.24,622.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:627.62,628.41 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:638.2,638.11 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:628.41,637.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:641.53,643.31 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:647.2,647.51 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:655.2,655.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:643.31,646.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:647.51,649.13 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:652.3,653.40 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:649.13,650.9 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:662.78,664.16 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:673.2,674.34 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:677.2,678.41 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:681.2,682.18 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:690.2,690.13 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:664.16,667.59 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:667.59,669.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:669.9,671.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:674.34,676.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:678.41,680.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:682.18,684.48 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:684.48,686.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:686.9,688.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:53.55,59.2 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:62.55,64.35 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:69.2,71.17 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:64.35,68.3 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:78.92,80.52 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:84.2,85.15 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:90.2,92.31 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:97.2,100.16 4 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:80.52,82.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:85.15,87.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:92.31,93.57 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:93.57,95.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:104.82,106.56 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:109.2,110.20 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:113.2,114.12 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:106.56,108.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:110.20,112.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/service.go:118.25,120.2 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/status.go:48.36,59.2 10 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:52.79,54.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:122.54,124.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:127.54,129.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:134.115,139.9 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:144.2,145.76 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:152.2,153.9 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:158.2,158.41 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:139.9,141.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:141.8,143.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:145.76,146.13 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:149.3,150.22 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:146.13,148.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:153.9,155.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:155.8,157.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:163.78,164.42 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:167.2,172.12 6 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:164.42,166.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:184.53,191.2 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:195.80,202.2 5 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:209.72,218.41 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:227.2,227.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:231.2,231.31 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:234.2,234.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:241.2,241.22 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:218.41,220.82 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:223.3,225.14 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:220.82,222.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:227.16,229.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:231.31,233.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:234.16,235.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:239.3,239.27 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:235.18,237.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:246.57,253.41 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:263.2,263.31 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:266.2,266.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:273.2,273.12 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:253.41,255.59 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:258.3,260.14 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:255.59,257.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:263.31,265.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:266.16,267.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:271.3,271.27 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:267.18,269.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:277.70,286.29 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:302.2,302.49 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:306.2,309.11 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:312.2,314.22 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:321.2,321.8 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:286.29,288.19 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:288.19,291.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:291.9,294.22 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:299.4,299.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:294.22,296.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:296.10,298.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:302.49,305.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:309.11,311.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:314.22,315.28 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:315.28,316.33 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:316.33,318.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:325.55,332.2 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:339.122,347.21 6 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:350.2,350.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:358.2,358.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:361.2,367.20 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:370.2,370.12 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:373.2,373.12 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:347.21,349.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:350.16,353.23 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:356.3,356.61 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:353.23,355.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:358.14,360.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:367.20,369.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:370.12,372.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:378.74,385.22 7 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:385.22,386.28 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:386.28,387.33 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:387.33,389.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:395.77,400.2 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:403.34,404.41 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:404.41,405.15 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:408.3,410.14 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:405.15,407.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:415.36,416.41 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:416.41,417.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:420.3,421.27 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:425.3,427.14 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:417.16,419.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:421.27,424.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:432.57,433.36 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:433.36,436.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:440.51,441.9 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:444.2,444.9 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:441.9,443.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:444.9,446.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:454.77,457.70 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:460.2,460.46 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:464.2,469.22 6 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:457.70,459.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:460.46,463.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:474.51,476.15 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:479.2,480.43 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:484.2,485.13 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:476.15,478.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:480.43,483.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:491.79,492.45 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:495.2,496.78 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:501.2,502.8 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:492.45,494.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:496.78,500.3 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:507.57,508.26 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:508.26,510.10 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:515.3,515.64 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:510.10,514.4 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:515.64,516.23 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:523.4,524.20 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:516.23,522.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:526.8,529.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:533.53,534.50 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:534.50,535.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:535.14,537.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:537.9,538.52 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:538.52,541.29 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:546.5,547.25 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:541.29,545.6 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:547.25,548.31 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:548.31,549.36 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:549.36,551.8 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:561.42,566.16 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:566.16,568.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:574.50,575.47 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:580.2,580.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:575.47,577.48 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:578.3,578.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:577.48,577.72 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:585.46,588.2 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:593.52,600.31 7 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:600.31,602.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:608.95,610.13 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:613.2,613.32 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:610.13,612.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:619.91,620.18 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:623.2,623.29 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:620.18,622.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:628.134,635.21 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:645.2,645.13 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:649.2,649.10 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:635.21,639.18 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:639.18,641.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:641.9,643.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:645.13,648.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:658.71,665.13 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:684.2,685.21 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:692.2,692.38 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:665.13,667.25 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:670.3,670.20 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:667.25,669.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:670.20,671.23 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:674.4,675.40 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:671.23,673.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:676.9,678.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:679.8,680.20 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:680.20,682.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:685.21,687.25 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:690.3,690.49 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance.go:687.25,689.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:62.171,80.82 6 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:85.2,85.122 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:103.2,103.120 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:125.2,127.12 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:138.2,138.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:80.82,83.3 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:85.122,87.15 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:91.3,93.25 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:96.3,96.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:99.3,99.25 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:87.15,89.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:93.25,95.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:96.14,98.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:99.25,101.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:103.120,107.22 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:107.22,113.4 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:113.9,115.81 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:118.4,118.52 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:115.81,117.5 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:127.12,128.7 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:128.7,129.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:130.49,132.71 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:133.19,134.11 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:142.34,146.100 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:154.2,154.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:146.100,147.78 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:147.78,152.4 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:158.53,162.52 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:172.2,174.57 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:162.52,164.101 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:170.3,170.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:164.101,165.91 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:165.91,168.5 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:178.100,180.2 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:183.82,188.2 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:192.61,198.13 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:203.2,203.13 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:198.13,200.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:200.8,202.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:203.13,205.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:205.8,207.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:212.64,217.2 3 0 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:221.109,222.25 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:222.25,224.45 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:227.3,227.16 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:231.3,231.9 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:224.45,226.4 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:227.16,230.4 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:239.108,251.33 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:254.2,254.41 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:257.2,257.10 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:251.33,253.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:254.41,256.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:261.87,262.51 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:262.51,264.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:264.8,266.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:271.99,272.9 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:275.2,275.58 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:272.9,274.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:279.84,287.17 6 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:290.2,290.12 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:295.2,295.14 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:287.17,289.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:290.12,292.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:292.8,294.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:295.14,297.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:297.8,299.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:69.68,81.2 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:83.27,85.2 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:87.46,89.9 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:92.2,92.40 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:89.9,91.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:95.51,97.9 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:100.2,100.57 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:103.2,106.55 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:97.9,99.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:100.57,102.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:109.66,111.35 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:114.2,114.109 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:111.35,113.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:117.57,122.2 4 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:124.75,127.11 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:130.2,132.33 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:135.2,135.49 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:138.2,139.10 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:127.11,129.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:132.33,134.3 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:135.49,137.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:142.73,145.16 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:148.2,149.30 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:145.16,147.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:152.51,156.2 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:160.92,161.19 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:164.2,170.16 5 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:184.2,184.8 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:161.19,163.3 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:170.16,172.30 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:175.3,176.51 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:179.3,180.30 2 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:172.30,174.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:176.51,178.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:180.30,182.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:188.105,195.16 5 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:195.16,197.30 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:200.3,203.57 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:206.3,206.23 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:197.30,199.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:203.57,204.12 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:206.23,208.4 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:212.29,213.6 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:213.6,214.10 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:215.41,216.20 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:217.21,218.10 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:225.33,231.42 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:246.2,246.27 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:249.2,249.120 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:231.42,233.19 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:233.19,236.66 3 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:239.4,239.81 1 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:236.66,238.5 1 0 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:239.81,242.5 2 1 +github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:246.27,248.3 1 1 +github.com/ethereum/go-ethereum/mobile/params.go:31.30,33.2 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:36.30,38.16 2 0 +github.com/ethereum/go-ethereum/mobile/params.go:41.2,41.20 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:38.16,39.13 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:45.30,47.16 2 0 +github.com/ethereum/go-ethereum/mobile/params.go:50.2,50.20 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:47.16,48.13 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:54.30,56.16 2 0 +github.com/ethereum/go-ethereum/mobile/params.go:59.2,59.20 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:56.16,57.13 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:63.29,65.16 2 0 +github.com/ethereum/go-ethereum/mobile/params.go:68.2,68.20 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:65.16,66.13 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:72.29,74.16 2 0 +github.com/ethereum/go-ethereum/mobile/params.go:77.2,77.20 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:74.16,75.13 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:81.33,83.16 2 0 +github.com/ethereum/go-ethereum/mobile/params.go:86.2,86.20 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:83.16,84.13 1 0 +github.com/ethereum/go-ethereum/mobile/params.go:91.36,93.46 2 1 +github.com/ethereum/go-ethereum/mobile/params.go:100.2,100.14 1 1 +github.com/ethereum/go-ethereum/mobile/params.go:93.46,96.17 3 1 +github.com/ethereum/go-ethereum/mobile/params.go:96.17,97.45 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:37.48,39.16 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:42.2,42.12 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:39.16,41.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:52.35,54.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:57.33,59.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:62.33,64.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:72.35,74.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:77.33,79.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:82.33,84.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:92.53,96.74 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:99.2,99.15 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:96.74,98.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:103.46,105.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:108.54,112.63 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:115.2,115.15 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:112.63,114.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:119.47,122.2 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:125.34,127.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:129.42,129.79 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:130.42,130.78 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:131.42,131.80 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:132.42,132.73 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:133.42,133.75 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:134.42,134.80 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:135.42,135.75 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:136.42,136.81 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:137.42,137.76 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:138.42,138.77 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:139.42,139.76 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:140.42,140.73 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:141.42,141.67 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:142.42,142.78 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:143.42,143.75 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:144.42,144.75 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:150.30,152.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:155.60,156.42 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:159.2,159.39 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:156.42,158.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:168.51,172.73 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:175.2,175.15 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:172.73,174.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:179.45,181.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:184.52,188.62 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:191.2,191.15 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:188.62,190.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:195.46,198.2 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:201.33,203.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:205.49,205.87 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:206.49,206.86 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:207.49,207.88 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:208.49,208.81 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:209.49,209.83 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:210.49,210.88 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:211.49,211.83 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:212.49,212.89 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:213.49,213.84 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:214.49,214.85 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:215.49,215.84 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:216.49,216.81 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:217.49,217.75 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:218.49,218.86 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:219.49,219.82 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:220.49,220.81 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:221.49,221.85 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:222.49,222.86 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:223.49,223.97 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:224.57,226.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:235.115,237.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:241.123,242.15 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:245.2,245.144 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:242.15,244.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:249.63,253.71 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:256.2,256.16 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:253.71,255.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:260.52,262.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:265.64,269.60 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:272.2,272.16 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:269.60,271.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:276.53,279.2 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:282.40,284.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:286.46,286.69 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:287.46,287.75 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:288.46,288.82 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:289.46,289.79 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:290.46,290.77 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:292.42,292.72 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:293.42,293.74 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:295.41,296.33 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:299.2,299.12 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:296.33,298.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:302.100,304.20 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:307.2,308.33 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:304.20,306.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:315.37,317.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:320.68,321.40 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:324.2,324.42 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:321.40,323.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:333.55,337.75 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:340.2,340.15 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:337.75,339.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:344.47,346.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:349.56,353.64 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:356.2,356.15 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:353.64,355.3 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:360.48,363.2 2 0 +github.com/ethereum/go-ethereum/mobile/types.go:366.35,368.2 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:370.49,370.81 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:371.49,371.79 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:372.49,372.94 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:373.49,373.83 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:374.49,374.81 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:375.49,375.83 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:376.49,376.95 1 0 +github.com/ethereum/go-ethereum/mobile/types.go:377.49,377.84 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:34.33,36.2 1 1 +github.com/ethereum/go-ethereum/mobile/big.go:40.54,42.14 2 0 +github.com/ethereum/go-ethereum/mobile/big.go:45.2,45.19 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:42.14,44.3 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:49.37,51.2 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:54.35,56.2 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:60.36,62.2 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:66.40,68.2 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:71.37,73.2 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:81.30,83.2 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:90.49,92.2 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:98.36,102.2 1 1 +github.com/ethereum/go-ethereum/mobile/big.go:105.31,107.2 1 1 +github.com/ethereum/go-ethereum/mobile/big.go:110.61,111.43 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:114.2,114.40 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:111.43,113.3 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:118.57,119.43 1 1 +github.com/ethereum/go-ethereum/mobile/big.go:122.2,123.12 2 1 +github.com/ethereum/go-ethereum/mobile/big.go:119.43,121.3 1 0 +github.com/ethereum/go-ethereum/mobile/big.go:127.46,129.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:37.60,39.61 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:42.2,42.15 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:39.61,41.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:46.55,48.38 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:51.2,51.15 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:48.38,50.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:55.44,56.54 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:59.2,60.12 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:56.54,58.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:64.34,66.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:69.42,71.40 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:74.2,74.56 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:77.2,78.16 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:81.2,82.12 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:71.40,73.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:74.56,76.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:78.16,80.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:86.32,88.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:91.32,93.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:99.34,103.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:106.31,108.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:111.29,113.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:116.55,117.41 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:120.2,120.36 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:117.41,119.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:124.51,125.41 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:128.2,129.12 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:125.41,127.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:133.37,135.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:143.69,145.61 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:148.2,148.15 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:145.61,147.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:152.64,154.38 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:157.2,157.15 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:154.38,156.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:161.50,162.60 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:165.2,166.12 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:162.60,164.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:170.37,172.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:175.48,177.46 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:180.2,180.62 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:183.2,184.16 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:187.2,188.12 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:177.46,179.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:180.62,182.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:184.16,186.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:192.35,194.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:197.35,199.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:205.40,209.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:212.37,214.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:217.32,219.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:222.64,223.44 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:226.2,226.42 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:223.44,225.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:230.60,231.44 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:234.2,235.12 2 0 +github.com/ethereum/go-ethereum/mobile/common.go:231.44,233.3 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:239.46,241.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:244.35,246.2 1 0 +github.com/ethereum/go-ethereum/mobile/common.go:249.46,251.2 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:88.34,91.2 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:94.55,96.2 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:99.54,102.2 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:105.41,107.2 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:115.73,117.19 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:120.2,120.26 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:123.2,123.71 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:127.2,127.31 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:132.2,148.16 3 0 +github.com/ethereum/go-ethereum/mobile/geth.go:152.2,155.34 3 0 +github.com/ethereum/go-ethereum/mobile/geth.go:205.2,205.28 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:222.2,222.29 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:117.19,119.3 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:120.26,122.3 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:123.71,125.3 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:127.31,129.3 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:148.16,150.3 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:155.34,158.81 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:162.3,162.49 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:169.3,169.49 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:176.3,176.49 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:183.3,183.48 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:190.3,190.52 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:197.3,197.48 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:158.81,160.4 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:162.49,164.37 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:164.37,166.5 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:169.49,171.37 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:171.37,173.5 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:176.49,178.37 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:178.37,180.5 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:183.48,185.37 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:185.37,187.5 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:190.52,192.37 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:192.37,194.5 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:197.48,199.37 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:199.37,201.5 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:205.28,212.17 7 0 +github.com/ethereum/go-ethereum/mobile/geth.go:216.3,216.36 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:212.17,214.4 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:216.36,217.118 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:217.118,219.5 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:227.30,229.2 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:232.30,235.2 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:238.70,240.16 2 0 +github.com/ethereum/go-ethereum/mobile/geth.go:243.2,243.55 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:240.16,242.3 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:247.40,249.2 1 0 +github.com/ethereum/go-ethereum/mobile/geth.go:252.42,254.2 1 0 +github.com/ethereum/go-ethereum/mobile/logger.go:26.30,28.2 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:32.49,32.70 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:33.49,33.72 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:34.49,34.73 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:35.49,35.70 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:36.49,36.83 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:37.49,37.82 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:38.49,38.78 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:39.45,41.39 2 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:44.2,44.25 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:41.39,43.3 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:52.47,52.68 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:53.47,53.70 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:54.47,54.80 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:55.47,55.86 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:56.47,56.87 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:64.33,66.2 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:69.63,70.41 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:73.2,73.40 1 0 +github.com/ethereum/go-ethereum/mobile/p2p.go:70.41,72.3 1 0 +github.com/ethereum/go-ethereum/mobile/context.go:37.28,41.2 1 0 +github.com/ethereum/go-ethereum/mobile/context.go:48.41,54.2 2 0 +github.com/ethereum/go-ethereum/mobile/context.go:61.64,67.2 2 0 +github.com/ethereum/go-ethereum/mobile/context.go:74.52,80.2 2 0 +github.com/ethereum/go-ethereum/mobile/discover.go:56.46,58.16 2 0 +github.com/ethereum/go-ethereum/mobile/discover.go:61.2,61.26 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:58.16,60.3 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:68.34,72.2 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:75.31,77.2 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:80.29,82.2 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:85.57,86.40 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:89.2,89.36 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:86.40,88.3 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:93.53,94.40 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:97.2,98.12 2 0 +github.com/ethereum/go-ethereum/mobile/discover.go:94.40,96.3 1 0 +github.com/ethereum/go-ethereum/mobile/discover.go:102.39,104.2 1 0 +github.com/ethereum/go-ethereum/mobile/init.go:28.13,34.2 2 1 +github.com/ethereum/go-ethereum/mobile/ethclient.go:34.73,37.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:40.92,43.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:47.96,48.16 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:52.2,53.30 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:48.16,51.3 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:57.95,60.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:64.99,65.16 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:69.2,70.32 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:65.16,68.3 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:74.101,78.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:82.134,85.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:88.94,91.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:94.113,98.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:102.103,105.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:109.88,111.24 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:114.2,114.41 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:111.24,113.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:126.123,130.16 3 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:134.2,134.12 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:148.2,148.35 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:130.16,132.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:134.12,135.7 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:135.7,136.11 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:137.24,138.39 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:140.31,141.19 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:144.5,144.11 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:141.19,143.6 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:155.113,156.16 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:160.2,161.33 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:156.16,159.3 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:166.123,167.16 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:170.2,170.88 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:167.16,169.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:175.106,176.16 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:179.2,179.75 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:176.16,178.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:184.107,185.16 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:189.2,190.29 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:185.16,188.3 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:196.94,198.16 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:202.2,203.25 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:206.2,206.24 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:198.16,200.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:203.25,205.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:217.149,221.16 3 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:225.2,225.12 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:239.2,239.35 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:221.16,223.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:225.12,226.7 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:226.7,227.11 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:228.21,229.37 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:231.31,232.19 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:235.5,235.11 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:232.19,234.6 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:245.106,248.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:251.116,253.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:256.99,258.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:262.100,265.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:268.89,271.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:281.107,282.16 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:285.2,285.73 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:282.16,284.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:290.100,292.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:296.82,299.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:305.88,308.2 2 0 +github.com/ethereum/go-ethereum/mobile/ethclient.go:314.80,316.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:36.38,38.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:46.28,48.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:50.43,50.76 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:51.43,51.72 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:52.43,52.79 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:53.43,53.76 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:54.43,54.66 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:55.38,56.33 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:59.2,59.12 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:56.33,58.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:62.48,62.82 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:63.48,63.77 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:64.48,64.83 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:65.48,65.80 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:66.48,66.89 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:67.45,68.20 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:72.2,72.31 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:68.20,71.3 2 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:81.55,81.97 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:82.55,82.96 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:83.55,83.96 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:84.55,84.98 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:85.55,85.102 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:86.55,86.99 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:87.55,87.103 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:88.55,88.97 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:89.55,89.102 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:90.55,90.99 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:91.55,91.103 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:92.55,92.99 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:93.55,93.103 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:94.55,94.100 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:95.55,95.99 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:101.34,105.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:108.31,110.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:113.29,115.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:118.59,119.41 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:122.2,122.38 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:119.41,121.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:126.55,127.41 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:130.2,131.12 2 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:127.41,129.3 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:135.41,137.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:145.36,147.2 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:149.50,149.88 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:150.50,150.86 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:151.50,151.91 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:152.50,152.85 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:154.59,154.100 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:155.59,155.96 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:156.59,156.103 1 0 +github.com/ethereum/go-ethereum/mobile/ethereum.go:157.59,157.94 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:41.32,43.2 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:45.53,45.70 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:46.53,46.77 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:47.53,47.72 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:48.53,48.78 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:49.53,49.101 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:50.53,50.86 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:51.53,51.84 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:52.53,52.84 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:53.53,53.78 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:54.53,54.82 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:55.53,55.70 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:56.53,56.70 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:57.53,57.70 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:58.53,58.70 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:59.48,61.37 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:64.2,64.18 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:61.37,63.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:66.49,68.37 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:71.2,71.18 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:68.37,70.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:73.49,75.37 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:78.2,78.18 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:75.37,77.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:80.49,82.37 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:85.2,85.18 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:82.37,84.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:87.47,87.100 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:88.47,88.101 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:89.47,89.101 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:90.47,90.93 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:91.49,93.37 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:96.2,96.18 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:93.37,95.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:98.50,100.37 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:103.2,103.18 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:100.37,102.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:105.50,107.37 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:110.2,110.18 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:107.37,109.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:112.50,114.37 2 1 +github.com/ethereum/go-ethereum/mobile/interface.go:117.2,117.18 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:114.37,116.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:119.50,119.79 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:120.50,120.81 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:122.43,122.67 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:123.43,123.69 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:124.43,124.69 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:125.43,125.71 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:126.43,126.69 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:127.43,127.71 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:128.43,128.77 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:129.43,129.79 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:130.43,130.74 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:131.43,131.76 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:132.43,132.67 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:133.43,133.69 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:134.43,134.68 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:135.43,135.70 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:136.43,136.68 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:137.43,137.70 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:138.43,138.68 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:139.43,139.70 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:140.43,140.68 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:141.43,141.70 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:142.43,142.69 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:143.43,143.71 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:144.43,144.69 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:145.43,145.71 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:146.43,146.69 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:147.43,147.71 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:148.43,148.71 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:149.43,149.73 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:151.47,151.75 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:152.47,152.85 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:153.47,153.77 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:154.47,154.89 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:155.47,155.77 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:156.47,156.90 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:157.47,157.95 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:158.47,158.99 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:159.47,159.89 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:160.47,160.93 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:161.47,161.75 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:162.47,162.76 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:163.47,163.76 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:164.47,164.76 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:165.41,168.25 3 1 +github.com/ethereum/go-ethereum/mobile/interface.go:171.2,171.16 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:168.25,170.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:173.42,176.25 3 1 +github.com/ethereum/go-ethereum/mobile/interface.go:179.2,179.16 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:176.25,178.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:181.42,184.25 3 1 +github.com/ethereum/go-ethereum/mobile/interface.go:187.2,187.16 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:184.25,186.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:189.42,192.25 3 1 +github.com/ethereum/go-ethereum/mobile/interface.go:195.2,195.16 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:192.25,194.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:197.40,199.2 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:200.41,202.2 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:203.41,205.2 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:206.41,208.2 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:209.42,212.25 3 1 +github.com/ethereum/go-ethereum/mobile/interface.go:215.2,215.16 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:212.25,214.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:217.43,220.25 3 1 +github.com/ethereum/go-ethereum/mobile/interface.go:223.2,223.16 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:220.25,222.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:225.43,228.25 3 1 +github.com/ethereum/go-ethereum/mobile/interface.go:231.2,231.16 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:228.25,230.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:233.43,236.25 3 1 +github.com/ethereum/go-ethereum/mobile/interface.go:239.2,239.16 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:236.25,238.3 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:241.43,241.84 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:242.43,242.87 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:250.42,252.2 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:255.33,257.2 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:262.65,263.42 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:266.2,266.50 1 1 +github.com/ethereum/go-ethereum/mobile/interface.go:263.42,265.3 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:270.62,271.42 1 0 +github.com/ethereum/go-ethereum/mobile/interface.go:274.2,275.12 2 0 +github.com/ethereum/go-ethereum/mobile/interface.go:271.42,273.3 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:33.38,33.72 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:34.38,34.70 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:35.38,35.59 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:36.38,36.73 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:37.38,37.68 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:38.38,38.67 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:39.38,39.71 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:40.38,40.65 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:46.27,48.2 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:51.51,52.39 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:55.2,55.33 1 0 +github.com/ethereum/go-ethereum/mobile/vm.go:52.39,54.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:57.31,59.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:62.63,63.43 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:66.2,66.41 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:63.43,65.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:70.59,71.43 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:74.2,75.12 2 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:71.43,73.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:79.41,81.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:84.35,86.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:92.65,94.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:97.55,99.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:102.45,104.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:108.78,110.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:114.89,116.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:119.102,120.20 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:123.2,124.16 2 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:127.2,127.34 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:120.20,122.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:124.16,126.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:133.118,135.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:139.131,140.20 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:143.2,144.16 2 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:147.2,147.34 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:140.20,142.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:144.16,146.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:151.71,153.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:156.50,158.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:167.91,169.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:173.69,175.16 2 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:178.2,178.31 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:175.16,177.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:182.93,184.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:187.105,189.2 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:192.109,194.16 2 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:197.2,197.27 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:194.16,196.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:201.95,203.16 2 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:206.2,207.16 2 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:210.2,210.27 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:203.16,205.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:207.16,209.3 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:215.100,217.16 2 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:220.2,220.31 1 0 +github.com/ethereum/go-ethereum/mobile/accounts.go:217.16,219.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:42.102,44.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:47.2,47.31 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:44.16,46.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:56.30,58.2 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:60.43,60.71 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:61.43,61.76 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:67.52,67.83 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:68.53,68.76 0 0 +github.com/ethereum/go-ethereum/mobile/bind.go:69.52,69.91 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:70.52,70.85 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:79.38,81.2 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:85.103,87.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:90.2,91.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:94.2,94.34 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:87.16,89.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:91.16,93.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:97.49,97.84 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:98.49,98.83 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:99.49,99.84 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:100.49,100.87 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:101.49,101.85 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:110.50,110.83 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:111.50,111.89 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:112.47,113.98 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:113.98,115.17 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:118.3,118.21 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:115.17,117.4 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:121.56,121.90 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:122.56,122.93 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:123.56,123.94 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:124.56,124.95 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:137.151,140.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:143.2,144.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:147.2,151.8 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:140.16,142.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:144.16,146.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:156.112,158.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:161.2,164.8 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:158.16,160.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:167.47,167.77 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:168.52,169.23 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:172.2,172.33 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:169.23,171.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:177.102,180.87 3 0 +github.com/ethereum/go-ethereum/mobile/bind.go:183.2,184.12 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:180.87,182.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:188.114,190.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:193.2,193.33 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:190.16,192.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:197.101,199.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:202.2,202.33 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:199.16,201.3 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:207.81,209.16 2 0 +github.com/ethereum/go-ethereum/mobile/bind.go:212.2,212.33 1 0 +github.com/ethereum/go-ethereum/mobile/bind.go:209.16,211.3 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:32.30,34.2 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:37.56,38.39 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:41.2,41.27 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:38.39,40.3 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:45.52,46.39 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:49.2,50.12 2 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:46.39,48.3 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:54.35,56.2 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:62.29,64.2 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:67.51,68.41 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:71.2,71.29 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:68.41,70.3 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:75.47,76.41 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:79.2,80.12 2 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:76.41,78.3 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:84.34,86.2 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:92.32,94.2 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:97.61,98.44 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:101.2,101.50 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:98.44,100.3 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:105.57,106.44 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:109.2,110.12 2 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:106.44,108.3 1 0 +github.com/ethereum/go-ethereum/mobile/primitives.go:114.37,116.2 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:85.75,91.2 4 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:95.65,99.61 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:103.2,105.12 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:99.61,101.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:109.42,113.23 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:116.2,116.19 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:113.23,115.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:120.36,124.43 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:129.2,130.40 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:138.2,139.16 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:146.2,149.19 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:157.2,157.21 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:161.2,170.35 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:173.2,175.29 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:182.2,182.12 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:124.43,126.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:130.40,135.3 4 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:139.16,145.3 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:149.19,151.30 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:154.3,154.46 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:151.30,153.4 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:157.21,159.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:170.35,172.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:175.29,177.20 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:177.20,180.4 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:185.72,188.33 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:195.2,196.16 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:212.2,212.36 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:188.33,189.38 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:192.3,192.9 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:189.38,191.4 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:196.16,202.20 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:207.3,207.40 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:202.20,205.4 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:207.40,210.4 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:216.51,218.16 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:222.2,222.71 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:218.16,220.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:226.46,227.16 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:230.2,230.20 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:233.2,233.37 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:239.2,239.12 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:227.16,229.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:230.20,232.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:233.37,238.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:243.29,247.2 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:249.31,250.23 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:255.2,257.24 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:261.2,261.22 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:265.2,271.33 5 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:250.23,252.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:257.24,260.3 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:261.22,264.3 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:275.73,279.20 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:284.2,285.71 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:288.2,293.12 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:279.20,281.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:285.71,287.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:297.40,299.20 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:303.2,303.23 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:299.20,302.3 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:307.70,311.19 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:315.2,316.71 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:319.2,324.12 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:311.19,313.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:316.71,318.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:328.31,332.19 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:332.19,333.22 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:333.22,335.4 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:340.39,342.15 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:346.2,346.18 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:342.15,345.3 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:350.40,352.2 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:355.39,357.2 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:360.40,363.2 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:366.107,370.25 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:373.2,373.32 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:370.25,372.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:377.73,378.25 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:381.2,381.12 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:378.25,380.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:384.77,386.30 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:389.2,395.23 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:386.30,388.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:407.71,409.37 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:412.2,412.44 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:409.37,411.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:416.80,418.18 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:422.2,423.16 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:427.2,427.48 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:434.2,434.38 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:438.2,438.39 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:442.2,442.63 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:418.18,421.3 2 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:423.16,426.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:427.48,432.3 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:434.38,437.3 2 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:438.39,441.3 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:446.26,449.3 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:457.54,460.2 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:462.59,464.2 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:466.53,467.71 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:467.71,468.65 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:473.3,481.72 6 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:468.65,471.4 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:494.63,496.2 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:499.50,503.24 3 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:506.2,507.16 2 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:511.2,513.12 3 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:503.24,505.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:507.16,510.3 2 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:516.35,520.24 3 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:523.2,527.12 5 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:520.24,522.3 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:532.92,533.76 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:537.2,538.33 2 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:542.2,542.27 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:549.2,549.12 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:533.76,535.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:538.33,540.3 1 0 +github.com/ethereum/go-ethereum/node/rpcstack.go:542.27,543.83 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:543.83,544.71 1 1 +github.com/ethereum/go-ethereum/node/rpcstack.go:544.71,546.5 1 0 +github.com/ethereum/go-ethereum/node/config.go:212.39,214.21 1 1 +github.com/ethereum/go-ethereum/node/config.go:218.2,218.31 1 1 +github.com/ethereum/go-ethereum/node/config.go:225.2,225.43 1 1 +github.com/ethereum/go-ethereum/node/config.go:231.2,231.18 1 1 +github.com/ethereum/go-ethereum/node/config.go:214.21,216.3 1 1 +github.com/ethereum/go-ethereum/node/config.go:218.31,219.48 1 0 +github.com/ethereum/go-ethereum/node/config.go:222.3,222.33 1 0 +github.com/ethereum/go-ethereum/node/config.go:219.48,221.4 1 0 +github.com/ethereum/go-ethereum/node/config.go:225.43,226.22 1 1 +github.com/ethereum/go-ethereum/node/config.go:229.3,229.45 1 1 +github.com/ethereum/go-ethereum/node/config.go:226.22,228.4 1 1 +github.com/ethereum/go-ethereum/node/config.go:235.34,236.21 1 1 +github.com/ethereum/go-ethereum/node/config.go:239.2,239.43 1 1 +github.com/ethereum/go-ethereum/node/config.go:236.21,238.3 1 1 +github.com/ethereum/go-ethereum/node/config.go:243.57,244.28 1 0 +github.com/ethereum/go-ethereum/node/config.go:250.2,251.29 2 0 +github.com/ethereum/go-ethereum/node/config.go:244.28,246.29 2 0 +github.com/ethereum/go-ethereum/node/config.go:246.29,247.34 1 0 +github.com/ethereum/go-ethereum/node/config.go:256.40,257.22 1 0 +github.com/ethereum/go-ethereum/node/config.go:260.2,260.53 1 0 +github.com/ethereum/go-ethereum/node/config.go:257.22,259.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:264.35,267.2 2 0 +github.com/ethereum/go-ethereum/node/config.go:271.38,272.20 1 0 +github.com/ethereum/go-ethereum/node/config.go:275.2,275.49 1 0 +github.com/ethereum/go-ethereum/node/config.go:272.20,274.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:279.33,282.2 2 0 +github.com/ethereum/go-ethereum/node/config.go:286.39,288.2 1 0 +github.com/ethereum/go-ethereum/node/config.go:291.36,294.46 2 1 +github.com/ethereum/go-ethereum/node/config.go:297.2,297.23 1 1 +github.com/ethereum/go-ethereum/node/config.go:300.2,300.21 1 1 +github.com/ethereum/go-ethereum/node/config.go:303.2,305.13 3 1 +github.com/ethereum/go-ethereum/node/config.go:294.46,296.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:297.23,299.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:300.21,302.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:308.32,309.18 1 1 +github.com/ethereum/go-ethereum/node/config.go:316.2,316.15 1 1 +github.com/ethereum/go-ethereum/node/config.go:309.18,311.21 2 1 +github.com/ethereum/go-ethereum/node/config.go:314.3,314.18 1 1 +github.com/ethereum/go-ethereum/node/config.go:311.21,312.51 1 0 +github.com/ethereum/go-ethereum/node/config.go:329.50,330.26 1 1 +github.com/ethereum/go-ethereum/node/config.go:333.2,333.21 1 1 +github.com/ethereum/go-ethereum/node/config.go:338.2,338.51 1 1 +github.com/ethereum/go-ethereum/node/config.go:350.2,350.45 1 1 +github.com/ethereum/go-ethereum/node/config.go:330.26,332.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:333.21,335.3 1 1 +github.com/ethereum/go-ethereum/node/config.go:338.51,340.25 2 1 +github.com/ethereum/go-ethereum/node/config.go:343.3,343.49 1 1 +github.com/ethereum/go-ethereum/node/config.go:340.25,342.4 1 0 +github.com/ethereum/go-ethereum/node/config.go:343.49,344.12 1 0 +github.com/ethereum/go-ethereum/node/config.go:347.4,347.18 1 0 +github.com/ethereum/go-ethereum/node/config.go:344.12,346.5 1 0 +github.com/ethereum/go-ethereum/node/config.go:353.39,354.21 1 1 +github.com/ethereum/go-ethereum/node/config.go:357.2,357.43 1 1 +github.com/ethereum/go-ethereum/node/config.go:354.21,356.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:363.46,365.29 1 1 +github.com/ethereum/go-ethereum/node/config.go:369.2,369.21 1 1 +github.com/ethereum/go-ethereum/node/config.go:377.2,378.55 2 1 +github.com/ethereum/go-ethereum/node/config.go:382.2,383.16 2 1 +github.com/ethereum/go-ethereum/node/config.go:386.2,387.55 2 1 +github.com/ethereum/go-ethereum/node/config.go:391.2,392.55 2 1 +github.com/ethereum/go-ethereum/node/config.go:395.2,395.12 1 1 +github.com/ethereum/go-ethereum/node/config.go:365.29,367.3 1 1 +github.com/ethereum/go-ethereum/node/config.go:369.21,371.17 2 1 +github.com/ethereum/go-ethereum/node/config.go:374.3,374.13 1 1 +github.com/ethereum/go-ethereum/node/config.go:371.17,373.4 1 0 +github.com/ethereum/go-ethereum/node/config.go:378.55,380.3 1 1 +github.com/ethereum/go-ethereum/node/config.go:383.16,385.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:387.55,390.3 2 0 +github.com/ethereum/go-ethereum/node/config.go:392.55,394.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:399.46,401.2 1 1 +github.com/ethereum/go-ethereum/node/config.go:404.47,406.2 1 1 +github.com/ethereum/go-ethereum/node/config.go:410.75,412.21 1 1 +github.com/ethereum/go-ethereum/node/config.go:415.2,415.41 1 1 +github.com/ethereum/go-ethereum/node/config.go:418.2,422.57 3 0 +github.com/ethereum/go-ethereum/node/config.go:427.2,428.31 2 0 +github.com/ethereum/go-ethereum/node/config.go:439.2,439.14 1 0 +github.com/ethereum/go-ethereum/node/config.go:412.21,414.3 1 1 +github.com/ethereum/go-ethereum/node/config.go:415.41,417.3 1 1 +github.com/ethereum/go-ethereum/node/config.go:422.57,425.3 2 0 +github.com/ethereum/go-ethereum/node/config.go:428.31,429.16 1 0 +github.com/ethereum/go-ethereum/node/config.go:432.3,433.17 2 0 +github.com/ethereum/go-ethereum/node/config.go:437.3,437.30 1 0 +github.com/ethereum/go-ethereum/node/config.go:429.16,430.12 1 0 +github.com/ethereum/go-ethereum/node/config.go:433.17,435.12 2 0 +github.com/ethereum/go-ethereum/node/config.go:443.49,448.9 2 1 +github.com/ethereum/go-ethereum/node/config.go:460.2,460.20 1 1 +github.com/ethereum/go-ethereum/node/config.go:449.37,450.25 1 0 +github.com/ethereum/go-ethereum/node/config.go:451.23,452.26 1 1 +github.com/ethereum/go-ethereum/node/config.go:457.27,458.44 1 0 +github.com/ethereum/go-ethereum/node/config.go:452.26,454.4 1 1 +github.com/ethereum/go-ethereum/node/config.go:454.9,456.4 1 0 +github.com/ethereum/go-ethereum/node/config.go:465.57,467.16 2 1 +github.com/ethereum/go-ethereum/node/config.go:470.2,471.18 2 1 +github.com/ethereum/go-ethereum/node/config.go:477.2,477.16 1 1 +github.com/ethereum/go-ethereum/node/config.go:480.2,480.50 1 1 +github.com/ethereum/go-ethereum/node/config.go:484.2,484.33 1 1 +github.com/ethereum/go-ethereum/node/config.go:467.16,469.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:471.18,475.3 2 1 +github.com/ethereum/go-ethereum/node/config.go:477.16,479.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:480.50,482.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:489.72,493.8 3 0 +github.com/ethereum/go-ethereum/node/config.go:496.2,497.14 2 0 +github.com/ethereum/go-ethereum/node/config.go:500.2,501.11 2 0 +github.com/ethereum/go-ethereum/node/config.go:493.8,495.3 1 0 +github.com/ethereum/go-ethereum/node/config.go:497.14,499.3 1 0 +github.com/ethereum/go-ethereum/node/endpoints.go:29.122,35.61 2 0 +github.com/ethereum/go-ethereum/node/endpoints.go:39.2,48.38 4 0 +github.com/ethereum/go-ethereum/node/endpoints.go:35.61,37.3 1 0 +github.com/ethereum/go-ethereum/node/endpoints.go:54.90,56.27 2 1 +github.com/ethereum/go-ethereum/node/endpoints.go:62.2,62.31 1 1 +github.com/ethereum/go-ethereum/node/endpoints.go:69.2,69.23 1 1 +github.com/ethereum/go-ethereum/node/endpoints.go:56.27,57.48 1 1 +github.com/ethereum/go-ethereum/node/endpoints.go:57.48,60.4 2 1 +github.com/ethereum/go-ethereum/node/endpoints.go:62.31,63.39 1 0 +github.com/ethereum/go-ethereum/node/endpoints.go:63.39,64.56 1 0 +github.com/ethereum/go-ethereum/node/endpoints.go:64.56,66.5 1 0 +github.com/ethereum/go-ethereum/node/endpoints.go:73.48,74.40 1 1 +github.com/ethereum/go-ethereum/node/endpoints.go:78.2,78.41 1 1 +github.com/ethereum/go-ethereum/node/endpoints.go:82.2,82.40 1 1 +github.com/ethereum/go-ethereum/node/endpoints.go:74.40,77.3 2 0 +github.com/ethereum/go-ethereum/node/endpoints.go:78.41,81.3 2 0 +github.com/ethereum/go-ethereum/node/endpoints.go:82.40,85.3 2 0 +github.com/ethereum/go-ethereum/node/errors.go:35.44,36.77 1 1 +github.com/ethereum/go-ethereum/node/errors.go:39.2,39.12 1 0 +github.com/ethereum/go-ethereum/node/errors.go:36.77,38.3 1 1 +github.com/ethereum/go-ethereum/node/errors.go:50.36,52.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:76.39,81.24 3 1 +github.com/ethereum/go-ethereum/node/node.go:88.2,88.24 1 1 +github.com/ethereum/go-ethereum/node/node.go:94.2,94.42 1 1 +github.com/ethereum/go-ethereum/node/node.go:97.2,97.41 1 1 +github.com/ethereum/go-ethereum/node/node.go:100.2,100.42 1 1 +github.com/ethereum/go-ethereum/node/node.go:104.2,118.43 3 1 +github.com/ethereum/go-ethereum/node/node.go:121.2,122.16 2 1 +github.com/ethereum/go-ethereum/node/node.go:125.2,135.43 7 1 +github.com/ethereum/go-ethereum/node/node.go:138.2,138.44 1 1 +github.com/ethereum/go-ethereum/node/node.go:141.2,141.43 1 1 +github.com/ethereum/go-ethereum/node/node.go:146.2,146.68 1 1 +github.com/ethereum/go-ethereum/node/node.go:149.2,149.71 1 1 +github.com/ethereum/go-ethereum/node/node.go:154.2,160.18 6 1 +github.com/ethereum/go-ethereum/node/node.go:81.24,83.17 2 1 +github.com/ethereum/go-ethereum/node/node.go:86.3,86.28 1 1 +github.com/ethereum/go-ethereum/node/node.go:83.17,85.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:88.24,90.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:94.42,96.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:97.41,99.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:100.42,102.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:118.43,120.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:122.16,124.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:135.43,137.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:138.44,140.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:141.43,143.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:146.68,148.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:149.71,151.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:165.30,170.17 4 1 +github.com/ethereum/go-ethereum/node/node.go:178.2,186.16 6 1 +github.com/ethereum/go-ethereum/node/node.go:191.2,192.39 2 1 +github.com/ethereum/go-ethereum/node/node.go:199.2,199.16 1 1 +github.com/ethereum/go-ethereum/node/node.go:203.2,203.12 1 1 +github.com/ethereum/go-ethereum/node/node.go:171.20,173.24 2 1 +github.com/ethereum/go-ethereum/node/node.go:174.19,176.24 2 0 +github.com/ethereum/go-ethereum/node/node.go:186.16,189.3 2 0 +github.com/ethereum/go-ethereum/node/node.go:192.39,193.42 1 1 +github.com/ethereum/go-ethereum/node/node.go:196.3,196.39 1 1 +github.com/ethereum/go-ethereum/node/node.go:193.42,194.9 1 1 +github.com/ethereum/go-ethereum/node/node.go:199.16,202.3 2 1 +github.com/ethereum/go-ethereum/node/node.go:208.30,215.15 6 1 +github.com/ethereum/go-ethereum/node/node.go:216.25,218.24 1 1 +github.com/ethereum/go-ethereum/node/node.go:219.20,222.54 2 1 +github.com/ethereum/go-ethereum/node/node.go:225.3,225.25 1 1 +github.com/ethereum/go-ethereum/node/node.go:226.19,227.24 1 1 +github.com/ethereum/go-ethereum/node/node.go:228.10,229.59 1 0 +github.com/ethereum/go-ethereum/node/node.go:222.54,224.4 1 1 +github.com/ethereum/go-ethereum/node/node.go:234.44,242.41 5 1 +github.com/ethereum/go-ethereum/node/node.go:245.2,245.18 1 1 +github.com/ethereum/go-ethereum/node/node.go:252.2,258.19 3 1 +github.com/ethereum/go-ethereum/node/node.go:242.41,244.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:245.18,246.48 1 1 +github.com/ethereum/go-ethereum/node/node.go:246.48,248.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:259.9,260.13 1 1 +github.com/ethereum/go-ethereum/node/node.go:261.9,262.17 1 1 +github.com/ethereum/go-ethereum/node/node.go:263.10,264.32 1 0 +github.com/ethereum/go-ethereum/node/node.go:269.38,272.41 2 1 +github.com/ethereum/go-ethereum/node/node.go:276.2,277.16 2 1 +github.com/ethereum/go-ethereum/node/node.go:281.2,281.12 1 1 +github.com/ethereum/go-ethereum/node/node.go:272.41,274.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:277.16,280.3 2 0 +github.com/ethereum/go-ethereum/node/node.go:285.59,286.26 1 1 +github.com/ethereum/go-ethereum/node/node.go:291.2,291.14 1 1 +github.com/ethereum/go-ethereum/node/node.go:286.26,287.15 1 1 +github.com/ethereum/go-ethereum/node/node.go:287.15,289.4 1 1 +github.com/ethereum/go-ethereum/node/node.go:296.56,301.41 3 1 +github.com/ethereum/go-ethereum/node/node.go:308.2,310.31 2 1 +github.com/ethereum/go-ethereum/node/node.go:313.2,313.12 1 1 +github.com/ethereum/go-ethereum/node/node.go:301.41,302.43 1 1 +github.com/ethereum/go-ethereum/node/node.go:302.43,304.4 1 1 +github.com/ethereum/go-ethereum/node/node.go:310.31,312.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:316.36,317.28 1 1 +github.com/ethereum/go-ethereum/node/node.go:321.2,322.51 2 1 +github.com/ethereum/go-ethereum/node/node.go:327.2,328.16 2 1 +github.com/ethereum/go-ethereum/node/node.go:331.2,332.12 2 1 +github.com/ethereum/go-ethereum/node/node.go:317.28,319.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:322.51,324.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:328.16,330.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:335.31,337.22 1 1 +github.com/ethereum/go-ethereum/node/node.go:337.22,338.45 1 1 +github.com/ethereum/go-ethereum/node/node.go:341.3,341.18 1 1 +github.com/ethereum/go-ethereum/node/node.go:338.45,340.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:348.65,350.24 2 0 +github.com/ethereum/go-ethereum/node/node.go:355.2,356.52 2 0 +github.com/ethereum/go-ethereum/node/node.go:365.2,368.20 3 0 +github.com/ethereum/go-ethereum/node/node.go:372.2,372.88 1 0 +github.com/ethereum/go-ethereum/node/node.go:375.2,376.23 2 0 +github.com/ethereum/go-ethereum/node/node.go:350.24,353.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:356.52,358.27 2 0 +github.com/ethereum/go-ethereum/node/node.go:361.3,362.47 2 0 +github.com/ethereum/go-ethereum/node/node.go:358.27,360.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:368.20,371.3 2 0 +github.com/ethereum/go-ethereum/node/node.go:372.88,374.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:382.33,383.40 1 1 +github.com/ethereum/go-ethereum/node/node.go:388.2,388.26 1 1 +github.com/ethereum/go-ethereum/node/node.go:393.2,398.71 2 1 +github.com/ethereum/go-ethereum/node/node.go:414.2,414.49 1 1 +github.com/ethereum/go-ethereum/node/node.go:430.2,430.66 1 1 +github.com/ethereum/go-ethereum/node/node.go:464.2,464.29 1 1 +github.com/ethereum/go-ethereum/node/node.go:471.2,471.27 1 1 +github.com/ethereum/go-ethereum/node/node.go:478.2,478.27 1 1 +github.com/ethereum/go-ethereum/node/node.go:488.2,488.33 1 1 +github.com/ethereum/go-ethereum/node/node.go:493.2,493.12 1 1 +github.com/ethereum/go-ethereum/node/node.go:383.40,385.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:388.26,389.48 1 0 +github.com/ethereum/go-ethereum/node/node.go:389.48,391.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:398.71,399.71 1 1 +github.com/ethereum/go-ethereum/node/node.go:402.3,407.18 1 1 +github.com/ethereum/go-ethereum/node/node.go:410.3,411.13 2 1 +github.com/ethereum/go-ethereum/node/node.go:399.71,401.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:407.18,409.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:414.49,416.69 2 1 +github.com/ethereum/go-ethereum/node/node.go:419.3,423.18 1 1 +github.com/ethereum/go-ethereum/node/node.go:426.3,427.13 2 1 +github.com/ethereum/go-ethereum/node/node.go:416.69,418.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:423.18,425.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:430.66,433.71 2 0 +github.com/ethereum/go-ethereum/node/node.go:436.3,442.18 1 0 +github.com/ethereum/go-ethereum/node/node.go:445.3,448.71 3 0 +github.com/ethereum/go-ethereum/node/node.go:451.3,456.18 1 0 +github.com/ethereum/go-ethereum/node/node.go:459.3,460.13 2 0 +github.com/ethereum/go-ethereum/node/node.go:433.71,435.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:442.18,444.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:448.71,450.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:456.18,458.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:464.29,466.67 1 1 +github.com/ethereum/go-ethereum/node/node.go:466.67,468.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:471.27,473.55 1 1 +github.com/ethereum/go-ethereum/node/node.go:473.55,475.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:478.27,480.17 2 0 +github.com/ethereum/go-ethereum/node/node.go:483.3,483.69 1 0 +github.com/ethereum/go-ethereum/node/node.go:480.17,482.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:483.69,485.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:488.33,489.40 1 1 +github.com/ethereum/go-ethereum/node/node.go:489.40,491.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:496.74,498.19 2 1 +github.com/ethereum/go-ethereum/node/node.go:501.2,501.56 1 1 +github.com/ethereum/go-ethereum/node/node.go:504.2,504.17 1 1 +github.com/ethereum/go-ethereum/node/node.go:498.19,500.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:501.56,503.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:507.26,514.2 6 1 +github.com/ethereum/go-ethereum/node/node.go:517.36,518.32 1 1 +github.com/ethereum/go-ethereum/node/node.go:523.2,523.12 1 1 +github.com/ethereum/go-ethereum/node/node.go:518.32,519.82 1 1 +github.com/ethereum/go-ethereum/node/node.go:519.82,521.4 1 0 +github.com/ethereum/go-ethereum/node/node.go:527.29,529.2 1 1 +github.com/ethereum/go-ethereum/node/node.go:532.23,534.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:537.55,541.34 3 1 +github.com/ethereum/go-ethereum/node/node.go:544.2,544.48 1 1 +github.com/ethereum/go-ethereum/node/node.go:547.2,547.48 1 1 +github.com/ethereum/go-ethereum/node/node.go:541.34,542.60 1 0 +github.com/ethereum/go-ethereum/node/node.go:544.48,545.83 1 0 +github.com/ethereum/go-ethereum/node/node.go:551.60,555.34 3 1 +github.com/ethereum/go-ethereum/node/node.go:558.2,558.63 1 1 +github.com/ethereum/go-ethereum/node/node.go:555.34,556.60 1 0 +github.com/ethereum/go-ethereum/node/node.go:562.45,566.34 3 1 +github.com/ethereum/go-ethereum/node/node.go:569.2,569.40 1 1 +github.com/ethereum/go-ethereum/node/node.go:566.34,567.55 1 0 +github.com/ethereum/go-ethereum/node/node.go:574.59,575.32 1 1 +github.com/ethereum/go-ethereum/node/node.go:580.2,580.35 1 1 +github.com/ethereum/go-ethereum/node/node.go:575.32,576.25 1 1 +github.com/ethereum/go-ethereum/node/node.go:576.25,578.4 1 1 +github.com/ethereum/go-ethereum/node/node.go:587.73,591.34 3 1 +github.com/ethereum/go-ethereum/node/node.go:595.2,596.34 2 1 +github.com/ethereum/go-ethereum/node/node.go:591.34,592.63 1 0 +github.com/ethereum/go-ethereum/node/node.go:600.46,602.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:605.50,609.28 3 0 +github.com/ethereum/go-ethereum/node/node.go:612.2,612.29 1 0 +github.com/ethereum/go-ethereum/node/node.go:609.28,611.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:616.33,618.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:623.37,628.2 3 0 +github.com/ethereum/go-ethereum/node/node.go:632.33,634.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:637.37,639.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:642.37,644.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:647.51,649.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:652.37,654.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:658.38,660.2 1 1 +github.com/ethereum/go-ethereum/node/node.go:663.36,664.24 1 1 +github.com/ethereum/go-ethereum/node/node.go:667.2,667.59 1 1 +github.com/ethereum/go-ethereum/node/node.go:664.24,666.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:672.42,674.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:679.119,682.28 3 1 +github.com/ethereum/go-ethereum/node/node.go:686.2,688.28 3 1 +github.com/ethereum/go-ethereum/node/node.go:694.2,694.16 1 1 +github.com/ethereum/go-ethereum/node/node.go:697.2,697.16 1 1 +github.com/ethereum/go-ethereum/node/node.go:682.28,684.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:688.28,690.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:690.8,692.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:694.16,696.3 1 1 +github.com/ethereum/go-ethereum/node/node.go:705.139,708.28 3 0 +github.com/ethereum/go-ethereum/node/node.go:712.2,714.28 3 0 +github.com/ethereum/go-ethereum/node/node.go:727.2,727.16 1 0 +github.com/ethereum/go-ethereum/node/node.go:730.2,730.16 1 0 +github.com/ethereum/go-ethereum/node/node.go:708.28,710.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:714.28,716.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:716.8,718.10 2 0 +github.com/ethereum/go-ethereum/node/node.go:724.3,724.100 1 0 +github.com/ethereum/go-ethereum/node/node.go:719.22,720.44 1 0 +github.com/ethereum/go-ethereum/node/node.go:721.33,722.36 1 0 +github.com/ethereum/go-ethereum/node/node.go:727.16,729.3 1 0 +github.com/ethereum/go-ethereum/node/node.go:734.45,736.2 1 0 +github.com/ethereum/go-ethereum/node/node.go:746.42,751.2 4 1 +github.com/ethereum/go-ethereum/node/node.go:754.63,758.2 3 1 +github.com/ethereum/go-ethereum/node/node.go:761.50,762.30 1 1 +github.com/ethereum/go-ethereum/node/node.go:768.2,768.15 1 1 +github.com/ethereum/go-ethereum/node/node.go:762.30,764.45 2 1 +github.com/ethereum/go-ethereum/node/node.go:764.45,766.4 1 0 +github.com/ethereum/go-ethereum/node/api.go:34.33,56.2 1 1 +github.com/ethereum/go-ethereum/node/api.go:66.63,69.19 2 0 +github.com/ethereum/go-ethereum/node/api.go:73.2,74.16 2 0 +github.com/ethereum/go-ethereum/node/api.go:77.2,78.18 2 0 +github.com/ethereum/go-ethereum/node/api.go:69.19,71.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:74.16,76.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:82.66,85.19 2 0 +github.com/ethereum/go-ethereum/node/api.go:89.2,90.16 2 0 +github.com/ethereum/go-ethereum/node/api.go:93.2,94.18 2 0 +github.com/ethereum/go-ethereum/node/api.go:85.19,87.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:90.16,92.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:98.70,101.19 2 0 +github.com/ethereum/go-ethereum/node/api.go:104.2,105.16 2 0 +github.com/ethereum/go-ethereum/node/api.go:108.2,109.18 2 0 +github.com/ethereum/go-ethereum/node/api.go:101.19,103.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:105.16,107.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:114.73,117.19 2 0 +github.com/ethereum/go-ethereum/node/api.go:120.2,121.16 2 0 +github.com/ethereum/go-ethereum/node/api.go:124.2,125.18 2 0 +github.com/ethereum/go-ethereum/node/api.go:117.19,119.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:121.16,123.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:130.88,133.19 2 0 +github.com/ethereum/go-ethereum/node/api.go:138.2,139.16 2 0 +github.com/ethereum/go-ethereum/node/api.go:142.2,144.12 2 0 +github.com/ethereum/go-ethereum/node/api.go:163.2,163.20 1 0 +github.com/ethereum/go-ethereum/node/api.go:133.19,135.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:139.16,141.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:144.12,149.7 4 0 +github.com/ethereum/go-ethereum/node/api.go:149.7,150.11 1 0 +github.com/ethereum/go-ethereum/node/api.go:151.27,152.38 1 0 +github.com/ethereum/go-ethereum/node/api.go:153.21,154.11 1 0 +github.com/ethereum/go-ethereum/node/api.go:155.24,156.11 1 0 +github.com/ethereum/go-ethereum/node/api.go:157.29,158.11 1 0 +github.com/ethereum/go-ethereum/node/api.go:167.122,172.17 3 1 +github.com/ethereum/go-ethereum/node/api.go:179.2,179.17 1 1 +github.com/ethereum/go-ethereum/node/api.go:184.2,189.17 2 1 +github.com/ethereum/go-ethereum/node/api.go:195.2,195.19 1 1 +github.com/ethereum/go-ethereum/node/api.go:201.2,201.17 1 1 +github.com/ethereum/go-ethereum/node/api.go:208.2,208.66 1 1 +github.com/ethereum/go-ethereum/node/api.go:211.2,211.74 1 1 +github.com/ethereum/go-ethereum/node/api.go:214.2,214.46 1 1 +github.com/ethereum/go-ethereum/node/api.go:217.2,217.18 1 1 +github.com/ethereum/go-ethereum/node/api.go:172.17,174.37 2 0 +github.com/ethereum/go-ethereum/node/api.go:177.3,177.12 1 0 +github.com/ethereum/go-ethereum/node/api.go:174.37,176.4 1 0 +github.com/ethereum/go-ethereum/node/api.go:179.17,181.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:189.17,191.52 2 0 +github.com/ethereum/go-ethereum/node/api.go:191.52,193.4 1 0 +github.com/ethereum/go-ethereum/node/api.go:195.19,197.51 2 0 +github.com/ethereum/go-ethereum/node/api.go:197.51,199.4 1 0 +github.com/ethereum/go-ethereum/node/api.go:201.17,203.47 2 0 +github.com/ethereum/go-ethereum/node/api.go:203.47,205.4 1 0 +github.com/ethereum/go-ethereum/node/api.go:208.66,210.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:211.74,213.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:214.46,216.3 1 1 +github.com/ethereum/go-ethereum/node/api.go:222.121,225.2 2 0 +github.com/ethereum/go-ethereum/node/api.go:228.54,231.2 2 1 +github.com/ethereum/go-ethereum/node/api.go:235.53,238.2 2 0 +github.com/ethereum/go-ethereum/node/api.go:241.114,246.17 3 1 +github.com/ethereum/go-ethereum/node/api.go:253.2,253.17 1 1 +github.com/ethereum/go-ethereum/node/api.go:258.2,263.17 2 1 +github.com/ethereum/go-ethereum/node/api.go:269.2,269.27 1 1 +github.com/ethereum/go-ethereum/node/api.go:277.2,278.59 2 1 +github.com/ethereum/go-ethereum/node/api.go:281.2,282.58 2 1 +github.com/ethereum/go-ethereum/node/api.go:285.2,285.39 1 1 +github.com/ethereum/go-ethereum/node/api.go:288.2,289.18 2 1 +github.com/ethereum/go-ethereum/node/api.go:246.17,248.35 2 0 +github.com/ethereum/go-ethereum/node/api.go:251.3,251.12 1 0 +github.com/ethereum/go-ethereum/node/api.go:248.35,250.4 1 0 +github.com/ethereum/go-ethereum/node/api.go:253.17,255.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:263.17,265.47 2 0 +github.com/ethereum/go-ethereum/node/api.go:265.47,267.4 1 0 +github.com/ethereum/go-ethereum/node/api.go:269.27,271.62 2 0 +github.com/ethereum/go-ethereum/node/api.go:271.62,273.4 1 0 +github.com/ethereum/go-ethereum/node/api.go:278.59,280.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:282.58,284.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:285.39,287.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:293.52,297.2 3 1 +github.com/ethereum/go-ethereum/node/api.go:307.61,309.19 2 0 +github.com/ethereum/go-ethereum/node/api.go:312.2,312.32 1 0 +github.com/ethereum/go-ethereum/node/api.go:309.19,311.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:317.62,319.19 2 0 +github.com/ethereum/go-ethereum/node/api.go:322.2,322.31 1 0 +github.com/ethereum/go-ethereum/node/api.go:319.19,321.3 1 0 +github.com/ethereum/go-ethereum/node/api.go:326.45,328.2 1 0 +github.com/ethereum/go-ethereum/node/api.go:336.48,338.2 1 0 +github.com/ethereum/go-ethereum/node/api.go:342.65,344.2 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:71.30,74.16 2 1 +github.com/ethereum/go-ethereum/node/defaults.go:93.2,93.11 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:74.16,75.23 1 1 +github.com/ethereum/go-ethereum/node/defaults.go:76.17,77.53 1 1 +github.com/ethereum/go-ethereum/node/defaults.go:78.18,84.48 3 0 +github.com/ethereum/go-ethereum/node/defaults.go:87.4,87.45 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:88.11,89.43 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:84.48,86.5 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:96.30,98.13 2 0 +github.com/ethereum/go-ethereum/node/defaults.go:104.2,104.10 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:98.13,102.58 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:107.37,109.16 2 0 +github.com/ethereum/go-ethereum/node/defaults.go:112.2,114.23 3 0 +github.com/ethereum/go-ethereum/node/defaults.go:109.16,111.3 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:117.23,118.43 1 1 +github.com/ethereum/go-ethereum/node/defaults.go:121.2,121.44 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:124.2,124.11 1 0 +github.com/ethereum/go-ethereum/node/defaults.go:118.43,120.3 1 1 +github.com/ethereum/go-ethereum/node/defaults.go:121.44,123.3 1 0 +github.com/ethereum/go-ethereum/node/jwt_handler.go:33.67,35.56 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:35.56,37.4 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:43.80,48.79 2 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:51.2,51.24 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:58.2,62.9 2 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:48.79,50.3 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:51.24,54.3 2 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:63.18,64.53 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:65.20,66.57 1 0 +github.com/ethereum/go-ethereum/node/jwt_handler.go:67.50,68.60 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:69.30,70.61 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:71.56,72.55 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:73.56,74.56 1 1 +github.com/ethereum/go-ethereum/node/jwt_handler.go:75.10,76.33 1 1 +github.com/ethereum/go-ethereum/metrics/graphite.go:27.78,36.2 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:40.43,42.39 2 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:42.39,43.38 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:43.38,45.4 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:52.43,55.2 2 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:57.40,61.16 4 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:64.2,66.51 3 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:112.2,112.12 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:61.16,63.3 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:66.51,67.29 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:110.3,110.12 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:68.16,69.78 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:70.14,71.78 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:72.21,73.78 1 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:74.18,82.44 8 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:86.14,92.77 6 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:93.14,101.44 8 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:105.4,108.82 4 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:82.44,85.5 2 0 +github.com/ethereum/go-ethereum/metrics/graphite.go:101.44,104.5 2 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:13.54,14.14 1 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:17.2,17.37 1 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:14.14,16.3 1 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:24.32,24.33 0 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:27.37,27.51 1 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:30.34,30.35 0 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:33.41,33.42 0 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:43.39,45.2 1 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:48.45,50.2 1 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:53.41,55.2 1 0 +github.com/ethereum/go-ethereum/metrics/healthcheck.go:59.52,61.2 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:26.56,27.14 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:30.2,30.48 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:27.14,29.3 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:37.62,38.14 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:41.2,41.54 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:38.14,40.3 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:46.23,47.14 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:50.2,54.22 5 1 +github.com/ethereum/go-ethereum/metrics/meter.go:58.2,58.10 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:47.14,49.3 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:54.22,57.3 2 1 +github.com/ethereum/go-ethereum/metrics/meter.go:64.29,69.22 5 0 +github.com/ethereum/go-ethereum/metrics/meter.go:73.2,73.10 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:69.22,72.3 2 0 +github.com/ethereum/go-ethereum/metrics/meter.go:80.56,82.14 2 1 +github.com/ethereum/go-ethereum/metrics/meter.go:85.2,86.10 2 1 +github.com/ethereum/go-ethereum/metrics/meter.go:82.14,84.3 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:93.62,95.14 2 0 +github.com/ethereum/go-ethereum/metrics/meter.go:98.2,99.10 2 0 +github.com/ethereum/go-ethereum/metrics/meter.go:95.14,97.3 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:114.39,114.57 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:117.37,118.41 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:123.41,123.59 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:127.41,127.59 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:131.42,131.61 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:135.44,135.65 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:138.42,138.54 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:141.33,141.34 0 0 +github.com/ethereum/go-ethereum/metrics/meter.go:147.31,147.43 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:150.32,150.33 0 0 +github.com/ethereum/go-ethereum/metrics/meter.go:153.33,153.47 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:156.33,156.47 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:159.34,159.48 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:162.36,162.50 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:165.34,165.55 1 0 +github.com/ethereum/go-ethereum/metrics/meter.go:168.25,168.26 0 0 +github.com/ethereum/go-ethereum/metrics/meter.go:179.40,187.2 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:190.32,192.18 2 1 +github.com/ethereum/go-ethereum/metrics/meter.go:192.18,196.3 3 1 +github.com/ethereum/go-ethereum/metrics/meter.go:201.39,206.2 4 1 +github.com/ethereum/go-ethereum/metrics/meter.go:209.39,211.2 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:214.41,218.2 3 1 +github.com/ethereum/go-ethereum/metrics/meter.go:221.41,225.2 3 1 +github.com/ethereum/go-ethereum/metrics/meter.go:228.42,232.2 3 1 +github.com/ethereum/go-ethereum/metrics/meter.go:235.44,239.2 3 1 +github.com/ethereum/go-ethereum/metrics/meter.go:242.42,247.2 4 1 +github.com/ethereum/go-ethereum/metrics/meter.go:249.42,256.2 5 1 +github.com/ethereum/go-ethereum/metrics/meter.go:258.39,265.2 5 1 +github.com/ethereum/go-ethereum/metrics/meter.go:267.32,275.2 7 1 +github.com/ethereum/go-ethereum/metrics/meter.go:289.32,290.24 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:290.24,292.3 1 1 +github.com/ethereum/go-ethereum/metrics/meter.go:295.38,298.31 3 1 +github.com/ethereum/go-ethereum/metrics/meter.go:298.31,300.3 1 1 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:28.78,36.2 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:40.43,41.39 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:41.39,42.38 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:42.38,44.4 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:48.32,49.25 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:57.2,57.22 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:49.25,51.51 2 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:51.51,53.4 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:53.9,55.4 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:60.40,65.16 5 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:68.2,70.51 3 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:118.2,118.12 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:65.16,67.3 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:70.51,71.29 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:116.3,116.12 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:72.16,73.105 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:74.14,75.105 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:76.21,77.105 1 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:78.18,90.107 12 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:91.14,97.104 6 0 +github.com/ethereum/go-ethereum/metrics/opentsdb.go:98.14,114.109 16 0 +github.com/ethereum/go-ethereum/metrics/counter.go:18.60,19.14 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:22.2,22.52 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:19.14,21.3 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:29.66,30.14 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:33.2,33.58 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:30.14,32.3 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:37.27,38.14 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:41.2,41.28 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:38.14,40.3 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:46.33,48.2 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:51.60,53.14 2 1 +github.com/ethereum/go-ethereum/metrics/counter.go:56.2,57.10 2 1 +github.com/ethereum/go-ethereum/metrics/counter.go:53.14,55.3 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:64.66,66.14 2 0 +github.com/ethereum/go-ethereum/metrics/counter.go:69.2,70.10 2 0 +github.com/ethereum/go-ethereum/metrics/counter.go:66.14,68.3 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:77.32,78.44 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:82.40,82.59 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:85.35,86.42 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:90.35,91.42 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:95.45,95.57 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:101.28,101.29 0 0 +github.com/ethereum/go-ethereum/metrics/counter.go:104.33,104.45 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:107.33,107.34 0 0 +github.com/ethereum/go-ethereum/metrics/counter.go:110.33,110.34 0 0 +github.com/ethereum/go-ethereum/metrics/counter.go:113.38,113.61 1 0 +github.com/ethereum/go-ethereum/metrics/counter.go:122.35,124.2 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:127.41,129.2 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:132.40,134.2 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:137.40,139.2 1 1 +github.com/ethereum/go-ethereum/metrics/counter.go:142.46,144.2 1 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:20.34,22.2 1 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:25.22,27.2 1 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:30.22,32.2 1 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:35.23,37.2 1 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:44.38,44.59 1 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:47.39,47.51 1 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:50.28,51.41 1 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:55.35,56.43 1 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:63.31,63.45 1 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:66.32,66.52 1 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:69.24,69.25 0 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:72.33,72.34 0 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:86.39,90.2 3 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:93.40,95.2 1 0 +github.com/ethereum/go-ethereum/metrics/ewma.go:99.31,105.12 6 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:105.12,107.3 1 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:107.8,110.3 2 1 +github.com/ethereum/go-ethereum/metrics/ewma.go:114.40,116.2 1 1 +github.com/ethereum/go-ethereum/metrics/log.go:11.52,13.2 1 0 +github.com/ethereum/go-ethereum/metrics/log.go:17.79,21.28 3 0 +github.com/ethereum/go-ethereum/metrics/log.go:21.28,22.43 1 0 +github.com/ethereum/go-ethereum/metrics/log.go:22.43,23.30 1 0 +github.com/ethereum/go-ethereum/metrics/log.go:24.17,26.53 2 0 +github.com/ethereum/go-ethereum/metrics/log.go:27.15,29.53 2 0 +github.com/ethereum/go-ethereum/metrics/log.go:30.22,32.52 2 0 +github.com/ethereum/go-ethereum/metrics/log.go:33.21,36.52 3 0 +github.com/ethereum/go-ethereum/metrics/log.go:37.19,50.48 13 0 +github.com/ethereum/go-ethereum/metrics/log.go:51.15,58.54 7 0 +github.com/ethereum/go-ethereum/metrics/log.go:59.15,76.54 17 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:38.13,39.30 1 1 +github.com/ethereum/go-ethereum/metrics/metrics.go:39.30,42.40 2 1 +github.com/ethereum/go-ethereum/metrics/metrics.go:48.3,48.49 1 1 +github.com/ethereum/go-ethereum/metrics/metrics.go:42.40,43.35 1 1 +github.com/ethereum/go-ethereum/metrics/metrics.go:43.35,46.5 2 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:48.49,49.44 1 1 +github.com/ethereum/go-ethereum/metrics/metrics.go:49.44,52.5 2 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:59.51,61.14 1 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:64.2,70.37 5 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:76.2,97.20 2 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:61.14,63.3 1 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:70.37,74.3 3 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:97.20,115.49 15 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:124.3,124.22 1 0 +github.com/ethereum/go-ethereum/metrics/metrics.go:115.49,123.4 6 0 +github.com/ethereum/go-ethereum/metrics/sample.go:48.65,49.14 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:52.2,59.10 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:49.14,51.3 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:63.34,70.2 6 0 +github.com/ethereum/go-ethereum/metrics/sample.go:74.40,78.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:82.38,84.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:87.41,89.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:93.38,95.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:98.56,100.2 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:104.62,106.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:109.37,113.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:116.44,121.25 5 1 +github.com/ethereum/go-ethereum/metrics/sample.go:124.2,127.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:121.25,123.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:131.43,133.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:136.38,138.2 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:141.42,143.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:146.43,151.25 5 1 +github.com/ethereum/go-ethereum/metrics/sample.go:154.2,154.15 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:151.25,153.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:158.45,160.2 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:164.55,168.40 4 1 +github.com/ethereum/go-ethereum/metrics/sample.go:171.2,175.19 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:168.40,170.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:175.19,181.28 6 1 +github.com/ethereum/go-ethereum/metrics/sample.go:181.28,184.4 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:192.27,192.28 0 0 +github.com/ethereum/go-ethereum/metrics/sample.go:195.32,195.44 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:198.30,198.42 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:201.33,201.47 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:204.30,204.42 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:207.48,207.62 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:210.54,212.2 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:215.29,215.41 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:218.36,218.58 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:221.35,221.49 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:224.30,224.42 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:227.35,227.36 0 0 +github.com/ethereum/go-ethereum/metrics/sample.go:230.35,230.55 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:233.37,233.51 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:236.38,237.22 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:240.2,241.27 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:246.2,246.12 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:237.22,239.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:241.27,242.14 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:242.14,244.4 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:250.41,251.22 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:254.2,254.58 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:251.22,253.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:258.38,259.22 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:262.2,263.27 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:268.2,268.12 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:259.22,261.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:263.27,264.14 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:264.14,266.4 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:272.61,274.2 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:278.67,281.14 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:296.2,296.15 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:281.14,283.24 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:283.24,285.17 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:285.17,287.5 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:287.10,287.35 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:287.35,289.5 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:289.10,293.5 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:305.69,310.2 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:313.32,314.43 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:318.40,318.58 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:321.38,321.68 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:324.41,324.72 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:327.38,327.68 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:331.56,333.2 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:337.62,339.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:342.37,342.61 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:345.44,345.56 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:349.43,349.76 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:352.38,352.68 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:355.38,356.44 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:360.43,364.2 3 0 +github.com/ethereum/go-ethereum/metrics/sample.go:367.45,367.80 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:370.43,372.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:375.38,377.27 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:380.2,380.12 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:377.27,379.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:384.45,385.22 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:388.2,390.27 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:394.2,394.35 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:385.22,387.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:390.27,393.3 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:409.49,410.14 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:413.2,416.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:410.14,412.3 1 0 +github.com/ethereum/go-ethereum/metrics/sample.go:420.33,425.2 4 0 +github.com/ethereum/go-ethereum/metrics/sample.go:429.39,433.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:437.37,441.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:444.40,448.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:452.37,456.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:459.55,463.2 3 0 +github.com/ethereum/go-ethereum/metrics/sample.go:467.61,471.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:474.36,478.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:481.43,490.2 5 1 +github.com/ethereum/go-ethereum/metrics/sample.go:493.42,497.2 3 1 +github.com/ethereum/go-ethereum/metrics/sample.go:500.37,504.2 3 0 +github.com/ethereum/go-ethereum/metrics/sample.go:507.41,511.37 4 1 +github.com/ethereum/go-ethereum/metrics/sample.go:511.37,513.3 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:513.8,515.31 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:515.31,517.4 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:522.42,528.2 5 1 +github.com/ethereum/go-ethereum/metrics/sample.go:531.44,535.2 3 0 +github.com/ethereum/go-ethereum/metrics/sample.go:543.67,545.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:553.38,555.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:557.53,562.2 4 1 +github.com/ethereum/go-ethereum/metrics/sample.go:564.51,573.2 7 1 +github.com/ethereum/go-ethereum/metrics/sample.go:575.41,577.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:579.56,581.2 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:583.40,584.6 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:584.6,586.39 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:589.3,590.8 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:586.39,587.9 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:594.45,595.6 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:595.6,597.24 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:600.3,601.55 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:604.3,604.29 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:607.3,608.8 2 1 +github.com/ethereum/go-ethereum/metrics/sample.go:597.24,598.9 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:601.55,603.4 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:604.29,605.9 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:614.41,614.58 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:615.41,615.63 1 1 +github.com/ethereum/go-ethereum/metrics/sample.go:616.41,616.68 1 1 +github.com/ethereum/go-ethereum/metrics/cputime_unix.go:29.32,31.71 2 0 +github.com/ethereum/go-ethereum/metrics/cputime_unix.go:35.2,35.100 1 0 +github.com/ethereum/go-ethereum/metrics/cputime_unix.go:31.71,34.3 2 0 +github.com/ethereum/go-ethereum/metrics/registry.go:15.43,17.2 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:61.29,63.2 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:66.62,67.38 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:67.38,69.3 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:73.57,77.2 3 1 +github.com/ethereum/go-ethereum/metrics/registry.go:83.82,86.39 3 1 +github.com/ethereum/go-ethereum/metrics/registry.go:89.2,89.55 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:92.2,93.10 2 1 +github.com/ethereum/go-ethereum/metrics/registry.go:86.39,88.3 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:89.55,91.3 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:98.71,102.2 3 1 +github.com/ethereum/go-ethereum/metrics/registry.go:105.46,108.30 3 0 +github.com/ethereum/go-ethereum/metrics/registry.go:108.30,109.35 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:109.35,111.4 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:116.71,118.42 2 1 +github.com/ethereum/go-ethereum/metrics/registry.go:173.2,173.13 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:118.42,120.29 2 1 +github.com/ethereum/go-ethereum/metrics/registry.go:171.3,171.22 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:121.16,122.36 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:123.14,124.36 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:125.21,126.36 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:127.20,130.41 3 0 +github.com/ethereum/go-ethereum/metrics/registry.go:133.18,145.27 12 0 +github.com/ethereum/go-ethereum/metrics/registry.go:146.14,152.38 6 0 +github.com/ethereum/go-ethereum/metrics/registry.go:153.14,169.38 16 0 +github.com/ethereum/go-ethereum/metrics/registry.go:130.41,132.5 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:177.52,182.2 4 1 +github.com/ethereum/go-ethereum/metrics/registry.go:185.44,188.30 3 0 +github.com/ethereum/go-ethereum/metrics/registry.go:188.30,191.3 2 0 +github.com/ethereum/go-ethereum/metrics/registry.go:194.71,195.34 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:198.2,198.18 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:202.2,202.12 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:195.34,197.3 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:199.90,200.22 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:205.64,209.33 4 1 +github.com/ethereum/go-ethereum/metrics/registry.go:212.2,212.16 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:209.33,211.3 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:215.46,216.34 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:216.34,217.33 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:217.33,219.4 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:233.50,238.2 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:240.72,245.2 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:248.63,249.61 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:259.2,260.38 2 1 +github.com/ethereum/go-ethereum/metrics/registry.go:249.61,250.47 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:250.47,251.39 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:251.39,253.5 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:253.10,255.5 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:263.70,264.30 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:270.2,270.16 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:265.25,266.51 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:267.25,268.19 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:274.57,277.2 2 1 +github.com/ethereum/go-ethereum/metrics/registry.go:282.87,285.2 2 1 +github.com/ethereum/go-ethereum/metrics/registry.go:288.76,291.2 2 1 +github.com/ethereum/go-ethereum/metrics/registry.go:294.46,296.2 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:299.71,301.2 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:304.52,307.2 2 1 +github.com/ethereum/go-ethereum/metrics/registry.go:310.44,312.2 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:321.40,323.2 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:326.35,328.2 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:332.60,334.2 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:338.49,340.2 1 1 +github.com/ethereum/go-ethereum/metrics/registry.go:344.47,345.42 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:345.42,346.13 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:351.24,353.2 1 0 +github.com/ethereum/go-ethereum/metrics/registry.go:356.30,358.2 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:26.74,27.14 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:30.2,30.66 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:27.14,29.3 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:34.74,36.14 2 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:39.2,40.10 2 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:36.14,38.3 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:44.41,45.14 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:48.2,50.3 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:45.14,47.3 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:58.43,58.57 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:61.52,65.2 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:68.40,68.41 0 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:71.49,71.50 0 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:74.57,75.52 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:79.41,80.45 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:84.50,84.51 0 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:94.51,96.2 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:99.60,108.2 5 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:111.65,112.57 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:116.49,117.50 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:121.49,125.2 3 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:128.58,132.2 3 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:135.60,139.2 3 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:150.60,150.72 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:153.45,154.50 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:158.54,159.52 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:163.55,164.57 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:168.51,170.2 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:173.77,177.2 2 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:180.49,181.19 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:185.2,185.15 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:181.19,183.3 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:188.62,192.15 3 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:233.2,233.21 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:192.15,198.30 5 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:202.3,206.35 3 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:226.3,227.41 2 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:198.30,200.4 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:206.35,207.17 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:223.4,223.48 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:207.17,209.17 2 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:216.5,217.36 2 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:220.5,220.46 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:209.17,211.6 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:211.11,213.6 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:217.36,219.6 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:228.8,231.3 2 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:239.41,239.58 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:240.41,240.63 1 1 +github.com/ethereum/go-ethereum/metrics/resetting_timer.go:241.41,241.68 1 1 +github.com/ethereum/go-ethereum/metrics/writer.go:12.54,13.25 1 0 +github.com/ethereum/go-ethereum/metrics/writer.go:13.25,15.3 1 0 +github.com/ethereum/go-ethereum/metrics/writer.go:20.41,22.42 2 0 +github.com/ethereum/go-ethereum/metrics/writer.go:26.2,27.43 2 0 +github.com/ethereum/go-ethereum/metrics/writer.go:22.42,24.3 1 0 +github.com/ethereum/go-ethereum/metrics/writer.go:27.43,28.41 1 0 +github.com/ethereum/go-ethereum/metrics/writer.go:29.16,31.58 2 0 +github.com/ethereum/go-ethereum/metrics/writer.go:32.14,34.58 2 0 +github.com/ethereum/go-ethereum/metrics/writer.go:35.21,37.57 2 0 +github.com/ethereum/go-ethereum/metrics/writer.go:38.20,41.57 3 0 +github.com/ethereum/go-ethereum/metrics/writer.go:42.18,55.53 13 0 +github.com/ethereum/go-ethereum/metrics/writer.go:56.14,63.59 7 0 +github.com/ethereum/go-ethereum/metrics/writer.go:64.14,81.59 17 0 +github.com/ethereum/go-ethereum/metrics/writer.go:94.39,94.58 1 1 +github.com/ethereum/go-ethereum/metrics/writer.go:96.44,96.79 1 1 +github.com/ethereum/go-ethereum/metrics/writer.go:98.49,100.2 1 1 +github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:28.36,31.16 2 0 +github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:35.2,35.25 1 0 +github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:40.2,43.39 4 0 +github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:31.16,34.3 2 0 +github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:35.25,38.3 2 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:16.56,17.14 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:20.2,20.48 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:17.14,19.3 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:24.23,25.14 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:28.2,28.26 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:25.14,27.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:32.56,34.14 2 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:37.2,38.10 2 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:34.14,36.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:42.47,43.14 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:46.2,46.35 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:43.14,45.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:50.82,52.14 2 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:55.2,56.10 2 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:52.14,54.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:63.41,63.53 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:66.36,67.43 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:71.33,72.40 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:76.33,77.40 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:81.38,81.57 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:87.34,87.55 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:90.34,90.35 0 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:93.31,93.32 0 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:96.31,96.32 0 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:99.31,99.43 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:108.42,110.2 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:113.41,115.2 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:118.39,120.2 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:123.38,125.2 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:128.38,130.2 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:138.40,140.2 1 1 +github.com/ethereum/go-ethereum/metrics/gauge.go:143.43,143.78 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:146.38,147.45 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:151.35,152.42 1 0 +github.com/ethereum/go-ethereum/metrics/gauge.go:156.35,157.42 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:14.70,15.14 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:18.2,18.64 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:15.14,17.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:22.37,23.14 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:26.2,28.3 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:23.14,25.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:32.70,34.14 2 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:37.2,38.10 2 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:34.14,36.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:42.63,43.14 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:46.2,46.42 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:43.14,45.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:50.98,52.14 2 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:55.2,56.10 2 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:52.14,54.3 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:63.55,63.67 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:66.45,67.50 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:71.47,71.68 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:77.48,77.76 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:80.43,80.44 0 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:83.40,83.54 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:93.56,95.2 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:98.50,102.2 3 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:105.48,109.2 3 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:117.49,119.2 1 1 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:122.57,122.99 1 0 +github.com/ethereum/go-ethereum/metrics/gauge_float64.go:125.47,126.52 1 0 +github.com/ethereum/go-ethereum/metrics/runtime_cgo.go:8.25,10.2 1 1 +github.com/ethereum/go-ethereum/metrics/runtime_gccpufraction.go:8.56,10.2 1 1 +github.com/ethereum/go-ethereum/metrics/disk_nop.go:25.44,27.2 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:22.74,23.14 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:26.2,26.48 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:23.14,25.3 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:26.48,26.74 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:31.85,32.14 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:35.2,35.48 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:32.14,34.3 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:35.48,35.76 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:39.39,40.14 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:43.2,43.38 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:40.14,42.3 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:48.74,50.14 2 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:53.2,54.10 2 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:50.14,52.3 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:63.35,64.46 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:69.43,69.70 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:73.41,73.66 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:77.44,77.70 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:81.41,81.66 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:85.59,87.2 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:91.65,93.2 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:96.45,96.64 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:99.50,99.62 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:103.46,103.74 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:106.41,106.66 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:109.41,110.47 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:114.48,114.78 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:120.30,120.31 0 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:123.35,123.47 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:126.33,126.45 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:129.36,129.50 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:132.33,132.45 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:135.51,135.65 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:138.57,140.2 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:143.37,143.59 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:146.42,146.67 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:149.38,149.52 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:152.33,152.45 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:155.38,155.39 0 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:158.40,158.54 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:167.37,167.57 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:171.43,171.70 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:174.41,174.66 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:177.44,177.70 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:180.41,180.66 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:183.59,185.2 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:189.65,191.2 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:194.45,194.64 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:197.50,199.2 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:202.46,202.74 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:205.41,205.66 1 0 +github.com/ethereum/go-ethereum/metrics/histogram.go:208.45,208.67 1 1 +github.com/ethereum/go-ethereum/metrics/histogram.go:211.48,211.78 1 0 +github.com/ethereum/go-ethereum/metrics/runtime.go:57.58,58.25 1 0 +github.com/ethereum/go-ethereum/metrics/runtime.go:58.25,60.3 1 0 +github.com/ethereum/go-ethereum/metrics/runtime.go:71.45,78.22 6 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:83.2,83.23 1 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:89.2,110.59 20 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:125.2,142.69 14 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:78.22,80.3 1 0 +github.com/ethereum/go-ethereum/metrics/runtime.go:80.8,82.3 1 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:83.23,85.3 1 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:85.8,87.3 1 0 +github.com/ethereum/go-ethereum/metrics/runtime.go:110.59,111.53 1 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:111.53,113.4 1 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:114.8,115.13 1 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:121.3,121.21 1 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:115.13,116.49 1 0 +github.com/ethereum/go-ethereum/metrics/runtime.go:119.4,119.9 1 0 +github.com/ethereum/go-ethereum/metrics/runtime.go:116.49,118.5 1 0 +github.com/ethereum/go-ethereum/metrics/runtime.go:121.21,123.4 1 1 +github.com/ethereum/go-ethereum/metrics/runtime.go:148.42,212.2 62 1 +github.com/ethereum/go-ethereum/metrics/debug.go:24.55,25.25 1 0 +github.com/ethereum/go-ethereum/metrics/debug.go:25.25,27.3 1 0 +github.com/ethereum/go-ethereum/metrics/debug.go:38.42,46.56 7 0 +github.com/ethereum/go-ethereum/metrics/debug.go:50.2,50.67 1 0 +github.com/ethereum/go-ethereum/metrics/debug.go:46.56,48.3 1 0 +github.com/ethereum/go-ethereum/metrics/debug.go:56.39,70.2 10 0 +github.com/ethereum/go-ethereum/metrics/debug.go:74.13,76.2 1 1 +github.com/ethereum/go-ethereum/metrics/json.go:11.58,13.2 1 1 +github.com/ethereum/go-ethereum/metrics/json.go:17.58,18.25 1 0 +github.com/ethereum/go-ethereum/metrics/json.go:18.25,20.3 1 0 +github.com/ethereum/go-ethereum/metrics/json.go:25.45,27.2 1 1 +github.com/ethereum/go-ethereum/metrics/json.go:29.58,31.2 1 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:14.60,15.25 1 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:15.25,16.43 1 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:16.43,17.30 1 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:18.17,19.71 1 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:20.15,21.69 1 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:22.22,23.69 1 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:24.21,26.75 2 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:27.19,43.7 3 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:44.15,54.7 2 0 +github.com/ethereum/go-ethereum/metrics/syslog.go:55.15,75.7 3 0 +github.com/ethereum/go-ethereum/metrics/timer.go:34.56,35.14 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:38.2,38.48 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:35.14,37.3 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:43.49,44.14 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:47.2,50.3 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:44.14,46.3 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:56.56,58.14 2 1 +github.com/ethereum/go-ethereum/metrics/timer.go:61.2,62.10 2 1 +github.com/ethereum/go-ethereum/metrics/timer.go:58.14,60.3 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:68.23,69.14 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:72.2,75.3 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:69.14,71.3 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:82.31,82.43 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:85.29,85.41 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:88.32,88.46 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:91.29,91.41 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:94.47,94.61 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:97.53,99.2 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:102.33,102.47 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:105.33,105.47 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:108.34,108.48 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:111.36,111.50 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:114.34,114.55 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:117.34,117.48 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:120.25,120.26 0 0 +github.com/ethereum/go-ethereum/metrics/timer.go:123.29,123.41 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:126.31,126.32 0 0 +github.com/ethereum/go-ethereum/metrics/timer.go:129.40,129.41 0 0 +github.com/ethereum/go-ethereum/metrics/timer.go:132.41,132.42 0 0 +github.com/ethereum/go-ethereum/metrics/timer.go:135.36,135.50 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:146.39,148.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:151.37,153.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:156.40,158.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:161.37,163.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:166.55,168.2 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:172.61,174.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:177.41,179.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:182.41,184.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:187.42,189.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:192.44,194.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:197.42,204.2 3 0 +github.com/ethereum/go-ethereum/metrics/timer.go:207.42,209.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:212.32,214.2 1 1 +github.com/ethereum/go-ethereum/metrics/timer.go:217.37,219.2 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:222.40,226.2 3 1 +github.com/ethereum/go-ethereum/metrics/timer.go:229.49,234.2 4 1 +github.com/ethereum/go-ethereum/metrics/timer.go:237.51,242.2 4 1 +github.com/ethereum/go-ethereum/metrics/timer.go:245.44,247.2 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:257.39,257.69 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:260.37,260.65 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:263.40,263.69 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:266.37,266.65 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:270.55,272.2 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:276.61,278.2 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:282.41,282.67 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:286.41,286.67 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:290.42,290.69 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:294.44,294.73 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:297.42,297.54 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:301.42,301.73 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:304.33,304.34 0 0 +github.com/ethereum/go-ethereum/metrics/timer.go:307.37,307.65 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:310.36,311.41 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:315.45,316.43 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:320.46,321.48 1 0 +github.com/ethereum/go-ethereum/metrics/timer.go:326.44,326.77 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_sample.go:7.44,11.2 1 0 +github.com/ethereum/go-ethereum/metrics/resetting_sample.go:20.46,24.2 3 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:133.31,135.2 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:153.62,155.38 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:160.2,160.63 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:155.38,157.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:157.8,157.46 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:157.46,159.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:169.32,169.52 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:170.32,170.53 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:172.32,172.52 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:173.32,173.53 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:175.36,175.60 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:176.36,176.61 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:178.37,178.62 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:179.37,179.63 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:181.38,181.64 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:182.38,182.65 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:184.39,184.66 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:185.39,185.67 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:188.30,190.2 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:209.59,210.29 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:213.2,215.36 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:218.2,219.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:223.2,224.36 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:240.2,242.32 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:210.29,212.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:215.36,217.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:219.16,221.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:225.18,226.18 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:227.18,228.18 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:229.22,230.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:231.23,232.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:233.24,234.24 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:235.25,236.25 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:237.10,238.67 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:246.82,250.43 4 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:253.2,255.16 3 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:258.2,262.26 4 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:250.43,252.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:255.16,257.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:266.63,268.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:271.2,272.17 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:268.16,270.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:276.48,281.2 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:284.77,289.34 5 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:292.2,292.15 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:289.34,291.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:29.33,34.2 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:37.37,39.2 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:42.42,44.42 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:50.2,51.42 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:62.2,62.50 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:66.2,69.16 3 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:73.2,75.26 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:44.42,47.3 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:51.42,53.17 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:57.3,57.43 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:53.17,56.4 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:57.43,60.4 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:62.50,65.3 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:69.16,72.3 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:78.39,88.12 7 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:93.2,93.26 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:101.2,101.10 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:88.12,91.3 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:93.26,94.10 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:95.19,96.79 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/command.go:97.21,98.12 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:381.30,508.2 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:510.37,521.24 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:538.2,538.12 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:521.24,522.19 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:522.19,526.39 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:531.4,531.11 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:534.4,535.13 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:526.39,528.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:528.10,530.5 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:531.11,533.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:541.44,552.24 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:562.2,562.12 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:552.24,553.50 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:553.50,555.18 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:558.4,559.13 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:555.18,557.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:565.51,567.20 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:576.2,581.64 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:584.2,584.44 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:587.2,587.51 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:590.2,590.20 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:567.20,570.17 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:573.3,573.32 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:570.17,572.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:581.64,583.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:584.44,586.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:587.51,589.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:593.36,594.25 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:597.2,598.9 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:601.2,604.32 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:609.2,609.26 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:614.2,614.12 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:594.25,596.3 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:598.9,600.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:604.32,606.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:609.26,611.3 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:611.8,613.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:617.72,619.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:622.2,626.26 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:630.2,634.2 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:670.2,670.25 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:777.2,778.22 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:783.2,787.20 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:797.2,797.18 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:811.2,811.16 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:821.2,822.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:619.16,621.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:626.26,629.3 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:634.2,639.3 4 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:642.2,653.3 10 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:656.2,661.55 4 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:661.55,662.39 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:665.4,665.54 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:662.39,664.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:670.25,673.94 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:678.3,684.46 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:694.3,694.58 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:697.3,713.30 7 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:673.94,675.4 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:684.46,686.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:686.9,686.50 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:686.50,688.4 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:688.9,690.18 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:690.18,692.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:694.58,696.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:713.30,715.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:719.2,722.3 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:725.2,727.33 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:727.33,729.18 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:732.4,733.55 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:736.4,736.39 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:729.18,731.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:733.55,735.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:741.2,743.36 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:748.3,749.17 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:761.3,774.42 12 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:743.36,745.4 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:749.17,750.67 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:754.4,755.25 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:750.67,753.5 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:755.25,758.5 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:778.22,780.3 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:780.8,782.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:788.14,789.35 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:790.14,791.35 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:792.10,793.65 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:798.14,799.22 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:800.17,802.19 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:806.10,807.60 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:802.19,805.4 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:811.16,812.40 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:812.40,814.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:814.9,818.4 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:831.52,833.27 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:840.2,865.25 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:887.2,888.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:891.2,894.26 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:915.2,915.22 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:920.2,920.17 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:833.27,835.30 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:835.30,837.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:865.25,873.3 5 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:876.2,877.29 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:881.3,881.27 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:877.29,880.4 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:881.27,884.4 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:888.16,890.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:894.26,898.26 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:901.3,901.74 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:904.3,904.94 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:907.3,907.89 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:910.3,910.91 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:898.26,900.4 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:901.74,903.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:904.94,906.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:907.89,909.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:910.91,912.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:915.22,919.3 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:923.45,924.26 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:929.2,929.12 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:924.26,925.89 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:925.89,927.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:932.41,934.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:937.2,938.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:941.2,941.29 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:934.16,936.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:938.16,940.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:944.59,946.27 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:955.2,955.17 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:946.27,947.16 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:947.16,949.18 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:952.4,952.27 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:949.18,951.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:958.30,961.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:965.2,965.22 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:961.16,964.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:966.16,967.47 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:968.17,970.20 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:974.3,974.39 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:975.10,976.37 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:970.20,972.59 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:980.24,982.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:985.2,985.17 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config.go:982.16,984.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/config_legacy.go:18.41,23.2 4 1 +github.com/ethereum/go-ethereum/internal/cli/server/config_legacy.go:25.53,29.42 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/config_legacy.go:32.2,32.29 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/config_legacy.go:29.42,31.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/flags.go:7.44,484.2 91 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:44.49,52.62 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:57.2,57.43 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:62.2,63.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:66.2,67.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:70.2,73.2 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:83.2,84.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:88.2,89.16 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:92.2,98.36 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:105.2,105.27 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:112.2,112.55 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:118.2,118.72 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:123.2,123.41 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:126.2,126.17 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:52.62,54.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:57.43,59.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:63.16,65.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:67.16,69.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:73.2,76.40 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:79.3,79.72 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:76.40,78.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:84.16,86.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:89.16,91.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:98.36,99.107 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:99.107,101.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:105.27,106.100 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:106.100,108.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:112.55,113.48 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:113.48,115.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:118.72,120.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:123.41,125.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:129.25,133.21 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:133.21,134.65 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:134.65,136.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:140.82,144.22 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:149.2,152.106 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:172.2,174.33 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:195.2,195.40 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:236.2,236.12 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:144.22,147.3 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:152.106,153.29 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:157.3,161.16 4 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:165.3,165.16 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:153.29,155.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:161.16,164.4 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:165.16,168.4 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:174.33,178.85 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:182.3,187.13 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:178.85,180.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:187.13,188.54 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:188.54,190.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:195.40,205.17 3 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:210.3,215.17 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:221.3,233.28 5 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:205.17,207.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:215.17,217.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:239.53,244.16 4 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:248.2,248.12 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:254.2,255.12 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:244.16,246.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:248.12,249.49 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:249.49,251.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:258.66,260.2 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:262.157,267.2 4 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:269.35,272.14 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:275.2,280.16 4 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:285.2,285.32 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:272.14,274.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:280.16,282.3 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/server.go:282.8,284.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:21.85,27.18 5 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:35.2,35.16 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:40.2,48.16 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:53.2,56.72 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:60.2,60.47 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:65.2,68.16 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:71.2,71.12 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:28.30,29.66 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:30.32,31.61 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:32.33,33.59 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:35.16,37.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:48.16,50.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:56.72,58.4 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:60.47,62.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:68.16,70.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:74.109,76.16 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:79.2,80.17 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:85.2,85.39 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:76.16,78.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:80.17,82.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:82.8,84.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:88.118,90.16 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:93.2,94.17 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:99.2,99.42 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:90.16,92.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:94.17,96.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:96.8,98.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:102.112,106.26 3 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:109.2,109.18 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:106.26,108.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:112.118,114.48 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:122.2,123.21 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:126.2,126.18 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:114.48,115.41 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:115.41,116.23 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:119.4,119.16 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:116.23,118.5 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:123.21,125.3 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:129.53,139.2 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:141.121,144.2 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:146.93,163.2 4 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:165.57,170.2 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:175.74,178.36 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:220.2,220.14 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:178.36,180.34 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:184.3,187.40 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:180.34,182.4 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:187.40,190.42 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:193.4,193.47 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:197.4,202.29 3 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:217.4,217.31 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:190.42,191.13 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:193.47,194.13 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:203.17,205.20 2 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:210.24,211.35 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:213.12,214.13 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:205.20,207.6 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:207.11,209.6 1 1 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:223.72,227.31 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:235.2,235.19 1 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:227.31,233.3 2 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:238.99,246.6 5 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:246.6,253.17 3 0 +github.com/ethereum/go-ethereum/internal/cli/server/service.go:253.17,255.4 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error.go:39.73,41.9 2 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:44.2,45.18 2 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:48.2,48.12 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:41.9,42.30 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error.go:45.18,47.3 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:51.37,53.2 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error.go:91.37,92.39 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:95.2,95.30 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:92.39,94.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error.go:98.36,100.2 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:102.47,103.40 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:106.2,106.32 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:109.2,110.8 2 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:118.2,118.29 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:103.40,105.3 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:106.32,108.3 1 1 +github.com/ethereum/go-ethereum/p2p/peer_error.go:110.8,111.25 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error.go:112.41,113.28 1 0 +github.com/ethereum/go-ethereum/p2p/peer_error.go:114.11,115.31 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:66.29,68.2 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:76.32,78.2 1 0 +github.com/ethereum/go-ethereum/p2p/protocol.go:82.47,82.65 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:83.47,83.78 1 1 +github.com/ethereum/go-ethereum/p2p/protocol.go:84.52,86.2 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:54.66,56.2 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:58.48,65.16 6 1 +github.com/ethereum/go-ethereum/p2p/transport.go:78.2,78.17 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:65.16,77.3 2 1 +github.com/ethereum/go-ethereum/p2p/transport.go:81.49,87.75 4 1 +github.com/ethereum/go-ethereum/p2p/transport.go:92.2,94.16 3 1 +github.com/ethereum/go-ethereum/p2p/transport.go:99.2,100.48 2 1 +github.com/ethereum/go-ethereum/p2p/transport.go:105.2,105.12 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:87.75,89.3 1 0 +github.com/ethereum/go-ethereum/p2p/transport.go:94.16,96.3 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:100.48,104.3 3 0 +github.com/ethereum/go-ethereum/p2p/transport.go:108.42,115.19 3 1 +github.com/ethereum/go-ethereum/p2p/transport.go:126.2,126.16 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:115.19,116.61 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:116.61,118.60 2 1 +github.com/ethereum/go-ethereum/p2p/transport.go:118.60,123.5 3 1 +github.com/ethereum/go-ethereum/p2p/transport.go:129.89,132.2 2 1 +github.com/ethereum/go-ethereum/p2p/transport.go:134.98,140.12 2 1 +github.com/ethereum/go-ethereum/p2p/transport.go:141.2,141.55 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:145.2,145.31 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:149.2,151.19 2 1 +github.com/ethereum/go-ethereum/p2p/transport.go:140.12,140.50 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:141.55,144.3 2 0 +github.com/ethereum/go-ethereum/p2p/transport.go:145.31,147.3 1 0 +github.com/ethereum/go-ethereum/p2p/transport.go:154.67,156.16 2 1 +github.com/ethereum/go-ethereum/p2p/transport.go:159.2,159.39 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:162.2,162.25 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:171.2,171.30 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:174.2,175.40 2 1 +github.com/ethereum/go-ethereum/p2p/transport.go:178.2,178.51 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:181.2,181.17 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:156.16,158.3 1 0 +github.com/ethereum/go-ethereum/p2p/transport.go:159.39,161.3 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:162.25,170.3 3 1 +github.com/ethereum/go-ethereum/p2p/transport.go:171.30,173.3 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:175.40,177.3 1 1 +github.com/ethereum/go-ethereum/p2p/transport.go:178.51,180.3 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:35.47,37.2 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:40.56,42.2 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:45.45,46.22 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:51.2,51.14 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:46.22,47.21 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:47.21,49.4 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:55.66,56.42 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:56.42,58.19 2 1 +github.com/ethereum/go-ethereum/p2p/util.go:58.19,60.4 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:65.39,65.56 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:66.39,66.69 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:67.39,67.66 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:68.39,68.71 1 1 +github.com/ethereum/go-ethereum/p2p/util.go:69.37,75.2 5 1 +github.com/ethereum/go-ethereum/p2p/dial.go:66.82,68.2 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:70.39,72.2 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:144.49,145.29 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:148.2,148.20 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:151.2,151.22 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:154.2,154.21 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:160.2,160.12 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:145.29,147.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:148.20,150.3 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:151.22,153.3 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:154.21,159.3 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:163.101,183.2 7 1 +github.com/ethereum/go-ethereum/p2p/dial.go:186.32,189.2 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:192.50,193.9 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:194.26,194.26 0 1 +github.com/ethereum/go-ethereum/p2p/dial.go:195.22,195.22 0 0 +github.com/ethereum/go-ethereum/p2p/dial.go:200.53,201.9 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:202.26,202.26 0 1 +github.com/ethereum/go-ethereum/p2p/dial.go:203.22,203.22 0 0 +github.com/ethereum/go-ethereum/p2p/dial.go:208.44,209.9 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:210.24,210.24 0 1 +github.com/ethereum/go-ethereum/p2p/dial.go:211.22,211.22 0 0 +github.com/ethereum/go-ethereum/p2p/dial.go:216.46,217.9 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:218.24,218.24 0 1 +github.com/ethereum/go-ethereum/p2p/dial.go:219.22,219.22 0 0 +github.com/ethereum/go-ethereum/p2p/dial.go:224.49,231.6 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:310.2,311.22 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:314.2,314.13 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:231.6,235.16 3 1 +github.com/ethereum/go-ethereum/p2p/dial.go:240.3,243.10 3 1 +github.com/ethereum/go-ethereum/p2p/dial.go:235.16,237.4 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:237.9,239.4 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:244.26,245.44 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:251.27,255.24 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:257.27,258.53 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:261.4,265.48 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:270.27,271.53 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:274.4,275.35 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:277.32,281.14 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:284.4,286.32 3 1 +github.com/ethereum/go-ethereum/p2p/dial.go:290.32,294.19 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:301.21,302.21 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:304.23,306.14 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:245.44,247.5 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:247.10,249.5 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:258.53,260.5 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:265.48,267.5 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:271.53,273.5 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:281.14,282.18 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:286.32,288.5 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:294.19,296.34 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:296.34,298.6 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:311.22,313.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:319.54,322.16 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:322.16,323.10 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:324.31,324.31 0 1 +github.com/ethereum/go-ethereum/p2p/dial.go:325.23,325.23 0 1 +github.com/ethereum/go-ethereum/p2p/dial.go:333.36,335.52 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:338.2,338.70 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:341.2,342.22 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:335.52,337.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:338.70,340.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:347.61,348.73 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:351.2,354.53 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:348.73,350.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:354.53,354.73 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:358.60,359.53 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:359.53,361.3 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:365.41,369.52 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:369.52,373.3 3 1 +github.com/ethereum/go-ethereum/p2p/dial.go:378.45,380.30 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:383.2,384.13 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:380.30,382.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:388.56,389.22 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:392.2,392.35 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:398.2,398.36 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:401.2,401.34 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:404.2,404.61 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:407.2,407.48 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:410.2,410.12 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:389.22,391.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:392.35,397.3 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:398.36,400.3 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:401.34,403.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:404.61,406.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:407.48,409.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:414.63,415.67 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:421.2,421.16 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:415.67,420.3 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:425.55,427.69 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:427.69,429.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:432.57,433.31 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:436.2,437.46 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:433.31,434.51 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:442.55,450.2 7 1 +github.com/ethereum/go-ethereum/p2p/dial.go:453.51,458.12 5 1 +github.com/ethereum/go-ethereum/p2p/dial.go:458.12,461.3 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:475.62,477.2 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:483.42,484.38 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:488.2,489.16 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:484.38,486.3 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:489.16,491.69 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:491.69,492.20 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:492.20,494.5 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:499.39,501.2 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:509.51,510.23 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:513.2,513.25 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:516.2,516.88 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:519.2,521.21 3 1 +github.com/ethereum/go-ethereum/p2p/dial.go:530.2,533.13 4 1 +github.com/ethereum/go-ethereum/p2p/dial.go:510.23,512.3 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:513.25,515.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:516.88,518.3 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:521.21,523.39 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:526.3,527.15 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:523.39,525.4 1 0 +github.com/ethereum/go-ethereum/p2p/dial.go:537.67,539.16 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:543.2,544.40 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:539.16,542.3 2 1 +github.com/ethereum/go-ethereum/p2p/dial.go:547.36,550.2 2 0 +github.com/ethereum/go-ethereum/p2p/dial.go:552.38,553.65 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:556.2,556.12 1 1 +github.com/ethereum/go-ethereum/p2p/dial.go:553.65,555.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:55.46,57.38 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:60.2,60.12 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:57.38,59.3 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:63.32,65.2 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:68.32,71.2 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:73.33,75.2 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:100.64,102.16 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:105.2,105.71 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:102.16,104.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:117.73,119.2 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:132.51,133.18 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:141.2,142.29 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:145.2,147.50 3 1 +github.com/ethereum/go-ethereum/p2p/message.go:151.2,151.15 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:133.18,134.19 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:138.3,138.19 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:134.19,137.4 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:142.29,144.3 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:147.50,150.3 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:157.41,166.2 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:182.45,183.37 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:199.2,199.22 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:183.37,186.10 3 1 +github.com/ethereum/go-ethereum/p2p/message.go:187.19,188.20 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:195.4,195.14 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:196.20,196.20 0 1 +github.com/ethereum/go-ethereum/p2p/message.go:188.20,190.12 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:191.21,191.21 0 1 +github.com/ethereum/go-ethereum/p2p/message.go:192.22,192.22 0 0 +github.com/ethereum/go-ethereum/p2p/message.go:203.44,204.37 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:211.2,211.29 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:204.37,205.10 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:206.21,207.19 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:208.20,208.20 0 1 +github.com/ethereum/go-ethereum/p2p/message.go:217.35,218.39 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:223.2,224.12 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:218.39,222.3 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:230.69,232.16 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:235.2,235.22 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:238.2,238.20 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:241.2,242.16 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:245.2,245.38 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:248.2,249.16 2 1 +github.com/ethereum/go-ethereum/p2p/message.go:252.2,252.45 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:255.2,255.12 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:232.16,234.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:235.22,237.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:238.20,240.3 1 1 +github.com/ethereum/go-ethereum/p2p/message.go:242.16,243.48 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:245.38,247.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:249.16,251.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:252.45,254.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:272.114,281.2 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:285.46,287.16 2 0 +github.com/ethereum/go-ethereum/p2p/message.go:290.2,299.17 2 0 +github.com/ethereum/go-ethereum/p2p/message.go:287.16,289.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:304.47,306.16 2 0 +github.com/ethereum/go-ethereum/p2p/message.go:309.2,318.12 2 0 +github.com/ethereum/go-ethereum/p2p/message.go:306.16,308.3 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:323.37,324.47 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:327.2,327.12 1 0 +github.com/ethereum/go-ethereum/p2p/message.go:324.47,326.3 1 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:55.78,57.22 1 1 +github.com/ethereum/go-ethereum/p2p/metrics.go:61.2,61.13 1 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:66.2,67.33 2 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:57.22,59.3 1 1 +github.com/ethereum/go-ethereum/p2p/metrics.go:61.13,63.3 1 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:63.8,65.3 1 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:72.57,76.2 3 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:80.58,84.2 3 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:88.37,90.16 2 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:93.2,93.12 1 0 +github.com/ethereum/go-ethereum/p2p/metrics.go:90.16,92.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:123.58,128.27 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:132.2,137.13 6 1 +github.com/ethereum/go-ethereum/p2p/peer.go:128.27,131.3 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:143.79,147.2 3 0 +github.com/ethereum/go-ethereum/p2p/peer.go:150.30,152.2 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:155.35,157.2 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:160.30,162.17 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:165.2,165.10 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:162.17,164.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:169.34,171.2 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:174.29,177.2 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:182.66,183.42 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:190.2,190.14 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:183.42,184.32 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:184.32,185.28 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:185.28,187.5 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:194.38,196.2 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:199.37,201.2 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:205.46,206.23 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:210.2,210.9 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:206.23,208.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:211.24,211.24 0 1 +github.com/ethereum/go-ethereum/p2p/peer.go:212.18,212.18 0 1 +github.com/ethereum/go-ethereum/p2p/peer.go:217.32,220.2 2 0 +github.com/ethereum/go-ethereum/p2p/peer.go:223.31,225.2 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:227.70,239.2 3 1 +github.com/ethereum/go-ethereum/p2p/peer.go:241.33,243.2 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:245.56,262.6 7 1 +github.com/ethereum/go-ethereum/p2p/peer.go:289.2,292.29 4 1 +github.com/ethereum/go-ethereum/p2p/peer.go:262.6,263.10 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:264.25,267.18 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:271.4,271.28 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:272.24,273.37 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:279.4,279.14 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:280.27,282.14 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:283.23,285.14 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:267.18,269.15 2 0 +github.com/ethereum/go-ethereum/p2p/peer.go:273.37,276.5 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:276.10,278.5 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:295.27,299.6 4 1 +github.com/ethereum/go-ethereum/p2p/peer.go:299.6,300.10 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:301.17,302.51 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:306.4,306.28 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:307.19,308.10 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:302.51,305.5 2 0 +github.com/ethereum/go-ethereum/p2p/peer.go:313.44,315.6 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:315.6,317.17 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:321.3,322.38 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:317.17,320.4 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:322.38,325.4 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:329.38,330.9 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:361.2,361.12 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:331.27,333.30 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:334.27,339.13 3 1 +github.com/ethereum/go-ethereum/p2p/peer.go:340.37,342.23 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:343.10,346.17 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:349.3,349.22 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:354.3,354.10 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:346.17,348.4 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:349.22,353.4 3 0 +github.com/ethereum/go-ethereum/p2p/peer.go:355.24,356.14 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:357.19,358.17 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:364.67,366.27 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:373.2,373.10 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:366.27,367.35 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:367.35,368.62 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:368.62,370.5 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:377.93,383.27 4 1 +github.com/ethereum/go-ethereum/p2p/peer.go:398.2,398.15 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:383.27,384.35 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:384.35,385.62 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:385.62,387.44 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:391.5,394.19 3 1 +github.com/ethereum/go-ethereum/p2p/peer.go:387.44,389.6 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:401.82,403.34 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:403.34,409.22 6 1 +github.com/ethereum/go-ethereum/p2p/peer.go:412.3,413.13 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:409.22,411.4 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:413.13,416.18 3 1 +github.com/ethereum/go-ethereum/p2p/peer.go:422.4,422.21 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:416.18,419.5 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:419.10,419.28 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:419.28,421.5 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:429.56,430.34 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:435.2,435.57 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:430.34,431.63 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:431.63,433.4 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:448.50,449.27 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:452.2,457.9 4 1 +github.com/ethereum/go-ethereum/p2p/peer.go:468.2,468.12 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:449.27,451.3 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:458.19,464.17 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:465.19,466.24 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:471.43,472.9 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:473.22,475.18 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:476.19,477.23 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:501.33,504.31 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:508.2,515.24 2 1 +github.com/ethereum/go-ethereum/p2p/peer.go:518.2,525.34 6 1 +github.com/ethereum/go-ethereum/p2p/peer.go:536.2,536.13 1 1 +github.com/ethereum/go-ethereum/p2p/peer.go:504.31,506.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:515.24,517.3 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:525.34,527.53 2 0 +github.com/ethereum/go-ethereum/p2p/peer.go:534.3,534.41 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:527.53,528.50 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:528.50,530.5 1 0 +github.com/ethereum/go-ethereum/p2p/peer.go:530.10,532.5 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:245.32,247.33 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:250.2,251.10 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:247.33,249.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:254.35,256.24 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:259.2,259.26 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:262.2,262.29 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:265.2,265.24 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:268.2,268.13 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:271.2,271.10 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:256.24,258.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:259.26,261.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:262.29,264.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:265.24,267.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:268.13,270.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:274.36,277.2 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:279.42,280.6 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:280.6,283.10 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:288.3,288.84 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:283.10,285.4 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:285.9,287.4 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:288.84,290.4 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:295.49,297.2 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:300.36,302.46 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:307.2,307.11 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:302.46,303.27 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:303.27,305.4 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:311.36,313.43 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:316.2,316.14 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:313.43,315.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:322.46,324.2 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:331.49,337.46 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:346.2,346.15 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:337.46,339.44 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:339.44,343.4 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:346.15,348.22 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:348.22,349.60 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:349.60,351.5 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:358.53,359.9 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:360.30,360.30 0 1 +github.com/ethereum/go-ethereum/p2p/server.go:361.18,361.18 0 0 +github.com/ethereum/go-ethereum/p2p/server.go:366.56,367.9 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:368.33,368.33 0 1 +github.com/ethereum/go-ethereum/p2p/server.go:369.18,369.18 0 0 +github.com/ethereum/go-ethereum/p2p/server.go:374.75,376.2 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:379.39,384.15 4 1 +github.com/ethereum/go-ethereum/p2p/server.go:387.2,387.18 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:384.15,386.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:392.27,394.18 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:398.2,399.25 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:403.2,405.19 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:394.18,397.3 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:399.25,402.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:416.85,418.9 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:421.2,422.16 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:425.2,426.28 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:418.9,420.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:422.16,424.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:430.39,432.2 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:436.40,439.17 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:442.2,444.20 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:447.2,447.22 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:450.2,450.40 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:455.2,455.27 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:458.2,458.29 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:461.2,461.27 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:464.2,473.45 9 1 +github.com/ethereum/go-ethereum/p2p/server.go:476.2,476.26 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:481.2,481.45 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:484.2,488.12 4 1 +github.com/ethereum/go-ethereum/p2p/server.go:439.17,441.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:444.20,446.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:447.22,449.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:450.40,452.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:455.27,457.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:458.29,460.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:461.27,463.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:473.45,475.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:476.26,477.46 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:477.46,479.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:481.45,483.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:491.43,495.34 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:498.2,502.16 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:505.2,509.34 4 1 +github.com/ethereum/go-ethereum/p2p/server.go:514.2,514.24 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:532.2,532.12 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:495.34,497.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:502.16,504.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:509.34,510.34 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:510.34,512.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:515.11,515.11 0 1 +github.com/ethereum/go-ethereum/p2p/server.go:517.17,520.32 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:521.10,525.13 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:525.13,527.51 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:527.51,529.5 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:535.43,540.38 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:548.2,548.41 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:552.2,553.16 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:556.2,557.16 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:560.2,562.20 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:571.2,576.22 4 0 +github.com/ethereum/go-ethereum/p2p/server.go:597.2,597.21 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:614.2,614.12 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:540.38,541.56 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:541.56,544.4 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:548.41,550.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:553.16,555.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:557.16,559.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:562.20,563.32 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:563.32,565.14 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:565.14,568.5 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:576.22,577.22 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:581.3,589.17 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:592.3,593.44 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:577.22,580.4 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:589.17,591.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:597.21,605.19 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:610.3,610.17 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:605.19,607.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:607.9,609.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:610.17,612.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:617.41,627.21 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:630.2,630.26 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:633.2,634.36 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:627.21,629.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:630.26,632.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:634.36,636.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:639.42,641.2 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:643.49,644.37 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:647.2,647.24 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:652.2,652.16 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:655.2,655.14 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:644.37,646.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:647.24,649.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:649.8,651.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:652.16,654.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:658.43,661.16 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:664.2,668.51 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:679.2,681.12 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:661.16,663.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:668.51,670.45 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:670.45,672.14 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:672.14,675.5 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:685.44,686.9 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:687.24,688.19 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:689.18,689.18 0 0 +github.com/ethereum/go-ethereum/p2p/server.go:694.26,708.37 7 1 +github.com/ethereum/go-ethereum/p2p/server.go:712.1,713.6 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:780.2,783.21 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:786.2,786.23 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:790.2,790.26 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:796.2,796.21 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:708.37,710.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:713.6,714.10 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:715.19,717.17 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:719.30,724.34 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:728.33,733.34 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:737.27,740.32 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:742.43,745.28 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:750.4,750.61 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:752.37,756.18 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:766.4,766.17 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:768.28,774.20 5 1 +github.com/ethereum/go-ethereum/p2p/server.go:724.34,726.5 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:733.34,735.5 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:745.28,748.5 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:756.18,762.20 5 1 +github.com/ethereum/go-ethereum/p2p/server.go:762.20,764.6 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:774.20,776.5 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:783.21,785.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:786.23,788.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:790.26,792.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:796.21,800.3 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:803.99,804.9 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:805.56,806.26 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:807.88,808.26 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:809.33,810.30 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:811.41,812.18 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:813.10,814.13 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:818.93,820.82 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:825.2,825.56 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:820.82,822.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:830.33,835.29 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:838.2,839.30 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:845.2,846.15 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:852.2,852.6 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:835.29,837.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:839.30,841.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:846.15,847.35 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:847.35,849.4 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:852.6,861.7 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:878.3,879.56 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:885.3,885.22 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:893.3,893.13 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:861.7,863.37 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:875.4,875.9 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:863.37,864.44 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:868.5,869.13 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:864.44,867.6 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:870.10,870.25 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:870.25,874.5 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:879.56,883.12 4 1 +github.com/ethereum/go-ethereum/p2p/server.go:885.22,887.53 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:890.4,891.65 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:887.53,889.5 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:893.13,896.4 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:900.60,901.21 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:905.2,905.67 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:909.2,911.80 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:914.2,915.12 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:901.21,903.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:905.67,907.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:911.80,913.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:921.87,923.21 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:929.2,930.16 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:933.2,933.12 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:923.21,925.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:925.8,927.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:930.16,932.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:936.83,941.14 4 1 +github.com/ethereum/go-ethereum/p2p/server.go:946.2,946.21 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:956.2,957.16 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:961.2,961.21 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:966.2,968.16 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:974.2,975.16 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:979.2,979.70 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:983.2,985.16 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:990.2,990.12 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:941.14,943.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:946.21,948.71 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:948.71,952.4 3 0 +github.com/ethereum/go-ethereum/p2p/server.go:957.16,960.3 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:961.21,963.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:963.8,965.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:968.16,971.3 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:975.16,978.3 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:979.70,982.3 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:985.16,988.3 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:993.71,996.53 3 1 +github.com/ethereum/go-ethereum/p2p/server.go:1000.2,1000.44 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:996.53,999.3 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:1005.66,1006.9 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:1011.2,1011.17 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:1007.18,1007.18 0 1 +github.com/ethereum/go-ethereum/p2p/server.go:1008.18,1009.26 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1014.46,1016.25 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:1021.2,1022.10 2 1 +github.com/ethereum/go-ethereum/p2p/server.go:1016.25,1020.3 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1026.37,1027.28 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:1030.2,1055.4 4 1 +github.com/ethereum/go-ethereum/p2p/server.go:1027.28,1029.3 1 1 +github.com/ethereum/go-ethereum/p2p/server.go:1074.41,1090.38 6 0 +github.com/ethereum/go-ethereum/p2p/server.go:1099.2,1099.13 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1090.38,1091.47 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1091.47,1093.45 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:1096.4,1096.41 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1093.45,1095.5 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1103.44,1106.35 2 0 +github.com/ethereum/go-ethereum/p2p/server.go:1112.2,1112.34 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1119.2,1119.14 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1106.35,1107.18 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1107.18,1109.4 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1112.34,1113.39 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1113.39,1114.33 1 0 +github.com/ethereum/go-ethereum/p2p/server.go:1114.33,1116.5 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:148.86,156.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:161.110,169.9 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:185.2,185.16 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:190.2,190.54 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:195.2,198.46 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:209.2,210.29 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:170.40,171.57 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:172.24,174.68 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:175.10,177.21 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:177.21,180.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:180.9,183.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:185.16,187.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:190.54,192.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:198.46,201.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:201.8,201.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:201.27,204.17 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:204.17,206.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:214.85,225.2 6 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:227.44,232.2 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:235.80,237.14 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:247.2,248.32 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:251.2,258.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:238.19,239.35 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:240.21,241.37 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:242.21,243.37 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:244.10,245.64 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:248.32,249.68 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:262.69,267.53 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:270.2,277.30 6 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:267.53,269.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:281.83,283.48 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:288.2,300.18 8 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:283.48,284.60 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:304.115,306.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:311.2,312.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:317.2,318.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:323.2,337.27 10 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:306.27,307.49 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:312.16,314.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:318.16,320.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:341.123,348.78 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:351.2,352.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:355.2,362.16 6 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:365.2,370.36 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:375.2,376.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:379.2,379.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:348.78,350.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:352.16,354.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:362.16,364.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:370.36,372.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:376.16,378.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:383.80,388.16 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:391.2,396.18 6 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:388.16,390.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:399.103,403.49 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:406.2,410.16 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:413.2,413.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:403.49,405.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:410.16,412.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:417.102,419.41 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:422.2,432.56 9 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:437.2,449.19 8 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:459.2,459.28 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:419.41,421.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:432.56,434.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:450.21,451.48 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:452.21,453.73 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:454.19,455.61 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:456.10,457.23 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:463.82,464.51 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:467.2,477.15 6 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:464.51,466.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:480.136,482.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:488.2,489.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:495.2,497.23 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:482.16,485.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:489.16,492.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:500.127,501.61 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:506.2,507.22 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:511.2,512.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:516.2,519.16 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:523.2,524.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:528.2,530.30 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:501.61,503.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:507.22,509.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:512.16,514.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:519.16,521.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:524.16,526.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:534.91,536.50 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:539.2,550.34 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:553.2,556.18 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:536.50,538.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:550.34,552.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:562.111,564.21 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:580.2,580.17 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:583.2,583.18 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:564.21,566.58 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:569.3,569.49 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:566.58,568.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:569.49,571.18 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:574.4,574.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:577.4,577.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:571.18,573.5 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:574.24,576.5 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:580.17,582.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:587.106,588.49 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:591.2,599.30 7 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:603.2,603.17 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:588.49,590.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:599.30,602.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:606.90,608.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:611.2,611.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:614.2,614.47 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:608.16,610.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:611.23,613.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:619.56,620.32 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:623.2,623.28 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:626.2,626.59 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:629.2,629.33 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:632.2,632.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:620.32,622.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:623.28,625.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:626.59,628.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:629.33,631.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:636.54,638.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:641.2,641.38 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:638.16,639.31 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:644.40,648.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:149.61,151.15 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:177.2,177.51 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:180.2,180.56 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:183.2,183.17 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:152.15,153.18 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:154.15,155.18 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:156.19,157.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:158.16,159.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:160.22,161.25 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:162.23,163.26 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:164.24,165.27 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:166.17,167.20 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:168.19,169.22 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:170.26,171.29 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:172.21,173.24 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:174.10,175.58 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:177.51,179.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:180.56,182.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:186.40,186.65 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:187.40,187.66 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:188.40,188.54 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:189.41,189.42 0 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:191.38,191.61 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:192.38,192.62 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:193.38,193.52 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:194.39,194.40 0 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:196.40,196.60 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:197.40,197.58 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:198.40,198.58 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:199.40,199.56 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:201.40,201.60 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:202.40,202.58 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:203.40,203.58 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:204.40,204.56 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:206.44,206.68 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:207.44,207.66 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:208.44,208.62 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:209.44,209.60 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:211.41,211.62 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:212.41,212.60 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:213.41,213.59 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:214.41,214.57 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:216.47,216.70 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:217.47,217.72 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:218.47,218.65 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:219.47,219.63 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:221.48,221.72 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:222.48,222.74 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:223.48,223.66 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:224.48,224.64 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:226.49,226.74 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:227.49,227.76 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:228.49,228.67 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:229.49,229.65 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:231.44,231.68 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:232.44,232.66 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:233.44,233.62 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:234.44,234.60 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:236.42,236.64 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:237.42,237.62 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:238.42,238.60 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:239.42,239.58 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:241.51,241.82 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:242.51,242.80 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:243.51,243.69 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:244.51,244.67 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:246.46,246.72 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:247.46,247.70 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:248.46,248.64 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:249.46,249.62 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:60.42,62.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:64.70,66.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:69.2,76.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:66.16,67.38 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:79.57,83.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:85.42,88.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:91.62,94.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:97.68,99.9 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:102.2,102.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:99.9,101.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:106.66,107.41 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:110.2,110.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:107.41,109.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:114.79,116.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:119.75,121.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:124.92,127.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:130.67,132.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:135.39,137.44 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:137.44,138.32 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:138.32,140.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:44.48,45.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:46.21,47.36 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:48.10,49.77 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:54.77,55.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:56.21,57.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:60.3,60.36 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:61.10,62.86 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:57.19,59.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:67.81,74.2 6 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:77.120,79.19 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:80.21,82.17 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:85.3,85.35 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:86.10,87.74 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:82.17,84.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:94.32,94.54 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:97.116,98.59 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:99.12,101.29 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:104.3,105.50 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:108.3,108.13 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:109.10,110.83 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:101.29,103.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:105.50,107.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:117.120,125.16 7 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:128.2,132.21 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:135.2,135.13 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:125.16,127.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:132.21,134.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:139.70,141.17 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:144.2,147.12 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:141.17,143.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:153.79,155.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:158.2,159.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:162.2,162.59 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:155.16,156.58 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:159.16,160.49 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:166.66,168.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:171.2,171.32 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:174.2,175.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:178.2,179.45 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:168.16,170.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:171.32,173.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:175.16,177.3 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:73.170,86.2 4 1 +github.com/ethereum/go-ethereum/miner/miner.go:92.30,96.15 3 1 +github.com/ethereum/go-ethereum/miner/miner.go:102.2,105.6 4 1 +github.com/ethereum/go-ethereum/miner/miner.go:96.15,97.23 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:97.23,99.4 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:105.6,106.10 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:107.26,108.17 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:113.4,113.26 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:138.32,140.16 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:143.4,143.22 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:144.23,146.23 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:147.23,149.10 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:108.17,111.13 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:114.31,118.18 4 1 +github.com/ethereum/go-ethereum/miner/miner.go:123.32,125.20 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:129.30,131.20 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:136.5,136.25 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:118.18,122.6 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:125.20,128.6 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:131.20,134.6 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:140.16,142.5 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:154.52,156.2 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:158.28,160.2 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:162.29,165.2 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:167.35,169.2 1 1 +github.com/ethereum/go-ethereum/miner/miner.go:171.39,172.49 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:175.2,175.10 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:172.49,174.3 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:178.50,179.54 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:182.2,183.12 2 0 +github.com/ethereum/go-ethereum/miner/miner.go:179.54,181.3 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:187.65,189.2 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:192.62,194.2 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:201.49,203.2 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:206.78,208.2 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:210.55,213.2 2 1 +github.com/ethereum/go-ethereum/miner/miner.go:217.45,219.2 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:225.37,227.2 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:234.38,236.2 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:240.142,242.2 1 0 +github.com/ethereum/go-ethereum/miner/miner.go:246.85,248.2 1 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:57.80,62.2 1 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:65.70,79.23 6 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:85.2,85.71 1 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:79.23,81.3 1 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:81.8,83.3 1 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:91.52,95.24 3 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:95.24,98.44 2 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:102.3,103.10 2 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:128.3,128.50 1 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:98.44,99.9 1 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:104.22,105.97 1 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:106.35,107.91 1 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:108.11,111.111 2 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:121.4,121.16 1 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:111.111,112.66 1 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:112.66,113.43 1 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:113.43,114.36 1 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:114.36,116.13 2 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:121.16,123.5 1 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:123.10,125.5 1 0 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:128.50,130.4 1 1 +github.com/ethereum/go-ethereum/miner/unconfirmed.go:130.9,134.4 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:99.45,110.24 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:116.2,119.38 4 1 +github.com/ethereum/go-ethereum/miner/worker.go:122.2,122.12 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:110.24,113.3 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:119.38,121.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:126.53,128.35 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:131.2,131.15 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:128.35,130.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:137.35,138.22 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:141.2,141.28 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:138.22,140.3 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:250.188,283.36 6 1 +github.com/ethereum/go-ethereum/miner/worker.go:288.2,295.10 6 1 +github.com/ethereum/go-ethereum/miner/worker.go:298.2,298.15 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:283.36,286.3 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:295.10,297.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:302.52,306.2 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:308.42,312.2 3 0 +github.com/ethereum/go-ethereum/miner/worker.go:315.41,319.2 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:322.62,323.9 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:324.40,324.40 0 0 +github.com/ethereum/go-ethereum/miner/worker.go:325.18,325.18 0 0 +github.com/ethereum/go-ethereum/miner/worker.go:330.35,332.2 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:335.34,337.2 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:340.59,344.28 3 0 +github.com/ethereum/go-ethereum/miner/worker.go:347.2,347.48 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:344.28,346.3 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:351.46,356.2 3 0 +github.com/ethereum/go-ethereum/miner/worker.go:359.75,364.2 3 0 +github.com/ethereum/go-ethereum/miner/worker.go:367.26,370.2 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:373.25,375.2 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:378.35,380.2 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:384.26,388.2 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:391.94,413.2 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:416.54,429.40 6 1 +github.com/ethereum/go-ethereum/miner/worker.go:443.2,443.38 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:453.2,453.6 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:429.40,430.23 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:433.3,434.10 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:439.3,440.34 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:430.23,432.4 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:435.97,435.97 0 1 +github.com/ethereum/go-ethereum/miner/worker.go:436.19,437.10 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:443.38,445.36 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:450.3,450.23 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:445.36,446.52 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:446.52,448.5 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:453.6,454.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:455.20,458.41 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:460.32,463.41 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:465.18,468.89 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:477.43,479.38 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:483.4,486.29 3 0 +github.com/ethereum/go-ethereum/miner/worker.go:490.39,492.18 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:503.4,503.29 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:507.19,508.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:468.89,470.41 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:474.5,474.42 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:470.41,472.14 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:479.38,482.5 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:486.29,488.5 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:492.18,497.5 4 0 +github.com/ethereum/go-ethereum/miner/worker.go:497.10,501.5 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:503.29,505.5 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:516.29,521.15 5 1 +github.com/ethereum/go-ethereum/miner/worker.go:527.2,530.6 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:521.15,522.23 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:522.23,524.4 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:530.6,531.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:532.29,533.59 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:535.29,537.18 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:544.30,546.57 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:549.4,549.58 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:553.4,553.66 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:561.4,561.70 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:568.24,570.43 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:575.4,575.44 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:581.24,587.42 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:614.4,614.50 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:617.19,618.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:619.25,620.10 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:621.31,622.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:623.31,624.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:537.18,540.5 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:540.10,542.5 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:546.57,547.13 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:549.58,550.13 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:553.66,555.5 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:555.10,557.5 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:561.70,563.71 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:563.71,565.6 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:570.43,571.66 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:571.66,573.6 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:575.44,576.66 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:576.66,578.6 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:587.42,589.70 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:592.5,593.31 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:597.5,603.35 4 0 +github.com/ethereum/go-ethereum/miner/worker.go:589.70,590.14 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:593.31,596.6 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:603.35,605.6 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:606.10,610.72 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:610.72,612.6 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:631.29,639.22 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:645.2,645.6 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:639.22,640.20 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:640.20,643.4 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:645.6,646.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:647.27,648.28 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:652.4,653.24 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:657.4,660.53 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:663.4,667.81 4 1 +github.com/ethereum/go-ethereum/miner/worker.go:673.19,675.10 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:648.28,650.5 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:653.24,654.13 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:660.53,661.13 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:667.81,672.5 4 1 +github.com/ethereum/go-ethereum/miner/worker.go:682.31,684.6 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:684.6,685.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:686.30,688.20 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:692.4,692.57 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:695.4,696.23 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:704.4,711.14 5 1 +github.com/ethereum/go-ethereum/miner/worker.go:716.4,720.46 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:742.4,743.18 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:747.4,754.57 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:756.19,757.10 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:688.20,689.13 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:692.57,693.13 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:696.23,699.41 3 0 +github.com/ethereum/go-ethereum/miner/worker.go:699.41,701.14 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:711.14,713.13 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:720.46,733.46 8 1 +github.com/ethereum/go-ethereum/miner/worker.go:739.5,739.41 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:733.46,738.6 4 1 +github.com/ethereum/go-ethereum/miner/worker.go:743.18,745.13 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:763.116,767.16 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:777.2,777.16 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:780.2,793.71 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:801.2,802.17 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:767.16,776.3 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:777.16,779.3 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:793.71,794.43 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:797.3,798.37 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:794.43,796.4 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:806.75,807.32 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:810.2,811.41 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:814.2,814.47 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:817.2,817.47 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:820.2,820.31 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:823.2,824.12 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:807.32,809.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:811.41,813.3 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:814.47,816.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:817.47,819.3 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:820.31,822.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:828.51,841.2 5 1 +github.com/ethereum/go-ethereum/miner/worker.go:843.99,847.16 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:851.2,854.26 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:847.16,850.3 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:857.118,859.24 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:862.2,864.6 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:947.2,947.46 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:964.2,964.22 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:967.2,967.14 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:859.24,861.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:864.6,871.77 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:886.3,886.39 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:891.3,892.16 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:899.3,902.67 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:909.3,912.10 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:871.77,873.62 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:883.4,883.64 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:873.62,875.20 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:878.5,881.6 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:875.20,877.6 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:886.39,888.9 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:892.16,893.9 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:902.67,906.12 3 0 +github.com/ethereum/go-ethereum/miner/worker.go:913.48,916.13 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:918.44,921.15 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:923.45,926.13 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:928.28,932.15 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:934.51,937.13 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:939.11,943.15 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:947.46,956.35 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:960.3,960.30 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:956.35,959.4 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:964.22,966.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:984.79,990.45 4 1 +github.com/ethereum/go-ethereum/miner/worker.go:993.2,993.19 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:998.2,999.32 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1006.2,1014.45 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:1018.2,1018.41 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1022.2,1022.43 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1030.2,1030.58 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1037.2,1038.16 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1043.2,1043.24 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1060.2,1060.17 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:990.45,992.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:993.19,995.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:999.32,1000.26 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1003.3,1003.32 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1000.26,1002.4 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:1014.45,1016.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1018.41,1020.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1022.43,1024.47 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1024.47,1027.4 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:1030.58,1033.3 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:1038.16,1041.3 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:1043.24,1044.61 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1057.3,1058.31 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1044.61,1045.36 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1045.36,1046.29 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1049.5,1049.62 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1046.29,1047.11 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1049.62,1051.6 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1051.11,1053.6 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1066.71,1071.50 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:1077.2,1077.23 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1083.2,1083.24 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1071.50,1072.46 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1072.46,1075.4 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1077.23,1079.48 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1079.48,1081.4 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:1083.24,1085.48 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:1085.48,1087.4 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:1092.77,1094.16 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1097.2,1100.114 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:1094.16,1096.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1105.78,1110.19 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:1117.2,1121.16 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1126.2,1126.52 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1130.2,1135.22 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:1138.2,1138.18 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1110.19,1111.39 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1115.3,1115.24 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1111.39,1114.4 2 0 +github.com/ethereum/go-ethereum/miner/worker.go:1121.16,1123.3 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:1126.52,1128.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1135.22,1137.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1145.96,1146.19 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1172.2,1172.12 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1175.2,1175.12 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1146.19,1147.22 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1152.3,1154.17 3 1 +github.com/ethereum/go-ethereum/miner/worker.go:1158.3,1158.38 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1147.22,1149.4 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1154.17,1156.4 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:1158.38,1159.11 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1160.106,1165.58 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1167.20,1168.34 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:1172.12,1174.3 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1179.139,1192.9 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1193.26,1195.19 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1198.3,1198.20 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1199.18,1200.41 1 0 +github.com/ethereum/go-ethereum/miner/worker.go:1195.19,1197.4 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1206.58,1209.2 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1212.63,1214.29 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1218.2,1218.15 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1214.29,1217.3 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1222.59,1223.9 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1224.30,1224.30 0 1 +github.com/ethereum/go-ethereum/miner/worker.go:1225.18,1225.18 0 0 +github.com/ethereum/go-ethereum/miner/worker.go:1230.74,1232.42 2 1 +github.com/ethereum/go-ethereum/miner/worker.go:1236.2,1236.108 1 1 +github.com/ethereum/go-ethereum/miner/worker.go:1232.42,1235.3 2 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:41.34,41.50 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:43.47,45.2 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:47.50,49.2 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:54.47,56.2 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:61.30,61.46 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:66.31,66.48 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:71.30,71.46 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:76.31,76.48 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:83.29,83.44 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:90.29,91.28 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:94.2,94.13 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:91.28,93.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:98.42,99.40 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:102.2,102.41 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:105.2,105.56 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:99.40,101.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:102.41,104.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:109.45,110.47 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:113.2,113.35 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:116.2,116.12 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:110.47,112.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:113.35,115.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:122.31,122.46 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:125.44,127.16 2 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:130.2,130.27 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:127.16,129.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:134.47,135.47 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:138.2,138.18 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:141.2,141.12 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:135.47,137.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:138.18,140.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:147.31,147.47 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:150.44,152.16 2 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:155.2,155.27 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:152.16,154.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:159.47,160.47 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:163.2,163.19 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:166.2,166.12 1 1 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:160.47,162.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:163.19,165.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:176.37,177.28 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:180.2,180.56 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:177.28,179.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/entries.go:185.33,188.2 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:69.56,71.14 2 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:74.2,74.25 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:71.14,73.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:77.47,79.14 2 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:82.2,82.22 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:79.14,81.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:100.31,102.2 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:107.35,111.2 3 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:118.38,119.50 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:120.2,120.52 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:126.2,126.53 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:119.50,119.87 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:120.52,121.58 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:124.3,124.13 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:121.58,123.4 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:132.31,134.16 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:137.2,141.48 4 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:142.2,142.9 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:156.2,156.17 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:134.16,135.65 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:141.48,141.83 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:143.50,145.20 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:146.24,151.16 4 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:152.10,154.48 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:159.31,160.24 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:163.2,164.13 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:160.24,162.3 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:168.37,169.24 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:172.2,174.12 3 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:169.24,171.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:179.46,180.24 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:183.2,184.12 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:180.24,182.3 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:188.49,190.16 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:193.2,195.12 3 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:190.16,192.3 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:198.70,200.16 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:203.2,203.26 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:208.2,209.36 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:212.2,212.48 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:218.2,218.42 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:225.2,226.20 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:251.2,251.30 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:200.16,202.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:203.26,205.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:209.36,211.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:212.48,213.21 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:216.3,216.23 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:213.21,215.4 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:218.42,219.21 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:222.3,222.23 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:219.21,221.4 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:226.20,228.41 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:234.3,234.41 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:240.3,240.12 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:248.3,249.17 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:228.41,229.22 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:232.4,232.24 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:229.22,230.10 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:234.41,235.22 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:238.4,238.24 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:235.22,237.5 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:240.12,241.23 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:244.4,244.22 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:241.23,243.5 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:244.22,246.5 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:255.42,259.2 3 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:262.58,264.2 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:273.61,274.9 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:294.2,294.12 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:276.30,277.77 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:278.30,279.77 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:281.16,282.42 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:285.3,286.17 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:289.3,289.32 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:291.10,292.32 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:282.42,284.4 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:286.17,288.4 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:298.67,300.28 2 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:303.2,303.13 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:300.28,302.3 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:306.61,310.52 4 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:313.2,313.26 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:316.2,316.17 1 1 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:310.52,312.3 1 0 +github.com/ethereum/go-ethereum/p2p/enr/enr.go:313.26,315.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:64.41,71.22 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:74.2,74.30 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:77.2,77.25 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:80.2,80.24 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:83.2,83.29 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:86.2,86.25 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:89.2,89.23 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:92.2,92.12 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:71.22,73.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:74.30,76.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:77.25,79.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:80.24,82.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:83.29,85.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:86.25,88.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:89.23,91.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:96.36,99.16 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:102.2,108.3 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:99.16,100.13 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:112.54,114.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:117.2,119.46 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:122.2,123.15 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:114.16,116.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:119.46,121.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:128.70,130.27 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:135.2,135.16 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:130.27,131.41 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:131.41,133.4 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:139.86,140.70 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:153.2,153.27 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:140.70,143.17 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:146.3,146.28 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:151.3,151.55 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:143.17,145.4 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:146.28,147.42 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:147.42,149.5 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:156.72,158.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:161.2,161.36 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:164.2,164.15 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:158.16,160.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:161.36,163.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:169.88,173.46 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:176.2,177.42 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:181.2,181.72 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:189.2,190.15 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:173.46,175.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:177.42,179.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:181.72,183.17 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:186.3,187.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:183.17,185.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:194.90,196.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:199.2,202.16 4 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:205.2,205.27 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:217.2,217.41 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:196.16,198.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:202.16,204.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:205.27,207.29 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:210.3,210.64 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:215.3,215.16 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:207.29,208.12 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:210.64,212.4 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:212.9,212.24 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:212.24,214.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:235.54,243.2 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:246.46,248.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:251.35,257.2 4 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:260.39,263.2 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:266.53,268.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:271.2,272.12 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:268.16,270.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:276.50,277.6 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:277.6,279.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:282.3,283.17 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:290.3,290.15 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:279.16,281.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:283.17,284.27 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:287.4,288.12 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:284.27,286.5 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:290.15,292.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:297.50,303.21 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:308.2,308.19 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:313.2,313.6 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:303.21,305.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:308.19,311.3 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:313.6,315.10 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:316.16,318.39 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:319.23,322.37 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:326.11,328.14 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:322.37,325.5 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:334.79,340.30 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:347.2,347.30 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:350.2,350.31 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:340.30,341.25 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:341.25,343.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:343.9,345.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:347.30,349.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:354.72,357.27 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:365.2,369.9 5 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:357.27,359.42 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:359.42,362.4 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:370.21,371.14 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:372.23,373.15 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:378.42,380.28 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:386.2,386.34 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:380.28,381.31 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:381.31,383.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:386.34,387.27 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:387.27,390.4 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/error.go:49.37,50.40 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/error.go:53.2,53.42 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/error.go:50.40,52.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/error.go:61.38,63.2 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:50.74,52.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:55.60,56.60 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:59.2,59.50 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:62.2,62.49 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:65.2,65.12 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:56.60,58.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:59.50,61.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:62.49,64.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:70.82,71.24 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:78.2,78.15 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:85.2,85.22 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:89.2,94.20 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:97.2,97.34 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:71.24,72.44 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:72.44,74.4 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:78.15,79.17 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:79.17,81.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:85.22,88.3 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:94.20,96.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:101.44,106.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:110.33,111.56 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:114.2,115.31 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:111.56,113.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:118.63,121.16 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:124.2,126.36 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:130.2,130.12 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:121.16,123.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:126.36,129.3 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:133.83,137.16 4 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:140.2,141.33 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:144.2,144.17 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:137.16,139.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:141.33,143.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:147.39,149.2 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:152.49,153.17 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:156.2,157.18 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:161.2,161.17 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:153.17,155.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:157.18,160.3 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:165.61,166.33 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:170.2,174.16 5 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:178.2,183.52 4 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:187.2,187.50 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:190.2,190.12 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:166.33,168.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:174.16,177.3 2 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:183.52,186.3 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:187.50,189.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:194.44,198.2 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:200.63,202.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:207.68,209.9 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:217.2,219.9 3 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:210.29,211.27 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:212.28,213.26 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:214.10,215.14 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:220.21,221.14 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:222.20,223.15 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:237.85,239.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:241.36,243.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:245.64,246.17 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:257.2,257.12 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:246.17,251.17 5 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:254.3,255.30 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:251.17,253.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:260.85,262.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:265.2,265.23 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:279.2,279.15 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:262.16,264.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:266.17,267.14 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:270.3,270.14 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:271.18,272.15 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:275.3,275.14 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:276.20,277.49 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:267.14,269.4 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:272.15,274.4 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:288.50,290.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:292.47,293.40 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:297.2,297.24 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:300.2,300.35 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:303.2,304.19 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:293.40,295.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:297.24,299.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:300.35,302.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:308.72,310.19 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:310.19,314.36 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:314.36,315.28 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:318.4,318.32 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:321.4,323.22 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:315.28,316.13 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:318.32,319.13 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:323.22,326.5 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:43.83,46.16 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:49.2,52.27 4 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:46.16,48.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:57.78,59.54 2 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:62.2,64.35 3 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:67.2,68.12 2 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:59.54,61.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:64.35,66.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:72.27,74.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:77.35,79.2 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:82.55,84.30 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:91.2,91.16 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:84.30,86.19 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:89.3,89.27 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:86.19,88.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:95.33,97.30 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:102.2,102.14 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:97.30,98.35 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:98.35,100.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:106.38,108.30 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:113.2,113.14 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:108.30,109.34 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:109.34,111.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:154.77,160.28 4 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:167.2,168.28 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:171.2,172.26 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:181.2,187.15 7 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:160.28,161.39 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:161.39,163.4 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:168.28,170.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:172.26,174.17 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:177.3,177.22 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:174.17,176.4 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:190.45,191.23 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:194.2,194.33 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:202.2,203.23 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:213.2,213.26 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:191.23,193.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:194.33,196.29 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:200.3,200.30 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:196.29,199.4 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:203.23,205.23 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:208.3,211.34 4 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:205.23,207.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:216.50,217.40 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:220.2,220.14 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:217.40,219.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:263.32,267.2 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:269.37,271.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:273.38,277.2 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:279.67,283.2 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:285.39,287.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:289.36,291.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:293.37,295.2 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:297.70,301.2 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:305.75,306.9 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:307.40,308.27 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:309.42,310.24 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:311.39,312.35 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:313.10,314.30 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:318.45,321.108 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:324.2,324.48 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:327.2,328.55 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:331.2,331.48 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:321.108,323.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:324.48,326.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:328.55,330.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:334.46,336.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:339.2,339.16 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:336.16,338.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:342.46,343.39 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:346.2,348.15 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:351.2,353.16 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:356.2,357.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:360.2,360.40 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:343.39,345.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:348.15,350.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:353.16,355.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:357.16,359.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:363.43,365.13 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:368.2,369.42 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:375.2,375.34 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:365.13,367.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:369.42,370.22 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:373.3,373.29 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:370.22,372.4 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:378.73,381.16 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:384.2,385.51 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:388.2,389.16 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:392.2,392.26 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:381.16,383.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:385.51,387.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:389.16,391.3 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:395.33,397.73 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:400.2,402.19 3 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:397.73,399.3 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:406.39,408.24 2 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:411.2,411.22 1 1 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:408.24,409.59 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:417.79,419.16 2 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:422.2,422.34 1 0 +github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:419.16,421.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:149.70,150.17 1 1 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:153.2,156.3 1 1 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:150.17,152.3 1 1 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:166.70,176.2 4 1 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:180.37,183.2 2 1 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:189.73,195.16 3 1 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:200.2,200.18 1 1 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:203.2,206.110 3 1 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:195.16,198.3 2 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:200.18,202.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:246.44,255.2 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:258.61,262.33 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:265.2,268.12 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:262.33,264.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:272.45,276.34 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:279.2,280.12 2 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:276.34,278.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:287.52,292.2 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:296.52,299.32 2 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:304.2,307.33 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:313.2,313.29 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:316.2,316.29 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:319.2,319.15 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:299.32,303.3 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:307.33,309.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:309.8,309.26 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:309.26,311.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:313.29,315.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:316.29,318.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:326.56,331.2 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:335.56,337.32 2 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:344.2,344.35 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:347.2,347.19 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:337.32,339.37 2 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:342.3,342.20 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:339.37,341.4 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:344.35,346.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:355.52,364.2 4 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:370.50,379.2 4 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:383.50,385.34 2 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:388.2,388.16 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:385.34,387.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:393.27,400.12 4 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:405.2,408.56 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:412.2,417.86 5 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:400.12,402.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:408.56,410.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:423.29,425.26 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:431.2,431.44 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:435.2,438.37 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:441.2,441.117 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:425.26,428.3 2 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:431.44,433.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:438.37,440.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:446.82,451.20 4 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:454.2,454.42 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:451.20,453.3 1 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:459.85,463.47 3 0 +github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:463.47,465.3 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/toobig_notwindows.go:25.37,27.2 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:22.35,23.26 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:24.19,25.14 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:26.20,27.14 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:28.20,29.14 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:30.10,31.13 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/error.go:20.39,25.2 2 0 +github.com/ethereum/go-ethereum/p2p/netutil/error.go:28.32,33.2 2 0 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:50.86,59.2 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:64.48,68.38 4 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:73.2,73.14 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:68.38,69.52 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:69.52,71.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:77.47,83.34 4 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:90.2,90.12 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:83.34,86.44 3 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:86.44,88.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:94.58,97.56 3 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:97.56,99.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:104.46,107.61 3 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:107.61,109.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:112.55,115.37 3 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:115.37,116.22 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:116.22,118.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:122.52,125.35 3 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:125.35,126.18 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:126.18,128.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:31.13,66.2 30 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:73.47,77.29 4 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:87.2,87.16 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:77.29,78.17 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:81.3,82.17 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:85.3,85.20 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:78.17,79.12 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:82.17,84.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:91.44,93.24 2 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:96.2,96.13 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:93.24,95.3 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:100.67,102.35 2 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:105.2,105.29 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:112.2,112.12 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:102.35,104.3 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:105.29,107.17 2 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:110.3,110.22 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:107.17,109.4 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:117.36,119.16 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:122.2,122.21 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:119.16,120.13 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:126.44,127.14 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:130.2,130.25 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:135.2,135.14 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:127.14,129.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:130.25,131.23 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:131.23,133.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:139.28,140.21 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:143.2,143.31 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:146.2,146.26 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:140.21,142.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:143.31,145.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:151.39,152.22 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:155.2,155.31 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:158.2,158.30 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:152.22,154.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:155.31,157.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:177.46,178.58 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:181.2,181.26 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:184.2,184.28 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:187.2,187.47 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:190.2,190.35 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:193.2,193.12 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:178.58,180.3 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:181.26,183.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:184.28,186.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:187.47,189.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:190.35,192.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:197.48,199.9 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:200.39,201.15 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:202.18,203.36 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:204.10,205.48 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:209.48,212.64 3 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:215.2,215.51 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:212.64,214.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:230.46,233.17 3 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:237.2,237.14 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:233.17,236.3 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:241.44,243.41 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:243.41,244.13 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:244.13,246.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:246.9,248.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:253.50,257.2 3 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:260.35,262.30 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:265.2,265.15 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:262.30,264.3 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:272.48,274.22 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:279.2,280.33 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:283.2,284.28 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:288.2,292.31 5 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:295.2,295.12 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:274.22,277.3 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:280.33,282.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:284.28,286.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:292.31,294.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:299.41,303.27 4 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:306.2,307.25 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:320.2,321.21 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:303.27,305.3 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:307.25,309.18 2 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:314.3,316.23 3 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:309.18,311.4 1 1 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:311.9,313.4 1 0 +github.com/ethereum/go-ethereum/p2p/netutil/net.go:316.23,318.4 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:40.30,45.2 4 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:49.63,54.15 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:60.2,65.16 4 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:68.2,70.39 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:54.15,57.3 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:65.16,67.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:74.34,75.28 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:78.2,81.26 4 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:75.28,77.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:90.31,92.2 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:94.48,98.2 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:100.55,103.2 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:107.34,109.2 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:111.36,115.2 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:119.49,120.26 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:123.2,123.26 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:126.2,126.33 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:120.26,122.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:123.26,125.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:81.59,83.44 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:86.2,86.35 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:89.2,89.10 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:83.44,84.76 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:86.35,87.60 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:94.62,99.2 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:104.39,105.12 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:105.12,108.3 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:108.8,111.3 2 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:115.54,117.2 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:120.55,122.2 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:125.50,127.2 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:131.75,132.22 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:136.2,137.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:140.2,141.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:144.2,147.31 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:159.2,159.34 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:132.22,133.42 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:137.16,139.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:141.16,143.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:147.31,150.17 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:153.3,153.29 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:156.3,157.54 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:150.17,152.4 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:153.29,155.4 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:162.66,167.16 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:172.2,173.45 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:178.2,182.40 4 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:187.2,188.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:193.2,194.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:197.2,198.41 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:203.2,204.27 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:167.16,169.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:173.45,175.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:182.40,184.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:188.16,190.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:194.16,196.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:198.41,200.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:211.64,212.22 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:215.2,215.27 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:218.2,218.32 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:226.2,228.22 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:212.22,213.43 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:215.27,217.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:218.32,224.3 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:231.83,236.23 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:239.2,251.40 9 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:254.2,261.12 5 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:236.23,238.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:251.40,253.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:265.55,268.2 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:271.57,275.2 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:284.53,285.35 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:289.2,290.29 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:293.2,295.18 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:285.35,286.28 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:290.29,292.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:300.75,306.23 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:311.2,311.16 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:314.2,317.24 4 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:306.23,308.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:308.8,310.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:311.16,313.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:322.45,323.22 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:326.2,327.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:330.2,331.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:336.2,342.3 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:323.22,324.33 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:327.16,328.46 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:331.16,332.46 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:346.30,348.2 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:414.105,417.16 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:420.2,420.54 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:424.2,425.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:428.2,429.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:432.2,432.53 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:436.2,436.46 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:417.16,419.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:420.54,422.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:425.16,427.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:429.16,431.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:432.53,434.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:439.85,442.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:445.2,450.28 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:458.2,459.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:462.2,464.16 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:467.2,468.12 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:442.16,444.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:450.28,452.17 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:452.17,454.4 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:459.16,461.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:464.16,466.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:473.74,475.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:480.2,495.17 10 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:501.2,501.15 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:475.16,477.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:495.17,497.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:497.8,499.3 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:506.84,508.2 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:514.130,519.16 4 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:522.2,523.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:527.2,527.49 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:531.2,533.16 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:536.2,536.54 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:540.2,540.46 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:519.16,521.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:523.16,525.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:527.49,529.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:533.16,535.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:536.54,538.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:544.81,548.16 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:552.2,553.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:558.2,559.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:562.2,564.16 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:568.2,573.17 6 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:548.16,550.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:553.16,555.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:559.16,561.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:564.16,566.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:576.70,580.2 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:582.70,585.49 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:589.2,593.17 5 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:585.49,587.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:597.103,603.16 4 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:606.2,610.16 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:613.2,614.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:619.2,621.51 3 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:603.16,605.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:610.16,612.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:614.16,616.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:625.68,629.49 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:634.2,640.36 5 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:629.49,631.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:644.63,646.21 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:656.2,657.16 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:660.2,660.42 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:647.10,649.45 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:650.10,651.20 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:652.10,653.85 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:657.16,659.3 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:663.48,664.16 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:667.2,667.54 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:664.16,665.22 1 0 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:670.42,672.32 2 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:675.2,675.12 1 1 +github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:672.32,674.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:185.44,186.20 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:189.2,191.10 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:186.20,188.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:195.54,196.20 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:199.2,201.10 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:196.20,198.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:205.37,207.2 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:210.65,217.2 3 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:220.159,229.2 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:232.66,233.20 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:239.2,239.20 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:245.2,245.24 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:248.2,249.13 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:252.2,252.13 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:255.2,255.16 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:258.2,258.12 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:233.20,234.18 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:237.3,237.20 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:234.18,235.53 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:239.20,240.18 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:243.3,243.20 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:240.18,241.53 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:245.24,246.56 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:249.13,251.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:252.13,254.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:255.16,257.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:262.35,262.78 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:265.38,265.81 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:268.34,268.75 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:271.35,271.77 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:274.37,274.90 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:277.38,277.91 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:280.37,280.89 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:283.31,283.53 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:286.38,287.20 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:290.2,291.33 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:294.2,294.12 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:287.20,289.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:291.33,293.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:298.32,299.17 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:302.2,304.41 3 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:313.2,314.10 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:299.17,301.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:304.41,305.44 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:305.44,306.13 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:309.4,310.16 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:306.13,308.5 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:320.116,321.24 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:324.2,324.57 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:327.2,337.39 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:346.2,347.41 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:354.2,354.11 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:321.24,322.34 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:324.57,325.37 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:337.39,338.43 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:341.3,342.22 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:338.43,339.57 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:342.22,344.4 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:347.41,348.44 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:351.3,352.35 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:348.44,349.53 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:358.60,359.48 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:362.2,362.19 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:359.48,360.56 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:366.57,367.29 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:370.2,370.20 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:367.29,368.51 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:382.81,386.16 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:389.2,389.78 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:386.16,387.41 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:393.81,397.16 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:400.2,401.35 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:397.16,398.41 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:405.62,407.2 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:410.44,411.17 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:411.17,412.41 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:418.37,420.16 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:423.2,424.18 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:428.2,431.18 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:420.16,421.41 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:424.18,426.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:435.36,440.19 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:443.2,443.32 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:448.2,448.18 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:451.2,453.15 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:440.19,441.26 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:443.32,447.3 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:448.18,450.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:457.42,459.16 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:459.16,461.49 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:465.3,466.32 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:461.49,463.12 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:472.65,472.79 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:473.65,473.81 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:476.66,478.52 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:482.2,486.37 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:491.2,491.44 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:496.2,496.38 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:514.2,519.92 6 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:478.52,481.3 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:486.37,490.3 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:491.44,494.3 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:496.38,497.25 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:500.3,500.51 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:497.25,498.12 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:500.51,501.50 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:501.50,504.5 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:504.10,507.5 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:508.9,511.4 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:523.73,524.18 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:528.2,529.34 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:532.2,540.32 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:555.2,555.41 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:563.2,565.16 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:568.2,568.72 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:571.2,573.28 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:576.2,576.12 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:524.18,526.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:529.34,531.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:540.32,541.15 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:544.3,545.20 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:548.3,549.17 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:552.3,553.16 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:541.15,542.12 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:545.20,546.12 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:549.17,551.4 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:555.41,556.14 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:560.3,561.13 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:556.14,559.4 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:565.16,567.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:568.72,570.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:573.28,575.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:580.53,582.2 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:585.40,586.33 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:586.33,587.17 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:587.17,589.18 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:589.18,591.5 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:597.78,600.46 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:604.2,604.17 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:600.46,603.3 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:608.58,613.62 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:620.2,620.12 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:613.62,615.17 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:618.3,618.13 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:615.17,617.4 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:625.110,629.19 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:632.2,634.12 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:629.19,631.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:639.107,645.2 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:647.104,651.17 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:658.2,668.30 6 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:671.2,671.26 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:674.2,674.43 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:684.2,684.21 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:691.2,691.47 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:651.17,652.15 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:655.3,656.22 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:652.15,654.4 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:668.30,670.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:671.26,673.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:674.43,676.14 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:676.14,678.4 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:679.8,680.32 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:680.32,682.4 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:684.21,685.36 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:685.36,686.29 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:686.29,688.5 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:695.39,696.16 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:696.16,697.37 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:702.44,703.16 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:706.2,706.15 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:709.2,710.13 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:703.16,705.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:706.15,708.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:717.40,718.29 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:727.2,729.23 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:718.29,721.27 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:724.3,725.42 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:721.27,723.4 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:735.56,739.14 4 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:742.2,746.12 5 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:739.14,741.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:750.58,751.44 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:781.2,781.30 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:751.44,753.22 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:779.3,779.48 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:753.22,754.37 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:766.4,766.32 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:754.37,757.28 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:760.5,760.14 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:757.28,758.14 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:760.14,762.6 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:762.11,764.6 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:766.32,767.45 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:770.5,770.44 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:767.45,768.14 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:770.44,771.15 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:771.15,773.7 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:773.12,775.7 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:786.97,791.15 4 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:794.2,795.12 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:791.15,793.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:799.92,801.17 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:804.2,805.15 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:808.2,810.47 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:820.2,821.28 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:801.17,803.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:805.15,807.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:810.47,814.20 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:817.3,818.16 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:814.20,816.4 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:821.28,823.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:830.74,831.42 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:831.42,834.17 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:837.3,838.18 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:841.3,845.30 5 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:834.17,835.12 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:838.18,839.12 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:845.30,847.4 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:854.78,859.15 4 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:862.2,862.47 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:865.2,865.12 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:859.15,861.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:862.47,864.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:871.59,876.15 4 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:879.2,879.47 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:882.2,882.16 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:876.15,878.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:879.47,881.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:886.91,890.19 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:893.2,895.12 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:890.19,892.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:900.94,906.2 4 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:908.91,911.17 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:918.2,920.54 3 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:924.2,925.23 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:928.2,928.21 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:931.2,931.18 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:934.2,935.45 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:945.2,946.21 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:951.2,952.12 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:911.17,912.19 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:915.3,916.22 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:912.19,914.4 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:920.54,923.3 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:925.23,927.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:928.21,930.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:931.18,933.3 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:935.45,937.14 2 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:937.14,939.4 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:940.8,941.22 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:941.22,943.4 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:946.21,947.29 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:947.29,949.4 1 1 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:959.108,968.32 6 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:973.2,974.30 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:968.32,969.63 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:969.63,971.4 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:974.30,976.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:980.62,985.39 4 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:988.2,988.12 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:985.39,987.3 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:993.144,995.97 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:995.97,998.27 3 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1002.3,1002.15 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1019.3,1019.19 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:998.27,1000.4 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1002.15,1004.18 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1007.4,1007.22 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1004.18,1006.5 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1007.22,1009.5 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1010.9,1012.18 2 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1015.4,1015.23 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1012.18,1014.5 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1015.23,1017.5 1 0 +github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1019.19,1021.4 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:40.39,42.16 2 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:45.2,45.10 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:42.16,43.44 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:72.44,73.65 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:80.2,80.30 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:73.65,75.17 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:78.3,78.35 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:75.17,77.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:85.68,87.17 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:90.2,90.14 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:93.2,93.14 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:96.2,98.16 3 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:101.2,101.10 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:87.17,89.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:90.14,92.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:93.14,95.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:98.16,99.13 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:105.28,108.2 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:110.50,116.16 3 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:119.2,119.25 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:123.2,123.19 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:126.2,126.56 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:130.2,131.15 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:139.2,139.35 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:143.2,143.68 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:146.2,148.30 3 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:154.2,154.55 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:116.16,118.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:119.25,121.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:123.19,125.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:126.56,128.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:131.15,133.17 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:136.3,136.14 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:133.17,135.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:139.35,141.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:143.68,145.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:148.30,150.17 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:150.17,152.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:158.55,160.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:165.2,166.34 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:160.16,162.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:162.8,162.25 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:162.25,164.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:169.31,177.9 4 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:183.2,184.20 2 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:194.2,194.19 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:178.50,179.60 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:180.10,181.49 1 0 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:184.20,186.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:186.8,190.25 4 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:190.25,192.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:198.44,203.2 4 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:45.61,54.16 7 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:57.2,58.47 2 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:61.2,61.12 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:54.16,56.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:58.47,60.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:64.53,66.39 2 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:72.2,74.53 3 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:77.2,77.12 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:66.39,68.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:68.8,68.29 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:68.29,70.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:74.53,76.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:80.44,83.16 3 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:86.2,89.30 4 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:83.16,85.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:95.36,95.58 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:98.49,100.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:103.52,105.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:108.2,109.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:112.2,113.12 2 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:105.16,107.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:109.16,111.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:119.32,119.54 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:127.59,130.2 2 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:132.59,134.57 2 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:134.57,135.13 1 0 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:143.55,145.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:147.46,151.2 3 0 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:153.43,156.53 3 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:159.2,159.29 1 1 +github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:156.53,157.13 1 0 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:36.44,38.38 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:47.2,48.28 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:51.2,51.15 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:38.38,42.40 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:45.3,45.25 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:42.40,43.12 1 0 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:48.28,50.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:55.40,57.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:60.41,62.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:71.34,75.24 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:78.2,79.31 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:87.2,87.13 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:75.24,77.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:79.31,80.15 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:80.15,82.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:82.9,85.4 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:90.35,93.24 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:96.2,96.27 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:93.24,95.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:99.30,104.2 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:108.59,110.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:117.34,118.24 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:123.2,123.14 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:118.24,119.24 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:119.24,121.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:160.49,167.2 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:170.42,174.21 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:177.2,180.34 4 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:174.21,176.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:185.27,189.21 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:192.2,192.30 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:195.2,199.16 5 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:189.21,191.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:192.30,194.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:203.31,207.20 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:212.2,212.6 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:207.20,211.3 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:212.6,214.20 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:217.3,217.10 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:214.20,216.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:218.31,219.10 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:225.4,225.26 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:226.18,228.26 2 0 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:219.10,223.5 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:234.32,236.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:240.38,242.8 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:245.2,245.11 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:242.8,244.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:249.43,253.25 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:256.2,257.26 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:253.25,255.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:261.46,265.27 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:265.27,266.24 1 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:266.24,270.9 4 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:276.65,279.18 3 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:279.18,281.10 2 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:282.20,282.20 0 1 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:283.23,283.23 0 0 +github.com/ethereum/go-ethereum/p2p/enode/iter.go:284.17,285.10 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:70.61,87.2 5 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:90.37,92.2 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:95.35,98.14 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:103.2,108.41 3 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:117.2,118.39 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:122.2,124.30 3 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:98.14,100.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:108.41,110.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:118.39,120.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:128.35,133.2 3 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:136.30,138.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:147.39,152.2 3 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:154.39,156.43 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:156.43,159.3 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:163.42,168.2 3 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:170.42,172.12 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:172.12,175.3 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:178.59,179.21 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:182.2,182.22 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:179.21,181.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:187.45,193.2 4 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:197.47,203.2 4 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:207.47,214.2 5 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:218.76,224.2 4 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:228.54,234.2 4 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:237.40,241.40 3 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:246.2,246.40 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:251.2,251.15 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:256.2,256.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:241.40,243.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:243.8,245.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:246.40,248.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:248.8,250.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:251.15,253.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:253.8,255.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:256.31,258.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:258.8,260.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:264.59,266.25 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:269.2,269.23 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:275.2,275.23 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:266.25,268.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:269.23,271.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:271.8,271.56 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:271.56,274.3 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:280.57,282.14 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:285.2,288.16 4 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:291.2,291.25 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:282.14,284.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:288.16,290.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:294.35,296.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:298.29,299.42 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:303.2,304.31 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:307.2,309.43 3 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:312.2,313.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:316.2,317.110 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:299.42,301.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:304.31,306.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:309.43,310.57 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:313.16,314.65 1 0 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:320.32,323.2 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:326.31,328.12 2 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:331.2,331.33 1 1 +github.com/ethereum/go-ethereum/p2p/enode/localnode.go:328.12,330.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:43.73,44.56 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:47.2,48.75 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:51.2,51.18 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:44.56,46.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:48.75,50.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:55.37,57.16 2 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:60.2,60.10 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:57.16,58.40 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:64.74,65.42 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:68.2,68.39 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:71.2,72.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:75.2,76.49 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:79.2,79.30 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:65.42,67.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:68.39,70.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:72.16,74.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:76.49,78.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:83.24,85.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:88.29,90.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:93.34,95.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:98.40,100.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:103.28,108.25 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:111.2,111.25 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:114.2,114.12 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:108.25,110.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:111.25,113.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:118.26,122.2 3 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:125.26,129.2 3 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:132.42,134.39 2 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:137.2,137.13 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:134.39,136.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:142.37,145.2 2 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:149.41,150.20 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:153.2,153.18 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:156.2,157.44 2 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:161.2,162.21 2 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:150.20,152.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:153.18,155.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:157.44,159.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:166.32,167.16 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:170.2,172.21 3 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:167.16,169.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:176.46,178.2 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:181.49,183.16 2 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:186.2,186.12 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:183.16,185.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:193.28,195.2 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:198.29,200.2 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:203.31,205.2 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:208.37,210.2 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:213.43,215.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:218.47,220.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:223.2,224.12 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:220.16,222.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:230.26,232.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:235.2,235.11 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:232.16,233.13 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:238.37,241.16 3 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:246.2,247.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:241.16,243.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:243.8,243.30 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:243.30,245.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/node.go:253.35,254.24 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:263.2,263.10 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:254.24,257.14 3 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:257.14,259.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:259.9,259.21 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:259.21,261.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:267.27,269.19 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:278.2,278.22 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:269.19,271.13 2 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:271.13,273.4 1 1 +github.com/ethereum/go-ethereum/p2p/enode/node.go:273.9,275.9 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:80.39,81.16 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:84.2,84.30 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:81.16,83.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:88.33,90.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:93.2,93.53 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:90.16,92.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:98.48,101.63 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:104.2,104.16 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:109.2,113.13 4 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:131.2,131.53 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:101.63,103.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:104.16,106.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:114.27,116.71 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:121.11,123.37 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:116.71,119.4 2 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:123.37,125.44 2 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:128.4,128.32 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:125.44,127.5 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:135.28,140.2 4 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:143.52,144.49 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:147.2,149.29 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:144.49,146.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:153.57,155.17 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:158.2,158.76 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:155.17,156.55 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:162.68,165.35 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:168.2,171.33 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:174.2,177.22 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:165.35,167.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:171.33,173.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:180.51,188.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:191.47,196.2 4 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:199.44,201.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:204.2,205.15 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:208.2,208.12 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:201.16,203.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:205.15,207.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:212.53,216.2 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:219.46,221.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:224.2,225.12 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:221.16,223.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:229.55,233.2 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:236.33,238.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:241.2,241.36 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:238.16,240.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:244.44,246.55 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:250.2,251.13 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:246.55,247.74 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:255.44,256.40 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:259.2,260.16 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:263.2,263.66 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:266.2,266.78 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:256.40,258.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:260.16,262.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:263.66,265.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:270.37,272.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:276.38,277.34 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:280.2,280.24 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:277.34,279.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:284.33,286.2 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:288.49,291.16 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:291.16,293.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:305.31,306.22 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:306.22,306.41 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:311.25,314.6 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:314.6,315.10 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:316.17,317.20 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:318.18,319.10 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:326.29,329.16 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:333.2,338.13 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:329.16,331.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:338.13,340.26 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:350.3,352.28 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:340.26,342.27 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:345.4,345.24 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:342.27,344.5 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:345.24,348.5 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:352.28,355.52 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:358.4,358.20 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:355.52,357.5 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:365.60,366.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:369.2,369.69 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:366.31,368.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:373.82,374.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:377.2,377.72 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:374.31,376.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:381.60,382.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:386.2,387.69 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:382.31,384.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:391.82,392.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:395.2,395.72 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:392.31,394.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:399.47,400.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:403.2,403.65 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:400.31,402.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:407.66,408.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:411.2,411.74 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:408.31,410.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:415.49,416.31 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:419.2,419.59 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:416.31,418.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:423.68,424.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:427.2,427.68 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:424.31,426.3 1 0 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:433.38,434.66 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:437.2,437.26 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:434.66,436.3 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:441.46,443.2 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:447.63,457.57 3 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:481.2,481.14 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:457.57,467.15 6 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:471.3,471.60 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:474.3,474.24 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:479.3,479.27 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:467.15,469.17 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:471.60,472.17 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:474.24,475.31 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:475.31,476.18 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:486.43,487.43 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:494.2,494.12 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:487.43,489.37 2 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:492.3,492.43 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:489.37,490.12 1 1 +github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:498.23,501.2 2 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:52.34,55.31 3 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:59.2,59.25 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:55.31,58.3 2 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:62.54,64.31 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:69.2,69.16 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:72.2,73.15 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:76.2,76.16 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:64.31,67.3 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:69.16,71.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:73.15,75.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:79.109,81.16 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:84.2,88.38 4 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:81.16,83.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:88.38,90.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:93.50,95.16 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:98.2,99.16 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:102.2,102.31 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:113.2,113.83 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:95.16,97.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:99.16,101.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:102.31,104.17 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:107.3,107.30 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:104.17,106.4 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:107.30,108.64 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:108.64,110.5 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:116.75,117.38 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:117.38,119.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:122.32,124.2 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:126.53,131.25 4 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:134.2,136.12 3 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:131.25,133.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:141.31,144.101 2 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:154.2,154.101 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:165.2,165.34 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:170.2,170.12 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:144.101,145.33 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:151.3,151.13 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:146.47,147.101 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:148.48,149.103 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:154.101,155.33 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:163.3,163.13 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:156.47,157.101 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:158.47,159.101 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:160.48,161.103 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:165.34,166.29 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:166.29,168.4 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:176.90,178.16 2 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:182.2,183.43 2 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:212.2,212.12 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:178.16,181.3 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:183.43,184.26 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:187.3,187.67 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:184.26,185.12 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:187.67,188.13 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:192.4,200.19 4 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:203.4,206.25 2 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:188.13,190.5 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:200.19,202.5 1 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:206.25,209.5 2 1 +github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:212.12,214.3 1 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:62.44,68.20 2 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:74.2,74.14 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:68.20,70.16 2 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:70.16,72.4 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:75.25,76.18 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:77.27,78.20 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:79.21,80.16 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:83.3,83.24 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:84.14,85.21 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:86.34,87.22 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:88.10,89.59 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:80.16,82.4 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:99.94,102.15 3 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:107.2,107.83 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:112.2,112.6 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:102.15,106.3 3 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:107.83,109.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:109.8,111.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:112.6,113.10 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:114.21,115.11 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:118.20,120.85 2 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:123.4,123.29 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:115.11,117.5 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:120.85,122.5 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:133.45,133.70 1 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:134.45,134.91 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:138.72,138.86 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:139.72,139.86 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:143.22,146.59 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:146.59,148.13 2 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:149.3,149.13 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:150.3,150.35 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:155.3,155.13 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:148.13,148.40 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:149.13,149.39 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:150.35,151.30 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:151.30,153.5 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:161.23,163.2 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:168.36,169.20 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:172.2,172.46 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:169.20,171.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:191.66,194.2 1 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:196.113,197.33 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:200.2,200.71 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:197.33,199.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:203.79,204.33 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:207.2,207.58 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:204.33,206.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:210.49,211.33 1 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:214.2,214.29 1 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:211.33,213.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:217.36,220.20 3 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:223.2,223.25 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:220.20,222.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:227.33,228.19 1 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:233.2,233.20 1 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:236.2,236.12 1 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:228.19,232.3 3 1 +github.com/ethereum/go-ethereum/p2p/nat/nat.go:233.20,235.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:35.31,37.2 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:39.44,41.16 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:44.2,44.43 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:41.16,43.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:47.108,48.19 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:53.2,54.12 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:48.19,50.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:57.80,63.2 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:65.30,69.21 3 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:83.2,85.16 3 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:95.2,95.12 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:69.21,71.13 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:71.13,73.52 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:73.52,75.5 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:75.10,77.5 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:85.16,86.10 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:87.21,88.16 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:91.20,92.14 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:88.16,90.5 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:107.41,109.16 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:112.2,112.31 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:129.2,129.12 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:109.16,111.3 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:112.31,114.17 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:117.3,117.32 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:114.17,116.4 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:117.32,118.38 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:118.38,119.79 1 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:119.79,121.19 2 0 +github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:121.19,124.7 2 0 +github.com/ethereum/go-ethereum/params/config.go:422.62,423.15 1 0 +github.com/ethereum/go-ethereum/params/config.go:426.2,426.25 1 0 +github.com/ethereum/go-ethereum/params/config.go:423.15,425.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:430.48,443.2 10 0 +github.com/ethereum/go-ethereum/params/config.go:446.42,448.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:502.40,504.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:513.40,515.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:532.37,534.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:536.69,538.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:540.59,542.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:544.50,546.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:548.93,550.23 2 0 +github.com/ethereum/go-ethereum/params/config.go:553.2,554.35 2 0 +github.com/ethereum/go-ethereum/params/config.go:561.2,561.33 1 0 +github.com/ethereum/go-ethereum/params/config.go:550.23,552.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:554.35,557.47 3 0 +github.com/ethereum/go-ethereum/params/config.go:557.47,559.4 1 0 +github.com/ethereum/go-ethereum/params/config.go:564.66,566.33 2 0 +github.com/ethereum/go-ethereum/params/config.go:569.2,570.35 2 0 +github.com/ethereum/go-ethereum/params/config.go:577.2,577.43 1 0 +github.com/ethereum/go-ethereum/params/config.go:566.33,568.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:570.35,573.47 3 0 +github.com/ethereum/go-ethereum/params/config.go:573.47,575.4 1 0 +github.com/ethereum/go-ethereum/params/config.go:581.39,583.9 2 0 +github.com/ethereum/go-ethereum/params/config.go:593.2,612.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:584.23,585.20 1 0 +github.com/ethereum/go-ethereum/params/config.go:586.23,587.20 1 0 +github.com/ethereum/go-ethereum/params/config.go:588.20,589.17 1 0 +github.com/ethereum/go-ethereum/params/config.go:590.10,591.21 1 0 +github.com/ethereum/go-ethereum/params/config.go:616.54,618.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:621.52,623.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:626.51,628.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:631.51,633.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:636.51,638.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:641.54,643.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:646.59,648.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:651.56,653.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:658.55,660.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:663.53,665.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:668.51,670.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:673.51,675.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:678.57,680.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:683.93,684.38 1 0 +github.com/ethereum/go-ethereum/params/config.go:687.2,687.108 1 0 +github.com/ethereum/go-ethereum/params/config.go:684.38,686.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:692.94,697.6 3 1 +github.com/ethereum/go-ethereum/params/config.go:705.2,705.16 1 1 +github.com/ethereum/go-ethereum/params/config.go:697.6,699.73 2 1 +github.com/ethereum/go-ethereum/params/config.go:702.3,703.32 2 1 +github.com/ethereum/go-ethereum/params/config.go:699.73,700.9 1 1 +github.com/ethereum/go-ethereum/params/config.go:710.52,732.4 3 0 +github.com/ethereum/go-ethereum/params/config.go:751.2,751.12 1 0 +github.com/ethereum/go-ethereum/params/config.go:732.4,733.26 1 0 +github.com/ethereum/go-ethereum/params/config.go:747.3,747.40 1 0 +github.com/ethereum/go-ethereum/params/config.go:733.26,735.49 1 0 +github.com/ethereum/go-ethereum/params/config.go:739.4,739.49 1 0 +github.com/ethereum/go-ethereum/params/config.go:735.49,738.5 1 0 +github.com/ethereum/go-ethereum/params/config.go:739.49,740.42 1 0 +github.com/ethereum/go-ethereum/params/config.go:740.42,743.6 1 0 +github.com/ethereum/go-ethereum/params/config.go:747.40,749.4 1 0 +github.com/ethereum/go-ethereum/params/config.go:754.94,755.71 1 1 +github.com/ethereum/go-ethereum/params/config.go:758.2,758.67 1 1 +github.com/ethereum/go-ethereum/params/config.go:761.2,761.68 1 1 +github.com/ethereum/go-ethereum/params/config.go:764.2,764.65 1 1 +github.com/ethereum/go-ethereum/params/config.go:767.2,767.65 1 1 +github.com/ethereum/go-ethereum/params/config.go:770.2,770.65 1 1 +github.com/ethereum/go-ethereum/params/config.go:773.2,773.68 1 1 +github.com/ethereum/go-ethereum/params/config.go:776.2,776.71 1 1 +github.com/ethereum/go-ethereum/params/config.go:779.2,779.81 1 1 +github.com/ethereum/go-ethereum/params/config.go:782.2,782.73 1 1 +github.com/ethereum/go-ethereum/params/config.go:789.2,789.69 1 1 +github.com/ethereum/go-ethereum/params/config.go:792.2,792.75 1 1 +github.com/ethereum/go-ethereum/params/config.go:795.2,795.65 1 1 +github.com/ethereum/go-ethereum/params/config.go:798.2,798.65 1 1 +github.com/ethereum/go-ethereum/params/config.go:801.2,801.77 1 1 +github.com/ethereum/go-ethereum/params/config.go:804.2,804.71 1 1 +github.com/ethereum/go-ethereum/params/config.go:807.2,807.12 1 1 +github.com/ethereum/go-ethereum/params/config.go:755.71,757.3 1 1 +github.com/ethereum/go-ethereum/params/config.go:758.67,760.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:761.68,763.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:764.65,766.3 1 1 +github.com/ethereum/go-ethereum/params/config.go:767.65,769.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:770.65,772.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:773.68,775.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:776.71,778.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:779.81,781.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:782.73,785.78 1 1 +github.com/ethereum/go-ethereum/params/config.go:785.78,787.4 1 1 +github.com/ethereum/go-ethereum/params/config.go:789.69,791.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:792.75,794.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:795.65,797.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:798.65,800.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:801.77,803.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:804.71,806.3 1 0 +github.com/ethereum/go-ethereum/params/config.go:812.53,814.2 1 1 +github.com/ethereum/go-ethereum/params/config.go:817.38,818.29 1 1 +github.com/ethereum/go-ethereum/params/config.go:821.2,821.25 1 1 +github.com/ethereum/go-ethereum/params/config.go:818.29,820.3 1 1 +github.com/ethereum/go-ethereum/params/config.go:824.41,825.14 1 1 +github.com/ethereum/go-ethereum/params/config.go:828.2,828.14 1 1 +github.com/ethereum/go-ethereum/params/config.go:831.2,831.22 1 1 +github.com/ethereum/go-ethereum/params/config.go:825.14,827.3 1 1 +github.com/ethereum/go-ethereum/params/config.go:828.14,830.3 1 1 +github.com/ethereum/go-ethereum/params/config.go:844.85,846.9 2 1 +github.com/ethereum/go-ethereum/params/config.go:854.2,855.34 2 1 +github.com/ethereum/go-ethereum/params/config.go:858.2,858.12 1 1 +github.com/ethereum/go-ethereum/params/config.go:847.26,848.17 1 1 +github.com/ethereum/go-ethereum/params/config.go:849.56,850.20 1 1 +github.com/ethereum/go-ethereum/params/config.go:851.10,852.17 1 1 +github.com/ethereum/go-ethereum/params/config.go:855.34,857.3 1 1 +github.com/ethereum/go-ethereum/params/config.go:861.46,863.2 1 0 +github.com/ethereum/go-ethereum/params/config.go:879.63,881.20 2 1 +github.com/ethereum/go-ethereum/params/config.go:884.2,897.3 1 1 +github.com/ethereum/go-ethereum/params/config.go:881.20,883.3 1 0 +github.com/ethereum/go-ethereum/params/dao.go:39.38,158.2 1 0 +github.com/ethereum/go-ethereum/params/version.go:31.29,33.2 1 1 +github.com/ethereum/go-ethereum/params/version.go:36.37,38.23 2 1 +github.com/ethereum/go-ethereum/params/version.go:41.2,41.10 1 1 +github.com/ethereum/go-ethereum/params/version.go:38.23,40.3 1 1 +github.com/ethereum/go-ethereum/params/version.go:47.46,49.29 2 0 +github.com/ethereum/go-ethereum/params/version.go:52.2,52.25 1 0 +github.com/ethereum/go-ethereum/params/version.go:55.2,55.12 1 0 +github.com/ethereum/go-ethereum/params/version.go:49.29,51.3 1 0 +github.com/ethereum/go-ethereum/params/version.go:52.25,54.3 1 0 +github.com/ethereum/go-ethereum/params/version.go:58.58,60.25 2 0 +github.com/ethereum/go-ethereum/params/version.go:63.2,63.50 1 0 +github.com/ethereum/go-ethereum/params/version.go:66.2,66.12 1 0 +github.com/ethereum/go-ethereum/params/version.go:60.25,62.3 1 0 +github.com/ethereum/go-ethereum/params/version.go:63.50,65.3 1 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:123.67,125.17 2 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:141.2,141.59 1 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:126.26,127.18 1 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:128.26,129.18 1 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:130.26,131.18 1 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:132.25,133.17 1 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:134.25,135.17 1 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:136.29,137.22 1 0 +github.com/ethereum/go-ethereum/params/bootnodes.go:138.10,139.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:50.64,56.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:59.36,61.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:64.64,70.30 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:75.2,75.38 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:80.2,80.33 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:83.2,83.44 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:89.2,90.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:94.2,105.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:109.2,117.21 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:70.30,72.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:75.38,77.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:80.33,82.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:83.44,84.50 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:84.50,86.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:90.16,92.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:105.16,107.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:122.93,124.9 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:127.2,128.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:132.2,133.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:139.2,140.19 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:124.9,126.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:128.16,130.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:133.16,135.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:145.64,147.9 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:150.2,150.27 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:147.9,149.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:154.60,159.2 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:177.34,179.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:182.34,184.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:187.39,189.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:193.50,196.22 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:199.2,199.23 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:196.22,198.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:204.57,206.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:209.2,211.12 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:206.16,208.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:216.59,219.40 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:222.2,223.24 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:226.2,227.38 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:238.2,238.23 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:219.40,221.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:223.24,225.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:227.38,230.10 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:230.10,232.18 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:235.4,235.26 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:232.18,234.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:242.61,246.28 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:268.2,268.19 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:272.2,272.40 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:277.2,278.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:281.2,285.12 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:246.28,247.45 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:247.45,252.24 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:255.4,257.18 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:262.4,262.37 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:265.4,265.30 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:252.24,254.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:257.18,259.10 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:262.37,263.13 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:268.19,270.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:272.40,274.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:278.16,280.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:289.33,291.22 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:295.2,296.24 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:291.22,294.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:300.56,304.2 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:307.48,311.37 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:314.2,314.17 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:311.37,313.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:318.59,322.40 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:325.2,325.17 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:322.40,324.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:329.41,331.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:335.79,337.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:340.2,340.32 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:337.16,338.28 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:344.45,346.19 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:352.2,352.26 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:346.19,351.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:152.52,163.25 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:166.2,166.31 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:163.25,165.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:171.55,173.56 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:177.2,177.23 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:183.2,183.31 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:195.2,203.12 8 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:173.56,175.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:177.23,178.65 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:178.65,180.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:183.31,185.17 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:188.3,189.17 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:192.3,192.25 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:185.17,187.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:189.17,191.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:207.41,209.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:213.37,215.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:219.2,220.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:224.2,232.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:215.16,216.34 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:220.16,221.37 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:235.38,237.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:240.2,242.16 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:245.2,246.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:249.2,249.23 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:237.16,239.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:242.16,244.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:246.16,248.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:285.59,286.34 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:296.2,296.19 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:286.34,287.59 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:290.3,290.38 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:287.59,288.63 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:296.19,298.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:303.75,312.16 8 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:315.2,316.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:319.2,321.12 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:312.16,314.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:316.16,318.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:324.45,326.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:46.13,50.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:64.50,69.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:72.37,74.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:77.65,78.33 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:81.2,81.44 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:89.2,90.44 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:94.2,95.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:100.2,104.26 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:111.2,131.18 12 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:78.33,80.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:81.44,82.63 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:82.63,84.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:90.44,92.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:95.16,97.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:104.26,106.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:106.8,108.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:150.34,151.19 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:154.2,154.29 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:151.19,153.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:159.50,161.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:165.67,166.18 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:169.2,169.15 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:176.2,179.40 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:182.2,183.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:187.2,188.14 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:196.2,196.14 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:200.2,212.36 8 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:215.2,219.22 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:222.2,223.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:228.2,231.12 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:166.18,168.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:169.15,170.17 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:170.17,172.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:179.40,181.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:183.16,185.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:188.14,189.48 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:189.48,190.22 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:190.22,192.10 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:196.14,198.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:212.36,214.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:219.22,221.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:223.16,225.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:235.91,242.16 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:246.2,246.39 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:252.2,252.78 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:261.2,262.12 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:267.2,268.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:242.16,245.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:246.39,247.22 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:247.22,250.4 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:252.78,254.65 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:257.3,257.15 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:254.65,256.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:262.12,265.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:274.44,279.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:283.33,284.18 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:287.2,287.15 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:291.2,291.21 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:298.2,298.62 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:301.2,302.12 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:305.2,305.9 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:284.18,286.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:287.15,289.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:291.21,296.3 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:298.62,300.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:302.12,304.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:306.24,307.13 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:308.37,309.30 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:314.45,318.21 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:321.2,321.13 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:318.21,320.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:326.63,328.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:331.2,337.12 7 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:328.16,330.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:340.59,342.6 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:342.6,344.17 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:347.3,348.17 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:351.3,351.41 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:344.17,346.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:348.17,350.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:351.41,353.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:359.59,360.21 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:363.2,364.68 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:360.21,362.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:376.20,383.19 5 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:386.2,387.63 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:390.2,391.29 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:398.2,399.85 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:403.2,405.32 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:383.19,385.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:387.63,389.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:391.29,393.17 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:396.3,396.21 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:393.17,395.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:399.85,401.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:411.20,415.21 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:420.2,422.21 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:430.2,431.97 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:434.2,434.21 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:439.2,439.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:447.2,447.14 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:415.21,417.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:422.21,424.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:424.8,427.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:431.97,433.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:434.21,436.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:439.12,446.3 6 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:450.47,456.19 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:459.2,460.63 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:465.2,466.27 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:469.2,475.16 5 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:481.2,482.36 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:502.2,508.37 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:511.2,511.19 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:456.19,458.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:460.63,462.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:466.27,468.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:475.16,477.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:482.36,484.14 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:487.3,491.28 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:494.3,495.17 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:498.3,498.27 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:484.14,486.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:491.28,493.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:495.17,497.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:508.37,510.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:531.62,533.42 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:544.2,544.23 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:533.42,536.10 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:536.10,538.18 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:541.4,541.26 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:538.18,540.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:553.65,555.9 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:558.2,558.74 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:555.9,557.3 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:19.26,19.51 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:22.32,26.2 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:28.31,32.2 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:35.34,37.2 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:40.40,44.2 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:46.40,49.32 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:59.2,59.33 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:49.32,57.3 5 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:63.56,65.34 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:80.2,80.27 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:84.2,84.12 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:65.34,67.29 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:75.3,76.40 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:67.29,70.18 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:70.18,72.5 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:76.40,78.4 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:80.27,83.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:88.52,91.2 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:94.41,95.7 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:95.7,97.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:97.8,99.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:102.45,103.12 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:103.12,105.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:105.8,105.20 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:105.20,108.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:108.8,112.3 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:115.44,116.33 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:116.33,119.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:119.8,122.3 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:125.45,127.2 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:133.45,135.18 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:142.2,147.29 6 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:135.18,138.3 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:147.29,148.47 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:148.47,152.4 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:158.34,161.2 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:163.42,166.18 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:166.18,168.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:168.8,170.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:173.53,176.16 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:179.2,179.26 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:176.16,178.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:182.52,183.15 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:183.15,185.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:185.8,189.3 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:201.55,202.6 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:202.6,203.41 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:213.3,215.24 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:220.3,220.16 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:203.41,207.20 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:211.4,211.20 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:207.20,210.5 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:215.24,219.4 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:226.35,227.9 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:228.20,229.13 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:231.22,233.17 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:235.35,239.21 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:245.3,246.39 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:248.33,252.11 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:254.10,255.13 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:239.21,244.4 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:259.50,260.23 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:261.21,262.15 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:263.22,264.15 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:265.18,266.11 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:267.10,268.13 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:284.52,288.2 3 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:291.46,292.34 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:298.2,298.16 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:306.2,306.18 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:310.2,311.13 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:292.34,293.45 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:298.16,299.54 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:299.54,302.4 2 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:306.18,309.3 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:316.39,318.18 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:322.2,322.17 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:325.2,326.12 2 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:318.18,320.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:322.17,324.3 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:330.42,332.2 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:335.58,340.2 4 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:343.53,345.2 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:348.42,350.2 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:353.46,355.2 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:359.48,361.2 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:364.45,366.2 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:369.46,371.2 1 0 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:375.35,377.2 1 1 +github.com/ethereum/go-ethereum/rlp/encbuffer.go:380.43,382.2 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:57.49,59.47 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:63.2,65.40 3 1 +github.com/ethereum/go-ethereum/rlp/encode.go:68.2,68.23 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:59.47,61.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:65.40,67.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:73.53,77.40 3 1 +github.com/ethereum/go-ethereum/rlp/encode.go:80.2,80.29 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:77.40,79.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:88.73,90.40 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:97.2,97.46 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:90.40,93.3 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:107.49,109.2 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:113.32,114.15 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:117.2,117.26 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:114.15,116.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:122.68,123.15 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:127.2,129.21 3 1 +github.com/ethereum/go-ethereum/rlp/encode.go:123.15,126.3 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:135.70,137.9 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:138.27,139.28 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:140.47,141.29 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:142.32,143.31 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:144.27,145.32 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:146.55,147.37 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:148.20,149.24 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:150.28,151.24 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:152.30,153.26 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:154.51,155.25 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:156.51,157.39 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:158.54,159.34 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:160.30,161.31 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:162.33,163.29 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:164.10,165.70 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:169.59,172.2 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:174.55,177.2 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:179.55,182.2 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:184.60,186.16 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:190.2,190.22 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:193.2,194.12 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:186.16,189.3 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:190.22,192.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:197.62,199.20 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:202.2,203.12 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:199.20,201.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:206.56,209.2 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:211.51,212.19 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:213.9,214.34 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:215.9,216.33 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:217.10,219.54 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:219.54,220.22 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:227.4,230.14 4 1 +github.com/ethereum/go-ethereum/rlp/encode.go:220.22,226.5 3 1 +github.com/ethereum/go-ethereum/rlp/encode.go:235.70,238.2 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:240.69,242.15 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:247.2,247.12 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:242.15,244.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:244.8,246.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:250.57,252.33 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:259.2,259.12 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:252.33,255.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:255.8,258.3 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:262.60,263.17 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:270.2,272.16 3 1 +github.com/ethereum/go-ethereum/rlp/encode.go:275.2,275.24 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:263.17,269.3 2 0 +github.com/ethereum/go-ethereum/rlp/encode.go:272.16,274.3 1 0 +github.com/ethereum/go-ethereum/rlp/encode.go:278.75,280.32 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:284.2,285.13 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:315.2,315.17 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:280.32,282.3 1 0 +github.com/ethereum/go-ethereum/rlp/encode.go:285.13,288.53 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:288.53,290.30 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:295.4,295.14 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:290.30,291.61 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:291.61,293.6 1 0 +github.com/ethereum/go-ethereum/rlp/encode.go:297.8,299.53 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:299.53,301.17 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:305.4,306.30 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:311.4,312.14 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:301.17,304.5 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:306.30,307.61 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:307.61,309.6 1 0 +github.com/ethereum/go-ethereum/rlp/encode.go:318.57,320.16 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:323.2,323.27 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:329.2,331.39 3 1 +github.com/ethereum/go-ethereum/rlp/encode.go:363.2,363.20 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:320.16,322.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:323.27,324.30 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:324.30,326.4 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:331.39,333.56 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:333.56,335.29 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:340.4,341.14 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:335.29,336.64 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:336.64,338.6 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:343.8,346.56 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:346.56,348.55 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:353.4,354.36 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:359.4,360.14 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:348.55,349.53 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:349.53,350.11 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:354.36,355.80 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:355.80,357.6 1 0 +github.com/ethereum/go-ethereum/rlp/encode.go:366.73,368.43 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:372.2,373.32 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:377.2,377.56 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:384.2,384.20 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:368.43,370.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:373.32,375.3 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:377.56,378.37 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:381.3,382.13 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:378.37,380.4 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:387.49,388.38 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:393.2,393.51 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:402.2,402.10 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:388.38,389.54 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:389.54,391.4 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:393.51,394.21 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:400.3,400.55 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:394.21,399.4 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:407.44,408.9 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:409.20,411.11 2 1 +github.com/ethereum/go-ethereum/rlp/encode.go:412.21,415.11 3 1 +github.com/ethereum/go-ethereum/rlp/encode.go:416.21,420.11 4 1 +github.com/ethereum/go-ethereum/rlp/encode.go:421.21,426.11 5 1 +github.com/ethereum/go-ethereum/rlp/encode.go:427.21,433.11 6 1 +github.com/ethereum/go-ethereum/rlp/encode.go:434.21,441.11 7 1 +github.com/ethereum/go-ethereum/rlp/encode.go:442.21,450.11 8 1 +github.com/ethereum/go-ethereum/rlp/encode.go:451.10,460.11 9 1 +github.com/ethereum/go-ethereum/rlp/encode.go:465.35,466.25 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:466.25,467.22 1 1 +github.com/ethereum/go-ethereum/rlp/encode.go:467.22,469.4 1 1 +github.com/ethereum/go-ethereum/rlp/iterator.go:27.60,29.16 2 1 +github.com/ethereum/go-ethereum/rlp/iterator.go:32.2,32.15 1 1 +github.com/ethereum/go-ethereum/rlp/iterator.go:35.2,38.16 2 1 +github.com/ethereum/go-ethereum/rlp/iterator.go:29.16,31.3 1 0 +github.com/ethereum/go-ethereum/rlp/iterator.go:32.15,34.3 1 0 +github.com/ethereum/go-ethereum/rlp/iterator.go:43.37,44.23 1 1 +github.com/ethereum/go-ethereum/rlp/iterator.go:47.2,51.13 5 1 +github.com/ethereum/go-ethereum/rlp/iterator.go:44.23,46.3 1 1 +github.com/ethereum/go-ethereum/rlp/iterator.go:55.40,57.2 1 1 +github.com/ethereum/go-ethereum/rlp/iterator.go:59.37,61.2 1 0 +github.com/ethereum/go-ethereum/rlp/raw.go:33.42,35.2 1 0 +github.com/ethereum/go-ethereum/rlp/raw.go:38.28,39.14 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:42.2,42.23 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:39.14,41.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:47.64,49.16 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:52.2,52.41 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:49.16,51.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:57.62,59.16 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:62.2,62.15 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:65.2,65.27 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:59.16,61.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:62.15,64.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:70.63,72.16 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:75.2,75.9 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:72.16,74.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:76.25,77.22 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:78.25,79.22 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:82.3,82.39 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:83.24,84.31 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:85.10,87.17 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:90.3,90.22 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:79.22,81.4 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:87.17,89.4 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:96.60,98.16 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:101.2,101.15 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:104.2,104.27 1 0 +github.com/ethereum/go-ethereum/rlp/raw.go:98.16,100.3 1 0 +github.com/ethereum/go-ethereum/rlp/raw.go:101.15,103.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:108.41,110.24 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:117.2,117.15 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:110.24,112.17 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:115.3,115.23 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:112.17,114.4 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:120.76,121.19 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:124.2,125.9 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:151.2,151.16 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:155.2,155.44 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:158.2,158.37 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:121.19,123.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:126.16,129.18 3 1 +github.com/ethereum/go-ethereum/rlp/raw.go:130.16,135.55 4 1 +github.com/ethereum/go-ethereum/rlp/raw.go:138.16,141.47 3 1 +github.com/ethereum/go-ethereum/rlp/raw.go:142.16,145.33 3 1 +github.com/ethereum/go-ethereum/rlp/raw.go:146.10,149.47 3 1 +github.com/ethereum/go-ethereum/rlp/raw.go:135.55,137.4 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:151.16,153.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:155.44,157.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:161.52,162.24 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:165.2,166.14 2 1 +github.com/ethereum/go-ethereum/rlp/raw.go:186.2,186.25 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:189.2,189.15 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:162.24,164.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:167.9,168.19 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:169.9,170.37 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:171.9,172.56 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:173.9,174.75 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:175.9,176.94 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:177.9,178.113 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:179.9,180.132 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:181.9,182.151 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:186.25,188.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:193.46,194.12 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:199.2,199.9 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:194.12,196.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:196.8,196.20 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:196.20,198.3 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:200.20,201.34 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:202.21,206.4 1 0 +github.com/ethereum/go-ethereum/rlp/raw.go:207.21,212.4 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:213.21,219.4 1 0 +github.com/ethereum/go-ethereum/rlp/raw.go:220.21,227.4 1 0 +github.com/ethereum/go-ethereum/rlp/raw.go:229.21,237.4 1 0 +github.com/ethereum/go-ethereum/rlp/raw.go:238.21,247.4 1 1 +github.com/ethereum/go-ethereum/rlp/raw.go:249.10,259.4 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:57.32,61.2 3 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:63.55,66.2 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:68.53,71.2 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:73.54,75.68 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:80.2,80.42 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:75.68,77.3 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:83.79,88.50 4 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:93.2,94.24 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:99.2,104.13 4 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:88.50,90.3 1 0 +github.com/ethereum/go-ethereum/rlp/typecache.go:94.24,96.3 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:107.90,109.38 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:115.2,118.13 4 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:109.38,111.3 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:128.65,131.38 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:143.2,144.16 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:153.2,153.34 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:159.2,159.20 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:131.38,140.3 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:144.16,145.49 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:149.3,149.18 1 0 +github.com/ethereum/go-ethereum/rlp/typecache.go:145.49,148.4 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:153.34,158.3 4 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:163.45,164.27 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:169.2,169.20 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:164.27,165.17 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:165.17,167.4 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:178.42,180.2 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:182.68,185.2 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:188.96,190.26 2 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:194.2,194.35 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:197.2,197.16 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:201.2,208.66 3 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:211.2,211.10 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:190.26,191.24 1 0 +github.com/ethereum/go-ethereum/rlp/typecache.go:194.35,196.3 1 0 +github.com/ethereum/go-ethereum/rlp/typecache.go:197.16,199.3 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:208.66,210.3 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:215.62,219.16 3 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:224.2,224.12 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:219.16,221.3 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:221.8,223.3 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:225.31,226.16 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:227.29,228.14 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:229.10,230.34 1 0 +github.com/ethereum/go-ethereum/rlp/typecache.go:234.34,236.2 1 1 +github.com/ethereum/go-ethereum/rlp/typecache.go:238.36,240.2 1 1 +github.com/ethereum/go-ethereum/rlp/unsafe.go:28.57,35.2 6 1 +github.com/ethereum/go-ethereum/rlp/decode.go:57.27,57.49 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:80.49,86.2 4 1 +github.com/ethereum/go-ethereum/rlp/decode.go:90.51,97.43 5 1 +github.com/ethereum/go-ethereum/rlp/decode.go:100.2,100.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:103.2,103.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:97.43,99.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:100.17,102.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:112.40,114.22 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:120.2,120.63 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:114.22,116.42 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:116.42,118.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:123.57,124.13 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:138.2,138.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:125.19,126.83 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:127.20,128.71 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:129.23,130.60 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:131.25,132.70 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:133.23,134.62 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:135.19,136.73 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:141.51,142.42 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:145.2,145.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:142.42,144.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:153.82,155.9 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:156.27,157.29 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:158.47,159.27 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:160.32,161.32 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:162.27,163.35 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:164.55,165.28 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:166.20,167.25 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:168.28,169.25 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:170.30,171.27 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:172.54,173.36 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:174.30,175.32 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:176.33,177.30 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:178.10,179.70 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:183.57,185.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:188.2,189.12 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:185.16,187.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:192.53,195.16 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:198.2,199.12 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:195.16,197.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:202.53,204.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:207.2,208.12 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:204.16,206.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:211.55,213.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:216.2,217.12 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:213.16,215.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:220.60,222.2 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:224.55,226.14 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:231.2,232.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:235.2,235.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:226.14,229.3 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:232.16,234.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:238.77,240.89 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:246.2,247.33 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:250.2,251.9 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:269.2,269.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:240.89,241.34 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:244.3,244.30 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:241.34,243.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:247.33,249.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:252.35,253.50 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:256.16,261.50 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:264.10,265.50 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:253.50,255.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:261.50,263.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:265.50,267.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:272.75,274.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:277.2,277.15 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:281.2,281.58 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:284.2,284.20 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:274.16,276.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:277.15,280.3 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:281.58,283.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:287.76,289.14 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:310.2,310.19 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:313.2,313.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:289.14,291.21 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:300.3,300.21 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:304.3,304.50 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:291.21,293.18 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:296.4,298.17 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:293.18,295.5 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:300.21,302.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:304.50,305.9 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:306.9,306.24 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:306.24,308.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:310.19,312.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:316.75,317.36 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:320.2,322.22 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:329.2,329.14 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:332.2,332.49 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:317.36,319.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:322.22,323.50 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:323.50,324.9 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:325.9,325.24 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:325.24,327.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:329.14,331.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:335.58,337.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:340.2,341.12 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:337.16,339.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:344.58,346.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:349.2,350.14 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:376.2,376.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:346.16,348.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:351.12,352.22 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:357.3,358.14 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:359.14,360.32 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:363.3,363.32 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:366.3,366.43 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:370.3,370.34 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:373.12,374.56 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:352.22,354.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:354.9,354.28 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:354.28,356.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:360.32,362.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:363.32,365.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:366.43,368.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:370.34,372.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:379.59,381.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:384.2,384.27 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:389.2,389.56 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:410.2,410.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:381.16,383.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:384.27,385.31 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:385.31,387.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:389.56,390.37 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:393.3,393.28 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:408.3,408.43 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:390.37,392.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:393.28,395.18 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:395.18,396.19 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:403.5,403.59 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:396.19,401.11 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:404.10,404.25 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:404.25,406.5 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:413.58,414.27 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:414.27,417.3 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:421.76,424.9 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:425.35,426.35 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:427.18,428.53 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:429.10,430.55 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:434.76,435.56 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:435.56,437.18 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:440.3,440.60 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:443.3,443.13 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:437.18,439.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:440.60,442.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:451.92,458.56 4 1 +github.com/ethereum/go-ethereum/rlp/decode.go:458.56,460.17 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:465.3,465.32 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:479.3,480.18 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:483.3,483.60 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:486.3,486.13 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:460.17,463.4 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:465.32,466.23 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:475.4,477.14 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:466.23,471.5 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:480.18,482.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:483.60,485.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:492.58,493.33 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:496.2,497.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:500.2,500.18 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:513.2,513.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:493.33,495.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:497.16,499.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:500.18,502.68 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:505.3,505.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:502.68,504.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:506.8,508.17 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:511.3,511.30 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:508.17,510.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:516.56,518.2 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:529.31,530.11 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:531.12,532.16 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:533.14,534.18 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:535.12,536.16 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:537.10,538.39 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:591.56,595.2 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:599.53,605.2 5 1 +github.com/ethereum/go-ethereum/rlp/decode.go:610.42,612.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:615.2,615.14 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:612.16,614.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:616.12,618.32 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:619.14,621.38 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:624.3,624.30 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:627.3,627.16 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:628.10,629.32 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:621.38,623.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:624.30,626.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:635.44,637.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:640.2,640.14 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:637.16,639.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:641.12,642.18 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:645.3,647.13 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:648.14,649.29 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:652.3,652.38 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:655.3,655.30 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:658.3,658.13 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:659.10,660.27 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:642.18,644.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:649.29,651.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:652.38,654.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:655.30,657.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:665.40,667.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:670.2,670.18 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:676.2,678.48 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:681.2,681.20 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:686.2,686.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:667.16,669.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:670.18,673.3 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:678.48,680.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:681.20,683.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:683.8,685.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:694.41,696.2 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:698.43,700.2 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:702.43,705.2 2 0 +github.com/ethereum/go-ethereum/rlp/decode.go:707.43,710.2 2 0 +github.com/ethereum/go-ethereum/rlp/decode.go:712.41,715.2 2 0 +github.com/ethereum/go-ethereum/rlp/decode.go:717.52,719.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:722.2,722.14 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:719.16,721.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:723.12,724.21 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:727.3,728.32 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:729.14,730.31 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:733.3,734.10 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:745.10,746.30 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:724.21,726.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:730.31,732.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:735.28,737.25 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:738.19,739.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:740.28,741.26 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:742.11,743.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:753.39,755.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:758.2,758.13 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:755.16,757.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:759.9,760.20 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:761.9,762.19 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:763.10,764.66 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:771.50,773.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:776.2,776.18 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:783.2,783.44 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:786.2,789.18 4 1 +github.com/ethereum/go-ethereum/rlp/decode.go:773.16,775.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:776.18,778.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:783.44,785.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:794.34,796.49 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:801.2,804.12 4 1 +github.com/ethereum/go-ethereum/rlp/decode.go:796.49,798.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:798.8,798.26 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:798.26,800.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:809.40,812.2 2 0 +github.com/ethereum/go-ethereum/rlp/decode.go:815.45,817.42 2 0 +github.com/ethereum/go-ethereum/rlp/decode.go:820.2,820.15 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:817.42,819.3 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:823.51,826.9 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:858.2,858.39 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:862.2,863.12 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:827.18,828.13 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:829.20,830.27 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:831.20,834.14 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:835.17,837.14 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:838.38,842.44 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:846.3,846.35 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:849.10,852.44 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:842.44,844.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:846.35,848.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:852.44,854.4 1 0 +github.com/ethereum/go-ethereum/rlp/decode.go:858.39,860.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:869.48,870.16 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:873.2,875.32 3 1 +github.com/ethereum/go-ethereum/rlp/decode.go:878.2,878.18 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:881.2,882.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:886.2,887.65 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:891.2,891.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:870.16,872.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:875.32,877.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:878.18,880.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:882.16,884.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:887.65,890.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:900.56,901.20 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:922.2,923.9 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:926.2,933.24 7 1 +github.com/ethereum/go-ethereum/rlp/decode.go:901.20,904.3 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:904.8,907.25 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:908.22,910.20 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:911.22,913.20 2 0 +github.com/ethereum/go-ethereum/rlp/decode.go:914.24,916.20 2 0 +github.com/ethereum/go-ethereum/rlp/decode.go:917.11,918.21 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:923.9,925.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:947.61,948.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:954.2,955.30 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:959.2,960.22 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:971.2,971.34 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:948.17,950.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:955.30,957.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:960.22,965.35 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:965.35,967.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:967.9,967.47 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:967.47,969.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:974.65,976.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:989.2,990.9 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:976.16,977.24 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:987.3,987.19 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:977.24,980.15 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:981.29,982.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:983.26,984.17 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:991.16,995.22 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:996.16,1000.39 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1001.16,1009.30 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1012.3,1012.27 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1013.16,1019.37 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1020.10,1027.30 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1030.3,1030.25 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1009.30,1011.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1027.30,1029.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1034.54,1035.14 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1036.9,1038.16 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1039.9,1041.24 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1042.10,1044.25 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1047.3,1048.52 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1051.3,1051.25 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1056.3,1056.49 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1044.25,1046.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1048.52,1050.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1051.25,1055.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1061.51,1062.53 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1065.2,1066.33 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1070.2,1070.19 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1079.2,1079.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1062.53,1064.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1066.33,1069.3 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1070.19,1071.19 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1071.19,1073.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1073.9,1077.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1083.43,1084.38 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1087.2,1088.19 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1091.2,1091.15 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1084.38,1086.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1088.19,1090.3 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1096.43,1099.44 2 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1105.2,1105.15 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1111.2,1111.12 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1099.44,1100.16 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1103.3,1103.38 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1100.16,1102.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1105.15,1106.22 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1109.3,1109.19 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1106.22,1108.4 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1115.58,1116.23 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1119.2,1119.38 1 1 +github.com/ethereum/go-ethereum/rlp/decode.go:1116.23,1118.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:10.51,11.27 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:12.20,14.47 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:18.3,18.24 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:21.3,21.31 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:24.3,24.49 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:25.20,26.23 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:27.19,28.22 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:29.24,30.27 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:31.18,32.21 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:33.22,34.21 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:35.24,36.22 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:37.20,38.23 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:39.21,40.24 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:41.10,42.46 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:14.47,17.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:18.24,20.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:21.31,23.4 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:47.78,50.27 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:51.20,53.10 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:63.35,64.73 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:65.58,66.37 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:67.32,68.39 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:69.10,70.46 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:54.24,55.12 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:56.49,57.36 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:58.26,59.37 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:60.11,61.50 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:75.36,77.9 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:80.2,81.64 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:77.9,79.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:85.34,88.2 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:90.51,91.6 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:91.6,93.15 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:96.3,96.10 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:93.15,95.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:24.63,34.2 4 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:36.58,38.2 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:40.58,42.2 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:45.76,46.54 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:51.2,52.6 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:61.2,70.20 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:75.2,75.10 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:46.54,48.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:52.6,54.19 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:57.3,57.14 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:54.19,55.9 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:71.50,73.40 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:87.58,92.2 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:94.38,98.2 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:100.36,102.2 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:104.47,105.34 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:109.2,109.32 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:105.34,107.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:113.47,115.29 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:118.2,119.12 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:115.29,117.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:123.59,124.40 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:127.2,129.19 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:124.40,126.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:152.64,155.9 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:175.2,175.16 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:156.26,160.43 4 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:161.51,166.26 5 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:167.28,171.45 4 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:172.10,173.58 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:178.59,179.25 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:182.2,189.3 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:179.25,180.50 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:192.47,201.2 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:203.47,205.2 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:207.48,209.2 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:211.62,212.31 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:215.2,215.53 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:212.31,214.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:218.63,224.22 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:232.2,235.32 4 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:240.2,240.27 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:224.22,229.3 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:235.32,239.3 3 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:249.92,251.17 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:254.2,254.29 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:251.17,253.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:257.66,259.2 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:261.67,268.2 5 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:277.63,284.17 6 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:287.2,290.16 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:300.2,300.19 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:284.17,286.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:290.16,298.3 7 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:303.64,311.17 6 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:314.2,314.27 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:311.17,313.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:325.71,327.2 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:329.72,338.2 6 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:348.90,350.16 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:353.2,356.16 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:363.2,363.16 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:350.16,352.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:356.16,359.3 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:359.8,362.3 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:366.60,376.29 4 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:382.2,388.19 7 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:376.29,378.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:378.8,380.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:391.61,393.15 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:401.2,407.42 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:412.2,420.28 9 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:393.15,396.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:407.42,409.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:409.8,411.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:437.91,440.39 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:452.2,453.16 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:458.2,459.31 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:477.2,477.16 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:440.39,449.3 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:453.16,455.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:459.31,462.63 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:465.3,467.17 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:470.3,471.19 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:462.63,464.4 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:467.17,469.4 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:471.19,473.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:473.9,475.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:480.67,481.14 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:484.2,484.12 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:481.14,483.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:487.63,491.34 4 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:495.2,497.19 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:491.34,494.3 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:500.84,501.33 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:505.2,506.42 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:512.2,512.42 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:501.33,503.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:506.42,510.3 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:512.42,515.47 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:521.3,523.24 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:515.47,516.13 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:519.4,519.20 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:516.13,518.5 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:527.64,532.21 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:539.2,546.34 6 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:552.2,555.28 4 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:532.21,534.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:534.8,536.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:546.34,551.3 4 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:558.91,560.42 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:568.2,568.19 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:560.42,567.3 6 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:577.69,579.16 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:582.2,582.47 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:579.16,581.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:585.62,599.2 8 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:601.63,614.2 11 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:616.102,617.27 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:618.20,619.20 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:622.3,622.31 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:625.3,625.26 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:629.3,629.50 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:630.22,631.27 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:635.3,635.26 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:641.3,641.26 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:645.3,645.42 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:646.20,647.31 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:648.21,649.38 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:650.20,652.44 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:655.3,655.31 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:656.20,658.44 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:661.3,661.58 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:662.10,663.52 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:619.20,621.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:622.31,624.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:625.26,627.4 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:631.27,633.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:635.26,636.27 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:639.4,639.85 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:636.27,638.5 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:641.26,643.4 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:652.44,654.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:658.44,660.4 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:668.65,680.2 10 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:683.65,695.2 10 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:697.93,702.16 4 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:706.2,711.13 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:714.2,714.13 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:718.2,720.40 3 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:723.2,723.13 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:727.2,727.13 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:732.2,734.30 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:702.16,704.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:711.13,713.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:714.13,716.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:720.40,722.3 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:723.13,726.3 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:727.13,730.3 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:33.13,50.16 5 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:53.2,53.20 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:50.16,52.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:53.20,55.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:55.8,55.69 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:55.69,57.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:60.33,63.2 2 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:74.55,82.16 3 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:85.2,85.18 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:88.2,95.23 3 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:105.2,109.16 3 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:112.2,113.16 2 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:119.2,123.45 5 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:82.16,84.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:85.18,87.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:95.23,96.24 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:99.3,99.36 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:96.24,98.4 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:99.36,101.4 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:101.9,103.4 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:109.16,111.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:113.16,115.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:126.78,128.16 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:131.2,132.9 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:135.2,135.17 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:128.16,130.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:132.9,134.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:138.72,140.16 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:143.2,144.9 2 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:147.2,147.39 1 1 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:140.16,142.3 1 0 +github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:144.9,146.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:57.48,59.2 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:60.48,62.2 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:63.48,65.2 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:68.50,70.33 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:75.2,75.23 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:78.2,78.12 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:70.33,71.41 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:71.41,73.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:75.23,77.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:105.40,107.16 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:110.2,110.20 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:107.16,109.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:114.60,117.20 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:122.2,123.23 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:129.2,130.9 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:168.2,168.26 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:117.20,120.3 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:123.23,125.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:125.8,125.29 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:125.29,127.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:131.32,133.29 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:136.3,146.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:147.30,157.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:158.10,166.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:133.29,135.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:214.31,216.2 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:220.34,221.37 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:224.2,224.15 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:221.37,223.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:227.39,228.22 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:232.2,233.27 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:228.22,230.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:255.106,257.16 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:260.2,260.43 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:257.16,259.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:264.87,266.50 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:275.2,275.34 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:278.2,278.41 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:281.2,282.53 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:289.2,289.14 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:266.50,267.27 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:272.3,272.15 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:267.27,268.18 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:268.18,270.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:275.34,277.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:278.41,280.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:282.53,283.65 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:283.65,284.29 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:284.29,286.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:296.74,299.19 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:306.2,307.27 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:319.2,319.23 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:299.19,303.3 3 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:307.27,310.44 3 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:316.3,317.26 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:310.44,315.4 4 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:323.72,325.2 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:331.123,332.45 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:336.2,339.73 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:344.2,347.53 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:397.2,397.28 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:332.45,334.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:339.73,341.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:347.53,350.38 3 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:350.38,352.11 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:356.4,358.36 3 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:378.4,378.55 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:352.11,354.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:358.36,359.43 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:359.43,361.13 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:364.6,365.20 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:368.6,368.54 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:361.13,363.7 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:365.20,367.7 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:369.11,371.20 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:374.6,374.35 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:371.20,373.7 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:379.9,379.48 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:379.48,381.11 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:384.4,385.18 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:388.4,388.47 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:381.11,383.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:385.18,387.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:389.9,391.18 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:394.4,394.27 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:391.18,393.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:401.53,402.29 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:403.14,404.17 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:405.21,406.17 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:407.14,409.17 2 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:412.3,412.21 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:413.10,414.20 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:409.17,411.4 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:418.75,424.43 2 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:439.2,439.30 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:457.2,457.14 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:460.2,460.25 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:463.2,463.31 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:466.2,466.15 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:424.43,426.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:426.8,428.41 2 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:433.3,434.17 2 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:437.3,437.20 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:428.41,430.4 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:430.9,432.4 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:434.17,436.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:440.29,441.20 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:442.14,444.62 2 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:447.3,447.31 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:448.15,451.29 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:444.62,446.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:451.29,453.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:453.9,455.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:457.14,459.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:460.25,462.3 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:463.31,465.3 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:471.115,472.17 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:503.2,503.41 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:521.2,521.77 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:528.2,528.59 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:473.17,475.47 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:478.3,480.21 3 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:481.14,483.10 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:486.3,486.16 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:489.3,489.51 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:490.16,492.10 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:495.3,495.47 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:496.15,498.10 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:501.3,501.43 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:475.47,477.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:483.10,485.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:486.16,488.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:492.10,494.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:498.10,500.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:503.41,506.17 3 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:509.3,509.32 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:512.3,512.77 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:506.17,508.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:509.32,511.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:512.77,514.4 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:514.9,519.4 3 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:521.77,523.17 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:526.3,526.32 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:523.17,525.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:534.68,536.2 1 1 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:539.46,540.51 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:543.2,543.52 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:546.2,546.12 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:540.51,542.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:543.52,545.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:550.58,558.2 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:562.64,564.16 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:567.2,568.16 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:571.2,582.18 4 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:564.16,566.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:568.16,570.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:585.115,589.53 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:634.2,634.20 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:589.53,596.22 4 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:632.3,632.32 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:596.22,599.33 3 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:599.33,600.43 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:600.43,603.20 3 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:606.6,606.28 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:603.20,605.7 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:607.11,609.20 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:612.6,612.34 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:609.20,611.7 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:615.9,615.48 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:615.48,616.61 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:616.61,618.19 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:621.5,621.27 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:618.19,620.6 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:622.10,624.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:625.9,627.18 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:630.4,630.32 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:627.18,629.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:637.81,638.17 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:654.2,654.41 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:658.2,658.77 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:665.2,665.53 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:639.17,640.48 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:645.14,646.44 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:651.25,652.42 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:640.48,642.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:642.9,644.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:646.44,648.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:648.9,650.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:654.41,657.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:658.77,659.60 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:659.60,661.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:661.9,663.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:669.33,670.34 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:696.2,696.12 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:670.34,671.24 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:674.3,674.35 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:671.24,673.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:674.35,675.30 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:678.4,678.30 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:681.4,681.31 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:684.4,684.33 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:675.30,677.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:678.30,680.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:681.31,683.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:684.33,685.50 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:688.5,688.64 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:685.50,687.6 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:688.64,690.6 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:691.10,691.50 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:691.50,693.5 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:700.54,706.31 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:709.2,774.32 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:777.2,790.31 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:793.2,806.32 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:809.2,809.14 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:706.31,708.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:774.32,776.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:790.31,792.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:806.32,808.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:814.49,815.143 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:819.2,819.12 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:815.143,817.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:823.61,826.27 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:830.2,830.26 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:834.2,834.29 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:838.2,838.39 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:842.2,842.26 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:845.2,845.16 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:826.27,828.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:830.26,832.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:834.29,836.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:838.39,840.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:842.26,844.3 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:857.52,861.50 4 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:874.2,874.24 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:861.50,863.29 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:863.29,866.4 2 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:867.8,868.23 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:868.23,870.4 1 0 +github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:870.9,872.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:34.64,40.11 5 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:43.2,44.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:47.2,47.42 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:40.11,42.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:44.16,46.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:52.66,57.21 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:60.2,60.51 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:57.21,59.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:66.66,70.16 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:73.2,73.26 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:80.2,80.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:70.16,72.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:73.26,74.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:74.33,75.59 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:75.59,77.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:85.67,90.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:92.67,93.16 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:96.2,97.27 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:102.2,102.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:93.16,95.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:97.27,98.67 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:98.67,100.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:107.66,111.16 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:114.2,115.11 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:118.2,118.51 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:121.2,121.50 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:111.16,113.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:115.11,117.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:118.51,120.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:126.83,130.16 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:133.2,133.25 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:141.2,141.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:130.16,132.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:133.25,134.19 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:137.3,137.61 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:134.19,135.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:137.61,139.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:144.72,146.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:148.49,149.70 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:152.2,152.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/connect.go:149.70,151.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:71.37,73.23 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:88.2,88.14 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:74.13,76.24 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:77.13,80.21 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:81.12,84.19 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:85.10,86.50 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:92.41,96.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:99.33,100.16 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:101.21,102.94 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:103.21,104.129 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:105.20,106.186 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/events.go:107.10,108.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:54.36,59.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:62.49,65.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:68.39,70.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:73.38,75.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:78.54,81.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:84.53,86.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:102.103,105.16 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:108.2,110.16 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:113.2,113.37 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:122.2,122.47 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:167.2,167.45 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:105.16,107.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:110.16,112.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:113.37,117.3 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:122.47,129.13 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:143.3,143.7 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:129.13,131.17 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:138.4,138.19 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:131.17,132.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:133.28,133.28 0 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:134.17,135.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:143.7,144.11 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:145.25,146.42 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:149.5,151.63 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:154.5,154.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:159.23,160.15 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:161.16,162.15 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:146.42,147.14 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:151.63,153.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:155.26,155.26 0 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:156.17,157.16 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:171.54,174.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:177.81,180.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:183.64,186.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:189.49,191.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:194.48,196.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:199.59,201.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:204.62,206.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:209.85,212.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:216.58,218.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:222.63,224.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:227.44,229.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:233.71,235.15 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:242.2,243.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:246.2,249.16 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:252.2,253.77 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:257.2,257.16 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:262.2,262.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:235.15,238.17 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:238.17,240.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:243.16,245.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:249.16,251.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:253.77,256.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:257.16,258.63 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:258.63,260.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:274.42,301.2 21 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:304.71,306.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:309.73,310.45 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:315.2,315.30 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:310.45,313.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:319.72,320.44 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:325.2,325.30 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:320.44,323.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:329.72,332.25 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:336.2,338.21 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:342.2,343.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:347.2,350.30 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:332.25,335.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:338.21,341.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:343.16,346.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:354.71,357.25 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:361.2,364.30 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:357.25,360.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:368.71,372.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:375.73,379.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:382.80,392.36 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:399.2,399.41 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:407.2,407.30 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:412.2,413.69 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:422.2,425.36 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:430.2,430.46 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:452.2,453.6 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:392.36,395.37 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:395.37,397.4 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:399.41,401.17 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:404.3,405.13 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:401.17,403.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:407.30,409.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:413.69,416.17 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:416.17,419.4 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:425.36,427.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:430.46,432.17 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:436.3,436.35 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:443.3,443.35 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:432.17,435.4 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:436.35,438.44 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:438.44,441.5 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:443.35,445.44 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:445.44,448.5 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:453.6,454.10 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:455.26,457.53 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:460.4,460.44 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:464.21,465.10 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:457.53,458.13 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:460.44,463.5 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:478.60,480.57 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:498.2,498.21 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:480.57,482.73 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:485.3,486.58 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:482.73,484.4 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:486.58,487.35 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:491.4,492.18 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:495.4,495.65 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:487.35,489.13 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:492.18,494.5 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:506.42,508.62 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:513.2,513.75 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:517.2,517.14 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:508.62,510.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:513.75,515.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:531.75,533.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:538.2,538.32 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:533.16,536.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:542.73,544.63 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:549.2,549.45 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:554.2,554.37 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:544.63,547.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:549.45,552.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:558.71,562.33 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:567.2,568.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:573.2,573.48 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:562.33,565.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:568.16,571.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:577.69,581.29 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:585.2,585.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:581.29,583.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:589.68,593.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:596.70,599.51 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:604.2,604.43 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:599.51,602.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:608.69,611.50 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:616.2,616.43 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:611.50,614.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:620.72,624.64 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:629.2,629.43 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:624.64,627.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:633.75,637.67 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:642.2,642.43 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:637.67,640.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:647.68,650.2 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:653.40,653.55 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:658.68,660.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:663.2,665.21 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:660.16,662.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:670.70,672.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:675.60,677.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:680.61,682.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:685.63,687.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:690.64,692.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:695.76,699.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:703.74,704.82 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:704.82,710.46 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:725.3,725.46 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:740.3,740.35 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:710.46,713.47 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:718.4,718.19 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:722.4,722.46 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:713.47,715.5 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:715.10,717.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:718.19,721.5 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:725.46,728.47 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:733.4,733.19 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:737.4,737.46 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:728.47,730.5 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:730.10,732.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/http.go:733.19,736.5 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:40.92,42.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:46.31,48.28 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:51.2,51.13 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:48.28,50.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:55.60,57.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:57.16,58.53 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:63.65,65.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:68.2,70.6 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:65.16,66.53 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:70.6,71.10 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:72.15,74.10 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:75.17,78.39 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:83.4,83.11 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:90.4,91.40 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:78.39,81.5 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:84.16,86.11 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:87.39,87.39 0 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:91.40,94.5 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:103.69,105.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:114.2,114.6 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:105.16,106.10 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:107.15,109.10 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:110.11,111.54 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:114.6,115.10 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:121.3,126.21 6 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:133.3,135.35 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:158.3,158.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:116.15,118.10 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:119.11,119.11 0 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:126.21,129.4 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:129.9,129.27 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:129.27,132.4 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:135.35,136.11 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:142.4,144.18 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:149.4,149.25 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:137.16,139.11 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:140.32,140.32 0 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:144.18,147.13 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:149.25,152.19 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:155.5,155.14 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:152.19,154.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:164.74,166.33 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:176.2,176.25 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:183.2,183.25 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:191.2,191.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:166.33,169.17 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:173.3,173.21 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:169.17,172.4 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:176.25,177.39 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:181.3,181.52 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:177.39,180.4 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:183.25,185.49 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:185.49,188.4 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:71.81,80.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:83.42,85.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:89.81,93.27 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:104.2,104.47 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:107.2,107.55 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:112.2,112.31 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:117.2,118.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:121.2,129.43 6 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:134.2,136.18 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:93.27,94.48 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:94.48,96.73 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:99.4,99.15 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:96.73,98.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:104.47,106.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:107.55,109.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:112.31,114.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:118.16,120.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:129.43,131.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:140.45,142.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:145.38,146.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:154.2,154.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:146.33,147.16 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:150.3,150.46 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:147.16,148.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:150.46,152.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:158.37,159.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:167.2,167.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:159.33,160.17 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:163.3,163.45 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:160.17,161.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:163.45,165.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:171.46,173.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:177.88,182.17 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:185.2,185.15 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:188.2,189.46 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:193.2,200.16 6 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:203.2,205.16 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:208.2,209.12 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:182.17,184.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:185.15,187.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:189.46,192.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:200.16,202.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:205.16,207.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:214.102,215.15 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:230.2,230.6 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:215.15,223.18 5 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:226.3,228.22 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:223.18,225.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:230.6,231.10 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:232.30,233.11 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:236.4,237.22 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:253.27,254.18 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:257.4,257.10 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:233.11,235.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:239.30,240.29 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:242.31,243.32 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:245.34,246.58 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:248.34,249.61 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:254.18,256.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:263.45,271.37 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:285.2,285.16 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:289.2,294.16 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:298.2,301.12 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:271.37,276.18 4 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:279.3,279.17 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:282.3,283.19 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:276.18,278.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:279.17,281.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:285.16,287.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:294.16,297.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:306.60,310.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:312.60,315.16 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:318.2,319.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:322.2,323.69 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:315.16,317.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:319.16,321.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:328.63,330.17 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:333.2,333.14 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:336.2,337.16 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:340.2,341.72 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:330.17,332.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:333.14,335.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:337.16,339.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:345.59,349.16 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:352.2,352.13 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:355.2,357.12 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:349.16,351.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:352.13,354.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:362.62,366.17 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:369.2,369.14 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:372.2,375.12 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:366.17,368.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:369.14,371.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:379.89,389.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:392.92,402.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:406.48,410.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:412.48,414.12 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:417.2,417.21 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:414.12,416.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:422.54,426.2 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:428.54,429.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:434.2,434.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:429.33,430.31 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:430.31,432.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:439.67,444.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:446.66,449.30 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:453.2,453.25 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:457.2,457.16 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:449.30,451.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:453.25,456.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:462.62,467.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:469.61,470.25 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:474.2,474.18 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:470.25,473.3 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:479.62,484.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:486.62,488.29 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:495.2,495.14 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:488.29,490.18 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:490.18,492.4 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:499.65,504.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:506.65,508.54 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:512.2,512.14 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:508.54,510.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:516.70,521.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:523.70,525.54 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:530.2,530.16 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:525.54,528.3 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:534.67,538.2 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:541.67,543.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:545.53,546.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:551.2,551.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:546.33,547.16 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:547.16,549.4 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:555.69,559.2 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:561.55,562.33 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:567.2,567.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:562.33,563.17 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:563.17,565.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:571.65,575.2 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:577.80,581.12 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:584.2,584.44 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:581.12,583.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:587.66,589.32 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:592.2,593.25 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:598.2,598.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:589.32,591.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:593.25,594.38 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:594.38,596.4 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:603.60,607.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:611.77,615.2 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:617.77,618.54 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:622.2,623.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:626.2,627.18 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:630.2,639.18 5 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:618.54,620.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:623.16,625.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:627.18,629.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:642.60,645.12 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:648.2,648.21 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:645.12,647.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:659.70,663.2 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:665.70,666.22 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:669.2,670.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:673.2,673.13 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:676.2,676.49 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:680.2,681.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:685.2,687.18 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:666.22,668.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:670.16,672.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:673.13,675.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:676.49,678.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:681.16,684.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:691.32,692.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:698.2,698.18 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:692.33,694.37 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:694.37,696.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:703.29,714.2 7 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:729.72,731.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:733.29,736.2 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:739.26,743.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:746.31,750.2 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:753.30,755.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:758.32,760.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:763.41,765.19 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:768.2,770.13 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:765.19,767.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:775.46,785.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:789.48,796.51 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:799.2,800.12 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:796.51,798.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:821.32,822.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:825.2,825.19 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:828.2,828.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:822.17,824.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:825.19,827.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:832.32,834.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:846.31,848.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:853.48,855.55 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:862.2,862.44 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:855.55,858.3 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:858.8,861.3 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:881.51,883.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:885.108,887.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:889.96,895.33 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:935.2,935.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:940.2,940.18 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:895.33,897.17 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:900.3,901.17 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:904.3,905.38 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:917.3,917.30 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:897.17,898.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:901.17,903.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:905.38,907.61 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:913.4,913.16 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:907.61,908.22 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:908.22,910.11 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:913.16,915.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:917.30,919.61 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:932.4,932.58 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:919.61,921.42 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:927.5,927.17 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:921.42,922.22 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:922.22,924.12 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:927.17,929.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:935.33,936.14 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:936.14,938.4 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:947.48,949.31 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:962.2,973.12 7 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1023.2,1023.34 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1035.2,1035.9 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1042.2,1042.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:949.31,950.65 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:953.3,953.19 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:956.3,956.79 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:950.65,952.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:953.19,954.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:956.79,958.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:973.12,980.7 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:980.7,981.11 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:982.23,985.18 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:989.5,989.32 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:992.5,994.19 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1002.5,1002.37 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1015.16,1017.11 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:985.18,986.14 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:989.32,990.14 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:994.19,999.14 3 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1002.37,1003.62 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1003.62,1006.36 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1012.7,1012.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1006.36,1010.8 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1023.34,1025.67 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1030.3,1030.59 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1025.67,1028.12 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1030.59,1032.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1037.22,1037.22 0 1 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1039.41,1040.60 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1046.51,1047.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1047.6,1048.10 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1049.30,1050.11 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1053.4,1053.21 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1056.20,1057.10 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1050.11,1052.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1053.21,1055.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1062.55,1064.20 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1065.21,1066.53 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1069.21,1070.53 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1073.20,1074.41 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1066.53,1068.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1070.53,1072.4 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1078.54,1079.18 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1083.2,1083.64 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1086.2,1086.31 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1079.18,1081.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1083.64,1085.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1089.54,1090.15 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1093.2,1093.49 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/network.go:1090.15,1092.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:33.50,37.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:41.80,45.15 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:48.2,52.41 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:58.2,59.39 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:62.2,62.38 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:90.2,90.8 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:45.15,45.49 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:52.41,55.3 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:59.39,61.3 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:62.38,63.10 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:64.29,66.31 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:71.4,71.38 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:76.4,77.18 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:81.4,81.12 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:84.21,86.10 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:66.31,67.13 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:71.38,72.13 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:77.18,80.5 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:81.12,83.5 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:93.62,98.12 5 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:110.2,110.16 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:98.12,101.7 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:101.7,102.11 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:103.27,104.63 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:105.16,106.11 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:110.16,113.3 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:136.34,140.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:34.67,38.2 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:40.50,46.58 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:46.58,47.19 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:51.5,52.15 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:47.19,50.6 2 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:54.33,56.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:57.44,59.5 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:65.40,67.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:69.37,71.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:73.36,75.2 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:77.61,80.25 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:80.25,81.30 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:81.30,83.40 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:83.40,84.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:84.17,86.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:87.10,88.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:88.17,90.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:96.62,99.25 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:99.25,100.30 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:100.30,102.16 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:102.16,103.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:103.17,105.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:106.10,107.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:107.17,109.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:115.61,119.26 4 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:127.2,128.25 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:119.26,120.33 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:120.33,121.36 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:121.36,123.5 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:128.25,130.3 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:133.78,136.25 3 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:136.25,137.30 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:137.30,139.44 2 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:139.44,140.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:140.17,142.6 1 0 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:143.10,144.17 1 1 +github.com/ethereum/go-ethereum/p2p/simulations/test.go:144.17,146.6 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:30.41,32.2 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:33.40,35.2 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:36.46,38.2 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:39.47,41.2 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:42.40,44.2 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:45.45,47.2 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146894.40,146896.2 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146898.35,146900.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146904.2,146906.15 3 1 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146900.16,146902.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146912.41,146914.42 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146921.2,146921.52 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146914.42,146916.17 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146919.3,146919.22 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146916.17,146918.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146925.47,146928.2 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146932.36,146934.16 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146938.2,146938.10 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146934.16,146935.54 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146943.42,146945.2 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146950.50,146952.42 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146959.2,146959.56 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146952.42,146954.17 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146957.3,146957.21 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146954.17,146956.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146964.58,146966.42 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146973.2,146973.74 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146966.42,146968.17 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146971.3,146971.23 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146968.17,146970.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146977.54,146979.29 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146986.2,146986.16 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146979.29,146981.17 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146984.3,146984.22 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146981.17,146983.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146990.28,146992.29 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146995.2,146995.14 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146992.29,146994.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147016.46,147018.20 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147028.2,147028.22 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147031.2,147032.39 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147035.2,147035.16 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147018.20,147021.30 3 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147021.30,147023.19 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147023.19,147025.5 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147028.22,147030.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147032.39,147034.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147048.43,147050.16 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147053.2,147054.16 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147057.2,147058.16 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147061.2,147062.16 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147065.2,147065.73 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147050.16,147052.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147054.16,147056.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147058.16,147060.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147062.16,147064.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147069.44,147072.16 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147076.2,147076.33 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147082.2,147082.12 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147072.16,147074.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147076.33,147078.17 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147078.17,147080.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147085.41,147088.2 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:45.44,47.33 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:53.2,53.64 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:48.20,49.23 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:50.10,51.33 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:57.43,59.32 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:62.2,62.64 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:59.32,61.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:67.81,70.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:74.2,74.49 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:70.16,72.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:79.62,81.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:85.2,85.57 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:81.16,83.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:90.88,92.23 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:95.2,98.26 3 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:102.2,103.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:106.2,107.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:110.2,111.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:115.2,116.42 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:126.2,127.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:130.2,130.36 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:135.2,135.22 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:92.23,94.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:98.26,100.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:103.16,105.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:107.16,109.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:111.16,113.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:116.42,121.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:127.16,129.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:130.36,134.3 3 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:41.27,46.2 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:49.31,51.2 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:59.50,61.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:64.2,67.66 3 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:70.2,70.16 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:61.16,63.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:67.66,69.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:76.50,81.16 4 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:84.2,84.59 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:88.2,88.41 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:96.2,96.16 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:81.16,83.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:84.59,86.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:88.41,89.52 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:92.3,92.58 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:89.52,91.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:92.58,94.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:100.39,102.2 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:107.57,108.17 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:111.2,112.50 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:115.2,115.48 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:118.2,118.54 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:108.17,110.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:112.50,114.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:115.48,117.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:126.69,128.19 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:131.2,131.49 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:135.2,136.25 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:139.2,140.16 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:143.2,143.52 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:128.19,130.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:131.49,133.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:136.25,138.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:140.16,142.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:32.122,36.76 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:40.2,41.21 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:45.2,45.20 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:49.2,49.18 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:70.2,70.28 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:73.2,73.68 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:76.2,76.9 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:87.2,88.22 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:36.76,38.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:41.21,44.3 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:45.20,47.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:49.18,53.21 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:64.3,64.22 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:67.3,67.23 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:53.21,55.47 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:59.4,59.71 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:55.47,57.5 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:60.9,60.28 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:60.28,62.4 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:64.22,66.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:70.28,72.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:73.68,75.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:77.52,78.68 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:79.60,80.76 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:81.52,82.65 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:83.60,84.73 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:93.108,95.20 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:99.2,99.19 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:103.2,103.35 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:107.2,107.21 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:117.2,118.16 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:122.2,122.61 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:95.20,97.3 1 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:99.19,102.3 2 1 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:103.35,105.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:107.21,108.63 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:114.3,114.9 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:108.63,110.4 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:110.9,113.4 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:118.16,121.3 2 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:122.61,124.3 1 0 +github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:124.8,126.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:48.79,53.2 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:56.54,57.19 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:60.2,61.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:65.2,66.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:70.2,72.53 3 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:57.19,59.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:61.16,64.3 2 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:66.16,69.3 2 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:72.53,74.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:79.63,80.19 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:83.2,84.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:88.2,89.12 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:93.2,94.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:98.2,98.27 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:80.19,82.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:84.16,87.3 2 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:89.12,92.3 2 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:94.16,97.3 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:102.47,104.16 2 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:108.2,109.53 2 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:104.16,107.3 2 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:109.53,111.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:115.91,119.16 3 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:126.2,126.51 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:130.2,130.19 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:119.16,120.25 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:124.3,124.79 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:120.25,123.4 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:126.51,129.3 2 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:134.94,136.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:139.2,139.63 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:142.2,142.12 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:136.16,138.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:139.63,141.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:148.91,150.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:153.2,154.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:157.2,158.59 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:161.2,162.31 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:150.16,152.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:154.16,156.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:158.59,160.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:165.98,167.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:170.2,171.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:174.2,175.16 2 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:178.2,178.23 1 1 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:167.16,169.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:171.16,173.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:175.16,177.3 1 1 +github.com/ethereum/go-ethereum/signer/storage/storage.go:48.51,49.19 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:52.2,52.21 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:49.19,51.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:57.60,58.19 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:61.2,61.30 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:64.2,64.24 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:58.19,60.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:61.30,63.3 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:68.44,70.2 1 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:72.36,77.2 2 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:82.45,82.46 0 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:83.45,83.46 0 0 +github.com/ethereum/go-ethereum/signer/storage/storage.go:84.53,86.2 1 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:39.55,41.42 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:44.2,45.25 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:41.42,43.3 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:56.93,64.2 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:65.62,67.2 0 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:69.56,72.2 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:73.83,85.64 7 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:94.2,94.64 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:99.2,103.16 3 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:107.2,111.16 3 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:121.2,122.16 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:127.2,128.24 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:133.2,133.27 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:85.64,87.16 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:92.3,92.21 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:87.16,89.4 1 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:89.9,91.4 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:94.64,98.3 3 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:103.16,106.3 2 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:111.16,114.3 2 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:122.16,125.3 2 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:128.24,130.3 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:130.8,132.3 1 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:136.89,137.16 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:140.2,141.16 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:145.2,146.25 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:153.2,153.46 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:137.16,139.3 1 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:141.16,144.3 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:146.25,149.3 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:149.8,149.31 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:149.31,152.3 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:156.89,159.16 3 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:164.2,164.14 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:170.2,170.50 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:159.16,162.3 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:164.14,169.3 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:173.99,176.16 3 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:180.2,180.14 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:183.2,183.52 1 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:176.16,179.3 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:180.14,182.3 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:187.97,189.2 1 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:191.90,194.16 3 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:198.2,198.14 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:201.2,201.33 1 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:194.16,197.3 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:198.14,200.3 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:204.105,208.2 1 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:210.47,213.2 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:215.46,218.2 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:220.60,222.16 2 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:226.2,228.16 3 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:222.16,225.3 2 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:228.16,230.3 1 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:233.67,235.16 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:239.2,240.16 2 1 +github.com/ethereum/go-ethereum/signer/rules/rules.go:235.16,238.3 2 0 +github.com/ethereum/go-ethereum/signer/rules/rules.go:240.16,242.3 1 1 +github.com/ethereum/go-ethereum/signer/core/cliui.go:38.40,40.2 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:42.62,44.2 0 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:48.46,49.6 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:49.6,52.17 3 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:55.3,55.49 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:52.17,54.4 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:55.49,57.4 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:61.92,65.21 3 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:73.2,74.37 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:65.21,67.17 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:71.3,71.38 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:67.17,70.4 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:78.41,80.28 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:83.2,84.14 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:80.28,82.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:89.45,90.22 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:93.2,93.31 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:90.22,92.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:96.38,100.2 3 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:103.84,108.45 5 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:116.2,119.45 4 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:125.2,126.60 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:129.2,129.57 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:138.2,138.37 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:144.2,144.29 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:152.2,155.19 4 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:158.2,158.55 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:108.45,110.26 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:110.26,112.4 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:113.8,115.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:119.45,122.3 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:122.8,124.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:126.60,128.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:129.57,131.28 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:131.28,133.40 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:133.40,135.5 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:138.37,140.17 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:140.17,142.4 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:144.29,146.38 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:149.3,149.16 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:146.38,148.4 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:155.19,157.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:162.94,168.32 5 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:175.2,176.39 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:179.2,183.19 5 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:186.2,186.36 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:168.32,170.38 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:173.3,173.16 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:170.38,172.4 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:176.39,178.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:183.19,185.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:191.85,198.43 6 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:202.2,204.19 3 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:207.2,207.44 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:198.43,201.3 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:204.19,206.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:211.100,221.19 8 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:224.2,224.38 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:221.19,223.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:228.52,231.2 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:234.51,236.2 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:238.72,240.67 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:240.67,242.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:242.8,244.3 1 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:247.60,250.30 2 0 +github.com/ethereum/go-ethereum/signer/core/cliui.go:250.30,252.3 1 0 +github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:38.58,40.20 2 1 +github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:43.2,44.23 2 1 +github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:48.2,82.24 2 1 +github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:40.20,42.3 1 1 +github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:44.23,46.3 1 1 +github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:87.66,101.2 3 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:39.87,43.16 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:46.2,46.19 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:50.2,52.16 3 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:55.2,58.16 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:62.2,63.16 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:66.2,66.13 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:69.2,69.23 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:43.16,45.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:46.19,48.3 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:52.16,54.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:58.16,60.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:63.16,65.3 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:66.13,68.3 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:76.144,78.16 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:81.2,82.16 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:86.2,86.23 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:78.16,80.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:82.16,85.3 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:95.169,101.16 3 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:105.2,105.19 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:194.2,196.31 3 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:101.16,103.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:106.39,109.17 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:112.3,135.106 3 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:136.39,139.10 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:142.3,143.17 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:146.3,147.61 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:151.3,151.29 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:158.3,159.17 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:162.3,171.104 3 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:172.10,176.43 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:109.17,111.4 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:139.10,141.4 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:143.17,145.4 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:147.61,149.4 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:151.29,156.4 3 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:159.17,161.4 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:176.43,178.4 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:178.9,179.63 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:179.63,181.5 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:181.10,191.5 3 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:202.86,205.2 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:214.81,215.28 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:219.2,221.23 3 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:215.28,218.3 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:229.141,232.2 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:237.119,239.16 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:242.2,243.16 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:246.2,249.16 4 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:252.2,258.31 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:261.2,262.16 2 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:266.2,266.32 1 1 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:239.16,241.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:243.16,245.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:249.16,251.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:258.31,260.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:262.16,265.3 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:271.117,283.20 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:286.2,286.36 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:289.2,292.16 4 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:295.2,295.42 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:283.20,285.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:286.36,288.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:292.16,294.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:299.79,301.9 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:304.2,305.9 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:308.2,309.16 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:312.2,312.32 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:316.2,317.9 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:320.2,321.16 2 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:324.2,324.35 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:328.2,331.8 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:301.9,303.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:305.9,307.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:309.16,311.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:312.32,314.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:317.9,319.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:321.16,323.3 1 0 +github.com/ethereum/go-ethereum/signer/core/signed_data.go:324.35,326.3 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:31.28,33.16 2 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:36.2,37.11 2 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:33.16,35.3 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:40.55,42.2 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:45.94,47.16 2 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:50.2,50.12 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:47.16,49.3 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:54.73,57.16 3 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:60.2,60.12 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:57.16,59.3 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:63.78,67.2 3 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:69.88,73.2 3 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:75.79,79.2 3 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:81.94,85.2 3 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:87.46,89.16 2 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:89.16,91.3 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:94.45,96.16 2 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:96.16,98.3 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:100.66,102.16 2 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:102.16,104.3 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:107.54,109.16 2 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:109.16,111.3 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:113.86,116.16 3 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:119.2,119.20 1 0 +github.com/ethereum/go-ethereum/signer/core/stdioui.go:116.16,118.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:47.53,49.2 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:55.85,57.40 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:60.2,60.18 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:57.40,59.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:75.49,77.40 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:90.2,90.16 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:77.40,85.21 3 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:88.3,88.33 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:85.21,87.4 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:97.99,99.16 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:102.2,103.16 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:106.2,106.16 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:109.2,109.39 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:99.16,101.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:103.16,105.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:106.16,108.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:113.61,115.2 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:121.95,123.16 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:126.2,126.57 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:130.2,130.55 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:123.16,125.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:126.57,128.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:139.72,141.16 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:144.2,145.23 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:148.2,148.26 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:141.16,143.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:145.23,147.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:154.53,156.2 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:161.78,164.2 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:169.97,172.16 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:175.2,175.52 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:178.2,178.43 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:172.16,174.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:175.52,177.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:186.141,189.18 2 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:192.2,192.62 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:195.2,195.81 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:189.18,191.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:192.62,194.3 1 0 +github.com/ethereum/go-ethereum/signer/core/uiapi.go:204.74,206.2 1 0 +github.com/ethereum/go-ethereum/signer/core/validation.go:28.52,29.24 1 1 +github.com/ethereum/go-ethereum/signer/core/validation.go:32.2,32.47 1 1 +github.com/ethereum/go-ethereum/signer/core/validation.go:35.2,35.12 1 1 +github.com/ethereum/go-ethereum/signer/core/validation.go:29.24,31.3 1 1 +github.com/ethereum/go-ethereum/signer/core/validation.go:32.47,34.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:131.104,136.14 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:140.2,140.25 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:143.2,143.12 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:168.2,168.21 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:187.2,187.89 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:136.14,138.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:140.25,142.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:143.12,145.61 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:152.3,152.68 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:159.3,159.71 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:145.61,147.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:147.9,150.4 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:152.68,154.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:154.9,157.4 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:159.71,161.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:161.9,164.4 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:168.21,171.17 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:171.17,173.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:173.9,174.46 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:174.46,176.5 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:176.10,177.87 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:177.87,179.6 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:179.11,181.6 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:191.56,196.26 3 1 +github.com/ethereum/go-ethereum/signer/core/api.go:202.2,202.27 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:205.2,205.26 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:208.2,210.10 3 1 +github.com/ethereum/go-ethereum/signer/core/api.go:196.26,197.31 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:200.3,200.28 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:197.31,199.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:202.27,204.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:205.26,207.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:214.35,216.16 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:219.2,219.20 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:216.16,218.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:284.164,285.18 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:288.2,289.12 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:292.2,292.15 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:285.18,287.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:289.12,291.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:294.52,306.16 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:312.2,313.16 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:317.2,318.16 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:306.16,309.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:313.16,316.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:318.16,321.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:326.42,331.38 4 0 +github.com/ethereum/go-ethereum/signer/core/api.go:339.2,339.32 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:331.38,332.41 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:332.41,334.43 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:334.43,336.5 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:343.72,345.28 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:345.28,346.21 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:347.31,348.48 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:354.30,357.70 3 0 +github.com/ethereum/go-ethereum/signer/core/api.go:368.4,370.45 3 0 +github.com/ethereum/go-ethereum/signer/core/api.go:381.31,383.24 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:348.48,350.44 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:350.44,352.6 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:357.70,359.32 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:359.32,361.65 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:361.65,363.7 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:363.12,365.7 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:370.45,380.5 6 0 +github.com/ethereum/go-ethereum/signer/core/api.go:390.75,394.42 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:397.2,398.16 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:401.2,401.28 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:404.2,405.38 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:408.2,408.23 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:394.42,396.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:398.16,400.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:401.28,403.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:405.38,407.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:414.72,415.64 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:418.2,418.101 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:423.2,423.25 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:415.64,417.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:418.101,420.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:420.8,420.27 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:420.27,422.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:428.60,430.18 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:434.2,434.25 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:455.2,455.64 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:430.18,432.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:434.25,439.17 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:443.3,443.63 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:439.17,441.12 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:443.63,445.4 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:445.9,452.4 5 1 +github.com/ethereum/go-ethereum/signer/core/api.go:461.65,462.52 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:472.2,473.91 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:477.2,477.87 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:481.2,481.71 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:485.2,485.91 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:489.2,489.115 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:493.2,493.99 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:497.2,497.101 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:501.2,501.73 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:515.2,515.75 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:519.2,519.17 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:462.52,465.33 3 1 +github.com/ethereum/go-ethereum/signer/core/api.go:469.3,469.16 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:465.33,467.4 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:473.91,476.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:477.87,480.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:481.71,484.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:485.91,488.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:489.115,492.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:493.99,496.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:497.101,500.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:501.73,504.16 3 0 +github.com/ethereum/go-ethereum/signer/core/api.go:507.3,507.16 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:510.3,510.17 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:504.16,506.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:507.16,509.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:510.17,513.4 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:515.75,518.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:522.78,524.2 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:526.107,528.56 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:532.2,533.16 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:539.2,539.25 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:528.56,530.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:533.16,538.3 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:543.149,549.16 3 1 +github.com/ethereum/go-ethereum/signer/core/api.go:553.2,553.20 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:558.2,558.25 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:566.2,573.16 3 1 +github.com/ethereum/go-ethereum/signer/core/api.go:576.2,576.22 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:580.2,587.16 5 1 +github.com/ethereum/go-ethereum/signer/core/api.go:591.2,595.16 3 1 +github.com/ethereum/go-ethereum/signer/core/api.go:599.2,600.16 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:605.2,606.16 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:609.2,614.23 3 1 +github.com/ethereum/go-ethereum/signer/core/api.go:549.16,551.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:553.20,554.44 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:554.44,556.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:558.25,560.45 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:560.45,564.4 2 0 +github.com/ethereum/go-ethereum/signer/core/api.go:573.16,575.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:576.22,578.3 1 1 +github.com/ethereum/go-ethereum/signer/core/api.go:587.16,589.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:595.16,597.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:600.16,603.3 2 1 +github.com/ethereum/go-ethereum/signer/core/api.go:606.16,608.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:618.170,622.16 3 0 +github.com/ethereum/go-ethereum/signer/core/api.go:626.2,626.20 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:631.2,633.16 3 0 +github.com/ethereum/go-ethereum/signer/core/api.go:636.2,642.23 5 0 +github.com/ethereum/go-ethereum/signer/core/api.go:622.16,624.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:626.20,627.44 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:627.44,629.4 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:633.16,635.3 1 0 +github.com/ethereum/go-ethereum/signer/core/api.go:647.68,649.2 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:35.75,41.2 4 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:43.72,45.2 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:47.149,49.27 2 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:52.2,57.16 3 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:62.2,62.15 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:49.27,51.3 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:57.16,59.3 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:59.8,61.3 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:65.144,72.2 5 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:74.161,76.27 2 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:79.2,83.16 4 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:89.2,89.15 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:76.27,78.3 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:83.16,86.3 2 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:86.8,88.3 1 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:92.136,98.2 4 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:100.117,106.2 4 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:108.68,114.2 4 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:116.73,119.16 3 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:122.2,124.34 3 0 +github.com/ethereum/go-ethereum/signer/core/auditlog.go:119.16,121.3 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:48.40,49.54 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:52.2,52.19 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:55.2,55.28 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:49.54,51.3 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:52.19,54.3 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:59.31,61.16 2 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:66.2,66.42 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:71.2,73.16 3 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:76.2,76.27 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:80.2,81.35 2 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:61.16,63.3 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:66.42,68.3 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:73.16,75.3 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:76.27,78.3 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:84.57,86.9 2 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:92.2,92.12 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:87.29,88.48 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:89.30,90.59 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:96.47,97.23 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:98.15,99.19 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:100.14,101.32 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:108.3,108.19 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:109.21,111.20 2 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:114.3,114.13 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:115.10,116.42 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:101.32,103.11 2 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:106.4,106.14 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:103.11,104.54 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:111.20,113.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:124.64,125.27 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:165.2,165.12 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:126.14,128.17 2 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:131.3,131.15 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:134.16,136.40 2 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:139.3,139.24 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:142.14,144.17 2 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:147.3,147.27 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:150.21,151.37 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:154.3,154.25 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:159.3,159.37 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:162.10,163.47 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:128.17,130.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:131.15,133.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:136.40,138.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:139.24,141.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:144.17,146.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:147.27,149.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:151.37,153.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:154.25,155.52 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:155.52,157.5 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:159.37,161.4 1 0 +github.com/ethereum/go-ethereum/tests/rlp_test_util.go:168.60,172.2 3 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:55.52,57.2 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:129.96,135.43 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:138.2,138.34 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:148.2,148.30 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:135.43,137.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:138.34,139.51 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:139.51,141.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:141.9,142.28 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:145.4,145.31 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:142.28,144.5 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:152.47,154.37 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:159.2,159.12 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:154.37,155.22 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:155.22,157.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:163.125,165.16 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:168.2,171.36 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:174.2,174.69 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:177.2,177.28 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:165.16,167.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:171.36,173.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:174.69,176.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:181.146,183.16 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:186.2,191.35 5 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:199.2,201.16 3 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:206.2,206.28 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:219.2,223.30 5 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:228.2,233.64 5 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:238.2,247.34 4 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:183.16,185.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:191.35,193.21 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:193.21,197.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:201.16,203.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:206.28,209.17 3 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:213.3,213.75 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:209.17,211.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:213.75,215.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:223.30,227.3 3 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:233.64,235.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:250.59,252.2 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:254.117,257.32 3 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:266.2,269.17 3 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:272.2,273.23 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:257.32,261.31 4 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:261.31,263.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:269.17,271.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:276.71,286.30 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:291.2,291.16 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:286.30,290.3 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:294.92,297.28 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:305.2,306.17 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:314.2,314.36 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:317.2,317.38 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:320.2,320.39 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:323.2,328.22 5 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:335.2,336.16 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:339.2,340.69 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:344.2,345.20 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:358.2,358.21 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:362.2,364.17 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:297.28,299.17 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:302.3,302.47 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:299.17,301.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:306.17,308.57 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:308.57,310.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:314.36,316.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:317.38,319.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:320.39,322.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:328.22,330.10 2 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:333.3,333.12 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:330.10,332.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:336.16,338.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:340.69,342.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:345.20,346.29 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:349.3,349.29 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:352.3,352.37 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:355.3,356.20 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:346.29,348.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:349.29,351.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:352.37,354.4 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:358.21,360.3 1 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:367.45,372.2 4 0 +github.com/ethereum/go-ethereum/tests/state_test_util.go:374.44,376.2 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:16.55,33.2 9 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:36.60,46.52 3 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:49.2,49.32 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:52.2,52.33 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:55.2,55.26 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:58.2,58.33 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:61.2,61.35 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:64.2,64.34 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:67.2,67.12 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:46.52,48.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:49.32,51.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:52.33,54.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:55.26,57.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:58.33,60.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:61.35,63.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:64.34,66.3 1 0 +github.com/ethereum/go-ethereum/tests/init.go:203.32,205.23 2 0 +github.com/ethereum/go-ethereum/tests/init.go:208.2,209.23 2 0 +github.com/ethereum/go-ethereum/tests/init.go:205.23,207.3 1 0 +github.com/ethereum/go-ethereum/tests/init.go:217.46,219.2 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:18.49,57.2 20 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:60.54,81.52 3 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:84.2,84.22 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:87.2,87.25 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:90.2,90.24 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:93.2,93.22 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:96.2,96.23 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:99.2,99.21 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:102.2,102.27 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:105.2,105.28 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:108.2,108.26 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:111.2,111.33 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:114.2,114.26 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:117.2,117.26 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:120.2,120.27 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:123.2,123.25 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:126.2,126.24 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:129.2,129.26 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:132.2,132.30 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:135.2,135.12 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:81.52,83.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:84.22,86.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:87.25,89.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:90.24,92.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:93.22,95.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:96.23,98.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:99.21,101.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:102.27,104.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:105.28,107.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:108.26,110.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:111.33,113.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:114.26,116.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:117.26,119.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:120.27,122.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:123.25,125.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:126.24,128.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:129.26,131.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_btheader.go:132.30,134.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:17.46,36.2 10 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:39.51,50.52 3 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:53.2,53.25 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:56.2,57.27 2 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:60.2,60.23 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:63.2,63.25 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:66.2,67.23 2 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:70.2,71.26 2 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:74.2,75.24 2 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:78.2,78.12 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:50.52,52.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:53.25,55.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:57.27,59.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:60.23,62.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:63.25,65.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:67.23,69.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:71.26,73.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_stenv.go:75.24,77.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:17.54,38.23 10 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:44.2,46.27 3 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:38.23,40.32 2 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:40.32,42.4 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:50.59,64.52 3 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:67.2,67.25 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:70.2,70.29 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:73.2,73.37 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:76.2,76.22 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:79.2,79.19 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:82.2,82.21 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:85.2,85.28 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:88.2,88.25 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:94.2,94.22 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:97.2,97.27 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:100.2,100.12 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:64.52,66.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:67.25,69.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:70.29,72.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:73.37,75.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:76.22,78.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:79.19,81.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:82.21,84.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:85.28,87.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:88.25,90.34 2 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:90.34,92.4 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:94.22,96.3 1 0 +github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:97.27,99.3 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:47.66,48.139 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:69.2,83.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:109.2,109.12 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:48.139,50.54 2 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:53.3,54.17 2 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:58.3,59.17 2 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:62.3,62.29 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:65.3,66.26 2 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:50.54,52.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:54.17,56.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:59.17,61.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:62.29,64.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:83.4,86.59 2 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:93.3,93.17 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:96.3,96.20 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:99.3,99.54 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:102.3,102.20 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:105.3,105.49 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:86.59,87.18 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:90.4,90.12 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:87.18,89.5 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:93.17,95.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:96.20,98.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:99.54,101.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:102.20,104.4 1 0 +github.com/ethereum/go-ethereum/tests/transaction_test_util.go:105.49,107.4 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:48.52,50.2 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:101.49,103.9 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:108.2,110.16 3 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:113.2,113.42 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:116.2,116.47 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:119.2,120.36 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:125.2,126.17 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:130.2,131.16 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:134.2,137.16 3 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:140.2,141.45 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:144.2,145.16 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:148.2,148.50 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:152.2,152.17 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:157.2,157.54 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:103.9,105.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:110.16,112.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:113.42,115.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:116.47,118.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:120.36,122.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:122.8,124.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:126.17,129.3 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:131.16,133.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:137.16,139.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:141.45,143.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:145.16,147.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:148.50,150.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:152.17,153.79 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:153.79,155.4 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:160.71,175.2 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:189.82,192.35 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:226.2,226.25 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:192.35,194.17 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:202.3,204.17 3 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:211.3,211.27 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:221.3,221.67 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:224.3,224.39 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:194.17,195.28 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:195.28,196.13 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:197.10,199.5 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:204.17,205.28 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:205.28,206.13 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:207.10,209.5 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:211.27,212.74 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:216.4,217.27 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:212.74,215.5 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:221.67,223.4 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:229.58,230.25 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:233.2,233.31 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:236.2,236.31 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:239.2,239.25 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:242.2,242.34 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:245.2,245.35 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:248.2,248.37 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:251.2,251.37 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:254.2,254.28 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:257.2,257.33 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:260.2,260.41 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:263.2,263.42 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:266.2,266.31 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:269.2,269.29 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:272.2,272.28 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:275.2,275.12 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:230.25,232.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:233.31,235.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:236.31,238.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:239.25,241.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:242.34,244.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:245.35,247.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:248.37,250.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:251.37,253.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:254.28,256.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:257.33,259.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:260.41,262.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:263.42,265.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:266.31,268.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:269.29,271.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:272.28,274.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:278.69,280.38 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:295.2,295.12 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:280.38,285.37 4 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:288.3,288.38 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:291.3,291.27 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:285.37,287.4 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:288.38,290.4 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:291.27,293.4 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:298.95,301.32 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:309.2,309.107 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:314.2,314.12 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:301.32,303.3 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:309.107,310.80 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:310.80,312.4 1 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:317.51,319.16 2 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:322.2,324.16 3 0 +github.com/ethereum/go-ethereum/tests/block_test_util.go:319.16,321.3 1 0 +github.com/ethereum/go-ethereum/tests/difficulty_test_util.go:50.67,62.26 5 0 +github.com/ethereum/go-ethereum/tests/difficulty_test_util.go:67.2,67.12 1 0 +github.com/ethereum/go-ethereum/tests/difficulty_test_util.go:62.26,66.3 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:50.81,51.55 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:63.2,63.19 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:51.55,53.17 2 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:61.3,61.19 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:53.17,56.69 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:59.4,59.14 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:56.69,58.5 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:66.72,67.56 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:79.2,79.14 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:67.56,70.17 3 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:73.3,74.37 2 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:77.3,77.14 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:70.17,71.14 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:74.37,75.87 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:87.95,89.28 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:92.2,92.20 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:95.2,95.21 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:113.2,115.41 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:89.28,91.3 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:92.20,94.3 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:95.21,97.30 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:103.3,105.30 3 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:111.3,111.15 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:97.30,99.25 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:99.25,101.5 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:105.30,107.25 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:107.25,109.5 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:118.34,126.30 7 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:150.2,150.10 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:153.2,153.10 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:126.30,128.26 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:142.3,143.17 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:146.3,148.24 3 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:128.26,131.31 3 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:137.4,140.6 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:131.31,133.5 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:133.10,133.38 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:133.38,136.5 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:143.17,144.12 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:150.10,152.3 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:156.29,158.2 1 0 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:160.39,163.11 3 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:169.2,169.10 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:163.11,165.12 2 1 +github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:165.12,167.4 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/secp256k1/secp_fuzzer.go:29.29,45.52 8 1 +github.com/ethereum/go-ethereum/tests/fuzzers/secp256k1/secp_fuzzer.go:49.2,49.10 1 1 +github.com/ethereum/go-ethereum/tests/fuzzers/secp256k1/secp_fuzzer.go:45.52,47.93 2 0 +github.com/ethereum/go-ethereum/les/client.go:86.78,88.16 2 0 +github.com/ethereum/go-ethereum/les/client.go:91.2,92.16 2 0 +github.com/ethereum/go-ethereum/les/client.go:95.2,96.91 2 0 +github.com/ethereum/go-ethereum/les/client.go:99.2,128.21 6 0 +github.com/ethereum/go-ethereum/les/client.go:131.2,143.23 10 0 +github.com/ethereum/go-ethereum/les/client.go:148.2,148.113 1 0 +github.com/ethereum/go-ethereum/les/client.go:151.2,166.62 8 0 +github.com/ethereum/go-ethereum/les/client.go:172.2,174.30 3 0 +github.com/ethereum/go-ethereum/les/client.go:177.2,180.29 3 0 +github.com/ethereum/go-ethereum/les/client.go:185.2,195.18 6 0 +github.com/ethereum/go-ethereum/les/client.go:88.16,90.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:92.16,94.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:96.91,98.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:128.21,130.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:143.23,145.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:148.113,150.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:166.62,170.3 3 0 +github.com/ethereum/go-ethereum/les/client.go:174.30,176.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:180.29,183.3 2 0 +github.com/ethereum/go-ethereum/les/client.go:199.88,200.19 1 0 +github.com/ethereum/go-ethereum/les/client.go:203.2,206.74 4 0 +github.com/ethereum/go-ethereum/les/client.go:209.2,209.16 1 0 +github.com/ethereum/go-ethereum/les/client.go:200.19,202.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:206.74,208.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:214.56,215.18 1 0 +github.com/ethereum/go-ethereum/les/client.go:227.2,228.75 2 0 +github.com/ethereum/go-ethereum/les/client.go:231.2,233.16 3 0 +github.com/ethereum/go-ethereum/les/client.go:215.18,217.20 2 0 +github.com/ethereum/go-ethereum/les/client.go:220.3,220.88 1 0 +github.com/ethereum/go-ethereum/les/client.go:217.20,219.4 1 0 +github.com/ethereum/go-ethereum/les/client.go:220.88,222.4 1 0 +github.com/ethereum/go-ethereum/les/client.go:222.9,224.4 1 0 +github.com/ethereum/go-ethereum/les/client.go:228.75,230.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:238.56,239.25 1 0 +github.com/ethereum/go-ethereum/les/client.go:244.2,251.50 5 0 +github.com/ethereum/go-ethereum/les/client.go:254.2,254.16 1 0 +github.com/ethereum/go-ethereum/les/client.go:257.2,257.10 1 0 +github.com/ethereum/go-ethereum/les/client.go:239.25,242.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:251.50,253.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:254.16,256.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:263.61,265.2 1 0 +github.com/ethereum/go-ethereum/les/client.go:268.60,270.2 1 0 +github.com/ethereum/go-ethereum/les/client.go:273.49,275.2 1 0 +github.com/ethereum/go-ethereum/les/client.go:278.39,280.2 1 0 +github.com/ethereum/go-ethereum/les/client.go:284.42,320.2 3 0 +github.com/ethereum/go-ethereum/les/client.go:322.64,324.2 1 0 +github.com/ethereum/go-ethereum/les/client.go:326.61,326.84 1 0 +github.com/ethereum/go-ethereum/les/client.go:327.61,327.80 1 0 +github.com/ethereum/go-ethereum/les/client.go:328.61,328.80 1 0 +github.com/ethereum/go-ethereum/les/client.go:329.61,329.102 1 0 +github.com/ethereum/go-ethereum/les/client.go:330.61,330.92 1 0 +github.com/ethereum/go-ethereum/les/client.go:331.61,331.82 1 0 +github.com/ethereum/go-ethereum/les/client.go:332.61,332.80 1 0 +github.com/ethereum/go-ethereum/les/client.go:335.52,336.98 1 0 +github.com/ethereum/go-ethereum/les/client.go:336.98,337.47 1 0 +github.com/ethereum/go-ethereum/les/client.go:340.3,340.13 1 0 +github.com/ethereum/go-ethereum/les/client.go:337.47,339.4 1 0 +github.com/ethereum/go-ethereum/les/client.go:346.39,352.47 3 0 +github.com/ethereum/go-ethereum/les/client.go:356.2,357.16 2 0 +github.com/ethereum/go-ethereum/les/client.go:360.2,367.12 6 0 +github.com/ethereum/go-ethereum/les/client.go:352.47,355.3 2 0 +github.com/ethereum/go-ethereum/les/client.go:357.16,359.3 1 0 +github.com/ethereum/go-ethereum/les/client.go:372.38,395.2 20 0 +github.com/ethereum/go-ethereum/les/metrics.go:122.79,123.22 1 0 +github.com/ethereum/go-ethereum/les/metrics.go:126.2,126.67 1 0 +github.com/ethereum/go-ethereum/les/metrics.go:123.22,125.3 1 0 +github.com/ethereum/go-ethereum/les/metrics.go:129.60,132.16 2 0 +github.com/ethereum/go-ethereum/les/metrics.go:136.2,140.17 4 0 +github.com/ethereum/go-ethereum/les/metrics.go:132.16,134.3 1 0 +github.com/ethereum/go-ethereum/les/metrics.go:143.61,151.2 4 0 +github.com/ethereum/go-ethereum/les/test_helper.go:109.57,114.25 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:114.25,115.12 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:178.3,178.19 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:116.10,128.36 5 1 +github.com/ethereum/go-ethereum/les/test_helper.go:129.10,152.37 11 1 +github.com/ethereum/go-ethereum/les/test_helper.go:153.10,166.37 6 1 +github.com/ethereum/go-ethereum/les/test_helper.go:167.10,176.36 4 1 +github.com/ethereum/go-ethereum/les/test_helper.go:183.131,191.2 6 1 +github.com/ethereum/go-ethereum/les/test_helper.go:193.211,207.21 4 1 +github.com/ethereum/go-ethereum/les/test_helper.go:225.2,247.26 3 1 +github.com/ethereum/go-ethereum/les/test_helper.go:250.2,251.32 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:207.21,213.59 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:223.3,223.60 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:213.59,222.4 3 0 +github.com/ethereum/go-ethereum/les/test_helper.go:247.26,249.3 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:251.32,253.3 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:256.162,275.21 8 1 +github.com/ethereum/go-ethereum/les/test_helper.go:293.2,317.93 7 1 +github.com/ethereum/go-ethereum/les/test_helper.go:318.2,318.26 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:321.2,323.19 3 1 +github.com/ethereum/go-ethereum/les/test_helper.go:324.2,324.43 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:275.21,281.59 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:291.3,291.60 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:281.59,290.4 3 1 +github.com/ethereum/go-ethereum/les/test_helper.go:317.93,317.108 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:318.26,320.3 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:323.19,323.36 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:327.26,329.2 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:341.140,343.20 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:346.2,353.29 8 1 +github.com/ethereum/go-ethereum/les/test_helper.go:356.2,356.61 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:359.2,359.62 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:343.20,345.3 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:353.29,355.3 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:356.61,358.3 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:359.62,361.3 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:365.189,367.20 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:370.2,385.29 16 1 +github.com/ethereum/go-ethereum/les/test_helper.go:389.2,389.61 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:392.2,392.62 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:367.20,369.3 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:385.29,388.3 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:389.61,391.3 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:392.62,394.3 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:399.28,401.2 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:403.145,417.12 8 1 +github.com/ethereum/go-ethereum/les/test_helper.go:424.2,424.12 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:432.2,432.6 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:445.2,445.102 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:417.12,418.10 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:419.25,420.29 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:421.38,421.38 0 1 +github.com/ethereum/go-ethereum/les/test_helper.go:424.12,425.10 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:426.25,427.29 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:428.54,428.54 0 1 +github.com/ethereum/go-ethereum/les/test_helper.go:432.6,433.10 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:440.3,440.87 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:443.3,443.36 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:434.23,435.82 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:436.23,437.82 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:438.11,438.11 0 1 +github.com/ethereum/go-ethereum/les/test_helper.go:440.87,441.9 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:463.135,474.12 6 1 +github.com/ethereum/go-ethereum/les/test_helper.go:481.2,495.6 5 1 +github.com/ethereum/go-ethereum/les/test_helper.go:506.2,506.22 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:510.2,510.29 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:474.12,475.10 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:476.33,477.29 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:478.52,478.52 0 1 +github.com/ethereum/go-ethereum/les/test_helper.go:495.6,496.10 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:501.3,501.44 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:504.3,504.36 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:497.16,498.24 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:499.11,499.11 0 1 +github.com/ethereum/go-ethereum/les/test_helper.go:501.44,502.9 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:506.22,509.3 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:527.112,538.12 6 1 +github.com/ethereum/go-ethereum/les/test_helper.go:545.2,559.6 5 1 +github.com/ethereum/go-ethereum/les/test_helper.go:570.2,570.22 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:574.2,574.29 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:538.12,539.10 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:540.33,541.29 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:542.45,542.45 0 1 +github.com/ethereum/go-ethereum/les/test_helper.go:559.6,560.10 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:565.3,565.44 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:568.3,568.36 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:561.16,562.24 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:563.11,563.11 0 1 +github.com/ethereum/go-ethereum/les/test_helper.go:565.44,566.9 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:570.22,573.3 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:589.96,596.21 3 1 +github.com/ethereum/go-ethereum/les/test_helper.go:599.2,600.62 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:601.2,618.27 13 1 +github.com/ethereum/go-ethereum/les/test_helper.go:621.2,625.20 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:638.2,657.21 3 1 +github.com/ethereum/go-ethereum/les/test_helper.go:673.2,673.23 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:596.21,598.3 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:600.62,600.95 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:618.27,620.3 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:625.20,627.42 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:628.3,629.17 2 1 +github.com/ethereum/go-ethereum/les/test_helper.go:632.3,632.10 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:627.42,627.57 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:629.17,631.4 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:633.15,633.15 0 1 +github.com/ethereum/go-ethereum/les/test_helper.go:634.39,635.59 1 0 +github.com/ethereum/go-ethereum/les/test_helper.go:657.21,658.21 1 1 +github.com/ethereum/go-ethereum/les/test_helper.go:664.3,671.16 8 1 +github.com/ethereum/go-ethereum/les/test_helper.go:658.21,663.4 4 1 +github.com/ethereum/go-ethereum/les/test_helper.go:679.64,681.19 2 0 +github.com/ethereum/go-ethereum/les/test_helper.go:681.19,681.44 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:32.121,34.2 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:37.171,39.28 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:43.2,44.16 2 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:47.2,48.16 2 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:51.2,51.52 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:55.2,56.44 2 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:74.2,74.122 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:39.28,41.3 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:44.16,46.3 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:48.16,50.3 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:51.52,53.3 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:56.44,62.21 5 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:66.3,67.94 2 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:72.3,72.65 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:62.21,64.4 1 0 +github.com/ethereum/go-ethereum/les/state_accessor.go:67.94,69.4 1 0 +github.com/ethereum/go-ethereum/les/bor_api_backend.go:12.113,14.2 1 0 +github.com/ethereum/go-ethereum/les/bor_api_backend.go:17.99,19.2 1 0 +github.com/ethereum/go-ethereum/les/bor_api_backend.go:22.101,24.2 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:33.33,33.49 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:41.33,41.49 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:44.68,48.43 2 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:58.2,58.20 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:62.2,63.56 2 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:64.2,64.22 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:48.43,51.17 3 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:54.3,54.20 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:51.17,53.4 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:58.20,60.3 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:63.56,63.94 1 0 +github.com/ethereum/go-ethereum/les/enr_entry.go:68.65,72.2 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:40.79,49.2 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:51.32,53.2 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:55.53,60.20 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:63.2,63.42 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:60.20,62.3 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:66.55,70.37 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:70.37,71.16 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:71.16,75.4 2 0 +github.com/ethereum/go-ethereum/les/txrelay.go:80.65,84.45 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:88.2,88.25 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:116.2,116.30 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:84.45,86.3 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:88.25,91.10 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:95.3,95.29 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:91.10,94.4 2 0 +github.com/ethereum/go-ethereum/les/txrelay.go:95.29,98.8 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:98.8,102.17 4 0 +github.com/ethereum/go-ethereum/les/txrelay.go:105.5,106.34 2 0 +github.com/ethereum/go-ethereum/les/txrelay.go:109.5,109.33 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:102.17,103.11 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:106.34,108.6 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:109.33,110.11 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:116.30,123.38 5 0 +github.com/ethereum/go-ethereum/les/txrelay.go:137.3,137.96 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:123.38,126.5 2 0 +github.com/ethereum/go-ethereum/les/txrelay.go:127.36,129.5 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:130.38,134.19 4 0 +github.com/ethereum/go-ethereum/les/txrelay.go:134.19,134.56 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:137.96,137.110 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:141.54,146.2 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:148.96,152.29 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:156.2,156.32 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:160.2,160.29 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:152.29,154.3 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:156.32,158.3 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:160.29,163.36 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:167.3,167.20 1 0 +github.com/ethereum/go-ethereum/les/txrelay.go:163.36,166.4 2 0 +github.com/ethereum/go-ethereum/les/txrelay.go:171.55,175.30 3 0 +github.com/ethereum/go-ethereum/les/txrelay.go:175.30,178.3 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:50.59,52.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:54.53,56.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:58.48,61.2 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:63.108,67.38 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:70.2,70.37 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:73.2,73.67 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:67.38,69.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:70.37,72.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:76.127,77.47 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:80.2,80.42 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:93.2,93.79 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:77.47,79.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:80.42,82.17 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:85.3,85.20 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:88.3,88.106 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:91.3,91.21 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:82.17,84.4 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:85.20,87.4 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:88.106,90.4 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:96.100,98.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:100.106,102.33 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:105.2,105.42 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:102.33,104.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:108.98,110.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:112.125,113.47 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:116.2,116.42 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:129.2,129.79 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:113.47,115.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:116.42,118.17 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:121.3,121.19 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:124.3,124.101 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:127.3,127.20 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:118.17,120.4 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:121.19,123.4 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:124.101,126.4 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:132.82,134.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:136.132,138.16 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:141.2,141.19 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:144.2,144.60 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:138.16,140.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:141.19,143.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:147.151,148.47 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:151.2,151.42 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:161.2,161.84 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:148.47,150.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:151.42,153.20 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:156.3,156.106 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:159.3,159.61 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:153.20,155.4 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:156.106,158.4 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:164.100,165.74 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:168.2,168.17 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:165.74,167.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:171.96,172.74 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:175.2,175.17 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:172.74,174.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:178.79,179.74 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:182.2,182.12 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:179.74,181.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:185.167,186.21 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:189.2,191.93 3 0 +github.com/ethereum/go-ethereum/les/api_backend.go:186.21,188.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:194.88,196.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:198.54,200.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:202.75,204.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:206.83,208.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:210.138,212.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:214.96,216.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:218.59,220.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:222.120,224.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:226.105,228.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:230.93,232.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:234.91,236.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:238.99,240.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:242.99,244.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:246.87,248.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:250.94,251.64 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:251.64,254.3 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:257.103,259.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:261.62,263.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:265.47,267.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:269.81,271.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:273.227,275.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:277.50,279.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:281.60,283.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:285.46,287.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:289.51,291.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:293.44,295.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:297.55,299.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:301.47,303.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:305.56,306.31 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:309.2,310.47 2 0 +github.com/ethereum/go-ethereum/les/api_backend.go:306.31,308.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:313.95,314.42 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:314.42,316.3 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:319.51,321.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:323.55,325.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:327.172,329.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:331.168,333.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:339.107,341.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:343.102,345.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:347.146,349.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:351.182,353.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:355.73,357.2 1 0 +github.com/ethereum/go-ethereum/les/api_backend.go:359.53,360.2 0 0 +github.com/ethereum/go-ethereum/les/benchmark.go:56.73,60.19 4 0 +github.com/ethereum/go-ethereum/les/benchmark.go:63.2,63.15 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:66.2,66.14 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:72.2,72.12 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:60.19,62.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:63.15,65.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:66.14,68.27 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:68.27,70.4 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:75.76,76.14 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:79.2,79.109 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:76.14,78.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:88.77,91.26 3 0 +github.com/ethereum/go-ethereum/les/benchmark.go:94.2,94.12 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:91.26,93.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:97.80,98.16 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:101.2,101.62 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:98.16,100.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:110.73,113.2 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:115.76,118.12 3 0 +github.com/ethereum/go-ethereum/les/benchmark.go:121.2,121.73 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:118.12,120.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:131.71,132.13 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:138.2,138.25 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:141.2,141.12 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:132.13,134.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:134.8,137.3 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:138.25,140.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:144.74,147.13 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:163.2,163.46 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:147.13,149.23 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:149.23,154.4 4 0 +github.com/ethereum/go-ethereum/les/benchmark.go:155.8,156.23 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:156.23,160.4 3 0 +github.com/ethereum/go-ethereum/les/benchmark.go:171.67,177.23 5 0 +github.com/ethereum/go-ethereum/les/benchmark.go:186.2,186.12 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:177.23,181.17 4 0 +github.com/ethereum/go-ethereum/les/benchmark.go:184.3,184.16 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:181.17,182.14 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:189.70,192.2 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:197.69,199.2 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:201.72,205.2 3 0 +github.com/ethereum/go-ethereum/les/benchmark.go:218.128,220.31 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:223.2,223.33 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:246.2,248.26 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:253.2,253.14 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:220.31,222.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:223.33,227.21 4 0 +github.com/ethereum/go-ethereum/les/benchmark.go:227.21,234.23 5 0 +github.com/ethereum/go-ethereum/les/benchmark.go:234.23,237.27 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:240.5,240.50 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:237.27,239.6 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:240.50,242.6 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:248.26,249.19 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:249.19,251.4 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:263.50,265.2 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:267.51,268.26 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:271.2,271.27 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:268.26,270.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:276.73,288.29 11 0 +github.com/ethereum/go-ethereum/les/benchmark.go:291.2,295.49 4 0 +github.com/ethereum/go-ethereum/les/benchmark.go:299.2,302.12 3 0 +github.com/ethereum/go-ethereum/les/benchmark.go:310.2,310.12 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:318.2,318.12 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:332.2,332.9 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:343.2,349.12 7 0 +github.com/ethereum/go-ethereum/les/benchmark.go:288.29,290.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:295.49,297.3 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:302.12,303.30 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:303.30,304.54 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:304.54,307.5 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:310.12,311.30 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:311.30,312.64 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:312.64,315.5 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:318.12,319.30 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:330.3,330.15 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:319.30,321.18 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:325.4,326.18 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:321.18,324.5 2 0 +github.com/ethereum/go-ethereum/les/benchmark.go:333.22,334.17 1 0 +github.com/ethereum/go-ethereum/les/benchmark.go:337.19,340.43 3 0 +github.com/ethereum/go-ethereum/les/benchmark.go:334.17,336.4 1 0 +github.com/ethereum/go-ethereum/les/odr.go:41.122,49.2 1 1 +github.com/ethereum/go-ethereum/les/odr.go:52.27,54.2 1 0 +github.com/ethereum/go-ethereum/les/odr.go:57.46,59.2 1 1 +github.com/ethereum/go-ethereum/les/odr.go:62.95,66.2 3 1 +github.com/ethereum/go-ethereum/les/odr.go:69.52,71.2 1 1 +github.com/ethereum/go-ethereum/les/odr.go:74.58,76.2 1 1 +github.com/ethereum/go-ethereum/les/odr.go:79.54,81.2 1 1 +github.com/ethereum/go-ethereum/les/odr.go:84.57,86.2 1 1 +github.com/ethereum/go-ethereum/les/odr.go:109.36,109.53 1 1 +github.com/ethereum/go-ethereum/les/odr.go:110.46,111.40 1 1 +github.com/ethereum/go-ethereum/les/odr.go:114.2,114.40 1 1 +github.com/ethereum/go-ethereum/les/odr.go:117.2,117.40 1 1 +github.com/ethereum/go-ethereum/les/odr.go:111.40,113.3 1 1 +github.com/ethereum/go-ethereum/les/odr.go:114.40,116.3 1 0 +github.com/ethereum/go-ethereum/les/odr.go:119.41,119.68 1 1 +github.com/ethereum/go-ethereum/les/odr.go:132.92,142.44 2 1 +github.com/ethereum/go-ethereum/les/odr.go:148.2,149.63 2 1 +github.com/ethereum/go-ethereum/les/odr.go:153.2,153.6 1 1 +github.com/ethereum/go-ethereum/les/odr.go:193.2,194.12 2 1 +github.com/ethereum/go-ethereum/les/odr.go:142.44,143.40 1 1 +github.com/ethereum/go-ethereum/les/odr.go:146.3,146.30 1 1 +github.com/ethereum/go-ethereum/les/odr.go:143.40,144.12 1 0 +github.com/ethereum/go-ethereum/les/odr.go:149.63,151.3 1 1 +github.com/ethereum/go-ethereum/les/odr.go:153.6,154.55 1 1 +github.com/ethereum/go-ethereum/les/odr.go:157.3,162.39 1 1 +github.com/ethereum/go-ethereum/les/odr.go:172.3,172.87 1 1 +github.com/ethereum/go-ethereum/les/odr.go:178.3,178.41 1 1 +github.com/ethereum/go-ethereum/les/odr.go:188.3,188.19 1 1 +github.com/ethereum/go-ethereum/les/odr.go:191.3,191.15 1 1 +github.com/ethereum/go-ethereum/les/odr.go:154.55,155.9 1 1 +github.com/ethereum/go-ethereum/les/odr.go:162.39,162.79 1 1 +github.com/ethereum/go-ethereum/les/odr.go:163.37,163.76 1 1 +github.com/ethereum/go-ethereum/les/odr.go:164.39,168.20 4 1 +github.com/ethereum/go-ethereum/les/odr.go:168.20,168.42 1 1 +github.com/ethereum/go-ethereum/les/odr.go:172.87,172.123 1 1 +github.com/ethereum/go-ethereum/les/odr.go:172.147,174.4 1 0 +github.com/ethereum/go-ethereum/les/odr.go:178.41,179.52 1 1 +github.com/ethereum/go-ethereum/les/odr.go:182.4,182.45 1 1 +github.com/ethereum/go-ethereum/les/odr.go:185.4,185.46 1 1 +github.com/ethereum/go-ethereum/les/odr.go:179.52,180.13 1 1 +github.com/ethereum/go-ethereum/les/odr.go:182.45,183.13 1 1 +github.com/ethereum/go-ethereum/les/odr.go:188.19,189.9 1 1 +github.com/ethereum/go-ethereum/les/odr.go:201.84,206.37 3 1 +github.com/ethereum/go-ethereum/les/odr.go:224.2,224.34 1 1 +github.com/ethereum/go-ethereum/les/odr.go:231.2,231.84 1 1 +github.com/ethereum/go-ethereum/les/odr.go:234.2,235.12 2 1 +github.com/ethereum/go-ethereum/les/odr.go:206.37,208.4 1 1 +github.com/ethereum/go-ethereum/les/odr.go:209.35,211.23 2 1 +github.com/ethereum/go-ethereum/les/odr.go:214.4,214.16 1 0 +github.com/ethereum/go-ethereum/les/odr.go:211.23,213.5 1 1 +github.com/ethereum/go-ethereum/les/odr.go:216.37,220.18 4 1 +github.com/ethereum/go-ethereum/les/odr.go:220.18,220.44 1 1 +github.com/ethereum/go-ethereum/les/odr.go:224.34,225.17 1 1 +github.com/ethereum/go-ethereum/les/odr.go:228.3,228.56 1 1 +github.com/ethereum/go-ethereum/les/odr.go:225.17,227.4 1 1 +github.com/ethereum/go-ethereum/les/odr.go:231.84,231.121 1 1 +github.com/ethereum/go-ethereum/les/odr.go:231.145,233.3 1 1 +github.com/ethereum/go-ethereum/les/server.go:79.96,81.16 2 0 +github.com/ethereum/go-ethereum/les/server.go:86.2,87.17 2 0 +github.com/ethereum/go-ethereum/les/server.go:90.2,114.29 3 0 +github.com/ethereum/go-ethereum/les/server.go:117.2,136.37 8 0 +github.com/ethereum/go-ethereum/les/server.go:139.2,146.25 7 0 +github.com/ethereum/go-ethereum/les/server.go:150.2,155.17 5 0 +github.com/ethereum/go-ethereum/les/server.go:81.16,83.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:87.17,89.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:114.29,115.24 1 0 +github.com/ethereum/go-ethereum/les/server.go:115.24,115.39 1 0 +github.com/ethereum/go-ethereum/les/server.go:136.37,138.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:146.25,149.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:158.38,179.2 1 0 +github.com/ethereum/go-ethereum/les/server.go:181.48,182.97 1 0 +github.com/ethereum/go-ethereum/les/server.go:189.2,189.20 1 0 +github.com/ethereum/go-ethereum/les/server.go:194.2,194.11 1 0 +github.com/ethereum/go-ethereum/les/server.go:182.97,183.38 1 0 +github.com/ethereum/go-ethereum/les/server.go:186.3,186.13 1 0 +github.com/ethereum/go-ethereum/les/server.go:183.38,185.4 1 0 +github.com/ethereum/go-ethereum/les/server.go:189.20,193.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:198.35,204.28 6 0 +github.com/ethereum/go-ethereum/les/server.go:207.2,207.12 1 0 +github.com/ethereum/go-ethereum/les/server.go:204.28,206.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:211.34,215.24 3 1 +github.com/ethereum/go-ethereum/les/server.go:218.2,223.26 6 1 +github.com/ethereum/go-ethereum/les/server.go:228.2,228.25 1 1 +github.com/ethereum/go-ethereum/les/server.go:231.2,231.20 1 1 +github.com/ethereum/go-ethereum/les/server.go:234.2,237.12 3 1 +github.com/ethereum/go-ethereum/les/server.go:215.24,217.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:223.26,225.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:228.25,230.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:231.20,233.3 1 0 +github.com/ethereum/go-ethereum/les/server.go:243.42,262.27 11 0 +github.com/ethereum/go-ethereum/les/server.go:271.2,273.6 2 0 +github.com/ethereum/go-ethereum/les/server.go:262.27,263.11 1 0 +github.com/ethereum/go-ethereum/les/server.go:263.11,266.4 2 0 +github.com/ethereum/go-ethereum/les/server.go:266.9,269.4 2 0 +github.com/ethereum/go-ethereum/les/server.go:273.6,274.10 1 0 +github.com/ethereum/go-ethereum/les/server.go:275.27,276.12 1 0 +github.com/ethereum/go-ethereum/les/server.go:281.4,281.20 1 0 +github.com/ethereum/go-ethereum/les/server.go:282.42,284.20 2 0 +github.com/ethereum/go-ethereum/les/server.go:285.42,288.78 3 0 +github.com/ethereum/go-ethereum/les/server.go:291.4,292.70 2 0 +github.com/ethereum/go-ethereum/les/server.go:293.20,294.10 1 0 +github.com/ethereum/go-ethereum/les/server.go:276.12,278.5 1 0 +github.com/ethereum/go-ethereum/les/server.go:278.10,280.5 1 0 +github.com/ethereum/go-ethereum/les/server.go:288.78,290.5 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:140.89,148.29 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:151.2,151.28 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:154.2,154.19 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:160.2,162.29 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:169.2,170.49 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:148.29,150.3 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:151.28,153.3 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:154.19,156.36 2 0 +github.com/ethereum/go-ethereum/les/costtracker.go:156.36,158.4 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:162.29,165.28 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:165.28,167.4 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:174.31,178.19 4 1 +github.com/ethereum/go-ethereum/les/costtracker.go:178.19,180.3 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:185.75,186.62 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:198.2,199.41 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:218.2,218.13 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:186.62,189.24 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:192.3,193.25 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:196.3,196.14 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:189.24,191.4 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:193.25,195.4 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:199.41,202.26 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:212.3,216.5 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:202.26,205.32 2 0 +github.com/ethereum/go-ethereum/les/costtracker.go:205.32,209.5 3 0 +github.com/ethereum/go-ethereum/les/costtracker.go:244.33,254.20 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:257.2,264.12 4 1 +github.com/ethereum/go-ethereum/les/costtracker.go:254.20,256.3 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:264.12,265.28 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:271.3,274.7 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:265.28,270.4 4 1 +github.com/ethereum/go-ethereum/les/costtracker.go:274.7,275.11 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:276.29,280.33 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:306.5,306.64 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:309.5,323.24 12 1 +github.com/ethereum/go-ethereum/les/costtracker.go:327.5,327.24 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:344.5,347.20 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:368.5,369.50 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:371.24,372.21 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:374.31,377.11 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:280.33,281.23 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:282.30,283.50 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:284.29,285.48 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:286.26,287.51 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:288.22,289.48 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:290.26,291.49 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:292.34,293.55 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:294.23,295.50 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:296.26,297.52 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:306.64,307.14 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:323.24,325.6 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:327.24,329.30 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:335.6,335.32 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:329.30,331.7 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:331.12,333.7 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:335.32,338.7 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:338.12,341.7 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:347.20,352.53 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:352.53,358.20 6 1 +github.com/ethereum/go-ethereum/les/costtracker.go:364.7,365.64 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:358.20,359.15 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:360.57,360.57 0 0 +github.com/ethereum/go-ethereum/les/costtracker.go:361.16,361.16 0 0 +github.com/ethereum/go-ethereum/les/costtracker.go:384.47,389.2 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:393.47,398.2 3 0 +github.com/ethereum/go-ethereum/les/costtracker.go:402.70,408.2 4 0 +github.com/ethereum/go-ethereum/les/costtracker.go:412.80,415.9 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:419.2,419.19 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:416.81,416.81 0 1 +github.com/ethereum/go-ethereum/les/costtracker.go:417.10,417.10 0 0 +github.com/ethereum/go-ethereum/les/costtracker.go:419.19,422.39 3 0 +github.com/ethereum/go-ethereum/les/costtracker.go:426.3,426.42 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:422.39,425.4 2 0 +github.com/ethereum/go-ethereum/les/costtracker.go:438.84,441.23 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:444.2,445.24 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:448.2,448.41 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:441.23,443.3 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:445.24,447.3 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:452.37,453.21 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:456.2,456.34 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:453.21,455.3 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:456.34,458.3 1 0 +github.com/ethereum/go-ethereum/les/costtracker.go:479.70,482.2 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:485.76,487.25 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:495.2,495.14 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:487.25,488.33 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:488.33,493.4 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:499.52,502.35 3 1 +github.com/ethereum/go-ethereum/les/costtracker.go:507.2,508.45 2 1 +github.com/ethereum/go-ethereum/les/costtracker.go:516.2,516.11 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:502.35,503.17 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:503.17,505.4 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:508.45,509.40 1 1 +github.com/ethereum/go-ethereum/les/costtracker.go:509.40,514.4 4 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:55.53,56.25 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:57.27,58.28 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:59.30,60.31 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:61.26,62.27 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:63.26,64.27 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:65.25,66.26 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:67.27,68.28 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:69.30,70.31 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:71.10,72.13 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:81.57,83.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:86.55,88.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:91.70,94.2 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:99.68,103.35 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:106.2,107.22 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:110.2,113.21 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:116.2,116.21 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:119.2,119.103 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:122.2,122.60 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:126.2,127.16 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:130.2,131.12 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:103.35,105.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:107.22,109.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:113.21,115.3 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:116.21,118.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:119.103,121.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:122.60,124.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:127.16,129.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:139.60,141.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:144.58,146.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:149.73,152.2 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:157.71,161.32 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:164.2,165.24 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:168.2,171.21 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:174.2,174.21 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:177.2,177.78 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:181.2,182.12 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:161.32,163.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:165.24,167.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:171.21,173.3 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:174.21,176.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:177.78,179.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:196.56,198.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:201.54,203.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:206.69,214.2 3 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:219.67,222.32 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:225.2,229.69 4 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:233.2,233.44 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:236.2,237.12 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:222.32,224.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:229.69,231.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:233.44,235.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:250.56,252.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:255.54,257.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:260.69,267.2 3 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:272.67,276.28 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:279.2,280.21 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:283.2,286.56 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:289.2,290.12 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:276.28,278.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:280.21,282.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:286.56,288.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:320.55,322.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:325.53,330.2 3 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:333.68,344.2 5 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:349.66,352.40 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:355.2,356.28 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:359.2,361.25 3 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:364.2,365.59 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:369.2,377.16 5 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:380.2,380.44 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:383.2,383.54 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:386.2,386.32 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:389.2,389.42 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:393.2,396.12 4 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:352.40,354.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:356.28,358.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:361.25,363.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:365.59,367.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:377.16,379.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:380.44,382.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:383.54,385.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:386.32,388.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:389.42,391.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:408.57,410.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:413.55,417.25 3 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:420.2,420.153 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:417.25,419.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:424.70,431.48 5 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:439.2,439.50 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:431.48,438.3 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:445.68,449.40 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:452.2,463.41 8 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:472.2,472.44 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:475.2,476.12 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:449.40,451.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:463.41,466.17 3 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:469.3,469.25 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:466.17,468.4 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:472.44,474.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:484.60,486.2 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:489.58,491.2 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:494.73,497.2 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:502.71,505.32 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:508.2,509.34 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:512.2,513.12 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:505.32,507.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:509.34,511.3 1 0 +github.com/ethereum/go-ethereum/les/odr_requests.go:524.54,525.21 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:528.2,529.21 2 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:525.21,527.3 1 1 +github.com/ethereum/go-ethereum/les/odr_requests.go:533.54,536.2 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:93.117,100.2 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:106.135,108.9 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:115.2,115.27 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:109.24,109.24 0 1 +github.com/ethereum/go-ethereum/les/retrieve.go:110.20,111.26 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:112.18,113.54 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:120.92,132.38 3 1 +github.com/ethereum/go-ethereum/les/retrieve.go:140.2,141.40 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:148.2,153.10 5 1 +github.com/ethereum/go-ethereum/les/retrieve.go:132.38,138.3 4 1 +github.com/ethereum/go-ethereum/les/retrieve.go:141.40,147.3 4 1 +github.com/ethereum/go-ethereum/les/retrieve.go:157.57,163.2 4 1 +github.com/ethereum/go-ethereum/les/retrieve.go:166.67,171.8 4 1 +github.com/ethereum/go-ethereum/les/retrieve.go:174.2,174.64 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:171.8,173.3 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:179.50,183.34 3 0 +github.com/ethereum/go-ethereum/les/retrieve.go:183.34,185.3 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:192.34,197.19 4 1 +github.com/ethereum/go-ethereum/les/retrieve.go:201.2,203.20 3 1 +github.com/ethereum/go-ethereum/les/retrieve.go:197.19,199.3 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:208.48,209.9 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:210.26,212.19 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:241.3,241.27 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:242.18,243.24 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:213.15,214.22 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:225.22,229.28 3 0 +github.com/ethereum/go-ethereum/les/retrieve.go:230.43,232.50 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:236.4,236.28 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:237.25,239.25 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:214.22,216.20 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:221.5,223.15 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:216.20,219.6 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:232.50,235.5 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:250.49,251.9 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:252.32,255.27 3 0 +github.com/ethereum/go-ethereum/les/retrieve.go:256.26,258.35 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:262.3,262.18 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:265.3,266.13 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:267.18,268.24 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:258.35,261.4 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:262.18,264.4 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:274.45,275.18 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:278.2,278.12 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:275.18,277.3 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:282.43,283.18 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:284.14,286.28 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:287.21,289.19 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:290.21,291.19 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:292.60,293.33 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:293.33,295.4 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:295.9,297.4 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:303.34,305.2 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:310.32,313.9 3 1 +github.com/ethereum/go-ethereum/les/retrieve.go:323.2,324.14 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:328.2,333.9 5 1 +github.com/ethereum/go-ethereum/les/retrieve.go:337.2,337.15 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:347.2,347.9 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:360.2,360.9 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:314.18,314.18 0 1 +github.com/ethereum/go-ethereum/les/retrieve.go:315.18,316.30 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:316.30,318.4 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:318.9,320.4 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:324.14,326.3 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:333.9,334.13 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:337.15,339.17 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:339.17,341.25 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:341.25,343.5 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:348.26,349.30 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:354.3,355.9 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:356.47,357.47 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:349.30,353.4 3 0 +github.com/ethereum/go-ethereum/les/retrieve.go:361.26,362.30 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:367.3,367.39 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:368.40,370.47 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:362.30,366.4 3 0 +github.com/ethereum/go-ethereum/les/retrieve.go:375.58,380.24 4 1 +github.com/ethereum/go-ethereum/les/retrieve.go:383.2,383.14 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:386.2,388.11 3 1 +github.com/ethereum/go-ethereum/les/retrieve.go:393.2,393.12 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:396.2,396.12 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:380.24,382.3 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:383.14,385.3 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:388.11,390.3 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:390.8,392.3 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:393.12,395.3 1 0 +github.com/ethereum/go-ethereum/les/retrieve.go:403.41,408.37 4 0 +github.com/ethereum/go-ethereum/les/retrieve.go:408.37,411.3 2 0 +github.com/ethereum/go-ethereum/les/retrieve.go:416.35,418.16 2 1 +github.com/ethereum/go-ethereum/les/retrieve.go:423.2,423.17 1 1 +github.com/ethereum/go-ethereum/les/retrieve.go:418.16,422.3 3 1 +github.com/ethereum/go-ethereum/les/retrieve.go:428.36,430.2 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:176.13,178.34 2 1 +github.com/ethereum/go-ethereum/les/protocol.go:178.34,186.29 4 1 +github.com/ethereum/go-ethereum/les/protocol.go:194.3,194.36 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:186.29,193.4 2 1 +github.com/ethereum/go-ethereum/les/protocol.go:219.34,221.2 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:252.44,253.41 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:256.2,256.12 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:253.41,255.3 1 0 +github.com/ethereum/go-ethereum/les/protocol.go:260.56,264.2 3 1 +github.com/ethereum/go-ethereum/les/protocol.go:267.78,269.49 2 1 +github.com/ethereum/go-ethereum/les/protocol.go:272.2,274.16 3 1 +github.com/ethereum/go-ethereum/les/protocol.go:277.2,277.41 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:280.2,280.38 1 0 +github.com/ethereum/go-ethereum/les/protocol.go:269.49,271.3 1 0 +github.com/ethereum/go-ethereum/les/protocol.go:274.16,276.3 1 0 +github.com/ethereum/go-ethereum/les/protocol.go:277.41,279.3 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:297.54,298.32 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:301.2,301.20 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:304.2,304.31 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:298.32,300.3 1 1 +github.com/ethereum/go-ethereum/les/protocol.go:301.20,303.3 1 0 +github.com/ethereum/go-ethereum/les/protocol.go:309.56,311.9 2 1 +github.com/ethereum/go-ethereum/les/protocol.go:312.18,313.13 1 0 +github.com/ethereum/go-ethereum/les/protocol.go:314.18,316.28 2 1 +github.com/ethereum/go-ethereum/les/protocol.go:317.17,319.30 2 1 +github.com/ethereum/go-ethereum/les/protocol.go:320.10,321.62 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:72.36,73.23 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:76.2,77.9 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:82.2,82.9 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:87.2,87.20 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:90.2,91.13 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:73.23,75.3 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:78.28,78.28 0 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:79.19,80.15 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:83.29,83.29 0 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:84.19,85.15 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:87.20,89.3 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:96.37,101.22 5 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:107.2,107.22 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:101.22,104.3 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:104.8,106.3 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:114.41,116.18 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:120.2,120.18 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:116.18,119.3 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:124.75,142.2 5 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:145.96,153.2 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:161.44,163.6 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:163.6,165.10 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:173.3,173.10 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:166.33,167.25 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:168.26,169.10 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:170.18,171.10 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:174.26,175.10 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:176.18,177.10 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:178.16,178.16 0 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:195.29,197.2 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:199.39,201.2 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:203.34,205.2 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:209.39,212.20 3 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:215.2,216.26 2 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:234.2,236.33 3 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:253.2,253.25 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:212.20,214.3 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:216.26,219.19 3 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:231.3,232.32 2 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:219.19,221.20 2 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:224.4,229.38 3 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:221.20,223.5 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:236.33,237.11 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:237.11,244.36 7 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:244.36,246.5 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:247.9,248.36 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:248.36,250.5 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:253.25,255.3 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:259.44,264.12 5 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:267.2,267.29 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:264.12,266.3 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:267.29,269.3 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:269.8,271.3 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:275.52,276.20 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:284.2,288.49 5 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:276.20,278.3 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:278.8,278.47 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:278.47,281.3 2 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:281.8,283.3 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:288.49,290.3 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:296.37,298.6 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:298.6,299.21 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:299.21,301.11 2 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:302.33,303.21 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:304.35,310.29 6 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:315.19,316.11 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:310.29,312.6 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:312.11,314.6 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:318.9,319.11 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:320.33,321.21 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:322.19,323.11 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:331.43,334.6 3 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:334.6,335.42 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:340.3,340.41 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:335.42,339.4 3 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:340.41,341.11 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:342.47,342.47 0 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:343.39,344.21 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:345.19,346.11 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:348.9,349.11 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:350.47,350.47 0 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:351.19,352.11 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:360.53,361.9 1 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:362.38,362.38 0 1 +github.com/ethereum/go-ethereum/les/servingqueue.go:363.17,364.9 1 0 +github.com/ethereum/go-ethereum/les/servingqueue.go:369.32,372.2 2 1 +github.com/ethereum/go-ethereum/les/sync.go:55.68,62.16 5 1 +github.com/ethereum/go-ethereum/les/sync.go:66.2,67.16 2 1 +github.com/ethereum/go-ethereum/les/sync.go:70.2,71.22 2 1 +github.com/ethereum/go-ethereum/les/sync.go:74.2,79.31 2 1 +github.com/ethereum/go-ethereum/les/sync.go:82.2,83.12 2 1 +github.com/ethereum/go-ethereum/les/sync.go:86.2,87.12 2 1 +github.com/ethereum/go-ethereum/les/sync.go:62.16,64.3 1 0 +github.com/ethereum/go-ethereum/les/sync.go:67.16,69.3 1 0 +github.com/ethereum/go-ethereum/les/sync.go:71.22,73.3 1 0 +github.com/ethereum/go-ethereum/les/sync.go:79.31,81.3 1 1 +github.com/ethereum/go-ethereum/les/sync.go:83.12,85.3 1 0 +github.com/ethereum/go-ethereum/les/sync.go:91.55,93.17 1 1 +github.com/ethereum/go-ethereum/les/sync.go:97.2,99.54 3 1 +github.com/ethereum/go-ethereum/les/sync.go:115.2,119.86 2 1 +github.com/ethereum/go-ethereum/les/sync.go:124.2,124.41 1 1 +github.com/ethereum/go-ethereum/les/sync.go:138.2,139.9 2 1 +github.com/ethereum/go-ethereum/les/sync.go:160.2,160.15 1 1 +github.com/ethereum/go-ethereum/les/sync.go:166.2,167.60 2 1 +github.com/ethereum/go-ethereum/les/sync.go:195.2,195.24 1 1 +github.com/ethereum/go-ethereum/les/sync.go:199.2,199.104 1 1 +github.com/ethereum/go-ethereum/les/sync.go:203.2,203.88 1 1 +github.com/ethereum/go-ethereum/les/sync.go:93.17,95.3 1 0 +github.com/ethereum/go-ethereum/les/sync.go:99.54,101.3 1 0 +github.com/ethereum/go-ethereum/les/sync.go:119.86,121.3 1 1 +github.com/ethereum/go-ethereum/les/sync.go:124.41,126.41 2 1 +github.com/ethereum/go-ethereum/les/sync.go:126.41,128.4 1 1 +github.com/ethereum/go-ethereum/les/sync.go:140.26,142.72 2 1 +github.com/ethereum/go-ethereum/les/sync.go:143.89,145.89 2 0 +github.com/ethereum/go-ethereum/les/sync.go:146.13,148.79 2 1 +github.com/ethereum/go-ethereum/les/sync.go:149.64,150.26 1 1 +github.com/ethereum/go-ethereum/les/sync.go:156.3,156.91 1 1 +github.com/ethereum/go-ethereum/les/sync.go:150.26,152.4 1 1 +github.com/ethereum/go-ethereum/les/sync.go:152.9,155.4 2 0 +github.com/ethereum/go-ethereum/les/sync.go:160.15,161.23 1 1 +github.com/ethereum/go-ethereum/les/sync.go:161.23,163.4 1 1 +github.com/ethereum/go-ethereum/les/sync.go:167.60,169.29 1 1 +github.com/ethereum/go-ethereum/les/sync.go:177.3,188.83 4 1 +github.com/ethereum/go-ethereum/les/sync.go:169.29,170.53 1 1 +github.com/ethereum/go-ethereum/les/sync.go:175.4,175.57 1 1 +github.com/ethereum/go-ethereum/les/sync.go:170.53,174.5 3 0 +github.com/ethereum/go-ethereum/les/sync.go:188.83,192.4 3 0 +github.com/ethereum/go-ethereum/les/sync.go:195.24,197.3 1 1 +github.com/ethereum/go-ethereum/les/sync.go:199.104,202.3 2 1 +github.com/ethereum/go-ethereum/les/api.go:43.73,49.2 1 0 +github.com/ethereum/go-ethereum/les/api.go:52.47,53.48 1 0 +github.com/ethereum/go-ethereum/les/api.go:56.2,56.68 1 0 +github.com/ethereum/go-ethereum/les/api.go:53.48,55.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:56.68,58.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:58.8,60.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:64.71,72.2 7 0 +github.com/ethereum/go-ethereum/les/api.go:75.98,77.29 2 0 +github.com/ethereum/go-ethereum/les/api.go:83.2,84.19 2 0 +github.com/ethereum/go-ethereum/les/api.go:87.2,87.25 1 0 +github.com/ethereum/go-ethereum/les/api.go:96.2,96.12 1 0 +github.com/ethereum/go-ethereum/les/api.go:77.29,78.45 1 0 +github.com/ethereum/go-ethereum/les/api.go:78.45,80.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:84.19,86.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:87.25,88.53 1 0 +github.com/ethereum/go-ethereum/les/api.go:88.53,90.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:90.9,91.91 1 0 +github.com/ethereum/go-ethereum/les/api.go:91.91,93.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:105.126,108.25 3 0 +github.com/ethereum/go-ethereum/les/api.go:112.2,112.25 1 0 +github.com/ethereum/go-ethereum/les/api.go:121.2,121.12 1 0 +github.com/ethereum/go-ethereum/les/api.go:108.25,111.3 2 0 +github.com/ethereum/go-ethereum/les/api.go:112.25,113.53 1 0 +github.com/ethereum/go-ethereum/les/api.go:113.53,115.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:115.9,116.91 1 0 +github.com/ethereum/go-ethereum/les/api.go:116.91,118.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:125.116,133.17 6 0 +github.com/ethereum/go-ethereum/les/api.go:138.2,138.13 1 0 +github.com/ethereum/go-ethereum/les/api.go:133.17,137.3 3 0 +github.com/ethereum/go-ethereum/les/api.go:143.170,145.34 2 0 +github.com/ethereum/go-ethereum/les/api.go:189.2,189.8 1 0 +github.com/ethereum/go-ethereum/les/api.go:145.34,146.28 1 0 +github.com/ethereum/go-ethereum/les/api.go:149.3,149.33 1 0 +github.com/ethereum/go-ethereum/les/api.go:158.3,158.10 1 0 +github.com/ethereum/go-ethereum/les/api.go:185.3,185.17 1 0 +github.com/ethereum/go-ethereum/les/api.go:146.28,148.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:149.33,150.50 1 0 +github.com/ethereum/go-ethereum/les/api.go:150.50,153.5 2 0 +github.com/ethereum/go-ethereum/les/api.go:153.10,155.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:159.37,160.37 1 0 +github.com/ethereum/go-ethereum/les/api.go:161.41,162.41 1 0 +github.com/ethereum/go-ethereum/les/api.go:163.44,164.40 1 0 +github.com/ethereum/go-ethereum/les/api.go:165.46,166.37 1 0 +github.com/ethereum/go-ethereum/les/api.go:167.50,168.41 1 0 +github.com/ethereum/go-ethereum/les/api.go:169.53,170.40 1 0 +github.com/ethereum/go-ethereum/les/api.go:171.41,172.89 1 0 +github.com/ethereum/go-ethereum/les/api.go:178.11,179.17 1 0 +github.com/ethereum/go-ethereum/les/api.go:172.89,175.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:175.10,177.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:179.17,181.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:181.10,183.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:185.17,187.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:194.104,196.29 2 0 +github.com/ethereum/go-ethereum/les/api.go:214.2,214.12 1 0 +github.com/ethereum/go-ethereum/les/api.go:196.29,198.44 2 0 +github.com/ethereum/go-ethereum/les/api.go:201.3,201.53 1 0 +github.com/ethereum/go-ethereum/les/api.go:198.44,200.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:201.53,204.14 3 0 +github.com/ethereum/go-ethereum/les/api.go:207.4,207.16 1 0 +github.com/ethereum/go-ethereum/les/api.go:204.14,206.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:207.16,209.5 1 0 +github.com/ethereum/go-ethereum/les/api.go:210.9,212.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:218.89,220.12 2 0 +github.com/ethereum/go-ethereum/les/api.go:223.2,223.12 1 0 +github.com/ethereum/go-ethereum/les/api.go:220.12,222.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:230.78,231.29 1 0 +github.com/ethereum/go-ethereum/les/api.go:234.2,235.12 2 0 +github.com/ethereum/go-ethereum/les/api.go:231.29,233.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:240.104,242.43 2 0 +github.com/ethereum/go-ethereum/les/api.go:245.2,245.84 1 0 +github.com/ethereum/go-ethereum/les/api.go:248.2,248.8 1 0 +github.com/ethereum/go-ethereum/les/api.go:242.43,244.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:245.84,247.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:257.135,259.31 2 0 +github.com/ethereum/go-ethereum/les/api.go:310.2,312.23 3 0 +github.com/ethereum/go-ethereum/les/api.go:324.2,324.20 1 0 +github.com/ethereum/go-ethereum/les/api.go:259.31,260.42 1 0 +github.com/ethereum/go-ethereum/les/api.go:260.42,261.46 1 0 +github.com/ethereum/go-ethereum/les/api.go:267.4,267.49 1 0 +github.com/ethereum/go-ethereum/les/api.go:273.4,273.13 1 0 +github.com/ethereum/go-ethereum/les/api.go:261.46,262.48 1 0 +github.com/ethereum/go-ethereum/les/api.go:265.5,265.15 1 0 +github.com/ethereum/go-ethereum/les/api.go:262.48,264.6 1 0 +github.com/ethereum/go-ethereum/les/api.go:267.49,268.45 1 0 +github.com/ethereum/go-ethereum/les/api.go:271.5,271.15 1 0 +github.com/ethereum/go-ethereum/les/api.go:268.45,270.6 1 0 +github.com/ethereum/go-ethereum/les/api.go:274.18,280.6 1 0 +github.com/ethereum/go-ethereum/les/api.go:281.16,282.64 1 0 +github.com/ethereum/go-ethereum/les/api.go:283.20,284.63 1 0 +github.com/ethereum/go-ethereum/les/api.go:285.17,286.56 1 0 +github.com/ethereum/go-ethereum/les/api.go:287.16,288.55 1 0 +github.com/ethereum/go-ethereum/les/api.go:289.15,293.6 1 0 +github.com/ethereum/go-ethereum/les/api.go:294.17,298.6 1 0 +github.com/ethereum/go-ethereum/les/api.go:299.18,300.39 1 0 +github.com/ethereum/go-ethereum/les/api.go:301.20,302.41 1 0 +github.com/ethereum/go-ethereum/les/api.go:303.12,304.40 1 0 +github.com/ethereum/go-ethereum/les/api.go:306.9,308.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:312.23,314.19 2 0 +github.com/ethereum/go-ethereum/les/api.go:322.3,322.18 1 0 +github.com/ethereum/go-ethereum/les/api.go:314.19,319.4 4 0 +github.com/ethereum/go-ethereum/les/api.go:319.9,321.4 1 0 +github.com/ethereum/go-ethereum/les/api.go:333.61,337.2 1 0 +github.com/ethereum/go-ethereum/les/api.go:340.61,345.43 2 0 +github.com/ethereum/go-ethereum/les/api.go:348.2,348.52 1 0 +github.com/ethereum/go-ethereum/les/api.go:345.43,347.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:348.52,351.3 2 0 +github.com/ethereum/go-ethereum/les/api.go:351.8,353.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:362.63,364.2 1 0 +github.com/ethereum/go-ethereum/les/api.go:373.67,376.16 3 0 +github.com/ethereum/go-ethereum/les/api.go:379.2,381.17 3 0 +github.com/ethereum/go-ethereum/les/api.go:376.16,378.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:390.76,393.16 3 0 +github.com/ethereum/go-ethereum/les/api.go:396.2,397.17 2 0 +github.com/ethereum/go-ethereum/les/api.go:393.16,395.3 1 0 +github.com/ethereum/go-ethereum/les/api.go:401.76,402.31 1 0 +github.com/ethereum/go-ethereum/les/api.go:405.2,405.64 1 0 +github.com/ethereum/go-ethereum/les/api.go:402.31,404.3 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:57.138,64.23 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:72.2,73.23 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:76.2,79.16 4 1 +github.com/ethereum/go-ethereum/les/client_handler.go:64.23,66.17 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:69.3,70.45 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:66.17,68.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:73.23,75.3 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:82.33,84.2 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:86.32,91.2 4 1 +github.com/ethereum/go-ethereum/les/client_handler.go:94.88,96.18 2 0 +github.com/ethereum/go-ethereum/les/client_handler.go:99.2,104.12 6 0 +github.com/ethereum/go-ethereum/les/client_handler.go:96.18,98.3 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:107.74,108.92 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:111.2,115.97 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:120.2,120.33 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:133.2,133.52 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:138.2,141.15 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:149.2,149.56 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:154.2,158.6 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:108.92,110.3 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:115.97,118.3 2 0 +github.com/ethereum/go-ethereum/les/client_handler.go:120.33,121.74 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:121.74,124.17 3 0 +github.com/ethereum/go-ethereum/les/client_handler.go:124.17,127.5 2 0 +github.com/ethereum/go-ethereum/les/client_handler.go:128.9,130.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:133.52,136.3 2 0 +github.com/ethereum/go-ethereum/les/client_handler.go:141.15,145.3 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:149.56,151.3 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:158.6,159.40 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:159.40,163.4 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:169.56,172.16 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:175.2,177.35 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:180.2,185.9 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:368.2,368.23 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:375.2,375.12 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:172.16,174.3 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:177.35,179.3 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:186.31,189.42 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:192.3,192.43 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:195.3,196.27 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:199.3,202.34 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:223.35,229.43 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:232.3,237.48 4 1 +github.com/ethereum/go-ethereum/les/client_handler.go:255.34,261.43 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:264.3,270.4 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:271.27,277.43 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:280.3,286.4 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:287.31,293.43 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:296.3,302.4 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:303.31,309.43 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:312.3,318.4 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:319.39,325.43 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:328.3,334.4 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:335.31,341.43 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:344.3,350.4 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:351.48,354.35 3 0 +github.com/ethereum/go-ethereum/les/client_handler.go:355.50,357.41 2 0 +github.com/ethereum/go-ethereum/les/client_handler.go:360.3,362.35 3 0 +github.com/ethereum/go-ethereum/les/client_handler.go:363.10,365.52 2 0 +github.com/ethereum/go-ethereum/les/client_handler.go:189.42,191.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:192.43,194.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:196.27,198.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:202.34,203.42 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:206.4,206.44 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:213.4,219.38 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:203.42,205.5 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:206.44,207.62 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:211.5,211.50 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:207.62,210.6 2 0 +github.com/ethereum/go-ethereum/les/client_handler.go:219.38,221.5 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:229.43,231.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:237.48,243.4 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:243.9,246.14 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:249.4,249.36 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:246.14,248.5 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:249.36,250.70 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:250.70,252.6 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:261.43,263.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:277.43,279.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:293.43,295.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:309.43,311.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:325.43,327.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:341.43,343.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:357.41,359.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:368.23,369.68 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:369.68,370.71 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:370.71,372.5 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:378.47,380.2 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:387.58,389.2 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:391.110,393.37 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:408.2,409.9 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:412.2,412.12 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:393.37,396.4 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:397.35,399.4 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:400.37,405.18 5 1 +github.com/ethereum/go-ethereum/les/client_handler.go:405.18,405.85 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:409.9,411.3 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:415.107,417.37 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:432.2,433.9 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:436.2,436.12 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:417.37,420.4 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:421.35,423.4 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:424.37,429.18 5 1 +github.com/ethereum/go-ethereum/les/client_handler.go:429.18,429.87 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:433.9,435.3 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:441.119,444.37 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:458.2,459.106 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:472.2,472.20 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:444.37,447.4 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:448.35,450.4 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:451.37,455.18 4 1 +github.com/ethereum/go-ethereum/les/client_handler.go:455.18,455.77 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:459.106,460.37 1 1 +github.com/ethereum/go-ethereum/les/client_handler.go:463.3,464.24 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:467.3,468.13 2 1 +github.com/ethereum/go-ethereum/les/client_handler.go:460.37,462.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:464.24,466.4 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:469.22,471.3 1 0 +github.com/ethereum/go-ethereum/les/client_handler.go:478.60,485.2 3 1 +github.com/ethereum/go-ethereum/les/client_handler.go:487.62,490.2 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:77.90,85.18 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:88.2,90.10 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:85.18,87.3 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:94.58,98.2 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:101.60,105.2 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:108.59,112.2 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:125.37,127.6 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:127.6,128.10 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:129.20,132.20 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:138.4,139.10 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:140.20,144.8 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:174.4,174.19 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:132.20,137.5 4 0 +github.com/ethereum/go-ethereum/les/distributor.go:144.8,146.32 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:146.32,150.21 4 1 +github.com/ethereum/go-ethereum/les/distributor.go:154.6,155.16 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:150.21,153.7 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:156.11,157.19 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:162.6,163.28 2 0 +github.com/ethereum/go-ethereum/les/distributor.go:167.6,167.16 1 0 +github.com/ethereum/go-ethereum/les/distributor.go:171.6,171.16 1 0 +github.com/ethereum/go-ethereum/les/distributor.go:157.19,160.17 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:163.28,166.7 1 0 +github.com/ethereum/go-ethereum/les/distributor.go:167.16,170.7 2 0 +github.com/ethereum/go-ethereum/les/distributor.go:186.45,188.2 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:192.80,204.83 7 1 +github.com/ethereum/go-ethereum/les/distributor.go:241.2,241.16 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:245.2,245.27 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:204.83,208.29 4 1 +github.com/ethereum/go-ethereum/les/distributor.go:215.3,215.29 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:233.3,234.45 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:238.3,238.14 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:208.29,211.40 3 0 +github.com/ethereum/go-ethereum/les/distributor.go:211.40,213.5 1 0 +github.com/ethereum/go-ethereum/les/distributor.go:215.29,216.80 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:216.80,220.18 4 1 +github.com/ethereum/go-ethereum/les/distributor.go:230.5,230.36 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:220.18,221.20 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:224.6,224.93 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:221.20,223.7 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:225.11,226.42 1 0 +github.com/ethereum/go-ethereum/les/distributor.go:226.42,228.7 1 0 +github.com/ethereum/go-ethereum/les/distributor.go:234.45,237.4 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:241.16,244.3 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:252.62,256.21 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:263.2,266.64 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:276.2,276.21 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:281.2,282.18 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:256.21,260.3 3 1 +github.com/ethereum/go-ethereum/les/distributor.go:266.64,268.3 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:268.8,270.53 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:273.3,273.49 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:270.53,272.4 1 1 +github.com/ethereum/go-ethereum/les/distributor.go:276.21,279.3 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:288.54,292.22 3 0 +github.com/ethereum/go-ethereum/les/distributor.go:296.2,298.13 3 0 +github.com/ethereum/go-ethereum/les/distributor.go:292.22,294.3 1 0 +github.com/ethereum/go-ethereum/les/distributor.go:302.49,304.22 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:304.22,307.3 2 1 +github.com/ethereum/go-ethereum/les/distributor.go:310.38,313.2 2 1 +github.com/ethereum/go-ethereum/les/pruner.go:38.75,47.2 4 1 +github.com/ethereum/go-ethereum/les/pruner.go:50.26,53.2 2 0 +github.com/ethereum/go-ethereum/les/pruner.go:60.25,71.20 4 1 +github.com/ethereum/go-ethereum/les/pruner.go:91.2,91.6 1 1 +github.com/ethereum/go-ethereum/les/pruner.go:71.20,73.38 2 1 +github.com/ethereum/go-ethereum/les/pruner.go:80.3,80.38 1 1 +github.com/ethereum/go-ethereum/les/pruner.go:83.3,83.38 1 1 +github.com/ethereum/go-ethereum/les/pruner.go:89.3,89.25 1 1 +github.com/ethereum/go-ethereum/les/pruner.go:73.38,75.22 2 1 +github.com/ethereum/go-ethereum/les/pruner.go:75.22,77.5 1 1 +github.com/ethereum/go-ethereum/les/pruner.go:80.38,82.4 1 0 +github.com/ethereum/go-ethereum/les/pruner.go:83.38,84.49 1 1 +github.com/ethereum/go-ethereum/les/pruner.go:84.49,87.5 2 0 +github.com/ethereum/go-ethereum/les/pruner.go:91.6,93.10 2 1 +github.com/ethereum/go-ethereum/les/pruner.go:94.24,94.24 0 0 +github.com/ethereum/go-ethereum/les/pruner.go:95.20,96.10 1 0 +github.com/ethereum/go-ethereum/les/ulc.go:32.59,34.29 2 1 +github.com/ethereum/go-ethereum/les/ulc.go:42.2,42.20 1 1 +github.com/ethereum/go-ethereum/les/ulc.go:45.2,48.8 1 1 +github.com/ethereum/go-ethereum/les/ulc.go:34.29,36.17 2 1 +github.com/ethereum/go-ethereum/les/ulc.go:40.3,40.34 1 1 +github.com/ethereum/go-ethereum/les/ulc.go:36.17,38.12 2 0 +github.com/ethereum/go-ethereum/les/ulc.go:42.20,44.3 1 0 +github.com/ethereum/go-ethereum/les/ulc.go:52.40,54.2 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:76.151,87.2 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:90.33,93.2 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:96.32,99.2 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:102.88,108.2 5 0 +github.com/ethereum/go-ethereum/les/server_handler.go:110.53,121.117 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:126.2,126.14 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:135.2,140.17 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:146.2,146.51 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:149.2,149.67 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:154.2,157.15 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:166.2,170.6 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:121.117,124.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:126.14,127.56 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:130.3,132.13 3 0 +github.com/ethereum/go-ethereum/les/server_handler.go:127.56,129.4 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:140.17,143.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:146.51,148.3 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:149.67,153.3 3 0 +github.com/ethereum/go-ethereum/les/server_handler.go:157.15,163.3 5 1 +github.com/ethereum/go-ethereum/les/server_handler.go:170.6,171.10 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:177.3,177.45 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:172.25,174.14 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:175.11,175.11 0 1 +github.com/ethereum/go-ethereum/les/server_handler.go:177.45,180.4 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:185.150,188.38 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:194.2,194.18 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:198.2,200.15 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:208.2,209.20 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:213.2,215.19 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:219.2,219.22 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:188.38,191.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:194.18,197.3 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:200.15,205.3 4 1 +github.com/ethereum/go-ethereum/les/server_handler.go:209.20,212.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:215.19,218.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:224.158,225.18 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:228.2,232.18 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:238.2,239.18 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:242.2,243.34 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:251.2,252.18 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:225.18,227.3 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:232.18,236.3 3 0 +github.com/ethereum/go-ethereum/les/server_handler.go:239.18,241.3 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:243.34,245.3 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:245.8,247.25 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:247.25,249.4 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:252.18,257.22 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:257.22,258.41 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:258.41,259.12 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:260.25,260.25 0 0 +github.com/ethereum/go-ethereum/les/server_handler.go:261.13,261.13 0 0 +github.com/ethereum/go-ethereum/les/server_handler.go:270.76,273.16 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:276.2,279.35 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:283.2,288.9 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:293.2,297.16 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:301.2,301.30 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:305.2,311.17 4 1 +github.com/ethereum/go-ethereum/les/server_handler.go:314.2,315.12 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:333.2,333.39 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:337.2,337.12 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:273.16,275.3 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:279.35,282.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:288.9,292.3 3 0 +github.com/ethereum/go-ethereum/les/server_handler.go:297.16,300.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:301.30,304.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:311.17,313.3 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:315.12,321.31 4 1 +github.com/ethereum/go-ethereum/les/server_handler.go:321.31,323.20 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:326.4,328.64 3 0 +github.com/ethereum/go-ethereum/les/server_handler.go:323.20,325.5 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:333.39,336.3 2 0 +github.com/ethereum/go-ethereum/les/server_handler.go:341.55,343.2 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:346.47,348.2 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:351.44,353.2 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:356.43,358.2 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:361.92,363.16 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:366.2,367.16 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:370.2,371.51 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:374.2,374.17 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:363.16,365.3 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:367.16,369.3 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:371.51,373.3 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:378.74,383.13 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:391.2,391.29 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:394.2,395.13 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:384.19,386.87 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:387.19,389.99 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:391.29,393.3 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:402.41,413.6 6 1 +github.com/ethereum/go-ethereum/les/server_handler.go:413.6,414.10 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:415.23,419.40 4 1 +github.com/ethereum/go-ethereum/les/server_handler.go:422.4,423.23 2 1 +github.com/ethereum/go-ethereum/les/server_handler.go:429.4,431.97 3 1 +github.com/ethereum/go-ethereum/les/server_handler.go:432.20,433.10 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:419.40,420.13 1 0 +github.com/ethereum/go-ethereum/les/server_handler.go:423.23,425.91 1 1 +github.com/ethereum/go-ethereum/les/server_handler.go:425.91,427.6 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:151.81,153.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:156.2,156.83 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:153.39,155.3 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:156.83,167.83 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:239.3,239.47 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:167.83,168.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:172.4,173.16 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:185.4,185.21 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:188.4,192.11 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:237.4,237.17 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:168.31,170.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:173.16,174.14 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:174.14,176.23 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:176.23,178.7 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:179.11,181.6 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:182.10,184.5 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:185.21,186.10 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:193.37,196.22 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:202.38,208.24 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:225.25,227.48 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:233.26,235.46 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:196.22,198.6 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:198.11,201.6 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:208.24,212.6 3 0 +github.com/ethereum/go-ethereum/les/server_requests.go:212.11,213.61 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:213.61,216.44 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:216.44,218.8 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:218.13,220.8 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:221.12,223.7 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:227.48,229.6 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:229.11,231.6 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:244.80,246.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:249.2,249.83 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:246.39,248.3 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:249.83,255.33 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:270.3,270.48 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:255.33,256.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:259.4,259.34 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:262.4,263.19 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:267.4,268.22 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:256.31,258.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:259.34,260.10 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:263.19,265.13 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:275.73,277.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:280.2,280.83 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:277.39,279.3 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:280.83,286.34 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:324.3,324.36 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:286.34,287.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:291.4,292.21 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:299.4,300.84 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:305.4,308.18 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:313.4,314.18 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:319.4,320.54 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:287.31,289.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:292.21,295.13 3 0 +github.com/ethereum/go-ethereum/les/server_requests.go:300.84,303.13 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:308.18,311.13 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:314.18,316.13 2 0 +github.com/ethereum/go-ethereum/les/server_requests.go:320.54,321.10 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:329.77,331.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:334.2,334.83 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:331.39,333.3 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:334.83,340.33 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:363.3,363.47 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:340.33,341.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:344.4,344.34 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:348.4,349.22 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:356.4,356.62 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:341.31,343.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:344.34,345.10 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:349.22,350.103 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:350.103,352.14 2 0 +github.com/ethereum/go-ethereum/les/server_requests.go:356.62,358.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:358.10,361.5 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:368.75,370.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:373.2,373.83 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:370.39,372.3 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:373.83,383.34 4 1 +github.com/ethereum/go-ethereum/les/server_requests.go:446.3,446.52 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:383.34,384.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:388.4,388.34 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:407.4,407.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:412.4,415.31 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:438.4,438.76 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:442.4,442.45 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:384.31,386.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:388.34,391.66 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:398.5,399.85 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:404.5,404.23 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:391.66,394.14 3 0 +github.com/ethereum/go-ethereum/les/server_requests.go:399.85,402.14 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:407.31,409.13 2 0 +github.com/ethereum/go-ethereum/les/server_requests.go:416.11,419.34 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:423.12,426.19 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:431.5,432.34 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:419.34,421.14 2 0 +github.com/ethereum/go-ethereum/les/server_requests.go:426.19,429.14 3 0 +github.com/ethereum/go-ethereum/les/server_requests.go:432.34,434.14 2 0 +github.com/ethereum/go-ethereum/les/server_requests.go:438.76,440.13 2 0 +github.com/ethereum/go-ethereum/les/server_requests.go:442.45,443.10 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:451.85,453.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:456.2,456.83 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:453.39,455.3 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:456.83,466.34 4 1 +github.com/ethereum/go-ethereum/les/server_requests.go:500.3,500.103 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:466.34,467.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:470.4,470.80 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:474.4,474.22 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:482.4,483.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:486.4,486.93 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:496.4,496.54 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:467.31,469.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:470.80,473.5 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:474.22,476.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:483.39,485.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:486.93,489.19 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:493.5,494.26 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:489.19,492.6 2 0 +github.com/ethereum/go-ethereum/les/server_requests.go:496.54,497.10 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:505.72,507.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:510.2,511.83 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:507.39,509.3 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:511.83,513.28 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:532.3,532.41 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:513.28,514.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:517.4,519.47 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:514.31,516.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:519.47,522.29 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:525.5,525.64 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:529.5,529.39 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:522.29,524.6 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:525.64,527.14 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:537.77,539.39 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:542.2,542.83 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:539.39,541.3 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:542.83,544.33 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:550.3,550.41 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:544.33,545.31 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:548.4,548.38 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:545.31,547.5 1 0 +github.com/ethereum/go-ethereum/les/server_requests.go:555.65,561.41 3 1 +github.com/ethereum/go-ethereum/les/server_requests.go:568.2,568.13 1 1 +github.com/ethereum/go-ethereum/les/server_requests.go:561.41,563.20 2 1 +github.com/ethereum/go-ethereum/les/server_requests.go:563.20,566.4 2 1 +github.com/ethereum/go-ethereum/les/bloombits.go:46.66,47.43 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:47.43,48.13 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:48.13,50.8 2 0 +github.com/ethereum/go-ethereum/les/bloombits.go:50.8,51.12 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:52.24,53.12 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:55.41,59.20 4 0 +github.com/ethereum/go-ethereum/les/bloombits.go:70.6,70.21 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:59.20,60.36 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:60.36,61.96 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:61.96,63.9 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:63.14,65.9 1 0 +github.com/ethereum/go-ethereum/les/bloombits.go:67.12,69.7 1 0 +github.com/ethereum/go-ethereum/les/commons.go:40.67,42.2 1 1 +github.com/ethereum/go-ethereum/les/commons.go:75.208,77.35 2 0 +github.com/ethereum/go-ethereum/les/commons.go:91.2,91.15 1 0 +github.com/ethereum/go-ethereum/les/commons.go:77.35,84.58 2 0 +github.com/ethereum/go-ethereum/les/commons.go:84.58,86.5 1 0 +github.com/ethereum/go-ethereum/les/commons.go:95.45,106.2 3 0 +github.com/ethereum/go-ethereum/les/commons.go:111.71,115.26 3 0 +github.com/ethereum/go-ethereum/les/commons.go:118.2,118.19 1 0 +github.com/ethereum/go-ethereum/les/commons.go:122.2,122.40 1 0 +github.com/ethereum/go-ethereum/les/commons.go:115.26,117.3 1 0 +github.com/ethereum/go-ethereum/les/commons.go:118.19,121.3 1 0 +github.com/ethereum/go-ethereum/les/commons.go:130.77,138.2 2 0 +github.com/ethereum/go-ethereum/les/commons.go:141.136,143.19 2 0 +github.com/ethereum/go-ethereum/les/commons.go:147.2,147.19 1 0 +github.com/ethereum/go-ethereum/les/commons.go:151.2,151.92 1 0 +github.com/ethereum/go-ethereum/les/commons.go:155.2,160.15 6 0 +github.com/ethereum/go-ethereum/les/commons.go:143.19,146.3 1 0 +github.com/ethereum/go-ethereum/les/commons.go:147.19,150.3 2 0 +github.com/ethereum/go-ethereum/les/commons.go:151.92,154.3 2 0 +github.com/ethereum/go-ethereum/les/fetcher.go:80.48,86.43 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:89.2,93.43 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:86.43,88.3 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:93.43,94.58 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:97.3,98.43 2 0 +github.com/ethereum/go-ethereum/les/fetcher.go:94.58,96.4 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:104.61,109.40 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:120.2,120.16 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:124.2,124.16 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:109.40,111.18 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:114.3,114.31 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:117.3,118.39 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:111.18,112.12 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:114.31,115.9 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:120.16,123.3 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:160.199,162.48 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:166.2,166.28 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:167.2,167.29 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:168.2,168.57 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:176.2,192.10 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:162.48,165.3 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:166.28,166.76 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:167.29,167.53 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:168.57,171.17 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:174.3,174.53 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:171.17,173.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:195.32,199.2 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:201.31,205.2 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:208.52,213.2 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:216.54,221.2 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:224.55,229.2 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:233.82,237.32 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:237.32,238.23 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:238.23,240.4 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:257.35,277.38 5 1 +github.com/ethereum/go-ethereum/les/fetcher.go:284.2,284.76 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:301.2,301.6 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:277.38,280.3 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:284.76,289.56 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:299.3,299.25 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:289.56,290.90 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:297.4,297.15 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:290.90,292.58 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:292.58,295.6 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:301.6,302.10 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:303.31,308.19 4 1 +github.com/ethereum/go-ethereum/les/fetcher.go:314.4,314.62 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:319.4,322.51 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:325.4,328.24 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:344.4,344.25 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:361.29,363.26 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:367.25,368.41 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:375.4,375.45 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:377.30,378.47 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:402.23,404.15 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:407.4,411.57 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:429.4,429.32 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:433.4,433.28 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:437.31,441.11 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:461.4,462.28 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:465.4,465.90 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:467.20,468.10 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:308.19,310.13 2 0 +github.com/ethereum/go-ethereum/les/fetcher.go:314.62,317.13 3 0 +github.com/ethereum/go-ethereum/les/fetcher.go:322.51,323.13 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:328.24,334.84 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:340.5,341.100 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:334.84,338.14 4 1 +github.com/ethereum/go-ethereum/les/fetcher.go:344.25,348.28 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:348.28,349.85 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:355.6,357.93 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:349.85,353.15 4 1 +github.com/ethereum/go-ethereum/les/fetcher.go:363.26,365.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:368.41,369.67 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:369.67,373.6 3 0 +github.com/ethereum/go-ethereum/les/fetcher.go:378.47,386.31 3 1 +github.com/ethereum/go-ethereum/les/fetcher.go:391.5,391.43 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:396.5,396.91 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:386.31,389.14 3 0 +github.com/ethereum/go-ethereum/les/fetcher.go:391.43,394.14 3 0 +github.com/ethereum/go-ethereum/les/fetcher.go:397.10,400.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:404.15,405.13 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:411.57,413.34 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:427.5,427.16 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:413.34,414.74 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:414.74,415.53 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:420.7,421.49 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:415.53,417.13 2 0 +github.com/ethereum/go-ethereum/les/fetcher.go:421.49,423.13 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:429.32,432.5 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:433.28,435.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:441.11,445.46 4 1 +github.com/ethereum/go-ethereum/les/fetcher.go:453.5,453.27 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:445.46,447.60 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:450.6,451.57 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:447.60,448.12 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:453.27,454.62 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:457.6,457.33 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:454.62,456.7 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:462.28,464.5 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:474.68,475.9 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:476.79,476.79 0 1 +github.com/ethereum/go-ethereum/les/fetcher.go:477.19,478.9 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:483.86,484.9 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:485.93,485.93 0 1 +github.com/ethereum/go-ethereum/les/fetcher.go:486.19,486.19 0 0 +github.com/ethereum/go-ethereum/les/fetcher.go:496.85,497.38 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:497.38,499.38 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:512.3,513.13 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:499.38,499.103 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:500.36,500.78 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:501.38,506.19 4 1 +github.com/ethereum/go-ethereum/les/fetcher.go:506.19,509.6 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:518.47,519.35 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:523.2,524.38 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:527.2,527.21 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:519.35,521.3 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:524.38,526.3 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:531.112,533.9 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:538.2,538.17 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:534.99,534.99 0 1 +github.com/ethereum/go-ethereum/les/fetcher.go:535.19,536.13 1 0 +github.com/ethereum/go-ethereum/les/fetcher.go:542.89,544.24 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:549.2,550.31 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:555.2,555.55 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:544.24,547.3 2 1 +github.com/ethereum/go-ethereum/les/fetcher.go:550.31,551.33 1 1 +github.com/ethereum/go-ethereum/les/fetcher.go:551.33,553.4 1 1 +github.com/ethereum/go-ethereum/les/peer.go:86.69,89.16 3 1 +github.com/ethereum/go-ethereum/les/peer.go:92.2,93.16 2 1 +github.com/ethereum/go-ethereum/les/peer.go:96.2,96.25 1 1 +github.com/ethereum/go-ethereum/les/peer.go:89.16,91.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:93.16,95.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:99.54,102.26 3 1 +github.com/ethereum/go-ethereum/les/peer.go:106.2,106.16 1 1 +github.com/ethereum/go-ethereum/les/peer.go:102.26,105.3 2 1 +github.com/ethereum/go-ethereum/les/peer.go:109.61,111.9 2 1 +github.com/ethereum/go-ethereum/les/peer.go:114.2,114.16 1 1 +github.com/ethereum/go-ethereum/les/peer.go:117.2,117.34 1 1 +github.com/ethereum/go-ethereum/les/peer.go:111.9,113.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:114.16,116.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:146.39,148.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:151.39,153.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:157.48,159.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:162.39,164.2 1 0 +github.com/ethereum/go-ethereum/les/peer.go:175.40,181.2 1 0 +github.com/ethereum/go-ethereum/les/peer.go:184.49,189.2 3 1 +github.com/ethereum/go-ethereum/les/peer.go:192.37,197.2 3 1 +github.com/ethereum/go-ethereum/les/peer.go:200.67,205.2 3 1 +github.com/ethereum/go-ethereum/les/peer.go:209.89,215.12 2 1 +github.com/ethereum/go-ethereum/les/peer.go:218.2,218.12 1 1 +github.com/ethereum/go-ethereum/les/peer.go:240.2,242.25 3 1 +github.com/ethereum/go-ethereum/les/peer.go:252.2,252.22 1 1 +github.com/ethereum/go-ethereum/les/peer.go:215.12,217.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:218.12,221.17 2 1 +github.com/ethereum/go-ethereum/les/peer.go:225.3,225.28 1 1 +github.com/ethereum/go-ethereum/les/peer.go:229.3,229.36 1 1 +github.com/ethereum/go-ethereum/les/peer.go:234.3,234.47 1 1 +github.com/ethereum/go-ethereum/les/peer.go:238.3,238.14 1 1 +github.com/ethereum/go-ethereum/les/peer.go:221.17,224.4 2 0 +github.com/ethereum/go-ethereum/les/peer.go:225.28,228.4 2 0 +github.com/ethereum/go-ethereum/les/peer.go:229.36,232.4 2 0 +github.com/ethereum/go-ethereum/les/peer.go:234.47,237.4 2 0 +github.com/ethereum/go-ethereum/les/peer.go:242.25,243.10 1 1 +github.com/ethereum/go-ethereum/les/peer.go:244.22,245.18 1 1 +github.com/ethereum/go-ethereum/les/peer.go:248.20,249.35 1 0 +github.com/ethereum/go-ethereum/les/peer.go:245.18,247.5 1 0 +github.com/ethereum/go-ethereum/les/peer.go:259.223,278.23 10 1 +github.com/ethereum/go-ethereum/les/peer.go:282.2,282.25 1 1 +github.com/ethereum/go-ethereum/les/peer.go:286.2,287.16 2 1 +github.com/ethereum/go-ethereum/les/peer.go:290.2,291.31 2 1 +github.com/ethereum/go-ethereum/les/peer.go:294.2,296.63 3 1 +github.com/ethereum/go-ethereum/les/peer.go:299.2,299.57 1 1 +github.com/ethereum/go-ethereum/les/peer.go:302.2,302.59 1 1 +github.com/ethereum/go-ethereum/les/peer.go:305.2,305.25 1 1 +github.com/ethereum/go-ethereum/les/peer.go:308.2,308.27 1 1 +github.com/ethereum/go-ethereum/les/peer.go:311.2,311.32 1 1 +github.com/ethereum/go-ethereum/les/peer.go:315.2,315.23 1 1 +github.com/ethereum/go-ethereum/les/peer.go:324.2,324.25 1 1 +github.com/ethereum/go-ethereum/les/peer.go:327.2,327.12 1 1 +github.com/ethereum/go-ethereum/les/peer.go:278.23,280.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:282.25,284.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:287.16,289.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:291.31,293.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:296.63,298.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:299.57,301.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:302.59,304.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:305.25,307.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:308.27,310.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:311.32,313.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:315.23,317.53 2 1 +github.com/ethereum/go-ethereum/les/peer.go:320.3,320.44 1 1 +github.com/ethereum/go-ethereum/les/peer.go:317.53,319.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:320.44,322.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:324.25,326.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:331.31,334.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:366.110,380.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:384.53,386.24 2 1 +github.com/ethereum/go-ethereum/les/peer.go:399.2,400.43 2 1 +github.com/ethereum/go-ethereum/les/peer.go:386.24,388.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:388.8,393.24 4 1 +github.com/ethereum/go-ethereum/les/peer.go:393.24,395.4 1 1 +github.com/ethereum/go-ethereum/les/peer.go:395.9,397.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:405.31,406.50 1 0 +github.com/ethereum/go-ethereum/les/peer.go:406.50,408.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:413.33,415.2 1 0 +github.com/ethereum/go-ethereum/les/peer.go:419.82,425.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:427.93,430.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:434.119,437.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:441.109,444.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:448.78,451.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:455.70,458.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:461.80,464.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:467.73,470.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:473.88,476.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:479.82,482.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:485.80,488.25 3 0 +github.com/ethereum/go-ethereum/les/peer.go:491.2,491.55 1 0 +github.com/ethereum/go-ethereum/les/peer.go:488.25,490.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:495.74,497.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:501.72,506.18 4 1 +github.com/ethereum/go-ethereum/les/peer.go:509.2,510.32 2 1 +github.com/ethereum/go-ethereum/les/peer.go:513.2,513.13 1 1 +github.com/ethereum/go-ethereum/les/peer.go:506.18,508.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:510.32,512.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:518.62,523.18 4 0 +github.com/ethereum/go-ethereum/les/peer.go:526.2,528.21 3 0 +github.com/ethereum/go-ethereum/les/peer.go:531.2,531.32 1 0 +github.com/ethereum/go-ethereum/les/peer.go:534.2,534.13 1 0 +github.com/ethereum/go-ethereum/les/peer.go:523.18,525.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:528.21,530.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:531.32,533.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:538.84,542.27 3 1 +github.com/ethereum/go-ethereum/les/peer.go:545.2,547.14 3 1 +github.com/ethereum/go-ethereum/les/peer.go:554.2,554.85 1 1 +github.com/ethereum/go-ethereum/les/peer.go:542.27,544.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:547.14,550.3 2 1 +github.com/ethereum/go-ethereum/les/peer.go:550.8,553.3 2 1 +github.com/ethereum/go-ethereum/les/peer.go:559.60,565.120 4 1 +github.com/ethereum/go-ethereum/les/peer.go:570.2,571.48 2 1 +github.com/ethereum/go-ethereum/les/peer.go:565.120,569.3 2 1 +github.com/ethereum/go-ethereum/les/peer.go:571.48,573.38 2 0 +github.com/ethereum/go-ethereum/les/peer.go:573.38,575.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:581.79,586.2 3 1 +github.com/ethereum/go-ethereum/les/peer.go:590.103,593.107 1 1 +github.com/ethereum/go-ethereum/les/peer.go:593.107,598.16 2 1 +github.com/ethereum/go-ethereum/les/peer.go:601.3,601.56 1 1 +github.com/ethereum/go-ethereum/les/peer.go:598.16,600.4 1 1 +github.com/ethereum/go-ethereum/les/peer.go:602.34,608.50 2 1 +github.com/ethereum/go-ethereum/les/peer.go:611.3,611.54 1 1 +github.com/ethereum/go-ethereum/les/peer.go:614.3,614.52 1 1 +github.com/ethereum/go-ethereum/les/peer.go:617.3,618.56 2 1 +github.com/ethereum/go-ethereum/les/peer.go:621.3,621.58 1 1 +github.com/ethereum/go-ethereum/les/peer.go:624.3,624.56 1 1 +github.com/ethereum/go-ethereum/les/peer.go:627.3,627.58 1 1 +github.com/ethereum/go-ethereum/les/peer.go:630.3,630.38 1 1 +github.com/ethereum/go-ethereum/les/peer.go:633.3,633.24 1 1 +github.com/ethereum/go-ethereum/les/peer.go:645.3,645.35 1 1 +github.com/ethereum/go-ethereum/les/peer.go:649.3,650.71 2 1 +github.com/ethereum/go-ethereum/les/peer.go:653.3,653.75 1 1 +github.com/ethereum/go-ethereum/les/peer.go:656.3,657.59 2 1 +github.com/ethereum/go-ethereum/les/peer.go:660.3,667.22 6 1 +github.com/ethereum/go-ethereum/les/peer.go:674.3,674.13 1 1 +github.com/ethereum/go-ethereum/les/peer.go:608.50,610.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:611.54,613.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:614.52,616.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:618.56,620.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:621.58,623.4 1 1 +github.com/ethereum/go-ethereum/les/peer.go:624.56,626.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:627.58,629.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:630.38,632.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:633.24,635.64 2 1 +github.com/ethereum/go-ethereum/les/peer.go:638.4,638.34 1 1 +github.com/ethereum/go-ethereum/les/peer.go:635.64,637.5 1 0 +github.com/ethereum/go-ethereum/les/peer.go:639.9,644.4 1 1 +github.com/ethereum/go-ethereum/les/peer.go:645.35,647.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:650.71,652.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:653.75,655.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:657.59,659.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:667.22,668.40 1 1 +github.com/ethereum/go-ethereum/les/peer.go:668.40,669.34 1 1 +github.com/ethereum/go-ethereum/les/peer.go:669.34,671.6 1 0 +github.com/ethereum/go-ethereum/les/peer.go:680.65,683.16 3 0 +github.com/ethereum/go-ethereum/les/peer.go:688.2,688.19 1 0 +github.com/ethereum/go-ethereum/les/peer.go:683.16,685.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:685.8,687.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:692.39,696.31 3 1 +github.com/ethereum/go-ethereum/les/peer.go:699.2,700.37 2 0 +github.com/ethereum/go-ethereum/les/peer.go:708.2,708.42 1 0 +github.com/ethereum/go-ethereum/les/peer.go:696.31,698.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:700.37,701.48 1 0 +github.com/ethereum/go-ethereum/les/peer.go:701.48,703.20 2 0 +github.com/ethereum/go-ethereum/les/peer.go:703.20,705.5 1 0 +github.com/ethereum/go-ethereum/les/peer.go:718.69,720.23 2 1 +github.com/ethereum/go-ethereum/les/peer.go:723.2,723.19 1 1 +github.com/ethereum/go-ethereum/les/peer.go:720.23,722.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:727.49,729.23 2 1 +github.com/ethereum/go-ethereum/les/peer.go:733.2,737.9 5 0 +github.com/ethereum/go-ethereum/les/peer.go:740.2,745.35 3 0 +github.com/ethereum/go-ethereum/les/peer.go:753.2,754.35 2 0 +github.com/ethereum/go-ethereum/les/peer.go:729.23,732.3 2 1 +github.com/ethereum/go-ethereum/les/peer.go:737.9,739.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:745.35,748.3 2 0 +github.com/ethereum/go-ethereum/les/peer.go:748.8,752.3 3 0 +github.com/ethereum/go-ethereum/les/peer.go:785.96,799.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:803.44,804.51 1 1 +github.com/ethereum/go-ethereum/les/peer.go:813.2,813.13 1 1 +github.com/ethereum/go-ethereum/les/peer.go:804.51,805.27 1 0 +github.com/ethereum/go-ethereum/les/peer.go:805.27,809.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:809.9,811.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:817.39,819.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:822.50,824.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:830.31,831.22 1 1 +github.com/ethereum/go-ethereum/les/peer.go:838.2,838.42 1 1 +github.com/ethereum/go-ethereum/les/peer.go:831.22,837.3 3 0 +github.com/ethereum/go-ethereum/les/peer.go:838.42,839.13 1 1 +github.com/ethereum/go-ethereum/les/peer.go:839.13,842.8 3 1 +github.com/ethereum/go-ethereum/les/peer.go:842.8,844.22 2 1 +github.com/ethereum/go-ethereum/les/peer.go:847.5,847.31 1 1 +github.com/ethereum/go-ethereum/les/peer.go:851.5,853.11 3 1 +github.com/ethereum/go-ethereum/les/peer.go:844.22,846.6 1 0 +github.com/ethereum/go-ethereum/les/peer.go:847.31,849.14 2 0 +github.com/ethereum/go-ethereum/les/peer.go:869.39,875.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:878.31,880.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:883.86,886.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:890.86,893.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:897.69,900.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:904.85,907.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:910.80,913.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:916.87,919.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:922.81,925.2 2 1 +github.com/ethereum/go-ethereum/les/peer.go:929.63,931.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:934.56,936.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:939.43,944.2 3 0 +github.com/ethereum/go-ethereum/les/peer.go:950.68,954.38 3 1 +github.com/ethereum/go-ethereum/les/peer.go:963.2,963.36 1 1 +github.com/ethereum/go-ethereum/les/peer.go:966.2,966.21 1 1 +github.com/ethereum/go-ethereum/les/peer.go:954.38,960.22 6 1 +github.com/ethereum/go-ethereum/les/peer.go:960.22,960.70 1 1 +github.com/ethereum/go-ethereum/les/peer.go:963.36,965.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:973.61,978.21 4 1 +github.com/ethereum/go-ethereum/les/peer.go:978.21,980.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:984.41,985.30 1 1 +github.com/ethereum/go-ethereum/les/peer.go:988.2,988.70 1 1 +github.com/ethereum/go-ethereum/les/peer.go:985.30,987.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:988.70,989.26 1 1 +github.com/ethereum/go-ethereum/les/peer.go:994.3,994.106 1 1 +github.com/ethereum/go-ethereum/les/peer.go:989.26,989.60 1 1 +github.com/ethereum/go-ethereum/les/peer.go:989.62,991.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:991.9,993.4 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1003.37,1004.22 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1011.2,1011.42 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1004.22,1010.3 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1011.42,1012.13 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1012.13,1015.8 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1015.8,1017.22 2 0 +github.com/ethereum/go-ethereum/les/peer.go:1020.5,1020.31 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1017.22,1019.6 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1020.31,1022.6 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1022.11,1025.11 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1034.169,1036.34 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1043.2,1043.42 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1046.2,1046.54 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1051.2,1052.95 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1036.34,1037.35 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1037.35,1039.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1039.9,1041.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1043.42,1045.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1046.54,1048.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1052.95,1054.44 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1068.3,1068.24 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1071.3,1075.45 4 1 +github.com/ethereum/go-ethereum/les/peer.go:1080.3,1086.56 4 1 +github.com/ethereum/go-ethereum/les/peer.go:1054.44,1062.26 5 1 +github.com/ethereum/go-ethereum/les/peer.go:1065.4,1066.41 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1062.26,1064.5 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1068.24,1070.4 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1075.45,1077.4 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1077.9,1079.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1086.56,1088.17 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1088.17,1091.5 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1093.34,1095.15 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1103.3,1103.13 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1095.15,1097.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1097.9,1098.56 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1098.56,1101.5 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1107.36,1111.2 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1113.42,1117.2 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1120.35,1122.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1144.40,1146.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1150.62,1155.29 4 1 +github.com/ethereum/go-ethereum/les/peer.go:1155.29,1157.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1161.64,1165.35 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1165.35,1166.15 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1166.15,1169.4 2 0 +github.com/ethereum/go-ethereum/les/peer.go:1175.59,1179.15 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1182.2,1182.42 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1185.2,1186.37 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1189.2,1189.12 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1179.15,1181.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1182.42,1184.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1186.37,1188.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1195.54,1200.9 4 1 +github.com/ethereum/go-ethereum/les/peer.go:1203.2,1204.37 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1207.2,1208.12 2 1 +github.com/ethereum/go-ethereum/les/peer.go:1200.9,1202.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1204.37,1206.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1212.41,1217.27 4 1 +github.com/ethereum/go-ethereum/les/peer.go:1220.2,1220.12 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1217.27,1219.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1224.54,1229.2 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1232.36,1237.2 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1242.49,1250.29 4 0 +github.com/ethereum/go-ethereum/les/peer.go:1255.2,1255.17 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1250.29,1251.56 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1251.56,1253.4 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1259.51,1264.29 4 1 +github.com/ethereum/go-ethereum/les/peer.go:1267.2,1267.13 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1264.29,1266.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1272.34,1276.29 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1279.2,1279.18 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1276.29,1278.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1294.40,1296.2 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1300.59,1304.15 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1307.2,1307.44 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1310.2,1312.12 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1304.15,1306.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1307.44,1309.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1318.56,1323.9 4 1 +github.com/ethereum/go-ethereum/les/peer.go:1326.2,1328.12 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1323.9,1325.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1332.43,1337.27 4 0 +github.com/ethereum/go-ethereum/les/peer.go:1340.2,1340.12 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1337.27,1339.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1344.56,1349.2 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1352.36,1357.2 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1361.69,1363.2 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1366.59,1371.32 4 1 +github.com/ethereum/go-ethereum/les/peer.go:1371.32,1373.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1378.57,1379.31 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1382.2,1382.24 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1379.31,1381.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1383.26,1384.37 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1385.26,1386.53 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1390.3,1390.39 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1386.53,1389.4 2 0 +github.com/ethereum/go-ethereum/les/peer.go:1396.34,1400.29 3 1 +github.com/ethereum/go-ethereum/les/peer.go:1403.2,1403.18 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1400.29,1402.3 1 1 +github.com/ethereum/go-ethereum/les/peer.go:1417.32,1419.2 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1421.54,1425.14 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1428.2,1428.39 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1431.2,1432.12 2 0 +github.com/ethereum/go-ethereum/les/peer.go:1425.14,1427.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1428.39,1430.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1435.56,1439.14 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1442.2,1442.40 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1445.2,1447.12 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1439.14,1441.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1442.40,1444.3 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1450.29,1454.26 3 0 +github.com/ethereum/go-ethereum/les/peer.go:1457.2,1457.17 1 0 +github.com/ethereum/go-ethereum/les/peer.go:1454.26,1456.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:48.77,50.16 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:53.2,54.57 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:57.2,63.16 4 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:67.2,71.3 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:50.16,52.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:54.57,56.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:63.16,65.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:74.79,75.68 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:75.68,77.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:80.151,85.19 4 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:89.2,98.15 8 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:105.2,105.17 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:115.2,115.44 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:123.2,124.16 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:127.2,128.16 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:131.2,132.41 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:85.19,87.3 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:98.15,102.3 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:102.8,102.24 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:102.24,104.3 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:105.17,109.41 4 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:112.3,112.42 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:109.41,111.4 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:115.44,117.47 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:117.47,120.4 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:124.16,126.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:128.16,130.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:135.83,137.16 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:140.2,140.55 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:137.16,139.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:143.67,145.16 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:148.2,149.55 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:152.2,152.12 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:145.16,147.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:149.55,151.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:155.82,157.16 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:160.2,161.54 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:165.2,166.65 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:169.2,169.26 1 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:157.16,159.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:161.54,163.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:166.65,168.3 1 0 +github.com/ethereum/go-ethereum/tests/bor/helper.go:172.41,175.17 3 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:179.2,180.13 2 1 +github.com/ethereum/go-ethereum/tests/bor/helper.go:175.17,178.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:30.154,36.16 4 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:39.2,47.9 5 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:36.16,38.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:48.20,49.31 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:51.24,56.30 3 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:58.22,68.75 4 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:75.153,81.16 4 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:84.2,92.9 5 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:81.16,83.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:93.20,94.31 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:96.24,101.30 3 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:103.22,113.75 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:72.71,76.25 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:79.2,79.41 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:82.2,82.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:76.25,78.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:79.41,81.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:86.37,87.67 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:87.67,89.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:93.38,95.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:98.41,99.70 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:99.70,101.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:105.44,108.2 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:148.69,161.2 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:164.70,184.2 14 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:188.25,193.2 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:196.38,201.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:204.37,209.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:212.39,217.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:221.39,226.2 3 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:230.41,235.2 3 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:238.29,246.2 5 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:250.73,255.28 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:259.2,268.34 9 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:255.28,256.49 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:268.34,273.3 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:278.73,286.2 5 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:290.102,296.33 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:329.2,329.16 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:296.33,299.61 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:303.3,303.75 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:310.3,310.41 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:317.3,317.52 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:325.3,327.9 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:299.61,301.9 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:303.75,305.9 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:310.41,312.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:312.9,315.4 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:317.52,318.44 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:318.44,320.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:320.10,323.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:336.52,338.50 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:341.2,342.52 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:361.2,362.33 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:379.2,383.65 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:390.2,390.48 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:396.2,396.16 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:338.50,340.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:342.52,351.52 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:356.3,358.18 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:351.52,353.9 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:362.33,365.39 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:368.3,368.43 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:371.3,371.42 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:374.3,375.61 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:365.39,367.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:368.43,370.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:371.42,373.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:383.65,384.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:385.19,385.19 0 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:386.11,386.11 0 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:390.48,395.3 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:399.39,404.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:406.39,412.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:416.76,422.41 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:426.2,427.46 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:438.2,438.28 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:442.2,442.15 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:445.2,451.16 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:422.41,424.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:427.46,429.36 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:435.3,435.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:429.36,430.58 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:430.58,432.13 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:438.28,440.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:442.15,444.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:457.89,462.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:467.91,472.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:487.76,490.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:493.2,493.33 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:497.2,501.65 5 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:552.2,552.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:555.2,555.39 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:560.2,560.20 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:563.2,569.37 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:490.23,492.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:493.33,495.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:501.65,510.12 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:520.3,520.15 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:528.3,528.17 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:534.3,534.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:543.3,545.29 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:510.12,518.12 6 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:520.15,526.9 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:528.17,532.9 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:534.22,540.12 5 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:545.29,547.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:547.9,549.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:552.30,554.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:555.39,558.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:560.20,562.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:575.39,579.49 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:583.2,583.48 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:589.2,589.50 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:579.49,582.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:583.48,584.42 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:587.3,587.34 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:584.42,586.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:589.50,590.42 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:593.3,593.36 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:590.42,592.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:599.48,605.2 4 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:609.47,615.2 4 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:619.49,625.2 4 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:633.100,637.16 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:641.2,644.18 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:647.2,647.37 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:650.2,650.25 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:637.16,640.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:644.18,646.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:647.37,649.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:660.134,665.18 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:672.2,673.20 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:677.2,686.14 6 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:695.2,695.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:714.2,714.15 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:729.2,735.98 5 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:738.2,738.15 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:757.2,757.32 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:760.2,760.26 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:665.18,668.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:668.8,670.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:673.20,676.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:686.14,687.49 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:687.49,690.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:690.9,690.46 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:690.46,693.4 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:695.14,697.38 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:697.38,699.76 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:704.4,704.39 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:710.4,710.21 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:699.76,702.10 3 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:704.39,707.10 3 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:714.15,719.18 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:723.3,726.48 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:719.18,722.4 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:735.98,737.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:738.15,746.10 5 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:750.5,752.41 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:753.11,753.11 0 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:757.32,759.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:766.176,770.58 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:780.2,780.54 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:785.2,786.81 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:770.58,771.43 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:774.3,774.49 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:777.3,777.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:771.43,773.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:774.49,776.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:780.54,784.3 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:792.122,796.58 3 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:802.2,802.54 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:806.2,807.94 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:796.58,797.53 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:800.3,800.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:797.53,799.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:802.54,805.3 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:819.65,823.20 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:827.2,833.18 4 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:839.2,845.41 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:859.2,859.45 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:873.2,876.52 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:880.2,880.18 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:883.2,883.20 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:887.2,887.18 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:890.2,890.66 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:823.20,826.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:833.18,834.42 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:834.42,836.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:845.41,847.19 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:851.3,851.45 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:855.3,856.6 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:847.19,848.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:851.45,853.9 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:859.45,860.91 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:870.3,871.13 2 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:860.91,862.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:862.9,868.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:876.52,878.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:880.18,882.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:883.20,885.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:887.18,889.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/queue.go:895.55,902.2 4 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:33.41,35.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:39.37,41.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:45.77,47.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:51.91,53.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:57.92,59.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:64.50,66.15 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:71.2,71.14 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:66.15,68.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:68.8,70.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:76.120,79.2 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:83.88,88.9 4 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:96.2,96.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:89.39,90.48 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:91.18,92.96 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:93.10,94.68 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:33.42,35.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:39.38,41.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:45.78,47.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:51.92,53.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:57.93,59.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:64.51,66.15 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:71.2,71.14 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:66.15,68.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:68.8,70.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:76.121,78.31 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:81.2,82.37 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:85.2,85.49 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:78.31,80.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:82.37,84.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:90.89,95.9 4 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:103.2,103.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:96.40,97.49 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:98.18,99.98 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:100.10,101.69 1 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:77.59,77.83 1 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:78.147,80.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:81.144,83.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:84.99,85.64 1 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:87.101,88.66 1 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:92.95,100.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:103.34,108.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:112.81,114.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:118.79,120.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:124.82,126.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:130.70,132.26 2 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:135.2,135.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:132.26,134.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:140.68,142.25 2 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:145.2,145.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:142.25,144.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:150.71,152.27 2 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:155.2,155.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:152.27,154.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:161.56,165.41 3 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:171.2,171.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:165.41,166.31 1 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:166.31,168.9 2 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:176.55,182.2 4 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:202.28,207.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:210.80,212.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:216.28,220.32 3 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:220.32,222.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:231.54,234.33 2 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:238.2,239.54 2 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:242.2,246.12 4 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:234.33,237.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:239.54,241.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:251.48,254.9 3 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:258.2,263.12 5 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:254.9,257.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:267.52,272.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:275.30,280.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:283.49,288.29 4 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:291.2,291.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:288.29,290.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:301.39,303.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:305.49,307.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/peer.go:309.44,312.2 2 1 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:44.69,49.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:52.38,59.14 5 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:67.2,71.23 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:59.14,61.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:75.37,77.15 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:83.2,90.12 5 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:77.15,82.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:90.12,92.16 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:99.3,99.102 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:105.3,105.23 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:92.16,96.4 3 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:99.102,102.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:105.23,107.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:113.51,123.26 6 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:126.2,128.12 3 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:123.26,125.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:137.74,139.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:147.76,149.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:157.86,167.53 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:170.2,170.12 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:167.53,169.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:178.59,182.21 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:190.2,194.16 3 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:201.2,202.21 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:210.2,210.13 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:221.2,222.56 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:229.2,229.20 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:251.2,251.19 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:183.16,184.51 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:185.16,186.55 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:187.10,188.43 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:194.16,200.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:203.16,204.86 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:205.16,206.90 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:207.10,208.87 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:210.13,219.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:222.56,228.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:229.20,237.22 5 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:245.3,245.13 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:249.3,249.16 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:238.17,239.46 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:240.17,241.50 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:242.11,243.47 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:245.13,247.12 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:256.60,258.16 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:261.2,261.6 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:258.16,260.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:261.6,267.74 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:272.3,272.23 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:284.3,284.35 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:288.3,288.42 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:297.3,298.10 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:303.3,304.17 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:267.74,271.4 3 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:272.23,274.11 2 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:278.6,278.6 0 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:279.22,280.23 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:284.35,285.12 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:288.42,289.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:290.31,291.15 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:292.22,293.23 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:299.40,299.40 0 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:300.21,301.22 1 0 +github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:304.17,306.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:33.39,35.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:39.35,41.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:45.75,47.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:51.89,53.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:57.90,59.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:64.48,66.15 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:71.2,71.14 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:66.15,68.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:68.8,70.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:76.118,78.28 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:82.2,83.37 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:86.2,86.47 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:78.28,80.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:83.37,85.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:91.86,96.9 4 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:104.2,104.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:97.35,98.47 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:99.18,100.91 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:101.10,102.67 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:31.37,33.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:36.38,37.14 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:38.16,39.16 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:40.16,41.16 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:42.17,43.17 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:44.10,45.19 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:49.52,50.14 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:51.16,52.29 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:53.16,54.29 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:55.17,56.30 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:57.10,58.55 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:62.56,63.22 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:73.2,73.12 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:64.14,65.19 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:66.14,67.19 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:68.15,69.20 1 0 +github.com/ethereum/go-ethereum/eth/downloader/modes.go:70.10,71.82 1 0 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:48.44,54.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:58.69,63.24 4 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:66.2,67.28 2 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:63.24,65.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:78.123,84.38 5 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:87.2,87.17 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:91.2,91.36 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:84.38,86.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:87.17,90.3 2 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:98.88,104.2 4 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:108.123,113.27 4 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:119.2,119.11 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:122.2,123.42 2 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:113.27,118.3 2 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:119.11,121.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:128.48,132.23 3 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:135.2,135.55 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:138.2,138.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:132.23,134.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:135.55,137.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:145.44,149.18 2 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:158.2,159.19 2 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:149.18,150.35 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:153.3,154.41 2 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:150.35,151.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:154.41,155.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:163.62,168.23 4 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:171.2,176.55 4 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:180.2,183.16 3 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:168.23,170.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:176.55,178.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:187.46,191.29 3 1 +github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:191.29,193.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/api.go:41.83,52.2 3 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:56.45,62.6 2 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:62.6,63.10 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:64.43,65.37 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:66.45,68.24 2 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:69.30,70.20 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:74.4,75.29 2 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:85.4,85.37 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:70.20,72.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:76.20,80.6 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:81.32,82.25 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:85.37,87.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:93.89,95.16 2 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:99.2,101.12 2 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:119.2,119.20 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:95.16,97.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:101.12,105.7 3 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:105.7,106.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:107.30,108.39 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:109.24,111.11 2 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:112.29,114.11 2 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:144.48,145.24 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:145.24,149.7 3 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:149.7,150.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:151.15,153.13 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:154.27,155.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/api.go:163.102,166.2 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:218.196,219.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:222.2,240.11 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:219.23,221.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:250.55,257.9 5 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:267.2,285.3 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:258.47,259.52 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:260.47,261.56 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:262.27,263.57 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:264.10,265.124 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:289.43,291.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:295.77,297.18 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:303.2,304.87 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:308.2,308.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:297.18,300.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:300.8,302.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:304.87,307.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:312.87,314.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:319.54,322.18 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:328.2,329.47 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:333.2,335.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:322.18,325.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:325.8,327.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:329.47,332.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:340.101,343.13 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:348.2,351.51 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:363.2,363.40 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:367.2,367.52 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:371.2,373.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:344.33,345.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:351.51,353.24 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:360.3,360.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:353.24,357.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:357.9,359.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:363.40,365.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:367.52,369.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:379.145,385.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:395.2,395.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:399.2,399.57 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:402.2,405.51 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:408.2,408.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:417.2,420.77 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:426.2,426.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:434.2,446.17 8 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:452.2,452.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:455.2,455.53 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:385.23,386.16 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:386.16,387.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:388.22,388.22 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:389.12,390.22 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:395.30,397.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:399.57,401.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:405.51,407.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:408.22,412.62 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:412.62,414.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:420.77,421.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:422.13,422.13 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:423.11,423.11 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:426.30,427.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:428.25,428.25 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:429.11,430.16 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:446.17,448.15 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:448.15,450.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:452.23,454.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:458.41,460.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:464.119,466.15 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:475.2,477.17 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:482.2,482.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:487.2,488.17 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:508.2,508.38 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:511.2,514.17 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:527.2,528.73 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:531.2,535.22 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:548.2,549.52 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:552.2,552.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:592.2,593.27 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:596.2,597.17 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:604.2,606.16 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:610.2,610.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:619.2,619.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:466.15,468.17 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:468.17,470.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:470.9,473.4 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:477.17,479.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:479.8,481.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:482.30,484.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:488.17,491.17 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:491.17,493.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:494.8,497.17 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:500.3,500.55 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:497.17,499.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:500.55,502.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:508.38,510.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:514.17,517.17 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:517.17,519.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:520.8,523.17 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:523.17,525.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:528.73,530.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:535.22,536.40 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:536.40,538.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:538.9,540.29 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:545.4,545.54 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:540.29,542.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:549.52,551.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:552.22,567.64 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:574.3,578.38 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:585.3,585.24 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:567.64,569.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:569.9,569.44 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:569.44,571.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:571.9,573.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:578.38,581.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:581.9,581.32 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:581.32,583.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:585.24,586.55 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:586.55,588.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:593.27,595.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:597.17,599.32 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:599.32,599.94 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:600.8,602.32 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:602.32,602.75 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:606.16,606.62 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:607.16,607.64 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:608.16,608.74 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:610.22,615.44 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:615.44,615.81 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:616.8,616.29 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:616.29,617.44 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:617.44,617.96 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:624.63,627.30 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:632.2,633.37 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:644.2,646.12 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:627.30,629.13 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:629.13,629.54 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:633.37,634.27 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:640.3,640.53 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:634.27,639.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:640.53,641.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:652.31,657.23 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:657.23,658.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:659.21,659.21 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:661.11,662.21 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:669.31,672.2 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:676.34,679.9 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:687.2,690.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:680.18,680.18 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:681.10,685.25 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:695.104,702.22 5 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:705.2,706.16 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:710.2,710.47 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:716.2,717.84 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:720.2,720.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:729.2,730.75 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:733.2,733.25 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:702.22,704.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:706.16,708.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:710.47,712.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:717.84,719.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:720.23,721.73 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:724.3,725.24 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:721.73,723.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:730.75,732.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:744.87,755.21 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:760.2,761.23 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:764.2,766.14 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:769.2,769.15 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:773.2,774.22 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:777.2,777.15 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:780.2,781.14 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:784.2,785.50 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:755.21,757.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:761.23,763.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:766.14,768.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:769.15,771.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:774.22,776.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:777.15,779.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:781.14,783.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:789.161,790.105 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:790.105,792.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:800.98,802.86 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:807.2,813.14 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:821.2,825.30 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:828.2,828.36 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:834.2,834.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:852.2,853.16 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:860.2,860.41 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:864.2,865.16 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:868.2,868.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:802.86,804.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:814.16,815.56 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:816.16,817.60 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:818.10,819.61 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:825.30,827.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:828.36,831.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:834.23,836.21 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:847.3,847.33 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:836.21,838.22 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:838.22,840.36 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:843.5,843.61 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:840.36,841.11 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:847.33,849.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:853.16,855.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:860.41,862.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:865.16,867.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:871.142,876.16 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:880.2,883.23 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:888.2,888.33 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:896.2,896.41 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:920.2,920.29 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:928.2,928.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:876.16,878.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:883.23,886.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:888.33,890.62 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:890.62,893.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:896.41,898.75 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:902.3,906.15 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:914.3,914.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:898.75,899.12 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:907.17,908.39 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:909.17,910.43 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:911.11,912.40 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:914.12,916.9 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:920.29,921.29 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:925.3,926.21 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:921.29,924.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:931.131,936.15 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:939.2,941.20 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:980.2,980.27 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:984.2,985.19 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:936.15,938.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:941.20,946.17 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:950.3,950.24 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:955.3,959.15 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:967.3,967.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:971.3,972.38 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:976.3,977.11 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:946.17,948.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:950.24,953.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:960.17,961.39 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:962.17,963.43 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:964.11,965.40 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:967.13,969.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:972.38,975.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:980.27,983.3 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:996.86,1007.6 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1007.6,1017.10 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1034.3,1034.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1061.3,1064.27 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1067.3,1069.15 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1096.3,1096.36 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1107.3,1107.24 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1128.3,1129.15 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1180.3,1180.39 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1190.3,1190.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1204.3,1204.28 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1018.17,1024.112 5 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1026.17,1028.125 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1030.11,1032.84 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1035.12,1035.12 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1038.20,1040.14 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1042.11,1048.79 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1054.4,1054.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1058.4,1058.71 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1048.79,1049.12 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1050.22,1050.22 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1051.23,1051.23 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1055.31,1055.31 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1056.22,1056.22 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1064.27,1066.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1069.15,1070.25 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1092.4,1093.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1070.25,1071.94 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1075.5,1075.98 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1079.5,1089.49 6 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1071.94,1074.6 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1075.98,1078.6 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1096.36,1098.45 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1102.4,1104.12 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1098.45,1101.5 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1107.24,1109.60 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1119.4,1120.11 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1109.60,1111.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1112.42,1113.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1114.23,1115.24 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1121.31,1122.15 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1123.22,1124.23 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1129.15,1131.18 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1135.4,1139.26 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1131.18,1134.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1140.9,1142.84 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1149.4,1149.32 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1142.84,1145.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1149.32,1152.26 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1163.5,1163.24 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1167.5,1167.71 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1152.26,1154.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1154.11,1156.70 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1156.70,1158.7 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1163.24,1165.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1167.71,1169.19 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1172.6,1173.31 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1169.19,1171.7 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1180.39,1182.11 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1183.41,1184.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1185.22,1186.23 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1190.23,1192.11 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1200.4,1200.32 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1196.6,1196.6 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1197.22,1198.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1204.28,1206.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1219.125,1224.16 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1227.2,1228.16 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1231.2,1231.36 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1224.16,1226.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1228.16,1230.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1237.70,1243.2 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1248.72,1254.2 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1259.93,1266.15 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1289.2,1291.6 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1266.15,1267.19 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1267.19,1269.25 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1273.4,1273.61 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1277.4,1278.25 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1282.4,1285.80 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1269.25,1272.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1273.61,1276.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1278.25,1281.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1291.6,1292.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1293.21,1295.22 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1297.33,1299.45 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1348.4,1351.25 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1472.4,1473.39 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1476.4,1479.79 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1299.45,1301.80 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1310.5,1310.20 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1344.5,1345.15 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1301.80,1302.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1303.23,1303.23 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1304.24,1304.24 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1310.20,1323.27 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1336.6,1336.47 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1323.27,1325.87 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1325.87,1327.8 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1336.47,1338.76 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1338.76,1340.8 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1351.25,1353.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1360.5,1361.29 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1364.5,1368.46 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1450.5,1450.45 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1467.5,1469.28 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1354.23,1356.24 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1357.13,1357.13 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1361.29,1363.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1368.46,1373.30 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1376.6,1379.95 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1385.6,1389.35 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1413.6,1413.31 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1434.6,1434.28 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1441.6,1441.28 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1373.30,1375.7 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1379.95,1381.7 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1389.35,1391.20 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1396.7,1396.43 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1391.20,1395.8 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1396.43,1398.28 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1398.28,1400.65 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1409.9,1409.14 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1400.65,1402.31 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1402.31,1405.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1406.15,1408.10 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1413.31,1414.88 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1425.7,1425.27 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1414.88,1418.73 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1421.8,1422.57 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1418.73,1420.9 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1425.27,1427.53 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1427.53,1429.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1429.14,1431.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1434.28,1440.7 3 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1441.28,1447.7 3 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1450.45,1452.103 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1461.6,1462.43 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1452.103,1453.14 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1454.25,1456.26 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1457.38,1457.38 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1462.43,1465.7 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1473.39,1475.5 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1479.79,1480.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1481.21,1481.21 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1482.13,1482.13 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1490.82,1491.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1491.6,1493.24 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1496.3,1496.31 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1502.3,1506.32 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1530.3,1530.55 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1533.3,1533.25 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1493.24,1495.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1496.31,1498.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1506.32,1508.17 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1513.4,1513.35 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1508.17,1512.5 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1513.35,1515.25 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1515.25,1517.69 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1526.6,1526.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1517.69,1519.28 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1519.28,1522.8 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1523.12,1525.7 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1530.55,1532.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1533.25,1536.4 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1540.71,1542.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1545.2,1545.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1551.2,1557.33 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1563.2,1563.64 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1575.2,1575.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1542.23,1544.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1546.18,1547.36 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1548.10,1548.10 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1557.33,1559.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1563.64,1564.27 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1573.3,1573.52 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1564.27,1566.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1566.9,1572.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1580.53,1587.15 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1594.2,1594.35 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1599.2,1607.6 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1587.15,1592.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1594.35,1595.114 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1595.114,1597.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1607.6,1611.24 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1624.3,1624.31 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1629.3,1633.22 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1644.3,1644.42 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1666.3,1667.61 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1670.3,1670.15 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1696.3,1696.54 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1611.24,1613.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1617.4,1617.11 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1613.23,1615.5 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1618.22,1620.23 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1621.12,1621.12 0 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1624.31,1626.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1633.22,1634.31 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1634.31,1639.5 3 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1640.9,1642.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1644.42,1653.128 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1653.128,1664.5 6 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1667.61,1669.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1670.15,1672.21 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1680.4,1680.11 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1672.21,1678.5 4 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1681.21,1682.24 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1685.5,1685.49 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1688.5,1688.19 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1690.35,1692.13 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1682.24,1684.6 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1685.49,1687.6 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1696.54,1698.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1702.108,1703.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1706.2,1706.80 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1711.2,1711.33 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1722.2,1722.25 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1703.23,1705.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1706.80,1709.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1711.33,1713.10 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1714.20,1715.35 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1716.21,1717.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1718.11,1719.33 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1725.93,1727.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1730.2,1730.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1740.2,1747.33 5 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1751.2,1751.97 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1755.2,1755.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1727.23,1729.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1731.18,1732.36 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1733.24,1734.42 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1737.10,1737.10 0 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1734.42,1736.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1747.33,1750.3 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1751.97,1754.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1758.66,1763.133 3 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1766.2,1766.70 1 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1769.2,1770.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1763.133,1765.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1766.70,1768.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1775.83,1776.33 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1777.32,1779.17 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1782.3,1782.82 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1784.33,1786.81 2 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1788.29,1789.65 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1791.29,1792.65 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1794.10,1795.63 1 0 +github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1779.17,1781.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:79.79,85.15 3 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:93.2,94.58 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:98.2,99.21 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:102.2,110.15 3 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:121.2,128.6 5 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:85.15,89.31 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:89.31,91.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:94.58,96.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:99.21,101.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:110.15,114.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:114.30,116.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:128.6,130.40 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:134.3,134.27 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:217.3,217.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:130.40,132.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:134.27,135.37 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:135.37,137.5 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:138.9,144.44 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:159.4,166.31 3 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:212.4,212.114 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:144.44,146.39 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:146.39,149.6 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:149.11,149.28 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:149.28,150.71 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:150.71,156.7 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:166.31,169.18 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:172.5,172.46 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:178.5,179.17 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:182.5,182.17 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:186.5,186.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:190.5,191.19 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:200.5,206.29 5 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:169.18,170.11 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:172.46,173.11 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:179.17,181.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:182.17,185.6 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:186.23,187.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:191.19,198.14 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:206.29,208.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:212.114,214.5 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:218.21,222.22 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:224.27,229.18 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:242.4,242.38 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:261.4,261.37 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:266.20,272.65 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:277.4,288.27 6 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:294.4,308.19 3 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:315.4,315.17 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:331.27,336.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:350.4,360.55 5 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:374.32,376.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:229.18,231.37 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:234.5,234.36 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:238.5,238.13 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:231.37,233.6 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:234.36,236.6 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:242.38,247.43 4 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:247.43,249.20 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:258.6,258.27 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:249.20,250.26 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:253.7,253.30 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:250.26,252.8 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:253.30,256.8 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:261.37,264.5 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:272.65,275.13 3 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:288.27,291.5 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:308.19,313.13 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:315.17,317.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:317.10,325.15 5 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:325.15,328.6 2 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:336.12,338.19 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:347.5,347.30 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:338.19,339.25 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:342.6,342.29 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:339.25,341.7 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:342.29,345.7 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:360.55,363.40 2 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:369.5,369.42 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:363.40,365.6 1 0 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:369.42,371.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:376.13,378.5 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:75.13,78.40 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:78.40,79.66 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:215.99,228.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:234.30,242.6 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:242.6,243.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:244.30,247.10 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:249.32,252.20 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:256.4,260.8 4 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:252.20,254.13 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:260.8,265.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:266.31,270.16 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:272.31,276.16 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:278.32,282.20 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:284.31,287.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:289.13,294.12 3 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:302.38,311.2 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:319.63,323.9 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:324.75,325.16 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:326.22,327.23 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:334.68,337.17 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:345.2,346.15 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:348.2,349.15 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:351.2,358.12 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:361.2,376.15 6 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:382.2,388.42 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:392.2,392.27 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:395.2,395.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:337.17,339.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:339.8,343.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:346.15,346.39 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:349.15,349.40 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:358.12,360.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:376.15,379.3 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:388.42,390.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:392.27,394.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:395.6,397.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:401.3,401.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:397.14,399.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:402.27,406.18 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:415.30,417.29 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:419.32,425.71 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:436.4,441.14 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:445.30,446.24 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:448.27,456.14 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:460.4,460.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:406.18,409.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:409.10,413.5 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:425.71,429.20 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:433.5,434.13 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:429.20,432.6 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:441.14,443.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:456.14,459.5 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:460.14,463.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:472.49,477.67 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:545.2,559.38 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:562.2,562.80 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:477.67,479.60 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:479.60,481.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:481.9,483.50 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:488.4,493.38 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:510.4,511.45 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:522.4,522.17 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:531.4,536.40 4 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:539.4,539.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:483.50,485.5 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:493.38,496.41 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:502.5,502.41 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:506.5,506.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:496.41,499.14 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:502.41,505.6 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:511.45,513.43 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:513.43,515.44 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:515.44,519.7 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:522.17,525.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:536.40,538.5 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:559.38,561.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:566.60,568.16 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:571.2,571.43 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:568.16,569.13 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:578.72,584.30 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:590.2,590.31 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:596.2,596.90 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:607.2,613.38 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:616.2,616.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:584.30,585.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:588.3,588.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:585.12,587.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:590.31,591.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:594.3,594.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:591.12,593.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:596.90,597.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:600.3,600.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:597.12,599.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:613.38,615.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:620.110,627.31 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:631.2,631.28 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:634.2,637.43 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:627.31,630.3 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:631.28,633.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:637.43,639.29 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:643.3,643.18 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:647.3,647.51 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:651.3,658.7 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:669.3,685.34 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:639.29,641.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:643.18,644.12 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:647.51,649.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:658.7,660.18 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:663.4,663.38 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:666.4,666.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:660.18,661.13 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:663.38,664.13 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:692.74,701.31 4 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:704.2,706.16 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:711.2,719.9 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:701.31,703.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:706.16,710.3 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:720.20,722.31 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:724.24,740.18 5 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:742.22,750.10 4 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:751.26,755.32 3 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:757.47,761.32 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:763.69,767.32 3 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:769.70,773.32 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:775.11,778.40 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:790.4,792.11 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:778.40,779.53 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:779.53,784.6 4 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:797.6,797.6 0 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:798.22,798.22 0 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:806.48,809.33 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:815.2,815.31 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:809.33,810.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:810.23,812.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:815.31,817.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:822.62,823.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:824.25,824.25 0 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:826.20,826.20 0 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:828.19,828.19 0 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:838.54,840.9 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:846.2,853.63 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:841.19,843.9 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:844.10,844.10 0 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:856.84,865.41 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:872.2,880.30 4 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:884.2,885.31 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1004.2,1005.38 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1009.2,1010.12 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1013.2,1013.55 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1023.2,1023.23 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:865.41,871.3 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:880.30,882.3 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:885.31,888.63 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:908.3,909.58 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:937.3,945.13 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:956.3,957.39 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:960.3,968.101 4 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1000.3,1000.13 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:888.63,899.40 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:902.4,904.9 3 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:899.40,901.5 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:909.58,910.21 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:910.21,931.30 7 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:931.30,933.11 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:945.13,949.37 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:953.4,953.9 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:949.37,952.5 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:957.39,959.4 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:968.101,976.68 4 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:988.4,988.107 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:976.68,980.13 3 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:981.10,985.5 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:988.107,995.5 5 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1000.13,1001.9 1 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1005.38,1007.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1010.12,1012.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1013.55,1016.20 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1016.20,1018.4 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1018.9,1021.4 2 1 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1036.81,1042.22 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1045.2,1046.57 2 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1049.2,1052.24 3 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1042.22,1044.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1046.57,1048.3 1 0 +github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1061.56,1063.2 1 0 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:27.61,30.9 2 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:40.2,40.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:31.29,35.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:36.18,38.16 2 0 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:45.37,46.6 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:46.6,47.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:48.32,49.32 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:52.19,53.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:49.32,51.5 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:60.60,66.6 4 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:66.6,67.10 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:68.35,69.15 1 0 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:71.17,72.14 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:92.63,100.2 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:105.27,109.2 3 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:112.34,115.2 2 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:118.36,119.25 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:122.2,122.17 1 1 +github.com/ethereum/go-ethereum/eth/downloader/statesync.go:119.25,121.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:72.35,74.2 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:82.57,83.15 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:86.2,89.50 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:96.2,96.18 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:83.15,84.46 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:89.50,91.17 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:94.3,94.23 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:91.17,93.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:101.56,103.2 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:107.39,109.16 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:112.2,112.12 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:109.16,111.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:118.51,120.30 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:123.2,123.19 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:120.30,122.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:126.116,127.32 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:128.11,129.30 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:130.17,131.26 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:132.18,133.80 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:137.3,138.31 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:142.3,142.35 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:143.17,145.31 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:149.3,149.35 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:150.16,152.17 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:155.3,156.35 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:157.10,158.65 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:133.80,136.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:138.31,141.4 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:145.31,148.4 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:152.17,154.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:164.61,166.16 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:169.2,169.18 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:172.2,172.17 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:175.2,175.28 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:166.16,168.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:169.18,171.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:172.17,174.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:178.117,180.21 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:184.2,184.22 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:201.2,201.32 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:180.21,182.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:184.22,189.42 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:194.3,194.18 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:197.3,198.32 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:189.42,191.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:191.9,193.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:194.18,196.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:202.17,204.26 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:206.18,207.82 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:211.3,212.33 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:216.3,216.32 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:218.17,220.33 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:224.3,224.32 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:226.16,228.17 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:231.3,232.42 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:234.10,235.65 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:207.82,210.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:212.33,215.4 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:220.33,223.4 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:228.17,230.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:245.42,246.48 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:246.48,248.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:251.76,253.16 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:256.2,256.31 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:253.16,255.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:267.51,270.21 3 1 +github.com/ethereum/go-ethereum/trie/trie.go:283.2,283.12 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:270.21,272.17 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:275.3,275.13 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:272.17,274.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:276.8,278.17 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:281.3,281.13 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:278.17,280.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:286.83,287.19 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:293.2,293.23 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:287.19,288.33 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:291.3,291.26 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:288.33,290.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:294.18,298.29 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:306.3,309.17 4 1 +github.com/ethereum/go-ethereum/trie/trie.go:312.3,313.17 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:317.3,317.20 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:321.3,321.68 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:323.17,325.27 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:328.3,331.22 4 1 +github.com/ethereum/go-ethereum/trie/trie.go:333.11,334.56 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:336.16,341.17 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:344.3,345.27 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:348.3,348.23 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:350.10,351.51 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:298.29,300.28 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:303.4,303.56 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:300.28,302.5 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:309.17,311.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:313.17,315.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:317.20,319.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:325.27,327.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:341.17,343.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:345.27,347.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:356.35,357.41 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:357.41,359.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:364.44,368.16 4 1 +github.com/ethereum/go-ethereum/trie/trie.go:371.2,372.12 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:368.16,370.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:378.71,379.23 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:380.18,382.28 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:385.3,385.27 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:392.3,393.27 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:396.3,396.32 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:409.17,411.27 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:414.3,422.16 4 1 +github.com/ethereum/go-ethereum/trie/trie.go:435.3,436.35 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:446.3,446.15 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:468.3,468.22 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:470.17,471.24 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:473.11,474.25 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:476.16,481.17 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:484.3,485.27 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:488.3,488.23 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:490.10,491.61 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:382.28,384.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:385.27,387.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:393.27,395.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:397.19,404.85 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:405.11,406.59 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:411.27,413.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:422.16,424.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:436.35,437.18 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:437.18,438.18 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:438.18,440.6 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:440.11,442.11 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:446.15,447.17 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:465.4,465.81 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:447.17,455.19 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:458.5,458.44 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:455.19,457.6 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:458.44,461.6 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:481.17,483.4 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:485.27,487.4 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:495.43,500.2 4 1 +github.com/ethereum/go-ethereum/trie/trie.go:502.61,503.31 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:506.2,506.15 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:503.31,505.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:509.69,511.42 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:514.2,514.61 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:511.42,513.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:517.71,520.20 3 1 +github.com/ethereum/go-ethereum/trie/trie.go:523.2,523.61 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:520.20,522.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:528.35,532.2 3 1 +github.com/ethereum/go-ethereum/trie/trie.go:536.70,537.17 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:540.2,540.19 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:545.2,552.40 4 1 +github.com/ethereum/go-ethereum/trie/trie.go:555.2,556.19 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:565.2,566.19 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:574.2,574.16 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:577.2,578.33 2 1 +github.com/ethereum/go-ethereum/trie/trie.go:537.17,538.51 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:540.19,542.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:552.40,554.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:556.19,560.13 4 0 +github.com/ethereum/go-ethereum/trie/trie.go:560.13,563.4 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:566.19,573.3 2 0 +github.com/ethereum/go-ethereum/trie/trie.go:574.16,576.3 1 0 +github.com/ethereum/go-ethereum/trie/trie.go:582.47,583.19 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:587.2,591.28 5 1 +github.com/ethereum/go-ethereum/trie/trie.go:583.19,585.3 1 1 +github.com/ethereum/go-ethereum/trie/trie.go:595.24,598.2 2 0 +github.com/ethereum/go-ethereum/trie/committer.go:55.26,59.3 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:63.32,65.2 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:67.42,71.2 3 1 +github.com/ethereum/go-ethereum/trie/committer.go:74.73,75.15 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:78.2,79.16 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:82.2,82.37 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:75.15,77.3 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:79.16,81.3 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:86.69,89.27 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:93.2,93.24 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:89.27,91.3 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:94.18,101.38 3 1 +github.com/ethereum/go-ethereum/trie/committer.go:109.3,111.42 3 1 +github.com/ethereum/go-ethereum/trie/committer.go:114.3,114.40 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:115.17,117.17 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:120.3,124.42 4 1 +github.com/ethereum/go-ethereum/trie/committer.go:127.3,127.40 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:128.16,129.20 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:130.10,132.51 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:101.38,103.18 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:106.4,106.53 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:103.18,105.5 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:111.42,113.4 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:117.17,119.4 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:124.42,126.4 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:137.86,142.26 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:165.2,165.27 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:168.2,168.33 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:142.26,144.19 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:150.3,150.37 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:157.3,158.17 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:161.3,162.30 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:144.19,145.12 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:150.37,152.12 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:158.17,160.4 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:165.27,167.3 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:174.54,180.17 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:193.2,193.21 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:206.2,206.13 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:180.17,186.3 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:186.8,190.3 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:193.21,199.3 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:199.8,199.22 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:199.22,205.3 3 1 +github.com/ethereum/go-ethereum/trie/committer.go:210.46,211.29 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:211.29,222.22 5 0 +github.com/ethereum/go-ethereum/trie/committer.go:222.22,223.25 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:224.20,225.43 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:228.19,231.30 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:225.43,227.6 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:231.30,233.6 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:239.56,245.2 5 0 +github.com/ethereum/go-ethereum/trie/committer.go:251.31,252.23 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:253.18,255.46 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:256.17,259.27 2 1 +github.com/ethereum/go-ethereum/trie/committer.go:266.3,266.11 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:267.17,268.20 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:269.16,270.20 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:271.10,272.40 1 0 +github.com/ethereum/go-ethereum/trie/committer.go:259.27,260.44 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:260.44,262.5 1 1 +github.com/ethereum/go-ethereum/trie/committer.go:262.10,264.5 1 1 +github.com/ethereum/go-ethereum/trie/errors.go:33.45,35.2 1 0 +github.com/ethereum/go-ethereum/trie/node_enc.go:23.33,29.2 5 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:31.48,33.31 2 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:40.2,40.19 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:33.31,34.15 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:34.15,36.4 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:36.9,38.4 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:43.49,46.18 3 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:51.2,51.19 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:46.18,48.3 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:48.8,50.3 1 0 +github.com/ethereum/go-ethereum/trie/node_enc.go:54.47,56.2 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:58.48,60.2 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:62.50,64.22 2 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:71.2,71.19 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:64.22,65.15 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:65.15,67.4 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:67.9,69.4 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:74.52,77.18 3 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:82.2,82.19 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:77.18,79.3 1 1 +github.com/ethereum/go-ethereum/trie/node_enc.go:79.8,81.3 1 0 +github.com/ethereum/go-ethereum/trie/node_enc.go:85.46,87.2 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:37.86,42.32 4 1 +github.com/ethereum/go-ethereum/trie/proof.go:68.2,71.26 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:88.2,88.12 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:42.32,43.25 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:44.19,45.70 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:52.4,52.28 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:53.18,56.28 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:57.17,60.18 3 0 +github.com/ethereum/go-ethereum/trie/proof.go:64.11,65.54 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:45.70,48.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:48.10,51.5 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:60.18,63.5 2 0 +github.com/ethereum/go-ethereum/trie/proof.go:71.26,72.20 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:76.3,78.46 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:72.20,74.12 2 0 +github.com/ethereum/go-ethereum/trie/proof.go:78.46,82.11 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:85.4,85.26 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:82.11,84.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:98.92,100.2 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:105.108,108.20 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:108.20,110.17 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:113.3,114.17 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:117.3,118.28 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:110.17,112.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:114.17,116.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:119.12,121.19 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:122.17,124.26 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:125.18,126.19 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:136.138,138.54 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:151.2,151.17 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:158.2,165.6 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:138.54,140.17 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:143.3,144.17 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:147.3,147.16 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:140.17,142.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:144.17,146.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:151.17,153.17 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:156.3,156.11 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:153.17,155.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:165.6,167.30 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:192.3,192.33 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:200.3,200.23 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:203.3,203.31 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:168.12,173.24 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:176.4,176.68 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:177.19,179.12 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:180.18,182.12 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:183.17,185.18 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:188.18,189.17 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:173.24,175.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:185.18,187.5 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:193.19,194.21 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:195.18,196.34 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:197.11,198.60 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:200.23,202.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:218.69,234.6 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:271.2,271.24 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:234.6,235.27 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:236.19,241.35 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:246.4,246.36 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:251.4,251.49 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:254.4,255.36 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:256.18,262.68 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:265.4,266.42 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:267.11,268.52 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:241.35,243.5 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:243.10,245.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:246.36,248.5 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:248.10,250.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:251.49,252.19 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:262.68,263.19 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:272.18,279.50 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:282.3,282.48 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:285.3,285.48 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:294.3,294.26 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:305.3,305.25 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:316.3,316.20 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:317.17,319.47 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:322.3,322.81 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:325.3,325.82 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:328.3,328.20 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:329.10,330.51 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:279.50,281.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:282.48,284.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:285.48,287.21 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:290.4,291.21 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:287.21,289.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:294.26,295.39 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:303.4,303.67 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:295.39,297.22 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:300.5,301.22 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:297.22,299.6 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:305.25,306.39 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:314.4,314.67 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:306.39,308.22 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:311.5,312.22 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:308.22,310.6 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:319.47,321.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:322.81,324.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:325.82,327.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:346.81,347.29 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:348.17,349.17 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:360.3,360.68 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:361.18,362.88 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:391.3,391.39 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:396.3,397.64 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:398.11,401.13 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:402.10,403.31 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:349.17,350.39 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:353.4,353.37 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:350.39,352.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:354.9,355.39 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:358.4,358.37 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:355.39,357.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:362.88,364.18 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:389.4,389.14 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:364.18,365.46 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:365.46,371.6 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:371.12,375.6 0 0 +github.com/ethereum/go-ethereum/trie/proof.go:376.10,377.46 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:377.46,383.6 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:383.12,387.6 0 0 +github.com/ethereum/go-ethereum/trie/proof.go:391.39,395.4 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:411.50,413.18 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:433.2,433.14 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:413.18,414.28 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:415.18,416.39 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:421.4,421.44 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:422.19,423.84 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:426.4,426.39 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:427.18,428.16 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:429.11,430.58 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:416.39,417.30 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:417.30,419.6 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:423.84,425.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:470.152,471.30 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:475.2,475.35 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:480.2,480.31 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:487.2,487.18 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:499.2,499.20 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:511.2,511.54 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:526.2,526.43 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:530.2,530.35 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:536.2,537.16 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:543.2,544.16 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:549.2,550.16 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:555.2,556.11 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:559.2,559.31 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:562.2,562.27 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:565.2,565.57 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:471.30,473.3 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:475.35,476.45 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:476.45,478.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:480.31,481.22 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:481.22,483.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:487.18,489.32 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:492.3,492.54 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:495.3,495.20 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:489.32,491.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:492.54,494.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:499.20,501.17 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:504.3,504.52 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:507.3,507.20 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:501.17,503.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:504.52,506.4 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:511.54,513.17 2 1 +github.com/ethereum/go-ethereum/trie/proof.go:516.3,516.38 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:519.3,519.35 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:522.3,522.46 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:513.17,515.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:516.38,518.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:519.35,521.4 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:526.43,528.3 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:530.35,532.3 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:537.16,539.3 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:544.16,546.3 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:550.16,552.3 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:556.11,558.3 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:559.31,561.3 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:562.27,564.3 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:573.65,574.6 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:574.6,575.25 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:576.19,577.70 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:580.4,582.21 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:585.18,588.21 3 1 +github.com/ethereum/go-ethereum/trie/proof.go:591.17,592.17 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:593.12,594.19 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:595.18,596.17 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:597.11,598.54 1 0 +github.com/ethereum/go-ethereum/trie/proof.go:577.70,579.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:582.21,584.5 1 1 +github.com/ethereum/go-ethereum/trie/proof.go:588.21,590.5 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:36.26,38.3 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:41.60,45.2 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:47.34,50.2 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:64.55,69.2 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:72.78,74.49 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:78.2,78.15 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:81.2,81.17 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:74.49,76.3 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:78.15,80.3 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:85.63,98.17 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:101.2,101.36 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:113.2,114.23 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:98.17,100.3 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:101.36,102.19 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:106.3,107.58 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:102.19,104.12 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:107.58,109.4 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:109.9,111.4 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:118.57,121.2 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:123.57,135.29 7 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:145.2,145.12 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:135.29,136.45 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:141.3,143.26 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:136.45,138.4 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:138.9,138.30 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:138.30,139.12 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:148.53,150.36 2 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:150.36,151.19 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:151.19,153.4 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:157.67,163.2 5 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:165.79,171.2 5 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:183.57,185.21 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:188.2,189.12 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:185.21,186.34 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:192.48,193.49 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:193.49,195.3 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:198.30,202.29 4 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:205.2,205.25 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:202.29,204.3 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:211.51,212.34 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:217.2,217.20 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:212.34,213.25 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:213.25,215.4 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:222.48,223.21 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:224.18,227.33 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:237.3,237.30 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:242.15,251.29 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:261.3,262.30 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:270.3,272.19 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:288.3,295.28 6 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:297.16,307.29 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:314.3,315.19 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:332.3,342.15 7 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:344.17,347.17 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:349.18,350.38 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:352.10,353.24 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:227.33,228.29 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:228.29,229.46 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:232.5,232.10 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:229.46,231.6 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:237.30,239.4 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:239.9,241.4 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:251.29,256.4 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:262.30,264.4 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:264.9,268.4 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:272.19,279.4 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:279.9,286.4 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:307.29,308.47 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:315.19,320.4 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:320.9,327.4 4 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:367.29,372.2 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:374.46,378.21 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:441.2,443.27 3 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:450.2,451.18 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:379.18,380.9 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:382.17,386.9 4 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:388.18,390.37 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:408.3,409.38 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:411.15,416.35 4 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:422.3,427.23 4 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:429.16,435.38 5 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:437.10,438.29 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:390.37,391.20 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:396.4,397.27 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:404.4,405.23 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:391.20,393.13 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:397.27,399.5 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:399.10,401.5 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:416.35,418.4 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:418.9,420.4 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:443.27,446.3 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:451.18,455.3 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:459.45,464.23 4 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:472.2,475.10 4 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:464.23,467.3 2 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:485.58,486.18 1 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:490.2,494.23 4 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:502.2,506.15 5 1 +github.com/ethereum/go-ethereum/trie/stacktrie.go:486.18,488.3 1 0 +github.com/ethereum/go-ethereum/trie/stacktrie.go:494.23,497.3 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:76.40,82.20 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:85.2,85.68 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:82.20,84.3 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:102.38,107.2 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:110.59,113.2 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:116.59,119.2 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:134.92,145.2 3 1 +github.com/ethereum/go-ethereum/trie/sync.go:148.101,150.23 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:153.2,153.30 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:158.2,158.41 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:162.2,168.31 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:176.2,176.17 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:150.23,152.3 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:153.30,155.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:158.41,160.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:168.31,170.22 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:173.3,174.46 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:170.22,171.65 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:182.80,184.24 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:187.2,187.30 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:195.2,195.47 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:199.2,205.31 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:213.2,213.17 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:184.24,186.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:187.30,189.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:195.47,197.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:205.31,207.22 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:210.3,211.46 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:207.22,208.66 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:219.94,225.78 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:246.2,246.42 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:225.78,231.44 3 1 +github.com/ethereum/go-ethereum/trie/sync.go:235.3,239.38 4 1 +github.com/ethereum/go-ethereum/trie/sync.go:231.44,232.9 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:239.38,242.4 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:242.9,244.4 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:255.49,257.70 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:261.2,262.67 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:268.2,268.67 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:291.2,291.13 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:294.2,294.12 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:257.70,259.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:262.67,266.3 3 0 +github.com/ethereum/go-ethereum/trie/sync.go:268.67,272.17 3 1 +github.com/ethereum/go-ethereum/trie/sync.go:275.3,279.17 3 1 +github.com/ethereum/go-ethereum/trie/sync.go:282.3,282.42 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:272.17,274.4 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:279.17,281.4 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:282.42,284.4 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:284.9,286.35 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:286.35,288.5 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:291.13,293.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:299.46,301.43 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:304.2,304.43 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:308.2,309.12 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:301.43,303.3 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:304.43,306.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:313.30,315.2 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:320.39,322.14 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:326.2,326.37 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:330.2,338.47 3 1 +github.com/ethereum/go-ethereum/trie/sync.go:341.2,341.30 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:322.14,324.3 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:326.37,329.3 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:338.47,340.3 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:346.72,354.33 3 1 +github.com/ethereum/go-ethereum/trie/sync.go:377.2,378.33 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:415.2,415.22 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:355.18,357.19 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:360.3,363.5 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:364.17,365.27 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:373.10,374.48 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:357.19,359.4 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:365.27,366.31 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:366.31,371.5 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:378.33,380.26 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:395.3,395.46 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:380.26,381.48 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:381.48,383.47 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:389.5,389.75 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:383.47,385.6 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:385.11,385.54 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:385.54,388.6 2 0 +github.com/ethereum/go-ethereum/trie/sync.go:389.75,391.6 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:395.46,398.32 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:403.4,403.43 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:407.4,412.6 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:398.32,399.13 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:403.43,404.13 1 0 +github.com/ethereum/go-ethereum/trie/sync.go:421.49,423.14 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:433.2,433.37 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:441.2,441.12 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:423.14,427.3 3 0 +github.com/ethereum/go-ethereum/trie/sync.go:427.8,431.3 3 1 +github.com/ethereum/go-ethereum/trie/sync.go:433.37,435.23 2 1 +github.com/ethereum/go-ethereum/trie/sync.go:435.23,436.43 1 1 +github.com/ethereum/go-ethereum/trie/sync.go:436.43,438.5 1 0 +github.com/ethereum/go-ethereum/trie/database.go:99.45,99.95 1 0 +github.com/ethereum/go-ethereum/trie/database.go:100.45,100.95 1 0 +github.com/ethereum/go-ethereum/trie/database.go:102.47,105.2 2 0 +github.com/ethereum/go-ethereum/trie/database.go:112.49,112.99 1 0 +github.com/ethereum/go-ethereum/trie/database.go:113.49,113.99 1 0 +github.com/ethereum/go-ethereum/trie/database.go:115.51,119.2 3 0 +github.com/ethereum/go-ethereum/trie/database.go:129.50,129.100 1 0 +github.com/ethereum/go-ethereum/trie/database.go:130.50,130.100 1 0 +github.com/ethereum/go-ethereum/trie/database.go:156.35,157.38 1 1 +github.com/ethereum/go-ethereum/trie/database.go:160.2,160.28 1 1 +github.com/ethereum/go-ethereum/trie/database.go:157.38,159.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:165.49,166.38 1 1 +github.com/ethereum/go-ethereum/trie/database.go:169.2,169.36 1 1 +github.com/ethereum/go-ethereum/trie/database.go:166.38,168.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:175.64,176.32 1 1 +github.com/ethereum/go-ethereum/trie/database.go:179.2,179.36 1 1 +github.com/ethereum/go-ethereum/trie/database.go:176.32,178.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:179.36,181.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:186.64,187.23 1 1 +github.com/ethereum/go-ethereum/trie/database.go:188.21,189.36 1 1 +github.com/ethereum/go-ethereum/trie/database.go:190.19,191.27 1 1 +github.com/ethereum/go-ethereum/trie/database.go:194.16,195.33 1 1 +github.com/ethereum/go-ethereum/trie/database.go:196.31,196.31 0 1 +github.com/ethereum/go-ethereum/trie/database.go:197.10,198.49 1 0 +github.com/ethereum/go-ethereum/trie/database.go:191.27,193.4 1 1 +github.com/ethereum/go-ethereum/trie/database.go:204.32,205.23 1 1 +github.com/ethereum/go-ethereum/trie/database.go:206.18,208.61 1 1 +github.com/ethereum/go-ethereum/trie/database.go:210.17,213.34 2 1 +github.com/ethereum/go-ethereum/trie/database.go:218.3,218.14 1 1 +github.com/ethereum/go-ethereum/trie/database.go:220.36,221.11 1 1 +github.com/ethereum/go-ethereum/trie/database.go:223.10,224.49 1 0 +github.com/ethereum/go-ethereum/trie/database.go:213.34,214.22 1 1 +github.com/ethereum/go-ethereum/trie/database.go:214.22,216.5 1 1 +github.com/ethereum/go-ethereum/trie/database.go:230.45,231.23 1 1 +github.com/ethereum/go-ethereum/trie/database.go:232.21,240.4 1 1 +github.com/ethereum/go-ethereum/trie/database.go:242.19,249.43 2 1 +github.com/ethereum/go-ethereum/trie/database.go:254.3,254.14 1 1 +github.com/ethereum/go-ethereum/trie/database.go:256.27,257.11 1 1 +github.com/ethereum/go-ethereum/trie/database.go:259.10,260.49 1 0 +github.com/ethereum/go-ethereum/trie/database.go:249.43,250.19 1 1 +github.com/ethereum/go-ethereum/trie/database.go:250.19,252.5 1 1 +github.com/ethereum/go-ethereum/trie/database.go:274.56,276.2 1 1 +github.com/ethereum/go-ethereum/trie/database.go:281.82,283.39 2 1 +github.com/ethereum/go-ethereum/trie/database.go:290.2,297.39 2 1 +github.com/ethereum/go-ethereum/trie/database.go:300.2,300.11 1 1 +github.com/ethereum/go-ethereum/trie/database.go:283.39,284.27 1 0 +github.com/ethereum/go-ethereum/trie/database.go:284.27,286.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:286.9,288.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:297.39,299.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:304.50,306.2 1 0 +github.com/ethereum/go-ethereum/trie/database.go:312.67,314.35 1 1 +github.com/ethereum/go-ethereum/trie/database.go:317.2,325.42 3 1 +github.com/ethereum/go-ethereum/trie/database.go:330.2,333.34 2 1 +github.com/ethereum/go-ethereum/trie/database.go:338.2,338.70 1 1 +github.com/ethereum/go-ethereum/trie/database.go:314.35,316.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:325.42,326.39 1 1 +github.com/ethereum/go-ethereum/trie/database.go:326.39,328.4 1 1 +github.com/ethereum/go-ethereum/trie/database.go:333.34,335.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:335.8,337.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:346.71,348.25 1 1 +github.com/ethereum/go-ethereum/trie/database.go:352.2,352.37 1 1 +github.com/ethereum/go-ethereum/trie/database.go:355.2,356.75 2 1 +github.com/ethereum/go-ethereum/trie/database.go:348.25,350.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:352.37,354.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:361.49,363.22 1 1 +github.com/ethereum/go-ethereum/trie/database.go:371.2,375.18 4 1 +github.com/ethereum/go-ethereum/trie/database.go:380.2,384.30 3 1 +github.com/ethereum/go-ethereum/trie/database.go:387.2,387.22 1 1 +github.com/ethereum/go-ethereum/trie/database.go:392.2,392.37 1 1 +github.com/ethereum/go-ethereum/trie/database.go:363.22,364.53 1 0 +github.com/ethereum/go-ethereum/trie/database.go:364.53,368.4 3 0 +github.com/ethereum/go-ethereum/trie/database.go:375.18,379.3 3 1 +github.com/ethereum/go-ethereum/trie/database.go:384.30,386.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:387.22,391.3 3 0 +github.com/ethereum/go-ethereum/trie/database.go:397.60,399.29 1 1 +github.com/ethereum/go-ethereum/trie/database.go:403.2,403.22 1 1 +github.com/ethereum/go-ethereum/trie/database.go:411.2,415.18 4 1 +github.com/ethereum/go-ethereum/trie/database.go:420.2,424.19 3 1 +github.com/ethereum/go-ethereum/trie/database.go:432.2,432.37 1 0 +github.com/ethereum/go-ethereum/trie/database.go:399.29,401.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:403.22,404.53 1 0 +github.com/ethereum/go-ethereum/trie/database.go:404.53,408.4 3 0 +github.com/ethereum/go-ethereum/trie/database.go:415.18,419.3 3 1 +github.com/ethereum/go-ethereum/trie/database.go:424.19,425.23 1 1 +github.com/ethereum/go-ethereum/trie/database.go:430.3,430.18 1 1 +github.com/ethereum/go-ethereum/trie/database.go:425.23,429.4 3 0 +github.com/ethereum/go-ethereum/trie/database.go:437.55,439.25 1 0 +github.com/ethereum/go-ethereum/trie/database.go:443.2,447.21 4 0 +github.com/ethereum/go-ethereum/trie/database.go:450.2,450.44 1 0 +github.com/ethereum/go-ethereum/trie/database.go:439.25,441.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:447.21,449.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:456.43,461.31 4 1 +github.com/ethereum/go-ethereum/trie/database.go:466.2,466.15 1 1 +github.com/ethereum/go-ethereum/trie/database.go:461.31,462.30 1 1 +github.com/ethereum/go-ethereum/trie/database.go:462.30,464.4 1 1 +github.com/ethereum/go-ethereum/trie/database.go:473.70,478.2 3 0 +github.com/ethereum/go-ethereum/trie/database.go:481.70,484.9 2 0 +github.com/ethereum/go-ethereum/trie/database.go:488.2,488.40 1 0 +github.com/ethereum/go-ethereum/trie/database.go:494.2,496.45 3 0 +github.com/ethereum/go-ethereum/trie/database.go:484.9,486.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:488.40,491.3 2 0 +github.com/ethereum/go-ethereum/trie/database.go:491.8,491.88 1 0 +github.com/ethereum/go-ethereum/trie/database.go:491.88,493.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:496.45,498.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:502.51,504.29 1 0 +github.com/ethereum/go-ethereum/trie/database.go:508.2,523.125 11 0 +github.com/ethereum/go-ethereum/trie/database.go:504.29,507.3 2 0 +github.com/ethereum/go-ethereum/trie/database.go:527.72,531.54 2 0 +github.com/ethereum/go-ethereum/trie/database.go:539.2,540.9 2 0 +github.com/ethereum/go-ethereum/trie/database.go:544.2,544.22 1 0 +github.com/ethereum/go-ethereum/trie/database.go:551.2,551.23 1 0 +github.com/ethereum/go-ethereum/trie/database.go:531.54,533.32 2 0 +github.com/ethereum/go-ethereum/trie/database.go:533.32,536.4 2 0 +github.com/ethereum/go-ethereum/trie/database.go:540.9,542.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:544.22,550.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:551.23,553.16 1 0 +github.com/ethereum/go-ethereum/trie/database.go:565.3,565.41 1 0 +github.com/ethereum/go-ethereum/trie/database.go:568.3,570.27 3 0 +github.com/ethereum/go-ethereum/trie/database.go:554.18,556.56 2 0 +github.com/ethereum/go-ethereum/trie/database.go:557.18,559.56 2 0 +github.com/ethereum/go-ethereum/trie/database.go:560.11,562.57 2 0 +github.com/ethereum/go-ethereum/trie/database.go:565.41,567.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:570.27,572.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:581.57,598.20 6 1 +github.com/ethereum/go-ethereum/trie/database.go:612.2,613.48 2 1 +github.com/ethereum/go-ethereum/trie/database.go:636.2,636.38 1 1 +github.com/ethereum/go-ethereum/trie/database.go:641.2,644.20 3 1 +github.com/ethereum/go-ethereum/trie/database.go:651.2,651.26 1 1 +github.com/ethereum/go-ethereum/trie/database.go:661.2,661.34 1 1 +github.com/ethereum/go-ethereum/trie/database.go:664.2,675.12 8 1 +github.com/ethereum/go-ethereum/trie/database.go:598.20,599.26 1 0 +github.com/ethereum/go-ethereum/trie/database.go:599.26,601.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:601.9,603.48 2 0 +github.com/ethereum/go-ethereum/trie/database.go:603.48,604.41 1 0 +github.com/ethereum/go-ethereum/trie/database.go:607.5,607.18 1 0 +github.com/ethereum/go-ethereum/trie/database.go:604.41,606.6 1 0 +github.com/ethereum/go-ethereum/trie/database.go:613.48,619.48 3 1 +github.com/ethereum/go-ethereum/trie/database.go:629.3,630.27 2 1 +github.com/ethereum/go-ethereum/trie/database.go:633.3,633.26 1 1 +github.com/ethereum/go-ethereum/trie/database.go:619.48,620.40 1 1 +github.com/ethereum/go-ethereum/trie/database.go:624.4,624.17 1 1 +github.com/ethereum/go-ethereum/trie/database.go:620.40,623.5 2 0 +github.com/ethereum/go-ethereum/trie/database.go:630.27,632.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:636.38,639.3 2 0 +github.com/ethereum/go-ethereum/trie/database.go:644.20,645.26 1 0 +github.com/ethereum/go-ethereum/trie/database.go:645.26,647.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:647.9,649.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:651.26,657.27 5 1 +github.com/ethereum/go-ethereum/trie/database.go:657.27,659.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:661.34,663.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:684.93,693.25 3 1 +github.com/ethereum/go-ethereum/trie/database.go:703.2,706.67 3 1 +github.com/ethereum/go-ethereum/trie/database.go:711.2,711.38 1 1 +github.com/ethereum/go-ethereum/trie/database.go:716.2,723.25 5 1 +github.com/ethereum/go-ethereum/trie/database.go:726.2,731.13 5 1 +github.com/ethereum/go-ethereum/trie/database.go:734.2,741.12 4 1 +github.com/ethereum/go-ethereum/trie/database.go:693.25,697.39 2 1 +github.com/ethereum/go-ethereum/trie/database.go:700.3,700.16 1 1 +github.com/ethereum/go-ethereum/trie/database.go:697.39,699.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:706.67,709.3 2 0 +github.com/ethereum/go-ethereum/trie/database.go:711.38,714.3 2 0 +github.com/ethereum/go-ethereum/trie/database.go:723.25,725.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:731.13,733.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:745.118,748.9 2 1 +github.com/ethereum/go-ethereum/trie/database.go:751.2,752.41 2 1 +github.com/ethereum/go-ethereum/trie/database.go:757.2,757.16 1 1 +github.com/ethereum/go-ethereum/trie/database.go:761.2,762.21 2 1 +github.com/ethereum/go-ethereum/trie/database.go:765.2,765.47 1 1 +github.com/ethereum/go-ethereum/trie/database.go:774.2,774.12 1 1 +github.com/ethereum/go-ethereum/trie/database.go:748.9,750.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:752.41,753.17 1 1 +github.com/ethereum/go-ethereum/trie/database.go:753.17,755.4 1 1 +github.com/ethereum/go-ethereum/trie/database.go:757.16,759.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:762.21,764.3 1 1 +github.com/ethereum/go-ethereum/trie/database.go:765.47,766.39 1 0 +github.com/ethereum/go-ethereum/trie/database.go:769.3,772.19 4 0 +github.com/ethereum/go-ethereum/trie/database.go:766.39,768.4 1 0 +github.com/ethereum/go-ethereum/trie/database.go:788.53,793.9 3 1 +github.com/ethereum/go-ethereum/trie/database.go:797.2,797.14 1 1 +github.com/ethereum/go-ethereum/trie/database.go:809.2,811.26 3 1 +github.com/ethereum/go-ethereum/trie/database.go:815.2,815.24 1 1 +github.com/ethereum/go-ethereum/trie/database.go:819.2,819.12 1 1 +github.com/ethereum/go-ethereum/trie/database.go:793.9,795.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:798.19,800.57 2 1 +github.com/ethereum/go-ethereum/trie/database.go:801.19,803.57 2 0 +github.com/ethereum/go-ethereum/trie/database.go:804.10,806.58 2 0 +github.com/ethereum/go-ethereum/trie/database.go:811.26,813.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:815.24,818.3 2 0 +github.com/ethereum/go-ethereum/trie/database.go:822.44,823.26 1 0 +github.com/ethereum/go-ethereum/trie/database.go:828.69,838.2 5 0 +github.com/ethereum/go-ethereum/trie/database.go:842.62,843.22 1 0 +github.com/ethereum/go-ethereum/trie/database.go:846.2,850.16 4 0 +github.com/ethereum/go-ethereum/trie/database.go:854.2,855.12 2 0 +github.com/ethereum/go-ethereum/trie/database.go:843.22,845.3 1 0 +github.com/ethereum/go-ethereum/trie/database.go:850.16,853.3 2 0 +github.com/ethereum/go-ethereum/trie/database.go:860.49,862.2 1 0 +github.com/ethereum/go-ethereum/trie/database.go:866.103,870.6 3 0 +github.com/ethereum/go-ethereum/trie/database.go:870.6,871.10 1 0 +github.com/ethereum/go-ethereum/trie/database.go:872.19,873.24 1 0 +github.com/ethereum/go-ethereum/trie/database.go:874.17,875.10 1 0 +github.com/ethereum/go-ethereum/trie/encoding.go:37.38,39.18 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:43.2,45.21 3 1 +github.com/ethereum/go-ethereum/trie/encoding.go:50.2,51.12 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:39.18,42.3 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:45.21,49.3 3 1 +github.com/ethereum/go-ethereum/trie/encoding.go:56.42,62.39 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:66.2,71.19 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:76.2,76.41 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:79.2,80.15 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:62.39,65.3 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:71.19,75.3 3 1 +github.com/ethereum/go-ethereum/trie/encoding.go:76.41,78.3 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:83.42,84.23 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:87.2,89.17 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:93.2,94.20 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:84.23,86.3 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:89.17,91.3 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:97.39,100.24 3 1 +github.com/ethereum/go-ethereum/trie/encoding.go:104.2,105.16 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:100.24,103.3 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:110.39,111.18 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:114.2,114.21 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:117.2,119.12 3 1 +github.com/ethereum/go-ethereum/trie/encoding.go:111.18,113.3 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:114.21,115.47 1 0 +github.com/ethereum/go-ethereum/trie/encoding.go:122.50,123.61 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:123.61,125.3 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:129.33,131.21 2 1 +github.com/ethereum/go-ethereum/trie/encoding.go:134.2,134.24 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:139.2,139.10 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:131.21,133.3 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:134.24,135.19 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:135.19,136.9 1 1 +github.com/ethereum/go-ethereum/trie/encoding.go:143.29,145.2 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:38.26,44.3 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:47.39,51.2 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:53.36,55.2 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:59.70,61.39 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:65.2,65.23 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:61.39,63.3 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:66.18,71.38 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:76.3,76.24 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:77.17,80.38 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:85.3,85.24 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:86.10,88.14 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:71.38,73.4 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:73.9,75.4 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:80.38,82.4 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:82.9,84.4 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:95.85,103.22 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:107.2,107.26 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:104.29,105.51 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:110.92,114.16 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:139.2,139.26 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:114.16,117.27 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:129.3,129.12 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:117.27,118.19 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:118.19,120.45 2 1 +github.com/ethereum/go-ethereum/trie/hasher.go:125.5,126.14 2 1 +github.com/ethereum/go-ethereum/trie/hasher.go:120.45,122.6 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:122.11,124.6 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:130.8,131.27 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:131.27,132.44 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:132.44,134.5 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:134.10,136.5 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:146.65,150.29 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:153.2,153.24 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:150.29,152.3 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:158.63,162.29 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:165.2,165.24 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:162.29,164.3 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:178.40,182.2 3 1 +github.com/ethereum/go-ethereum/trie/hasher.go:185.49,191.2 5 1 +github.com/ethereum/go-ethereum/trie/hasher.go:197.68,198.30 1 1 +github.com/ethereum/go-ethereum/trie/hasher.go:199.18,201.42 2 1 +github.com/ethereum/go-ethereum/trie/hasher.go:202.17,204.41 2 1 +github.com/ethereum/go-ethereum/trie/hasher.go:205.10,207.14 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:40.45,44.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:47.33,48.27 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:55.2,58.14 4 1 +github.com/ethereum/go-ethereum/trie/iterator.go:48.27,49.23 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:49.23,53.4 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:63.38,65.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:152.35,154.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:156.61,157.30 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:163.2,165.11 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:157.30,162.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:168.68,170.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:172.44,173.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:176.2,176.39 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:173.24,175.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:179.46,180.24 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:183.2,183.41 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:180.24,182.3 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:186.37,188.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:190.42,191.23 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:196.2,196.22 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:191.23,192.62 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:192.62,194.4 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:199.43,200.23 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:205.2,205.22 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:200.23,201.65 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:201.65,203.4 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:208.46,209.23 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:225.2,225.22 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:209.23,210.62 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:210.62,215.52 4 1 +github.com/ethereum/go-ethereum/trie/iterator.go:222.4,222.17 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:215.52,218.49 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:218.49,220.6 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:228.39,230.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:232.43,233.34 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:236.2,237.16 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:241.2,241.13 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:233.34,235.3 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:237.16,240.3 2 0 +github.com/ethereum/go-ethereum/trie/iterator.go:244.39,245.30 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:248.2,248.40 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:251.2,251.15 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:245.30,247.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:248.40,250.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:258.49,259.30 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:262.2,262.40 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:268.2,270.19 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:273.2,274.13 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:259.30,261.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:262.40,263.48 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:263.48,265.4 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:270.19,272.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:277.51,282.6 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:282.6,284.28 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:291.3,291.36 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:284.28,286.4 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:286.9,286.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:286.24,288.4 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:288.9,288.43 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:288.43,290.4 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:296.60,299.23 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:302.2,302.38 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:299.23,301.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:306.86,308.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:312.2,312.14 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:318.2,318.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:334.2,334.38 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:308.24,311.3 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:312.14,315.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:318.24,321.34 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:324.3,325.9 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:332.3,332.11 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:321.34,323.4 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:325.9,326.50 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:329.4,329.42 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:326.50,328.5 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:339.92,341.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:345.2,345.40 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:351.2,351.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:367.2,367.38 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:341.24,344.3 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:345.40,348.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:351.24,354.34 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:357.3,358.9 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:365.3,365.11 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:354.34,356.4 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:358.9,359.50 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:362.4,362.42 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:359.50,361.5 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:370.79,371.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:378.2,379.22 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:371.24,372.70 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:372.70,373.59 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:373.59,375.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:382.81,383.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:388.2,388.40 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:383.24,384.70 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:384.70,386.4 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:391.75,392.40 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:400.2,400.12 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:392.40,394.17 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:397.3,398.37 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:394.17,396.4 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:403.115,409.41 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:425.2,425.25 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:409.41,410.31 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:410.31,423.4 6 1 +github.com/ethereum/go-ethereum/trie/iterator.go:428.119,429.36 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:451.2,451.31 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:430.17,432.100 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:436.18,438.23 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:432.100,435.4 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:438.23,449.4 4 1 +github.com/ethereum/go-ethereum/trie/iterator.go:456.133,457.33 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:497.2,497.31 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:458.17,461.19 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:466.3,466.36 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:471.3,471.7 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:482.18,484.23 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:461.19,464.4 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:466.36,469.4 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:471.7,475.61 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:480.4,480.55 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:475.61,478.5 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:484.23,495.4 4 1 +github.com/ethereum/go-ethereum/trie/iterator.go:500.87,503.24 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:503.24,505.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:508.31,513.2 4 1 +github.com/ethereum/go-ethereum/trie/iterator.go:515.42,516.56 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:519.2,519.27 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:524.2,524.72 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:527.2,527.26 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:530.2,530.10 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:516.56,518.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:519.27,521.3 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:521.8,521.34 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:521.34,523.3 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:524.72,526.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:527.26,529.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:542.68,549.2 3 1 +github.com/ethereum/go-ethereum/trie/iterator.go:551.50,553.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:555.52,557.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:559.43,561.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:563.48,565.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:567.49,569.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:571.52,573.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:575.45,577.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:579.49,581.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:583.74,584.26 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:587.47,591.22 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:594.2,596.12 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:601.2,601.6 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:591.22,593.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:596.12,599.3 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:601.6,602.35 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:603.11,605.24 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:609.4,609.14 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:610.10,612.15 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:613.10,616.27 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:619.4,620.27 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:624.4,624.14 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:605.24,608.5 2 0 +github.com/ethereum/go-ethereum/trie/iterator.go:616.27,618.5 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:620.27,623.5 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:629.45,630.37 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:633.2,633.21 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:630.37,632.3 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:638.48,638.65 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:639.48,639.87 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:640.48,640.75 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:641.48,641.85 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:642.46,647.2 4 1 +github.com/ethereum/go-ethereum/trie/iterator.go:657.66,664.2 5 1 +github.com/ethereum/go-ethereum/trie/iterator.go:666.45,668.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:670.47,672.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:674.38,676.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:678.43,680.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:682.44,684.2 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:686.47,688.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:690.40,692.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:694.44,696.2 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:698.69,699.26 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:716.50,717.25 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:722.2,726.141 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:735.2,735.25 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:739.2,739.27 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:717.25,719.3 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:726.141,729.52 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:729.52,733.4 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:735.25,738.3 2 1 +github.com/ethereum/go-ethereum/trie/iterator.go:742.40,743.38 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:748.2,748.12 1 1 +github.com/ethereum/go-ethereum/trie/iterator.go:743.38,744.48 1 0 +github.com/ethereum/go-ethereum/trie/iterator.go:744.48,746.4 1 0 +github.com/ethereum/go-ethereum/trie/node.go:55.49,59.2 3 0 +github.com/ethereum/go-ethereum/trie/node.go:61.39,61.67 2 1 +github.com/ethereum/go-ethereum/trie/node.go:62.39,62.67 2 1 +github.com/ethereum/go-ethereum/trie/node.go:70.46,70.84 1 1 +github.com/ethereum/go-ethereum/trie/node.go:71.46,71.84 1 1 +github.com/ethereum/go-ethereum/trie/node.go:72.46,72.66 1 1 +github.com/ethereum/go-ethereum/trie/node.go:73.46,73.66 1 1 +github.com/ethereum/go-ethereum/trie/node.go:76.37,76.61 1 0 +github.com/ethereum/go-ethereum/trie/node.go:77.37,77.61 1 0 +github.com/ethereum/go-ethereum/trie/node.go:78.37,78.61 1 0 +github.com/ethereum/go-ethereum/trie/node.go:79.37,79.61 1 0 +github.com/ethereum/go-ethereum/trie/node.go:81.47,83.35 2 0 +github.com/ethereum/go-ethereum/trie/node.go:90.2,90.42 1 0 +github.com/ethereum/go-ethereum/trie/node.go:83.35,84.18 1 0 +github.com/ethereum/go-ethereum/trie/node.go:84.18,86.4 1 0 +github.com/ethereum/go-ethereum/trie/node.go:86.9,88.4 1 0 +github.com/ethereum/go-ethereum/trie/node.go:92.48,94.2 1 0 +github.com/ethereum/go-ethereum/trie/node.go:95.46,97.2 1 0 +github.com/ethereum/go-ethereum/trie/node.go:98.47,100.2 1 0 +github.com/ethereum/go-ethereum/trie/node.go:102.44,104.16 2 1 +github.com/ethereum/go-ethereum/trie/node.go:107.2,107.10 1 1 +github.com/ethereum/go-ethereum/trie/node.go:104.16,105.47 1 0 +github.com/ethereum/go-ethereum/trie/node.go:111.49,112.19 1 1 +github.com/ethereum/go-ethereum/trie/node.go:115.2,116.16 2 1 +github.com/ethereum/go-ethereum/trie/node.go:119.2,119.43 1 1 +github.com/ethereum/go-ethereum/trie/node.go:112.19,114.3 1 0 +github.com/ethereum/go-ethereum/trie/node.go:116.16,118.3 1 1 +github.com/ethereum/go-ethereum/trie/node.go:120.9,122.36 2 1 +github.com/ethereum/go-ethereum/trie/node.go:123.10,125.35 2 1 +github.com/ethereum/go-ethereum/trie/node.go:126.10,127.67 1 1 +github.com/ethereum/go-ethereum/trie/node.go:131.52,133.16 2 1 +github.com/ethereum/go-ethereum/trie/node.go:136.2,138.18 3 1 +github.com/ethereum/go-ethereum/trie/node.go:146.2,147.16 2 1 +github.com/ethereum/go-ethereum/trie/node.go:150.2,150.38 1 1 +github.com/ethereum/go-ethereum/trie/node.go:133.16,135.3 1 1 +github.com/ethereum/go-ethereum/trie/node.go:138.18,141.17 2 1 +github.com/ethereum/go-ethereum/trie/node.go:144.3,144.65 1 1 +github.com/ethereum/go-ethereum/trie/node.go:141.17,143.4 1 1 +github.com/ethereum/go-ethereum/trie/node.go:147.16,149.3 1 1 +github.com/ethereum/go-ethereum/trie/node.go:153.56,155.26 2 1 +github.com/ethereum/go-ethereum/trie/node.go:162.2,163.16 2 1 +github.com/ethereum/go-ethereum/trie/node.go:166.2,166.18 1 1 +github.com/ethereum/go-ethereum/trie/node.go:169.2,169.15 1 1 +github.com/ethereum/go-ethereum/trie/node.go:155.26,157.17 2 1 +github.com/ethereum/go-ethereum/trie/node.go:160.3,160.35 1 1 +github.com/ethereum/go-ethereum/trie/node.go:157.17,159.4 1 1 +github.com/ethereum/go-ethereum/trie/node.go:163.16,165.3 1 0 +github.com/ethereum/go-ethereum/trie/node.go:166.18,168.3 1 1 +github.com/ethereum/go-ethereum/trie/node.go:174.50,176.16 2 1 +github.com/ethereum/go-ethereum/trie/node.go:179.2,179.9 1 1 +github.com/ethereum/go-ethereum/trie/node.go:176.16,178.3 1 0 +github.com/ethereum/go-ethereum/trie/node.go:180.24,183.51 1 1 +github.com/ethereum/go-ethereum/trie/node.go:187.3,188.22 2 1 +github.com/ethereum/go-ethereum/trie/node.go:189.43,191.24 1 1 +github.com/ethereum/go-ethereum/trie/node.go:192.44,193.47 1 1 +github.com/ethereum/go-ethereum/trie/node.go:194.10,195.85 1 1 +github.com/ethereum/go-ethereum/trie/node.go:183.51,186.4 2 1 +github.com/ethereum/go-ethereum/trie/node.go:206.45,207.16 1 1 +github.com/ethereum/go-ethereum/trie/node.go:210.2,210.42 1 1 +github.com/ethereum/go-ethereum/trie/node.go:214.2,214.41 1 1 +github.com/ethereum/go-ethereum/trie/node.go:207.16,209.3 1 1 +github.com/ethereum/go-ethereum/trie/node.go:210.42,213.3 2 1 +github.com/ethereum/go-ethereum/trie/node.go:217.40,219.2 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:56.69,57.15 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:60.2,61.16 2 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:64.2,64.38 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:57.15,58.52 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:61.16,63.3 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:69.45,71.16 2 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:74.2,74.12 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:71.16,73.3 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:80.57,82.2 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:86.67,88.2 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:92.82,95.16 3 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:98.2,98.51 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:101.2,102.12 2 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:95.16,97.3 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:98.51,100.3 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:111.48,112.48 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:112.48,114.3 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:125.57,128.16 3 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:131.2,132.12 2 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:128.16,130.3 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:136.41,137.41 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:137.41,139.3 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:144.50,148.2 3 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:152.51,153.55 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:156.2,156.55 1 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:153.55,155.3 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:164.76,166.33 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:177.2,177.30 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:166.33,167.33 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:174.3,174.42 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:167.33,169.39 2 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:172.4,172.27 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:169.39,171.5 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:182.41,184.2 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:187.41,190.2 2 0 +github.com/ethereum/go-ethereum/trie/secure_trie.go:194.62,196.2 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:201.49,208.2 6 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:213.57,214.29 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:218.2,218.22 1 1 +github.com/ethereum/go-ethereum/trie/secure_trie.go:214.29,217.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:42.87,57.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:60.39,61.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:63.2,63.39 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:61.20,62.3 0 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:68.34,69.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:88.2,88.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:69.24,70.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:71.30,73.28 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:80.4,81.31 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:84.22,85.17 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:73.28,74.37 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:74.37,78.6 3 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:81.31,83.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:91.30,92.21 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:96.2,97.22 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:92.21,95.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:100.39,101.25 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:106.2,106.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:120.2,120.68 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:129.2,129.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:101.25,103.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:106.22,111.32 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:114.3,116.14 3 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:111.32,113.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:120.68,122.24 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:122.24,126.4 3 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:132.30,135.9 3 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:136.17,136.17 0 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:137.25,137.25 0 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:141.56,144.22 3 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:166.2,166.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:169.2,169.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:144.22,148.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:148.8,148.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:148.24,154.79 4 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:158.3,158.104 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:154.79,157.4 2 0 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:159.8,159.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:159.22,162.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:166.22,168.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:184.78,187.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:190.46,191.25 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:194.2,194.33 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:191.25,193.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:198.39,200.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:204.2,204.26 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:220.2,220.13 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:200.24,202.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:204.26,205.26 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:210.3,210.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:214.3,214.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:218.3,218.36 1 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:205.26,209.4 3 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:210.23,212.12 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:214.27,216.12 2 1 +github.com/ethereum/go-ethereum/p2p/discover/lookup.go:224.35,226.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:42.51,47.2 4 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:49.77,50.32 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:53.2,57.34 5 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:60.2,60.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:50.32,52.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/node.go:57.34,59.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/node.go:63.34,65.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:67.36,69.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:71.42,73.23 2 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:76.2,76.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:73.23,75.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:79.38,81.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:83.44,85.23 2 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:88.2,88.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:85.23,87.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:91.36,93.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/node.go:95.32,97.2 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:40.44,40.61 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:41.44,41.66 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:42.44,42.71 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:46.24,48.16 2 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:51.2,51.55 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:48.16,50.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:51.55,54.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:54.8,56.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:65.57,68.16 2 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:74.2,79.38 4 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:112.2,115.37 3 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:118.2,118.49 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:68.16,70.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:79.38,82.17 2 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:85.3,88.47 3 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:92.3,95.44 3 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:98.3,109.49 6 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:82.17,84.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:88.47,90.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:95.44,97.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/ntp.go:115.37,117.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:102.99,114.56 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:117.2,117.29 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:122.2,125.17 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:114.56,116.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:117.29,121.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:128.38,130.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:132.30,139.2 5 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:143.62,144.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:147.2,151.33 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:157.2,157.34 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:161.2,161.25 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:144.23,146.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:151.33,152.31 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:152.31,154.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:157.34,160.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:165.52,170.30 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:175.2,175.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:170.30,171.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:171.19,173.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:179.27,182.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:187.63,188.26 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:193.2,194.12 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:188.26,189.46 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:189.46,191.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:198.37,199.9 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:200.22,201.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:202.10,203.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:207.45,209.9 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:214.2,214.13 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:210.30,210.30 0 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:211.22,212.14 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:218.26,235.6 6 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:267.2,267.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:270.2,270.29 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:273.2,273.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:276.2,276.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:235.6,236.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:237.20,239.26 2 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:243.32,245.26 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:249.22,250.31 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:253.4,253.35 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:254.23,256.39 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:257.25,259.24 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:260.22,261.26 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:262.23,263.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:239.26,242.5 2 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:245.26,248.5 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:250.31,252.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:267.24,269.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:270.29,272.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:273.27,275.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:281.49,298.25 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:298.25,300.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:303.35,306.23 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:306.23,308.42 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:309.3,310.24 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:308.42,308.110 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:316.54,317.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:319.2,320.17 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:326.2,329.28 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:338.2,341.16 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:350.2,350.41 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:317.15,317.37 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:320.17,323.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:329.28,331.17 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:331.17,333.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:333.9,335.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:341.16,347.3 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:350.41,352.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:352.8,354.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:358.56,362.52 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:369.2,369.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:362.52,364.25 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:364.25,367.4 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:372.54,377.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:381.35,386.33 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:386.33,387.31 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:387.31,388.70 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:388.70,390.5 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:402.97,411.33 5 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:420.2,420.46 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:423.2,423.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:411.33,412.31 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:412.31,414.42 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:414.42,416.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:420.46,422.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:427.33,431.33 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:434.2,434.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:431.33,433.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:438.46,443.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:446.47,449.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:451.51,452.28 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:455.2,455.43 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:452.28,454.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:463.40,464.31 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:468.2,471.33 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:475.2,475.34 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:480.2,480.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:485.2,488.30 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:464.31,466.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:471.33,474.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:475.34,479.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:480.27,483.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:488.30,490.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:502.44,503.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:506.2,506.31 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:510.2,513.28 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:517.2,517.34 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:522.2,522.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:527.2,530.30 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:503.23,505.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:506.31,508.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:513.28,516.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:517.34,521.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:522.27,525.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:530.30,532.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:536.38,541.2 3 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:543.52,544.18 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:547.2,547.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:550.2,550.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:554.2,554.20 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:559.2,559.13 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:544.18,546.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:547.23,549.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:550.22,553.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:554.20,558.3 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:562.50,563.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:566.2,567.18 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:563.23,565.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:570.54,571.35 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:576.2,576.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:579.2,581.20 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:571.35,572.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:572.23,574.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:576.27,578.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:581.20,583.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:589.56,590.74 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:595.2,595.30 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:599.2,603.10 5 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:590.74,593.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:595.30,598.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:608.57,609.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:626.2,626.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:609.27,610.34 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:610.34,611.40 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:621.4,623.15 3 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:611.40,614.30 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:614.30,618.6 2 0 +github.com/ethereum/go-ethereum/p2p/discover/table.go:629.54,632.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:634.45,635.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:640.2,640.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:635.23,636.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:636.19,638.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:644.64,645.21 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:648.2,651.22 4 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:645.21,647.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:655.48,656.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:661.2,661.13 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:656.22,657.29 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:657.29,659.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:671.55,672.53 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:675.2,675.31 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:678.2,678.26 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:672.53,674.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:675.31,677.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:678.27,681.3 0 1 +github.com/ethereum/go-ethereum/p2p/discover/table.go:681.8,686.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:129.75,146.16 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:149.2,155.15 6 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:146.16,148.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:159.36,161.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:164.25,165.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:165.24,170.3 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:175.52,177.44 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:181.2,181.81 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:188.2,189.25 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:192.2,193.28 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:200.2,200.10 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:177.44,179.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:181.81,183.45 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:183.45,185.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:189.25,191.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:193.28,194.24 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:194.24,195.47 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:195.47,197.5 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:203.47,207.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:210.43,213.2 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:216.61,218.33 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:221.2,221.17 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:218.33,220.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:226.93,229.16 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:236.2,236.109 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:244.2,246.11 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:229.16,233.3 3 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:236.109,238.33 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:241.3,241.26 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:238.33,240.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:249.60,257.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:260.66,261.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:266.2,266.57 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:261.22,265.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:270.46,272.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:275.46,277.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:280.44,282.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:284.62,288.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:290.77,293.69 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:296.2,296.11 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:293.69,295.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:301.101,308.114 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:321.2,331.42 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:334.2,334.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:308.114,310.34 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:319.3,319.39 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:310.34,313.18 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:317.4,317.28 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:313.18,315.13 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:331.42,333.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:338.64,346.16 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:352.2,352.116 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:357.2,358.34 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:362.2,363.16 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:366.2,366.26 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:369.2,369.27 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:372.2,372.66 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:375.2,375.19 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:346.16,348.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:352.116,355.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:358.34,360.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:363.16,365.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:366.26,368.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:369.27,371.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:372.66,374.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:380.100,383.9 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:389.2,389.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:384.30,384.30 0 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:386.27,387.18 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:394.83,396.9 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:397.55,399.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:400.27,401.15 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:407.24,420.25 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:442.2,442.6 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:420.25,421.65 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:425.3,426.54 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:438.3,439.17 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:421.65,423.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:426.54,428.67 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:435.4,436.20 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:428.67,431.5 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:442.6,445.10 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:446.28,447.55 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:450.4,450.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:452.33,454.21 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:456.26,458.55 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:473.4,473.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:475.27,479.55 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:488.4,488.42 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:447.55,449.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:458.55,460.73 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:460.73,465.21 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:470.6,470.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:465.21,468.7 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:479.55,481.55 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:481.55,485.6 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:488.42,489.54 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:493.5,493.21 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:489.54,492.6 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:499.93,501.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:504.2,504.56 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:501.16,503.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:507.93,511.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:514.55,516.22 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:520.2,521.6 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:516.22,518.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:521.6,523.36 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:534.3,534.68 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:523.36,526.12 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:527.9,527.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:527.24,529.21 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:532.4,532.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:529.21,531.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:534.68,535.11 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:536.53,536.53 0 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:537.12,537.12 0 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:543.67,545.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:549.2,551.43 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:554.2,555.40 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:558.2,558.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:545.16,548.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:551.43,553.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:555.40,557.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:562.56,564.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:568.64,570.69 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:570.69,575.3 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:578.81,579.20 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:582.2,582.63 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:585.2,585.60 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:588.2,589.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:592.2,594.15 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:579.20,581.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:582.63,584.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:585.60,587.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:589.16,591.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:597.37,600.57 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:603.2,603.86 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:600.57,602.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:607.62,610.18 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:627.2,627.11 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:611.20,613.26 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:614.20,615.29 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:616.24,618.30 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:619.25,620.34 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:621.26,623.32 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:624.27,625.36 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:643.113,647.16 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:650.2,650.36 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:653.2,654.12 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:647.16,649.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:650.36,652.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:657.96,670.73 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:679.2,680.92 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:670.73,671.35 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:671.35,673.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:674.8,676.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:685.113,688.36 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:691.2,691.42 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:694.2,696.12 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:688.36,690.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:691.42,693.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:701.117,704.36 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:707.2,707.35 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:716.2,716.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:704.36,706.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:707.35,715.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:719.100,730.28 6 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:740.2,740.31 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:730.28,731.51 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:734.3,734.42 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:731.51,733.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:734.42,738.4 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:740.31,742.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:747.118,750.36 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:753.2,753.47 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:756.2,756.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:750.36,752.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:753.47,755.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:761.119,764.36 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:767.2,767.35 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:770.2,770.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:764.36,766.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:767.35,769.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:773.102,778.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:782.120,783.47 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:786.2,786.12 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:783.47,785.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:125.78,127.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:130.2,134.15 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:127.16,129.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:138.78,168.16 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:171.2,172.15 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:168.16,170.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:176.36,178.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:181.25,182.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:182.24,187.3 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:191.43,194.2 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:198.52,199.81 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:203.2,203.46 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:207.2,208.28 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:213.2,213.10 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:199.81,201.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:203.46,205.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:208.28,209.46 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:209.46,211.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:217.42,222.35 4 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:227.2,227.14 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:222.35,223.31 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:223.31,225.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:232.46,234.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:239.82,243.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:246.93,250.9 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:251.28,252.53 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:253.25,254.18 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:259.46,260.22 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:266.2,266.57 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:260.22,264.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:271.55,273.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:277.46,279.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:283.44,285.2 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:287.62,291.2 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:293.73,294.70 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:294.70,296.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:300.80,308.22 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:311.2,311.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:316.2,316.27 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:308.22,310.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:311.22,312.30 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:312.30,314.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:322.60,325.51 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:333.2,333.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:325.51,326.17 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:329.3,329.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:326.17,328.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:329.15,331.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:337.53,342.9 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:343.25,344.41 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:345.25,346.16 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:351.64,353.16 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:356.2,356.21 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:359.2,359.22 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:353.16,355.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:356.21,358.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:363.82,366.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:369.82,377.6 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:377.6,378.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:379.28,381.42 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:389.4,389.19 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:392.4,392.37 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:395.23,396.21 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:381.42,383.19 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:387.5,387.32 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:383.19,385.14 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:389.19,391.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:392.37,394.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:402.129,404.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:407.2,407.69 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:410.2,410.26 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:413.2,413.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:419.2,419.34 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:422.2,423.18 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:404.16,406.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:407.69,409.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:410.26,412.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:413.22,415.41 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:415.41,417.4 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:419.34,421.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:426.43,427.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:432.2,432.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:427.23,428.13 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:428.13,430.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:437.89,450.9 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:455.2,455.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:451.21,451.21 0 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:452.27,453.21 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:459.37,463.6 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:463.6,464.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:465.15,465.15 0 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:467.16,467.16 0 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:469.26,470.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:471.28,472.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:488.28,494.6 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:494.6,495.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:496.24,499.22 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:501.32,503.52 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:507.28,510.19 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:513.4,516.22 4 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:518.28,521.30 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:523.28,525.39 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:531.4,531.42 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:536.4,536.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:503.52,505.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:510.19,511.45 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:525.39,526.29 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:529.5,529.28 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:526.29,528.6 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:531.42,535.5 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:542.49,543.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:546.2,550.50 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:557.2,558.13 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:543.22,545.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:550.50,552.10 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:553.50,553.50 0 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:554.28,554.28 0 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:562.43,564.54 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:567.2,569.21 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:564.54,566.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:569.21,571.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:571.8,574.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:579.37,582.33 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:586.2,590.27 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:582.33,584.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:595.94,598.2 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:601.123,604.16 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:608.2,610.19 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:604.16,607.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:614.28,618.25 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:618.25,620.36 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:631.3,631.43 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:620.36,623.12 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:624.9,624.24 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:624.24,626.21 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:629.4,629.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:626.21,628.5 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:636.76,637.9 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:638.49,639.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:640.27,641.15 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:646.77,649.16 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:653.2,653.21 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:657.2,657.45 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:661.2,662.12 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:649.16,652.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:653.21,656.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:657.45,660.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:666.98,668.56 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:672.2,672.72 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:676.2,676.33 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:680.2,682.13 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:668.56,671.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:672.72,675.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:676.33,679.3 2 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:686.50,687.38 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:690.2,690.52 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:693.2,693.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:687.38,689.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:690.52,692.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:697.81,698.23 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:699.23,700.39 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:701.25,702.41 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:703.20,704.36 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:705.20,706.48 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:709.24,710.40 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:711.21,712.44 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:713.27,714.43 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:715.28,716.44 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:706.48,708.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:721.90,724.38 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:728.2,728.45 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:724.38,727.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:737.94,739.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:745.2,749.15 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:739.16,742.3 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:753.85,755.14 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:758.2,758.26 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:761.2,761.15 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:755.14,757.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:758.26,760.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:765.84,770.27 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:773.2,778.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:770.27,772.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:782.92,784.49 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:784.49,786.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:790.90,793.33 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:823.2,823.14 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:793.33,796.25 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:801.3,802.16 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:809.3,812.24 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:796.25,797.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:802.16,804.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:804.9,804.25 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:804.25,808.4 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:812.24,814.48 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:817.4,818.27 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:814.48,815.13 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:818.27,820.5 1 0 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:827.67,828.21 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:832.2,834.21 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:843.2,843.13 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:828.21,830.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:834.21,837.30 3 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:840.3,841.25 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:837.30,839.4 1 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:847.98,853.20 5 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:856.2,857.40 2 1 +github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:853.20,855.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:52.41,53.20 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:56.2,56.29 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:59.2,59.22 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:62.2,62.12 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:53.20,55.3 1 0 +github.com/ethereum/go-ethereum/p2p/discover/common.go:56.29,58.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:59.22,61.3 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:66.76,68.2 1 0 +github.com/ethereum/go-ethereum/p2p/discover/common.go:77.24,78.11 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:81.2,81.10 1 1 +github.com/ethereum/go-ethereum/p2p/discover/common.go:78.11,80.3 1 1 +github.com/ethereum/go-ethereum/rpc/ipc_unix.go:33.55,34.40 1 1 +github.com/ethereum/go-ethereum/rpc/ipc_unix.go:40.2,40.66 1 1 +github.com/ethereum/go-ethereum/rpc/ipc_unix.go:43.2,45.16 3 1 +github.com/ethereum/go-ethereum/rpc/ipc_unix.go:48.2,49.15 2 1 +github.com/ethereum/go-ethereum/rpc/ipc_unix.go:34.40,37.3 1 0 +github.com/ethereum/go-ethereum/rpc/ipc_unix.go:40.66,42.3 1 0 +github.com/ethereum/go-ethereum/rpc/ipc_unix.go:45.16,47.3 1 0 +github.com/ethereum/go-ethereum/rpc/ipc_unix.go:53.79,55.2 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:50.73,57.71 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:57.71,59.17 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:63.3,64.25 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:59.17,62.4 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:71.77,75.40 3 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:84.2,84.33 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:90.2,92.36 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:109.2,109.10 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:75.40,76.20 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:79.3,79.19 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:76.20,78.4 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:79.19,81.4 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:84.33,86.49 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:86.49,88.4 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:92.36,97.41 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:101.3,102.58 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:105.3,106.15 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:97.41,99.4 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:102.58,104.4 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:117.42,119.20 2 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:122.2,122.10 1 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:119.20,121.3 1 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:125.76,127.27 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:132.2,132.14 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:127.27,128.55 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:128.55,130.4 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:135.72,142.16 3 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:146.2,147.16 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:151.2,151.59 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:154.2,154.65 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:157.2,157.53 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:160.2,160.13 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:142.16,145.3 2 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:147.16,150.3 2 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:151.59,153.3 1 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:154.65,156.3 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:157.53,159.3 1 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:163.68,165.16 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:168.2,169.37 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:181.2,181.36 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:165.16,167.3 1 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:169.37,173.3 3 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:173.8,177.21 4 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:177.21,179.4 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:186.118,188.16 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:191.2,191.71 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:188.16,190.3 1 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:191.71,193.17 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:200.3,200.56 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:193.17,195.19 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:198.4,198.20 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:195.19,197.5 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:209.83,216.2 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:218.76,220.16 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:223.2,224.18 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:227.2,227.29 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:232.2,232.42 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:220.16,222.3 1 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:224.18,226.3 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:227.29,231.3 3 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:244.88,246.49 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:250.2,266.11 7 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:246.49,249.3 2 0 +github.com/ethereum/go-ethereum/rpc/websocket.go:269.35,272.2 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:274.47,276.2 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:278.79,280.16 2 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:287.2,287.12 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:280.16,282.10 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:283.35,283.35 0 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:284.11,284.11 0 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:291.38,296.6 4 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:296.6,297.10 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:298.22,299.10 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:300.23,301.21 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:304.4,304.31 1 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:305.18,311.31 6 1 +github.com/ethereum/go-ethereum/rpc/websocket.go:301.21,303.5 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:111.62,117.2 5 1 +github.com/ethereum/go-ethereum/rpc/client.go:119.64,122.2 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:136.84,137.9 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:138.20,140.16 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:146.3,146.24 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:147.25,148.22 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:140.16,141.11 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:142.28,142.28 0 1 +github.com/ethereum/go-ethereum/rpc/client.go:143.21,143.21 0 0 +github.com/ethereum/go-ethereum/rpc/client.go:162.43,164.2 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:170.71,172.16 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:175.2,175.18 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:172.16,174.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:176.23,177.26 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:178.19,179.40 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:180.15,181.24 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:182.10,183.30 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:184.10,185.75 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:191.61,194.2 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:196.81,198.16 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:201.2,203.15 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:198.16,200.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:206.87,223.13 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:226.2,226.10 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:223.13,225.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:233.72,235.2 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:237.43,240.2 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:244.64,250.2 5 1 +github.com/ethereum/go-ethereum/rpc/client.go:253.26,254.14 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:257.2,257.9 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:254.14,256.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:258.29,259.15 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:260.20,260.20 0 1 +github.com/ethereum/go-ethereum/rpc/client.go:267.47,268.15 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:271.2,274.18 4 1 +github.com/ethereum/go-ethereum/rpc/client.go:268.15,270.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:282.85,285.2 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:292.113,293.67 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:296.2,297.16 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:300.2,302.14 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:307.2,307.16 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:312.2,312.39 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:293.67,295.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:297.16,299.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:302.14,304.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:304.8,306.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:307.16,309.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:313.18,314.13 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:315.25,316.20 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:317.29,318.21 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:319.10,320.46 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:331.49,334.2 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:345.77,354.25 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:364.2,365.14 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:372.2,372.44 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:392.2,392.12 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:354.25,356.17 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:359.3,361.27 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:356.17,358.4 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:365.14,367.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:367.8,369.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:372.44,375.17 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:381.3,382.24 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:386.3,386.28 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:390.3,390.56 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:375.17,376.9 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:382.24,384.12 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:386.28,388.12 2 0 +github.com/ethereum/go-ethereum/rpc/client.go:396.88,399.16 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:402.2,404.14 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:407.2,407.29 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:399.16,401.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:404.14,406.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:411.123,413.2 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:417.123,419.2 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:433.138,436.85 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:439.2,439.21 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:442.2,442.14 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:446.2,447.16 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:450.2,458.45 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:461.2,461.43 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:464.2,464.20 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:436.85,437.98 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:439.21,440.54 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:442.14,444.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:447.16,449.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:458.45,460.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:461.43,463.3 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:467.94,469.21 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:475.2,475.17 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:469.21,471.59 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:471.59,473.4 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:480.82,481.9 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:482.23,485.13 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:486.20,489.19 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:490.19,491.23 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:495.80,496.24 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:502.2,503.16 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:509.2,509.12 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:496.24,498.42 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:498.42,500.4 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:503.16,505.13 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:505.13,507.4 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:512.55,513.28 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:517.2,517.34 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:522.2,523.16 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:527.2,527.9 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:513.28,515.3 1 0 +github.com/ethereum/go-ethereum/rpc/client.go:517.34,521.3 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:523.16,526.3 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:528.32,530.13 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:531.20,533.23 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:540.46,547.15 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:557.2,559.6 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:547.15,549.14 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:553.3,553.20 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:549.14,552.4 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:559.6,560.10 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:561.18,562.10 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:565.25,566.16 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:572.27,575.19 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:578.36,580.15 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:589.4,594.37 4 1 +github.com/ethereum/go-ethereum/rpc/client.go:597.28,601.33 3 1 +github.com/ethereum/go-ethereum/rpc/client.go:603.27,604.18 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:610.4,611.16 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:613.29,614.36 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:566.16,568.5 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:568.10,570.5 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:580.15,588.5 2 0 +github.com/ethereum/go-ethereum/rpc/client.go:604.18,608.5 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:620.30,621.6 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:621.6,622.10 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:623.19,623.19 0 1 +github.com/ethereum/go-ethereum/rpc/client.go:624.20,625.10 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:631.42,632.6 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:632.6,634.43 2 1 +github.com/ethereum/go-ethereum/rpc/client.go:637.3,637.17 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:641.3,641.34 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:634.43,636.4 1 1 +github.com/ethereum/go-ethereum/rpc/client.go:637.17,640.4 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:74.107,88.29 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:91.2,92.10 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:88.29,90.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:96.55,98.20 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:106.2,107.27 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:112.2,112.21 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:116.2,116.37 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:98.20,99.38 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:102.3,102.9 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:99.38,101.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:107.27,108.50 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:108.50,110.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:112.21,114.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:116.37,118.29 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:123.3,124.23 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:127.3,127.34 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:118.29,119.57 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:119.57,121.5 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:124.23,126.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:127.34,129.4 1 0 +github.com/ethereum/go-ethereum/rpc/handler.go:134.50,135.38 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:138.2,138.37 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:135.38,137.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:138.37,141.20 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:144.3,144.34 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:141.20,143.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:144.34,146.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:152.60,157.2 4 1 +github.com/ethereum/go-ethereum/rpc/handler.go:160.47,161.28 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:161.28,163.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:167.50,168.28 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:168.28,170.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:174.72,176.24 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:180.2,180.33 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:190.2,190.36 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:176.24,178.3 1 0 +github.com/ethereum/go-ethereum/rpc/handler.go:180.33,184.20 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:184.20,188.4 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:190.36,193.3 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:196.52,200.23 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:200.23,201.46 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:201.46,203.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:208.56,212.34 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:212.34,216.3 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:220.53,222.12 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:222.12,227.3 4 1 +github.com/ethereum/go-ethereum/rpc/handler.go:232.61,234.9 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:235.28,236.62 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:240.3,240.15 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:241.24,244.14 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:245.10,246.15 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:236.62,239.4 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:251.65,253.60 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:257.2,257.36 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:253.60,256.3 2 0 +github.com/ethereum/go-ethereum/rpc/handler.go:257.36,259.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:263.55,265.15 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:269.2,271.19 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:278.2,279.22 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:283.2,283.71 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:265.15,268.3 2 0 +github.com/ethereum/go-ethereum/rpc/handler.go:271.19,274.3 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:279.22,282.3 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:283.71,286.3 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:290.85,292.9 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:293.28,296.13 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:297.20,301.24 4 1 +github.com/ethereum/go-ethereum/rpc/handler.go:310.3,310.14 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:311.24,312.68 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:313.10,314.63 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:301.24,303.30 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:306.4,306.44 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:303.30,305.5 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:307.9,309.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:319.81,320.23 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:323.2,324.25 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:329.2,329.18 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:332.2,333.16 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:336.2,341.30 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:351.2,351.15 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:320.23,322.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:324.25,326.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:326.8,328.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:329.18,331.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:333.16,335.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:341.30,343.26 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:348.3,349.73 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:343.26,345.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:345.9,347.4 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:355.86,356.23 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:361.2,362.16 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:365.2,367.18 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:372.2,374.16 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:377.2,384.43 5 1 +github.com/ethereum/go-ethereum/rpc/handler.go:356.23,358.3 1 0 +github.com/ethereum/go-ethereum/rpc/handler.go:362.16,364.3 1 0 +github.com/ethereum/go-ethereum/rpc/handler.go:367.18,369.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:374.16,376.3 1 0 +github.com/ethereum/go-ethereum/rpc/handler.go:388.126,390.16 2 1 +github.com/ethereum/go-ethereum/rpc/handler.go:393.2,393.29 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:390.16,392.3 1 1 +github.com/ethereum/go-ethereum/rpc/handler.go:397.73,402.14 4 1 +github.com/ethereum/go-ethereum/rpc/handler.go:405.2,407.18 3 1 +github.com/ethereum/go-ethereum/rpc/handler.go:402.14,404.3 1 0 +github.com/ethereum/go-ethereum/rpc/handler.go:412.36,413.66 1 0 +github.com/ethereum/go-ethereum/rpc/handler.go:416.2,416.30 1 0 +github.com/ethereum/go-ethereum/rpc/handler.go:413.66,415.3 1 0 +github.com/ethereum/go-ethereum/rpc/ipc.go:28.54,29.6 1 1 +github.com/ethereum/go-ethereum/rpc/ipc.go:29.6,31.36 2 1 +github.com/ethereum/go-ethereum/rpc/ipc.go:37.3,38.37 2 1 +github.com/ethereum/go-ethereum/rpc/ipc.go:31.36,33.12 2 0 +github.com/ethereum/go-ethereum/rpc/ipc.go:34.9,34.24 1 1 +github.com/ethereum/go-ethereum/rpc/ipc.go:34.24,36.4 1 1 +github.com/ethereum/go-ethereum/rpc/ipc.go:48.69,49.71 1 1 +github.com/ethereum/go-ethereum/rpc/ipc.go:49.71,51.17 2 1 +github.com/ethereum/go-ethereum/rpc/ipc.go:54.3,54.29 1 1 +github.com/ethereum/go-ethereum/rpc/ipc.go:51.17,53.4 1 0 +github.com/ethereum/go-ethereum/rpc/service.go:61.77,63.16 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:66.2,67.25 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:71.2,73.23 3 1 +github.com/ethereum/go-ethereum/rpc/service.go:76.2,77.9 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:85.2,85.34 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:92.2,92.12 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:63.16,65.3 1 0 +github.com/ethereum/go-ethereum/rpc/service.go:67.25,69.3 1 0 +github.com/ethereum/go-ethereum/rpc/service.go:73.23,75.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:77.9,84.3 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:85.34,86.21 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:86.21,88.4 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:88.9,90.4 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:96.61,98.20 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:101.2,103.47 3 1 +github.com/ethereum/go-ethereum/rpc/service.go:98.20,100.3 1 0 +github.com/ethereum/go-ethereum/rpc/service.go:107.72,111.2 3 1 +github.com/ethereum/go-ethereum/rpc/service.go:116.69,119.39 3 1 +github.com/ethereum/go-ethereum/rpc/service.go:131.2,131.18 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:119.39,121.27 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:124.3,125.16 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:128.3,129.23 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:121.27,122.12 1 0 +github.com/ethereum/go-ethereum/rpc/service.go:125.16,126.12 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:136.56,145.39 5 1 +github.com/ethereum/go-ethereum/rpc/service.go:148.2,148.19 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:152.2,152.9 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:161.2,161.10 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:145.39,147.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:148.19,150.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:153.46,154.15 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:155.22,156.52 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:159.3,159.15 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:156.52,158.4 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:165.35,169.22 3 1 +github.com/ethereum/go-ethereum/rpc/service.go:172.2,172.69 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:177.2,178.45 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:169.22,171.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:172.69,175.3 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:178.45,180.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:184.115,187.22 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:190.2,190.14 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:193.2,196.15 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:206.2,207.23 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:210.2,210.49 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:215.2,215.36 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:187.22,189.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:190.14,192.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:196.15,197.35 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:197.35,203.4 5 0 +github.com/ethereum/go-ethereum/rpc/service.go:207.23,209.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:210.49,214.3 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:219.41,220.30 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:223.2,223.25 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:220.30,222.3 1 0 +github.com/ethereum/go-ethereum/rpc/service.go:227.39,228.30 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:231.2,231.32 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:228.30,230.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:235.46,236.30 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:239.2,239.30 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:236.30,238.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:244.45,246.56 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:249.2,251.33 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:246.56,248.3 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:255.37,257.18 2 1 +github.com/ethereum/go-ethereum/rpc/service.go:260.2,260.20 1 1 +github.com/ethereum/go-ethereum/rpc/service.go:257.18,259.3 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:47.17,49.2 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:52.36,55.43 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:61.2,65.19 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:55.43,57.3 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:57.8,59.3 1 0 +github.com/ethereum/go-ethereum/rpc/subscription.go:65.19,71.3 5 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:74.28,77.14 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:80.2,80.22 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:77.14,79.3 1 0 +github.com/ethereum/go-ethereum/rpc/subscription.go:86.65,89.2 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:108.55,112.18 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:117.2,118.14 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:112.18,113.61 1 0 +github.com/ethereum/go-ethereum/rpc/subscription.go:114.8,114.27 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:114.27,115.71 1 0 +github.com/ethereum/go-ethereum/rpc/subscription.go:123.58,125.16 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:129.2,132.18 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:137.2,137.17 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:140.2,141.12 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:125.16,127.3 1 0 +github.com/ethereum/go-ethereum/rpc/subscription.go:132.18,133.55 1 0 +github.com/ethereum/go-ethereum/rpc/subscription.go:134.8,134.27 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:134.27,135.32 1 0 +github.com/ethereum/go-ethereum/rpc/subscription.go:137.17,139.3 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:146.48,148.2 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:152.53,157.2 4 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:162.37,166.32 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:171.2,172.12 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:166.32,167.45 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:167.45,169.4 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:175.72,183.2 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:194.43,196.2 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:199.54,201.2 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:231.100,244.2 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:254.51,256.2 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:260.46,261.24 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:261.24,262.10 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:267.3,267.17 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:263.36,264.19 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:265.24,265.24 0 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:272.74,273.9 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:274.24,275.14 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:276.25,277.15 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:282.49,283.9 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:284.23,284.23 0 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:285.25,285.25 0 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:291.38,301.17 4 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:306.2,306.16 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:301.17,303.3 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:306.16,307.27 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:312.3,312.17 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:307.27,311.4 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:318.78,326.6 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:326.6,329.24 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:338.3,338.17 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:329.24,332.4 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:332.9,336.4 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:339.10,340.21 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:343.4,343.30 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:347.4,347.21 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:349.10,351.18 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:354.4,354.51 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:357.4,357.24 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:359.10,361.33 2 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:340.21,342.5 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:343.30,346.5 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:351.18,353.5 1 0 +github.com/ethereum/go-ethereum/rpc/subscription.go:354.51,356.5 1 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:366.87,370.2 3 1 +github.com/ethereum/go-ethereum/rpc/subscription.go:372.59,375.2 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:60.50,62.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:64.42,66.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:68.46,70.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:72.46,74.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:76.47,78.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:80.49,82.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:84.47,87.2 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:89.44,92.2 2 0 +github.com/ethereum/go-ethereum/rpc/json.go:94.69,98.2 3 1 +github.com/ethereum/go-ethereum/rpc/json.go:100.73,102.16 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:106.2,106.63 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:102.16,105.3 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:109.46,115.8 3 1 +github.com/ethereum/go-ethereum/rpc/json.go:118.2,119.8 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:122.2,122.12 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:115.8,117.3 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:119.8,121.3 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:131.38,132.23 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:135.2,135.20 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:132.23,134.3 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:138.39,140.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:142.47,144.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:179.94,186.41 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:189.2,189.14 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:186.41,188.3 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:194.38,199.2 4 1 +github.com/ethereum/go-ethereum/rpc/json.go:201.41,204.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:206.41,208.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:210.85,214.42 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:217.2,218.31 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:225.2,225.29 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:214.42,216.3 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:218.31,219.17 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:219.17,223.4 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:228.73,233.9 4 1 +github.com/ethereum/go-ethereum/rpc/json.go:236.2,237.20 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:233.9,235.3 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:240.29,241.21 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:241.21,244.3 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:248.49,250.2 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:256.66,257.19 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:262.2,265.17 4 1 +github.com/ethereum/go-ethereum/rpc/json.go:269.2,269.19 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:257.19,261.3 3 1 +github.com/ethereum/go-ethereum/rpc/json.go:265.17,268.3 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:273.40,274.24 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:281.2,281.14 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:274.24,276.55 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:279.3,279.18 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:276.55,277.12 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:287.103,291.9 4 1 +github.com/ethereum/go-ethereum/rpc/json.go:306.2,306.42 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:312.2,312.18 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:292.49,292.49 0 1 +github.com/ethereum/go-ethereum/rpc/json.go:295.18,296.18 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:297.30,299.61 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:302.10,303.43 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:299.61,301.4 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:306.42,307.37 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:310.3,310.46 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:307.37,309.4 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:315.91,317.30 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:331.2,332.18 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:317.30,318.22 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:321.3,322.56 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:325.3,325.55 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:328.3,328.37 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:318.22,320.4 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:322.56,324.4 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:325.55,327.4 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:336.69,338.51 2 1 +github.com/ethereum/go-ethereum/rpc/json.go:341.2,343.9 3 1 +github.com/ethereum/go-ethereum/rpc/json.go:346.2,346.20 1 1 +github.com/ethereum/go-ethereum/rpc/json.go:338.51,340.3 1 0 +github.com/ethereum/go-ethereum/rpc/json.go:343.9,345.3 1 0 +github.com/ethereum/go-ethereum/rpc/errors.go:29.37,30.24 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:33.2,33.52 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:30.24,32.3 1 0 +github.com/ethereum/go-ethereum/rpc/errors.go:64.47,64.64 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:66.46,68.2 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:72.53,72.70 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:74.52,76.2 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:81.38,81.55 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:83.37,83.57 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:88.47,88.64 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:90.46,90.66 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:95.47,95.64 1 0 +github.com/ethereum/go-ethereum/rpc/errors.go:97.46,97.66 1 0 +github.com/ethereum/go-ethereum/rpc/errors.go:102.46,102.63 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:104.45,104.65 1 1 +github.com/ethereum/go-ethereum/rpc/errors.go:111.39,111.56 1 0 +github.com/ethereum/go-ethereum/rpc/errors.go:113.38,113.66 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:55.67,56.39 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:59.41,60.38 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:63.41,65.2 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:67.66,70.2 2 0 +github.com/ethereum/go-ethereum/rpc/http.go:72.29,73.25 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:73.25,73.46 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:76.49,78.2 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:114.80,117.16 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:121.2,125.71 5 1 +github.com/ethereum/go-ethereum/rpc/http.go:117.16,119.3 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:125.71,133.3 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:137.49,139.2 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:141.86,144.16 3 1 +github.com/ethereum/go-ethereum/rpc/http.go:147.2,150.67 3 1 +github.com/ethereum/go-ethereum/rpc/http.go:153.2,154.12 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:144.16,146.3 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:150.67,152.3 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:157.98,160.16 3 0 +github.com/ethereum/go-ethereum/rpc/http.go:163.2,165.68 3 0 +github.com/ethereum/go-ethereum/rpc/http.go:168.2,168.37 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:171.2,171.12 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:160.16,162.3 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:165.68,167.3 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:168.37,170.3 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:174.92,176.16 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:179.2,180.16 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:183.2,184.46 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:187.2,193.16 5 1 +github.com/ethereum/go-ethereum/rpc/http.go:196.2,196.53 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:209.2,209.23 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:176.16,178.3 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:180.16,182.3 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:184.46,184.101 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:193.16,195.3 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:196.53,199.52 3 1 +github.com/ethereum/go-ethereum/rpc/http.go:203.3,207.4 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:199.52,201.4 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:219.76,223.2 3 1 +github.com/ethereum/go-ethereum/rpc/http.go:226.40,226.54 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:229.46,231.2 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:234.60,234.74 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:237.68,239.80 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:243.2,243.49 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:249.2,263.34 11 1 +github.com/ethereum/go-ethereum/rpc/http.go:239.80,242.3 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:243.49,246.3 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:268.52,269.65 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:272.2,272.47 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:277.2,277.36 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:281.2,281.81 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:289.2,290.45 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:269.65,271.3 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:272.47,275.3 2 1 +github.com/ethereum/go-ethereum/rpc/http.go:277.36,279.3 1 0 +github.com/ethereum/go-ethereum/rpc/http.go:281.81,282.49 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:282.49,283.22 1 1 +github.com/ethereum/go-ethereum/rpc/http.go:283.22,285.5 1 1 +github.com/ethereum/go-ethereum/rpc/metrics.go:32.66,34.12 2 1 +github.com/ethereum/go-ethereum/rpc/metrics.go:37.2,38.43 2 1 +github.com/ethereum/go-ethereum/rpc/metrics.go:34.12,36.3 1 1 +github.com/ethereum/go-ethereum/rpc/stdio.go:29.54,31.2 1 0 +github.com/ethereum/go-ethereum/rpc/stdio.go:34.80,35.69 1 0 +github.com/ethereum/go-ethereum/rpc/stdio.go:35.69,40.3 1 0 +github.com/ethereum/go-ethereum/rpc/stdio.go:48.55,50.2 1 0 +github.com/ethereum/go-ethereum/rpc/stdio.go:52.56,54.2 1 0 +github.com/ethereum/go-ethereum/rpc/stdio.go:56.35,58.2 1 0 +github.com/ethereum/go-ethereum/rpc/stdio.go:60.41,62.2 1 0 +github.com/ethereum/go-ethereum/rpc/stdio.go:64.57,66.2 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:75.57,77.70 2 1 +github.com/ethereum/go-ethereum/rpc/types.go:81.2,81.15 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:93.2,94.16 2 1 +github.com/ethereum/go-ethereum/rpc/types.go:97.2,97.29 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:100.2,101.12 2 1 +github.com/ethereum/go-ethereum/rpc/types.go:77.70,79.3 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:82.18,84.13 2 1 +github.com/ethereum/go-ethereum/rpc/types.go:85.16,87.13 2 1 +github.com/ethereum/go-ethereum/rpc/types.go:88.17,90.13 2 1 +github.com/ethereum/go-ethereum/rpc/types.go:94.16,96.3 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:97.29,99.3 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:107.53,108.12 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:109.27,110.33 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:111.25,112.31 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:113.26,114.32 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:115.10,116.42 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:120.37,122.2 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:130.64,134.16 4 1 +github.com/ethereum/go-ethereum/rpc/types.go:143.2,145.16 3 1 +github.com/ethereum/go-ethereum/rpc/types.go:148.2,148.15 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:134.16,135.49 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:138.3,141.13 4 1 +github.com/ethereum/go-ethereum/rpc/types.go:135.49,137.4 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:145.16,147.3 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:149.18,152.13 3 1 +github.com/ethereum/go-ethereum/rpc/types.go:153.16,156.13 3 1 +github.com/ethereum/go-ethereum/rpc/types.go:157.17,160.13 3 1 +github.com/ethereum/go-ethereum/rpc/types.go:161.10,162.23 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:162.23,165.18 3 1 +github.com/ethereum/go-ethereum/rpc/types.go:168.4,169.14 2 1 +github.com/ethereum/go-ethereum/rpc/types.go:165.18,167.5 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:170.9,172.18 2 1 +github.com/ethereum/go-ethereum/rpc/types.go:175.4,175.31 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:178.4,180.14 3 1 +github.com/ethereum/go-ethereum/rpc/types.go:172.18,174.5 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:175.31,177.5 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:185.60,186.28 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:189.2,189.30 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:186.28,188.3 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:192.47,193.28 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:196.2,196.26 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:199.2,199.14 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:193.28,195.3 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:196.26,198.3 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:202.58,203.26 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:206.2,206.29 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:203.26,205.3 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:209.73,215.2 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:217.84,223.2 1 1 +github.com/ethereum/go-ethereum/rpc/types.go:229.58,231.70 2 0 +github.com/ethereum/go-ethereum/rpc/types.go:235.2,236.16 2 0 +github.com/ethereum/go-ethereum/rpc/types.go:239.2,239.16 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:242.2,243.12 2 0 +github.com/ethereum/go-ethereum/rpc/types.go:231.70,233.3 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:236.16,238.3 1 0 +github.com/ethereum/go-ethereum/rpc/types.go:239.16,241.3 1 0 +github.com/ethereum/go-ethereum/rpc/endpoints.go:27.86,34.27 2 0 +github.com/ethereum/go-ethereum/rpc/endpoints.go:44.2,47.16 3 0 +github.com/ethereum/go-ethereum/rpc/endpoints.go:50.2,51.31 2 0 +github.com/ethereum/go-ethereum/rpc/endpoints.go:34.27,35.74 1 0 +github.com/ethereum/go-ethereum/rpc/endpoints.go:39.3,39.42 1 0 +github.com/ethereum/go-ethereum/rpc/endpoints.go:35.74,38.4 2 0 +github.com/ethereum/go-ethereum/rpc/endpoints.go:39.42,42.4 2 0 +github.com/ethereum/go-ethereum/rpc/endpoints.go:47.16,49.3 1 0 +github.com/ethereum/go-ethereum/rpc/inproc.go:25.42,27.72 2 1 +github.com/ethereum/go-ethereum/rpc/inproc.go:32.2,32.10 1 1 +github.com/ethereum/go-ethereum/rpc/inproc.go:27.72,31.3 3 1 +github.com/ethereum/go-ethereum/rpc/server.go:53.26,60.2 4 1 +github.com/ethereum/go-ethereum/rpc/server.go:66.72,68.2 1 1 +github.com/ethereum/go-ethereum/rpc/server.go:75.69,79.35 2 1 +github.com/ethereum/go-ethereum/rpc/server.go:84.2,89.11 5 1 +github.com/ethereum/go-ethereum/rpc/server.go:79.35,81.3 1 0 +github.com/ethereum/go-ethereum/rpc/server.go:95.77,97.35 1 1 +github.com/ethereum/go-ethereum/rpc/server.go:101.2,106.16 5 1 +github.com/ethereum/go-ethereum/rpc/server.go:112.2,112.11 1 1 +github.com/ethereum/go-ethereum/rpc/server.go:97.35,99.3 1 0 +github.com/ethereum/go-ethereum/rpc/server.go:106.16,107.20 1 0 +github.com/ethereum/go-ethereum/rpc/server.go:110.3,110.9 1 0 +github.com/ethereum/go-ethereum/rpc/server.go:107.20,109.4 1 0 +github.com/ethereum/go-ethereum/rpc/server.go:112.11,114.3 1 0 +github.com/ethereum/go-ethereum/rpc/server.go:114.8,116.3 1 1 +github.com/ethereum/go-ethereum/rpc/server.go:122.25,123.46 1 1 +github.com/ethereum/go-ethereum/rpc/server.go:123.46,125.42 2 1 +github.com/ethereum/go-ethereum/rpc/server.go:125.42,128.4 2 1 +github.com/ethereum/go-ethereum/rpc/server.go:139.50,144.47 4 1 +github.com/ethereum/go-ethereum/rpc/server.go:147.2,147.16 1 1 +github.com/ethereum/go-ethereum/rpc/server.go:144.47,146.3 1 1 +github.com/ethereum/go-ethereum/rpc/server.go:180.56,183.2 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:37.48,39.36 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:42.2,42.14 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:39.36,41.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:46.84,48.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:51.82,53.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:56.36,57.34 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:57.34,59.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:64.79,67.37 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:75.2,75.34 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:81.2,81.29 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:67.37,68.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:71.3,71.20 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:68.50,70.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:75.34,76.37 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:79.3,79.29 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:76.37,78.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:97.54,99.22 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:102.2,103.14 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:99.22,101.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:107.41,112.2 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:117.77,118.27 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:123.2,124.59 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:127.2,128.21 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:131.2,131.34 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:118.27,120.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:124.59,126.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:128.21,130.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:137.75,138.27 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:142.2,143.21 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:146.2,146.34 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:138.27,140.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:143.21,145.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:149.63,153.54 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:165.2,173.28 6 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:153.54,155.40 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:158.3,158.47 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:161.3,161.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:155.40,157.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:158.47,160.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:177.53,178.53 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:181.2,181.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:178.53,180.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:185.48,188.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:191.2,196.16 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:199.2,209.12 7 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:188.16,190.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:196.16,198.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:219.53,225.58 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:232.2,233.14 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:225.58,226.21 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:229.3,229.20 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:226.21,228.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:241.56,244.2 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:246.32,248.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:31.64,36.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:39.31,41.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:44.47,46.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:49.49,51.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:55.70,57.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:61.69,63.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:67.92,69.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:73.44,75.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:79.40,81.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:85.58,87.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:90.84,92.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:94.85,96.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:100.50,102.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:106.50,108.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:112.30,114.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:118.74,120.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:124.53,126.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:129.42,131.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:136.73,143.2 3 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:146.55,148.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:157.59,159.18 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:166.2,166.18 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:183.2,183.35 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:159.18,161.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:161.8,163.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:166.18,168.40 2 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:168.40,171.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:175.4,175.14 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:171.20,172.10 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:175.14,177.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:179.8,181.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:189.40,191.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:194.56,196.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:201.55,203.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:213.51,215.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:218.47,220.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:223.38,225.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:228.36,230.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:233.30,235.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:245.61,248.2 2 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:251.50,254.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:257.59,259.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:270.40,272.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:276.42,278.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:283.41,285.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:288.2,288.31 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:285.16,287.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/table.go:294.43,296.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/table.go:300.38,302.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:33.67,35.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:39.2,39.35 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:44.2,44.36 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:48.2,49.54 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:53.2,53.26 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:35.20,37.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:39.35,42.3 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:44.36,46.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:49.54,52.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:58.88,59.63 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:59.63,61.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:66.89,68.30 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:68.30,70.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:75.79,77.42 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:77.42,79.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:83.69,84.53 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:84.53,86.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:90.75,91.30 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:91.30,93.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:98.107,100.24 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:103.2,104.34 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:107.2,108.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:112.2,112.45 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:117.2,118.33 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:100.24,102.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:104.34,106.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:108.17,111.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:112.45,113.24 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:113.24,115.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:123.127,126.24 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:129.2,130.34 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:134.2,135.46 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:140.2,141.33 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:126.24,128.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:130.34,132.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:135.46,136.29 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:136.29,138.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:146.105,148.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:152.103,153.71 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:153.71,155.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:160.75,165.16 4 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:174.2,174.23 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:165.16,166.40 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:169.3,169.51 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:172.3,172.22 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:166.40,167.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:169.51,170.12 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:174.23,176.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:28.46,30.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:34.75,35.101 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:39.2,39.73 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:43.2,43.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:35.101,37.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:39.73,41.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:47.87,52.19 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:59.2,60.19 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:67.2,68.19 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:74.2,74.12 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:52.19,54.36 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:54.36,56.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:60.19,62.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:68.19,70.36 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:70.36,72.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:80.89,83.35 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:88.2,89.63 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:94.2,94.42 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:83.35,85.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:89.63,92.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:100.86,103.23 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:108.2,109.21 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:113.2,114.17 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:119.2,119.92 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:123.2,123.19 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:103.23,105.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:109.21,111.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:114.17,117.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:119.92,122.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:127.117,130.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:135.2,135.67 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:130.16,132.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:135.67,137.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:141.81,144.39 2 1 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:144.39,146.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:151.148,153.24 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:157.2,158.17 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:164.2,164.91 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:153.24,155.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:158.17,161.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:169.110,171.24 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:175.2,176.34 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:180.2,181.17 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:187.2,187.91 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:171.24,173.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:176.34,178.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:181.17,184.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:196.72,198.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:202.2,203.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:198.20,200.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:207.86,209.96 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:209.96,211.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:215.87,218.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:221.82,222.58 1 0 +github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:222.58,224.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:28.57,31.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:34.53,35.66 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:35.66,37.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:41.54,42.55 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:42.55,44.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:49.60,51.36 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:54.2,54.33 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:51.36,53.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:59.67,60.57 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:60.57,62.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:69.50,70.51 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:70.51,72.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:76.76,79.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:82.84,83.64 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:83.64,85.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:89.71,90.60 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:90.60,92.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:96.96,99.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:102.104,103.84 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:103.84,105.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:109.91,110.80 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:110.80,112.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:117.89,119.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:123.58,126.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:130.68,131.60 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:131.60,133.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:138.53,139.54 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:139.54,141.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:146.60,149.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:153.72,154.64 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:154.64,156.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:161.55,162.56 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:162.56,164.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:169.66,171.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:174.2,174.20 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:177.2,178.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:171.20,173.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:174.20,176.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:183.74,186.60 3 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:186.60,188.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:193.60,194.55 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:194.55,196.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:200.61,203.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:206.70,207.62 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:207.62,209.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:106.129,114.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:122.2,123.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:127.2,137.42 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:157.2,157.57 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:162.2,162.22 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:170.2,170.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:179.2,182.21 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:114.57,115.38 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:115.38,118.4 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:123.16,125.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:137.42,139.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:146.3,146.31 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:139.17,140.41 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:143.4,144.19 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:140.41,142.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:157.57,158.111 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:158.111,160.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:162.22,166.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:166.8,169.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:170.16,171.40 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:174.3,175.18 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:171.40,173.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:186.33,191.24 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:204.2,204.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:207.2,207.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:191.24,195.34 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:200.3,200.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:195.34,196.40 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:196.40,198.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:200.50,202.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:204.17,206.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:212.72,213.43 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:216.2,216.19 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:213.43,215.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:220.71,221.43 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:224.2,224.29 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:221.43,223.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:232.94,233.43 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:236.2,236.29 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:233.43,235.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:240.46,242.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:245.42,247.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:250.60,256.43 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:259.2,259.27 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:256.43,258.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:264.80,268.2 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:271.100,272.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:275.2,280.15 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:292.2,293.41 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:296.2,297.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:300.2,301.23 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:272.16,274.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:280.15,281.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:281.17,283.38 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:283.38,285.19 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:285.19,287.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:293.41,295.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:297.16,299.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:305.52,306.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:309.2,312.43 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:315.2,315.33 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:320.2,321.12 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:306.16,308.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:312.43,314.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:315.33,316.51 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:316.51,318.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:325.51,326.16 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:329.2,332.40 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:335.2,335.33 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:340.2,341.12 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:326.16,328.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:332.40,334.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:335.33,336.50 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:336.50,338.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:345.32,347.33 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:352.2,352.17 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:355.2,355.12 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:347.33,348.38 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:348.38,350.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:352.17,354.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:360.36,361.24 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:364.2,369.36 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:375.2,375.36 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:381.2,382.12 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:361.24,363.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:369.36,372.8 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:375.36,377.22 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:377.22,379.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:386.34,391.33 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:401.2,401.33 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:409.2,411.12 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:391.33,393.19 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:396.3,397.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:393.19,395.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:397.20,399.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:401.33,402.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:405.3,405.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:402.50,404.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:405.50,407.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:419.50,426.6 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:426.6,427.10 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:433.3,433.14 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:449.3,450.30 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:455.3,458.10 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:474.3,475.18 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:482.3,487.38 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:490.3,491.17 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:498.3,498.34 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:503.3,504.38 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:511.3,511.39 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:514.3,518.52 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:528.3,528.39 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:531.3,534.19 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:568.3,571.32 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:574.3,577.41 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:428.17,430.10 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:431.11,431.11 0 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:433.14,435.24 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:439.4,439.11 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:435.24,438.5 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:440.51,441.20 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:442.33,443.20 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:444.18,445.11 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:450.30,453.12 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:459.22,462.12 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:464.28,467.12 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:469.38,472.12 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:475.18,478.12 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:487.38,489.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:491.17,494.12 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:498.34,500.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:504.38,506.28 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:506.28,509.5 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:511.39,513.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:518.52,520.19 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:520.19,522.35 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:522.35,525.6 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:528.39,530.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:534.19,536.26 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:562.4,562.40 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:536.26,538.35 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:542.5,543.40 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:559.5,560.10 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:538.35,541.6 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:543.40,546.22 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:550.6,550.46 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:556.6,557.42 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:546.22,548.15 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:550.46,553.15 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:562.40,564.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:571.32,573.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:577.41,579.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:583.105,586.64 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:638.2,638.20 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:586.64,587.35 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:635.3,635.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:587.35,590.31 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:593.4,594.24 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:597.4,598.22 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:601.4,602.26 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:605.4,606.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:611.4,611.74 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:614.4,614.75 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:617.4,617.73 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:620.4,620.78 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:623.4,623.75 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:628.4,629.88 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:633.4,633.33 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:590.31,592.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:594.24,596.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:598.22,600.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:602.26,604.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:606.20,608.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:611.74,613.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:614.75,616.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:617.73,619.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:620.78,622.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:623.75,625.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:629.88,631.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:647.76,648.16 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:651.2,655.9 4 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:661.2,661.87 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:686.2,686.50 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:689.2,694.16 4 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:697.2,704.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:708.2,708.69 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:724.2,724.39 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:727.2,732.41 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:735.2,736.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:740.2,740.26 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:747.2,747.49 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:751.2,751.12 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:648.16,650.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:655.9,657.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:661.87,667.31 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:682.3,682.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:667.31,668.27 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:671.4,672.18 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:675.4,675.30 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:680.4,680.26 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:668.27,670.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:672.18,674.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:675.30,676.49 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:676.49,678.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:686.50,688.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:694.16,696.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:704.16,706.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:708.69,709.58 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:713.3,714.17 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:717.3,717.49 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:720.3,720.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:709.58,712.4 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:714.17,716.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:717.49,719.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:721.17,723.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:724.39,726.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:732.41,734.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:736.16,738.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:740.26,742.114 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:742.114,744.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer.go:747.49,749.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:60.48,63.2 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:66.46,72.2 5 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:77.86,78.30 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:84.2,84.42 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:78.30,83.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:127.94,129.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:134.190,136.48 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:139.2,140.19 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:145.2,150.14 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:179.2,193.37 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:198.2,199.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:203.2,205.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:136.48,138.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:140.19,142.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:142.8,144.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:150.14,153.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:164.3,165.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:153.17,155.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:165.17,167.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:168.8,170.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:173.3,174.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:170.17,172.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:174.17,176.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:193.37,196.3 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:199.16,202.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:210.39,216.16 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:219.2,219.22 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:225.2,225.61 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:229.2,229.44 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:232.2,255.16 8 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:258.2,261.35 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:267.2,267.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:272.2,272.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:275.2,275.43 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:278.2,282.32 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:327.2,327.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:340.2,351.36 6 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:354.2,355.12 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:216.16,218.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:219.22,220.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:220.50,222.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:225.61,227.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:229.44,231.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:255.16,257.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:261.35,263.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:263.8,266.3 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:267.16,269.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:269.8,271.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:272.16,274.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:275.43,277.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:282.32,284.31 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:292.3,292.31 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:284.31,286.66 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:289.4,289.28 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:286.66,288.5 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:292.31,294.83 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:297.4,302.37 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:309.4,309.49 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:322.4,323.40 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:294.83,296.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:302.37,304.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:304.10,307.5 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:309.49,312.93 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:315.5,315.46 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:320.5,320.30 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:312.93,314.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:315.46,319.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:327.17,329.40 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:332.3,332.39 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:335.3,335.39 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:329.40,331.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:332.39,334.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:335.39,337.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:351.36,353.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:362.46,367.39 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:372.2,372.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:378.2,378.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:367.39,368.69 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:368.69,370.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:372.16,374.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:374.8,377.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:382.57,388.23 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:391.2,391.46 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:395.2,396.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:400.2,401.24 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:404.2,409.85 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:413.2,414.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:424.2,424.34 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:438.2,438.76 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:442.2,447.16 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:450.2,451.12 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:388.23,390.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:391.46,393.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:396.16,398.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:401.24,403.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:409.85,411.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:414.17,416.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:416.8,418.81 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:421.3,421.35 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:418.81,420.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:424.34,428.17 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:433.3,436.30 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:428.17,430.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:438.76,440.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:447.16,449.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:455.57,460.47 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:463.2,463.41 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:467.2,471.42 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:483.2,484.66 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:489.2,489.27 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:493.2,493.26 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:499.2,500.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:504.2,508.61 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:521.2,521.38 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:525.2,525.111 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:533.2,533.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:537.2,537.40 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:540.2,541.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:545.2,551.16 5 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:554.2,555.12 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:460.47,462.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:463.41,465.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:471.42,473.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:473.8,475.85 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:478.3,480.30 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:475.85,477.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:484.66,486.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:489.27,491.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:493.26,495.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:500.16,502.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:508.61,509.94 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:512.3,514.31 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:517.3,517.23 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:509.94,511.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:514.31,515.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:521.38,523.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:525.111,532.3 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:533.16,535.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:537.40,539.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:541.16,543.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:551.16,553.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:559.38,564.40 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:567.2,569.39 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:572.2,574.28 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:579.2,581.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:584.2,584.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:564.40,566.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:569.39,571.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:574.28,575.35 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:575.35,577.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:581.17,583.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:588.108,590.37 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:603.2,603.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:590.37,592.22 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:597.3,598.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:601.3,601.19 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:592.22,594.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:594.9,596.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:598.17,600.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:608.48,609.37 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:609.37,612.3 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:616.67,617.31 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:617.31,618.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:618.17,621.14 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:621.14,623.5 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:629.68,630.31 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:630.31,631.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:631.17,634.14 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:634.14,636.5 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:647.78,652.78 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:655.2,659.38 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:665.2,665.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:674.2,674.21 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:652.78,654.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:659.38,664.3 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:665.15,673.3 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:679.62,681.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:684.2,684.22 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:681.16,683.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:691.87,694.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:697.2,703.33 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:724.2,724.20 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:694.16,696.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:703.33,707.23 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:710.3,710.62 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:713.3,713.23 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:722.3,722.33 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:707.23,709.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:710.62,711.9 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:713.23,715.18 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:718.4,718.33 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:715.18,717.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:719.9,721.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:730.92,735.37 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:738.2,744.52 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:747.2,747.25 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:750.2,755.59 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:772.2,773.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:776.2,783.54 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:821.2,821.40 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:735.37,737.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:744.52,746.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:747.25,749.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:755.59,758.27 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:761.3,762.13 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:765.3,765.96 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:768.3,769.13 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:758.27,760.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:762.13,764.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:765.96,767.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:773.16,775.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:783.54,789.48 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:799.3,799.49 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:810.3,813.58 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:789.48,791.22 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:797.4,797.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:791.22,792.79 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:795.5,795.19 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:792.79,794.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:799.49,802.22 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:807.4,807.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:802.22,803.80 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:803.80,805.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:813.58,815.79 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:818.4,818.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:815.79,817.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:826.48,828.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:831.47,836.2 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:840.53,842.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:845.2,846.19 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:842.16,844.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:852.44,860.16 5 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:865.2,872.12 6 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:860.16,862.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:877.37,878.39 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:881.2,881.38 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:884.2,884.22 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:878.39,880.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:881.38,883.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:889.53,891.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:893.66,898.2 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:900.66,902.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:906.2,913.32 5 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:924.2,924.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:902.16,905.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:913.32,914.77 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:917.3,920.36 4 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:914.77,915.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:920.36,921.9 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:932.50,933.22 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:944.2,944.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:933.22,936.24 3 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:942.3,942.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:936.24,937.49 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:937.49,940.5 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:31.93,34.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:37.2,40.15 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:48.2,48.19 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:54.2,55.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:58.2,58.53 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:63.2,64.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:71.2,73.34 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:76.2,78.51 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:81.2,81.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:34.16,36.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:40.15,41.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:44.3,44.19 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:41.15,43.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:48.19,49.35 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:49.35,51.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:55.16,57.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:58.53,61.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:64.16,67.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:73.34,75.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:78.51,80.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:85.66,90.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:94.2,94.51 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:97.2,97.18 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:90.16,92.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:94.51,96.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:101.68,103.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:106.66,108.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:111.59,112.44 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:116.2,116.52 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:119.2,119.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:112.44,114.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:116.52,118.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:37.68,39.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:47.2,47.33 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:39.57,41.21 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:45.3,45.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:41.21,44.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:51.83,52.68 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:52.68,54.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:58.66,59.57 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:59.57,61.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:66.68,73.16 5 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:78.2,78.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:73.16,74.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:74.50,76.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:89.80,97.16 3 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:109.2,109.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:97.16,99.28 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:102.3,103.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:106.3,107.50 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:99.28,100.12 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:103.17,104.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:115.109,117.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:120.2,129.16 5 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:142.2,142.24 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:117.16,119.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:129.16,130.40 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:133.3,133.108 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:130.40,131.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:133.108,137.29 3 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:137.29,138.10 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:146.74,148.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:151.2,152.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:148.20,150.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:156.82,159.41 3 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:159.41,161.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:165.68,166.57 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:166.57,168.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:172.62,174.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:177.2,177.33 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:174.20,176.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:181.69,182.60 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:182.60,184.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:188.61,190.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:193.2,193.33 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:190.20,192.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:197.68,198.59 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:198.59,200.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:204.65,206.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:209.2,209.33 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:206.20,208.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:213.72,214.63 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:214.63,216.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:221.59,223.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:226.2,227.54 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:231.2,231.15 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:223.20,225.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:227.54,230.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:235.66,237.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:240.2,240.50 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:237.16,239.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:240.50,242.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:248.55,250.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:253.2,254.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:250.20,252.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:259.63,260.74 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:260.74,262.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:266.61,268.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:271.2,272.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:268.20,270.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:276.69,277.80 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:277.80,279.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:291.83,293.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:296.2,297.22 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:301.2,303.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:317.2,317.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:321.2,323.46 3 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:329.2,329.19 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:293.16,295.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:297.22,300.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:303.16,306.38 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:306.38,307.60 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:314.4,314.11 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:307.60,311.5 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:311.10,312.10 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:317.16,319.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:323.46,325.23 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:325.23,327.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:333.83,335.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:347.2,347.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:335.57,340.58 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:344.3,345.13 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:340.58,342.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:351.71,352.31 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:355.2,355.69 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:358.2,358.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:352.31,354.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:355.69,357.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:362.81,364.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:367.2,368.66 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:372.2,372.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:364.20,366.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:368.66,371.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:377.65,387.16 4 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:390.2,391.42 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:387.16,389.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:391.42,393.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:397.77,399.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:399.57,401.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:406.90,407.59 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:407.59,409.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:414.80,416.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:419.2,419.32 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:416.16,418.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:423.81,428.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:438.2,438.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:428.57,430.36 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:435.3,436.13 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:430.36,433.4 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:443.72,445.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:457.2,457.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:445.57,447.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:453.3,455.13 3 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:447.20,449.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:461.95,462.64 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:462.64,464.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:468.69,469.31 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:472.2,472.72 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:475.2,475.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:469.31,471.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:472.72,474.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:479.77,481.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:484.2,485.64 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:489.2,489.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:481.20,483.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:485.64,488.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:493.92,495.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:498.2,498.38 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:495.16,497.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:502.75,503.62 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:503.62,505.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:509.79,511.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:521.2,521.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:511.57,513.36 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:518.3,519.13 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:513.36,516.4 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:525.72,527.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:530.2,531.62 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:535.2,535.11 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:527.20,529.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:531.62,534.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:539.85,541.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:544.2,544.64 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:541.16,543.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:544.64,546.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:550.73,551.61 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:551.61,553.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:558.73,559.31 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:562.2,562.76 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:565.2,565.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:559.31,561.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:562.76,564.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:569.85,571.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:581.2,581.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:571.57,573.36 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:578.3,579.13 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:573.36,576.4 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:587.87,590.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:594.2,595.64 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:599.2,600.49 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:603.2,603.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:590.20,592.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:595.64,598.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:600.49,602.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:613.112,616.21 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:619.2,620.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:624.2,624.87 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:628.2,628.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:616.21,618.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:620.17,623.3 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:624.87,627.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:632.103,635.35 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:638.2,639.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:643.2,643.70 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:635.35,637.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:639.16,641.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:643.70,645.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:649.79,650.66 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:650.66,652.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:671.54,673.42 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:676.2,677.34 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:680.2,680.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:673.42,675.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:677.34,679.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:684.110,686.31 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:689.2,689.37 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:701.2,701.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:686.31,688.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:689.37,692.46 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:692.46,699.4 6 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:707.108,710.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:713.2,714.57 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:724.2,725.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:729.2,729.83 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:733.2,734.35 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:737.2,737.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:710.20,712.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:714.57,717.68 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:720.3,721.13 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:717.68,719.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:725.17,728.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:729.83,732.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:734.35,736.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:743.114,745.21 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:748.2,749.35 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:752.2,752.13 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:745.21,747.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:749.35,751.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:761.79,763.19 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:766.2,767.17 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:770.2,770.82 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:763.19,765.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:767.17,769.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:774.62,777.2 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:780.157,786.63 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:786.63,787.32 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:808.3,808.13 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:787.32,790.40 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:795.4,796.46 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:800.4,801.13 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:804.4,804.97 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:790.40,792.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:796.46,798.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:801.13,803.5 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:804.97,806.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:812.187,814.82 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:817.2,817.67 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:820.2,820.73 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:823.2,823.70 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:826.2,826.67 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:829.2,829.76 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:832.2,832.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:814.82,816.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:817.67,819.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:820.73,822.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:823.70,825.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:826.67,828.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:829.76,831.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:836.76,844.2 5 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:848.89,856.2 5 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:869.33,869.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:870.43,872.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:873.38,873.65 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:876.67,878.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:881.2,882.58 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:885.2,885.32 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:890.2,890.12 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:878.16,880.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:882.58,884.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:885.32,886.32 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:886.32,888.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:895.55,897.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:900.2,901.58 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:904.2,905.32 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:908.2,908.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:897.16,899.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:901.58,903.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:905.32,907.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:913.64,915.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:918.2,919.19 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:924.2,924.30 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:930.2,935.37 3 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:938.2,939.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:942.2,942.50 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:915.16,917.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:919.19,920.59 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:920.59,922.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:924.30,925.87 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:925.87,928.4 2 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:935.37,937.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:939.16,941.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:942.50,944.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:948.47,949.47 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:949.47,951.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:955.76,956.55 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:962.2,962.55 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:968.2,968.27 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:978.2,978.10 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:956.55,958.15 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:958.15,960.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:962.55,964.15 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:964.15,966.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:968.27,970.15 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:973.3,974.15 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:970.15,972.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:974.15,976.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:982.52,984.39 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:987.2,988.29 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:991.2,991.58 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:984.39,986.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:988.29,990.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:995.50,997.38 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:1000.2,1001.28 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:1004.2,1004.55 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:997.38,999.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:1001.28,1003.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:31.59,35.19 3 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:38.2,38.55 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:42.2,42.17 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:35.19,37.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:38.55,40.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:46.68,48.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:51.2,51.55 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:48.16,50.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:51.55,53.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:57.85,59.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:62.2,63.54 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:67.2,67.16 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:59.20,61.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:63.54,66.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:71.91,72.16 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:75.2,76.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:79.2,79.54 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:72.16,74.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:76.16,78.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:79.54,81.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:85.73,88.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:91.80,92.55 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:92.55,94.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:110.82,113.57 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:118.2,123.68 5 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:129.2,130.57 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:134.2,134.33 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:113.57,115.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:115.8,115.72 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:115.72,117.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:123.68,127.3 3 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:130.57,133.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:138.55,141.57 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:146.2,146.46 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:149.2,150.57 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:141.57,143.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:143.8,143.72 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:143.72,145.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:146.46,148.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:150.57,152.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:156.58,159.57 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:165.2,166.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:170.2,172.57 3 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:159.57,161.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:161.8,161.72 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:161.72,163.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:166.16,169.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:172.57,174.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:178.59,181.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:184.66,185.58 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:185.58,187.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:43.38,45.50 2 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:48.2,48.51 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:51.2,51.20 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:54.2,54.12 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:45.50,47.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:48.51,50.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:51.20,53.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:60.55,61.43 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:65.2,65.25 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:68.2,74.12 5 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:61.43,63.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:65.25,67.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:83.76,85.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:88.75,90.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:93.99,95.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:98.50,100.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:103.46,105.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:108.64,110.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:113.87,115.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:118.56,120.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:123.56,125.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:128.36,130.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:132.91,146.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:150.80,152.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:156.57,158.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:163.126,166.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:191.2,191.66 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:234.2,234.20 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:241.2,244.8 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:166.16,168.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:191.66,192.47 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:192.47,197.18 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:204.4,204.68 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:197.18,199.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:199.10,199.49 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:199.49,201.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:204.68,207.65 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:207.65,209.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:216.9,221.63 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:221.63,224.64 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:224.64,226.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:234.20,236.13 2 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:236.13,239.4 2 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:249.41,251.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/database.go:256.56,258.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:262.119,264.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:267.2,267.29 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:264.16,266.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:272.146,274.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:277.2,278.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:282.2,282.18 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:274.16,276.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:278.16,281.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:287.34,289.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:291.52,293.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:302.45,305.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:307.30,309.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:311.31,313.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:317.75,362.16 4 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:438.2,439.139 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:446.2,447.45 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:451.2,482.26 7 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:486.2,486.12 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:362.16,368.10 3 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:431.3,432.60 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:369.98,370.21 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:371.104,372.20 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:373.112,374.22 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:375.83,376.17 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:377.85,378.29 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:379.108,380.29 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:381.38,382.19 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:383.90,384.19 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:385.100,386.23 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:387.114,388.26 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:389.116,390.26 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:391.100,392.23 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:393.96,394.22 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:395.98,396.22 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:397.105,398.23 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:399.51,400.23 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:401.96,402.27 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:403.83,404.25 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:407.47,408.26 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:411.45,412.28 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:413.11,420.6 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:427.4,427.18 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:420.6,421.31 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:421.31,424.11 3 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:427.18,429.5 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:432.60,435.4 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:439.139,440.56 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:440.56,443.4 2 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:447.45,449.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/database.go:482.26,484.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:30.73,35.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:37.42,39.25 1 1 +github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:46.2,46.14 1 1 +github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:39.25,40.53 1 1 +github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:40.53,42.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:26.69,29.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:32.65,36.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:39.2,40.13 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:36.20,38.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:46.75,49.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:52.69,55.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:59.62,62.43 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:65.2,66.11 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:62.43,64.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:72.72,75.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:78.66,81.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:84.80,85.40 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:90.2,91.47 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:85.40,86.61 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:86.61,88.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:95.72,96.52 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:96.52,98.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:102.76,103.51 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:103.51,105.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:109.60,110.49 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:110.49,112.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:116.64,117.48 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:117.48,119.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:29.61,32.2 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:35.70,36.62 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:36.62,38.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:43.56,44.57 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:44.57,46.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:50.79,52.20 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:55.2,56.66 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:60.2,60.15 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:52.20,54.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:56.66,59.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:64.73,66.16 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:69.2,70.42 2 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:66.16,68.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:70.42,72.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:76.67,77.61 1 0 +github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:77.61,79.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:148.46,152.2 3 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:155.44,157.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:160.56,162.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:165.58,167.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:170.42,172.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:175.47,177.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:180.59,182.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:185.63,187.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:190.43,192.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:195.50,197.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:200.70,202.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:205.58,207.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:210.70,217.2 4 1 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:220.46,222.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:225.43,227.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:230.39,232.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:236.43,237.87 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:240.2,240.19 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:237.87,239.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:244.41,246.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/schema.go:249.42,251.2 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:35.49,38.31 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:41.2,47.34 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:76.2,76.38 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:79.2,83.118 4 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:38.31,40.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:47.34,50.23 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:53.3,54.17 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:57.3,57.26 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:69.3,71.41 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:50.23,52.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:54.17,56.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:57.26,62.48 4 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:62.48,63.41 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:66.5,66.18 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:63.41,65.6 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:71.41,74.4 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:76.38,78.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:95.128,101.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:104.2,105.54 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:108.2,113.19 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:135.2,136.20 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:165.2,166.36 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:169.2,169.17 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:101.16,103.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:105.54,107.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:113.19,115.14 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:118.3,119.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:115.14,117.4 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:119.16,122.11 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:127.4,127.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:123.38,123.38 0 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:124.21,125.11 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:127.15,129.5 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:129.10,131.5 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:136.20,137.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:143.3,143.27 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:137.16,139.48 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:139.48,141.5 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:143.27,145.59 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:149.4,150.41 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:153.4,158.11 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:145.59,148.5 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:150.41,152.5 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:159.28,159.28 0 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:160.21,161.11 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:166.36,168.3 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:180.116,182.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:185.2,198.37 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:237.2,238.38 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:242.2,242.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:182.16,184.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:198.37,203.22 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:203.22,205.65 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:209.4,209.39 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:213.4,219.48 6 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:228.4,228.42 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:205.65,206.10 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:209.39,210.10 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:219.48,221.41 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:225.5,225.18 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:221.41,224.6 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:228.42,231.5 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:238.38,241.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:243.19,244.148 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:245.10,246.135 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:259.92,261.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:264.126,266.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:272.118,274.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:277.2,290.33 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:329.2,330.38 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:334.2,334.9 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:274.16,276.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:290.33,293.22 2 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:293.22,295.64 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:299.4,299.37 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:302.4,311.24 6 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:320.4,320.42 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:295.64,296.10 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:299.37,300.10 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:311.24,313.41 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:317.5,317.18 1 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:313.41,316.6 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:320.42,323.5 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:330.38,333.3 2 0 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:335.19,336.145 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:337.10,338.132 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:347.94,349.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:352.128,354.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:42.49,47.2 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:51.61,53.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:56.2,57.48 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:60.2,60.19 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:53.16,55.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:57.48,59.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:65.65,67.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:70.2,70.31 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:67.16,69.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:76.74,78.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:87.2,87.22 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:94.2,95.16 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:101.2,101.26 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:108.2,108.15 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:78.16,80.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:87.22,89.48 2 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:92.3,92.16 1 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:89.48,91.4 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:95.16,97.3 1 0 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:101.26,104.48 3 1 +github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:104.48,106.4 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:79.147,86.16 5 1 +github.com/ethereum/go-ethereum/core/headerchain.go:89.2,100.29 3 1 +github.com/ethereum/go-ethereum/core/headerchain.go:103.2,104.71 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:109.2,111.16 3 1 +github.com/ethereum/go-ethereum/core/headerchain.go:86.16,88.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:100.29,102.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:104.71,105.54 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:105.54,107.4 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:116.65,117.48 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:121.2,122.19 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:125.2,125.15 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:117.48,120.3 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:122.19,124.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:139.61,141.23 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:148.2,153.46 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:183.2,183.38 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:190.2,195.38 5 1 +github.com/ethereum/go-ethereum/core/headerchain.go:199.2,202.12 4 1 +github.com/ethereum/go-ethereum/core/headerchain.go:141.23,143.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:153.46,155.44 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:165.3,170.67 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:155.44,157.31 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:160.4,160.39 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:157.31,158.10 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:170.67,172.23 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:175.4,177.21 3 1 +github.com/ethereum/go-ethereum/core/headerchain.go:172.23,173.10 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:177.21,179.5 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:183.38,188.3 4 1 +github.com/ethereum/go-ethereum/core/headerchain.go:195.38,197.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:209.75,210.23 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:213.2,214.16 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:217.2,223.33 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:252.2,252.24 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:257.2,257.38 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:260.2,260.27 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:210.23,212.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:214.16,216.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:223.33,228.25 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:233.3,239.20 4 1 +github.com/ethereum/go-ethereum/core/headerchain.go:249.3,249.29 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:228.25,230.4 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:230.9,232.4 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:239.20,248.4 6 1 +github.com/ethereum/go-ethereum/core/headerchain.go:252.24,255.3 2 0 +github.com/ethereum/go-ethereum/core/headerchain.go:257.38,259.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:270.120,272.16 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:275.2,287.82 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:297.2,297.133 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:301.2,301.42 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:304.2,305.20 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:272.16,274.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:287.82,289.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:289.8,289.19 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:289.19,290.20 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:293.3,293.21 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:290.20,292.4 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:297.133,299.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:301.42,303.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:308.95,310.34 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:332.2,333.20 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:346.2,350.23 3 1 +github.com/ethereum/go-ethereum/core/headerchain.go:362.2,362.15 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:310.34,311.63 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:322.3,322.37 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:326.3,326.54 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:311.63,320.4 4 0 +github.com/ethereum/go-ethereum/core/headerchain.go:322.37,324.4 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:326.54,328.4 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:333.20,335.46 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:343.3,343.29 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:335.46,337.27 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:340.4,340.23 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:337.27,339.5 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:350.23,352.25 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:357.3,357.35 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:352.25,355.4 2 0 +github.com/ethereum/go-ethereum/core/headerchain.go:357.35,359.4 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:375.123,376.24 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:379.2,380.16 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:384.2,388.41 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:394.2,394.21 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:397.2,398.24 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:376.24,378.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:380.16,382.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:388.41,390.87 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:390.87,392.4 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:394.21,396.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:406.126,407.23 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:410.2,410.19 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:417.2,417.20 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:437.2,437.21 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:407.23,409.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:410.19,412.58 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:415.3,415.26 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:412.58,414.4 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:417.20,418.58 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:425.3,425.28 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:428.3,431.20 4 0 +github.com/ethereum/go-ethereum/core/headerchain.go:434.3,435.11 2 0 +github.com/ethereum/go-ethereum/core/headerchain.go:418.58,420.59 2 0 +github.com/ethereum/go-ethereum/core/headerchain.go:420.59,423.5 2 0 +github.com/ethereum/go-ethereum/core/headerchain.go:425.28,427.4 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:431.20,433.4 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:442.72,444.44 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:447.2,448.15 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:452.2,453.11 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:444.44,446.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:448.15,450.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:458.81,460.48 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:463.2,464.19 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:468.2,469.15 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:460.48,462.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:464.19,466.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:474.72,476.19 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:479.2,479.36 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:476.19,478.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:485.72,486.68 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:489.2,489.50 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:486.68,488.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:494.71,496.29 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:499.2,499.35 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:496.29,498.3 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:506.76,509.69 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:517.2,520.29 3 0 +github.com/ethereum/go-ethereum/core/headerchain.go:523.2,523.16 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:536.2,536.15 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:539.2,539.16 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:509.69,510.29 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:510.29,513.4 2 0 +github.com/ethereum/go-ethereum/core/headerchain.go:513.9,515.4 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:520.29,522.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:523.16,525.10 2 0 +github.com/ethereum/go-ethereum/core/headerchain.go:528.3,533.11 6 0 +github.com/ethereum/go-ethereum/core/headerchain.go:525.10,526.9 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:536.15,538.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:542.68,544.2 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:548.54,550.2 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:554.61,558.2 3 1 +github.com/ethereum/go-ethereum/core/headerchain.go:574.114,580.100 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:644.2,644.38 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:648.2,650.24 3 1 +github.com/ethereum/go-ethereum/core/headerchain.go:580.100,585.20 3 1 +github.com/ethereum/go-ethereum/core/headerchain.go:588.3,598.22 3 1 +github.com/ethereum/go-ethereum/core/headerchain.go:606.3,607.45 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:610.3,617.13 5 1 +github.com/ethereum/go-ethereum/core/headerchain.go:623.3,626.28 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:585.20,587.4 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:598.22,600.31 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:600.31,603.5 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:607.45,609.4 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:617.13,618.71 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:621.4,621.18 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:618.71,620.5 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:626.28,629.24 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:633.4,633.32 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:640.4,640.41 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:629.24,632.5 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:633.32,634.21 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:637.5,638.37 2 1 +github.com/ethereum/go-ethereum/core/headerchain.go:634.21,636.6 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:644.38,646.3 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:654.55,656.2 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:659.53,659.73 1 1 +github.com/ethereum/go-ethereum/core/headerchain.go:662.50,662.70 1 0 +github.com/ethereum/go-ethereum/core/headerchain.go:666.79,668.2 1 0 +github.com/ethereum/go-ethereum/core/gaspool.go:29.51,30.41 1 1 +github.com/ethereum/go-ethereum/core/gaspool.go:33.2,34.11 2 1 +github.com/ethereum/go-ethereum/core/gaspool.go:30.41,31.40 1 0 +github.com/ethereum/go-ethereum/core/gaspool.go:39.48,40.26 1 1 +github.com/ethereum/go-ethereum/core/gaspool.go:43.2,44.12 2 1 +github.com/ethereum/go-ethereum/core/gaspool.go:40.26,42.3 1 1 +github.com/ethereum/go-ethereum/core/gaspool.go:48.33,50.2 1 0 +github.com/ethereum/go-ethereum/core/gaspool.go:52.36,54.2 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:189.53,191.34 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:195.2,195.25 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:199.2,199.24 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:203.2,203.27 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:207.2,207.26 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:211.2,211.27 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:215.2,215.26 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:219.2,219.23 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:223.2,223.13 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:191.34,194.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:195.25,198.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:199.24,202.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:203.27,206.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:207.26,210.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:211.27,214.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:215.26,218.3 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:219.23,222.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:279.96,303.37 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:307.2,315.46 5 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:327.2,331.13 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:303.37,306.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:315.46,318.59 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:321.3,321.59 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:318.59,320.4 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:321.59,323.4 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:337.28,355.6 7 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:355.6,356.10 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:358.33,359.23 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:365.34,367.10 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:370.19,376.78 5 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:382.18,384.33 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:398.4,398.20 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:401.20,402.27 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:359.23,362.5 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:376.78,379.5 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:384.33,386.35 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:390.5,390.60 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:386.35,387.14 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:390.60,392.30 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:395.6,395.48 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:392.30,394.7 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:402.27,404.61 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:407.5,407.21 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:404.61,406.6 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:414.28,422.25 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:425.2,425.38 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:422.25,424.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:430.84,432.2 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:435.41,440.2 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:444.49,451.24 5 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:460.2,460.70 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:451.24,454.27 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:457.3,457.33 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:454.27,456.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:465.55,470.2 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:474.40,479.2 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:483.40,485.36 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:488.2,489.34 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:492.2,492.24 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:485.36,487.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:489.34,491.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:497.110,502.39 4 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:505.2,506.37 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:509.2,509.24 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:502.39,504.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:506.37,508.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:514.95,519.40 4 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:522.2,523.38 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:526.2,526.24 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:519.40,521.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:523.38,525.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:536.85,541.39 4 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:557.2,557.16 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:541.39,545.49 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:553.3,553.19 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:545.49,546.27 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:546.27,547.80 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:547.80,549.11 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:553.19,555.4 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:561.47,566.2 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:571.67,573.41 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:581.2,581.12 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:573.41,574.52 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:577.3,577.48 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:574.52,576.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:577.48,579.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:586.73,588.54 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:592.2,592.58 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:596.2,596.35 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:601.2,601.27 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:605.2,605.35 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:609.2,609.35 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:612.2,612.35 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:616.2,616.44 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:620.2,621.16 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:625.2,625.53 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:629.2,629.51 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:634.2,634.59 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:638.2,639.16 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:642.2,642.24 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:645.2,645.12 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:588.54,590.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:592.58,594.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:596.35,598.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:601.27,603.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:605.35,607.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:609.35,611.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:612.35,614.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:616.44,618.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:621.16,623.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:625.53,627.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:629.51,631.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:634.59,636.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:639.16,641.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:642.24,644.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:655.87,658.31 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:665.2,668.53 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:674.2,674.93 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:711.2,712.66 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:736.2,737.16 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:741.2,741.42 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:746.2,746.13 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:749.2,752.22 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:658.31,662.3 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:668.53,672.3 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:674.93,676.46 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:685.3,685.62 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:693.3,696.27 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:702.3,704.27 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:676.46,680.4 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:685.62,688.4 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:696.27,700.4 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:704.27,708.4 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:712.66,715.16 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:720.3,720.17 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:725.3,733.25 7 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:715.16,718.4 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:720.17,724.4 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:737.16,739.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:741.42,745.3 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:746.13,748.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:758.111,761.29 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:764.2,765.15 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:771.2,771.16 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:781.2,781.42 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:784.2,784.12 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:789.2,789.42 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:792.2,792.24 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:761.29,763.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:765.15,769.3 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:771.16,775.3 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:775.8,778.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:781.42,783.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:784.12,787.3 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:789.42,791.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:797.75,799.56 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:802.2,802.48 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:799.56,801.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:802.48,804.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:811.98,813.31 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:816.2,819.15 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:827.2,827.16 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:836.2,840.13 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:813.31,815.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:819.15,825.3 4 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:827.16,831.3 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:831.8,834.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:848.65,850.2 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:854.59,857.2 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:864.66,866.2 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:869.70,871.2 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:874.64,877.2 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:883.60,886.2 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:889.80,895.25 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:914.2,914.20 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:919.2,924.30 5 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:932.2,933.10 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:936.2,936.13 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:895.25,897.37 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:905.3,906.17 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:912.3,912.26 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:897.37,900.12 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:906.17,909.12 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:914.20,916.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:924.30,925.28 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:928.3,929.12 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:925.28,927.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:933.10,935.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:941.95,944.25 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:951.2,952.20 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:944.25,947.30 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:947.30,949.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:957.61,959.30 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:975.2,975.15 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:959.30,961.16 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:964.3,966.89 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:973.3,973.20 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:961.16,962.12 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:966.89,968.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:968.9,968.94 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:968.94,970.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:979.62,981.2 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:985.48,987.2 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:991.65,994.15 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:997.2,1001.16 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1004.2,1004.32 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1008.2,1008.51 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1027.2,1027.47 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:994.15,996.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1001.16,1003.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1004.32,1006.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1008.51,1009.55 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1009.55,1011.23 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1015.4,1015.32 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1020.4,1023.10 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1011.23,1013.5 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1015.32,1018.5 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1027.47,1028.47 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1032.3,1032.21 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1028.47,1031.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1032.21,1035.4 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1041.94,1042.9 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1043.64,1044.28 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1045.30,1046.30 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1052.78,1053.9 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1054.32,1055.28 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1056.30,1057.30 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1062.57,1063.9 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1064.33,1064.33 0 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1065.30,1065.30 0 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1072.41,1083.6 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1083.6,1085.38 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1097.3,1097.10 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1085.38,1095.4 5 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1098.33,1100.20 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1105.4,1106.32 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1108.35,1110.28 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1115.4,1116.32 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1118.36,1122.40 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1125.4,1125.30 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1127.18,1128.17 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1130.31,1132.22 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1135.4,1136.10 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1100.20,1102.5 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1102.10,1104.5 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1110.28,1112.5 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1112.10,1114.5 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1122.40,1124.5 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1132.22,1134.5 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1142.144,1143.27 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1146.2,1149.42 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1155.2,1156.18 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1174.2,1179.18 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1200.2,1208.30 6 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1215.2,1215.21 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1143.27,1145.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1149.42,1154.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1156.18,1161.28 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1168.3,1169.32 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1161.28,1163.31 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1163.31,1165.5 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1169.32,1171.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1179.18,1181.27 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1192.3,1193.40 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1197.3,1197.36 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1181.27,1182.88 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1182.88,1186.5 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1186.10,1189.5 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1193.40,1196.4 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1208.30,1210.33 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1213.3,1213.23 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1210.33,1212.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1215.21,1217.30 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1220.3,1220.37 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1217.30,1219.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1226.59,1230.60 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1291.2,1291.20 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1294.2,1295.16 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1299.2,1312.48 10 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1230.60,1235.79 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1235.79,1237.4 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1237.9,1244.18 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1244.18,1249.25 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1256.5,1257.87 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1249.25,1254.6 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1259.10,1260.43 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1267.5,1267.43 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1274.5,1274.34 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1286.5,1286.55 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1260.43,1262.84 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1262.84,1265.7 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1267.43,1269.84 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1269.84,1272.7 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1274.34,1276.84 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1280.6,1281.84 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1276.84,1279.7 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1281.84,1284.7 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1291.20,1293.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1295.16,1298.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1318.88,1323.32 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1378.2,1378.17 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1323.32,1325.18 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1329.3,1330.31 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1334.3,1337.28 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1341.3,1346.30 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1352.3,1357.34 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1367.3,1369.33 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1373.3,1373.19 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1325.18,1326.12 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1330.31,1333.4 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1337.28,1340.4 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1346.30,1348.38 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1348.38,1350.5 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1357.34,1359.28 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1364.4,1364.47 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1359.28,1363.5 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1369.33,1371.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1373.19,1376.4 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1384.39,1386.36 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1389.2,1389.40 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1393.2,1396.39 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1403.2,1404.61 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1441.2,1441.61 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1465.2,1465.63 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1386.36,1388.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1389.40,1391.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1396.39,1398.83 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1398.83,1400.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1404.61,1410.25 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1410.25,1415.105 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1415.105,1416.43 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1416.43,1420.30 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1429.6,1431.44 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1434.6,1434.15 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1420.30,1428.7 4 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1431.44,1433.7 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1441.61,1442.127 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1442.127,1443.35 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1443.35,1447.29 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1456.5,1458.35 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1461.5,1461.14 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1447.29,1455.6 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1458.35,1460.6 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1469.37,1471.34 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1474.2,1474.39 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1479.2,1480.31 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1485.2,1488.80 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1471.34,1473.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1474.39,1476.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1480.31,1481.34 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1481.34,1483.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1488.80,1495.47 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1504.3,1505.50 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1495.47,1496.38 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1499.4,1501.12 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1496.38,1498.5 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1505.50,1509.4 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1520.43,1522.39 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1522.39,1527.27 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1533.3,1534.28 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1539.3,1541.31 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1548.3,1549.33 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1553.3,1553.51 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1567.3,1567.19 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1527.27,1531.4 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1534.28,1538.4 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1541.31,1547.4 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1549.33,1551.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1553.51,1555.30 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1562.4,1564.52 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1555.30,1561.5 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1567.19,1569.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1581.51,1581.68 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1582.51,1582.99 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1583.51,1583.78 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1595.78,1600.29 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1603.2,1603.11 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1600.29,1602.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1607.58,1610.2 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1612.36,1614.2 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1618.62,1619.58 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1622.2,1622.14 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1619.58,1621.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1626.48,1629.2 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1632.52,1633.58 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1633.58,1635.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1640.50,1641.21 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1648.2,1648.18 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1641.21,1643.36 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1646.3,1646.23 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1643.36,1645.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1652.48,1653.35 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1656.2,1656.16 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1653.35,1655.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1679.30,1684.2 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1689.117,1693.11 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1700.2,1700.12 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1693.11,1694.36 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1694.36,1695.28 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1695.28,1697.5 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1700.12,1701.37 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1701.37,1702.29 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1702.29,1704.5 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1710.61,1714.37 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1717.2,1717.24 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1714.37,1716.3 1 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1721.66,1726.2 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1729.67,1734.2 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1737.32,1742.2 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1745.37,1750.2 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1753.38,1758.2 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1761.32,1766.2 3 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1769.59,1776.11 5 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1776.11,1778.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1778.8,1780.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1784.45,1789.9 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1792.2,1792.9 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1796.2,1800.25 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1789.9,1791.3 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1792.9,1795.3 2 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1805.59,1810.34 4 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1817.2,1817.17 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1810.34,1811.28 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1811.28,1815.4 3 0 +github.com/ethereum/go-ethereum/core/tx_pool.go:1821.75,1823.73 2 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1829.2,1829.14 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1823.73,1824.40 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1827.3,1827.14 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1824.40,1826.4 1 1 +github.com/ethereum/go-ethereum/core/tx_pool.go:1833.42,1835.2 1 1 +github.com/ethereum/go-ethereum/core/evm.go:39.107,47.19 2 1 +github.com/ethereum/go-ethereum/core/evm.go:52.2,52.27 1 1 +github.com/ethereum/go-ethereum/core/evm.go:55.2,55.45 1 1 +github.com/ethereum/go-ethereum/core/evm.go:58.2,69.3 1 1 +github.com/ethereum/go-ethereum/core/evm.go:47.19,49.3 1 1 +github.com/ethereum/go-ethereum/core/evm.go:49.8,51.3 1 1 +github.com/ethereum/go-ethereum/core/evm.go:52.27,54.3 1 1 +github.com/ethereum/go-ethereum/core/evm.go:55.45,57.3 1 1 +github.com/ethereum/go-ethereum/core/evm.go:73.48,78.2 1 1 +github.com/ethereum/go-ethereum/core/evm.go:81.82,86.36 2 1 +github.com/ethereum/go-ethereum/core/evm.go:86.36,88.22 1 0 +github.com/ethereum/go-ethereum/core/evm.go:91.3,91.67 1 0 +github.com/ethereum/go-ethereum/core/evm.go:95.3,98.7 3 0 +github.com/ethereum/go-ethereum/core/evm.go:110.3,110.23 1 0 +github.com/ethereum/go-ethereum/core/evm.go:88.22,90.4 1 0 +github.com/ethereum/go-ethereum/core/evm.go:91.67,93.4 1 0 +github.com/ethereum/go-ethereum/core/evm.go:98.7,100.21 2 0 +github.com/ethereum/go-ethereum/core/evm.go:103.4,106.28 4 0 +github.com/ethereum/go-ethereum/core/evm.go:100.21,101.10 1 0 +github.com/ethereum/go-ethereum/core/evm.go:106.28,108.5 1 0 +github.com/ethereum/go-ethereum/core/evm.go:116.76,118.2 1 1 +github.com/ethereum/go-ethereum/core/evm.go:121.81,135.2 7 1 +github.com/ethereum/go-ethereum/core/state_processor.go:44.109,50.2 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:59.139,70.111 2 1 +github.com/ethereum/go-ethereum/core/state_processor.go:73.2,76.42 3 1 +github.com/ethereum/go-ethereum/core/state_processor.go:90.2,92.41 2 1 +github.com/ethereum/go-ethereum/core/state_processor.go:70.111,72.3 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:76.42,78.17 2 1 +github.com/ethereum/go-ethereum/core/state_processor.go:81.3,83.17 3 1 +github.com/ethereum/go-ethereum/core/state_processor.go:86.3,87.45 2 1 +github.com/ethereum/go-ethereum/core/state_processor.go:78.17,80.4 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:83.17,85.4 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:95.270,102.16 4 1 +github.com/ethereum/go-ethereum/core/state_processor.go:107.2,108.37 2 1 +github.com/ethereum/go-ethereum/core/state_processor.go:113.2,118.21 3 1 +github.com/ethereum/go-ethereum/core/state_processor.go:123.2,127.21 3 1 +github.com/ethereum/go-ethereum/core/state_processor.go:132.2,137.21 6 1 +github.com/ethereum/go-ethereum/core/state_processor.go:102.16,104.3 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:108.37,110.3 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:110.8,112.3 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:118.21,120.3 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:120.8,122.3 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:127.21,129.3 1 1 +github.com/ethereum/go-ethereum/core/state_processor.go:144.230,146.16 2 1 +github.com/ethereum/go-ethereum/core/state_processor.go:150.2,152.113 3 1 +github.com/ethereum/go-ethereum/core/state_processor.go:146.16,148.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:42.104,49.58 2 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:49.58,52.55 2 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:55.3,63.88 3 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:66.3,68.20 2 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:71.3,71.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:74.3,74.14 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:80.3,80.58 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:52.55,54.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:63.88,65.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:68.20,70.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:71.21,73.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:74.14,76.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:76.9,78.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:97.103,105.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:109.56,111.33 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:116.2,117.32 2 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:120.2,120.32 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:124.2,124.74 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:111.33,114.3 2 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:117.32,119.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:120.32,122.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:132.56,134.33 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:138.2,138.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:141.2,141.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:145.2,145.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:134.33,136.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:138.34,140.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:141.34,143.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:149.52,150.18 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:153.2,153.38 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:150.18,152.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:157.51,158.49 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:161.2,161.36 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:158.49,160.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:165.48,167.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:170.43,172.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_insert.go:175.43,177.2 1 0 +github.com/ethereum/go-ethereum/core/bor_fee_log.go:28.3,42.2 1 1 +github.com/ethereum/go-ethereum/core/bor_fee_log.go:57.3,71.2 1 1 +github.com/ethereum/go-ethereum/core/bor_fee_log.go:86.3,88.30 1 1 +github.com/ethereum/go-ethereum/core/bor_fee_log.go:92.2,101.31 3 1 +github.com/ethereum/go-ethereum/core/bor_fee_log.go:106.2,115.4 1 1 +github.com/ethereum/go-ethereum/core/bor_fee_log.go:88.30,90.3 1 1 +github.com/ethereum/go-ethereum/core/bor_fee_log.go:101.31,103.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:36.40,36.57 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:37.40,37.62 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:38.40,38.67 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:40.41,42.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:44.39,50.2 5 1 +github.com/ethereum/go-ethereum/core/tx_list.go:61.36,66.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:69.60,71.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:75.50,77.27 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:80.2,80.35 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:77.27,79.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:86.68,90.53 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:96.2,96.20 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:99.2,99.16 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:90.53,94.3 3 1 +github.com/ethereum/go-ethereum/core/tx_list.go:96.20,98.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:107.87,110.22 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:113.2,113.16 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:110.22,112.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:116.32,118.29 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:121.2,122.15 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:118.29,120.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:127.87,131.33 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:137.2,137.22 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:140.2,140.16 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:131.33,132.17 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:132.17,135.4 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:137.22,139.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:145.61,147.31 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:151.2,154.53 3 1 +github.com/ethereum/go-ethereum/core/tx_list.go:158.2,162.20 3 1 +github.com/ethereum/go-ethereum/core/tx_list.go:165.2,165.14 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:147.31,149.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:154.53,157.3 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:162.20,164.3 1 0 +github.com/ethereum/go-ethereum/core/tx_list.go:170.49,173.9 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:177.2,177.37 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:183.2,186.13 3 1 +github.com/ethereum/go-ethereum/core/tx_list.go:173.9,175.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:177.37,178.29 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:178.29,180.9 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:196.62,198.49 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:202.2,203.80 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:208.2,210.14 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:198.49,200.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:203.80,207.3 3 1 +github.com/ethereum/go-ethereum/core/tx_list.go:214.33,216.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:218.52,220.20 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:227.2,227.16 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:220.20,222.30 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:225.3,225.38 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:222.30,224.4 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:233.52,239.2 4 1 +github.com/ethereum/go-ethereum/core/tx_list.go:243.56,246.2 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:262.37,268.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:272.55,274.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:281.90,284.16 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:306.2,307.48 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:310.2,310.37 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:313.2,313.18 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:284.16,285.61 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:289.3,301.86 7 1 +github.com/ethereum/go-ethereum/core/tx_list.go:285.61,287.4 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:301.86,303.4 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:307.48,309.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:310.37,312.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:319.63,321.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:332.103,334.59 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:337.2,341.59 3 1 +github.com/ethereum/go-ethereum/core/tx_list.go:345.2,345.23 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:348.2,350.14 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:359.2,360.26 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:334.59,336.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:341.59,343.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:345.23,347.3 1 0 +github.com/ethereum/go-ethereum/core/tx_list.go:350.14,352.30 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:357.3,357.60 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:352.30,353.43 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:353.43,355.5 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:357.60,357.90 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:365.56,367.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:372.75,375.46 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:379.2,379.14 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:382.2,382.18 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:375.46,377.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:379.14,380.62 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:380.62,380.91 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:392.57,394.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:397.28,399.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:402.31,404.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:409.47,411.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:415.51,417.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:428.36,428.58 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:429.36,429.83 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:431.41,432.37 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:433.10,434.14 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:435.9,436.15 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:437.10,438.47 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:442.54,443.22 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:450.2,450.36 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:454.2,454.26 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:443.22,445.54 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:445.54,447.4 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:450.36,452.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:457.41,460.2 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:462.39,469.2 6 1 +github.com/ethereum/go-ethereum/core/tx_list.go:501.51,505.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:508.63,509.11 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:513.2,513.26 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:509.11,511.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:519.43,522.64 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:526.2,526.12 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:522.64,524.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:531.64,537.2 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:541.81,543.22 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:553.2,553.22 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:558.2,558.34 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:543.22,545.42 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:550.3,550.8 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:545.42,548.12 3 0 +github.com/ethereum/go-ethereum/core/tx_list.go:553.22,555.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:565.82,567.16 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:594.2,594.25 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:600.2,600.19 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:567.16,568.96 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:568.96,571.41 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:576.4,576.30 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:571.41,573.13 2 0 +github.com/ethereum/go-ethereum/core/tx_list.go:577.9,578.33 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:583.4,584.41 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:589.4,590.25 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:578.33,580.10 1 0 +github.com/ethereum/go-ethereum/core/tx_list.go:584.41,586.13 2 0 +github.com/ethereum/go-ethereum/core/tx_list.go:594.25,595.27 1 0 +github.com/ethereum/go-ethereum/core/tx_list.go:598.3,598.20 1 0 +github.com/ethereum/go-ethereum/core/tx_list.go:595.27,597.4 1 0 +github.com/ethereum/go-ethereum/core/tx_list.go:604.33,610.77 6 1 +github.com/ethereum/go-ethereum/core/tx_list.go:614.2,623.37 4 1 +github.com/ethereum/go-ethereum/core/tx_list.go:626.2,627.39 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:610.77,613.3 2 1 +github.com/ethereum/go-ethereum/core/tx_list.go:623.37,625.3 1 1 +github.com/ethereum/go-ethereum/core/tx_list.go:632.53,635.2 2 1 +github.com/ethereum/go-ethereum/core/bor_blockchain.go:10.76,11.54 1 1 +github.com/ethereum/go-ethereum/core/bor_blockchain.go:16.2,17.19 2 1 +github.com/ethereum/go-ethereum/core/bor_blockchain.go:22.2,23.20 2 1 +github.com/ethereum/go-ethereum/core/bor_blockchain.go:28.2,29.16 2 0 +github.com/ethereum/go-ethereum/core/bor_blockchain.go:11.54,13.3 1 0 +github.com/ethereum/go-ethereum/core/bor_blockchain.go:17.19,19.3 1 0 +github.com/ethereum/go-ethereum/core/bor_blockchain.go:23.20,25.3 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:40.52,40.74 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:41.52,41.66 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:51.43,55.2 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:59.78,61.57 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:65.2,66.16 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:69.2,73.15 3 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:76.2,82.44 3 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:90.2,94.6 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:114.2,116.16 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:61.57,63.3 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:66.16,68.3 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:73.15,73.39 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:82.44,83.32 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:83.32,84.18 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:84.18,87.5 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:94.6,97.42 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:107.3,109.52 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:97.42,98.21 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:101.4,101.23 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:104.4,104.9 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:98.21,100.5 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:101.23,103.5 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:109.52,112.4 2 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:120.63,121.27 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:124.2,124.55 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:127.2,127.12 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:121.27,123.3 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:124.55,126.3 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:132.83,134.27 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:141.2,142.16 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:145.2,146.26 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:155.2,158.68 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:161.2,162.16 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:165.2,168.12 3 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:134.27,135.48 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:138.3,138.23 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:135.48,137.4 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:142.16,144.3 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:146.26,147.26 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:153.3,153.24 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:147.26,148.53 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:148.53,151.5 2 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:158.68,160.3 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:162.16,164.3 1 0 +github.com/ethereum/go-ethereum/core/tx_journal.go:172.41,175.27 2 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:179.2,179.12 1 1 +github.com/ethereum/go-ethereum/core/tx_journal.go:175.27,178.3 2 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:36.52,41.2 1 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:45.54,51.36 3 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:54.2,54.25 1 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:51.36,53.3 1 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:59.61,64.2 3 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:68.68,72.36 3 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:75.2,75.31 1 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:78.2,78.26 1 1 +github.com/ethereum/go-ethereum/core/tx_noncer.go:72.36,74.3 1 0 +github.com/ethereum/go-ethereum/core/tx_noncer.go:75.31,77.3 1 0 +github.com/ethereum/go-ethereum/core/tx_noncer.go:82.60,87.2 3 1 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:49.78,57.2 3 0 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:61.102,65.2 3 0 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:69.81,73.2 3 0 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:77.39,79.44 2 0 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:86.2,86.22 1 0 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:79.44,81.17 2 0 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:84.3,84.87 1 0 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:81.17,83.4 1 0 +github.com/ethereum/go-ethereum/core/bloom_indexer.go:90.54,92.2 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:18.55,28.22 4 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:34.2,37.27 4 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:28.22,30.31 2 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:30.31,32.4 1 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:41.60,50.52 3 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:53.2,53.21 1 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:56.2,56.24 1 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:62.2,62.24 1 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:65.2,66.22 2 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:69.2,69.27 1 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:72.2,72.12 1 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:50.52,52.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:53.21,55.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:56.24,58.33 2 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:58.33,60.4 1 1 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:62.24,64.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:66.22,68.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis_account.go:69.27,71.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:75.58,77.49 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:80.2,81.25 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:84.2,84.12 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:77.49,79.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:81.25,83.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:89.71,91.16 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:94.2,94.33 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:102.2,103.16 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:106.2,107.16 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:110.2,110.18 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:91.16,93.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:94.33,98.43 4 1 +github.com/ethereum/go-ethereum/core/genesis.go:98.43,100.4 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:103.16,105.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:107.16,109.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:115.80,117.16 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:120.2,121.12 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:117.16,119.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:126.68,129.20 3 0 +github.com/ethereum/go-ethereum/core/genesis.go:158.2,159.12 2 0 +github.com/ethereum/go-ethereum/core/genesis.go:129.20,130.51 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:130.51,132.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:133.8,140.15 2 0 +github.com/ethereum/go-ethereum/core/genesis.go:152.3,152.21 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:141.34,142.35 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:143.34,144.42 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:145.34,146.42 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:147.33,148.41 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:149.34,150.42 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:152.21,154.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:154.9,156.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:196.56,198.20 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:201.2,202.56 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:206.2,206.12 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:198.20,200.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:202.56,205.3 2 0 +github.com/ethereum/go-ethereum/core/genesis.go:209.52,211.2 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:219.47,221.2 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:236.103,238.2 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:240.179,241.45 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:245.2,246.31 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:261.2,262.93 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:278.2,278.20 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:285.2,286.33 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:289.2,289.44 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:292.2,292.54 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:296.2,297.22 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:307.2,307.59 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:318.2,319.19 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:322.2,323.65 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:327.2,328.28 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:241.45,243.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:246.31,247.21 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:253.3,254.17 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:257.3,257.43 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:247.21,250.4 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:250.9,252.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:254.17,256.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:262.93,263.21 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:267.3,268.21 2 0 +github.com/ethereum/go-ethereum/core/genesis.go:271.3,272.17 2 0 +github.com/ethereum/go-ethereum/core/genesis.go:275.3,275.43 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:263.21,265.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:268.21,270.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:272.17,274.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:278.20,280.21 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:280.21,282.4 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:286.33,288.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:289.44,291.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:292.54,294.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:297.22,301.3 3 0 +github.com/ethereum/go-ethereum/core/genesis.go:307.59,309.34 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:312.3,312.45 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:309.34,311.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:312.45,314.4 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:319.19,321.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:323.65,325.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:331.74,332.9 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:333.16,334.18 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:335.42,336.35 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:337.42,338.35 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:339.42,340.35 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:341.42,342.35 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:343.41,344.34 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:345.41,346.34 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:347.45,348.38 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:349.39,350.42 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:351.10,352.41 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:358.59,359.15 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:362.2,363.16 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:366.2,380.21 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:383.2,383.57 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:386.2,386.55 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:393.2,393.68 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:359.15,361.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:363.16,364.13 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:380.21,382.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:383.57,385.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:386.55,387.23 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:387.23,389.4 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:389.9,391.4 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:398.67,400.32 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:403.2,404.19 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:407.2,407.54 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:410.2,410.53 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:413.2,413.56 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:416.2,424.19 9 1 +github.com/ethereum/go-ethereum/core/genesis.go:400.32,402.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:404.19,406.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:407.54,409.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:410.53,412.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:413.56,415.3 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:429.62,431.16 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:434.2,434.14 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:431.16,432.13 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:438.100,444.2 2 0 +github.com/ethereum/go-ethereum/core/genesis.go:447.37,456.2 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:459.44,468.2 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:471.44,480.2 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:483.43,492.2 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:495.43,506.2 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:509.47,520.2 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:523.44,533.2 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:535.41,538.58 3 0 +github.com/ethereum/go-ethereum/core/genesis.go:541.2,541.10 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:538.58,539.13 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:545.92,573.2 3 0 +github.com/ethereum/go-ethereum/core/genesis.go:575.47,577.77 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:580.2,581.28 2 1 +github.com/ethereum/go-ethereum/core/genesis.go:584.2,584.11 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:577.77,578.13 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:581.28,583.3 1 1 +github.com/ethereum/go-ethereum/core/genesis.go:587.49,589.16 2 0 +github.com/ethereum/go-ethereum/core/genesis.go:592.2,596.16 5 0 +github.com/ethereum/go-ethereum/core/genesis.go:599.2,599.11 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:589.16,590.87 1 0 +github.com/ethereum/go-ethereum/core/genesis.go:596.16,597.88 1 0 +github.com/ethereum/go-ethereum/core/forkchoice.go:59.99,62.16 2 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:65.2,69.3 1 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:62.16,64.3 1 0 +github.com/ethereum/go-ethereum/core/forkchoice.go:77.93,82.39 2 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:88.2,88.91 1 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:94.2,95.42 2 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:107.2,107.19 1 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:82.39,84.3 1 0 +github.com/ethereum/go-ethereum/core/forkchoice.go:88.91,90.3 1 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:95.42,97.26 2 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:97.26,99.4 1 0 +github.com/ethereum/go-ethereum/core/forkchoice.go:99.9,99.34 1 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:99.34,101.25 2 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:104.4,104.74 1 1 +github.com/ethereum/go-ethereum/core/forkchoice.go:101.25,103.5 1 0 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:39.111,45.2 1 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:50.114,60.42 3 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:80.2,80.15 1 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:60.42,62.60 1 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:66.3,67.17 2 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:70.3,71.91 2 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:75.3,75.17 1 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:62.60,64.4 1 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:67.17,69.4 1 0 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:71.91,73.4 1 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:75.17,77.4 1 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:80.15,82.3 1 1 +github.com/ethereum/go-ethereum/core/state_prefetcher.go:88.156,94.2 3 1 +github.com/ethereum/go-ethereum/core/state_transition.go:92.47,94.2 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:97.46,97.74 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:101.48,102.23 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:105.2,105.44 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:102.23,104.3 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:110.48,111.43 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:114.2,114.44 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:111.43,113.3 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:118.131,121.39 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:127.2,127.19 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:151.2,151.23 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:155.2,155.17 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:121.39,123.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:123.8,125.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:127.19,130.28 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:136.3,137.16 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:140.3,140.43 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:143.3,146.52 3 1 +github.com/ethereum/go-ethereum/core/state_transition.go:149.3,149.34 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:130.28,131.16 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:131.16,133.5 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:137.16,139.4 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:140.43,142.4 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:146.52,148.4 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:151.23,154.3 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:159.81,171.2 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:180.84,182.2 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:185.48,186.65 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:189.2,189.21 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:186.65,188.3 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:192.43,196.25 4 1 +github.com/ethereum/go-ethereum/core/state_transition.go:201.2,201.88 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:204.2,204.51 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:207.2,211.12 4 1 +github.com/ethereum/go-ethereum/core/state_transition.go:196.25,200.3 3 1 +github.com/ethereum/go-ethereum/core/state_transition.go:201.88,203.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:204.51,206.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:214.45,216.22 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:236.2,236.63 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:259.2,259.20 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:216.22,219.53 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:230.3,230.112 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:219.53,222.4 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:222.9,222.32 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:222.32,225.4 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:225.9,225.33 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:225.33,228.4 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:230.112,233.4 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:236.63,238.89 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:238.89,239.43 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:243.4,243.43 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:247.4,247.42 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:253.4,253.52 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:239.43,242.5 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:243.43,246.5 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:247.42,250.5 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:253.52,256.5 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:275.69,290.38 3 1 +github.com/ethereum/go-ethereum/core/state_transition.go:293.2,302.16 8 1 +github.com/ethereum/go-ethereum/core/state_transition.go:305.2,305.18 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:308.2,311.94 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:316.2,316.115 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:319.2,323.22 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:331.2,331.13 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:338.2,339.12 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:342.2,343.12 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:348.2,371.8 5 1 +github.com/ethereum/go-ethereum/core/state_transition.go:290.38,292.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:302.16,304.3 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:305.18,307.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:311.94,313.3 1 0 +github.com/ethereum/go-ethereum/core/state_transition.go:316.115,318.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:323.22,325.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:325.8,329.3 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:331.13,334.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:334.8,337.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:339.12,341.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:343.12,347.3 3 1 +github.com/ethereum/go-ethereum/core/state_transition.go:374.61,377.35 2 1 +github.com/ethereum/go-ethereum/core/state_transition.go:380.2,388.22 4 1 +github.com/ethereum/go-ethereum/core/state_transition.go:377.35,379.3 1 1 +github.com/ethereum/go-ethereum/core/state_transition.go:392.45,394.2 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:49.53,54.31 2 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:57.2,57.15 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:54.31,56.3 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:62.39,63.33 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:63.33,64.48 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:64.48,66.4 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:73.86,75.19 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:79.2,80.24 2 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:83.2,83.29 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:75.19,77.3 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:80.24,82.3 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:83.29,89.3 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:95.93,97.31 2 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:100.2,101.31 2 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:104.2,104.29 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:97.31,99.3 1 1 +github.com/ethereum/go-ethereum/core/tx_cacher.go:101.31,103.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:223.235,224.24 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:227.2,266.16 15 1 +github.com/ethereum/go-ethereum/core/blockchain.go:269.2,270.28 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:274.2,281.16 5 1 +github.com/ethereum/go-ethereum/core/blockchain.go:290.2,290.43 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:295.2,296.75 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:324.2,324.63 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:360.2,360.30 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:376.2,376.38 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:392.2,396.26 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:404.2,404.43 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:416.2,416.16 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:224.24,226.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:266.16,268.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:270.28,272.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:281.16,286.17 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:286.17,288.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:290.43,292.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:296.75,301.39 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:304.3,304.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:301.39,303.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:304.34,308.18 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:312.4,312.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:308.18,310.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:312.21,314.5 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:315.9,317.89 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:317.89,319.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:324.63,333.105 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:340.3,341.59 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:347.3,347.17 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:333.105,336.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:341.59,343.47 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:343.47,345.5 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:347.17,349.42 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:349.42,351.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:360.30,361.56 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:361.56,365.71 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:365.71,367.66 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:370.5,370.72 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:367.66,369.6 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:376.38,384.98 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:388.3,388.148 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:384.98,387.4 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:396.26,401.3 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:404.43,405.54 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:409.3,411.13 3 0 +github.com/ethereum/go-ethereum/core/blockchain.go:405.54,408.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:411.13,414.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:423.36,425.138 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:430.2,430.13 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:425.138,426.22 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:426.22,428.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:435.45,438.29 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:444.2,445.25 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:451.2,456.70 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:461.2,467.73 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:474.2,483.61 8 1 +github.com/ethereum/go-ethereum/core/blockchain.go:486.2,486.12 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:438.29,442.3 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:445.25,449.3 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:456.70,457.56 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:457.56,459.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:467.73,468.53 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:468.53,471.4 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:483.61,485.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:492.50,495.2 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:505.101,506.27 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:509.2,519.81 5 1 +github.com/ethereum/go-ethereum/core/blockchain.go:612.2,612.71 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:636.2,636.12 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:647.2,655.39 8 1 +github.com/ethereum/go-ethereum/core/blockchain.go:506.27,508.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:519.81,523.115 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:585.3,585.130 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:600.3,606.22 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:609.3,609.20 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:523.115,525.27 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:575.4,582.58 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:525.27,528.5 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:528.10,534.9 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:534.9,536.79 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:539.6,539.87 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:554.6,554.53 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:571.6,572.87 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:536.79,538.7 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:539.87,541.60 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:541.60,543.25 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:547.8,548.38 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:543.25,545.17 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:549.13,552.8 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:554.53,555.40 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:568.7,569.12 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:555.40,561.48 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:561.48,562.81 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:565.9,565.55 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:562.81,564.10 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:585.130,588.31 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:591.4,598.66 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:588.31,590.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:606.22,608.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:612.71,615.22 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:615.22,618.50 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:622.4,622.38 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:618.50,620.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:623.9,631.4 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:636.12,637.74 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:637.74,639.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:640.8,645.3 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:660.66,663.18 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:666.2,666.80 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:671.2,671.27 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:674.2,680.21 4 0 +github.com/ethereum/go-ethereum/core/blockchain.go:683.2,684.12 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:663.18,665.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:666.80,668.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:671.27,673.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:680.21,682.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:688.37,690.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:694.73,696.38 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:699.2,699.27 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:702.2,708.38 5 0 +github.com/ethereum/go-ethereum/core/blockchain.go:711.2,721.12 9 0 +github.com/ethereum/go-ethereum/core/blockchain.go:696.38,698.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:699.27,701.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:708.38,710.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:725.49,727.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:730.77,731.27 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:734.2,736.18 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:739.2,742.36 3 0 +github.com/ethereum/go-ethereum/core/blockchain.go:755.2,755.12 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:731.27,733.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:736.18,738.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:742.36,744.19 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:747.3,747.44 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:750.3,750.47 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:744.19,746.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:747.44,749.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:750.47,753.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:764.58,774.38 7 1 +github.com/ethereum/go-ethereum/core/blockchain.go:778.2,784.49 5 1 +github.com/ethereum/go-ethereum/core/blockchain.go:774.38,776.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:789.30,790.52 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:795.2,812.21 7 1 +github.com/ethereum/go-ethereum/core/blockchain.go:824.2,824.39 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:852.2,852.43 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:856.2,856.32 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:790.52,792.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:812.21,814.77 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:814.77,816.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:824.39,827.60 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:837.3,837.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:843.3,843.26 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:846.3,846.42 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:827.60,828.64 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:828.64,832.67 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:832.67,834.6 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:837.34,839.61 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:839.61,841.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:843.26,845.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:846.42,848.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:852.43,855.3 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:862.36,864.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:867.44,869.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:871.42,873.46 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:878.2,878.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:873.46,874.56 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:874.56,876.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:878.21,879.42 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:883.3,883.25 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:879.42,881.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:883.25,885.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:900.132,911.39 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:927.2,935.45 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:962.2,962.92 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1074.2,1074.89 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1129.2,1129.28 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1138.2,1138.72 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1150.2,1150.25 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1159.2,1165.23 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1168.2,1170.15 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:911.39,912.13 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:920.3,920.48 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:912.13,913.122 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:913.122,918.5 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:920.48,922.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:922.9,924.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:935.45,936.28 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:939.3,942.56 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:955.3,955.15 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:936.28,938.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:942.56,944.18 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:950.4,953.15 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:944.18,947.5 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:947.10,947.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:947.21,949.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:962.92,967.29 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:983.3,983.51 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:988.3,989.36 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:994.3,997.17 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1013.3,1014.36 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1036.3,1036.38 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1040.3,1041.49 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1051.3,1053.36 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1062.3,1062.93 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1067.3,1067.39 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1070.3,1070.16 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:967.29,968.50 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:968.50,973.19 5 1 +github.com/ethereum/go-ethereum/core/blockchain.go:977.5,977.42 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:973.19,976.6 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:983.51,985.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:989.36,991.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:997.17,1000.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1014.36,1015.119 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1020.4,1022.74 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1015.119,1017.5 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1017.10,1017.50 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1017.50,1019.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1022.74,1024.40 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1031.5,1031.18 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1024.40,1026.62 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1029.6,1029.19 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1026.62,1028.7 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1036.38,1038.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1041.49,1044.68 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1047.4,1047.34 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1044.68,1046.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1053.36,1055.30 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1058.4,1059.74 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1055.30,1056.13 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1062.93,1063.48 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1063.48,1065.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1067.39,1069.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1074.89,1077.36 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1118.3,1118.28 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1124.3,1125.16 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1077.36,1079.26 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1083.4,1083.54 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1086.4,1086.26 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1099.4,1106.49 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1113.4,1113.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1079.26,1081.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1083.54,1085.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1086.26,1088.53 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1088.53,1090.14 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1091.11,1096.6 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1106.49,1107.41 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1110.5,1111.18 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1107.41,1109.6 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1118.28,1120.40 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1120.40,1122.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1129.28,1130.73 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1130.73,1131.38 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1134.4,1134.17 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1131.38,1133.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1138.72,1142.56 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1142.56,1143.65 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1143.65,1145.5 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1145.10,1147.5 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1150.25,1151.64 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1151.64,1152.38 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1155.4,1155.17 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1152.38,1154.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1165.23,1167.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1178.91,1179.24 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1183.2,1186.38 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1189.2,1189.12 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1179.24,1181.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1186.38,1188.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1194.65,1196.42 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1201.2,1202.12 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1196.42,1197.50 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1197.50,1199.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1207.153,1210.16 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1214.2,1235.24 8 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1258.2,1259.43 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1263.2,1264.16 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1267.2,1270.38 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1319.2,1319.27 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1210.16,1212.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1235.24,1236.51 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1240.3,1240.33 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1236.51,1238.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1240.33,1255.4 4 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1259.43,1261.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1264.16,1266.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1270.38,1272.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1272.8,1277.60 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1277.60,1283.43 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1287.4,1290.48 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1309.4,1309.27 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1283.43,1285.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1290.48,1294.22 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1294.22,1296.6 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1296.11,1299.89 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1303.6,1305.19 3 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1299.89,1301.7 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1309.27,1311.33 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1315.5,1315.43 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1311.33,1313.11 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1323.184,1324.27 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1327.2,1329.77 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1324.27,1326.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1335.184,1337.91 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1340.2,1342.16 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1345.2,1345.11 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1357.2,1357.27 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1360.2,1362.27 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1394.2,1394.20 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1337.91,1339.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1342.16,1344.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1345.11,1347.48 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1352.3,1352.23 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1347.48,1348.56 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1348.56,1350.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1353.8,1355.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1357.27,1359.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1362.27,1364.20 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1369.3,1369.29 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1378.3,1378.20 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1364.20,1366.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1369.29,1371.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1378.20,1381.42 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1381.42,1383.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1386.8,1393.3 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1403.64,1405.24 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1408.2,1408.46 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1412.2,1413.12 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1405.24,1407.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1408.46,1411.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1420.68,1422.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1425.2,1429.34 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1444.2,1444.27 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1447.2,1448.42 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1422.21,1424.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1429.34,1431.83 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1431.83,1441.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1444.27,1446.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1459.95,1461.24 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1466.2,1473.15 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1479.2,1482.30 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1486.2,1494.27 5 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1543.2,1543.9 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1580.2,1581.15 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1592.2,1594.22 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1607.2,1607.92 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1801.2,1805.62 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1818.2,1820.22 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1461.24,1463.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1473.15,1474.71 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1474.71,1476.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1482.30,1485.3 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1494.27,1504.45 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1532.3,1532.45 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1504.45,1506.18 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1509.4,1509.13 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1519.4,1522.26 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1506.18,1508.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1509.13,1515.106 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1515.106,1516.11 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1532.45,1534.52 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1537.4,1539.26 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1534.52,1536.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1545.51,1546.14 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1556.151,1557.87 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1564.3,1568.23 3 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1573.52,1577.23 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1546.14,1550.4 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1550.9,1554.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1557.87,1559.51 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1562.4,1562.26 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1559.51,1561.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1581.15,1586.25 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1586.25,1588.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1594.22,1596.28 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1600.3,1604.30 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1596.28,1599.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1607.92,1609.25 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1614.3,1614.30 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1624.3,1624.28 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1659.3,1661.20 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1664.3,1665.17 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1670.3,1676.42 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1692.3,1694.17 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1700.3,1700.41 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1706.3,1720.87 12 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1725.3,1735.15 7 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1741.3,1742.17 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1746.3,1760.15 10 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1765.3,1765.28 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1772.3,1772.17 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1609.25,1611.9 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1614.30,1617.4 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1624.28,1626.36 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1629.4,1641.38 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1647.4,1647.52 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1650.4,1655.12 3 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1626.36,1628.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1641.38,1643.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1643.10,1646.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1647.52,1649.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1661.20,1663.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1665.17,1667.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1676.42,1677.65 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1677.65,1680.98 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1680.98,1684.43 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1684.43,1686.7 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1694.17,1698.4 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1700.41,1702.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1720.87,1724.4 3 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1735.15,1738.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1738.9,1740.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1742.17,1744.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1760.15,1762.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1765.28,1767.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1767.9,1769.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1773.20,1782.25 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1784.19,1788.26 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1790.11,1796.26 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1805.62,1806.50 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1809.3,1811.94 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1806.50,1808.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1811.94,1812.51 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1815.4,1815.18 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1812.51,1814.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1830.92,1841.92 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1893.2,1894.16 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1897.2,1897.12 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1903.2,1908.49 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1914.2,1914.19 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1918.2,1922.40 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1946.2,1946.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1950.2,1950.15 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1841.92,1843.65 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1870.3,1870.22 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1873.3,1875.52 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1885.3,1885.20 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1843.65,1845.60 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1854.4,1854.60 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1845.60,1852.13 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1854.60,1868.5 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1870.22,1872.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1875.52,1877.69 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1880.4,1883.26 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1877.69,1879.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1894.16,1896.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1897.12,1901.3 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1908.49,1913.3 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1914.19,1916.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1922.40,1932.51 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1932.51,1934.65 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1937.4,1940.26 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1934.65,1936.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1940.26,1943.5 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1946.21,1949.3 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:1956.66,1963.51 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1974.2,1974.19 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1978.2,1978.40 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1994.2,1994.12 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1963.51,1969.25 4 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1969.25,1972.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1974.19,1976.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1978.40,1980.25 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1984.3,1985.13 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1990.3,1990.74 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1980.25,1983.4 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1985.13,1987.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1987.9,1989.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:1990.74,1992.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2000.80,2002.19 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2005.2,2009.23 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2013.2,2014.35 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2023.2,2023.13 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2002.19,2004.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2009.23,2011.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2014.35,2015.36 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2015.36,2017.15 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2020.4,2020.27 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2017.15,2019.5 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2027.64,2029.13 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2038.2,2038.12 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2029.13,2030.39 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2030.39,2032.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2033.8,2034.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2034.34,2036.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2046.68,2059.49 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2077.2,2077.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2080.2,2080.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2085.2,2085.6 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2113.2,2113.44 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2144.2,2144.42 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2158.2,2159.62 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2163.2,2164.29 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2171.2,2171.45 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2178.2,2178.26 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2181.2,2181.26 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2184.2,2184.23 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2189.2,2189.12 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2059.49,2061.144 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2061.144,2067.21 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2067.21,2069.5 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2071.8,2073.144 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2073.144,2075.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2077.21,2079.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2080.21,2082.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2085.6,2087.41 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2092.3,2097.20 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2100.3,2104.22 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2107.3,2108.22 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2087.41,2089.9 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2097.20,2099.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2104.22,2106.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2108.22,2110.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2113.44,2123.25 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2127.3,2131.26 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2123.25,2126.4 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2132.8,2132.30 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2132.30,2137.3 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2137.8,2141.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2144.42,2150.20 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2154.3,2154.61 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2150.20,2152.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2159.62,2161.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2164.29,2166.30 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2169.3,2169.45 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2166.30,2167.9 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2171.45,2173.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2178.26,2180.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2181.26,2183.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2184.23,2185.43 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2185.43,2187.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2197.75,2198.27 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2201.2,2204.12 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2198.27,2200.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2211.61,2212.27 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2215.2,2219.51 3 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2224.2,2229.19 4 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2232.2,2240.88 3 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2243.2,2244.12 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2212.27,2214.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2219.51,2220.59 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2220.59,2222.4 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2229.19,2231.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2240.88,2242.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2247.44,2251.6 4 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2251.6,2252.10 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2253.24,2254.25 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2255.18,2256.10 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2263.69,2267.36 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2272.2,2272.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2275.2,2280.43 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2287.2,2287.44 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2292.2,2292.35 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2296.2,2296.42 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2299.2,2299.14 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2267.36,2269.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2272.21,2274.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2280.43,2282.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2287.44,2289.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2289.8,2289.74 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2289.74,2291.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2292.35,2294.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2296.42,2298.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2312.56,2319.18 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2328.2,2328.69 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2368.2,2373.16 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2376.2,2378.6 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2319.18,2321.59 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2324.3,2324.58 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2321.59,2323.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2328.69,2329.16 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2333.3,2333.18 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2344.3,2344.55 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2358.3,2358.38 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2329.16,2329.38 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2333.18,2334.56 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2341.4,2341.10 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2334.56,2337.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2337.10,2340.5 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2344.55,2345.17 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2355.4,2355.10 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2345.17,2350.21 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2353.5,2353.52 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2350.21,2352.6 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2358.38,2361.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2361.9,2364.4 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2373.16,2375.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2378.6,2379.10 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2380.25,2381.19 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2385.15,2386.14 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2387.18,2388.19 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2392.4,2392.10 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2381.19,2384.5 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2388.19,2391.5 2 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2398.91,2402.35 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2407.2,2417.70 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2402.35,2406.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2428.92,2429.21 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2432.2,2433.71 2 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2437.2,2437.27 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2440.2,2442.15 3 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2429.21,2431.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain.go:2433.71,2435.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain.go:2437.27,2439.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:36.53,38.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:42.51,44.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:48.55,50.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:54.71,56.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:60.80,62.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:66.71,68.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:72.70,74.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:78.75,80.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:84.61,86.46 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:90.2,91.19 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:94.2,95.17 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:99.2,100.13 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:86.46,89.3 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:91.19,93.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:95.17,97.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:105.65,107.49 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:110.2,111.19 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:114.2,115.20 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:119.2,120.13 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:107.49,109.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:111.19,113.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:115.20,117.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:124.70,125.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:128.2,128.43 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:125.34,127.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:132.74,133.32 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:136.2,136.37 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:139.2,139.47 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:133.32,135.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:136.37,138.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:144.78,146.46 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:149.2,150.18 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:154.2,155.14 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:146.46,148.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:150.18,152.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:159.69,161.19 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:164.2,164.35 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:161.19,163.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:169.68,171.29 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:174.2,174.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:171.29,173.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:179.90,181.19 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:184.2,184.25 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:193.2,193.8 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:181.19,183.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:184.25,186.19 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:189.3,191.12 3 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:186.19,187.9 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:197.74,198.52 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:201.2,202.19 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:205.2,206.21 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:209.2,210.17 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:198.52,200.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:202.19,204.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:206.21,208.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:215.88,217.46 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:221.2,221.15 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:217.46,220.3 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:225.67,227.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:234.125,236.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:240.89,242.56 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:245.2,246.15 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:249.2,251.15 3 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:242.56,244.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:246.15,248.3 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:256.71,258.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:261.55,264.2 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:268.78,271.18 2 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:274.2,274.34 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:271.18,273.3 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:279.66,281.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:285.70,287.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:294.80,299.2 2 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:302.55,304.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:307.73,309.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:312.52,312.77 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:315.49,315.69 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:318.50,320.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:323.45,325.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:328.45,330.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:333.51,335.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:338.41,340.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:343.46,345.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:348.48,350.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:354.54,356.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:360.46,362.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:365.96,367.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:370.84,372.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:375.92,377.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:380.94,382.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:385.92,387.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:390.85,392.2 1 1 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:396.88,398.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:405.70,407.2 1 0 +github.com/ethereum/go-ethereum/core/blockchain_reader.go:410.92,412.2 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:53.53,54.22 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:60.2,61.52 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:54.22,55.21 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:58.3,58.41 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:55.21,56.60 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:65.42,67.2 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:70.53,72.2 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:77.49,79.2 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:89.49,91.2 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:101.74,102.22 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:105.2,107.16 3 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:110.2,111.42 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:102.22,104.3 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:107.16,108.13 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:115.61,117.2 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:124.58,126.2 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:129.38,131.2 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:134.39,136.2 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:143.64,145.2 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:149.56,150.28 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:153.2,153.33 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:150.28,151.34 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:157.46,162.32 3 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:168.2,173.33 4 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:180.2,180.32 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:162.32,163.40 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:163.40,165.9 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:173.33,175.40 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:175.40,178.4 2 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:186.54,187.18 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:190.2,190.17 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:193.2,193.23 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:187.18,188.75 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:190.17,192.3 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:199.46,201.45 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:204.2,205.94 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:201.45,202.35 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:220.181,221.19 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:224.2,226.102 3 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:274.2,274.25 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:284.2,284.25 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:221.19,223.3 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:226.102,233.33 3 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:243.3,243.55 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:251.3,251.107 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:255.3,255.17 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:258.3,258.22 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:272.3,272.18 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:233.33,234.45 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:234.45,237.5 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:237.10,240.5 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:243.55,245.76 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:245.76,246.30 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:246.30,248.6 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:251.107,253.4 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:255.17,257.4 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:258.22,264.18 3 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:267.4,267.79 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:270.4,270.28 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:264.18,265.53 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:267.79,268.52 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:274.25,276.17 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:279.3,282.17 4 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:276.17,277.14 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:287.128,289.24 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:294.2,308.44 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:315.2,315.15 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:289.24,291.3 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:291.8,293.3 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:308.44,310.48 2 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:310.48,313.4 2 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:319.121,322.31 3 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:325.2,325.16 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:322.31,324.3 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:329.118,330.101 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:333.2,333.15 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:330.101,332.3 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:341.57,343.2 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:345.85,345.99 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:346.85,346.99 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:347.85,347.99 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:348.85,348.99 1 1 +github.com/ethereum/go-ethereum/core/chain_makers.go:349.85,349.99 1 0 +github.com/ethereum/go-ethereum/core/chain_makers.go:350.85,350.99 1 1 +github.com/ethereum/go-ethereum/core/gen_genesis.go:19.48,44.20 11 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:50.2,54.27 5 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:44.20,46.29 2 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:46.29,48.4 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:58.53,75.52 3 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:78.2,78.23 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:81.2,81.22 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:84.2,84.26 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:87.2,87.26 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:90.2,90.25 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:93.2,94.27 2 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:97.2,98.24 2 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:101.2,101.25 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:104.2,104.22 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:107.2,108.30 2 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:111.2,111.23 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:114.2,114.24 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:117.2,117.27 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:120.2,120.24 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:123.2,123.12 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:75.52,77.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:78.23,80.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:81.22,83.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:84.26,86.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:87.26,89.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:90.25,92.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:94.27,96.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:98.24,100.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:101.25,103.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:104.22,106.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:108.30,110.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:111.23,113.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:114.24,116.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:117.27,119.3 1 0 +github.com/ethereum/go-ethereum/core/gen_genesis.go:120.24,122.3 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:40.117,47.2 2 1 +github.com/ethereum/go-ethereum/core/block_validator.go:52.65,54.60 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:58.2,59.59 2 1 +github.com/ethereum/go-ethereum/core/block_validator.go:62.2,62.75 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:65.2,65.98 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:68.2,68.69 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:74.2,74.12 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:54.60,56.3 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:59.59,61.3 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:62.75,64.3 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:65.98,67.3 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:68.69,69.62 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:72.3,72.37 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:69.62,71.4 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:81.131,83.32 2 1 +github.com/ethereum/go-ethereum/core/block_validator.go:88.2,89.28 2 1 +github.com/ethereum/go-ethereum/core/block_validator.go:93.2,94.38 2 1 +github.com/ethereum/go-ethereum/core/block_validator.go:99.2,99.93 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:102.2,102.12 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:83.32,85.3 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:89.28,91.3 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:94.38,96.3 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:99.93,101.3 1 0 +github.com/ethereum/go-ethereum/core/block_validator.go:108.63,111.39 3 1 +github.com/ethereum/go-ethereum/core/block_validator.go:115.2,115.26 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:122.2,122.26 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:128.2,128.14 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:111.39,113.3 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:115.26,117.27 2 1 +github.com/ethereum/go-ethereum/core/block_validator.go:120.3,120.15 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:117.27,119.4 1 1 +github.com/ethereum/go-ethereum/core/block_validator.go:122.26,124.27 2 1 +github.com/ethereum/go-ethereum/core/block_validator.go:124.27,126.4 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:103.177,122.2 5 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:130.73,135.69 3 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:138.2,142.33 4 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:135.69,137.3 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:148.55,153.2 3 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:157.38,165.31 5 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:169.2,169.39 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:176.2,176.35 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:182.2,182.9 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:165.31,167.3 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:169.39,171.32 2 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:171.32,173.4 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:176.35,177.39 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:177.39,179.4 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:183.22,184.13 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:186.22,187.17 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:189.10,190.32 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:197.115,210.6 5 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:210.6,211.10 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:212.25,215.10 2 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:217.27,219.11 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:224.4,225.37 2 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:235.4,237.48 2 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:219.11,223.5 3 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:225.37,229.83 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:229.83,230.80 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:230.80,232.7 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:243.57,248.11 3 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:277.2,278.27 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:248.11,252.35 3 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:255.3,255.36 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:258.3,258.30 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:262.3,262.32 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:266.3,268.28 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:274.3,274.9 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:252.35,254.4 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:255.36,257.4 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:258.30,260.4 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:262.32,264.4 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:268.28,270.37 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:270.37,272.5 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:278.27,280.38 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:283.3,283.33 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:280.38,282.4 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:283.33,284.46 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:292.4,294.11 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:284.46,287.39 2 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:287.39,290.6 2 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:295.32,295.32 0 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:296.12,296.12 0 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:304.37,310.6 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:310.6,311.10 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:312.25,315.10 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:317.19,320.42 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:371.4,371.42 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:379.4,379.19 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:320.42,322.44 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:330.5,333.20 4 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:337.5,339.19 3 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:348.5,351.76 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:322.44,323.46 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:327.6,327.26 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:323.46,326.7 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:333.20,335.6 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:339.19,340.13 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:346.6,346.60 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:341.26,343.13 2 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:344.14,344.14 0 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:351.76,354.57 3 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:358.6,359.39 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:354.57,357.7 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:359.39,362.7 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:363.11,368.6 3 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:371.42,372.41 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:372.41,373.13 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:374.34,374.34 0 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:375.14,375.14 0 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:388.98,392.66 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:397.2,397.86 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:413.2,413.43 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:416.2,416.22 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:392.66,395.3 2 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:397.86,399.30 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:402.3,403.20 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:408.3,408.58 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:411.3,411.27 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:399.30,401.4 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:403.20,405.4 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:405.9,405.43 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:405.43,407.4 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:408.58,410.4 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:413.43,415.3 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:422.41,423.70 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:423.70,424.112 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:427.3,427.43 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:424.112,426.4 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:434.65,440.2 4 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:443.63,444.18 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:447.2,454.32 5 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:459.2,459.18 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:444.18,445.50 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:454.32,458.3 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:459.18,461.3 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:465.54,467.2 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:471.44,473.20 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:473.20,475.3 1 0 +github.com/ethereum/go-ethereum/core/chain_indexer.go:479.58,486.34 4 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:490.2,490.29 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:486.34,489.3 2 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:495.64,500.37 4 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:503.2,503.22 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:500.37,502.3 1 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:508.73,513.2 3 1 +github.com/ethereum/go-ethereum/core/chain_indexer.go:517.58,522.2 3 1 diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index b922ff9c41..7768b0fc9c 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -40,6 +40,8 @@ func TestInsertingSpanSizeBlocks(t *testing.T) { h, heimdallSpan, ctrl := getMockedHeimdallClient(t) defer ctrl.Finish() + h.EXPECT().FetchLatestCheckpoint().Return(&bor.Checkpoint{}, nil).AnyTimes() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() From 01b6d6cb72160a6ade8260861df4065cbb1669c3 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 3 Jun 2022 13:48:08 +0300 Subject: [PATCH 124/190] fix --- cover.out | 36702 ---------------------------------------------------- 1 file changed, 36702 deletions(-) delete mode 100644 cover.out diff --git a/cover.out b/cover.out deleted file mode 100644 index 0a5f97fd58..0000000000 --- a/cover.out +++ /dev/null @@ -1,36702 +0,0 @@ -mode: set -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:20.37,21.23 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:24.2,24.32 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:21.23,23.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:29.41,31.16 2 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:34.2,35.11 2 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:43.2,43.38 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:46.2,46.10 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:31.16,33.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:35.11,39.26 4 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:39.26,41.4 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:43.38,45.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:51.41,53.16 2 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:56.2,56.25 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:59.2,59.10 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:53.16,55.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:56.25,58.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:64.37,65.23 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:68.2,68.32 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:65.23,67.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:73.41,75.16 2 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:78.2,79.11 2 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:87.2,87.38 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:90.2,90.10 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:75.16,77.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:79.11,83.26 4 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:83.26,85.4 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:87.38,89.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:95.41,97.16 2 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:100.2,100.25 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:103.2,103.10 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:97.16,99.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:100.25,102.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:108.36,109.23 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:112.2,112.31 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:109.23,111.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:117.40,119.16 2 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:122.2,123.11 2 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:131.2,131.38 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:134.2,134.10 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:119.16,121.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:123.11,127.26 4 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:127.26,129.4 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:131.38,133.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:139.40,141.16 2 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:144.2,144.25 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:147.2,147.10 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:141.16,143.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:144.25,146.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:151.31,152.23 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:155.2,155.25 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:152.23,154.3 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:160.35,163.11 3 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:171.2,171.38 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:176.2,176.14 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:163.11,165.26 2 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:165.26,166.18 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:166.18,168.5 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:171.38,172.16 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:172.16,174.4 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:181.35,182.30 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:187.2,187.14 1 0 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:182.30,183.16 1 1 -github.com/ethereum/go-ethereum/common/bitutil/bitutil.go:183.16,185.4 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:60.40,61.58 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:64.2,66.12 3 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:61.58,63.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:71.44,73.20 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:77.2,77.20 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:84.2,87.25 3 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:93.2,93.28 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:96.2,96.66 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:73.20,75.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:77.20,78.19 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:81.3,81.14 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:78.19,80.4 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:87.25,88.13 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:88.13,91.4 2 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:93.28,95.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:102.63,103.24 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:106.2,106.25 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:111.2,111.40 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:103.24,105.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:106.25,110.3 3 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:115.65,117.16 2 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:120.2,120.23 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:123.2,123.17 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:117.16,119.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:120.23,122.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:130.77,132.17 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:136.2,137.20 2 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:140.2,140.17 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:148.2,149.16 2 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:152.2,152.44 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:169.2,169.25 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:132.17,134.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:137.20,139.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:140.17,142.19 2 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:145.3,145.24 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:142.19,144.4 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:149.16,151.3 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:152.44,153.47 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:153.47,155.24 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:158.4,158.24 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:162.4,162.22 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:165.4,166.9 2 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:155.24,157.5 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:158.24,160.5 1 1 -github.com/ethereum/go-ethereum/common/bitutil/compress.go:162.22,164.5 1 1 -github.com/ethereum/go-ethereum/accounts/accounts.go:184.35,187.2 2 1 -github.com/ethereum/go-ethereum/accounts/accounts.go:196.48,201.2 4 1 -github.com/ethereum/go-ethereum/accounts/errors.go:59.46,63.2 1 0 -github.com/ethereum/go-ethereum/accounts/errors.go:66.44,68.2 1 0 -github.com/ethereum/go-ethereum/accounts/hd.go:68.63,73.9 3 1 -github.com/ethereum/go-ethereum/accounts/hd.go:87.2,87.26 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:90.2,90.39 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:117.2,117.20 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:74.28,75.50 1 0 -github.com/ethereum/go-ethereum/accounts/hd.go:77.46,78.116 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:80.47,81.30 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:83.10,84.56 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:87.26,89.3 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:90.39,96.40 3 1 -github.com/ethereum/go-ethereum/accounts/hd.go:101.3,102.10 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:105.3,106.66 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:112.3,115.33 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:96.40,99.4 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:102.10,104.4 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:106.66,107.18 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:110.4,110.93 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:107.18,109.5 1 0 -github.com/ethereum/go-ethereum/accounts/hd.go:122.44,124.33 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:135.2,135.15 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:124.33,126.30 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:130.3,131.15 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:126.30,129.4 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:131.15,133.4 1 1 -github.com/ethereum/go-ethereum/accounts/hd.go:139.58,141.2 1 0 -github.com/ethereum/go-ethereum/accounts/hd.go:144.59,147.46 3 0 -github.com/ethereum/go-ethereum/accounts/hd.go:150.2,151.12 2 0 -github.com/ethereum/go-ethereum/accounts/hd.go:147.46,149.3 1 0 -github.com/ethereum/go-ethereum/accounts/hd.go:156.65,161.31 4 1 -github.com/ethereum/go-ethereum/accounts/hd.go:161.31,164.3 2 1 -github.com/ethereum/go-ethereum/accounts/hd.go:170.68,175.31 4 1 -github.com/ethereum/go-ethereum/accounts/hd.go:175.31,179.3 2 1 -github.com/ethereum/go-ethereum/accounts/manager.go:66.63,69.35 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:73.2,76.35 3 0 -github.com/ethereum/go-ethereum/accounts/manager.go:80.2,90.35 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:94.2,96.11 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:69.35,71.3 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:76.35,78.3 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:90.35,93.3 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:100.34,104.2 3 0 -github.com/ethereum/go-ethereum/accounts/manager.go:107.37,109.2 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:113.48,117.2 3 0 -github.com/ethereum/go-ethereum/accounts/manager.go:121.29,123.15 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:133.2,133.6 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:123.15,125.35 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:128.3,129.19 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:125.35,127.4 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:133.6,134.10 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:135.30,138.22 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:144.4,147.23 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:148.34,157.26 8 0 -github.com/ethereum/go-ethereum/accounts/manager.go:158.26,164.10 3 0 -github.com/ethereum/go-ethereum/accounts/manager.go:139.23,140.49 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:141.23,142.48 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:170.58,175.2 3 0 -github.com/ethereum/go-ethereum/accounts/manager.go:178.39,183.2 3 0 -github.com/ethereum/go-ethereum/accounts/manager.go:186.45,190.2 3 0 -github.com/ethereum/go-ethereum/accounts/manager.go:193.55,198.16 4 0 -github.com/ethereum/go-ethereum/accounts/manager.go:201.2,201.44 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:206.2,206.30 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:198.16,200.3 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:201.44,202.29 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:202.29,204.4 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:210.48,215.36 4 0 -github.com/ethereum/go-ethereum/accounts/manager.go:220.2,220.18 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:215.36,216.45 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:216.45,218.4 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:226.58,230.36 3 0 -github.com/ethereum/go-ethereum/accounts/manager.go:235.2,235.31 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:230.36,231.31 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:231.31,233.4 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:240.74,242.2 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:248.56,249.33 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:257.2,257.14 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:249.33,250.49 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:251.3,251.22 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:255.3,255.71 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:250.49,250.97 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:251.22,253.12 2 0 -github.com/ethereum/go-ethereum/accounts/manager.go:262.55,263.33 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:271.2,271.14 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:263.33,264.49 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:265.3,265.22 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:269.3,269.44 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:264.49,264.97 1 0 -github.com/ethereum/go-ethereum/accounts/manager.go:265.22,267.12 1 0 -github.com/ethereum/go-ethereum/accounts/sort.go:22.44,22.61 1 0 -github.com/ethereum/go-ethereum/accounts/sort.go:23.44,23.71 1 0 -github.com/ethereum/go-ethereum/accounts/sort.go:24.44,24.81 1 0 -github.com/ethereum/go-ethereum/accounts/sort.go:29.43,29.60 1 0 -github.com/ethereum/go-ethereum/accounts/sort.go:30.43,30.70 1 0 -github.com/ethereum/go-ethereum/accounts/sort.go:31.43,31.84 1 0 -github.com/ethereum/go-ethereum/accounts/url.go:44.40,46.39 2 1 -github.com/ethereum/go-ethereum/accounts/url.go:49.2,52.8 1 1 -github.com/ethereum/go-ethereum/accounts/url.go:46.39,48.3 1 1 -github.com/ethereum/go-ethereum/accounts/url.go:56.30,57.20 1 1 -github.com/ethereum/go-ethereum/accounts/url.go:60.2,60.15 1 1 -github.com/ethereum/go-ethereum/accounts/url.go:57.20,59.3 1 1 -github.com/ethereum/go-ethereum/accounts/url.go:64.38,66.19 2 0 -github.com/ethereum/go-ethereum/accounts/url.go:69.2,69.12 1 0 -github.com/ethereum/go-ethereum/accounts/url.go:66.19,68.3 1 0 -github.com/ethereum/go-ethereum/accounts/url.go:73.44,75.2 1 1 -github.com/ethereum/go-ethereum/accounts/url.go:78.49,81.16 3 1 -github.com/ethereum/go-ethereum/accounts/url.go:84.2,85.16 2 1 -github.com/ethereum/go-ethereum/accounts/url.go:88.2,90.12 3 1 -github.com/ethereum/go-ethereum/accounts/url.go:81.16,83.3 1 0 -github.com/ethereum/go-ethereum/accounts/url.go:85.16,87.3 1 0 -github.com/ethereum/go-ethereum/accounts/url.go:99.31,100.28 1 1 -github.com/ethereum/go-ethereum/accounts/url.go:103.2,103.46 1 1 -github.com/ethereum/go-ethereum/accounts/url.go:100.28,102.3 1 1 -github.com/ethereum/go-ethereum/common/size.go:28.38,29.23 1 1 -github.com/ethereum/go-ethereum/common/size.go:29.23,31.3 1 0 -github.com/ethereum/go-ethereum/common/size.go:31.8,31.27 1 1 -github.com/ethereum/go-ethereum/common/size.go:31.27,33.3 1 0 -github.com/ethereum/go-ethereum/common/size.go:33.8,33.24 1 1 -github.com/ethereum/go-ethereum/common/size.go:33.24,35.3 1 1 -github.com/ethereum/go-ethereum/common/size.go:35.8,35.21 1 1 -github.com/ethereum/go-ethereum/common/size.go:35.21,37.3 1 1 -github.com/ethereum/go-ethereum/common/size.go:37.8,39.3 1 1 -github.com/ethereum/go-ethereum/common/size.go:44.46,45.23 1 0 -github.com/ethereum/go-ethereum/common/size.go:45.23,47.3 1 0 -github.com/ethereum/go-ethereum/common/size.go:47.8,47.27 1 0 -github.com/ethereum/go-ethereum/common/size.go:47.27,49.3 1 0 -github.com/ethereum/go-ethereum/common/size.go:49.8,49.24 1 0 -github.com/ethereum/go-ethereum/common/size.go:49.24,51.3 1 0 -github.com/ethereum/go-ethereum/common/size.go:51.8,51.21 1 0 -github.com/ethereum/go-ethereum/common/size.go:51.21,53.3 1 0 -github.com/ethereum/go-ethereum/common/size.go:53.8,55.3 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:26.51,28.16 2 0 -github.com/ethereum/go-ethereum/common/test_utils.go:31.2,31.53 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:38.2,38.12 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:28.16,30.3 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:31.53,32.51 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:36.3,36.65 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:32.51,35.4 2 0 -github.com/ethereum/go-ethereum/common/test_utils.go:42.53,44.33 2 0 -github.com/ethereum/go-ethereum/common/test_utils.go:52.2,52.8 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:44.33,45.25 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:48.3,48.16 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:45.25,47.4 1 0 -github.com/ethereum/go-ethereum/common/test_utils.go:48.16,50.4 1 0 -github.com/ethereum/go-ethereum/common/types.go:53.33,57.2 3 1 -github.com/ethereum/go-ethereum/common/types.go:61.33,61.66 1 0 -github.com/ethereum/go-ethereum/common/types.go:65.31,65.65 1 0 -github.com/ethereum/go-ethereum/common/types.go:68.30,68.45 1 0 -github.com/ethereum/go-ethereum/common/types.go:71.30,71.68 1 0 -github.com/ethereum/go-ethereum/common/types.go:74.28,74.59 1 0 -github.com/ethereum/go-ethereum/common/types.go:78.39,80.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:84.31,86.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:90.43,95.11 4 1 -github.com/ethereum/go-ethereum/common/types.go:96.16,97.19 1 1 -github.com/ethereum/go-ethereum/common/types.go:100.3,100.15 1 1 -github.com/ethereum/go-ethereum/common/types.go:103.3,103.14 1 1 -github.com/ethereum/go-ethereum/common/types.go:104.16,105.16 1 1 -github.com/ethereum/go-ethereum/common/types.go:106.11,110.13 4 1 -github.com/ethereum/go-ethereum/common/types.go:111.11,112.35 1 1 -github.com/ethereum/go-ethereum/common/types.go:113.10,114.41 1 1 -github.com/ethereum/go-ethereum/common/types.go:97.19,99.4 1 1 -github.com/ethereum/go-ethereum/common/types.go:100.15,102.4 1 1 -github.com/ethereum/go-ethereum/common/types.go:119.50,121.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:124.50,126.2 1 1 -github.com/ethereum/go-ethereum/common/types.go:129.45,131.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:135.35,136.21 1 1 -github.com/ethereum/go-ethereum/common/types.go:140.2,140.32 1 1 -github.com/ethereum/go-ethereum/common/types.go:136.21,138.3 1 0 -github.com/ethereum/go-ethereum/common/types.go:144.65,146.34 2 0 -github.com/ethereum/go-ethereum/common/types.go:149.2,149.27 1 0 -github.com/ethereum/go-ethereum/common/types.go:146.34,148.3 1 0 -github.com/ethereum/go-ethereum/common/types.go:153.44,155.9 2 1 -github.com/ethereum/go-ethereum/common/types.go:158.2,158.29 1 1 -github.com/ethereum/go-ethereum/common/types.go:161.2,162.12 2 1 -github.com/ethereum/go-ethereum/common/types.go:155.9,157.3 1 1 -github.com/ethereum/go-ethereum/common/types.go:158.29,160.3 1 1 -github.com/ethereum/go-ethereum/common/types.go:166.45,168.2 1 1 -github.com/ethereum/go-ethereum/common/types.go:171.53,171.81 1 0 -github.com/ethereum/go-ethereum/common/types.go:174.58,176.31 2 0 -github.com/ethereum/go-ethereum/common/types.go:182.2,182.12 1 0 -github.com/ethereum/go-ethereum/common/types.go:177.14,178.39 1 0 -github.com/ethereum/go-ethereum/common/types.go:179.10,180.57 1 0 -github.com/ethereum/go-ethereum/common/types.go:189.60,191.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:194.55,196.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:205.39,209.2 3 1 -github.com/ethereum/go-ethereum/common/types.go:213.39,213.75 1 0 -github.com/ethereum/go-ethereum/common/types.go:217.37,217.74 1 1 -github.com/ethereum/go-ethereum/common/types.go:221.34,222.20 1 1 -github.com/ethereum/go-ethereum/common/types.go:225.2,225.46 1 1 -github.com/ethereum/go-ethereum/common/types.go:222.20,224.3 1 1 -github.com/ethereum/go-ethereum/common/types.go:229.33,229.48 1 1 -github.com/ethereum/go-ethereum/common/types.go:232.30,232.58 1 0 -github.com/ethereum/go-ethereum/common/types.go:235.31,237.2 1 1 -github.com/ethereum/go-ethereum/common/types.go:240.34,242.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:244.40,251.32 5 1 -github.com/ethereum/go-ethereum/common/types.go:262.2,262.15 1 1 -github.com/ethereum/go-ethereum/common/types.go:251.32,253.15 2 1 -github.com/ethereum/go-ethereum/common/types.go:258.3,258.35 1 1 -github.com/ethereum/go-ethereum/common/types.go:253.15,255.4 1 1 -github.com/ethereum/go-ethereum/common/types.go:255.9,257.4 1 1 -github.com/ethereum/go-ethereum/common/types.go:258.35,260.4 1 1 -github.com/ethereum/go-ethereum/common/types.go:265.31,270.2 4 1 -github.com/ethereum/go-ethereum/common/types.go:274.46,275.11 1 1 -github.com/ethereum/go-ethereum/common/types.go:276.16,277.27 1 1 -github.com/ethereum/go-ethereum/common/types.go:278.11,282.13 4 1 -github.com/ethereum/go-ethereum/common/types.go:283.16,286.19 2 1 -github.com/ethereum/go-ethereum/common/types.go:289.3,289.15 1 1 -github.com/ethereum/go-ethereum/common/types.go:292.3,292.15 1 1 -github.com/ethereum/go-ethereum/common/types.go:293.11,294.35 1 1 -github.com/ethereum/go-ethereum/common/types.go:295.10,296.44 1 1 -github.com/ethereum/go-ethereum/common/types.go:286.19,288.4 1 1 -github.com/ethereum/go-ethereum/common/types.go:289.15,291.4 1 1 -github.com/ethereum/go-ethereum/common/types.go:302.38,303.21 1 1 -github.com/ethereum/go-ethereum/common/types.go:306.2,306.35 1 1 -github.com/ethereum/go-ethereum/common/types.go:303.21,305.3 1 0 -github.com/ethereum/go-ethereum/common/types.go:310.48,312.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:315.53,317.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:320.53,322.2 1 1 -github.com/ethereum/go-ethereum/common/types.go:325.47,327.9 2 1 -github.com/ethereum/go-ethereum/common/types.go:330.2,330.32 1 1 -github.com/ethereum/go-ethereum/common/types.go:333.2,334.12 2 1 -github.com/ethereum/go-ethereum/common/types.go:327.9,329.3 1 1 -github.com/ethereum/go-ethereum/common/types.go:330.32,332.3 1 1 -github.com/ethereum/go-ethereum/common/types.go:338.48,340.2 1 1 -github.com/ethereum/go-ethereum/common/types.go:343.58,343.86 1 0 -github.com/ethereum/go-ethereum/common/types.go:346.61,348.31 2 0 -github.com/ethereum/go-ethereum/common/types.go:354.2,354.12 1 0 -github.com/ethereum/go-ethereum/common/types.go:349.14,350.39 1 0 -github.com/ethereum/go-ethereum/common/types.go:351.10,352.60 1 0 -github.com/ethereum/go-ethereum/common/types.go:361.63,363.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:366.58,368.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:378.57,380.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:383.79,384.28 1 0 -github.com/ethereum/go-ethereum/common/types.go:387.2,388.75 2 0 -github.com/ethereum/go-ethereum/common/types.go:384.28,386.3 1 0 -github.com/ethereum/go-ethereum/common/types.go:392.63,393.80 1 1 -github.com/ethereum/go-ethereum/common/types.go:396.2,396.44 1 1 -github.com/ethereum/go-ethereum/common/types.go:393.80,395.3 1 1 -github.com/ethereum/go-ethereum/common/types.go:400.59,401.82 1 0 -github.com/ethereum/go-ethereum/common/types.go:404.2,404.55 1 0 -github.com/ethereum/go-ethereum/common/types.go:401.82,403.3 1 0 -github.com/ethereum/go-ethereum/common/types.go:408.47,410.2 1 0 -github.com/ethereum/go-ethereum/common/types.go:413.45,414.24 1 0 -github.com/ethereum/go-ethereum/common/types.go:417.2,417.56 1 0 -github.com/ethereum/go-ethereum/common/types.go:414.24,416.3 1 0 -github.com/ethereum/go-ethereum/common/types.go:421.50,423.2 1 1 -github.com/ethereum/go-ethereum/common/types.go:426.47,428.2 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:26.31,27.20 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:30.2,30.19 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:33.2,33.21 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:27.20,29.3 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:30.19,32.3 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:37.47,38.14 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:41.2,44.8 3 1 -github.com/ethereum/go-ethereum/common/bytes.go:38.14,40.3 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:48.35,50.2 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:53.34,55.2 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:58.29,59.21 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:62.2,62.32 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:67.2,67.13 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:59.21,61.3 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:62.32,63.25 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:63.25,65.4 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:71.33,73.2 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:76.35,79.2 2 1 -github.com/ethereum/go-ethereum/common/bytes.go:82.50,84.20 2 0 -github.com/ethereum/go-ethereum/common/bytes.go:87.2,87.19 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:90.2,92.11 3 0 -github.com/ethereum/go-ethereum/common/bytes.go:84.20,86.3 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:87.19,89.3 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:96.48,97.21 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:101.2,104.15 3 1 -github.com/ethereum/go-ethereum/common/bytes.go:97.21,99.3 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:108.47,109.21 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:113.2,116.15 3 1 -github.com/ethereum/go-ethereum/common/bytes.go:109.21,111.3 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:120.38,122.28 2 0 -github.com/ethereum/go-ethereum/common/bytes.go:127.2,127.16 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:122.28,123.18 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:123.18,124.9 1 0 -github.com/ethereum/go-ethereum/common/bytes.go:131.39,133.23 2 1 -github.com/ethereum/go-ethereum/common/bytes.go:138.2,138.16 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:133.23,134.20 1 1 -github.com/ethereum/go-ethereum/common/bytes.go:134.20,135.9 1 1 -github.com/ethereum/go-ethereum/common/debug.go:28.35,38.2 6 0 -github.com/ethereum/go-ethereum/common/debug.go:41.42,52.2 3 0 -github.com/ethereum/go-ethereum/common/format.go:34.41,36.65 2 0 -github.com/ethereum/go-ethereum/common/format.go:39.2,39.14 1 0 -github.com/ethereum/go-ethereum/common/format.go:36.65,38.3 1 0 -github.com/ethereum/go-ethereum/common/format.go:62.36,65.24 2 0 -github.com/ethereum/go-ethereum/common/format.go:69.2,71.32 2 0 -github.com/ethereum/go-ethereum/common/format.go:81.2,81.15 1 0 -github.com/ethereum/go-ethereum/common/format.go:65.24,67.3 1 0 -github.com/ethereum/go-ethereum/common/format.go:71.32,72.23 1 0 -github.com/ethereum/go-ethereum/common/format.go:72.23,76.28 3 0 -github.com/ethereum/go-ethereum/common/format.go:76.28,77.10 1 0 -github.com/ethereum/go-ethereum/common/path.go:29.44,31.2 1 0 -github.com/ethereum/go-ethereum/common/path.go:34.38,36.38 2 0 -github.com/ethereum/go-ethereum/common/path.go:40.2,40.13 1 0 -github.com/ethereum/go-ethereum/common/path.go:36.38,38.3 1 0 -github.com/ethereum/go-ethereum/common/path.go:44.59,45.30 1 0 -github.com/ethereum/go-ethereum/common/path.go:48.2,48.41 1 0 -github.com/ethereum/go-ethereum/common/path.go:45.30,47.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/helpers.go:55.49,57.29 2 0 -github.com/ethereum/go-ethereum/common/compiler/helpers.go:64.2,64.29 1 0 -github.com/ethereum/go-ethereum/common/compiler/helpers.go:57.29,59.17 2 0 -github.com/ethereum/go-ethereum/common/compiler/helpers.go:62.3,62.24 1 0 -github.com/ethereum/go-ethereum/common/compiler/helpers.go:59.17,61.4 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:61.40,67.47 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:70.2,70.10 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:67.47,69.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:74.54,75.16 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:78.2,82.16 5 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:85.2,86.23 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:89.2,90.57 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:93.2,93.57 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:96.2,96.57 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:99.2,99.15 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:75.16,77.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:82.16,84.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:86.23,88.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:90.57,92.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:93.57,95.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:96.57,98.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:103.79,104.22 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:107.2,108.16 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:111.2,114.27 4 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:104.22,106.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:108.16,110.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:118.88,119.27 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:122.2,123.16 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:126.2,127.16 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:130.2,132.27 3 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:119.27,121.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:123.16,125.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:127.16,129.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:135.84,139.34 4 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:142.2,142.105 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:139.34,141.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:154.162,156.62 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:161.2,162.43 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:191.2,191.23 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:156.62,159.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:162.43,165.64 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:168.3,189.4 4 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:165.64,167.4 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:196.164,198.62 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:202.2,203.43 2 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:223.2,223.23 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:198.62,200.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/solidity.go:203.43,222.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:36.37,41.2 2 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:44.49,45.17 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:48.2,52.16 5 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:55.2,56.23 2 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:59.2,60.57 2 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:63.2,63.57 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:66.2,66.57 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:69.2,69.15 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:45.17,47.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:52.16,54.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:56.23,58.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:60.57,62.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:63.57,65.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:66.57,68.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:73.86,74.27 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:77.2,78.16 2 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:81.2,82.16 2 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:85.2,87.27 3 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:74.27,76.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:78.16,80.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:82.16,84.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:90.81,94.34 4 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:98.2,98.102 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:94.34,96.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:110.159,112.62 2 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:117.2,118.33 2 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:143.2,143.23 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:112.62,114.3 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:118.33,120.24 1 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:123.3,141.4 2 0 -github.com/ethereum/go-ethereum/common/compiler/vyper.go:120.24,121.12 1 0 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:27.40,30.73 2 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:34.2,35.21 2 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:38.2,38.73 1 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:42.2,42.73 1 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:45.2,45.23 1 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:30.73,32.3 1 0 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:35.21,37.3 1 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:38.73,40.3 1 0 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:42.73,44.3 1 0 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:50.29,52.73 2 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:55.2,55.28 1 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:52.73,54.3 1 0 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:60.29,63.73 2 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:67.2,67.27 1 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:70.2,70.28 1 1 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:63.73,65.3 1 0 -github.com/ethereum/go-ethereum/common/fdlimit/fdlimit_darwin.go:67.27,69.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:78.123,91.2 6 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:96.86,98.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:101.42,104.2 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:108.37,112.84 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:117.2,117.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:112.84,113.13 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:121.39,126.2 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:128.58,129.112 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:131.2,132.86 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:129.113,129.114 0 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:147.80,151.45 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:154.2,155.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:158.2,159.12 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:151.45,153.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:155.16,157.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:163.114,164.86 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:167.2,168.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:171.2,171.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:164.86,166.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:168.16,170.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:175.119,180.16 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:184.2,184.39 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:180.16,182.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:188.124,193.16 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:197.2,197.42 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:193.16,195.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:201.120,206.16 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:210.2,210.40 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:206.16,208.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:214.139,219.16 4 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:223.2,224.20 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:219.16,221.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:228.112,233.20 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:236.2,236.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:233.20,235.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:243.121,248.15 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:251.2,252.15 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:255.2,255.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:248.15,250.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:252.15,254.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:259.101,264.2 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:267.101,268.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:272.2,273.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:277.2,277.34 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:268.35,270.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:273.18,275.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:282.102,287.2 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:291.102,292.63 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:296.2,297.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:301.2,301.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:292.63,294.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:297.18,299.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:305.103,309.35 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:313.2,314.19 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:318.2,318.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:309.35,311.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:314.19,316.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:323.103,327.61 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:331.2,331.67 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:327.61,329.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:335.103,339.40 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:343.2,344.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:348.2,348.46 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:339.40,341.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:344.18,346.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:352.131,356.40 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:365.2,366.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:370.2,371.39 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:375.2,375.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:356.40,358.40 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:362.3,362.34 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:358.40,360.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:366.18,368.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:371.39,373.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:379.104,384.2 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:386.64,389.22 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:392.2,395.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:389.22,391.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:407.39,409.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:412.47,414.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:417.123,421.86 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:424.2,425.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:428.2,429.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:433.2,433.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:436.2,436.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:421.86,423.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:425.16,427.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:429.16,431.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:433.27,435.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:440.108,446.16 5 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:450.2,450.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:453.2,453.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:446.16,448.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:450.27,452.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:458.104,463.2 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:467.83,471.44 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:474.2,474.27 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:471.44,473.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:479.84,481.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:485.100,495.30 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:501.2,502.78 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:512.2,512.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:532.2,535.70 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:551.2,551.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:568.2,568.15 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:584.2,584.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:495.30,497.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:497.8,499.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:502.78,504.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:504.8,504.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:504.33,506.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:506.8,506.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:506.34,508.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:508.8,510.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:512.26,515.24 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:521.3,522.54 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:515.24,516.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:519.4,519.40 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:516.38,518.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:522.54,524.23 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:527.4,529.27 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:524.23,526.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:535.70,542.17 5 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:548.3,548.32 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:542.17,543.44 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:546.4,546.25 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:543.44,545.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:551.16,558.17 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:561.3,561.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:558.17,560.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:561.13,563.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:563.9,565.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:568.15,570.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:573.3,573.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:570.17,572.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:573.13,574.53 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:581.4,581.68 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:574.53,575.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:578.5,578.25 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:575.33,577.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:589.160,591.78 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:594.2,595.50 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:622.2,622.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:625.2,625.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:629.2,641.68 8 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:591.78,593.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:595.50,597.27 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:600.3,600.64 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:597.27,599.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:601.8,603.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:603.27,606.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:606.9,608.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:611.4,611.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:615.4,616.66 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:608.29,610.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:611.29,613.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:616.66,618.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:622.19,624.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:625.23,627.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:645.94,651.16 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:655.2,657.16 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:660.2,661.25 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:665.2,665.124 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:671.2,675.12 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:651.16,653.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:657.16,659.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:661.25,663.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:665.124,666.52 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:669.3,669.41 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:666.52,668.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:682.109,684.28 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:701.2,702.16 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:705.2,706.28 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:709.2,709.17 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:684.28,687.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:687.8,690.29 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:693.3,694.27 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:698.3,698.117 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:690.29,692.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:694.27,696.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:702.16,704.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:706.28,708.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:714.149,719.16 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:723.2,723.64 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:719.16,721.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:723.64,725.7 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:725.7,726.11 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:727.24,728.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:737.28,738.15 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:739.16,740.15 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:728.31,729.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:730.23,730.23 0 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:731.30,732.17 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:733.18,734.17 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:747.122,752.64 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:752.64,754.7 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:754.7,755.11 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:756.24,757.12 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:764.28,765.15 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:766.16,767.15 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:758.21,758.21 0 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:759.29,760.16 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:761.17,762.16 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:775.71,779.45 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:783.2,783.146 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:786.2,791.12 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:779.45,781.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:783.146,785.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:795.58,797.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:804.48,804.73 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:805.48,805.60 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:806.48,806.63 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:807.48,807.71 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:808.48,808.77 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:809.48,809.78 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:810.48,810.78 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:811.48,811.72 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:812.48,812.74 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:813.48,813.73 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:814.48,814.79 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:823.52,823.68 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:824.52,824.76 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:826.108,827.36 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:830.2,830.60 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:827.36,829.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:833.101,835.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:837.101,839.19 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:842.2,842.70 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:839.19,841.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:845.97,847.19 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:850.2,851.21 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:854.2,855.35 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:858.2,858.18 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:847.19,849.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:851.21,853.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:855.35,857.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:861.94,863.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:865.92,867.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:869.104,871.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:873.88,875.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:877.95,879.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:881.57,881.75 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:883.91,884.24 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:887.44,888.64 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/simulated.go:888.64,891.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:13.108,15.19 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:18.2,19.20 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:23.2,23.21 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:15.19,17.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:19.20,21.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:26.103,28.34 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:32.2,32.26 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:28.34,30.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/backends/bor_simulated.go:36.100,38.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:31.65,32.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:35.2,35.47 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:32.21,34.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:40.54,41.64 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:45.2,45.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:49.2,49.48 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:55.2,55.57 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:58.2,58.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:41.64,43.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:45.43,47.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:49.48,50.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:50.20,52.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:55.57,57.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:63.51,64.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:69.2,69.40 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:64.38,66.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:69.40,71.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:71.8,71.57 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:71.57,73.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:73.8,75.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error_handling.go:80.47,82.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:13.27,15.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:17.27,19.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:21.38,23.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:25.81,26.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:29.2,31.73 3 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:34.2,34.40 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:41.2,41.72 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:26.33,28.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:31.73,33.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:34.40,36.81 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:39.3,39.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:36.81,37.9 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:44.72,46.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:48.76,50.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:54.2,54.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:67.2,67.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:50.16,52.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:54.38,57.41 3 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:61.3,61.39 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:64.3,65.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:57.41,60.4 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:61.39,63.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:70.82,71.64 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:74.2,75.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:78.2,79.38 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:86.2,86.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:89.2,89.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:71.64,73.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:75.16,77.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:79.38,81.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:84.3,84.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:81.17,83.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:86.38,88.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:92.71,93.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:96.2,96.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:93.33,95.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:96.33,98.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:98.8,100.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:103.69,105.27 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:120.2,120.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:105.27,108.32 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:108.32,110.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:110.9,110.55 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:110.55,112.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:115.4,115.93 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:112.18,114.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:116.9,118.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:127.74,129.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:132.2,133.56 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:141.2,141.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:146.2,147.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:151.2,151.60 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:129.16,131.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:133.56,135.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:135.8,137.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:137.17,139.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:141.19,143.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/selector_parser.go:147.16,149.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:36.50,37.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:52.2,52.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:37.21,38.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:39.10,40.22 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:41.11,42.48 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:43.11,44.48 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:45.11,46.48 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:47.11,49.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:53.9,54.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:55.10,56.54 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:57.10,58.54 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:59.10,60.54 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:61.10,67.24 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:72.3,72.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:67.24,71.4 3 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:77.42,78.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:83.2,83.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:78.30,79.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:79.13,81.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:84.9,85.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:86.9,87.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:88.10,89.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:96.73,97.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:100.2,100.67 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:105.2,105.8 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:97.23,99.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:100.67,102.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:102.8,104.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:109.63,110.25 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:114.2,117.31 3 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:110.25,112.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:122.81,123.14 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:126.2,126.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:131.2,133.20 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:145.2,147.57 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:158.2,158.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:123.14,125.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:126.33,128.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:133.20,136.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:136.8,136.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:136.27,139.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:139.8,141.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:147.57,149.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:154.3,154.48 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:149.17,151.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:161.65,164.40 3 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:188.2,188.32 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:164.40,166.49 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:183.3,183.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:186.3,186.60 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:166.49,178.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:178.9,178.56 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:178.56,182.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:183.17,185.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:193.70,194.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:198.2,205.30 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:214.2,214.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:194.28,196.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:205.30,207.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:207.17,209.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:210.8,212.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:215.15,216.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:223.3,223.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:224.15,225.53 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:226.15,227.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:234.3,234.53 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:235.16,236.51 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:237.21,238.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:239.14,240.32 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:241.17,242.50 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:243.14,244.47 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:245.15,246.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:247.20,248.41 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:249.18,250.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:251.10,252.54 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:216.23,218.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:221.4,221.44 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:218.18,220.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:227.29,229.36 2 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:232.4,232.55 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:229.36,231.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:257.88,262.40 4 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:266.2,266.32 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:270.2,276.29 6 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:280.2,280.37 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:283.2,285.8 3 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:262.40,264.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:266.32,268.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:276.29,278.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:280.37,282.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:289.69,293.31 3 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:296.2,296.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:299.2,299.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:293.31,295.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/unpack.go:296.26,298.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error.go:42.52,47.31 3 1 -github.com/ethereum/go-ethereum/accounts/abi/error.go:66.2,76.3 4 1 -github.com/ethereum/go-ethereum/accounts/abi/error.go:47.31,48.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error.go:58.3,59.20 2 1 -github.com/ethereum/go-ethereum/accounts/abi/error.go:63.3,63.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error.go:48.23,54.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/error.go:54.9,56.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error.go:59.20,61.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error.go:79.33,81.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error.go:83.58,84.19 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error.go:87.2,87.38 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error.go:90.2,90.34 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error.go:84.19,86.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/error.go:87.38,89.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/event.go:59.77,64.31 3 1 -github.com/ethereum/go-ethereum/accounts/abi/event.go:83.2,95.3 4 1 -github.com/ethereum/go-ethereum/accounts/abi/event.go:64.31,65.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/event.go:75.3,76.20 2 1 -github.com/ethereum/go-ethereum/accounts/abi/event.go:80.3,80.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/event.go:65.23,71.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/event.go:71.9,73.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/event.go:76.20,78.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/event.go:98.32,100.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:94.155,100.31 2 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:104.2,104.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:112.2,116.25 2 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:122.2,123.27 2 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:126.2,126.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:129.2,130.25 2 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:137.2,151.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:100.31,103.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:104.33,106.27 2 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:106.27,108.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:116.25,119.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:123.27,125.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:126.17,128.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:130.25,132.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:132.8,132.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:132.31,134.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:134.8,134.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:134.35,136.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:154.38,156.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/method.go:159.40,161.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/method.go:165.39,167.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:31.49,34.2 2 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:38.70,39.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:40.21,41.36 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:42.16,43.80 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:44.17,45.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:49.3,49.60 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:50.14,51.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:54.3,54.51 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:55.15,56.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:59.3,59.54 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:62.3,62.71 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:63.32,64.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:67.3,67.61 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:68.10,69.79 1 0 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:45.43,47.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:51.26,53.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:56.43,58.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:59.54,61.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:64.43,66.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:74.42,75.36 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:76.83,77.62 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:78.78,79.49 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:80.19,81.72 1 1 -github.com/ethereum/go-ethereum/accounts/abi/pack.go:82.10,83.28 1 0 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:38.65,40.49 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:44.2,44.73 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:47.2,47.14 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:40.49,42.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:44.73,45.13 1 0 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:52.46,53.77 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:56.2,56.10 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:53.77,55.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:61.59,62.14 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:74.2,74.14 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:84.2,84.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:62.14,63.15 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:64.10,65.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:66.11,67.36 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:68.11,69.36 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:70.11,71.36 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:75.9,76.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:77.10,78.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:79.10,80.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:81.10,82.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:89.62,93.2 3 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:99.40,101.9 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:117.2,117.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:102.67,103.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:104.84,105.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:106.53,107.15 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:108.90,109.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:110.39,111.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:112.40,113.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:114.10,115.81 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:123.45,125.33 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:130.2,130.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:134.2,134.65 1 0 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:125.33,126.59 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:126.59,128.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:130.18,133.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:137.45,138.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:141.2,143.27 3 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:146.2,146.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:151.2,151.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:155.2,155.65 1 0 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:138.31,140.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:143.27,145.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:146.27,147.59 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:147.59,149.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:151.18,154.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:158.46,159.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:169.2,169.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:159.38,162.49 3 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:165.3,165.49 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:162.49,164.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:165.49,167.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:179.99,186.38 4 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:222.2,222.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:259.2,259.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:186.38,190.66 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:194.3,195.10 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:199.3,199.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:203.3,204.32 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:216.3,216.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:190.66,191.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:195.10,196.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:199.20,201.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:204.32,205.22 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:205.22,206.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:210.5,212.17 3 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:206.30,208.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:216.13,218.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:222.35,226.28 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:234.3,234.32 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:244.3,244.40 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:248.3,248.51 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:226.28,228.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:234.32,237.50 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:240.4,240.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:237.50,239.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:244.40,246.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:248.51,252.4 2 1 -github.com/ethereum/go-ethereum/accounts/abi/reflect.go:252.9,257.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:47.42,51.41 3 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:54.2,54.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:51.41,53.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:62.71,64.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:72.2,73.12 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:76.2,77.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:81.2,81.45 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:64.16,67.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:70.3,70.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:67.17,69.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:73.12,75.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:77.16,79.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:84.74,88.41 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:94.2,94.39 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:97.2,97.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:100.2,100.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:88.41,89.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:92.3,92.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:89.24,91.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:94.39,96.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:97.17,99.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:104.72,106.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:109.2,109.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:106.16,108.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:115.83,117.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:120.2,121.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:124.2,124.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:117.16,119.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:121.16,123.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:128.94,130.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:133.2,133.36 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:130.16,132.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:137.50,156.54 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:159.2,162.31 4 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:195.2,195.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:156.54,158.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:162.31,163.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:164.22,165.125 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:166.19,167.59 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:168.4,168.144 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:169.19,172.25 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:175.4,175.110 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:176.18,179.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:182.4,182.42 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:185.4,185.108 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:186.16,187.59 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:188.4,188.80 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:189.16,190.63 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:191.11,192.93 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:167.59,167.97 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:172.25,174.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:179.24,181.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:182.42,184.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:187.59,187.96 2 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:200.61,201.22 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:204.2,204.37 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:209.2,209.63 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:201.22,203.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:204.37,205.42 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:205.42,207.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:214.62,215.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:220.2,220.62 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:215.35,216.51 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:216.51,218.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:224.36,226.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:229.35,231.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:240.48,241.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:244.2,244.44 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:247.2,249.16 3 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:252.2,252.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:241.19,243.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:244.44,246.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:249.16,251.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:262.71,265.26 3 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:269.2,269.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/abi.go:265.26,268.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:45.60,48.16 3 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:52.2,53.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:56.2,59.12 3 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:48.16,50.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:53.16,55.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:63.51,65.32 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:70.2,70.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:65.32,66.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:66.19,68.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:74.43,76.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:79.71,80.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:86.2,86.37 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:80.20,81.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:84.3,84.37 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:81.26,83.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:90.87,92.14 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:95.2,95.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:101.2,102.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:105.2,105.45 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:108.2,108.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:92.14,94.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:95.20,96.26 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:99.3,99.13 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:96.26,98.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:102.16,104.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:105.45,107.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:112.76,114.46 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:117.2,117.22 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:123.2,123.25 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:126.2,126.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:114.46,116.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:117.22,118.26 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:121.3,121.13 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:118.26,120.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:123.25,125.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:130.90,134.34 3 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:137.2,137.22 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:134.34,136.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:141.91,145.22 3 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:177.2,177.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:146.22,148.38 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:151.3,153.17 3 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:156.3,156.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:165.36,166.42 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:169.3,169.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:174.10,175.77 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:148.38,150.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:153.17,155.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:156.38,158.24 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:161.4,161.75 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:158.24,160.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:161.75,163.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:166.42,168.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:169.33,170.84 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:170.84,172.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:183.77,187.41 4 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:211.2,211.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:187.41,189.56 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:206.3,206.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:209.3,209.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:189.56,201.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:201.9,201.63 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:201.63,205.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:206.17,208.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:216.75,218.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:221.70,224.31 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:229.2,233.33 3 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:236.2,237.25 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:258.2,260.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:224.31,226.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:233.33,235.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:237.25,241.17 3 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:245.3,245.32 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:241.17,243.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:245.32,252.4 3 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:252.9,255.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:264.39,266.26 2 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:271.2,271.32 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:266.26,267.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/argument.go:267.17,269.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:31.66,33.31 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:98.2,98.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:33.31,34.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:34.31,38.31 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:95.4,95.40 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:39.21,40.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:41.24,42.66 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:43.18,45.52 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:46.14,47.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:50.14,51.47 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:52.15,53.47 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:54.15,55.47 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:56.15,57.40 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:58.15,60.52 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:61.16,63.52 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:64.16,66.52 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:67.16,69.52 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:70.16,72.28 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:73.16,75.28 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:77.12,87.12 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:47.13,49.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:89.93,90.59 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:91.13,92.66 1 0 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:101.47,103.14 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:108.2,108.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:111.2,111.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:103.14,107.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:108.34,110.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:115.81,117.44 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:117.44,120.4 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:124.99,126.44 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:126.44,128.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:136.109,138.32 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:142.2,142.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:172.2,172.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:138.32,140.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:142.29,143.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:146.3,147.21 2 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:169.3,169.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:143.19,145.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:148.16,149.59 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:150.44,153.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:154.19,155.72 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:158.4,160.18 3 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:161.11,164.18 3 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:155.72,157.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/topics.go:164.18,166.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:68.100,70.52 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:73.2,77.32 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:115.2,116.23 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:119.2,123.28 3 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:137.2,137.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:214.2,214.8 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:70.52,72.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:77.32,80.57 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:84.3,86.17 3 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:90.3,95.21 4 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:112.3,112.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:80.57,82.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:86.17,88.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:95.21,100.4 3 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:100.9,100.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:100.28,105.18 4 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:108.4,108.53 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:105.18,107.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:109.9,111.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:116.23,118.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:123.28,126.17 3 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:126.17,128.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:129.8,130.56 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:130.56,134.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:138.13,140.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:141.14,143.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:144.14,145.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:146.17,148.20 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:149.16,150.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:151.15,152.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:158.15,167.34 4 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:189.3,201.74 8 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:207.18,209.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:210.10,211.59 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:152.19,154.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:154.9,157.4 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:167.34,169.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:172.4,173.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:176.4,185.32 6 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:169.18,171.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:173.18,175.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:185.32,187.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:201.74,205.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:218.38,219.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:220.13,221.39 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:222.14,223.38 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:224.14,225.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:226.16,227.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:228.15,229.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:230.15,231.51 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:232.15,233.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:234.17,235.42 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:236.20,237.58 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:238.15,239.50 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:240.14,242.54 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:243.20,245.54 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:246.18,247.54 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:248.10,249.24 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:253.81,255.21 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:259.2,260.26 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:264.2,264.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:255.21,257.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:260.26,263.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:268.37,270.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:272.53,275.40 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:279.2,279.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:275.40,277.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:280.24,283.31 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:289.3,291.16 3 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:294.3,295.32 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:308.3,308.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:309.15,320.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:324.3,325.37 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:328.3,329.37 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:346.3,346.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:348.10,349.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:283.31,286.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:291.16,293.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:295.32,297.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:300.4,300.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:304.4,306.31 3 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:297.18,299.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:300.18,302.13 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:320.17,322.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:325.37,327.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:329.37,331.24 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:334.4,335.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:338.4,338.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:331.24,333.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:335.18,337.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/type.go:338.28,342.5 3 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:342.10,344.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:355.43,357.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:366.33,367.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:375.2,375.106 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:367.20,368.37 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:373.3,373.15 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:368.37,369.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:369.28,371.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:386.30,387.47 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:400.2,400.11 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:387.47,389.49 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:392.3,392.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:389.49,391.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:393.8,393.48 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:393.48,395.37 2 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:398.3,398.15 1 1 -github.com/ethereum/go-ethereum/accounts/abi/type.go:395.37,397.4 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:57.36,57.54 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:60.43,61.21 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:64.2,64.25 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:67.2,68.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:71.2,71.15 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:61.21,63.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:64.25,66.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:68.16,70.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:75.38,77.16 2 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:80.2,80.12 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:77.16,78.13 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:84.30,89.2 4 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:92.49,94.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:97.2,98.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:101.2,101.17 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:94.16,96.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:98.16,100.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:106.44,108.16 2 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:111.2,111.12 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:108.16,109.13 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:115.36,119.2 3 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:123.13,127.23 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:128.9,129.22 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:130.9,131.21 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:132.10,133.31 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:139.48,141.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:144.2,144.19 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:147.2,149.23 3 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:164.2,165.17 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:141.16,143.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:144.19,146.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:149.23,151.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:154.3,154.35 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:162.3,162.14 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:151.16,153.4 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:154.35,156.24 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:159.4,160.29 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:156.24,158.5 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:170.43,172.16 2 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:175.2,175.12 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:172.16,173.13 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:179.40,180.38 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:180.38,182.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:182.8,182.21 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:182.21,184.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:184.8,186.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:189.37,191.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:193.56,194.21 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:197.2,197.25 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:200.2,201.21 2 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:204.2,204.39 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:207.2,207.19 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:194.21,196.3 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:197.25,199.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:201.21,203.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:204.39,206.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:212.35,213.9 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:214.30,215.26 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:216.30,217.31 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:218.30,219.31 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:220.10,221.19 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:225.32,226.44 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:234.2,234.45 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:237.2,237.26 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:240.2,240.12 1 0 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:226.44,227.18 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:228.25,229.25 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:230.26,231.20 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:234.45,236.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/hexutil.go:237.26,239.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:40.46,45.2 4 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:48.51,49.22 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:52.2,52.70 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:49.22,51.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:56.51,58.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:61.2,62.47 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:67.2,67.12 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:58.16,60.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:62.47,64.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:64.8,66.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:71.32,73.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:76.56,76.82 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:79.59,81.31 2 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:91.2,91.12 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:82.14,84.17 2 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:87.3,87.12 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:88.10,89.58 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:84.17,86.4 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:97.68,98.22 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:101.2,101.89 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:98.22,100.3 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:107.66,109.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:112.2,112.28 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:116.2,116.24 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:121.2,122.12 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:109.16,111.3 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:112.28,114.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:116.24,117.35 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:117.35,119.4 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:128.76,130.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:133.2,133.28 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:137.2,137.24 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:142.2,143.12 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:130.16,132.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:133.28,135.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:137.24,138.35 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:138.35,140.4 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:155.44,157.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:160.49,161.22 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:164.2,164.68 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:161.22,163.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:168.49,170.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:173.2,173.19 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:176.2,178.23 3 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:193.2,196.12 4 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:170.16,172.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:173.19,175.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:178.23,180.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:183.3,183.35 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:191.3,191.14 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:180.16,182.4 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:183.35,185.24 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:188.4,189.29 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:185.24,187.5 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:200.32,202.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:205.31,207.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:210.54,210.81 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:213.57,215.31 2 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:225.2,225.12 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:216.14,217.40 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:218.13,221.16 3 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:222.10,223.59 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:233.47,238.2 4 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:241.52,242.22 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:245.2,245.71 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:242.22,244.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:249.52,251.16 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:254.2,254.19 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:257.2,258.27 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:266.2,267.12 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:251.16,253.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:254.19,256.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:258.27,260.23 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:263.3,264.13 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:260.23,262.4 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:271.33,273.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:276.57,276.82 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:279.60,281.31 2 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:289.2,289.12 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:282.14,283.40 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:284.13,285.21 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:286.10,287.57 1 0 -github.com/ethereum/go-ethereum/common/hexutil/json.go:297.45,299.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:302.50,303.22 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:306.2,306.69 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:303.22,305.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:310.50,313.53 3 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:318.2,319.12 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:313.53,315.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:315.8,315.23 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:315.23,317.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:323.31,325.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:327.34,329.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:331.43,333.2 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:335.63,336.21 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:339.2,339.30 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:344.2,344.23 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:347.2,347.19 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:336.21,338.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:339.30,341.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:341.8,341.23 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:341.23,343.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:344.23,346.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:350.60,351.21 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:354.2,354.31 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:357.2,358.21 2 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:361.2,361.39 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:364.2,364.19 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:351.21,353.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:354.31,356.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:358.21,360.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:361.39,363.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:367.55,368.34 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:371.2,371.12 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:368.34,370.3 1 1 -github.com/ethereum/go-ethereum/common/hexutil/json.go:374.43,376.2 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:46.51,50.2 3 0 -github.com/ethereum/go-ethereum/common/math/big.go:53.61,55.9 2 1 -github.com/ethereum/go-ethereum/common/math/big.go:58.2,59.12 2 1 -github.com/ethereum/go-ethereum/common/math/big.go:55.9,57.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:63.57,64.14 1 0 -github.com/ethereum/go-ethereum/common/math/big.go:67.2,67.55 1 0 -github.com/ethereum/go-ethereum/common/math/big.go:64.14,66.3 1 0 -github.com/ethereum/go-ethereum/common/math/big.go:75.41,79.2 3 0 -github.com/ethereum/go-ethereum/common/math/big.go:82.56,84.9 2 0 -github.com/ethereum/go-ethereum/common/math/big.go:87.2,88.12 2 0 -github.com/ethereum/go-ethereum/common/math/big.go:84.9,86.3 1 0 -github.com/ethereum/go-ethereum/common/math/big.go:92.52,94.2 1 0 -github.com/ethereum/go-ethereum/common/math/big.go:97.38,98.14 1 0 -github.com/ethereum/go-ethereum/common/math/big.go:101.2,101.42 1 0 -github.com/ethereum/go-ethereum/common/math/big.go:98.14,100.3 1 0 -github.com/ethereum/go-ethereum/common/math/big.go:106.45,107.13 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:110.2,112.53 3 1 -github.com/ethereum/go-ethereum/common/math/big.go:117.2,117.33 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:120.2,120.19 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:107.13,109.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:112.53,114.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:114.8,116.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:117.33,119.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:124.41,126.9 2 1 -github.com/ethereum/go-ethereum/common/math/big.go:129.2,129.10 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:126.9,127.41 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:133.34,136.2 2 1 -github.com/ethereum/go-ethereum/common/math/big.go:139.37,140.18 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:143.2,143.10 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:140.18,142.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:147.37,148.18 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:151.2,151.10 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:148.18,150.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:155.34,156.34 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:161.2,161.19 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:156.34,157.19 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:157.19,159.4 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:166.52,167.28 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:170.2,172.12 3 1 -github.com/ethereum/go-ethereum/common/math/big.go:167.28,169.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:178.51,182.21 3 1 -github.com/ethereum/go-ethereum/common/math/big.go:185.2,189.28 3 1 -github.com/ethereum/go-ethereum/common/math/big.go:182.21,184.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:196.51,197.20 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:200.2,200.47 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:197.20,199.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:205.44,207.34 2 1 -github.com/ethereum/go-ethereum/common/math/big.go:207.34,208.43 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:208.43,212.4 3 1 -github.com/ethereum/go-ethereum/common/math/big.go:217.32,219.2 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:223.35,225.2 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:234.32,235.22 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:238.2,238.35 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:235.22,237.3 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:246.44,249.39 2 1 -github.com/ethereum/go-ethereum/common/math/big.go:258.2,258.15 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:249.39,250.33 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:250.33,251.19 1 1 -github.com/ethereum/go-ethereum/common/math/big.go:254.4,255.14 2 1 -github.com/ethereum/go-ethereum/common/math/big.go:251.19,253.5 1 1 -github.com/ethereum/go-ethereum/common/math/integer.go:45.60,47.9 2 1 -github.com/ethereum/go-ethereum/common/math/integer.go:50.2,51.12 2 1 -github.com/ethereum/go-ethereum/common/math/integer.go:47.9,49.3 1 1 -github.com/ethereum/go-ethereum/common/math/integer.go:55.55,57.2 1 0 -github.com/ethereum/go-ethereum/common/math/integer.go:61.43,62.13 1 1 -github.com/ethereum/go-ethereum/common/math/integer.go:65.2,65.53 1 1 -github.com/ethereum/go-ethereum/common/math/integer.go:69.2,70.22 2 1 -github.com/ethereum/go-ethereum/common/math/integer.go:62.13,64.3 1 1 -github.com/ethereum/go-ethereum/common/math/integer.go:65.53,68.3 2 1 -github.com/ethereum/go-ethereum/common/math/integer.go:74.39,76.9 2 1 -github.com/ethereum/go-ethereum/common/math/integer.go:79.2,79.10 1 1 -github.com/ethereum/go-ethereum/common/math/integer.go:76.9,77.49 1 1 -github.com/ethereum/go-ethereum/common/math/integer.go:83.42,86.2 2 1 -github.com/ethereum/go-ethereum/common/math/integer.go:89.42,92.2 2 1 -github.com/ethereum/go-ethereum/common/math/integer.go:95.42,98.2 2 1 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:34.20,36.2 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:39.47,41.2 1 1 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:44.48,46.2 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:80.31,82.2 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:85.40,87.2 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:90.53,92.32 2 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:101.2,101.28 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:92.32,96.10 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:97.22,97.22 0 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:98.11,98.11 0 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:105.55,107.27 2 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:108.2,108.11 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:107.27,107.44 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:112.60,114.2 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:121.47,123.2 1 0 -github.com/ethereum/go-ethereum/common/mclock/mclock.go:125.43,127.2 1 0 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:50.28,51.19 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:51.19,53.3 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:57.42,63.55 5 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:67.2,70.24 3 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:63.55,66.3 2 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:70.24,72.3 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:76.40,81.2 3 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:84.42,89.27 4 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:89.27,91.3 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:95.35,100.2 3 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:103.44,105.2 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:108.57,114.31 5 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:115.2,116.14 2 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:114.31,114.49 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:121.59,123.2 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:127.65,132.2 3 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:134.68,142.2 6 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:144.33,148.18 3 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:151.2,154.13 4 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:148.18,150.3 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:157.44,158.18 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:162.2,165.18 4 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:170.2,170.23 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:158.18,159.57 1 0 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:165.18,167.3 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:167.8,169.3 1 0 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:173.40,174.18 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:177.2,177.14 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:174.18,175.53 1 0 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:182.34,184.2 1 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:186.44,188.2 1 0 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:190.39,194.2 3 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:196.44,200.2 3 1 -github.com/ethereum/go-ethereum/common/mclock/simclock.go:202.42,209.2 6 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:56.55,59.16 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:62.2,62.19 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:65.2,65.13 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:59.16,60.61 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:62.19,64.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:69.47,71.2 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:74.82,78.2 3 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:83.64,84.25 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:87.2,87.16 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:94.2,100.29 5 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:104.2,104.26 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:84.25,85.31 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:87.16,88.73 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:100.29,102.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:107.60,108.25 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:114.2,114.18 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:121.2,123.20 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:108.25,109.31 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:114.18,116.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:123.20,124.39 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:124.39,126.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:130.66,131.38 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:137.2,141.16 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:131.38,135.3 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:145.62,148.38 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:151.2,152.19 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:157.2,157.81 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:148.38,150.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:152.19,154.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:161.58,162.25 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:165.2,167.36 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:175.2,176.14 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:162.25,163.31 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:167.36,168.31 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:171.3,171.31 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:168.31,170.4 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:171.31,173.4 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:176.14,178.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:178.8,180.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:183.63,185.38 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:188.2,188.12 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:185.38,187.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:191.56,192.25 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:195.2,196.38 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:192.25,193.31 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:196.38,198.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:202.60,203.21 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:206.2,207.31 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:210.2,210.17 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:203.21,205.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:207.31,209.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:214.48,220.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:224.59,225.60 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:228.2,228.97 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:225.60,227.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:233.92,234.60 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:237.2,237.102 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:240.2,240.16 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:234.60,236.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:237.102,239.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:246.82,247.48 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:250.2,251.40 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:247.48,249.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:255.38,257.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:260.58,263.38 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:270.2,271.12 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:263.38,266.32 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:266.32,268.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:276.52,277.32 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:284.2,284.30 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:277.32,279.55 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:279.55,281.14 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:289.63,290.31 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:293.2,293.26 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:296.2,296.29 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:290.31,292.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:293.26,295.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:299.53,301.38 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:306.2,306.17 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:301.38,302.85 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:302.85,304.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:323.76,324.38 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:324.38,326.11 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:326.11,327.9 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:339.91,349.36 6 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:370.2,370.31 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:349.36,350.63 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:354.3,354.32 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:358.3,358.50 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:363.3,363.33 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:368.3,368.31 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:350.63,353.4 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:354.32,357.4 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:358.50,362.4 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:363.33,365.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:365.9,367.4 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:384.127,388.36 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:408.2,408.55 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:388.36,391.17 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:399.3,400.15 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:391.17,395.4 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:395.9,398.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:400.15,405.4 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:416.100,418.36 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:418.36,421.17 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:421.17,431.4 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:431.9,433.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:442.62,448.44 4 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:465.2,465.37 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:470.2,470.36 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:475.2,475.30 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:448.44,449.81 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:461.3,461.6 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:449.81,452.4 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:452.9,455.76 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:459.4,459.25 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:455.76,458.5 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:465.37,468.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:470.36,473.3 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:480.69,482.36 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:489.2,489.41 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:492.2,492.12 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:482.36,485.17 3 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:485.17,487.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:489.41,490.40 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:497.63,505.23 4 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:516.2,516.37 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:521.2,521.30 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:505.23,506.75 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:512.3,512.26 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:506.75,508.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:508.9,511.4 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:516.37,519.3 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:528.94,530.23 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:535.2,536.16 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:540.2,540.40 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:545.2,545.54 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:550.2,551.16 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:556.2,556.67 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:561.2,567.54 4 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:572.2,575.12 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:530.23,532.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:536.16,538.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:540.40,542.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:545.54,547.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:551.16,553.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:556.67,558.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:567.54,569.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:590.75,592.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:597.41,598.20 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:599.24,600.14 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:601.10,602.15 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:611.42,613.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:617.43,619.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:621.64,622.17 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:625.2,626.52 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:630.2,638.10 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:622.17,624.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:626.52,629.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:648.43,650.2 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:652.53,654.2 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:656.48,660.2 3 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:665.40,666.34 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:671.2,671.21 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:666.34,668.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:668.8,668.41 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:668.41,670.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:674.40,675.34 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:680.2,680.21 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:675.34,677.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:677.8,677.41 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:677.41,679.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:683.36,685.14 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:691.2,691.10 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:685.14,686.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:689.3,689.23 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:686.12,688.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:694.36,696.14 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:702.2,702.10 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:696.14,697.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:700.3,700.23 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator_set.go:697.12,699.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:129.107,132.49 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:136.2,136.35 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:139.2,143.16 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:146.2,150.20 4 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:132.49,134.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:136.35,138.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:143.16,145.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:154.77,159.2 4 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:161.78,179.40 2 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:184.2,184.43 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:179.40,180.28 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:180.28,182.4 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:184.43,185.40 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:190.83,194.26 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:197.2,197.20 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:200.2,200.14 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:194.26,196.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:197.20,199.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:210.63,214.2 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:248.8,253.47 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:258.2,279.53 8 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:285.2,285.10 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:253.47,255.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:279.53,280.61 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:280.61,281.87 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:290.68,292.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:295.102,297.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:302.135,306.12 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:317.2,317.23 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:306.12,307.34 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:307.34,310.11 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:311.17,312.11 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:313.24,313.24 0 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:324.116,325.26 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:328.2,331.45 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:335.2,335.63 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:340.2,344.39 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:347.2,347.65 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:351.2,351.41 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:355.2,355.35 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:359.2,359.16 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:365.2,366.27 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:370.2,370.77 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:374.2,374.56 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:325.26,327.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:331.45,333.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:335.63,337.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:344.39,346.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:347.65,349.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:351.41,353.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:355.35,357.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:359.16,360.31 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:360.31,362.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:366.27,368.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:370.77,372.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:379.56,380.35 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:383.2,383.45 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:386.2,386.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:380.35,382.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:383.45,385.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:393.125,396.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:401.2,402.22 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:408.2,408.95 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:413.2,413.38 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:416.2,416.45 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:429.2,429.64 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:434.2,435.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:440.2,440.44 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:457.2,457.45 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:396.17,398.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:402.22,404.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:404.8,406.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:408.95,410.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:413.38,415.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:416.45,418.28 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:421.3,421.79 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:418.28,420.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:421.79,423.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:424.8,424.88 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:424.88,427.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:429.64,431.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:435.16,437.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:440.44,447.47 5 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:451.3,451.58 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:447.47,449.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:451.58,453.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:461.136,468.18 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:532.2,532.17 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:537.2,537.38 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:541.2,542.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:545.2,548.61 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:554.2,554.18 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:468.18,470.39 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:476.3,476.37 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:489.3,489.18 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:512.3,513.23 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:527.3,528.45 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:470.39,472.9 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:476.37,477.88 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:477.88,480.10 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:489.18,491.25 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:491.25,497.19 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:502.5,503.44 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:506.5,507.10 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:497.19,499.6 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:503.44,505.6 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:513.23,516.65 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:519.4,519.38 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:516.65,518.5 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:520.9,523.21 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:523.21,525.5 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:532.17,534.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:537.38,539.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:542.16,544.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:548.61,549.41 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:552.3,552.81 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:549.41,551.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:559.83,560.29 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:563.2,563.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:560.29,562.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:568.89,570.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:576.114,579.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:583.2,584.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:589.2,590.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:593.2,593.51 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:598.2,599.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:603.2,604.22 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:610.2,610.96 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:615.2,615.17 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:622.2,622.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:579.17,581.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:584.16,586.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:590.16,592.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:593.51,596.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:599.16,601.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:604.22,606.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:606.8,606.23 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:606.23,608.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:610.96,612.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:615.17,617.47 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:617.47,619.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:627.86,635.16 5 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:640.2,643.37 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:646.2,649.37 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:663.2,670.19 4 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:674.2,676.68 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:683.2,684.45 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:687.2,687.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:635.16,637.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:643.37,645.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:649.37,651.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:656.3,657.43 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:651.17,653.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:657.43,659.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:670.19,672.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:676.68,678.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:678.17,680.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:684.45,686.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:692.153,697.39 4 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:715.2,715.73 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:721.2,726.32 4 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:697.39,700.65 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:705.3,705.25 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:700.65,703.4 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:705.25,708.18 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:708.18,711.5 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:715.73,718.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:729.67,732.16 3 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:735.2,735.50 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:738.2,738.19 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:732.16,734.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:735.50,737.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:741.91,742.61 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:754.2,754.12 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:742.61,743.58 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:743.58,745.18 2 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:748.4,748.38 1 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:745.18,747.5 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:748.38,751.5 2 1 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:759.213,764.39 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:784.2,784.74 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:790.2,801.19 6 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:764.39,769.17 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:774.3,774.25 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:769.17,772.4 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:774.25,777.18 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:777.18,780.5 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:784.74,787.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:806.65,812.2 4 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:816.132,820.17 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:824.2,824.77 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:829.2,834.16 5 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:839.2,839.51 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:844.2,845.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:850.2,856.16 4 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:859.2,863.12 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:890.2,890.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:820.17,822.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:824.77,827.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:834.16,836.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:839.51,842.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:845.16,847.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:856.16,858.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:863.12,864.10 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:884.3,884.10 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:865.15,867.10 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:868.28,869.18 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:877.4,882.5 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:869.18,876.5 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:885.42,885.42 0 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:886.11,887.110 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:896.109,898.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:901.2,901.58 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:898.16,900.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:905.58,907.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:911.65,918.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:921.29,924.2 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:927.69,938.16 6 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:943.2,951.16 5 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:956.2,961.83 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:966.2,972.19 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:938.16,941.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:951.16,953.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:961.83,963.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:976.102,987.16 6 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:993.2,1001.16 5 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1006.2,1015.83 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1019.2,1020.26 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1027.2,1027.18 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:987.16,990.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1001.16,1002.13 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1015.83,1017.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1020.26,1025.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1034.9,1037.16 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1040.2,1040.44 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1044.2,1044.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1037.16,1039.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1040.44,1043.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1047.70,1049.17 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1054.2,1054.24 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1059.2,1059.88 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1063.2,1063.14 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1049.17,1051.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1054.24,1056.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1059.88,1061.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1071.9,1074.23 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1092.2,1092.60 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1101.2,1102.59 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1105.2,1106.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1111.2,1112.53 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1115.2,1116.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1121.2,1138.16 4 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1144.2,1148.12 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1074.23,1076.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1079.3,1079.20 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1076.17,1078.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1080.8,1082.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1086.3,1086.72 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1082.17,1084.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1086.72,1088.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1092.60,1098.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1102.59,1104.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1106.16,1108.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1112.53,1114.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1116.16,1118.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1138.16,1141.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1156.35,1160.16 4 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1164.2,1171.46 5 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1177.2,1180.43 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1205.2,1206.24 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1160.16,1162.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1171.46,1172.87 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1172.87,1174.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1180.43,1181.36 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1184.3,1184.92 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1189.3,1198.17 4 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1201.3,1203.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1181.36,1182.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1184.92,1186.9 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1198.17,1200.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1209.131,1211.103 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1214.2,1214.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1211.103,1213.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1217.52,1219.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1230.26,1233.16 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1238.2,1241.16 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1246.2,1247.24 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1252.2,1255.49 3 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1258.2,1265.26 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1233.16,1235.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1241.16,1243.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1247.24,1249.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1249.8,1251.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1255.49,1257.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1278.49,1280.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1282.80,1284.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1291.40,1291.65 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1292.40,1292.52 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1293.40,1293.56 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1294.40,1294.63 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1295.40,1295.69 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1296.40,1296.64 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1297.40,1297.66 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1298.40,1298.65 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1301.70,1312.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1321.19,1338.16 5 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1342.2,1343.21 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1338.16,1340.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1346.73,1347.22 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1352.2,1352.19 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1347.22,1348.63 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1348.63,1350.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1355.96,1360.29 4 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1370.2,1370.29 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1376.2,1377.10 2 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1360.29,1361.50 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1367.3,1367.32 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1361.50,1363.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1363.9,1365.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1370.29,1371.51 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1371.51,1373.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/bor.go:1380.48,1382.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:14.56,21.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:29.52,35.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:42.59,49.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:59.53,66.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:73.44,79.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:87.52,93.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:101.50,107.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:118.47,126.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/errors.go:135.52,143.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:31.47,31.64 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:32.47,32.93 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:33.47,33.74 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:45.13,56.2 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:59.161,61.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:64.2,65.51 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:68.2,73.67 4 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:77.2,77.18 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:61.16,63.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:65.51,67.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:73.67,75.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:81.51,83.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:86.2,86.59 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:83.16,85.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:90.37,100.39 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:104.2,104.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:100.39,102.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:107.70,109.23 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:113.2,113.38 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:118.2,118.46 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:122.2,124.33 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:165.2,168.18 3 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:109.23,111.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:113.38,114.67 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:114.67,116.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:118.46,120.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:124.33,129.63 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:134.3,135.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:140.3,140.52 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:144.3,144.66 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:149.3,152.52 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:129.63,131.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:135.17,137.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:140.52,142.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:144.66,146.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:152.52,153.65 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:156.4,162.25 5 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:153.65,155.5 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:172.82,176.25 4 1 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:179.2,180.23 2 1 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:184.2,185.32 2 1 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:190.2,190.39 1 1 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:176.25,178.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:180.23,182.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:185.32,186.32 1 1 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:186.32,188.4 1 1 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:194.47,196.48 2 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:199.2,199.13 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:196.48,198.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:203.61,205.66 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:209.2,218.31 7 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:222.2,222.62 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:205.66,207.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/snapshot.go:218.31,220.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:53.67,62.2 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:64.104,66.6 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:87.2,87.53 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:90.2,90.26 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:66.6,70.17 4 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:73.3,74.29 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:77.3,77.73 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:80.3,81.43 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:84.3,84.36 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:70.17,72.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:74.29,75.9 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:77.73,79.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:81.43,82.9 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:87.53,89.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:94.71,98.16 3 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:101.2,101.67 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:105.2,105.24 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:98.16,100.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:101.67,103.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:109.94,111.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:115.2,118.27 3 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:111.16,113.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:122.103,124.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:128.2,136.30 5 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:141.2,144.6 3 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:124.16,126.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:136.30,138.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:144.6,147.10 3 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:148.20,150.35 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:151.19,153.32 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:153.32,155.5 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:161.81,163.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:166.2,169.52 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:174.2,175.27 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:180.2,181.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:185.2,185.56 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:189.2,189.23 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:163.16,165.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:169.52,171.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:175.27,177.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:181.16,183.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:185.56,187.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/rest.go:193.34,196.2 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:24.73,30.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:34.39,37.2 2 1 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:41.54,43.14 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:46.2,46.18 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:49.2,49.49 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:43.14,45.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:46.18,48.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:49.49,51.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:51.8,51.56 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:51.56,53.3 1 1 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:53.8,55.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:55.17,57.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:57.9,57.24 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:57.24,59.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:59.9,60.48 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:65.37,66.14 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:69.2,72.22 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:66.14,68.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:76.52,78.27 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:82.2,82.34 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:78.27,80.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:86.42,91.2 4 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:94.41,99.2 4 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:102.45,108.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:111.68,112.34 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:116.2,117.48 2 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:127.2,127.20 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:112.34,114.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:117.48,125.3 5 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:141.59,142.36 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:145.2,145.10 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:142.36,144.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:149.77,150.27 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:153.2,153.8 1 0 -github.com/ethereum/go-ethereum/consensus/bor/validator.go:150.27,152.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:34.73,37.55 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:43.2,43.19 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:46.2,46.80 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:37.55,39.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:39.8,41.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:43.19,45.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:50.77,53.55 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:59.2,59.19 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:62.2,63.21 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:53.55,55.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:55.8,57.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:59.19,61.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:67.72,69.19 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:72.2,72.80 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:69.19,71.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:76.79,79.55 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:85.2,85.19 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:88.2,89.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:92.2,92.28 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:79.55,81.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:81.8,83.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:85.19,87.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:89.16,91.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:96.78,98.19 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:101.2,102.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:105.2,105.28 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:98.19,100.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:102.16,104.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:109.62,111.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:114.2,114.53 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:111.16,113.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:118.62,120.16 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:123.2,123.42 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:120.16,122.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:127.71,128.54 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:131.2,132.54 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:135.2,136.34 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:139.2,140.46 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:143.2,146.32 4 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:155.2,159.41 4 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:173.2,174.83 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:177.2,179.18 3 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:128.54,130.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:132.54,134.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:136.34,138.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:140.46,142.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:146.32,149.26 3 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:149.26,153.4 3 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:159.41,171.3 5 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:174.83,176.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:182.49,184.30 2 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:187.2,187.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:184.30,186.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/api.go:190.54,192.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/clerk.go:27.61,39.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/clerk.go:41.63,50.2 1 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:38.27,49.2 3 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:56.19,59.16 3 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:62.2,65.16 4 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:69.2,73.16 4 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:76.2,76.21 1 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:59.16,61.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:65.16,68.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:73.16,75.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:79.88,83.16 4 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:88.2,96.16 5 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:100.2,101.85 2 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:104.2,104.18 1 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:83.16,86.3 2 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:96.16,98.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/genesis_contracts_client.go:101.85,103.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:3.43,5.25 2 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:11.2,11.15 1 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:5.25,7.17 2 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:7.17,9.4 1 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:14.38,15.12 1 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:19.2,27.10 9 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:15.12,17.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:30.61,32.22 2 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:35.2,36.8 2 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:32.22,34.3 1 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:39.43,41.27 2 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:47.2,47.15 1 0 -github.com/ethereum/go-ethereum/consensus/bor/merkle.go:41.27,46.3 3 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:39.73,42.55 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:48.2,48.19 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:51.2,51.83 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:42.55,44.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:44.8,46.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:48.19,50.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:55.72,57.19 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:60.2,60.83 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:57.19,59.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:64.79,67.55 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:73.2,73.19 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:76.2,77.16 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:80.2,80.28 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:67.55,69.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:69.8,71.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:73.19,75.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:77.16,79.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:84.78,86.19 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:89.2,90.16 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:93.2,93.28 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:86.19,88.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:90.16,92.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:97.53,102.50 4 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:105.2,105.18 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:102.50,104.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:110.60,115.2 3 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:119.49,124.2 3 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:136.43,144.16 3 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:147.2,152.21 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:156.2,157.28 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:160.2,160.31 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:175.2,179.8 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:144.16,146.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:152.21,155.3 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:157.28,159.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:160.31,162.15 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:165.3,165.40 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:168.3,170.17 3 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:173.3,173.23 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:162.15,164.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:165.40,167.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:170.17,172.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:187.68,190.53 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:195.2,196.53 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:199.2,200.16 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:203.2,204.12 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:190.53,193.3 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:196.53,198.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:200.16,202.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:210.89,211.32 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:226.2,227.65 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:230.2,231.66 2 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:234.2,234.34 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:211.32,214.27 3 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:221.3,221.20 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:224.3,224.35 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:214.27,216.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:216.9,216.50 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:216.50,218.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:218.9,218.54 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:218.54,220.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:221.20,223.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:227.65,229.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/api.go:231.66,233.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:146.86,149.49 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:153.2,153.35 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:156.2,160.16 3 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:163.2,167.20 4 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:149.49,151.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:153.35,155.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:160.16,162.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:191.66,194.21 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:198.2,207.3 3 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:194.21,196.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:212.71,214.2 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:217.105,219.2 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:224.138,228.12 3 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:239.2,239.23 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:228.12,229.34 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:229.34,232.11 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:233.17,234.11 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:235.24,235.24 0 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:246.119,247.26 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:250.2,253.45 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:257.2,258.57 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:262.2,262.98 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:265.2,265.64 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:269.2,269.37 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:272.2,272.47 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:276.2,277.38 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:280.2,280.58 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:284.2,284.41 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:288.2,288.35 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:292.2,292.16 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:298.2,298.42 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:302.2,302.77 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:306.2,306.56 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:247.26,249.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:253.45,255.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:258.57,260.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:262.98,264.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:265.64,267.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:269.37,271.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:272.47,274.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:277.38,279.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:280.58,282.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:284.41,286.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:288.35,290.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:292.16,293.117 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:293.117,295.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:298.42,300.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:302.77,304.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:313.128,316.17 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:320.2,321.22 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:326.2,326.95 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:329.2,329.47 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:333.2,333.38 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:336.2,336.45 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:349.2,350.16 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:354.2,354.32 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:365.2,365.44 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:316.17,318.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:321.22,323.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:323.8,325.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:326.95,328.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:329.47,331.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:333.38,335.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:336.45,338.28 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:341.3,341.79 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:338.28,340.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:341.79,343.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:344.8,344.88 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:344.88,347.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:350.16,352.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:354.32,356.41 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:359.3,360.67 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:356.41,358.4 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:360.67,362.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:369.139,375.18 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:430.2,430.38 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:433.2,434.16 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:437.2,440.61 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:446.2,446.18 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:375.18,377.39 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:382.3,382.37 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:393.3,393.147 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:411.3,412.23 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:426.3,427.45 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:377.39,379.9 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:382.37,383.78 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:383.78,386.10 3 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:393.147,395.25 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:395.25,399.39 3 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:402.5,403.44 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:406.5,407.10 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:399.39,401.6 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:403.44,405.6 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:412.23,415.65 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:418.4,418.38 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:415.65,417.5 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:419.9,422.21 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:422.21,424.5 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:430.38,432.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:434.16,436.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:440.61,441.41 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:444.3,444.88 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:441.41,443.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:451.86,452.29 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:455.2,455.12 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:452.29,454.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:462.98,465.17 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:469.2,470.16 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:473.2,473.40 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:476.2,476.41 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:485.2,485.17 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:494.2,494.12 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:465.17,467.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:470.16,472.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:473.40,475.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:476.41,477.23 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:477.23,479.69 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:479.69,481.5 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:485.17,487.55 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:490.3,490.56 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:487.55,489.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:490.56,492.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:499.89,507.16 5 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:510.2,510.32 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:532.2,535.37 2 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:538.2,540.32 2 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:545.2,552.19 4 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:555.2,556.45 2 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:559.2,559.12 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:507.16,509.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:510.32,515.47 3 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:521.3,521.25 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:529.3,529.19 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:515.47,516.42 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:516.42,518.5 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:521.25,523.36 2 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:523.36,525.5 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:525.10,527.5 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:535.37,537.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:540.32,541.41 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:541.41,543.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:552.19,554.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:556.45,558.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:564.156,568.2 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:572.216,578.2 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:582.68,588.2 4 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:592.135,597.17 3 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:601.2,601.60 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:605.2,611.16 5 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:614.2,614.56 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:618.2,618.41 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:627.2,628.44 2 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:636.2,637.16 2 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:640.2,643.12 3 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:657.2,657.12 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:597.17,599.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:601.60,603.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:611.16,613.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:614.56,616.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:618.41,619.23 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:619.23,621.87 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:621.87,623.5 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:628.44,634.3 3 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:637.16,639.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:643.12,644.10 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:650.3,650.10 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:645.15,646.10 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:647.28,647.28 0 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:651.42,651.42 0 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:652.11,653.81 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:664.112,666.16 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:669.2,669.39 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:666.16,668.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:672.69,673.40 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:676.2,676.37 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:673.40,675.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:680.61,682.2 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:685.32,687.2 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:691.68,698.2 1 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:701.56,706.2 4 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:715.45,719.2 3 0 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:721.57,739.27 2 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:742.2,742.43 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:739.27,741.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/clique.go:742.43,743.40 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:65.47,65.64 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:66.47,66.93 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:67.47,67.74 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:72.140,82.33 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:85.2,85.13 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:82.33,84.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:89.128,91.16 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:94.2,95.51 2 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:98.2,101.18 3 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:91.16,93.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:95.51,97.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:105.51,107.16 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:110.2,110.62 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:107.16,109.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:114.37,125.32 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:128.2,128.39 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:131.2,131.38 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:134.2,136.12 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:125.32,127.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:128.39,130.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:131.38,133.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:141.75,144.2 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:147.70,149.38 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:153.2,153.37 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:159.2,159.13 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:149.38,151.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:153.37,156.3 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:156.8,158.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:163.72,166.9 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:170.2,170.34 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:174.2,174.21 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:180.2,180.13 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:166.9,168.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:170.34,172.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:174.21,177.3 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:177.8,179.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:185.70,187.23 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:191.2,191.38 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:196.2,196.46 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:200.2,206.33 3 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:300.2,300.39 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:303.2,306.18 3 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:187.23,189.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:191.38,192.67 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:192.67,194.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:196.46,198.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:206.33,209.33 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:214.3,214.64 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:218.3,219.17 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:222.3,222.41 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:225.3,225.39 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:230.3,233.35 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:244.3,245.10 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:253.3,253.44 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:262.3,262.78 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:295.3,295.41 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:209.33,212.4 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:214.64,216.4 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:219.17,221.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:222.41,224.4 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:225.39,226.24 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:226.24,228.5 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:233.35,234.64 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:234.64,240.10 3 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:246.52,247.20 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:248.52,249.21 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:250.11,251.30 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:253.44,260.4 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:262.78,263.23 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:286.4,286.41 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:292.4,292.39 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:263.23,265.5 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:265.10,269.66 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:273.5,273.42 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:269.66,271.6 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:273.42,274.49 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:274.49,282.7 3 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:286.41,287.49 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:287.49,290.6 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:295.41,298.4 2 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:300.39,302.3 1 0 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:310.47,312.29 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:315.2,316.13 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:312.29,314.3 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:320.70,322.57 2 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:325.2,325.58 1 1 -github.com/ethereum/go-ethereum/consensus/clique/snapshot.go:322.57,324.3 1 0 -github.com/ethereum/go-ethereum/common/prque/prque.go:30.44,32.2 1 1 -github.com/ethereum/go-ethereum/common/prque/prque.go:35.54,37.2 1 0 -github.com/ethereum/go-ethereum/common/prque/prque.go:40.56,42.2 1 1 -github.com/ethereum/go-ethereum/common/prque/prque.go:45.45,48.2 2 0 -github.com/ethereum/go-ethereum/common/prque/prque.go:52.44,55.2 2 1 -github.com/ethereum/go-ethereum/common/prque/prque.go:58.39,60.2 1 0 -github.com/ethereum/go-ethereum/common/prque/prque.go:63.43,64.11 1 0 -github.com/ethereum/go-ethereum/common/prque/prque.go:67.2,67.31 1 0 -github.com/ethereum/go-ethereum/common/prque/prque.go:64.11,66.3 1 0 -github.com/ethereum/go-ethereum/common/prque/prque.go:71.30,73.2 1 1 -github.com/ethereum/go-ethereum/common/prque/prque.go:76.28,78.2 1 1 -github.com/ethereum/go-ethereum/common/prque/prque.go:81.25,83.2 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:45.68,53.2 7 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:57.41,58.26 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:67.2,67.23 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:70.2,72.10 3 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:58.26,63.3 4 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:63.8,63.34 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:63.34,66.3 2 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:67.23,69.3 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:77.42,80.18 3 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:84.2,85.23 2 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:88.2,88.8 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:80.18,83.3 2 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:85.23,87.3 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:92.28,94.2 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:98.38,100.18 2 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:103.2,103.14 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:100.18,102.3 1 0 -github.com/ethereum/go-ethereum/common/prque/sstack.go:107.33,110.23 3 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:114.2,114.43 1 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:110.23,113.3 2 1 -github.com/ethereum/go-ethereum/common/prque/sstack.go:118.26,120.2 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:56.166,70.2 4 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:73.29,76.2 2 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:79.31,81.54 2 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:81.54,85.3 3 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:89.49,91.28 2 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:94.2,96.40 3 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:91.28,93.3 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:100.44,102.2 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:105.39,107.2 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:110.48,115.57 2 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:120.2,120.24 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:115.57,119.3 3 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:125.37,126.27 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:132.2,132.27 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:135.2,135.11 1 0 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:126.27,127.99 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:130.3,130.11 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:127.99,129.4 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:132.27,134.3 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:141.84,143.22 2 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:143.22,147.129 4 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:147.129,149.38 2 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:155.4,155.29 1 0 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:149.38,150.31 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:153.5,153.11 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:150.31,152.6 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:161.43,164.2 2 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:167.51,168.15 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:171.2,171.76 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:168.15,170.3 1 0 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:175.34,177.2 1 0 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:180.32,182.2 1 0 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:185.60,186.17 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:186.17,188.3 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:188.8,190.3 1 1 -github.com/ethereum/go-ethereum/common/prque/lazyqueue.go:194.60,196.2 1 1 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:47.87,49.32 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:53.2,54.81 2 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:58.2,58.27 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:68.2,68.12 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:49.32,51.3 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:54.81,56.3 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:58.27,59.59 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:59.59,61.4 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:62.8,63.58 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:63.58,65.4 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:74.47,76.46 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:81.2,81.45 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:76.46,78.3 1 0 -github.com/ethereum/go-ethereum/consensus/misc/dao.go:81.45,84.3 2 0 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:32.90,35.37 2 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:38.2,38.72 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:42.2,42.27 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:46.2,47.46 2 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:51.2,51.12 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:35.37,37.3 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:38.72,40.3 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:42.27,44.3 1 0 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:47.46,50.3 1 0 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:55.77,57.37 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:61.2,67.39 2 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:70.2,70.38 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:57.37,59.3 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:67.39,69.3 1 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:70.38,81.3 5 1 -github.com/ethereum/go-ethereum/consensus/misc/eip1559.go:81.8,92.3 5 1 -github.com/ethereum/go-ethereum/consensus/misc/forks.go:30.91,32.11 1 0 -github.com/ethereum/go-ethereum/consensus/misc/forks.go:36.2,36.77 1 0 -github.com/ethereum/go-ethereum/consensus/misc/forks.go:42.2,42.12 1 0 -github.com/ethereum/go-ethereum/consensus/misc/forks.go:32.11,34.3 1 0 -github.com/ethereum/go-ethereum/consensus/misc/forks.go:36.77,37.81 1 0 -github.com/ethereum/go-ethereum/consensus/misc/forks.go:37.81,39.4 1 0 -github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:28.66,31.14 2 1 -github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:34.2,35.27 2 1 -github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:38.2,38.41 1 1 -github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:41.2,41.12 1 1 -github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:31.14,33.3 1 1 -github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:35.27,37.3 1 1 -github.com/ethereum/go-ethereum/consensus/misc/gaslimit.go:38.41,40.3 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:38.63,42.2 3 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:45.44,46.54 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:51.2,51.16 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:62.2,62.35 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:67.2,68.20 2 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:79.2,79.13 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:46.54,49.3 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:51.16,53.20 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:56.3,56.10 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:53.20,55.4 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:57.8,60.3 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:62.35,65.3 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:68.20,71.64 3 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:75.3,75.32 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:71.64,74.4 2 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:76.8,78.3 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:83.46,85.2 1 1 -github.com/ethereum/go-ethereum/core/asm/asm.go:88.44,90.2 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:93.47,95.2 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:98.45,100.2 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:103.43,105.16 2 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:109.2,110.16 2 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:117.2,117.19 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:105.16,107.3 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:110.16,111.43 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:111.43,113.4 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:113.9,115.4 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:121.51,125.16 3 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:132.2,132.35 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:135.2,135.20 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:125.16,126.43 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:126.43,128.4 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:128.9,130.4 1 0 -github.com/ethereum/go-ethereum/core/asm/asm.go:132.35,134.3 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:43.40,48.2 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:59.42,61.20 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:86.2,86.13 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:61.20,62.16 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:83.3,84.11 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:63.15,65.21 2 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:68.4,68.20 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:69.20,70.27 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:71.16,72.10 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:73.17,75.10 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:76.14,78.48 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:65.21,67.5 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:78.48,80.5 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:86.13,88.3 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:97.48,101.28 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:108.2,109.29 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:117.2,117.20 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:101.28,102.41 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:102.41,104.4 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:109.29,110.24 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:111.18,112.45 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:113.15,114.31 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:122.33,126.2 3 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:130.40,132.24 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:136.2,137.20 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:152.2,152.37 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:156.2,156.12 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:132.24,134.3 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:138.11,139.13 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:140.15,141.50 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:144.16,145.19 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:146.15,147.13 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:148.10,149.85 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:141.50,143.4 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:152.37,154.3 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:160.62,162.19 2 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:165.2,166.22 2 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:162.19,164.3 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:172.56,175.26 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:227.2,227.12 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:175.26,177.21 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:195.3,196.13 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:178.15,180.27 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:181.20,183.50 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:184.14,188.18 4 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:189.16,190.11 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:191.11,192.69 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:197.8,197.33 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:197.33,202.21 3 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:217.3,217.22 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:221.3,222.19 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:203.15,205.23 2 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:208.20,209.55 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:210.14,212.56 2 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:213.11,214.69 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:205.23,207.5 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:217.22,219.4 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:223.8,225.3 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:231.35,233.2 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:236.43,237.13 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:240.2,240.32 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:237.13,239.3 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:245.29,247.2 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:250.29,252.2 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:255.38,257.2 1 1 -github.com/ethereum/go-ethereum/core/asm/compiler.go:266.40,268.2 1 0 -github.com/ethereum/go-ethereum/core/asm/compiler.go:270.50,276.2 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:62.37,63.37 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:66.2,66.29 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:63.37,65.3 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:98.50,106.12 3 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:115.2,115.11 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:106.12,108.22 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:111.3,112.18 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:108.22,110.4 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:119.36,120.27 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:124.2,126.13 3 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:120.27,123.3 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:130.26,132.2 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:135.29,139.2 3 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:142.26,144.2 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:147.43,148.43 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:152.2,154.14 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:148.43,150.3 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:159.41,160.44 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:162.2,162.12 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:160.45,161.3 0 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:167.49,169.75 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:175.2,175.13 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:169.75,170.13 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:170.13,172.4 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:179.31,181.2 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:184.35,187.13 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:191.2,192.17 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:187.13,189.3 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:196.32,197.6 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:197.6,198.25 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:199.18,204.21 4 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:205.36,206.21 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:207.19,208.14 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:209.32,210.21 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:211.20,212.20 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:213.17,215.19 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:216.17,217.26 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:218.11,219.14 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:226.35,231.2 3 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:236.33,242.2 3 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:247.40,248.27 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:252.2,252.16 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:248.27,250.3 1 0 -github.com/ethereum/go-ethereum/core/asm/lexer.go:255.34,257.20 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:260.2,264.16 3 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:257.20,259.3 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:267.35,270.21 2 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:278.2,278.16 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:270.21,275.3 3 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:275.8,277.3 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:281.28,283.2 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:285.27,287.2 1 1 -github.com/ethereum/go-ethereum/core/asm/lexer.go:289.28,291.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:90.47,93.17 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:96.2,96.67 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:101.2,101.18 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:93.17,95.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:96.67,98.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:98.8,100.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:117.156,125.2 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:129.179,134.16 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:137.2,138.16 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:141.2,142.30 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:134.16,136.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:138.16,140.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:149.114,151.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:154.2,154.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:158.2,159.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:162.2,168.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:197.2,197.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:202.2,203.58 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:151.17,153.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:154.20,156.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:159.16,161.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:168.18,170.10 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:173.3,174.37 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:170.10,172.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:174.37,176.64 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:176.64,178.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:178.10,178.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:178.29,180.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:182.8,184.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:187.3,187.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:184.17,186.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:187.23,189.81 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:189.81,191.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:191.10,191.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:191.29,193.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:197.24,201.3 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:207.120,210.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:215.2,215.44 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:210.16,212.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:220.102,224.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:228.82,232.2 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:234.149,237.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:241.2,242.22 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:250.2,251.22 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:257.2,257.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:261.2,262.24 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:270.2,271.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:274.2,283.33 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:237.18,239.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:242.22,244.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:247.3,247.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:244.17,246.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:251.22,256.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:257.34,259.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:262.24,265.17 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:265.17,267.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:271.16,273.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:286.128,287.52 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:291.2,292.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:296.2,297.21 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:305.2,306.24 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:314.2,315.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:318.2,326.33 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:287.52,289.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:292.18,294.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:297.21,299.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:302.3,302.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:299.17,301.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:306.24,309.17 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:309.17,311.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:315.16,317.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:329.166,330.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:338.2,347.67 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:330.21,332.98 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:332.98,334.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:334.9,334.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:334.28,336.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:350.70,351.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:351.23,353.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:353.8,355.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:360.122,361.78 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:365.2,369.26 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:382.2,382.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:386.2,386.24 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:389.2,390.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:393.2,393.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:396.2,396.92 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:399.2,399.22 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:361.78,363.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:369.26,371.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:371.8,373.101 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:373.101,375.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:375.9,375.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:375.33,377.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:377.9,380.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:382.16,384.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:386.24,388.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:390.16,392.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:393.17,395.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:396.92,398.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:404.135,406.17 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:410.2,413.16 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:417.2,424.21 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:430.2,431.16 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:434.2,434.69 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:445.2,445.16 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:448.2,448.23 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:406.17,408.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:413.16,415.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:424.21,426.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:431.16,433.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:434.69,435.28 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:442.3,442.13 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:435.28,436.11 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:437.21,437.21 0 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:438.16,439.15 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:445.16,447.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:453.133,455.17 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:459.2,462.16 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:466.2,472.23 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:475.2,476.16 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:479.2,479.23 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:455.17,457.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:462.16,464.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:472.23,474.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:476.16,478.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:483.87,484.45 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:487.2,487.23 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:492.2,493.49 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:498.2,498.54 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:484.45,486.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:487.23,488.73 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:488.73,490.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:493.49,494.18 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:494.18,496.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:502.105,503.45 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:506.2,506.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:511.2,512.49 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:517.2,517.61 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:503.45,505.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:506.23,507.67 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:507.67,509.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:512.49,513.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:513.18,515.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:522.57,523.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:526.2,526.12 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/base.go:523.16,525.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:50.179,61.34 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:213.2,213.34 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:218.2,234.51 5 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:238.2,238.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:246.2,246.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:61.34,64.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:68.3,68.48 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:76.3,92.51 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:98.3,98.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:139.3,139.42 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:169.3,169.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:172.3,172.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:176.3,176.43 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:180.3,194.21 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:198.3,198.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:64.17,66.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:68.48,69.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:72.4,72.12 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:69.26,71.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:92.51,93.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:93.29,95.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:98.43,104.30 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:107.4,107.35 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:110.4,114.44 5 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:122.4,124.46 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:133.4,133.29 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:104.30,106.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:107.35,109.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:114.44,115.25 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:118.5,118.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:115.25,117.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:118.30,120.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:124.46,125.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:128.5,128.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:125.26,127.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:128.31,130.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:133.29,135.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:135.10,137.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:139.42,141.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:145.4,149.40 3 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:152.4,157.44 5 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:166.4,166.82 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:141.26,142.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:149.40,151.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:157.44,158.25 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:161.5,161.30 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:158.25,160.6 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:161.30,163.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:169.27,171.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:172.26,174.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:176.43,178.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:194.21,196.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:198.35,200.18 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:203.4,203.15 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:200.18,202.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:203.15,206.34 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:206.34,208.6 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:213.34,216.3 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:234.51,236.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:238.20,240.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:243.3,243.27 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:240.17,242.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:257.44,258.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:259.21,260.26 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:261.29,263.19 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:267.3,267.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:268.24,269.44 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:270.19,271.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:272.22,273.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:274.10,276.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:264.30,265.53 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:283.71,284.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:285.19,286.55 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:287.19,288.74 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:289.19,290.48 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:291.10,292.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:297.46,298.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:299.21,300.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:301.29,305.22 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:310.3,310.22 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:314.3,322.22 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:325.3,325.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:326.37,327.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:328.18,329.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:330.20,331.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:332.22,333.20 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:334.10,335.23 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:305.22,307.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:310.22,312.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:322.22,324.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:341.43,342.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:354.2,354.19 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:343.17,344.17 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:345.16,346.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:347.17,348.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:349.16,350.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:351.16,352.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:360.73,361.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:362.19,363.55 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:364.32,365.62 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:366.10,367.33 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:380.76,389.44 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:392.2,392.14 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:389.44,391.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:397.78,406.44 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:409.2,409.14 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:406.44,408.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:422.77,423.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:424.19,432.37 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:435.3,436.40 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:440.3,441.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:444.3,448.14 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:449.19,450.80 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:451.19,452.54 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:453.10,454.31 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:432.37,434.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:436.40,439.4 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:441.17,443.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:461.79,462.16 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:463.19,471.37 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:474.3,475.40 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:479.3,480.17 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:483.3,487.14 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:488.32,489.68 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:490.10,491.33 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:471.37,473.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:475.40,478.4 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:480.17,482.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:498.42,498.77 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:504.62,505.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:506.16,507.18 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:508.17,509.16 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:510.10,512.22 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:515.3,515.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:512.22,514.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:516.30,517.22 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:520.4,520.66 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:522.11,523.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:517.22,519.5 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:530.56,531.39 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:534.2,534.10 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:531.39,533.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:548.40,549.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:553.2,554.49 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:549.21,551.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:559.42,560.19 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:563.2,564.27 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:577.2,577.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:560.19,562.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:564.27,566.21 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:571.3,572.35 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:575.3,575.23 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:566.21,568.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:572.35,574.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:582.33,583.13 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:584.19,585.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:586.19,587.28 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:588.19,589.14 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/bind.go:590.10,591.15 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:32.101,37.6 4 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:37.6,39.17 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:43.3,43.40 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:50.3,50.10 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:39.17,41.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:43.40,45.4 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:45.9,47.4 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:51.21,52.25 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:53.24,53.24 0 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:60.104,61.20 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:64.2,65.16 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:68.2,68.51 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:74.2,75.34 2 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:78.2,78.37 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:61.20,63.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:65.16,67.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:68.51,70.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/util.go:75.34,77.3 1 1 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:46.79,49.16 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:52.2,53.16 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:56.2,56.48 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:49.16,51.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:53.16,55.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:63.106,68.91 3 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:68.91,69.34 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:72.4,73.18 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:76.4,76.46 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:69.34,71.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:73.18,75.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:86.62,92.91 4 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:92.91,93.26 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:96.4,97.18 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:100.4,100.46 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:93.26,95.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:97.18,99.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:108.108,110.16 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:113.2,114.16 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:117.2,117.63 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:110.16,112.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:114.16,116.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:122.135,123.20 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:126.2,129.91 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:123.20,125.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:129.91,130.34 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:133.4,134.18 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:137.4,137.46 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:130.34,132.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:134.18,136.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:145.100,147.20 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:150.2,153.91 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:147.20,149.3 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:153.91,154.26 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:157.4,158.18 2 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:161.4,161.46 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:154.26,156.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:158.18,160.5 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:169.95,172.100 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:172.100,173.34 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:176.4,176.49 1 0 -github.com/ethereum/go-ethereum/accounts/abi/bind/auth.go:173.34,175.5 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:69.77,75.43 3 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:84.2,84.52 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:75.43,76.19 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:81.3,82.8 2 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:76.19,79.12 2 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:88.42,94.2 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:98.41,102.17 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:102.17,104.4 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:109.78,110.24 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:111.2,111.41 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:110.24,110.36 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:117.94,125.29 4 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:131.2,134.27 2 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:125.29,128.3 2 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:134.27,155.30 2 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:194.3,195.13 2 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:155.30,158.20 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:163.4,163.26 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:174.4,174.27 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:185.4,185.39 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:192.4,192.38 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:158.20,159.13 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:163.26,166.39 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:170.5,170.15 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:166.39,168.6 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:174.27,175.27 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:175.27,177.29 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:180.6,180.16 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:177.29,179.7 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:185.39,186.27 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:186.27,189.6 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:201.54,205.2 3 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:208.43,212.2 3 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:215.55,221.39 4 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:237.2,237.34 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:245.2,245.34 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:252.2,252.37 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:255.2,255.14 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:221.39,224.46 2 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:227.3,227.49 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:231.3,232.18 2 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:224.46,225.12 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:227.49,228.12 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:232.18,234.4 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:237.34,238.39 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:238.39,239.27 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:239.27,241.5 1 0 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:245.34,246.29 1 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:246.29,249.4 2 1 -github.com/ethereum/go-ethereum/core/forkid/forkid.go:252.37,254.3 1 1 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:39.112,41.16 2 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:44.2,44.67 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:41.16,43.3 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:48.63,50.2 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:53.71,55.2 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:59.162,62.33 2 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:73.2,73.14 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:62.33,63.28 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:63.28,65.18 2 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:68.4,68.62 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:65.18,66.13 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:68.62,70.5 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:81.178,87.33 2 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:95.2,95.99 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:87.33,88.25 1 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:91.3,93.29 3 0 -github.com/ethereum/go-ethereum/contracts/checkpointoracle/oracle.go:88.25,90.4 1 0 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:45.54,46.21 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:49.2,50.44 2 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:53.2,53.15 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:46.21,48.3 1 0 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:50.44,52.3 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:58.67,60.29 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:63.2,63.24 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:67.2,69.51 3 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:84.2,85.12 2 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:60.29,62.3 1 0 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:63.24,65.3 1 0 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:69.51,71.21 2 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:74.3,82.59 9 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:71.21,72.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:90.54,91.29 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:94.2,94.33 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:97.2,97.27 1 1 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:91.29,93.3 1 0 -github.com/ethereum/go-ethereum/core/bloombits/generator.go:94.33,96.3 1 0 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:38.46,42.33 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:45.2,45.13 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:42.33,44.3 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:92.66,105.33 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:124.2,124.44 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:131.2,131.10 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:105.33,107.23 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:110.3,111.33 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:119.3,119.23 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:107.23,108.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:111.33,112.21 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:116.4,116.43 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:112.21,114.10 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:119.23,121.4 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:124.44,125.50 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:125.50,126.46 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:126.46,128.5 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:137.42,138.36 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:141.2,141.39 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:138.36,140.3 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:147.111,149.43 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:152.2,160.41 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:163.2,167.12 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:214.2,214.21 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:149.43,151.3 1 0 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:160.41,162.3 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:167.12,171.7 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:171.7,172.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:173.24,174.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:176.27,178.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:182.5,185.22 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:188.5,189.19 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:193.5,193.36 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:178.12,180.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:185.22,187.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:189.19,191.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:193.36,196.19 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:203.6,203.44 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:196.19,197.19 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:200.7,200.15 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:197.19,199.8 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:203.44,204.14 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:205.27,206.14 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:207.25,207.25 0 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:224.100,229.12 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:242.2,245.34 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:249.2,252.13 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:229.12,233.63 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:233.63,234.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:235.24,236.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:237.88,237.88 0 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:245.34,247.3 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:259.145,263.29 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:272.2,276.12 4 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:319.2,319.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:376.2,376.16 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:263.29,264.28 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:264.28,269.4 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:276.12,281.16 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:289.3,289.7 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:281.16,282.48 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:282.48,283.44 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:283.44,285.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:289.7,290.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:291.24,292.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:294.32,296.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:300.5,300.49 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:310.5,310.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:296.12,298.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:300.49,301.45 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:301.45,302.14 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:303.27,304.14 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:305.40,305.40 0 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:311.25,312.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:313.28,313.28 0 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:319.12,325.7 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:325.7,326.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:327.24,328.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:330.33,332.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:336.5,337.45 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:360.5,360.24 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:363.5,363.29 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:366.5,366.36 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:332.12,334.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:337.45,339.41 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:353.6,353.25 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:339.41,341.14 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:346.7,346.27 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:342.27,343.14 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:344.29,344.29 0 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:346.27,349.8 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:349.13,351.8 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:353.25,355.7 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:355.12,357.7 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:360.24,362.6 1 0 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:363.29,365.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:366.36,367.13 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:368.26,369.13 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:370.64,370.64 0 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:381.76,394.27 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:406.2,406.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:394.27,395.10 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:396.34,398.18 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:399.11,402.30 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:406.6,407.10 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:408.19,412.19 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:416.22,419.54 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:420.4,423.23 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:427.32,430.30 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:436.4,437.26 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:440.4,441.18 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:443.32,445.45 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:447.34,450.67 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:457.4,460.35 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:464.33,472.42 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:480.4,484.24 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:498.4,498.38 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:412.19,414.5 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:419.54,419.88 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:423.23,425.5 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:430.30,431.32 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:431.32,433.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:437.26,439.5 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:450.67,453.5 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:453.10,456.5 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:460.35,462.5 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:472.42,473.25 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:477.5,478.38 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:473.25,475.14 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:484.24,486.37 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:490.5,492.35 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:486.37,487.56 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:488.6,488.83 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:487.56,487.86 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:492.35,494.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:498.38,500.5 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:523.34,524.21 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:524.21,528.3 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:532.40,537.2 3 0 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:542.59,545.9 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:546.16,547.18 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:548.39,550.17 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:556.56,559.9 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:560.16,561.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:562.37,564.24 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:570.73,573.9 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:574.16,575.13 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:576.39,582.30 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:588.89,590.2 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:598.93,599.6 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:599.6,602.10 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:606.3,606.37 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:619.3,622.10 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:602.10,604.4 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:606.37,607.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:608.18,612.11 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:614.28,614.28 0 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:623.17,626.10 2 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:628.23,633.27 3 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:639.4,639.66 1 1 -github.com/ethereum/go-ethereum/core/bloombits/matcher.go:633.27,638.5 4 0 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:49.40,54.2 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:59.125,68.2 4 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:73.29,77.40 3 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:77.40,78.24 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:78.24,80.4 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:87.134,93.6 3 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:93.6,94.10 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:95.15,96.10 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:98.30,100.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:104.4,107.35 3 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:113.4,116.14 2 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:123.4,123.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:100.11,102.5 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:107.35,112.5 2 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:116.14,117.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:118.17,119.12 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:120.57,120.57 0 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:124.16,125.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:126.25,126.25 0 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:134.116,140.6 3 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:140.6,141.10 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:142.15,143.10 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:145.26,147.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:151.4,155.11 4 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:161.4,161.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:147.11,149.5 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:156.16,157.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:158.20,158.20 0 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:162.16,163.11 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:164.28,164.28 0 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:171.63,175.35 3 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:175.35,176.67 1 1 -github.com/ethereum/go-ethereum/core/bloombits/scheduler.go:176.67,179.4 2 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:32.26,34.2 1 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:37.57,40.14 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:40.14,43.41 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:46.3,46.43 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:43.41,44.40 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:52.57,55.38 1 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:59.2,61.36 2 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:55.38,56.39 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:65.38,66.28 1 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:66.28,68.3 1 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:72.59,73.15 1 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:77.2,77.32 1 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:84.2,84.8 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:73.15,75.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:77.32,82.3 3 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:88.52,89.15 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:93.2,93.32 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:97.2,97.12 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:89.15,91.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:93.32,95.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:101.28,103.2 1 1 -github.com/ethereum/go-ethereum/core/vm/memory.go:106.32,108.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:111.26,113.22 2 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:122.2,122.37 1 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:113.22,115.45 2 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:115.45,118.4 2 0 -github.com/ethereum/go-ethereum/core/vm/memory.go:119.8,121.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:19.51,21.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:23.54,25.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:27.56,29.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:31.50,33.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:35.53,37.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:39.47,41.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:43.49,45.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:47.48,49.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:51.48,53.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:55.49,57.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:59.46,61.14 2 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:64.2,65.14 2 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:68.2,68.11 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:71.2,71.17 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:61.14,63.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:65.14,67.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:68.11,70.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:73.54,75.14 2 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:78.2,79.14 2 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:82.2,82.11 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:85.2,85.17 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:75.14,77.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:79.14,81.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:82.11,84.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:88.52,90.14 2 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:93.2,94.14 2 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:97.2,97.11 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:100.2,100.17 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:90.14,92.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:94.14,96.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:97.11,99.3 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:103.48,105.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:107.48,109.2 1 0 -github.com/ethereum/go-ethereum/core/vm/memory_table.go:111.45,113.2 1 0 -github.com/ethereum/go-ethereum/core/vm/opcodes.go:27.32,28.12 1 0 -github.com/ethereum/go-ethereum/core/vm/opcodes.go:32.2,32.14 1 0 -github.com/ethereum/go-ethereum/core/vm/opcodes.go:29.253,30.14 1 0 -github.com/ethereum/go-ethereum/core/vm/opcodes.go:387.34,389.19 2 0 -github.com/ethereum/go-ethereum/core/vm/opcodes.go:393.2,393.12 1 0 -github.com/ethereum/go-ethereum/core/vm/opcodes.go:389.19,391.3 1 0 -github.com/ethereum/go-ethereum/core/vm/opcodes.go:543.36,545.2 1 0 -github.com/ethereum/go-ethereum/core/vm/stack.go:27.26,29.3 1 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:39.24,41.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:43.28,46.2 2 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:49.39,51.2 1 0 -github.com/ethereum/go-ethereum/core/vm/stack.go:53.39,56.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:58.42,62.2 3 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:64.28,66.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:68.30,70.2 1 0 -github.com/ethereum/go-ethereum/core/vm/stack.go:72.29,74.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:76.38,78.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:81.43,83.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack.go:86.26,88.22 2 0 -github.com/ethereum/go-ethereum/core/vm/stack.go:95.2,95.30 1 0 -github.com/ethereum/go-ethereum/core/vm/stack.go:88.22,89.31 1 0 -github.com/ethereum/go-ethereum/core/vm/stack.go:89.31,91.4 1 0 -github.com/ethereum/go-ethereum/core/vm/stack.go:92.8,94.3 1 0 -github.com/ethereum/go-ethereum/core/vm/common.go:27.56,28.19 1 0 -github.com/ethereum/go-ethereum/core/vm/common.go:31.2,31.47 1 0 -github.com/ethereum/go-ethereum/core/vm/common.go:28.19,30.3 1 0 -github.com/ethereum/go-ethereum/core/vm/common.go:37.78,39.19 1 0 -github.com/ethereum/go-ethereum/core/vm/common.go:43.2,44.14 2 0 -github.com/ethereum/go-ethereum/core/vm/common.go:47.2,49.28 2 0 -github.com/ethereum/go-ethereum/core/vm/common.go:39.19,41.3 1 0 -github.com/ethereum/go-ethereum/core/vm/common.go:44.14,46.3 1 0 -github.com/ethereum/go-ethereum/core/vm/common.go:54.61,56.20 2 1 -github.com/ethereum/go-ethereum/core/vm/common.go:59.2,60.18 2 1 -github.com/ethereum/go-ethereum/core/vm/common.go:63.2,63.57 1 1 -github.com/ethereum/go-ethereum/core/vm/common.go:56.20,58.3 1 1 -github.com/ethereum/go-ethereum/core/vm/common.go:60.18,62.3 1 1 -github.com/ethereum/go-ethereum/core/vm/common.go:67.37,68.30 1 1 -github.com/ethereum/go-ethereum/core/vm/common.go:72.2,72.25 1 1 -github.com/ethereum/go-ethereum/core/vm/common.go:68.30,70.3 1 0 -github.com/ethereum/go-ethereum/core/vm/common.go:75.29,76.25 1 1 -github.com/ethereum/go-ethereum/core/vm/common.go:81.2,81.13 1 1 -github.com/ethereum/go-ethereum/core/vm/common.go:76.25,77.16 1 1 -github.com/ethereum/go-ethereum/core/vm/common.go:77.16,79.4 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:29.90,33.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:35.90,39.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:41.90,45.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:47.90,51.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:53.91,57.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:59.90,63.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:65.91,69.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:71.90,75.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:77.97,81.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:83.90,87.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:89.89,91.13 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:96.2,96.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:91.13,93.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:93.8,95.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:99.89,101.13 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:106.2,106.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:101.13,103.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:103.8,105.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:109.90,111.14 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:116.2,116.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:111.14,113.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:113.8,115.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:119.90,121.14 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:126.2,126.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:121.14,123.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:123.8,125.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:129.89,131.13 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:136.2,136.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:131.13,133.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:133.8,135.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:139.93,141.16 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:146.2,146.17 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:141.16,143.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:143.8,145.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:149.90,153.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:155.89,159.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:161.90,165.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:167.91,171.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:173.93,175.16 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:180.2,180.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:175.16,177.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:177.8,179.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:183.93,187.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:192.90,195.25 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:200.2,200.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:195.25,197.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:197.8,199.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:206.90,209.25 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:214.2,214.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:209.25,211.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:211.8,213.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:220.90,222.25 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:231.2,233.17 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:222.25,223.24 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:229.3,229.18 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:223.24,225.4 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:225.9,228.4 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:236.96,240.31 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:245.2,249.40 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:253.2,254.17 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:240.31,242.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:242.8,244.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:249.40,251.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:256.94,259.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:261.94,266.2 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:268.93,271.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:272.93,275.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:277.96,281.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:283.99,285.59 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:291.2,291.17 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:285.59,288.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:288.8,290.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:294.99,297.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:299.99,306.14 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:310.2,314.17 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:306.14,308.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:317.101,320.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:322.101,330.14 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:334.2,337.61 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:340.2,341.17 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:330.14,332.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:337.61,339.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:344.98,348.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:350.95,355.2 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:357.95,364.14 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:367.2,370.17 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:364.14,366.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:373.98,382.14 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:385.2,389.17 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:382.14,384.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:418.98,421.44 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:426.2,426.17 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:421.44,423.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:423.8,425.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:429.95,433.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:435.96,438.14 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:442.2,444.17 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:449.2,449.37 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:454.2,454.17 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:438.14,441.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:444.17,446.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:446.8,448.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:449.37,451.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:451.8,453.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:457.95,460.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:462.96,466.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:468.93,472.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:474.97,478.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:480.93,484.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:486.95,489.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:491.90,494.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:496.92,501.2 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:503.93,508.2 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:510.94,514.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:516.92,522.2 5 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:524.93,525.26 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:528.2,532.17 4 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:525.26,527.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:535.91,536.51 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:539.2,540.41 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:543.2,544.17 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:536.51,538.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:540.41,542.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:547.92,548.51 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:551.2,552.20 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:558.2,558.17 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:548.51,550.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:552.20,553.42 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:556.3,556.25 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:553.42,555.4 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:561.95,563.2 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:565.89,568.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:570.92,573.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:575.90,578.2 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:580.93,581.26 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:584.2,590.41 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:594.2,599.21 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:603.2,608.78 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:615.2,618.36 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:622.2,623.17 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:581.26,583.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:590.41,592.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:599.21,601.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:608.78,610.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:610.8,610.60 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:610.60,612.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:612.8,614.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:618.36,621.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:626.94,627.26 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:630.2,645.25 6 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:648.2,651.19 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:656.2,659.36 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:663.2,664.17 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:627.26,629.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:645.25,647.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:651.19,653.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:653.8,655.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:659.36,662.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:667.91,679.45 7 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:682.2,686.21 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:691.2,693.16 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:698.2,699.47 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:703.2,706.17 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:679.45,681.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:686.21,689.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:693.16,695.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:695.8,697.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:699.47,702.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:709.95,723.21 8 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:728.2,729.16 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:734.2,735.47 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:739.2,742.17 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:723.21,726.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:729.16,731.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:731.8,733.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:735.47,738.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:745.99,758.16 8 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:763.2,764.47 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:768.2,771.17 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:758.16,760.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:760.8,762.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:764.47,767.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:774.97,787.16 8 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:792.2,793.47 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:797.2,800.17 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:787.16,789.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:789.8,791.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:793.47,796.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:803.93,808.2 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:810.93,816.2 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:818.96,820.2 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:822.91,824.2 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:826.99,827.26 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:830.2,834.27 5 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:838.2,838.26 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:827.26,829.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:834.27,837.3 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:844.38,845.92 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:845.92,846.27 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:849.3,852.29 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:857.3,867.18 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:846.27,848.4 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:852.29,855.4 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:872.92,878.19 3 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:883.2,883.17 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:878.19,880.3 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:880.8,882.3 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:887.60,888.92 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:888.92,892.28 3 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:896.3,897.37 2 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:901.3,906.18 4 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:892.28,894.4 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:897.37,899.4 1 0 -github.com/ethereum/go-ethereum/core/vm/instructions.go:911.40,912.92 1 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:912.92,915.3 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:919.41,922.92 2 1 -github.com/ethereum/go-ethereum/core/vm/instructions.go:922.92,925.3 2 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:68.62,70.26 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:104.2,107.3 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:70.26,71.10 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:93.3,93.37 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:72.31,73.40 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:74.32,75.41 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:76.32,77.41 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:78.34,79.43 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:80.40,81.49 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:82.35,83.44 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:84.32,85.49 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:86.32,87.51 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:88.35,89.44 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:90.11,91.43 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:93.37,95.48 2 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:100.4,100.25 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:95.48,99.5 2 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:116.104,120.15 2 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:124.2,124.30 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:131.2,134.29 2 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:138.2,161.15 2 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:164.2,166.18 2 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:181.2,181.6 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:242.2,242.25 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:246.2,246.17 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:120.15,120.33 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:124.30,126.16 2 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:126.16,126.39 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:134.29,136.3 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:161.15,163.3 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:166.18,167.16 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:167.16,168.18 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:168.18,169.16 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:169.16,171.6 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:171.11,173.6 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:181.6,182.19 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:188.3,192.53 4 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:197.3,197.29 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:200.3,200.34 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:230.3,230.19 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:235.3,236.17 2 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:239.3,239.7 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:182.19,185.4 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:192.53,194.4 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:194.9,194.39 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:194.39,196.4 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:197.29,199.4 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:200.34,207.35 2 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:220.4,223.51 4 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:226.4,226.22 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:207.35,209.17 2 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:214.5,214.79 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:209.17,211.6 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:214.79,216.6 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:223.51,225.5 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:226.22,228.5 1 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:230.19,233.4 2 0 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:236.17,237.9 1 1 -github.com/ethereum/go-ethereum/core/vm/interpreter.go:242.25,244.3 1 1 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:27.55,28.106 1 1 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:28.106,30.52 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:34.3,41.103 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:52.3,54.23 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:59.3,60.26 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:71.3,71.34 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:78.3,78.24 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:94.3,94.55 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:30.52,32.4 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:41.103,45.20 3 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:45.20,49.86 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:54.23,58.4 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:60.26,61.35 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:64.4,64.32 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:69.4,69.83 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:61.35,63.5 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:64.32,66.5 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:71.34,72.34 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:72.34,74.5 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:74.10,74.39 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:74.39,76.5 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:78.24,79.35 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:79.35,83.5 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:83.10,90.5 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:103.114,107.92 3 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:113.2,113.47 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:107.92,112.3 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:121.120,124.16 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:127.2,129.44 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:138.2,138.17 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:124.16,126.3 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:129.44,133.121 3 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:136.3,136.18 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:133.121,135.4 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:148.121,151.44 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:157.2,157.15 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:151.44,156.3 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:160.67,161.106 1 1 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:161.106,168.18 4 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:181.3,182.31 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:189.3,190.29 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:168.18,172.34 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:172.34,174.5 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:182.31,184.4 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:223.57,224.110 1 1 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:243.2,243.16 1 1 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:224.110,229.48 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:235.3,235.91 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:238.3,238.69 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:241.3,241.18 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:229.48,233.4 2 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:235.91,237.4 1 0 -github.com/ethereum/go-ethereum/core/vm/operations_acl.go:238.69,240.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas.go:37.95,38.14 1 0 -github.com/ethereum/go-ethereum/core/vm/gas.go:48.2,48.26 1 0 -github.com/ethereum/go-ethereum/core/vm/gas.go:52.2,52.31 1 0 -github.com/ethereum/go-ethereum/core/vm/gas.go:38.14,44.54 3 0 -github.com/ethereum/go-ethereum/core/vm/gas.go:44.54,46.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas.go:48.26,50.3 1 0 -github.com/ethereum/go-ethereum/core/vm/eips.go:39.49,41.9 2 1 -github.com/ethereum/go-ethereum/core/vm/eips.go:44.2,45.12 2 1 -github.com/ethereum/go-ethereum/core/vm/eips.go:41.9,43.3 1 0 -github.com/ethereum/go-ethereum/core/vm/eips.go:48.32,51.2 2 0 -github.com/ethereum/go-ethereum/core/vm/eips.go:52.34,54.28 2 0 -github.com/ethereum/go-ethereum/core/vm/eips.go:57.2,58.13 2 0 -github.com/ethereum/go-ethereum/core/vm/eips.go:54.28,56.3 1 0 -github.com/ethereum/go-ethereum/core/vm/eips.go:66.32,79.2 4 1 -github.com/ethereum/go-ethereum/core/vm/eips.go:81.98,85.2 3 0 -github.com/ethereum/go-ethereum/core/vm/eips.go:89.32,97.2 1 1 -github.com/ethereum/go-ethereum/core/vm/eips.go:100.94,104.2 3 0 -github.com/ethereum/go-ethereum/core/vm/eips.go:107.32,110.2 2 1 -github.com/ethereum/go-ethereum/core/vm/eips.go:114.32,148.2 21 1 -github.com/ethereum/go-ethereum/core/vm/eips.go:154.32,157.2 2 1 -github.com/ethereum/go-ethereum/core/vm/eips.go:161.32,169.2 1 1 -github.com/ethereum/go-ethereum/core/vm/eips.go:172.94,176.2 3 0 -github.com/ethereum/go-ethereum/core/vm/errors.go:52.44,54.2 1 0 -github.com/ethereum/go-ethereum/core/vm/errors.go:63.43,65.2 1 0 -github.com/ethereum/go-ethereum/core/vm/errors.go:72.43,72.97 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:44.77,46.9 2 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:56.2,57.14 2 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:47.31,48.43 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:49.33,50.45 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:51.34,52.46 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:53.10,54.46 1 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:128.123,139.2 3 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:143.57,146.2 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:150.26,152.2 1 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:155.34,157.2 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:160.47,162.2 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:168.149,170.45 1 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:174.2,174.89 1 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:177.2,180.30 3 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:196.2,199.22 2 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:214.2,214.18 1 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:235.2,235.16 1 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:244.2,244.22 1 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:170.45,172.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:174.89,176.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:180.30,181.68 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:194.3,194.34 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:181.68,183.24 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:192.4,192.24 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:183.24,184.23 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:184.23,187.6 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:187.11,190.6 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:199.22,200.21 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:200.21,202.53 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:202.53,204.5 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:205.9,208.32 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:208.32,210.5 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:214.18,216.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:216.8,220.21 2 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:220.21,222.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:222.9,230.4 5 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:235.16,237.34 2 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:237.34,239.4 1 1 -github.com/ethereum/go-ethereum/core/vm/evm.go:254.153,256.45 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:263.2,263.68 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:266.2,269.22 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:277.2,277.59 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:288.2,288.16 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:294.2,294.22 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:256.45,258.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:263.68,265.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:269.22,271.31 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:271.31,273.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:277.59,279.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:279.8,287.3 5 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:288.16,290.34 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:290.34,292.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:302.141,304.45 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:307.2,310.22 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:318.2,318.59 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:328.2,328.16 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:334.2,334.22 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:304.45,306.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:310.22,312.31 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:312.31,314.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:318.59,320.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:320.8,327.3 5 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:328.16,330.34 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:330.34,332.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:341.139,343.45 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:351.2,360.22 3 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:367.2,367.59 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:384.2,384.16 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:390.2,390.22 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:343.45,345.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:360.22,362.31 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:362.31,364.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:367.59,369.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:369.8,383.3 5 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:384.16,386.34 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:386.34,388.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:398.42,399.31 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:402.2,402.15 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:399.31,401.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:406.174,409.45 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:412.2,412.68 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:415.2,416.21 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:419.2,422.29 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:426.2,427.110 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:431.2,433.29 3 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:436.2,443.22 4 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:451.2,456.76 3 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:461.2,461.78 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:469.2,469.16 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:481.2,481.79 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:488.2,488.22 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:495.2,495.40 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:409.45,411.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:412.68,414.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:416.21,418.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:422.29,424.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:427.110,429.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:433.29,435.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:443.22,444.21 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:444.21,446.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:446.9,448.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:456.76,458.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:461.78,463.3 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:469.16,471.37 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:471.37,473.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:473.9,475.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:481.79,483.34 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:483.34,485.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:488.22,489.21 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:489.21,491.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:491.9,493.4 1 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:499.158,502.2 2 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:508.182,512.2 3 0 -github.com/ethereum/go-ethereum/core/vm/evm.go:515.51,515.77 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:29.68,30.21 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:38.2,38.31 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:41.2,44.36 3 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:55.2,55.15 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:30.21,32.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:38.31,40.3 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:44.36,54.3 7 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:65.44,66.106 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:66.106,69.17 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:73.3,74.15 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:78.3,78.82 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:82.3,82.57 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:85.3,85.18 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:69.17,71.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:74.15,76.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:78.82,80.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:82.57,84.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:96.108,104.69 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:134.2,135.22 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:138.2,139.25 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:148.2,148.33 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:155.2,155.23 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:162.2,162.38 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:104.69,110.10 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:111.52,112.35 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:113.52,115.37 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:116.11,117.37 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:135.22,137.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:139.25,140.34 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:143.3,143.31 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:146.3,146.39 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:140.34,142.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:143.31,145.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:148.33,149.33 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:149.33,151.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:151.9,151.38 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:151.38,153.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:155.23,156.34 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:156.34,158.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:158.9,160.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:178.115,180.51 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:184.2,190.22 3 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:193.2,194.25 2 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:203.2,203.33 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:210.2,210.23 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:217.2,217.36 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:180.51,182.3 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:190.22,192.3 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:194.25,195.34 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:198.3,198.31 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:201.3,201.43 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:195.34,197.4 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:198.31,200.4 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:203.33,204.33 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:204.33,206.4 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:206.9,206.38 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:206.38,208.4 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:210.23,211.34 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:211.34,213.4 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:213.9,215.4 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:220.35,221.106 1 1 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:221.106,223.15 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:227.3,228.17 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:232.3,232.65 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:235.3,235.72 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:239.3,240.89 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:243.3,243.65 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:246.3,246.18 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:223.15,225.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:228.17,230.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:232.65,234.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:235.72,237.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:240.89,242.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:243.65,245.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:250.111,252.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:255.2,256.14 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:259.2,259.94 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:262.2,262.58 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:265.2,265.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:252.16,254.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:256.14,258.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:259.94,261.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:262.58,264.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:271.116,273.2 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:284.109,286.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:289.2,290.14 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:293.2,293.94 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:296.2,296.58 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:299.2,299.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:286.16,288.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:290.14,292.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:293.94,295.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:296.58,298.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:302.113,309.64 3 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:312.2,312.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:309.64,311.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:315.111,322.64 3 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:325.2,325.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:322.64,324.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:328.106,334.29 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:341.2,341.20 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:344.2,345.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:348.2,349.60 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:353.2,354.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:357.2,357.66 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:360.2,360.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:334.29,335.51 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:335.51,337.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:338.8,338.40 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:338.40,340.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:341.20,343.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:345.16,347.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:349.60,351.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:354.16,356.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:357.66,359.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:363.110,365.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:368.2,372.31 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:375.2,375.60 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:378.2,379.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:382.2,382.66 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:385.2,385.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:365.16,367.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:372.31,374.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:375.60,377.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:379.16,381.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:382.66,384.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:388.114,390.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:393.2,394.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:397.2,398.66 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:401.2,401.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:390.16,392.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:394.16,396.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:398.66,400.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:404.112,406.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:409.2,410.16 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:413.2,414.66 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:417.2,417.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:406.16,408.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:410.16,412.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:414.66,416.3 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:420.114,423.29 2 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:437.2,437.50 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:440.2,440.17 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:423.29,427.30 3 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:427.30,429.92 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:429.92,431.5 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:432.9,432.41 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:432.41,434.4 1 0 -github.com/ethereum/go-ethereum/core/vm/gas_table.go:437.50,439.3 1 0 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:63.39,64.24 1 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:78.2,78.11 1 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:64.24,65.16 1 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:74.3,74.51 1 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:65.16,66.47 1 0 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:74.51,75.90 1 0 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:81.41,90.2 3 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:94.42,99.2 4 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:103.42,107.2 3 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:111.44,119.2 5 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:123.50,158.2 7 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:162.45,194.2 6 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:197.50,202.2 3 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:205.52,215.2 9 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:219.45,230.2 3 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:234.44,1039.28 2 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:1045.2,1045.22 1 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:1039.28,1040.19 1 1 -github.com/ethereum/go-ethereum/core/vm/jump_table.go:1040.19,1042.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:41.47,41.78 1 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:66.96,69.42 2 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:78.2,82.10 3 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:69.42,72.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:72.8,74.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:85.58,89.46 2 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:93.2,93.39 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:96.2,96.24 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:89.46,91.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:93.39,95.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:101.46,103.23 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:109.2,109.35 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:126.2,126.23 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:129.2,129.38 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:103.23,105.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:109.35,112.13 2 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:119.3,120.37 2 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:112.13,117.4 2 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:126.23,128.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:134.43,142.2 4 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:145.43,146.29 1 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:150.2,150.13 1 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:146.29,148.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:157.44,159.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:162.49,163.17 1 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:166.2,167.13 2 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:163.17,165.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:171.45,173.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:176.37,178.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contract.go:182.85,186.2 3 1 -github.com/ethereum/go-ethereum/core/vm/contract.go:190.88,194.2 3 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:116.13,117.47 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:120.2,120.47 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:123.2,123.46 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:126.2,126.44 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:117.47,119.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:120.47,122.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:123.46,125.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:126.44,128.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:132.61,133.9 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:134.22,135.36 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:136.24,137.38 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:138.25,139.39 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:140.10,141.39 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:150.131,152.27 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:155.2,157.33 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:152.27,154.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:163.54,165.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:167.55,179.79 6 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:184.2,190.16 5 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:195.2,195.72 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:179.79,181.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:190.16,192.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:205.55,207.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:208.56,211.2 2 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:220.58,222.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:223.59,227.2 3 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:236.53,238.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:239.51,241.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:274.48,275.9 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:291.2,291.10 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:276.25,277.14 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:278.27,283.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:284.10,289.4 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:295.54,301.21 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:307.2,308.53 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:318.2,319.44 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:322.2,323.27 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:327.2,330.15 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:355.2,359.23 4 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:362.2,362.21 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:301.21,303.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:303.8,305.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:308.53,310.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:310.8,311.28 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:311.28,313.4 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:313.9,315.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:319.44,321.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:323.27,326.3 2 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:330.15,346.24 6 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:350.3,350.25 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:353.3,353.22 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:346.24,348.4 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:350.25,352.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:359.23,361.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:365.55,371.21 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:377.2,377.33 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:381.2,386.23 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:390.2,390.80 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:371.21,373.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:373.8,375.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:377.33,379.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:386.23,389.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:395.52,397.45 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:400.2,400.15 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:397.45,399.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:405.52,407.45 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:410.2,410.15 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:407.45,409.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:415.48,417.16 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:420.2,421.16 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:424.2,426.27 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:417.16,419.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:421.16,423.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:434.61,436.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:438.62,440.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:447.62,449.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:451.63,453.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:457.54,459.16 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:462.2,464.27 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:459.16,461.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:472.67,474.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:476.68,478.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:485.68,487.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:489.69,491.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:506.52,508.24 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:512.2,516.39 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:529.2,529.32 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:532.2,532.25 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:508.24,510.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:516.39,518.17 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:521.3,522.17 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:525.3,526.21 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:518.17,520.4 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:522.17,524.4 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:529.32,531.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:540.65,542.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:544.66,546.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:553.66,555.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:557.67,559.2 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:563.52,566.38 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:569.2,569.52 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:566.38,568.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:583.53,585.38 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:588.2,588.85 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:592.2,600.25 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:604.2,604.26 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:608.2,615.25 5 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:619.2,619.20 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:585.38,587.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:588.85,590.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:600.25,603.3 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:604.26,607.3 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:615.25,618.3 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:633.58,635.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:637.59,641.23 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:644.2,651.54 4 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:655.2,655.54 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:660.2,664.30 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:641.23,643.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:651.54,653.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:655.54,657.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:671.58,673.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:675.59,679.23 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:682.2,689.54 4 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:693.2,700.30 4 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:679.23,681.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:689.54,691.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:707.63,710.12 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:715.2,716.65 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:722.2,722.64 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:710.12,713.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:716.65,718.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:718.8,720.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:725.64,730.44 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:733.2,741.25 5 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:753.2,757.30 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:730.44,732.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:741.25,745.63 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:749.3,749.51 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:745.63,747.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:764.58,766.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:768.59,772.23 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:775.2,783.54 5 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:787.2,787.54 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:792.2,795.30 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:772.23,774.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:783.54,785.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:787.54,789.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:802.58,804.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:806.59,810.23 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:813.2,820.54 4 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:824.2,831.30 4 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:810.23,812.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:820.54,822.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:838.63,841.12 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:846.2,847.65 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:853.2,853.64 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:841.12,844.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:847.65,849.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:849.8,851.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:856.64,861.44 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:864.2,872.25 5 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:884.2,888.30 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:861.44,863.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:872.25,876.63 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:880.3,880.51 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:876.63,878.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:895.60,897.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:899.61,907.44 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:912.2,916.25 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:944.2,947.15 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:950.2,950.17 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:907.44,909.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:916.25,922.17 4 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:926.3,927.17 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:933.3,933.32 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:936.3,936.32 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:941.3,941.20 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:922.17,924.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:927.17,929.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:933.32,935.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:936.32,938.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:947.15,949.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:955.60,956.19 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:960.2,960.26 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:965.2,967.17 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:956.19,958.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:960.26,961.26 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:961.26,963.4 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:974.58,976.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:978.59,982.22 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:987.2,988.16 2 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:993.2,997.16 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1002.2,1002.30 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:982.22,984.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:988.16,990.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:997.16,999.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1009.58,1011.2 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1013.59,1017.23 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1022.2,1024.16 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1027.2,1029.16 3 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1032.2,1039.16 4 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1044.2,1044.30 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1017.23,1019.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1024.16,1026.3 1 0 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1029.16,1031.3 1 1 -github.com/ethereum/go-ethereum/core/vm/contracts.go:1039.16,1041.3 1 1 -github.com/ethereum/go-ethereum/core/vm/stack_table.go:23.30,25.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack_table.go:26.30,28.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack_table.go:30.29,32.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack_table.go:33.29,35.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack_table.go:37.34,39.2 1 1 -github.com/ethereum/go-ethereum/core/vm/stack_table.go:40.35,42.2 1 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:33.37,35.2 1 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:37.50,40.31 3 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:40.31,42.3 1 0 -github.com/ethereum/go-ethereum/core/vm/analysis.go:45.37,49.2 3 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:51.38,56.2 4 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:59.50,61.2 1 0 -github.com/ethereum/go-ethereum/core/vm/analysis.go:64.37,70.2 2 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:75.51,76.47 1 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:117.2,117.13 1 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:76.47,79.32 3 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:82.3,83.19 2 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:93.3,93.18 1 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:79.32,80.12 1 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:83.19,84.39 1 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:88.4,88.37 1 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:84.39,87.5 2 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:88.37,91.5 2 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:94.10,96.11 2 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:97.10,99.11 2 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:100.10,102.11 2 1 -github.com/ethereum/go-ethereum/core/vm/analysis.go:103.10,105.11 2 0 -github.com/ethereum/go-ethereum/core/vm/analysis.go:106.10,108.11 2 0 -github.com/ethereum/go-ethereum/core/vm/analysis.go:109.10,111.11 2 0 -github.com/ethereum/go-ethereum/core/vm/analysis.go:112.10,114.11 2 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:122.78,128.12 2 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:133.2,133.10 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:128.12,130.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:130.8,132.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:138.48,140.28 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:143.2,146.49 4 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:149.2,149.35 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:140.28,142.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:146.49,148.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:153.72,156.2 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:159.51,160.28 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:163.2,166.25 4 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:160.28,162.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:171.50,173.9 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:174.18,175.13 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:176.24,179.40 2 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:182.3,183.27 2 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:184.10,187.17 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:190.3,190.26 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:179.40,181.4 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:187.17,189.4 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:196.51,197.31 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:208.2,208.25 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:197.31,201.17 3 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:204.3,205.28 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:201.17,203.4 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:212.47,213.17 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:216.2,216.14 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:213.17,215.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:217.42,220.17 3 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:223.3,224.28 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:225.10,226.31 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:220.17,222.4 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:230.53,233.2 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:235.61,236.9 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:246.2,246.12 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:237.66,238.37 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:239.62,240.33 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:241.52,242.34 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:243.10,244.68 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:249.43,250.27 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:256.2,256.20 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:250.27,251.38 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:254.3,254.36 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:251.38,253.4 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:261.45,264.29 3 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:267.2,267.13 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:264.29,266.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:276.59,282.29 6 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:287.2,289.18 3 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:282.29,283.44 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:283.44,285.4 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:294.60,297.16 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:303.2,303.56 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:306.2,306.58 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:309.2,309.42 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:297.16,299.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:303.56,305.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:306.58,308.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:312.70,314.55 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:317.2,317.74 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:320.2,322.34 3 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:325.2,327.12 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:314.55,316.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:317.74,319.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:322.34,324.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:330.72,332.55 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:335.2,335.74 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:338.2,343.34 6 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:346.2,348.12 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:332.55,334.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:335.74,337.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:343.34,345.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:351.72,353.55 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:356.2,356.74 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:359.2,365.34 7 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:368.2,368.12 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:353.55,355.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:356.74,358.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:365.34,367.3 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:375.30,375.48 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:378.56,381.16 3 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:382.20,383.22 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:384.24,386.22 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:387.24,389.22 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:390.10,390.10 0 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:399.118,403.25 3 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:406.2,406.31 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:438.2,438.12 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:403.25,405.3 1 0 -github.com/ethereum/go-ethereum/core/types/receipt.go:406.31,417.25 6 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:423.3,423.13 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:429.3,429.40 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:417.25,421.4 2 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:423.13,425.4 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:425.9,427.4 1 1 -github.com/ethereum/go-ethereum/core/types/receipt.go:429.40,436.4 6 1 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:25.60,29.2 3 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:32.57,34.2 1 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:37.39,39.2 1 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:43.108,55.37 8 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:60.2,60.41 1 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:68.2,68.12 1 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:55.37,57.3 1 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:60.41,67.3 6 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:73.104,78.33 2 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:78.33,85.3 6 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:89.55,92.51 2 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:96.2,96.15 1 0 -github.com/ethereum/go-ethereum/core/types/bor_receipt.go:92.51,94.3 1 0 -github.com/ethereum/go-ethereum/core/types/log.go:86.44,89.2 2 1 -github.com/ethereum/go-ethereum/core/types/log.go:92.46,95.16 3 1 -github.com/ethereum/go-ethereum/core/types/log.go:98.2,98.12 1 1 -github.com/ethereum/go-ethereum/core/types/log.go:95.16,97.3 1 1 -github.com/ethereum/go-ethereum/core/types/log.go:106.54,109.2 2 1 -github.com/ethereum/go-ethereum/core/types/log.go:114.56,116.16 2 1 -github.com/ethereum/go-ethereum/core/types/log.go:119.2,121.16 3 1 -github.com/ethereum/go-ethereum/core/types/log.go:139.2,139.12 1 1 -github.com/ethereum/go-ethereum/core/types/log.go:116.16,118.3 1 1 -github.com/ethereum/go-ethereum/core/types/log.go:121.16,127.3 1 1 -github.com/ethereum/go-ethereum/core/types/log.go:127.8,131.17 3 0 -github.com/ethereum/go-ethereum/core/types/log.go:131.17,137.4 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:17.47,56.2 20 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:59.52,79.52 3 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:82.2,82.27 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:85.2,86.26 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:89.2,90.25 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:93.2,94.21 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:97.2,98.23 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:101.2,102.28 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:105.2,106.22 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:109.2,110.27 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:113.2,114.23 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:117.2,118.25 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:121.2,122.24 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:125.2,126.21 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:129.2,130.22 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:133.2,134.26 2 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:137.2,137.22 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:140.2,140.24 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:143.2,143.12 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:79.52,81.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:82.27,84.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:86.26,88.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:90.25,92.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:94.21,96.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:98.23,100.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:102.28,104.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:106.22,108.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:110.27,112.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:114.23,116.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:118.25,120.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:122.24,124.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:126.21,128.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:130.22,132.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:134.26,136.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:137.22,139.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_json.go:140.24,142.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:54.53,61.30 4 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:98.2,98.27 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:62.17,71.31 9 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:72.21,83.31 11 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:84.21,96.31 12 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:102.57,104.52 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:109.2,110.18 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:271.2,274.12 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:104.52,106.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:111.20,114.20 3 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:117.3,117.23 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:120.3,121.26 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:124.3,125.21 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:128.3,129.23 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:132.3,133.22 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:136.3,137.19 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:140.3,141.19 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:144.3,145.19 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:148.3,150.20 3 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:156.24,160.28 3 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:163.3,163.25 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:166.3,167.20 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:170.3,170.23 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:173.3,174.26 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:177.3,178.21 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:181.3,182.23 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:185.3,186.22 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:189.3,190.19 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:193.3,194.19 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:197.3,198.19 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:201.3,203.20 3 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:209.24,213.28 3 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:216.3,216.25 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:219.3,220.20 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:223.3,223.23 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:226.3,227.38 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:230.3,231.30 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:234.3,235.21 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:238.3,239.23 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:242.3,243.22 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:246.3,247.19 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:250.3,251.19 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:254.3,255.19 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:258.3,260.20 3 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:266.10,267.31 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:114.20,116.4 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:117.23,119.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:121.26,123.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:125.21,127.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:129.23,131.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:133.22,135.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:137.19,139.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:141.19,143.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:145.19,147.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:150.20,151.74 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:151.74,153.5 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:160.28,162.4 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:163.25,165.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:167.20,169.4 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:170.23,172.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:174.26,176.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:178.21,180.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:182.23,184.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:186.22,188.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:190.19,192.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:194.19,196.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:198.19,200.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:203.20,204.75 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:204.75,206.5 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:213.28,215.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:216.25,218.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:220.20,222.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:223.23,225.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:227.38,229.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:231.30,233.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:235.21,237.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:239.23,241.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:243.22,245.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:247.19,249.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:251.19,253.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:255.19,257.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:260.20,261.75 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_marshalling.go:261.75,263.5 1 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:45.35,49.2 3 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:53.36,54.21 1 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:57.2,57.37 1 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:54.21,55.66 1 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:61.31,63.2 1 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:66.43,71.2 4 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:76.31,78.2 1 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:81.31,83.2 1 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:86.40,91.2 2 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:94.46,96.2 1 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:99.51,101.2 1 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:104.43,107.35 3 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:115.2,115.12 1 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:107.35,108.36 1 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:108.36,110.33 2 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:110.33,112.5 1 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:119.36,122.27 3 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:128.2,128.15 1 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:122.27,124.32 2 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:124.32,126.4 1 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:132.33,136.2 3 0 -github.com/ethereum/go-ethereum/core/types/bloom9.go:139.84,155.2 12 1 -github.com/ethereum/go-ethereum/core/types/bloom9.go:158.53,160.2 1 0 -github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:11.56,15.24 4 0 -github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:23.2,26.18 4 0 -github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:15.24,17.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:17.8,18.31 1 0 -github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:21.3,21.29 1 0 -github.com/ethereum/go-ethereum/core/types/gen_account_rlp.go:18.31,20.4 1 0 -github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:13.52,22.2 5 1 -github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:25.57,31.52 3 1 -github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:34.2,34.24 1 1 -github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:37.2,38.28 2 1 -github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:41.2,42.12 2 1 -github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:31.52,33.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:34.24,36.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_access_tuple.go:38.28,40.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:11.50,21.27 10 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:29.2,29.23 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:37.2,44.11 8 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:54.2,55.18 2 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:21.27,23.3 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:23.8,24.34 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:27.3,27.32 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:24.34,26.4 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:29.23,31.3 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:31.8,32.30 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:35.3,35.28 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:32.30,34.4 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:44.11,45.25 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:45.25,47.4 1 0 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:47.9,48.32 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:51.4,51.30 1 1 -github.com/ethereum/go-ethereum/core/types/gen_header_rlp.go:48.32,50.5 1 0 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:16.44,39.2 12 0 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:42.49,55.52 3 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:58.2,58.24 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:61.2,62.23 2 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:65.2,66.21 2 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:69.2,70.28 2 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:73.2,73.23 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:76.2,77.24 2 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:80.2,80.26 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:83.2,83.22 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:86.2,86.24 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:89.2,89.12 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:55.52,57.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:58.24,60.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:62.23,64.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:66.21,68.3 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:70.28,72.3 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:73.23,75.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:77.24,79.3 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:80.26,82.3 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:83.22,85.3 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_json.go:86.24,88.3 1 1 -github.com/ethereum/go-ethereum/core/types/gen_log_rlp.go:11.50,16.35 5 1 -github.com/ethereum/go-ethereum/core/types/gen_log_rlp.go:19.2,22.18 4 1 -github.com/ethereum/go-ethereum/core/types/gen_log_rlp.go:16.35,18.3 1 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:31.26,31.62 1 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:36.26,36.54 1 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:40.45,47.2 6 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:51.66,59.2 7 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:77.75,84.2 3 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:87.67,97.47 5 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:102.2,102.20 1 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:107.2,107.37 1 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:112.2,112.22 1 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:97.47,101.3 3 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:102.20,106.3 3 1 -github.com/ethereum/go-ethereum/core/types/hashing.go:107.37,111.3 3 1 -github.com/ethereum/go-ethereum/core/types/legacy.go:28.55,30.50 2 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:33.2,34.50 2 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:37.2,39.50 2 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:42.2,42.67 1 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:30.50,32.3 1 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:34.50,36.3 1 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:39.50,41.3 1 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:47.62,49.56 2 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:52.2,52.37 1 0 -github.com/ethereum/go-ethereum/core/types/legacy.go:49.56,51.3 1 0 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:37.40,39.27 2 0 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:42.2,42.12 1 0 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:39.27,41.3 1 0 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:59.39,75.21 3 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:78.2,78.23 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:81.2,81.24 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:84.2,84.17 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:87.2,87.17 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:90.2,90.17 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:93.2,93.12 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:75.21,77.3 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:78.23,80.3 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:81.24,83.3 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:84.17,86.3 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:87.17,89.3 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:90.17,92.3 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:97.49,97.76 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:98.49,98.70 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:99.49,99.73 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:100.49,100.67 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:101.49,101.66 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:102.49,102.71 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:103.49,103.71 1 0 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:104.49,104.71 1 0 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:105.49,105.68 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:106.49,106.68 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:107.49,107.65 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:109.65,111.2 1 1 -github.com/ethereum/go-ethereum/core/types/access_list_tx.go:113.71,115.2 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:43.39,60.21 3 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:63.2,63.23 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:66.2,66.25 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:69.2,69.25 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:72.2,72.17 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:75.2,75.17 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:78.2,78.17 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:81.2,81.12 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:60.21,62.3 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:63.23,65.3 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:66.25,68.3 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:69.25,71.3 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:72.17,74.3 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:75.17,77.3 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:78.17,80.3 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:85.49,85.76 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:86.49,86.70 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:87.49,87.73 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:88.49,88.67 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:89.49,89.66 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:90.49,90.72 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:91.49,91.72 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:92.49,92.72 1 0 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:93.49,93.68 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:94.49,94.68 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:95.49,95.65 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:97.65,99.2 1 1 -github.com/ethereum/go-ethereum/core/types/dynamic_fee_tx.go:101.71,103.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:40.74,42.9 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:54.2,54.15 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:43.36,44.43 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:45.36,46.44 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:47.36,48.43 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:49.39,50.29 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:51.10,52.28 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:64.54,65.27 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:76.2,76.26 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:65.27,66.32 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:69.3,69.32 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:72.3,72.32 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:66.32,68.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:69.32,71.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:72.32,74.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:86.54,87.20 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:90.2,90.33 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:87.20,89.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:94.85,97.16 3 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:100.2,100.33 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:97.16,99.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:104.86,108.16 4 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:111.2,111.33 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:108.16,110.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:116.81,118.16 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:121.2,121.11 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:118.16,119.13 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:131.69,132.37 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:142.2,143.16 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:146.2,147.18 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:132.37,137.36 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:137.36,139.4 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:143.16,145.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:180.47,182.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:184.71,185.35 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:188.2,192.38 3 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:195.2,195.48 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:185.35,187.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:192.38,194.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:198.45,201.2 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:203.98,205.9 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:210.2,210.70 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:213.2,215.21 3 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:205.9,207.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:210.70,212.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:220.57,221.35 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:224.2,236.5 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:221.35,223.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:243.48,245.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:247.43,249.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:251.46,254.2 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:256.72,258.19 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:272.2,272.38 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:275.2,275.48 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:259.20,260.22 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:263.3,264.17 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:265.24,268.42 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:269.10,270.49 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:260.22,262.4 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:272.38,274.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:278.99,279.35 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:293.2,293.21 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:280.17,281.49 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:282.21,285.71 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:288.3,289.33 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:290.10,291.46 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:285.71,287.4 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:298.58,299.19 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:300.20,309.5 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:310.24,322.6 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:323.10,328.23 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:338.53,339.20 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:342.2,345.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:339.20,341.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:348.42,350.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:352.45,355.2 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:359.71,360.31 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:363.2,363.21 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:366.2,366.38 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:369.2,372.48 4 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:360.31,362.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:363.21,365.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:366.38,368.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:377.98,378.31 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:381.2,382.27 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:386.2,386.21 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:378.31,380.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:382.27,385.3 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:391.57,401.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:407.45,409.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:411.48,414.2 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:418.102,420.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:422.75,423.31 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:426.2,427.49 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:423.31,425.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:432.44,434.2 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:436.47,439.2 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:441.74,442.31 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:445.2,446.50 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:442.31,444.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:451.101,452.31 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:455.2,456.21 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:452.31,454.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:461.60,470.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:472.53,473.40 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:476.2,479.16 4 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:473.40,474.100 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:482.99,483.21 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:486.2,487.57 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:491.2,498.16 7 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:501.2,501.34 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:504.2,506.18 3 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:483.21,485.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:487.57,489.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:498.16,500.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:501.34,503.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:510.41,511.22 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:518.2,519.32 2 0 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:511.22,513.25 2 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:516.3,516.46 1 1 -github.com/ethereum/go-ethereum/core/types/transaction_signing.go:513.25,515.4 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:38.133,47.2 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:51.119,59.2 1 0 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:62.35,75.21 2 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:78.2,78.24 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:81.2,81.17 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:84.2,84.17 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:87.2,87.17 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:90.2,90.12 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:75.21,77.3 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:78.24,80.3 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:81.17,83.3 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:84.17,86.3 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:87.17,89.3 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:94.45,94.68 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:95.45,95.75 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:96.45,96.59 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:97.45,97.63 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:98.45,98.62 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:99.45,99.67 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:100.45,100.67 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:101.45,101.67 1 0 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:102.45,102.64 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:103.45,103.64 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:104.45,104.61 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:106.61,108.2 1 1 -github.com/ethereum/go-ethereum/core/types/legacy_tx.go:110.67,112.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:62.39,66.2 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:91.53,92.31 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:96.2,99.44 4 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:102.2,102.35 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:92.31,94.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:99.44,101.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:106.59,109.2 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:114.56,115.31 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:118.2,120.25 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:115.31,117.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:124.55,126.9 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:127.18,128.13 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:129.24,133.17 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:136.3,136.13 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:137.10,140.37 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:143.3,144.17 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:147.3,147.13 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:133.17,135.4 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:140.37,142.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:144.17,146.4 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:153.56,154.31 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:165.2,166.16 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:169.2,170.12 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:154.31,158.17 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:161.3,162.13 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:158.17,160.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:166.16,168.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:174.62,175.17 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:178.2,178.14 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:175.17,177.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:179.24,182.21 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:183.24,186.21 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:187.10,188.36 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:193.59,196.14 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:196.14,198.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:201.90,202.40 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:206.2,207.21 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:220.2,220.58 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:224.2,224.12 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:202.40,204.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:207.21,210.3 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:210.8,210.27 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:210.27,215.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:215.8,219.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:220.58,222.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:227.36,228.21 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:233.2,233.13 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:228.21,231.3 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:237.41,238.31 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:239.17,240.43 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:241.10,242.14 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:247.37,249.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:254.43,256.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:259.38,259.64 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:262.48,262.80 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:265.37,265.62 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:268.44,268.92 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:271.45,271.94 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:274.45,274.94 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:277.41,277.86 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:280.39,280.66 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:284.45,286.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:289.40,293.2 3 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:297.64,299.2 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:302.61,304.2 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:307.60,309.2 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:312.61,314.2 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:317.60,319.2 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:324.76,325.20 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:328.2,330.34 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:333.2,333.76 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:325.20,327.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:330.34,332.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:338.72,341.2 2 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:344.85,345.20 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:348.2,348.82 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:345.20,347.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:352.84,353.20 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:356.2,356.52 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:353.20,355.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:360.43,361.41 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:365.2,366.31 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:371.2,372.10 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:361.41,363.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:366.31,368.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:368.8,370.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:377.50,378.41 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:381.2,384.30 4 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:378.41,380.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:389.87,391.16 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:394.2,396.53 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:391.16,393.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:403.33,403.50 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:408.59,410.31 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:410.31,412.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:412.8,414.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:418.51,422.23 3 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:426.2,426.23 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:432.2,432.13 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:422.23,424.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:426.23,427.38 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:427.38,429.4 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:440.40,440.57 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:441.40,441.78 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:442.40,442.67 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:453.84,455.16 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:458.2,461.8 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:455.16,457.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:468.37,468.54 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:469.47,473.14 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:476.2,476.16 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:473.14,475.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:478.42,478.69 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:480.48,482.2 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:484.46,490.2 5 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:507.136,510.32 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:521.2,529.3 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:510.32,514.32 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:518.3,519.25 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:514.32,516.12 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:533.59,534.23 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:537.2,537.22 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:534.23,536.3 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:541.47,543.47 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:550.2,550.20 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:543.47,544.71 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:544.71,548.4 3 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:556.45,558.2 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:577.204,591.2 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:594.79,608.20 2 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:611.2,613.17 3 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:608.20,610.3 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:616.42,616.59 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:617.42,617.57 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:618.42,618.63 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:619.42,619.64 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:620.42,620.64 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:621.42,621.61 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:622.42,622.63 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:623.42,623.60 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:624.42,624.59 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:625.42,625.65 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:626.42,626.61 1 0 -github.com/ethereum/go-ethereum/core/types/transaction.go:629.56,630.14 1 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:633.2,634.13 2 1 -github.com/ethereum/go-ethereum/core/types/transaction.go:630.14,632.3 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:45.39,49.2 3 0 -github.com/ethereum/go-ethereum/core/types/block.go:52.37,54.2 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:57.51,59.2 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:62.56,64.2 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:111.37,113.2 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:119.44,121.2 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:127.38,128.45 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:131.2,131.25 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:136.2,136.43 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:139.2,139.22 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:144.2,144.12 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:128.45,130.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:131.25,132.53 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:132.53,134.4 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:136.43,138.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:139.22,140.47 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:140.47,142.4 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:149.35,151.2 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:154.39,156.2 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:199.116,203.19 2 0 -github.com/ethereum/go-ethereum/core/types/block.go:211.2,211.24 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:218.2,218.22 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:228.2,228.10 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:203.19,205.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:205.8,209.3 3 0 -github.com/ethereum/go-ethereum/core/types/block.go:211.24,213.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:213.8,216.3 2 0 -github.com/ethereum/go-ethereum/core/types/block.go:218.22,220.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:220.8,223.25 3 0 -github.com/ethereum/go-ethereum/core/types/block.go:223.25,225.4 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:234.48,236.2 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:240.36,242.56 2 0 -github.com/ethereum/go-ethereum/core/types/block.go:245.2,245.48 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:248.2,248.22 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:251.2,251.22 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:255.2,255.13 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:242.56,244.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:245.48,247.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:248.22,250.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:251.22,254.3 2 0 -github.com/ethereum/go-ethereum/core/types/block.go:259.48,262.38 3 1 -github.com/ethereum/go-ethereum/core/types/block.go:265.2,267.12 3 1 -github.com/ethereum/go-ethereum/core/types/block.go:262.38,264.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:271.46,277.2 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:281.45,281.64 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:282.45,282.70 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:284.60,285.45 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:290.2,290.12 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:285.45,286.33 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:286.33,288.4 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:293.39,293.83 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:294.39,294.67 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:295.39,295.66 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:296.39,296.87 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:297.39,297.63 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:299.43,299.78 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:300.43,300.72 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:301.43,301.96 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:302.43,302.68 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:303.43,303.71 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:304.43,304.67 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:305.43,305.73 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:306.43,306.69 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:307.43,307.74 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:308.43,308.72 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:309.43,309.86 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:311.36,312.29 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:315.2,315.43 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:312.29,314.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:318.34,318.65 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:321.30,321.72 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:325.43,326.40 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:329.2,332.30 4 0 -github.com/ethereum/go-ethereum/core/types/block.go:326.40,328.3 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:337.37,339.2 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:343.53,346.2 2 0 -github.com/ethereum/go-ethereum/core/types/block.go:348.50,349.22 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:352.2,352.24 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:349.22,351.3 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:357.49,365.2 2 0 -github.com/ethereum/go-ethereum/core/types/block.go:368.80,375.24 3 0 -github.com/ethereum/go-ethereum/core/types/block.go:378.2,378.14 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:375.24,377.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:383.36,384.40 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:387.2,389.10 3 1 -github.com/ethereum/go-ethereum/core/types/block.go:384.40,386.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:396.57,399.16 2 1 -github.com/ethereum/go-ethereum/core/types/block.go:402.2,403.16 2 1 -github.com/ethereum/go-ethereum/core/types/block.go:406.2,406.27 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:409.2,409.39 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:399.16,401.3 1 1 -github.com/ethereum/go-ethereum/core/types/block.go:403.16,405.3 1 0 -github.com/ethereum/go-ethereum/core/types/block.go:406.27,408.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:17.48,46.2 15 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:49.53,65.52 3 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:68.2,68.21 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:71.2,71.26 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:74.2,74.23 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:77.2,77.34 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:80.2,81.22 2 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:84.2,85.21 2 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:88.2,89.23 2 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:92.2,93.32 2 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:96.2,96.24 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:99.2,100.26 2 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:103.2,103.28 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:106.2,106.33 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:109.2,109.12 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:65.52,67.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:68.21,70.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:71.26,73.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:74.23,76.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:77.34,79.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:81.22,83.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:85.21,87.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:89.23,91.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:93.32,95.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:96.24,98.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:100.26,102.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:103.28,105.3 1 0 -github.com/ethereum/go-ethereum/core/types/gen_receipt_json.go:106.33,108.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:42.59,44.9 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:54.2,61.10 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:44.9,53.3 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:67.78,69.9 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:96.2,97.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:106.2,113.10 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:69.9,73.17 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:84.3,92.11 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:73.17,81.4 4 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:97.16,105.3 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:119.39,120.26 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:124.2,124.14 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:129.2,129.14 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:134.2,135.57 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:144.2,146.13 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:120.26,122.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:124.14,128.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:129.14,133.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:135.57,139.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:139.8,139.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:139.22,142.13 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:151.41,153.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:156.46,158.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:165.44,166.25 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:170.2,171.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:175.2,175.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:166.25,168.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:171.16,174.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:183.41,184.24 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:187.2,188.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:192.2,192.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:184.24,186.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:188.16,191.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:196.37,199.2 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:203.65,206.2 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_binary.go:210.84,213.2 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:39.40,39.59 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:43.50,48.43 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:55.2,55.42 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:49.10,50.14 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:51.9,52.15 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:59.45,61.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:81.136,83.17 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:86.2,92.42 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:114.2,115.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:83.17,85.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:92.42,93.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:112.3,112.29 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:93.22,98.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:98.9,108.18 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:108.18,109.10 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:120.32,125.41 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:170.2,171.22 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:125.41,130.7 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:130.7,132.21 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:144.4,145.48 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:132.21,141.10 7 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:145.48,147.10 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:148.10,157.51 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:157.51,159.14 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:160.11,164.14 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:175.37,176.28 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:179.2,179.19 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:205.2,205.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:222.2,222.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:176.28,178.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:179.19,183.17 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:188.3,188.62 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:192.3,192.48 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:183.17,185.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:185.9,187.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:188.62,191.4 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:192.48,194.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:205.6,206.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:209.3,209.17 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:214.3,214.62 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:218.3,218.48 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:206.18,208.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:209.17,211.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:211.9,213.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:214.62,217.4 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:218.48,219.9 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:231.44,235.44 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:242.2,242.32 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:246.2,250.62 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:260.2,261.59 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:284.2,285.17 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:288.2,288.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:235.44,240.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:242.32,244.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:250.62,253.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:253.8,253.54 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:253.54,257.3 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:261.59,265.14 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:268.3,268.31 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:272.3,273.63 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:280.3,282.51 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:265.14,267.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:268.31,271.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:273.63,275.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:275.9,275.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:275.22,277.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:285.17,287.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:292.49,296.2 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:300.39,302.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:305.44,307.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:311.42,313.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:317.39,319.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:323.35,324.34 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:327.2,327.20 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:324.34,326.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:331.33,332.34 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:335.2,335.15 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:332.34,334.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:341.102,343.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator_fast.go:348.123,350.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:186.146,194.12 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:198.2,199.14 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:203.2,203.16 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:212.2,212.18 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:216.2,216.18 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:194.12,196.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:199.14,202.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:203.16,204.14 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:209.3,209.18 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:204.14,208.4 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:212.18,215.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:221.28,226.33 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:232.2,235.17 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:226.33,227.42 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:227.42,229.9 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:235.17,237.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:243.26,248.33 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:272.2,284.38 8 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:248.33,249.32 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:250.19,252.29 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:258.4,260.23 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:262.19,266.23 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:268.11,269.55 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:252.29,256.5 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:284.38,286.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:291.57,296.2 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:301.80,305.17 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:308.2,309.18 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:312.2,313.6 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:328.2,328.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:305.17,307.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:309.18,311.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:313.6,314.56 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:317.3,319.18 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:322.3,323.20 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:326.3,326.17 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:314.56,315.9 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:319.18,320.9 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:323.20,324.9 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:333.193,340.29 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:344.2,345.19 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:348.2,355.12 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:340.29,342.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:345.19,347.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:367.56,370.17 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:373.2,374.9 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:378.2,379.48 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:382.2,391.17 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:401.2,405.35 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:411.2,412.34 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:419.2,419.35 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:425.2,425.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:437.2,437.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:370.17,372.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:374.9,376.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:379.48,381.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:391.17,400.3 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:405.35,406.40 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:406.40,409.4 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:412.34,414.40 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:417.3,417.25 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:414.40,416.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:419.35,420.19 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:420.19,422.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:425.22,427.36 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:435.3,435.26 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:427.36,428.51 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:431.4,431.41 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:428.51,430.5 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:431.41,433.5 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:451.60,453.32 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:464.2,464.38 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:498.2,506.13 7 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:453.32,455.49 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:455.49,457.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:457.9,460.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:465.18,466.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:468.18,481.25 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:484.3,485.47 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:494.10,495.55 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:481.25,483.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:485.47,490.53 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:490.53,492.5 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:514.47,521.26 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:527.2,531.16 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:534.2,538.39 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:567.2,567.45 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:591.2,591.55 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:617.2,624.38 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:627.2,641.51 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:646.2,646.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:521.26,525.3 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:531.16,532.38 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:538.39,540.74 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:544.3,548.17 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:564.3,564.15 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:540.74,541.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:548.17,557.48 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:557.48,558.41 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:561.5,561.18 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:558.41,560.6 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:567.45,569.74 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:573.3,583.47 6 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:569.74,570.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:583.47,584.40 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:587.4,587.17 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:584.40,586.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:591.55,593.81 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:597.3,599.42 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:593.81,594.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:599.42,601.91 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:604.4,604.21 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:612.4,613.56 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:601.91,602.13 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:604.21,608.5 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:608.10,611.5 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:624.38,626.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:641.51,645.3 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:655.63,658.17 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:662.2,667.60 4 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:670.2,671.33 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:676.2,676.54 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:680.2,681.16 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:685.2,686.18 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:658.17,660.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:667.60,669.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:671.33,673.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:676.54,678.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:681.16,683.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:692.42,702.33 5 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:728.2,731.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:702.33,703.32 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:704.19,706.29 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:712.4,714.23 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:716.19,720.23 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:722.11,723.55 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:706.29,710.5 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:736.93,738.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:741.2,741.8 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:744.2,744.46 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:738.16,740.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:741.8,743.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:749.114,751.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:754.2,754.8 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:757.2,757.55 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:751.16,753.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:754.8,756.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:762.47,764.16 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:767.2,769.185 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:783.2,783.16 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:786.2,786.17 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:789.2,789.12 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:764.16,766.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:769.185,771.17 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:774.3,777.17 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:780.3,780.19 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:771.17,773.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:777.17,779.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:783.16,785.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:786.17,788.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:794.39,796.29 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:800.2,800.17 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:803.2,803.30 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:796.29,798.8 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:800.17,802.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:804.18,805.15 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:806.18,807.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:808.10,809.50 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:815.39,817.22 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:820.2,820.25 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:817.22,819.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:825.43,830.18 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:833.2,835.36 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:830.18,832.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/snapshot.go:839.39,844.2 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/sort.go:29.28,29.46 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/sort.go:33.38,33.86 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/sort.go:36.33,36.64 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:39.93,44.23 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:47.2,47.42 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:50.2,50.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:44.23,46.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:47.42,49.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:55.95,57.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:60.2,60.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:57.16,58.13 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:65.48,67.56 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:70.2,70.28 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:73.2,73.32 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:76.2,76.21 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:67.56,69.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:70.28,72.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:73.32,75.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:80.50,82.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:85.2,85.35 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/account.go:82.16,84.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:48.41,50.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:53.40,55.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:59.35,64.2 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:68.66,70.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:73.2,73.20 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:76.2,77.55 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:80.2,80.21 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:70.16,72.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:73.20,75.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:77.55,78.13 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:85.67,91.14 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:96.2,96.69 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:100.2,103.57 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:109.2,113.27 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:118.2,118.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:91.14,93.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:96.69,98.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:103.57,107.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:113.27,115.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:115.8,117.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:123.84,129.14 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:132.2,136.65 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:140.2,143.53 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:149.2,153.27 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:158.2,158.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:129.14,131.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:136.65,138.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:143.53,147.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:153.27,155.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:155.8,157.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/disklayer.go:164.180,166.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:108.76,110.29 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:114.2,114.21 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:124.2,131.21 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:141.2,141.23 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:110.29,112.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:115.25,116.72 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:117.29,121.8 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:131.21,132.72 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:132.72,139.4 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:147.114,156.38 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:159.2,170.13 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:156.38,158.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:174.85,182.18 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:187.2,188.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:191.2,192.9 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:202.2,203.40 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:182.18,186.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:188.16,189.13 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:193.21,194.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:195.37,196.19 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:197.40,198.38 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:199.10,200.90 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:218.41,220.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:224.42,226.26 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:229.2,229.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:226.26,228.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:234.87,235.40 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:241.2,241.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:235.40,237.44 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:237.44,239.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:251.193,262.18 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:294.2,294.23 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:299.2,299.30 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:308.2,308.32 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:323.2,324.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:329.2,330.19 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:334.2,334.19 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:337.2,337.51 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:347.2,347.17 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:361.2,369.6 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:262.18,264.48 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:267.3,267.23 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:273.3,275.28 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:264.48,265.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:267.23,271.9 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:275.28,277.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:277.9,279.18 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:279.18,288.5 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:288.10,290.5 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:294.23,296.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:296.8,298.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:299.30,300.24 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:300.24,302.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:302.9,304.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:308.32,310.28 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:313.3,313.49 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:320.3,320.51 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:310.28,312.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:313.49,319.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:324.16,327.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:330.19,332.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:334.19,336.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:337.51,346.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:347.17,348.50 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:348.50,357.4 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:384.221,387.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:390.2,394.21 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:397.2,400.20 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:413.2,421.34 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:431.2,432.26 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:442.2,443.15 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:451.2,469.18 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:508.2,508.21 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:512.2,513.29 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:519.2,522.23 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:527.2,532.49 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:387.16,389.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:394.21,396.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:400.20,407.63 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:411.3,411.57 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:407.63,407.105 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:407.119,409.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:421.34,423.24 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:426.3,426.16 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:423.24,425.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:432.26,436.35 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:439.3,440.38 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:436.35,438.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:443.15,445.17 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:445.17,448.4 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:469.18,470.55 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:474.3,477.23 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:502.3,503.69 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:506.3,506.33 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:470.55,472.9 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:477.23,478.58 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:500.4,500.9 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:478.58,481.64 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:484.5,488.13 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:481.64,483.6 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:489.10,489.23 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:489.23,492.59 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:497.5,498.24 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:492.59,494.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:494.11,496.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:503.69,505.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:508.21,510.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:513.29,514.56 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:517.3,517.15 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:514.56,516.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:522.23,524.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:524.8,526.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:539.54,544.27 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:549.2,557.54 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:595.2,595.75 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:719.2,719.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:741.2,742.38 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:749.2,761.14 8 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:544.27,548.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:557.54,558.10 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:562.3,562.63 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:588.3,588.41 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:592.3,592.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:559.30,559.30 0 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:560.11,560.11 0 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:562.63,563.56 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:572.4,574.40 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:577.4,583.20 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:563.56,567.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:574.40,576.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:583.20,586.5 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:588.41,591.4 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:595.75,600.13 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:614.3,620.52 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:624.3,624.66 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:643.3,646.98 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:650.3,650.47 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:655.3,655.28 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:714.3,715.13 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:600.13,607.117 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:610.4,611.14 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:607.117,609.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:620.52,622.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:624.66,626.14 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:640.4,641.20 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:626.14,627.48 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:630.5,630.30 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:633.5,633.38 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:627.48,629.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:630.30,632.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:634.10,639.5 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:646.98,648.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:650.47,652.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:655.28,663.117 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:666.4,666.64 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:663.117,665.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:667.9,671.107 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:674.4,674.77 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:699.4,700.8 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:671.107,673.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:674.77,675.33 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:679.5,679.15 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:684.5,684.14 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:690.5,694.73 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:697.5,697.15 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:675.33,677.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:679.15,683.6 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:684.14,687.6 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:687.11,689.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:694.73,696.6 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:700.8,702.19 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:705.5,705.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:708.5,708.60 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:702.19,704.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:705.18,706.11 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:708.60,709.11 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:719.6,722.17 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:730.3,730.16 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:733.3,733.54 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:736.3,736.35 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:722.17,723.20 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:726.4,727.10 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:723.20,725.5 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:730.16,731.9 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:733.54,734.9 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:742.38,748.3 4 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:766.37,767.37 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:773.2,773.12 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:767.37,769.20 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/generate.go:769.20,771.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:86.72,89.53 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:93.2,96.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:89.53,91.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:100.44,105.20 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:109.2,109.23 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:112.2,112.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:117.2,120.13 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:105.20,106.68 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:109.23,111.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:112.22,115.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:125.46,127.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:130.51,132.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:142.49,145.9 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:152.2,153.22 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:156.2,156.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:145.9,146.52 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:150.3,150.81 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:146.52,149.4 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:153.22,155.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:160.43,160.44 0 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:170.72,176.2 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:179.44,181.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:185.2,185.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:195.2,195.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:181.18,183.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:185.6,186.20 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:191.3,191.77 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:186.20,190.4 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:191.77,192.9 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:203.46,204.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:207.2,207.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:204.18,206.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:211.51,213.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:216.49,218.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:221.42,223.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:223.18,226.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:250.101,255.53 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:259.2,263.15 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:255.53,257.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:267.44,272.20 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:276.2,276.23 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:279.2,279.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:284.2,287.13 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:272.20,273.68 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:276.23,278.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:279.22,282.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:292.46,294.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:297.51,299.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:309.46,312.9 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:316.2,317.9 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:320.2,321.22 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:324.2,324.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:312.9,313.89 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:317.9,318.86 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:321.22,323.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:328.43,328.44 0 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:342.101,349.2 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:352.44,354.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:358.2,358.6 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:368.2,368.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:354.18,356.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:358.6,359.20 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:364.3,364.95 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:359.20,363.4 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:364.95,365.9 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:376.46,377.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:380.2,380.22 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:377.18,379.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:384.51,386.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:389.46,391.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:394.42,396.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/iterator.go:396.18,399.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:69.56,70.29 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:73.2,74.67 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:79.2,80.49 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:88.2,89.77 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:70.29,72.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:74.67,77.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:81.25,82.36 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:83.29,84.91 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:85.10,86.33 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:93.103,98.29 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:101.2,102.67 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:111.2,112.23 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:116.2,120.16 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:124.2,124.31 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:131.2,132.40 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:138.2,138.51 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:143.2,144.16 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:147.2,148.33 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:98.29,100.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:102.67,104.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:112.23,115.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:120.16,123.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:124.31,127.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:132.40,134.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:138.51,141.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:144.16,146.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:152.138,155.40 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:160.2,161.33 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:164.2,171.16 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:183.2,183.43 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:197.2,197.21 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:218.2,218.29 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:155.40,157.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:161.33,163.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:171.16,174.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:183.43,187.16 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:194.3,194.89 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:187.16,189.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:197.21,200.28 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:203.3,207.33 4 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:210.3,216.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:200.28,202.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:207.33,209.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:223.70,226.40 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:233.2,234.45 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:237.2,238.34 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:241.2,242.44 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:245.2,246.33 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:253.2,254.43 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:257.2,258.32 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:269.2,269.92 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:226.40,228.20 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:231.3,231.52 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:228.20,230.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:234.45,236.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:238.34,240.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:242.44,244.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:246.33,247.26 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:247.26,249.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:249.9,251.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:254.43,256.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:258.32,260.34 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:267.3,267.34 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:260.34,261.30 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:261.30,263.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:263.10,265.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:274.73,277.24 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:286.2,289.14 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:293.2,296.21 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:277.24,281.36 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:281.36,283.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:289.14,291.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:301.73,304.16 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:308.2,311.16 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:315.2,315.52 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:318.2,319.35 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:322.2,322.54 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:325.2,326.41 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:329.2,329.53 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:332.2,333.42 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:342.2,342.52 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:345.2,346.18 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:304.16,306.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:311.16,313.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:315.52,317.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:319.35,321.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:322.54,324.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:326.41,328.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:329.53,331.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:333.42,336.31 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:340.3,340.80 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:336.31,339.4 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/journal.go:342.52,344.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:34.152,45.18 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:48.2,48.16 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:80.2,81.38 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:84.2,84.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:87.2,87.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:90.2,90.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:45.18,47.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:48.16,51.36 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:54.3,54.25 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:57.3,57.51 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:61.3,64.23 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:51.36,52.9 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:54.25,55.12 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:57.51,58.9 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:64.23,67.40 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:70.4,74.52 4 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:67.40,69.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:74.52,77.5 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:81.38,83.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:84.18,86.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/wipe.go:87.12,89.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:54.71,56.2 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:59.92,61.2 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:66.105,69.16 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:72.2,74.186 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:97.2,97.16 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:100.2,100.17 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:103.2,103.12 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:69.16,71.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:74.186,76.28 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:84.3,85.17 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:88.3,91.17 3 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:94.3,94.19 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:76.28,78.22 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:81.4,81.40 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:78.22,80.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:85.17,87.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:91.17,93.4 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:97.16,99.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:100.17,102.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:122.40,128.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:131.79,137.2 4 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:140.56,145.2 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:148.97,154.44 5 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:154.44,156.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:160.77,167.2 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:170.37,179.23 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:206.2,206.46 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:179.23,181.79 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:181.79,188.42 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:201.4,203.9 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:188.42,190.60 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:190.60,196.80 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:196.80,198.7 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:210.41,216.21 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:219.2,220.39 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:216.21,218.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:224.54,228.6 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:228.6,229.10 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:230.18,232.32 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:233.26,234.15 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:237.4,237.10 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:234.15,236.5 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:245.196,254.12 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:259.2,259.28 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:269.2,271.31 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:276.2,276.48 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:289.2,295.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:353.2,353.35 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:360.2,360.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:254.12,257.3 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:259.28,261.13 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:261.13,264.4 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:271.31,273.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:276.48,279.32 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:284.3,287.22 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:279.32,280.51 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:280.51,282.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:295.16,296.33 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:339.3,343.57 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:296.33,301.27 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:335.4,335.38 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:301.27,303.19 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:303.19,305.6 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:306.10,309.37 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:314.5,315.19 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:318.5,318.31 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:330.5,331.19 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:309.37,312.6 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:315.19,317.6 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:318.31,320.20 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:324.6,324.53 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:328.6,328.20 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:320.20,323.7 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:324.53,327.7 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:331.19,333.6 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:336.9,338.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:343.57,344.34 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:349.4,349.37 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:344.34,346.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:346.10,348.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:353.35,354.33 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:354.33,356.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:356.9,358.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:363.87,365.23 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:368.2,369.15 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:374.2,374.13 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:365.23,367.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:369.15,371.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/conversion.go:371.8,373.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:80.13,89.60 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:89.60,91.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:131.65,131.91 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:132.65,132.91 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:133.65,133.91 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:134.65,134.91 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:135.65,135.77 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:136.45,138.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:145.64,145.90 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:146.64,146.90 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:147.64,147.90 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:148.64,148.90 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:149.64,149.76 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:150.44,152.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:159.64,159.90 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:160.64,160.90 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:161.64,161.90 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:162.64,162.90 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:163.64,163.76 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:164.44,167.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:171.182,181.33 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:190.2,190.42 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:198.2,198.42 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:208.2,209.11 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:182.18,183.21 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:184.18,185.28 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:186.10,187.31 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:190.42,191.18 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:195.3,196.56 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:191.18,192.54 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:198.42,199.19 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:203.3,203.30 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:199.19,200.54 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:203.30,206.4 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:214.49,218.30 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:223.2,226.46 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:234.2,234.35 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:237.2,237.35 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:240.2,240.49 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:248.2,251.79 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:218.30,220.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:226.46,230.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:230.8,232.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:234.35,236.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:237.35,239.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:240.49,241.34 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:241.34,243.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:255.41,257.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:260.40,262.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:266.35,268.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:272.66,274.16 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:277.2,277.20 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:280.2,281.55 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:284.2,284.21 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:274.16,276.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:277.20,279.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:281.55,282.13 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:291.67,296.10 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:299.2,300.10 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:303.2,307.19 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:312.2,312.31 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:296.10,298.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:300.10,302.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:307.19,310.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:318.78,324.16 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:328.2,328.42 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:336.2,336.39 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:344.2,344.44 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:348.2,349.35 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:324.16,326.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:328.42,334.3 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:336.39,342.3 5 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:344.44,346.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:357.84,362.10 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:365.2,366.10 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:369.2,373.19 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:378.2,378.48 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:362.10,364.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:366.10,368.3 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:373.19,376.3 2 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:384.95,390.16 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:394.2,394.52 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:408.2,408.46 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:416.2,416.44 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:420.2,421.52 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:390.16,392.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:394.52,395.43 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:395.43,398.29 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:403.4,404.20 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:398.29,400.5 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:400.10,402.5 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:408.46,414.3 5 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:416.44,418.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:426.180,428.2 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:433.41,436.9 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:442.2,449.46 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:453.2,453.35 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:458.2,458.41 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:462.2,462.51 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:476.2,486.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:436.9,438.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:449.46,450.38 1 0 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:453.35,457.3 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:458.41,460.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:462.51,464.52 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:469.3,470.42 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:473.3,473.46 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:464.52,466.12 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:470.42,472.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:493.50,499.17 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:503.2,507.35 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:510.2,510.35 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:515.2,517.23 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:499.17,501.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:507.35,509.3 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:510.35,511.41 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:511.41,513.4 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:529.81,532.47 3 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:538.2,538.55 1 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:542.2,550.28 6 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:553.2,556.32 4 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:532.47,536.3 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:538.55,541.3 2 1 -github.com/ethereum/go-ethereum/core/state/snapshot/difflayer.go:550.28,552.3 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:29.68,32.2 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:36.114,38.9 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:42.2,42.15 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:46.2,47.26 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:38.9,41.3 1 0 -github.com/ethereum/go-ethereum/core/state/access_list.go:42.15,45.3 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:51.34,55.2 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:58.41,60.32 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:63.2,64.34 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:71.2,71.11 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:60.32,62.3 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:64.34,66.26 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:69.3,69.27 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:66.26,68.4 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:76.63,77.50 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:80.2,81.13 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:77.50,79.3 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:89.108,91.31 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:99.2,100.33 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:106.2,106.21 1 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:91.31,97.3 4 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:100.33,104.3 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:113.76,116.13 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:119.2,124.23 3 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:116.13,117.62 1 0 -github.com/ethereum/go-ethereum/core/state/access_list.go:124.23,127.3 2 1 -github.com/ethereum/go-ethereum/core/state/access_list.go:134.61,136.2 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:112.46,114.2 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:119.77,126.2 2 1 -github.com/ethereum/go-ethereum/core/state/database.go:135.63,137.16 2 1 -github.com/ethereum/go-ethereum/core/state/database.go:140.2,140.16 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:137.16,139.3 1 0 -github.com/ethereum/go-ethereum/core/state/database.go:144.80,146.16 2 1 -github.com/ethereum/go-ethereum/core/state/database.go:149.2,149.16 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:146.16,148.3 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:153.44,154.23 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:155.24,156.18 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:157.10,158.47 1 0 -github.com/ethereum/go-ethereum/core/state/database.go:163.83,164.68 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:167.2,168.19 2 1 -github.com/ethereum/go-ethereum/core/state/database.go:173.2,173.37 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:164.68,166.3 1 1 -github.com/ethereum/go-ethereum/core/state/database.go:168.19,172.3 3 1 -github.com/ethereum/go-ethereum/core/state/database.go:179.93,180.68 1 0 -github.com/ethereum/go-ethereum/core/state/database.go:183.2,184.19 2 0 -github.com/ethereum/go-ethereum/core/state/database.go:189.2,189.37 1 0 -github.com/ethereum/go-ethereum/core/state/database.go:180.68,182.3 1 0 -github.com/ethereum/go-ethereum/core/state/database.go:184.19,188.3 3 0 -github.com/ethereum/go-ethereum/core/state/database.go:193.84,194.54 1 0 -github.com/ethereum/go-ethereum/core/state/database.go:197.2,198.23 2 0 -github.com/ethereum/go-ethereum/core/state/database.go:194.54,196.3 1 0 -github.com/ethereum/go-ethereum/core/state/database.go:202.46,204.2 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:48.52,52.2 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:57.37,59.21 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:63.2,63.34 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:67.2,67.22 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:59.21,61.3 1 0 -github.com/ethereum/go-ethereum/core/state/iterator.go:63.34,66.3 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:71.38,73.21 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:77.2,77.23 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:81.2,81.22 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:91.2,91.20 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:96.2,96.42 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:104.2,104.24 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:108.2,109.85 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:112.2,113.16 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:116.2,117.27 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:120.2,120.51 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:128.2,129.12 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:73.21,75.3 1 0 -github.com/ethereum/go-ethereum/core/state/iterator.go:77.23,79.3 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:81.22,82.42 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:88.3,88.13 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:82.42,83.32 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:86.4,86.19 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:83.32,85.5 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:91.20,94.3 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:96.42,97.32 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:100.3,101.13 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:97.32,99.4 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:104.24,106.3 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:109.85,111.3 1 0 -github.com/ethereum/go-ethereum/core/state/iterator.go:113.16,115.3 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:117.27,119.3 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:120.51,124.17 4 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:124.17,126.4 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:134.41,139.21 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:143.2,143.9 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:154.2,154.13 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:139.21,141.3 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:144.24,146.35 2 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:149.22,150.51 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:151.25,152.62 1 1 -github.com/ethereum/go-ethereum/core/state/iterator.go:146.35,148.4 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:37.31,39.2 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:43.40,44.28 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:48.2,48.8 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:44.28,46.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:51.33,53.28 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:57.2,57.12 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:53.28,55.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:97.36,99.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:102.91,103.25 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:106.2,106.26 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:109.2,109.34 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:112.2,120.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:103.25,105.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:106.26,108.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:109.34,111.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:124.52,126.2 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:129.43,130.20 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:130.20,132.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:135.38,137.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:139.31,143.25 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:143.25,147.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:150.49,151.19 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:168.2,168.15 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:151.19,154.57 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:159.3,159.20 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:154.57,158.4 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:159.20,162.18 3 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:162.18,165.5 2 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:172.74,174.26 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:178.2,179.11 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:183.2,183.37 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:174.26,176.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:179.11,181.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:187.83,189.26 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:193.2,193.54 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:196.2,196.51 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:200.2,204.22 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:221.2,221.36 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:232.2,233.18 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:240.2,241.14 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:189.26,191.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:193.54,195.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:196.51,198.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:204.22,211.66 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:214.3,216.31 3 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:211.66,213.4 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:216.31,218.4 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:221.36,224.31 3 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:227.3,227.17 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:224.31,226.4 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:227.17,230.4 2 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:233.18,235.17 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:238.3,238.26 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:235.17,237.4 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:245.69,247.26 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:252.2,253.19 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:257.2,262.24 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:247.26,250.3 2 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:253.19,255.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:271.71,273.26 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:276.2,276.34 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:273.26,275.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:276.34,278.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:283.56,285.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:289.47,291.41 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:297.2,297.96 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:300.2,300.29 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:291.41,293.36 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:293.36,295.4 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:297.96,299.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:300.29,302.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:307.52,310.32 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:314.2,314.30 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:318.2,324.43 5 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:354.2,354.28 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:357.2,357.31 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:360.2,360.11 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:310.32,312.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:314.30,315.31 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:315.31,315.75 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:324.43,326.36 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:329.3,332.31 3 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:342.3,342.23 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:352.3,352.62 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:326.36,327.12 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:332.31,335.4 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:335.9,340.4 3 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:342.23,343.22 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:350.4,350.48 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:343.22,345.63 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:345.63,348.6 2 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:354.28,356.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:357.31,359.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:364.47,366.29 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:370.2,370.30 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:373.2,373.29 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:366.29,368.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:370.30,371.31 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:371.31,371.74 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:378.60,380.29 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:383.2,383.20 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:387.2,387.30 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:390.2,391.16 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:394.2,394.23 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:380.29,382.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:383.20,385.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:387.30,388.31 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:388.31,388.75 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:391.16,393.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:399.51,402.24 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:408.2,408.53 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:402.24,403.16 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:406.3,406.9 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:403.16,405.4 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:413.51,414.24 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:417.2,417.53 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:414.24,416.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:420.51,426.2 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:428.51,430.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:432.58,434.19 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:437.2,444.20 8 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:434.19,436.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:452.48,454.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:457.48,458.19 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:461.2,461.46 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:464.2,465.16 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:468.2,469.13 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:458.19,460.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:461.46,463.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:465.16,467.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:475.49,476.19 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:479.2,479.46 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:482.2,483.16 2 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:486.2,486.13 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:476.19,478.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:479.46,481.3 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:483.16,485.3 1 0 -github.com/ethereum/go-ethereum/core/state/state_object.go:489.66,497.2 3 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:499.66,503.2 3 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:505.46,511.2 2 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:513.46,515.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:517.41,519.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:521.42,523.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:525.38,527.2 1 1 -github.com/ethereum/go-ethereum/core/state/state_object.go:532.40,533.54 1 0 -github.com/ethereum/go-ethereum/core/state/sync.go:30.127,33.19 2 1 -github.com/ethereum/go-ethereum/core/state/sync.go:40.2,41.91 2 1 -github.com/ethereum/go-ethereum/core/state/sync.go:55.2,56.15 2 1 -github.com/ethereum/go-ethereum/core/state/sync.go:33.19,34.88 1 0 -github.com/ethereum/go-ethereum/core/state/sync.go:34.88,36.4 1 0 -github.com/ethereum/go-ethereum/core/state/sync.go:41.91,42.20 1 1 -github.com/ethereum/go-ethereum/core/state/sync.go:47.3,48.65 2 1 -github.com/ethereum/go-ethereum/core/state/sync.go:51.3,53.13 3 1 -github.com/ethereum/go-ethereum/core/state/sync.go:42.20,43.46 1 0 -github.com/ethereum/go-ethereum/core/state/sync.go:43.46,45.5 1 0 -github.com/ethereum/go-ethereum/core/state/sync.go:48.65,50.4 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:70.41,72.2 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:75.68,77.2 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:87.49,89.2 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:92.76,94.2 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:102.76,113.32 2 0 -github.com/ethereum/go-ethereum/core/state/dump.go:116.2,116.23 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:113.32,115.3 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:120.49,124.2 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:128.87,130.17 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:133.2,143.16 5 1 -github.com/ethereum/go-ethereum/core/state/dump.go:195.2,195.26 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:198.2,201.16 2 1 -github.com/ethereum/go-ethereum/core/state/dump.go:130.17,132.3 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:143.16,145.58 2 1 -github.com/ethereum/go-ethereum/core/state/dump.go:148.3,156.23 3 1 -github.com/ethereum/go-ethereum/core/state/dump.go:164.3,166.21 3 1 -github.com/ethereum/go-ethereum/core/state/dump.go:169.3,169.24 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:181.3,183.41 3 1 -github.com/ethereum/go-ethereum/core/state/dump.go:188.3,188.43 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:145.58,146.14 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:156.23,159.30 2 0 -github.com/ethereum/go-ethereum/core/state/dump.go:162.4,162.30 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:159.30,160.13 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:166.21,168.4 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:169.24,172.25 3 1 -github.com/ethereum/go-ethereum/core/state/dump.go:172.25,174.19 2 0 -github.com/ethereum/go-ethereum/core/state/dump.go:178.5,178.98 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:174.19,176.14 2 0 -github.com/ethereum/go-ethereum/core/state/dump.go:183.41,187.4 2 0 -github.com/ethereum/go-ethereum/core/state/dump.go:188.43,189.17 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:192.4,192.9 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:189.17,191.5 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:195.26,197.3 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:205.50,211.2 3 1 -github.com/ethereum/go-ethereum/core/state/dump.go:214.49,217.16 3 1 -github.com/ethereum/go-ethereum/core/state/dump.go:220.2,220.13 1 1 -github.com/ethereum/go-ethereum/core/state/dump.go:217.16,219.3 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:224.73,226.2 1 0 -github.com/ethereum/go-ethereum/core/state/dump.go:229.63,235.2 3 0 -github.com/ethereum/go-ethereum/core/state/journal.go:44.28,48.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:51.46,53.42 2 1 -github.com/ethereum/go-ethereum/core/state/journal.go:53.42,55.3 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:60.58,61.50 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:72.2,72.34 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:61.50,66.50 2 1 -github.com/ethereum/go-ethereum/core/state/journal.go:66.50,67.49 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:67.49,69.5 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:78.46,80.2 1 0 -github.com/ethereum/go-ethereum/core/state/journal.go:83.32,85.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:143.49,146.2 2 1 -github.com/ethereum/go-ethereum/core/state/journal.go:148.56,150.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:152.48,154.39 2 1 -github.com/ethereum/go-ethereum/core/state/journal.go:154.39,156.3 1 0 -github.com/ethereum/go-ethereum/core/state/journal.go:159.55,161.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:163.44,165.16 2 1 -github.com/ethereum/go-ethereum/core/state/journal.go:165.16,168.3 2 1 -github.com/ethereum/go-ethereum/core/state/journal.go:171.51,173.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:177.43,178.2 0 1 -github.com/ethereum/go-ethereum/core/state/journal.go:180.49,182.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:184.44,186.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:188.51,190.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:192.42,194.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:196.49,198.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:200.41,202.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:204.48,206.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:208.44,210.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:212.51,214.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:216.43,218.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:220.50,222.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:224.43,226.20 2 1 -github.com/ethereum/go-ethereum/core/state/journal.go:231.2,231.13 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:226.20,228.3 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:228.8,230.3 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:234.50,236.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:238.48,240.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:242.55,244.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:246.57,257.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:259.64,261.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:263.54,265.2 1 1 -github.com/ethereum/go-ethereum/core/state/journal.go:267.61,269.2 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:50.57,53.2 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:55.46,56.24 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:128.81,130.16 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:133.2,147.22 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:154.2,154.17 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:130.16,132.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:147.22,148.59 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:148.59,152.4 3 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:160.53,161.25 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:165.2,165.19 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:161.25,164.3 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:165.19,167.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:172.36,173.25 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:173.25,176.3 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:180.39,181.20 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:181.20,183.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:186.33,188.2 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:190.42,198.2 6 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:200.81,202.25 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:205.2,205.13 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:202.25,204.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:208.39,210.29 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:213.2,213.13 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:210.29,212.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:217.66,218.37 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:218.37,223.3 4 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:227.54,229.2 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:232.41,235.2 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:239.41,241.20 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:244.2,244.17 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:241.20,242.88 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:249.51,251.2 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:255.51,258.2 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:261.60,263.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:266.2,266.20 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:263.24,265.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:269.56,271.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:275.2,275.10 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:271.24,273.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:279.33,281.2 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:283.55,285.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:288.2,288.12 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:285.24,287.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:291.56,293.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:296.2,296.10 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:293.24,295.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:299.64,301.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:304.2,304.51 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:301.24,303.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:308.79,310.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:313.2,313.22 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:310.24,312.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:317.67,319.2 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:322.74,326.2 3 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:329.88,332.17 3 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:335.2,336.19 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:332.17,334.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:340.88,342.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:345.2,345.22 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:342.24,344.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:349.39,351.2 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:355.57,357.24 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:360.2,362.26 3 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:357.24,359.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:365.57,367.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:370.2,370.14 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:367.24,369.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:378.68,380.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:380.24,382.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:386.68,388.24 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:388.24,390.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:393.68,395.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:395.24,397.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:400.63,402.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:402.24,404.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:407.61,409.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:409.24,411.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:414.73,416.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:416.24,418.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:423.88,425.24 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:425.24,427.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:435.53,437.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:440.2,448.13 4 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:437.24,439.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:456.55,458.30 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:462.2,463.68 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:471.2,471.19 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:458.30,459.31 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:459.31,459.72 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:463.68,465.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:471.19,473.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:477.55,479.30 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:483.2,484.50 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:479.30,480.31 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:480.31,480.72 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:484.50,486.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:492.68,493.70 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:496.2,496.12 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:493.70,495.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:503.75,505.45 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:509.2,510.19 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:535.2,535.17 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:555.2,557.12 3 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:505.45,507.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:510.19,513.31 3 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:516.3,516.17 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:513.31,515.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:516.17,517.18 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:520.4,526.31 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:529.4,529.36 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:517.18,519.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:526.31,528.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:529.36,531.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:535.17,538.31 3 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:541.3,541.17 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:545.3,545.20 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:548.3,549.52 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:538.31,540.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:541.17,544.4 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:545.20,547.4 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:549.52,552.4 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:560.55,562.2 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:565.73,567.24 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:570.2,570.20 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:567.24,569.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:575.81,579.34 3 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:585.2,586.17 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:591.2,592.34 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:595.2,595.20 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:579.34,581.20 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:581.20,583.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:586.17,588.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:588.8,590.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:592.34,594.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:608.54,610.17 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:610.17,612.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:615.100,617.15 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:620.2,622.16 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:641.2,641.12 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:617.15,619.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:622.16,624.50 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:631.3,631.24 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:624.50,625.23 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:628.4,628.12 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:625.23,627.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:631.24,633.18 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:636.4,636.45 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:633.18,635.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:636.45,638.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:646.35,662.38 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:680.2,680.42 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:686.2,686.40 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:692.2,692.33 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:700.2,700.42 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:708.2,713.25 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:716.2,716.20 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:741.2,741.14 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:662.38,667.51 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:667.51,675.4 3 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:680.42,681.51 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:684.3,684.47 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:681.51,683.4 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:686.40,687.51 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:690.3,690.45 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:687.51,689.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:692.33,694.26 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:698.3,698.25 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:694.26,697.4 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:700.42,702.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:713.25,715.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:716.20,725.37 4 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:728.3,729.36 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:732.3,733.35 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:725.37,727.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:729.36,731.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:733.35,735.26 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:738.4,738.31 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:735.26,737.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:745.34,750.2 4 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:753.47,755.61 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:758.2,758.71 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:761.2,765.43 3 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:755.61,757.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:758.71,759.64 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:769.38,771.2 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:776.53,778.38 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:812.2,812.57 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:816.2,816.27 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:778.38,780.13 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:789.3,789.58 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:804.3,810.79 3 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:780.13,787.12 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:789.58,796.21 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:796.21,800.5 3 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:801.9,803.4 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:812.57,814.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:822.73,834.25 3 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:845.2,845.42 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:853.2,853.23 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:858.2,859.42 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:869.2,869.23 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:872.2,872.36 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:876.2,876.30 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:879.2,879.22 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:834.25,835.16 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:835.16,838.4 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:845.42,846.48 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:846.48,848.4 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:853.23,854.59 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:854.59,856.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:859.42,860.47 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:867.3,867.59 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:860.47,863.4 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:863.9,866.4 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:869.23,871.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:872.36,874.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:876.30,877.31 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:877.31,877.71 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:884.54,887.2 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:889.43,890.32 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:894.2,894.41 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:890.32,893.3 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:898.72,899.20 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:903.2,908.40 4 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:923.2,923.34 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:926.2,926.32 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:932.2,933.30 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:938.2,939.113 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:948.2,948.16 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:951.2,951.30 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:964.2,964.19 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:983.2,983.18 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:899.20,901.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:908.40,909.48 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:909.48,911.40 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:916.4,917.18 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:920.4,920.33 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:911.40,914.5 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:917.18,919.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:923.34,925.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:926.32,927.44 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:927.44,929.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:933.30,935.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:939.113,940.57 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:943.3,943.32 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:946.3,946.13 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:940.57,942.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:943.32,945.4 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:948.16,950.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:951.30,962.3 9 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:964.19,965.31 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:969.3,969.46 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:981.3,981.78 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:965.31,966.32 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:966.32,966.74 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:969.46,970.103 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:977.4,977.49 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:970.103,972.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:977.49,979.5 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:995.134,1000.16 3 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:1004.2,1004.35 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:1007.2,1007.26 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:1000.16,1003.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:1004.35,1006.3 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:1007.26,1009.38 2 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:1009.38,1011.4 1 0 -github.com/ethereum/go-ethereum/core/state/statedb.go:1016.63,1017.35 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:1017.35,1019.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:1023.78,1025.13 2 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:1032.2,1032.13 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:1025.13,1031.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:1032.13,1037.3 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:1041.65,1043.2 1 1 -github.com/ethereum/go-ethereum/core/state/statedb.go:1046.115,1048.2 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:55.89,73.2 3 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:77.34,78.37 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:104.2,104.18 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:78.37,81.22 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:81.22,82.30 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:82.30,87.38 4 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:90.5,90.55 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:87.38,89.6 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:91.10,96.38 4 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:99.5,99.55 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:96.38,98.6 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:111.49,128.22 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:135.2,135.40 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:138.2,138.13 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:128.22,129.38 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:132.3,132.14 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:129.38,131.4 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:135.40,137.3 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:142.68,144.22 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:148.2,149.20 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:153.2,153.24 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:144.22,146.3 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:149.20,152.3 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:158.54,160.22 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:169.2,170.20 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:176.2,179.17 3 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:183.2,183.13 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:160.22,162.18 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:166.3,166.29 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:162.18,165.4 2 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:170.20,173.3 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:179.17,182.3 2 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:188.64,189.49 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:189.49,191.3 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:218.63,230.2 3 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:233.47,240.9 4 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:241.29,241.29 0 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:242.10,242.10 0 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:248.35,250.9 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:251.21,253.14 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:255.17,257.21 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:260.3,260.33 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:257.21,259.4 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:266.31,267.9 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:272.2,272.11 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:268.17,268.17 0 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:269.10,270.17 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:277.30,283.16 3 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:287.2,290.6 2 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:283.16,286.3 2 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:290.6,291.10 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:292.18,300.31 5 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:324.24,326.33 1 0 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:328.18,330.10 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:300.31,301.12 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:302.20,307.12 4 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:309.26,311.35 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:313.13,315.44 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:315.44,317.7 1 1 -github.com/ethereum/go-ethereum/core/state/trie_prefetcher.go:317.12,320.7 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:64.35,66.2 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:69.60,74.2 4 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:77.39,80.25 3 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:83.2,84.10 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:80.25,82.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:89.52,91.25 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:94.2,95.10 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:91.25,93.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:99.39,101.25 2 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:104.2,104.19 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:101.25,103.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:108.67,111.2 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:115.86,117.2 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:120.51,122.2 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:127.48,130.2 2 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:135.64,138.49 3 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:141.2,144.33 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:148.2,148.24 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:152.2,153.29 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:156.2,156.18 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:138.49,140.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:144.33,146.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:148.24,150.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:153.29,155.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:160.47,161.17 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:164.2,164.61 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:161.17,163.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:168.60,170.14 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:173.2,173.57 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:170.14,172.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:176.48,177.48 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:180.2,180.47 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:177.48,179.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:184.59,186.51 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:191.2,191.19 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:186.51,188.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:188.8,188.23 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:188.23,190.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:195.56,197.16 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:200.2,205.16 5 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:210.2,210.43 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:214.2,214.32 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:197.16,199.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:205.16,207.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:207.8,207.26 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:207.26,209.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:210.43,212.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:219.64,220.26 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:229.2,229.15 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:220.26,222.10 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:223.38,224.17 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:225.19,226.17 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:233.45,234.20 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:234.20,236.10 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:237.22,238.14 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:239.19,240.14 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:241.31,242.67 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:243.15,244.66 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:251.58,254.2 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:257.47,259.2 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:263.74,264.54 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:269.2,269.44 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:273.2,273.77 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:264.54,266.3 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:269.44,271.3 1 0 -github.com/ethereum/go-ethereum/crypto/crypto.go:276.56,279.2 2 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:281.30,282.23 1 1 -github.com/ethereum/go-ethereum/crypto/crypto.go:282.23,284.3 1 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:32.50,34.2 1 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:37.59,39.16 2 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:43.2,44.57 2 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:39.16,41.3 1 0 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:55.77,56.37 1 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:59.2,61.43 3 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:56.37,58.3 1 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:67.65,69.2 1 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:72.64,74.14 2 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:77.2,77.57 1 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:74.14,76.3 1 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:81.53,83.2 1 1 -github.com/ethereum/go-ethereum/crypto/signature_cgo.go:86.28,88.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:43.77,59.46 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:64.2,64.39 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:70.2,70.86 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:76.2,76.22 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:59.46,61.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:61.8,63.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:64.39,66.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:70.86,75.3 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:82.78,104.12 6 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:112.2,114.9 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:119.2,119.39 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:124.2,124.86 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:128.2,128.22 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:104.12,107.3 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:107.8,107.21 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:107.21,109.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:109.8,111.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:114.9,116.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:116.8,118.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:119.39,121.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:124.86,127.3 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:134.104,138.58 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:138.58,149.47 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:152.3,153.11 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:159.3,159.13 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:163.3,170.11 7 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:176.3,176.36 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:181.3,182.34 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:189.3,189.19 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:149.47,151.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:153.11,156.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:156.9,158.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:159.13,161.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:170.11,172.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:172.9,174.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:176.36,178.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:182.34,183.93 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/difficulty.go:183.93,187.5 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:60.13,67.2 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:71.28,74.2 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:77.79,79.16 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:82.2,83.16 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:87.2,87.34 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:94.2,94.10 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:101.2,101.48 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:79.16,81.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:83.16,86.3 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:87.34,88.25 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:88.25,92.4 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:94.10,95.36 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:95.36,99.4 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:105.76,108.11 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:111.2,112.16 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:116.2,121.23 6 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:108.11,110.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:112.16,114.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:127.136,129.62 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:133.2,136.16 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:139.2,139.77 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:145.2,146.16 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:151.2,156.36 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:159.2,159.37 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:162.2,162.46 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:165.2,165.30 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:129.62,131.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:136.16,138.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:139.77,143.3 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:146.16,150.3 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:156.36,158.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:159.37,161.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:162.46,164.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:182.81,183.19 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:186.2,186.70 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:189.2,189.49 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:183.19,185.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:186.70,188.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:195.62,201.9 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:211.2,211.48 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:217.2,217.21 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:201.9,202.44 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:208.3,208.29 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:202.44,204.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:204.9,207.4 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:211.48,216.3 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:231.41,233.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:236.71,237.19 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:237.19,240.11 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:244.3,244.16 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:250.3,251.24 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:254.3,264.17 6 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:268.3,271.95 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:272.3,272.17 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:279.3,279.49 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:240.11,242.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:244.16,248.4 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:251.24,253.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:264.17,267.4 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:271.95,271.135 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:272.17,277.4 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:279.49,283.4 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:288.29,289.19 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:289.19,293.3 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:308.43,310.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:313.73,314.19 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:314.19,321.11 5 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:326.3,326.16 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:336.3,337.24 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:340.3,350.17 6 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:354.3,360.98 4 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:361.3,361.17 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:368.3,368.49 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:321.11,324.4 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:326.16,334.4 5 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:337.24,339.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:350.17,353.4 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:360.98,360.141 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:361.17,366.4 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:368.49,372.4 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:379.36,381.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:384.31,385.19 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:385.19,389.3 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:393.42,396.2 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:399.44,402.2 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:461.65,462.23 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:465.2,465.29 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:469.2,469.54 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:472.2,472.58 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:475.2,482.34 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:485.2,486.15 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:462.23,464.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:465.29,468.3 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:469.54,471.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:472.58,474.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:482.34,484.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:491.56,493.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:498.25,505.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:510.41,518.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:523.50,531.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:535.29,542.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:546.26,548.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:551.37,553.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:556.48,557.29 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:565.2,565.12 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:557.29,559.27 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:562.3,563.25 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:559.27,561.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:571.50,580.20 5 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:584.2,584.16 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:580.20,583.3 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:593.66,600.35 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:618.2,618.16 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:600.35,601.13 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:601.13,604.22 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:604.22,607.5 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:609.8,613.21 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:613.21,616.4 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:623.37,628.2 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:635.47,640.26 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:645.2,646.9 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:640.26,643.3 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:647.35,647.35 0 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:648.10,648.10 0 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:656.42,658.78 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:661.2,663.9 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:671.2,671.49 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:658.78,660.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:664.40,664.40 0 1 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:665.30,667.33 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:675.73,692.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/ethash.go:696.36,698.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/mmap_help_other.go:30.47,36.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:51.140,53.80 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:64.2,64.26 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:68.2,72.24 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:80.2,81.18 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:84.2,84.17 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:88.2,88.26 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:91.2,95.31 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:103.2,103.12 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:127.2,127.12 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:53.80,56.10 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:61.3,61.13 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:57.42,57.42 0 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:58.11,59.126 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:64.26,66.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:72.24,74.17 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:78.3,78.55 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:74.17,77.4 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:81.18,83.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:84.17,86.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:88.26,90.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:95.31,97.33 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:97.33,100.4 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:103.12,105.10 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:125.3,125.14 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:106.15,108.16 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:109.26,111.11 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:116.4,116.16 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:117.24,120.67 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:112.27,112.27 0 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:113.12,114.128 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:120.67,122.5 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:132.115,150.6 5 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:187.2,187.28 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:150.6,151.10 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:152.16,156.16 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:158.11,161.35 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:166.4,167.51 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:182.4,182.11 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:161.35,164.5 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:167.51,174.12 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:180.5,180.17 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:175.42,176.93 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:177.18,178.94 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:245.84,265.2 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:267.31,268.15 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:275.2,278.6 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:268.15,273.3 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:278.6,279.10 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:280.27,285.18 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:287.32,289.29 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:295.35,297.65 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:303.35,306.22 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:308.31,311.33 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:315.4,315.16 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:317.19,319.34 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:325.4,325.29 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:333.24,334.10 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:289.29,291.5 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:291.10,293.5 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:297.65,299.5 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:299.10,301.5 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:311.33,314.5 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:319.34,320.47 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:320.47,322.6 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:325.29,326.38 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:326.38,327.72 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:327.72,329.7 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:346.53,356.2 7 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:360.37,366.32 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:372.2,373.35 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:366.32,368.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:368.8,370.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:373.35,375.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:378.103,382.16 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:386.2,392.16 6 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:382.16,385.3 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:392.16,394.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:394.8,397.3 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:403.109,404.27 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:409.2,410.18 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:415.2,420.17 5 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:427.2,427.22 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:431.2,437.70 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:448.2,449.14 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:404.27,407.3 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:410.18,413.3 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:420.17,421.64 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:421.64,424.4 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:427.22,430.3 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:437.70,438.10 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:439.30,441.15 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/sealer.go:442.11,444.16 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:53.37,55.22 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:58.2,58.29 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:55.22,57.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:64.38,66.65 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:69.2,69.13 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:66.65,68.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:74.39,76.22 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:79.2,79.31 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:76.22,78.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:85.40,87.64 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:90.2,90.13 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:87.64,89.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:100.37,108.9 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:111.2,112.40 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:108.9,109.42 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:112.40,116.3 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:121.36,123.25 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:126.2,127.46 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:130.2,130.13 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:123.25,125.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:127.46,129.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:139.62,144.15 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:154.2,171.12 12 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:182.2,186.70 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:191.2,193.35 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:207.2,207.23 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:144.15,148.30 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:151.3,151.90 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:148.30,150.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:171.12,172.7 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:172.7,173.11 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:174.16,175.11 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:176.39,177.186 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:186.70,189.3 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:193.35,194.29 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:194.29,204.4 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:207.23,209.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:213.26,214.38 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:214.38,216.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:223.30,225.2 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:228.43,229.32 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:229.32,231.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:236.81,244.33 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:247.2,251.35 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:255.2,255.46 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:260.2,260.29 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:263.2,264.12 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:244.33,246.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:251.35,253.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:255.46,258.3 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:260.29,262.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:269.67,274.15 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:285.2,303.31 13 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:333.2,333.13 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:274.15,278.30 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:281.3,281.90 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:278.30,280.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:303.31,304.19 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:304.19,314.30 6 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:318.4,319.47 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:314.30,316.5 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:319.47,321.16 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:324.5,326.70 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:321.16,323.6 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:326.70,328.6 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:338.109,352.32 8 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:356.2,358.36 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:366.2,366.35 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:369.2,372.26 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:375.2,375.58 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:352.32,354.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:358.36,360.51 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:363.3,363.21 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:360.51,362.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:366.35,368.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:372.26,374.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:381.94,384.40 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:393.2,393.45 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:384.40,388.34 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:391.3,391.14 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:388.34,390.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:399.82,400.40 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:404.2,404.63 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/algorithm.go:400.40,403.3 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:41.46,42.30 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:46.2,50.9 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:55.2,55.9 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:42.30,44.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:51.75,51.75 0 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:52.34,53.39 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:56.24,57.19 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:58.21,59.26 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:66.83,67.30 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:71.2,72.9 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:82.2,83.19 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:67.30,69.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:78.4,78.4 0 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:79.34,80.15 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:92.74,93.30 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:97.2,98.9 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:105.2,106.13 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:93.30,95.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:99.91,99.91 0 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:100.34,101.15 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/api.go:110.38,112.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:94.76,96.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:100.110,102.43 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:106.2,107.51 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:110.2,111.19 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:115.2,115.83 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:102.43,104.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:107.51,109.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:111.19,113.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:121.143,123.64 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:132.2,133.28 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:138.2,145.31 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:154.2,155.12 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:181.2,181.25 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:123.64,125.37 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:128.3,128.24 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:125.37,127.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:133.28,135.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:145.31,146.13 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:146.13,147.30 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:147.30,150.5 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:155.12,162.7 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:162.7,163.11 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:164.22,165.33 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:169.25,170.52 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:176.17,177.11 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:165.33,168.6 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:170.52,172.31 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:172.31,174.7 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:184.148,186.16 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:191.2,191.19 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:194.2,194.89 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:186.16,188.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:188.8,188.65 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:188.65,190.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:191.19,193.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:199.91,201.43 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:205.2,205.37 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:208.2,208.30 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:212.2,215.25 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:234.2,238.39 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:257.2,257.12 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:201.43,203.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:205.37,207.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:208.30,210.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:215.25,217.28 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:220.3,222.55 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:232.3,232.55 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:217.28,218.9 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:222.55,225.23 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:228.4,228.44 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:225.23,226.10 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:228.44,230.5 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:238.39,241.28 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:244.3,247.29 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:250.3,250.83 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:253.3,253.119 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:241.28,243.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:247.29,249.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:250.83,252.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:253.119,255.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:263.145,265.61 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:269.2,269.12 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:274.2,274.32 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:278.2,280.42 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:284.2,284.42 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:288.2,288.38 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:292.2,292.45 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:305.2,305.90 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:309.2,309.10 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:315.2,315.78 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:318.2,318.77 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:321.2,321.12 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:265.61,267.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:269.12,270.66 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:270.66,272.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:274.32,276.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:280.42,282.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:284.42,286.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:288.38,290.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:292.45,294.28 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:297.3,297.79 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:294.28,296.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:297.79,299.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:300.8,300.88 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:300.88,303.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:305.90,307.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:309.10,310.65 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:310.65,312.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:315.78,317.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:318.77,320.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:327.117,329.2 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:334.93,336.9 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:337.35,338.45 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:339.29,340.45 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:341.34,342.45 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:343.37,344.52 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:345.32,346.47 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:347.32,348.47 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:349.10,350.46 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:367.100,371.58 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:371.58,388.47 7 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:394.3,394.28 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:398.3,403.42 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:408.3,409.50 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:413.3,418.32 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:423.3,423.11 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:388.47,390.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:390.9,392.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:394.28,396.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:403.42,405.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:409.50,411.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:418.32,422.4 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:430.74,450.27 8 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:454.2,459.41 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:463.2,468.31 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:473.2,473.10 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:450.27,452.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:459.41,461.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:468.31,472.3 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:479.73,488.71 7 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:493.2,493.44 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:497.2,499.31 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:506.2,506.13 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:488.71,490.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:490.8,492.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:493.44,495.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:499.31,505.3 4 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:517.111,519.80 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:527.2,527.26 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:531.2,531.35 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:535.2,542.13 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:556.2,556.14 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:570.2,570.47 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:573.2,574.51 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:577.2,577.12 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:519.80,521.48 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:524.3,524.13 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:521.48,523.4 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:527.26,529.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:531.35,533.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:542.13,544.26 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:544.26,550.4 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:550.9,553.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:556.14,560.40 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:563.3,567.27 2 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:560.40,562.4 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:570.47,572.3 1 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:574.51,576.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:582.94,584.19 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:587.2,588.12 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:584.19,586.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:593.161,597.2 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:601.221,607.2 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:610.73,628.27 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:631.2,633.13 3 1 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:628.27,630.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:645.120,648.39 2 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:651.2,651.44 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:655.2,657.31 3 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:667.2,667.43 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:648.39,650.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:651.44,653.3 1 0 -github.com/ethereum/go-ethereum/consensus/ethash/consensus.go:657.31,666.3 7 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:28.80,32.31 3 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:43.2,43.21 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:32.31,34.21 2 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:37.3,37.20 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:41.3,41.36 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:34.21,36.4 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:37.20,40.4 2 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:46.87,53.35 6 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:172.2,179.18 8 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_generic.go:53.35,171.3 113 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b_ref.go:10.80,12.2 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:50.51,51.21 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:54.2,54.38 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:59.2,59.33 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:62.2,71.15 4 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:51.21,53.3 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:54.38,58.3 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:59.33,61.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:84.50,85.16 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:88.2,88.21 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:85.16,86.44 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:91.27,94.2 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:96.23,106.45 8 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:109.2,110.20 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:106.45,108.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:113.49,114.17 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:119.2,119.22 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:123.2,124.29 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:129.2,129.18 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:142.2,142.21 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:155.2,155.30 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:169.2,169.8 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:114.17,117.3 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:119.22,121.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:124.29,127.3 2 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:129.18,131.25 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:136.3,139.40 4 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:131.25,135.4 3 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:142.21,153.3 8 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:155.30,156.33 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:159.3,167.30 7 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:156.33,158.4 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:172.46,174.21 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2x.go:174.21,176.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/register.go:15.13,16.33 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/register.go:20.2,20.33 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/register.go:25.2,25.33 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/register.go:30.2,32.53 3 1 -github.com/ethereum/go-ethereum/crypto/blake2b/register.go:16.33,19.3 2 0 -github.com/ethereum/go-ethereum/crypto/blake2b/register.go:20.33,23.3 2 0 -github.com/ethereum/go-ethereum/crypto/blake2b/register.go:25.33,28.3 2 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:53.37,57.2 3 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:60.40,66.2 5 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:69.40,75.2 5 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:79.44,79.75 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:83.44,83.78 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:87.44,87.78 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:97.51,97.82 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:103.76,105.11 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:108.2,108.44 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:105.11,107.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:111.59,112.37 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:115.2,115.21 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:118.2,124.15 4 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:112.37,114.3 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:115.21,117.3 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:127.59,132.45 4 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:141.2,144.22 4 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:147.2,151.39 3 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:132.45,134.18 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:137.3,138.18 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:134.18,136.4 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:144.22,146.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:151.39,153.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:156.73,160.31 3 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:171.2,171.21 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:160.31,162.21 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:165.3,165.20 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:169.3,169.29 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:162.21,164.4 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:165.20,168.4 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:190.50,191.19 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:194.2,196.25 3 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:199.2,205.15 6 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:191.19,193.3 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:196.25,198.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:208.50,209.60 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:212.2,212.29 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:215.2,216.25 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:219.2,226.12 8 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:209.60,211.3 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:212.29,214.3 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:216.25,218.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:229.34,229.54 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:231.29,231.46 1 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:233.26,237.18 4 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:237.18,240.3 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:243.53,246.18 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:258.2,258.42 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:267.2,267.16 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:271.2,271.8 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:246.18,248.21 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:252.3,255.20 4 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:248.21,251.4 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:258.42,260.19 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:263.3,264.13 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:260.19,262.4 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:267.16,269.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:274.41,278.2 3 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:280.45,286.22 5 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:289.2,294.22 4 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:286.22,288.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:294.22,296.3 1 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:299.46,303.2 3 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:305.46,309.2 3 0 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:311.47,314.2 2 1 -github.com/ethereum/go-ethereum/crypto/blake2b/blake2b.go:316.47,319.2 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:44.52,49.25 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:55.2,58.25 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:69.2,71.12 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:49.25,52.3 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:58.25,61.26 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:66.3,67.67 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:61.26,64.4 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:74.51,78.31 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:78.31,79.36 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:79.36,80.21 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:80.21,82.5 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:87.50,91.27 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:97.2,98.27 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:104.2,104.12 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:91.27,92.26 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:92.26,94.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:98.27,99.31 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:99.31,101.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:108.33,112.22 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/lattice.go:112.22,114.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:28.51,29.6 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:29.6,31.33 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:31.33,33.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:44.51,46.16 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:50.2,50.42 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:46.16,48.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:53.30,55.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:59.45,60.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:63.2,64.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:60.16,62.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:68.48,69.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:72.2,73.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:69.16,71.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:77.32,78.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:81.2,82.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:78.16,80.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:86.29,87.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:90.2,91.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:87.16,89.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:95.29,96.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:99.2,100.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:96.16,98.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:104.31,108.16 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:112.2,114.22 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:117.2,124.12 6 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:108.16,110.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:114.22,116.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:129.50,132.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:136.2,136.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:141.2,142.42 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:145.2,145.53 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:149.2,153.36 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:166.2,166.28 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:132.25,134.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:136.16,138.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:138.8,140.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:142.42,144.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:145.53,147.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:153.36,158.3 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:158.8,162.23 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:162.23,164.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:176.51,178.16 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:182.2,182.42 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:178.16,180.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:185.30,187.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:191.45,192.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:195.2,196.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:192.16,194.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:200.48,201.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:204.2,205.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:201.16,203.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:209.32,210.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:213.2,214.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:210.16,212.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:218.29,219.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:222.2,223.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:219.16,221.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:227.29,228.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:231.2,232.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:228.16,230.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:236.31,240.16 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:244.2,246.22 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:249.2,260.12 10 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:240.16,242.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:246.22,248.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:265.50,268.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:272.2,272.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:275.2,276.44 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:279.2,279.55 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:282.2,282.57 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:285.2,285.57 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:289.2,294.38 5 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:307.2,307.28 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:268.25,270.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:272.16,274.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:276.44,278.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:279.55,281.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:282.57,284.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:285.57,287.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:294.38,299.3 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:299.8,303.23 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:303.23,305.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:317.31,319.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:322.42,326.30 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:332.2,332.41 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:326.30,327.49 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:330.3,330.39 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:327.49,328.12 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:338.33,340.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:342.30,344.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:347.48,348.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:351.2,352.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:348.16,350.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:356.32,357.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:360.2,361.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:357.16,359.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:365.29,366.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:369.2,370.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:366.16,368.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:374.29,375.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:378.2,379.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:375.16,377.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:383.29,387.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:390.31,394.16 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:399.2,427.12 27 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:394.16,397.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:432.50,436.26 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:440.2,440.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:444.2,445.46 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:448.2,448.57 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:451.2,451.59 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:454.2,454.59 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:457.2,457.59 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:460.2,460.59 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:463.2,463.59 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:466.2,466.59 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:469.2,469.59 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:472.2,472.59 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:475.2,475.60 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:478.2,478.60 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:481.2,494.29 13 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:436.26,438.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:440.16,442.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:445.46,447.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:448.57,450.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:451.59,453.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:454.59,456.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:457.59,459.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:460.59,462.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:463.59,465.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:466.59,468.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:469.59,471.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:472.59,474.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:475.60,477.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/bn256.go:478.60,480.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/constants.go:11.39,14.2 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:23.38,29.2 5 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:31.41,36.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:39.39,41.20 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:45.2,51.19 6 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:41.20,43.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:54.36,59.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:61.40,63.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:65.44,66.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:70.2,70.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:80.2,117.22 23 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:121.2,149.21 19 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:66.20,69.3 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:70.20,73.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:117.22,120.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:152.44,183.2 24 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:185.58,198.45 10 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:206.2,206.12 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:198.45,200.26 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:200.26,202.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:202.9,204.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:209.35,210.23 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:219.2,230.18 9 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:210.23,212.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:212.8,212.30 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:212.30,217.3 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/curve.go:233.41,238.2 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:10.33,11.12 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:18.2,19.12 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:11.12,13.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:13.8,16.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:22.31,24.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:26.27,31.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:33.30,40.34 5 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:49.2,50.12 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:40.34,41.39 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:41.39,42.32 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:45.4,45.31 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:42.32,44.5 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:53.35,54.31 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:54.31,55.32 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:55.32,57.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:61.42,63.31 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:70.2,70.26 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:78.2,78.55 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:63.31,65.32 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:65.32,67.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:70.26,71.19 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:74.3,74.19 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:71.19,73.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:74.19,76.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:81.28,81.48 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp.go:82.28,82.53 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:17.33,19.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:21.38,25.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:27.34,31.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:33.33,37.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:39.31,41.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:43.30,45.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:47.44,51.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:53.38,57.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:60.44,65.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:68.46,73.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:75.46,80.2 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:82.41,86.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:88.41,92.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:94.41,105.2 8 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:107.53,111.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:113.54,117.43 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:126.2,127.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:117.43,119.24 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:119.24,121.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:121.9,123.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:130.41,144.2 10 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp12.go:146.41,160.2 9 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:13.33,18.2 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:20.32,22.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:24.35,28.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:30.32,34.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:36.31,40.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:42.30,45.2 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:47.29,50.2 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:52.41,56.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:58.35,62.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:64.38,68.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:70.38,74.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:78.38,92.2 11 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:94.49,98.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:101.37,122.2 15 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:124.38,138.2 9 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp2.go:140.38,156.2 10 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:3.99,50.2 29 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:52.89,92.2 26 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:94.41,112.2 14 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:122.50,141.45 13 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:178.2,206.12 19 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:141.45,143.31 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:147.3,150.28 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:159.3,160.11 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:143.31,145.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:151.10,152.60 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:153.11,154.59 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:155.11,156.12 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:212.44,261.2 36 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:263.54,267.38 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:270.2,270.12 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/optate.go:267.38,269.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:33.38,37.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:39.41,44.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:47.39,49.20 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:53.2,57.16 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:60.2,62.24 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:49.20,51.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:57.16,59.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:65.36,70.2 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:72.40,74.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:76.44,79.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:83.2,83.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:89.2,109.22 16 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:113.2,132.16 16 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:79.20,82.3 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:83.20,86.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:109.22,112.3 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:135.44,162.2 21 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:164.58,167.40 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:176.2,176.12 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:167.40,169.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:169.25,171.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:171.9,173.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:179.35,180.17 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:189.2,196.14 8 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:180.17,182.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:182.8,182.25 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:182.25,187.3 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/twist.go:199.41,204.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:13.32,15.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:17.35,22.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:24.32,29.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:31.31,36.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:38.30,40.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:42.29,44.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:46.35,51.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:53.41,61.2 6 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:64.43,71.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:73.43,78.2 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:80.38,85.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:87.38,92.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:94.38,122.2 20 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:124.50,129.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:131.46,136.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:139.38,147.2 6 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:149.38,169.2 15 1 -github.com/ethereum/go-ethereum/crypto/bn256/cloudflare/gfp6.go:171.38,213.2 22 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:62.54,64.2 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:67.57,74.2 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:83.56,87.2 3 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:90.53,93.2 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:97.106,99.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:102.2,107.19 6 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:110.2,111.8 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:99.16,101.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:107.19,109.3 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:116.45,118.2 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:121.97,122.38 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:125.2,125.44 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:129.2,130.14 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:134.2,137.16 4 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:122.38,124.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:125.44,127.3 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:130.14,132.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:146.64,149.54 3 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:157.2,157.18 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:149.54,156.3 6 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:161.39,163.2 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:166.75,174.2 7 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:178.71,184.2 5 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:187.77,191.2 3 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:194.92,196.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:200.2,201.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:204.2,209.8 5 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:196.16,198.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:201.16,203.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:214.76,216.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:220.2,224.8 4 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:216.16,218.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:232.87,234.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:238.2,239.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:243.2,244.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:248.2,252.47 4 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:256.2,263.16 7 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:234.16,236.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:239.16,241.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:244.16,246.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:252.47,254.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:267.72,268.17 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:271.2,272.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:276.2,285.14 3 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:295.2,301.16 6 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:305.2,306.16 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:309.2,312.50 3 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:316.2,316.47 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:268.17,270.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:272.16,274.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:286.15,288.33 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:291.10,292.34 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:288.33,290.4 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:301.16,303.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:306.16,308.3 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/ecies.go:312.50,314.3 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/params.go:123.67,125.2 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/params.go:129.66,131.2 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/params.go:133.57,135.19 2 1 -github.com/ethereum/go-ethereum/crypto/ecies/params.go:140.2,140.31 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/params.go:143.2,143.20 1 1 -github.com/ethereum/go-ethereum/crypto/ecies/params.go:135.19,136.57 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/params.go:136.57,138.4 1 0 -github.com/ethereum/go-ethereum/crypto/ecies/params.go:140.31,142.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:42.39,45.15 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:48.2,51.25 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:58.2,58.11 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:45.15,47.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:51.25,57.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:61.38,63.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:65.48,66.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:69.2,70.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:73.2,73.32 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:66.19,68.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:70.16,72.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:76.32,84.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:86.30,89.25 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:100.2,100.12 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:89.25,99.3 9 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:103.30,105.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:107.35,108.26 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:111.2,111.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:108.26,110.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:114.26,122.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:124.25,126.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:128.46,130.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:133.2,133.27 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:130.16,132.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:136.30,138.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:140.28,143.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:145.29,148.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:150.29,152.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:154.28,156.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:158.32,159.26 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:166.2,166.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:159.26,160.21 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:160.21,162.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:162.9,162.28 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:162.28,164.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:169.35,171.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:173.26,177.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:179.30,186.2 6 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:188.29,197.2 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:199.27,203.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:205.26,209.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:211.33,215.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:217.47,219.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:222.2,223.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:226.2,226.28 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:219.16,221.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:223.16,225.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:229.28,231.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:233.29,235.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:237.35,239.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:241.27,243.20 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:247.2,248.20 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:243.20,246.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:251.27,256.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:258.26,263.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:265.33,270.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:272.47,274.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:277.2,278.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:281.2,282.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:285.2,285.33 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:274.16,276.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:278.16,280.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:282.16,284.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:288.28,290.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:292.29,294.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:296.35,298.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:300.29,304.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:306.28,310.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:312.36,316.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:318.49,320.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:323.2,324.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:327.2,327.29 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:320.16,322.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:324.16,326.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:330.29,332.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:334.30,336.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/field_element.go:338.37,340.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:32.27,34.30 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:37.2,37.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:34.30,36.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:40.20,43.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:45.50,46.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:49.2,50.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:53.2,54.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:57.2,57.28 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:46.19,48.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:50.16,52.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:54.16,56.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:60.38,65.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:67.26,69.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:71.27,73.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:75.26,77.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:79.33,82.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:84.36,87.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:89.34,92.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:94.33,97.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:99.36,102.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:104.34,107.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:109.33,112.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:114.36,117.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:119.30,122.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:124.33,134.2 9 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:136.36,146.2 9 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:148.33,155.2 6 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:157.36,164.2 6 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:166.42,171.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:173.33,181.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:183.34,192.2 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:194.41,197.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:199.42,201.39 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:207.2,207.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:201.39,203.20 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:203.20,205.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:210.51,212.18 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:216.2,216.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:212.18,215.3 2 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:219.54,220.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:220.18,223.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:226.36,233.31 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:238.2,242.23 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:233.31,237.3 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp2.go:245.50,252.2 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:21.33,24.25 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:27.2,36.8 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:39.2,52.8 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:59.2,61.26 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:64.2,64.13 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:24.25,26.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:36.8,38.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:52.8,55.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:55.8,58.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:61.26,63.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:69.44,70.14 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:73.2,75.25 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:78.2,86.8 9 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:89.2,102.8 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:109.2,111.26 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:114.2,114.13 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:70.14,72.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:75.25,77.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:86.8,88.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:102.8,105.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:105.8,108.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/swu.go:111.26,113.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:35.29,38.31 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:41.2,41.31 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:44.2,44.34 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:38.31,40.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:41.31,43.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:47.30,49.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:52.2,52.22 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:49.16,51.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:55.27,57.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:59.52,60.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:63.2,65.16 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:68.2,69.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:72.2,72.29 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:60.20,62.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:65.16,67.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:69.16,71.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:75.40,81.2 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:83.28,85.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:87.29,89.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:91.28,93.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:95.35,100.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:102.35,106.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:108.35,113.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:115.32,119.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:121.38,125.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:127.35,138.2 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:140.45,164.2 23 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:166.35,178.2 11 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:180.38,192.2 11 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:194.47,204.2 9 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:206.36,216.2 9 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:218.57,229.2 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:231.44,233.39 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:239.2,239.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:233.39,235.20 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:235.20,237.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:242.54,244.39 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:250.2,250.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:244.39,246.20 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:246.20,248.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:253.53,257.15 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:258.9,259.9 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:260.9,261.24 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:262.10,263.62 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:267.56,271.15 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:272.9,273.9 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:274.9,275.24 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp12.go:276.10,277.62 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:33.27,35.30 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:38.2,38.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:35.30,37.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:41.26,43.14 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:46.2,46.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:43.14,45.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:49.49,50.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:53.2,55.16 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:58.2,59.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:62.2,63.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:66.2,66.33 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:50.18,52.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:55.16,57.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:59.16,61.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:63.16,65.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:69.38,76.2 6 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:78.26,80.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:82.27,84.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:86.26,88.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:90.33,95.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:97.36,102.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:104.33,109.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:111.36,116.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:118.33,123.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:125.36,130.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:132.30,137.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:139.33,165.2 25 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:167.36,193.2 25 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:195.33,214.2 18 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:216.50,234.2 17 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:236.47,254.2 17 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:256.42,262.2 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:264.42,270.2 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:272.49,277.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:279.42,281.39 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:287.2,287.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:281.39,283.20 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:283.20,285.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:290.34,313.2 22 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:315.51,320.19 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:321.9,322.9 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:323.9,326.24 3 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:327.10,329.53 2 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:333.54,339.19 6 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:340.9,341.9 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:342.9,346.24 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp6.go:347.10,349.52 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:32.27,34.2 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:37.22,40.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:43.26,45.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:48.31,50.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:53.18,56.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:59.27,61.2 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:65.47,67.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:70.2,70.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:73.2,73.15 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:67.16,69.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:70.19,72.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:77.35,79.2 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:82.33,86.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:89.23,91.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:94.30,96.2 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:99.30,101.2 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:104.30,106.2 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:109.30,111.2 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:114.39,116.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/gt.go:119.31,121.2 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:20.29,29.35 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:39.2,45.13 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:29.35,38.3 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:49.38,50.14 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:54.2,60.35 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:70.2,76.13 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:50.14,52.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/isogeny.go:60.35,69.3 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:24.40,26.19 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:29.2,30.19 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:33.2,34.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:26.19,28.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:30.19,32.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:37.40,39.19 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:42.2,43.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:39.19,41.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:46.41,48.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:51.2,51.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:54.2,55.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:48.16,50.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:51.19,53.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:58.28,62.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:64.28,68.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:70.33,74.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:76.23,78.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:80.25,82.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:84.32,86.35 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:92.2,92.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:86.35,88.20 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:88.20,90.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:95.26,96.16 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:100.2,108.27 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:133.2,133.12 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:138.2,138.28 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:143.2,143.36 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:146.2,150.29 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:153.2,153.12 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:96.16,99.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:108.27,109.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:113.3,113.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:130.3,130.9 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:109.17,111.9 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:113.17,116.4 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:116.9,116.24 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:116.24,119.4 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:119.9,119.27 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:119.27,124.4 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:124.9,129.4 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:133.12,136.3 2 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:138.28,141.3 2 0 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:143.36,145.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:150.29,152.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:156.26,161.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/fp.go:163.43,167.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:31.45,36.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:39.35,45.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:58.18,60.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:62.24,63.14 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:66.2,67.18 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:63.14,65.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:70.25,72.25 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:75.2,75.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:72.25,74.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:79.27,81.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:83.62,85.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:88.2,89.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:92.2,93.37 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:85.16,87.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:89.16,91.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:101.53,102.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:105.2,106.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:109.2,110.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:114.2,114.32 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:117.2,119.21 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:122.2,122.15 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:102.20,104.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:106.16,108.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:110.16,112.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:114.32,116.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:119.21,121.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:126.55,127.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:130.2,132.16 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:135.2,136.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:139.2,140.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:143.2,144.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:147.2,151.32 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:127.20,129.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:132.16,134.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:136.16,138.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:140.16,142.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:144.16,146.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:157.41,159.17 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:162.2,165.12 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:159.17,161.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:169.45,180.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:183.29,185.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:188.30,190.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:193.29,196.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:199.38,201.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:204.42,205.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:208.2,208.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:211.2,220.45 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:205.18,207.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:208.18,210.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:224.49,228.2 3 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:231.41,232.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:235.2,244.25 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:232.17,234.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:248.40,250.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:253.42,254.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:257.2,257.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:266.2,266.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:254.17,256.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:257.20,265.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:270.47,272.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:275.2,275.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:278.2,287.22 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:293.2,314.10 22 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:272.18,274.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:275.18,277.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:287.22,288.23 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:291.3,291.18 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:288.23,290.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:318.45,320.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:323.2,346.10 24 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:320.17,322.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:350.42,355.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:358.45,363.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:366.60,370.25 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:376.2,376.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:370.25,371.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:374.3,374.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:371.20,373.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:380.40,382.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:388.91,389.32 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:392.2,393.23 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:396.2,400.34 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:403.2,406.21 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:430.2,431.41 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:437.2,437.24 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:389.32,391.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:393.23,395.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:400.34,402.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:406.21,409.36 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:412.3,412.36 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:420.3,421.41 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:425.3,428.11 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:409.36,411.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:412.36,415.18 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:418.4,418.52 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:415.18,417.5 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:421.41,424.4 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:431.41,432.34 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:435.3,435.30 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:432.34,434.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:444.54,447.16 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:450.2,455.25 6 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g2.go:447.16,449.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:24.45,26.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:39.33,52.2 6 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:59.40,61.26 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:64.2,65.35 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:61.26,63.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:69.60,71.18 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:75.2,75.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:71.18,74.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:79.63,83.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:86.34,89.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:91.38,93.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:95.33,98.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:100.58,132.2 30 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:134.61,163.2 27 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:165.73,167.29 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:170.2,172.39 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:167.29,169.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:172.39,174.20 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:179.3,179.6 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:174.20,178.4 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:183.38,186.34 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:189.2,193.48 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:212.2,212.22 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:186.34,188.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:193.48,194.14 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:197.3,197.38 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:202.3,202.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:210.3,210.6 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:194.14,196.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:197.38,201.4 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:202.20,204.39 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:204.39,208.5 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:215.34,219.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:221.36,255.2 31 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:257.36,259.23 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:262.2,264.10 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:259.23,261.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:268.31,270.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:273.30,277.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/pairing.go:280.27,282.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:43.23,55.361 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:55.361,63.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:66.26,78.361 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:78.361,86.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:89.24,97.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:99.27,107.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:109.23,121.361 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:121.361,129.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:132.26,144.361 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:144.361,152.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:155.24,164.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:166.23,174.12 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:174.12,182.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:185.26,193.12 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:193.12,201.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:204.27,212.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:214.24,215.16 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:219.2,225.57 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:215.16,218.3 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:228.23,231.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:336.2,336.361 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:231.2,247.3 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:248.2,264.3 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:265.2,281.3 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:282.2,298.3 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:299.2,315.3 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:316.2,332.3 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:336.361,344.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:347.23,352.2 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:440.2,440.361 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:352.2,368.3 14 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:369.2,384.3 13 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:385.2,399.3 12 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:400.2,413.3 11 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:414.2,425.3 9 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:426.2,436.3 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:440.361,448.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:468.58,475.2 6 0 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:478.40,484.2 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:487.51,493.2 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:496.54,504.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:507.60,520.2 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:522.57,532.2 8 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:534.58,546.2 9 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:548.55,557.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/arithmetic_fallback.go:559.57,567.2 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:30.45,35.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:38.35,43.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:55.18,58.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:60.25,62.25 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:65.2,65.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:62.25,64.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:69.27,71.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:73.62,75.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:78.2,79.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:82.2,83.37 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:75.16,77.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:79.16,81.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:91.53,92.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:95.2,96.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:99.2,100.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:104.2,104.32 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:107.2,109.21 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:112.2,112.15 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:92.19,94.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:96.16,98.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:100.16,102.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:104.32,106.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:109.21,111.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:116.55,117.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:120.2,123.16 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:127.2,128.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:131.2,133.32 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:117.20,119.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:123.16,125.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:128.16,130.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:139.41,141.17 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:144.2,147.12 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:141.17,143.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:151.45,159.2 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:162.29,164.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:167.30,169.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:172.29,175.2 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:178.38,180.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:183.42,184.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:187.2,187.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:190.2,199.45 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:184.18,186.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:187.18,189.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:203.49,207.2 3 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:210.41,211.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:214.2,223.25 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:211.17,213.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:227.40,229.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:232.42,233.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:236.2,236.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:245.2,245.10 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:233.17,235.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:236.20,244.3 7 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:249.47,251.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:254.2,254.18 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:257.2,266.22 10 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:272.2,293.10 22 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:251.18,253.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:254.18,256.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:266.22,267.23 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:270.3,270.18 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:267.23,269.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:297.45,299.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:302.2,325.10 24 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:299.17,301.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:329.42,334.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:337.45,342.2 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:345.60,349.25 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:355.2,355.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:349.25,350.20 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:353.3,353.17 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:350.20,352.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:359.40,361.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:367.91,368.32 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:371.2,372.23 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:375.2,379.34 5 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:382.2,385.21 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:409.2,410.41 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:416.2,416.24 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:368.32,370.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:372.23,374.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:379.34,381.3 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:385.21,388.36 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:391.3,391.36 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:399.3,400.41 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:404.3,407.11 4 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:388.36,390.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:391.36,394.18 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:397.4,397.52 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:394.18,396.5 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:400.41,403.4 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:410.41,411.34 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:414.3,414.30 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:411.34,413.4 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:423.54,425.16 2 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:428.2,433.25 6 1 -github.com/ethereum/go-ethereum/crypto/bls12381/g1.go:425.16,427.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:26.38,28.2 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:32.52,33.19 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:37.2,37.26 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:42.2,44.17 3 1 -github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:33.19,35.3 1 0 -github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:37.26,38.26 1 1 -github.com/ethereum/go-ethereum/crypto/bls12381/utils.go:38.26,40.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:43.46,50.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:52.38,54.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:56.40,61.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:63.41,68.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:71.39,80.42 8 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:83.2,85.24 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:80.42,82.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:88.36,90.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:92.40,94.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:96.58,99.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:103.2,103.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:109.2,129.22 16 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:133.2,167.14 30 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:99.20,102.3 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:103.20,106.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:129.22,132.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:170.58,206.2 29 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:208.84,213.40 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:222.2,225.10 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:213.40,215.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:215.25,217.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:217.9,219.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:230.59,231.17 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:234.2,234.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:241.2,254.10 12 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:231.17,233.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:234.20,240.3 5 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/twist.go:257.60,263.2 5 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:41.51,45.6 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:55.2,55.42 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:45.6,47.17 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:50.3,50.19 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:47.17,49.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:50.19,51.9 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:58.30,60.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:63.69,65.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:69.45,70.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:73.2,74.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:70.16,72.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:78.48,79.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:82.2,83.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:79.16,81.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:88.32,89.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:92.2,93.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:89.16,91.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:97.29,98.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:101.2,102.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:98.16,100.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:106.31,110.22 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:114.2,123.12 7 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:110.22,112.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:128.50,131.26 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:135.2,135.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:138.2,139.23 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:142.2,143.23 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:147.2,147.44 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:160.2,160.28 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:131.26,133.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:135.16,137.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:139.23,141.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:143.23,145.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:147.44,152.3 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:152.8,156.23 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:156.23,158.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:170.51,174.6 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:184.2,184.42 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:174.6,176.17 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:179.3,179.19 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:176.17,178.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:179.19,180.9 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:187.30,189.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:193.57,195.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:199.45,200.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:203.2,204.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:200.16,202.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:208.48,209.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:212.2,213.10 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:209.16,211.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:218.32,219.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:222.2,223.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:219.16,221.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:227.31,231.22 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:235.2,248.12 11 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:231.22,233.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:253.50,256.26 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:260.2,260.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:263.2,264.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:267.2,268.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:271.2,272.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:275.2,276.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:280.2,283.23 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:296.2,296.28 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:256.26,258.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:260.16,262.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:264.25,266.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:268.25,270.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:272.25,274.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:276.25,278.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:283.23,288.3 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:288.8,292.23 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:292.23,294.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:305.30,307.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:310.48,311.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:314.2,315.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:311.16,313.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:319.32,320.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:323.2,324.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:320.16,322.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:328.29,329.16 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:332.2,333.10 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:329.16,331.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:337.31,371.2 28 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:375.46,379.27 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:383.2,383.16 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:387.2,400.16 13 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:379.27,381.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:383.16,385.3 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:404.31,406.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:409.42,415.30 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:421.2,424.20 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:415.30,416.49 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:419.3,419.51 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:416.49,417.12 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:434.36,435.17 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:439.2,441.12 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:445.2,447.11 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:435.17,437.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:441.12,443.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:450.38,451.17 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:454.2,455.14 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:451.17,453.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/bn256.go:458.33,460.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/constants.go:11.39,14.2 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:28.46,35.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:37.38,40.2 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:42.40,47.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:49.41,54.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:57.39,63.37 6 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:66.2,66.23 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:63.37,65.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:69.36,71.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:73.40,75.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:77.58,78.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:82.2,82.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:92.2,131.22 26 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:135.2,180.14 36 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:78.20,81.3 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:82.20,85.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:131.22,134.3 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:183.58,226.2 36 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:228.84,233.40 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:242.2,245.10 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:233.40,235.25 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:235.25,237.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:237.9,239.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:250.59,251.59 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:254.2,254.20 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:261.2,278.10 16 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:251.59,253.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:254.20,260.3 5 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/curve.go:281.46,286.2 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:21.36,23.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:25.33,27.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:29.35,32.2 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:34.38,38.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:40.34,44.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:46.33,50.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:52.27,55.2 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:57.31,60.2 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:62.30,65.2 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:67.44,71.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:73.43,77.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:80.58,85.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:88.60,93.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:95.41,99.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:101.41,105.2 3 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:107.55,125.2 15 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:127.67,131.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:133.68,138.43 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:147.2,152.10 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:138.43,140.24 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:140.24,142.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:142.9,144.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:155.55,178.2 17 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp12.go:180.55,200.2 13 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:21.34,23.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:25.32,29.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:31.34,34.2 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:36.35,40.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:42.32,46.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:48.31,52.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:54.26,55.39 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:58.2,58.39 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:55.39,57.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:58.39,60.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:63.30,65.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:67.29,68.21 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:71.2,72.41 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:68.21,70.3 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:75.41,79.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:81.40,85.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:87.38,91.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:93.38,97.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:99.38,103.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:105.65,110.43 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:119.2,124.10 4 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:110.43,112.24 2 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:112.24,114.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:114.9,116.4 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:129.52,146.2 13 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:148.53,152.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:155.51,172.2 11 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:174.52,193.2 12 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:195.52,219.2 16 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:221.32,223.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp2.go:225.32,227.2 1 0 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:21.34,23.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:25.32,27.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:29.34,33.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:35.35,40.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:42.32,47.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:49.31,54.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:56.26,60.2 3 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:62.30,64.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:66.29,68.2 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:70.40,75.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:77.55,85.2 6 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:88.43,95.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:97.38,102.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:104.38,109.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:111.38,116.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:118.52,172.2 43 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:174.64,179.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:181.50,186.2 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:189.46,199.2 9 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:201.52,239.2 31 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/gfp6.go:241.52,296.2 33 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:7.113,83.2 56 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:85.103,152.2 51 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:154.55,182.2 23 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:192.64,213.45 15 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:258.2,302.12 34 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:213.45,215.31 2 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:219.3,226.28 7 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:235.3,240.11 6 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:215.31,217.4 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:227.10,228.66 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:229.11,230.65 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:231.11,232.12 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:308.58,386.2 64 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:388.68,393.38 4 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:396.2,396.12 1 1 -github.com/ethereum/go-ethereum/crypto/bn256/google/optate.go:393.38,395.3 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:38.98,40.16 2 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:43.2,43.25 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:46.2,46.33 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:49.2,49.55 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:40.16,42.3 1 0 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:43.25,45.3 1 0 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:46.33,48.3 1 0 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:56.110,58.52 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:61.2,61.50 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:64.2,64.28 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:67.2,67.26 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:71.2,72.16 2 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:75.2,76.16 2 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:81.2,99.52 15 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:58.52,60.3 1 0 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:61.50,63.3 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:64.28,66.3 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:67.26,69.3 1 1 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:72.16,74.3 1 0 -github.com/ethereum/go-ethereum/crypto/signify/signify.go:76.16,78.3 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:53.38,57.2 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:60.80,69.2 4 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:72.74,76.34 3 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:84.2,84.12 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:76.34,77.18 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:80.3,80.20 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:77.18,79.4 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:80.20,82.4 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:103.36,107.2 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:110.65,119.2 4 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:122.59,126.33 3 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:134.2,134.12 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:126.33,127.18 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:130.3,130.24 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:127.18,129.4 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/queue.go:130.24,132.4 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:39.62,58.2 3 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:68.55,69.62 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:72.2,76.3 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:69.62,70.59 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:89.161,91.45 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:98.2,99.18 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:124.2,124.63 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:140.2,140.91 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:150.2,154.50 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:169.2,169.45 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:183.2,183.30 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:198.2,198.46 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:91.45,94.3 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:99.18,105.20 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:112.3,112.55 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:116.3,117.85 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:120.3,120.36 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:105.20,108.4 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:112.55,115.4 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:117.85,119.4 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:124.63,130.57 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:134.3,134.69 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:130.57,133.4 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:134.69,137.4 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:140.91,142.66 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:142.66,144.4 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:145.8,149.3 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:154.50,155.57 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:159.3,160.24 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:155.57,157.4 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:160.24,163.4 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:163.9,163.109 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:163.109,166.4 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:169.45,171.23 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:175.3,175.96 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:171.23,174.4 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:175.96,178.4 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:183.30,188.17 4 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:192.3,196.47 4 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:188.17,191.4 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:203.98,209.2 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:213.144,214.43 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:217.2,218.58 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:223.2,223.49 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:233.2,233.93 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:214.43,216.3 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:218.58,221.3 2 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:223.49,224.122 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:231.3,231.56 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:224.122,230.4 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:237.101,240.17 3 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:243.2,243.18 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:240.17,242.3 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:247.103,250.16 3 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:256.2,256.82 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:267.2,268.19 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:289.2,293.21 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:297.2,297.35 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:301.2,301.85 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:306.2,307.78 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:314.2,314.54 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:318.2,319.82 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:250.16,253.3 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:256.82,260.3 3 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:268.19,276.95 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:284.3,285.62 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:276.95,279.4 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:293.21,296.3 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:297.35,300.3 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:301.85,305.3 3 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:307.78,310.3 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:314.54,317.3 2 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:323.103,333.2 8 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:336.68,340.2 3 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:344.134,347.16 3 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:350.2,350.49 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:347.16,349.3 1 1 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:354.75,355.25 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:358.2,358.12 1 0 -github.com/ethereum/go-ethereum/eth/catalyst/api.go:355.25,357.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:50.44,52.34 2 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:52.34,53.43 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:53.43,57.4 3 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:82.58,91.2 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:94.57,106.2 7 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:111.86,112.19 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:116.2,124.8 8 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:112.19,114.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:128.77,131.38 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:134.2,134.38 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:137.2,138.40 2 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:141.2,141.80 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:131.38,133.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:134.38,136.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:138.40,140.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:146.103,158.20 10 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:161.2,172.20 11 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:175.2,196.21 19 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:199.2,200.21 2 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:203.2,206.19 3 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:158.20,160.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:172.20,174.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:196.21,198.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:200.21,202.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:210.72,213.2 2 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:217.91,247.2 21 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:251.73,253.2 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:257.57,264.2 6 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:268.66,270.30 2 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:273.2,273.18 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:276.2,278.8 3 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:270.30,272.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:273.18,275.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:283.13,293.2 6 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:296.23,298.2 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/panic_cb.go:17.64,18.47 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/panic_cb.go:22.62,23.45 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:24.91,27.22 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:31.2,47.23 12 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:50.2,50.24 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:53.2,53.14 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:56.2,56.13 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:27.22,28.43 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:47.23,49.3 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:50.24,52.3 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/scalar_mult_cgo.go:53.14,55.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:47.13,52.2 3 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:70.54,71.20 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:74.2,74.23 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:77.2,78.60 2 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:82.2,87.103 2 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:91.2,98.17 4 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:71.20,73.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:74.23,76.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:78.60,80.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:87.103,89.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:105.60,106.20 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:109.2,109.44 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:113.2,118.107 2 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:121.2,121.20 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:106.20,108.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:109.44,111.3 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:118.107,120.3 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:126.58,127.64 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:130.2,133.101 4 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:127.64,129.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:138.54,139.23 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:142.2,149.91 2 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:152.2,152.74 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:139.23,141.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:149.91,151.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:156.43,165.91 2 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:168.2,168.12 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:165.91,166.30 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:171.39,172.20 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:175.2,175.18 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:178.2,178.12 1 1 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:172.20,174.3 1 0 -github.com/ethereum/go-ethereum/crypto/secp256k1/secp256.go:175.18,177.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:21.44,27.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:36.192,43.37 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:49.2,54.16 4 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:58.2,58.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:62.2,66.86 3 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:70.2,70.37 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:43.37,46.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:54.16,56.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:58.23,60.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:66.86,68.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:73.83,80.37 4 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:80.37,82.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:87.67,92.2 3 0 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:95.46,101.2 4 0 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:104.75,105.46 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:105.46,110.3 3 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:114.48,115.32 1 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:115.32,120.3 3 1 -github.com/ethereum/go-ethereum/eth/downloader/whitelist/service.go:124.32,126.2 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:75.37,75.54 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:76.42,78.2 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:79.47,81.2 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:86.74,88.71 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:91.2,91.65 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:96.2,97.27 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:101.2,101.82 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:106.2,107.39 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:115.2,116.45 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:120.2,125.32 4 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:88.71,90.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:91.65,93.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:93.8,95.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:97.27,100.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:101.82,104.3 2 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:107.39,109.36 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:112.3,112.9 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:109.36,111.4 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:116.45,119.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:125.32,127.81 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:131.3,131.48 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:127.81,130.4 2 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:140.154,147.41 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:160.2,160.25 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:168.2,168.40 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:174.2,174.43 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:177.2,177.70 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:147.41,148.100 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:148.100,151.4 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:151.9,155.19 3 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:155.19,157.5 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:160.25,162.97 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:162.97,164.4 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:164.9,166.4 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:168.40,170.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:170.8,170.57 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:170.57,172.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:174.43,176.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:193.188,194.16 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:197.2,198.33 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:201.2,201.28 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:205.2,205.38 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:213.2,219.31 3 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:222.2,229.38 4 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:232.2,232.54 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:279.2,285.29 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:300.2,300.23 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:303.2,303.33 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:308.2,309.80 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:194.16,196.3 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:198.33,200.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:201.28,204.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:205.38,206.23 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:209.3,209.42 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:206.23,208.4 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:209.42,211.4 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:219.31,221.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:229.38,231.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:232.54,233.13 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:233.13,234.8 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:234.8,237.32 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:241.5,242.71 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:237.32,239.6 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:242.71,247.6 4 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:247.11,253.56 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:253.56,256.7 2 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:256.12,257.38 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:266.7,266.48 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:273.7,273.22 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:257.38,259.48 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:259.48,262.9 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:263.13,265.8 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:266.48,268.27 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:268.27,270.9 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:285.29,287.22 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:290.3,291.34 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:287.22,289.4 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:291.34,293.4 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:293.9,295.24 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:295.24,297.5 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:300.23,302.3 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:303.33,305.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/feehistory.go:305.8,307.3 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:80.62,82.16 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:86.2,87.17 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:94.2,95.46 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:99.2,100.52 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:106.2,107.26 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:111.2,112.25 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:117.2,129.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:82.16,85.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:87.17,90.3 2 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:90.8,90.26 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:90.26,93.3 2 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:95.46,98.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:100.52,103.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:103.8,103.36 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:103.36,105.3 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:107.26,110.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:112.25,115.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:132.38,135.12 3 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:135.12,137.29 2 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:137.29,138.41 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:141.4,141.30 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:138.41,140.5 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:152.76,160.26 6 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:163.2,170.26 6 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:173.2,180.46 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:186.2,186.14 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:211.2,212.22 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:216.2,216.36 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:219.2,224.37 5 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:160.26,162.3 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:170.26,172.3 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:180.46,185.3 4 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:186.14,188.21 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:192.3,197.27 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:203.3,203.86 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:209.3,209.43 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:188.21,191.4 2 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:197.27,199.4 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:203.86,208.4 4 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:212.22,215.3 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:216.36,218.3 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:237.70,242.2 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:244.30,244.51 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:245.35,247.2 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:248.40,254.2 3 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:260.171,262.18 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:270.2,276.32 6 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:289.2,289.9 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:262.18,263.10 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:267.3,267.9 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:264.36,264.36 0 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:265.15,265.15 0 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:276.32,278.55 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:281.3,282.47 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:278.55,279.12 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:282.47,284.28 2 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:284.28,285.10 1 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:290.38,290.38 0 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:291.14,291.14 0 0 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:297.42,297.59 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:298.42,298.71 1 1 -github.com/ethereum/go-ethereum/eth/gasprice/gasprice.go:299.42,299.69 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:45.93,51.2 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:53.45,55.17 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:58.2,58.26 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:55.17,56.50 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:64.65,70.9 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:89.2,90.15 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:93.2,94.16 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:97.2,97.17 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:72.32,73.76 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:76.3,76.82 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:79.3,79.26 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:83.70,84.50 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:85.10,86.60 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:73.76,75.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:76.82,78.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:79.26,81.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:90.15,92.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:94.16,96.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:102.65,104.64 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:107.2,110.73 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:116.2,117.15 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:120.2,121.16 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:126.2,126.9 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:190.2,190.17 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:104.64,106.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:110.73,112.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:112.8,114.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:117.15,119.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:121.16,123.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:127.76,129.17 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:132.3,133.17 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:137.81,140.17 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:143.3,144.69 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:158.76,162.17 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:165.3,167.17 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:170.3,172.86 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:176.69,179.17 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:182.3,182.85 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:186.10,188.18 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:129.17,131.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:133.17,135.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:140.17,142.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:144.69,145.70 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:149.4,150.18 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:153.4,153.86 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:145.70,147.5 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:150.18,152.5 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:153.86,155.5 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:162.17,164.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:167.17,169.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:172.86,174.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:179.17,181.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:182.85,184.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:193.84,196.16 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:199.2,200.15 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:203.2,203.64 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:196.16,198.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:200.15,202.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:206.77,217.16 9 0 -github.com/ethereum/go-ethereum/console/bridge.go:220.2,221.15 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:224.2,224.64 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:217.16,219.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:221.15,223.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:231.68,232.29 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:236.2,238.104 2 1 -github.com/ethereum/go-ethereum/console/bridge.go:243.2,244.73 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:259.2,260.75 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:268.2,269.15 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:272.2,272.62 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:232.29,234.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:238.104,240.3 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:244.73,247.17 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:250.3,250.34 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:247.17,249.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:251.8,252.61 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:255.3,255.28 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:252.61,254.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:260.75,261.34 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:264.3,264.30 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:261.34,263.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:269.15,271.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:278.59,279.45 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:282.2,288.80 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:291.2,291.80 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:296.2,296.53 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:308.2,309.15 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:312.2,312.52 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:279.45,281.3 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:288.80,290.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:291.80,293.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:296.53,299.17 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:302.3,302.34 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:299.17,301.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:303.8,303.57 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:303.57,305.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:309.15,311.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:316.60,317.45 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:320.2,321.80 2 1 -github.com/ethereum/go-ethereum/console/bridge.go:324.2,326.35 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:317.45,319.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:321.80,323.3 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:331.66,338.16 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:341.2,341.16 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:347.2,347.16 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:355.2,357.70 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:360.2,360.34 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:374.2,374.35 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:338.16,340.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:341.16,342.105 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:345.3,345.40 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:342.105,344.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:347.16,348.105 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:351.3,351.39 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:348.105,350.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:357.70,359.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:360.34,362.67 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:365.3,365.27 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:369.3,369.18 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:372.3,372.26 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:362.67,364.4 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:365.27,368.4 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:369.18,370.9 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:384.59,387.16 2 1 -github.com/ethereum/go-ethereum/console/bridge.go:391.2,398.22 3 1 -github.com/ethereum/go-ethereum/console/bridge.go:408.2,409.27 2 1 -github.com/ethereum/go-ethereum/console/bridge.go:448.2,449.11 2 1 -github.com/ethereum/go-ethereum/console/bridge.go:454.2,454.65 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:458.2,458.20 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:387.16,389.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:398.22,401.3 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:401.8,405.3 3 1 -github.com/ethereum/go-ethereum/console/bridge.go:409.27,415.74 5 1 -github.com/ethereum/go-ethereum/console/bridge.go:444.3,444.30 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:415.74,416.21 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:416.21,420.5 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:420.10,423.18 3 1 -github.com/ethereum/go-ethereum/console/bridge.go:426.5,427.19 2 1 -github.com/ethereum/go-ethereum/console/bridge.go:423.18,425.6 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:427.19,429.6 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:429.11,431.6 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:433.9,436.38 3 0 -github.com/ethereum/go-ethereum/console/bridge.go:439.4,439.42 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:442.4,442.43 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:436.38,438.5 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:439.42,441.5 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:449.11,451.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:451.8,453.3 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:454.65,457.3 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:461.74,465.17 4 0 -github.com/ethereum/go-ethereum/console/bridge.go:468.2,468.24 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:465.17,467.3 1 0 -github.com/ethereum/go-ethereum/console/bridge.go:472.34,475.2 2 0 -github.com/ethereum/go-ethereum/console/bridge.go:477.60,479.14 2 1 -github.com/ethereum/go-ethereum/console/bridge.go:482.2,482.23 1 1 -github.com/ethereum/go-ethereum/console/bridge.go:479.14,481.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:90.43,92.28 1 1 -github.com/ethereum/go-ethereum/console/console.go:95.2,95.25 1 1 -github.com/ethereum/go-ethereum/console/console.go:98.2,98.27 1 1 -github.com/ethereum/go-ethereum/console/console.go:103.2,115.58 2 1 -github.com/ethereum/go-ethereum/console/console.go:118.2,118.53 1 1 -github.com/ethereum/go-ethereum/console/console.go:122.2,125.21 3 1 -github.com/ethereum/go-ethereum/console/console.go:92.28,94.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:95.25,97.3 1 1 -github.com/ethereum/go-ethereum/console/console.go:98.27,100.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:115.58,117.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:118.53,120.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:130.48,135.43 3 1 -github.com/ethereum/go-ethereum/console/console.go:138.2,138.43 1 1 -github.com/ethereum/go-ethereum/console/console.go:143.2,143.35 1 1 -github.com/ethereum/go-ethereum/console/console.go:149.2,149.31 1 1 -github.com/ethereum/go-ethereum/console/console.go:160.2,160.23 1 1 -github.com/ethereum/go-ethereum/console/console.go:169.2,169.12 1 1 -github.com/ethereum/go-ethereum/console/console.go:135.43,137.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:138.43,140.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:143.35,146.3 2 1 -github.com/ethereum/go-ethereum/console/console.go:149.31,150.43 1 1 -github.com/ethereum/go-ethereum/console/console.go:150.43,152.48 2 0 -github.com/ethereum/go-ethereum/console/console.go:155.4,155.46 1 0 -github.com/ethereum/go-ethereum/console/console.go:152.48,154.5 1 0 -github.com/ethereum/go-ethereum/console/console.go:160.23,161.62 1 1 -github.com/ethereum/go-ethereum/console/console.go:167.3,167.51 1 1 -github.com/ethereum/go-ethereum/console/console.go:161.62,163.4 1 1 -github.com/ethereum/go-ethereum/console/console.go:163.9,166.4 2 0 -github.com/ethereum/go-ethereum/console/console.go:172.39,173.35 1 1 -github.com/ethereum/go-ethereum/console/console.go:173.35,178.3 4 1 -github.com/ethereum/go-ethereum/console/console.go:181.50,184.61 3 1 -github.com/ethereum/go-ethereum/console/console.go:187.2,187.58 1 1 -github.com/ethereum/go-ethereum/console/console.go:190.2,190.69 1 1 -github.com/ethereum/go-ethereum/console/console.go:193.2,194.35 2 1 -github.com/ethereum/go-ethereum/console/console.go:201.2,201.12 1 1 -github.com/ethereum/go-ethereum/console/console.go:184.61,186.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:187.58,189.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:190.69,192.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:194.35,200.3 5 1 -github.com/ethereum/go-ethereum/console/console.go:205.42,208.16 2 1 -github.com/ethereum/go-ethereum/console/console.go:211.2,212.24 2 1 -github.com/ethereum/go-ethereum/console/console.go:225.2,225.35 1 1 -github.com/ethereum/go-ethereum/console/console.go:233.2,233.12 1 1 -github.com/ethereum/go-ethereum/console/console.go:208.16,210.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:212.24,213.20 1 1 -github.com/ethereum/go-ethereum/console/console.go:216.3,217.43 2 1 -github.com/ethereum/go-ethereum/console/console.go:213.20,214.12 1 1 -github.com/ethereum/go-ethereum/console/console.go:217.43,218.57 1 1 -github.com/ethereum/go-ethereum/console/console.go:218.57,220.5 1 0 -github.com/ethereum/go-ethereum/console/console.go:225.35,227.29 2 1 -github.com/ethereum/go-ethereum/console/console.go:227.29,228.37 1 1 -github.com/ethereum/go-ethereum/console/console.go:228.37,230.5 1 1 -github.com/ethereum/go-ethereum/console/console.go:237.63,238.51 1 1 -github.com/ethereum/go-ethereum/console/console.go:238.51,242.3 3 1 -github.com/ethereum/go-ethereum/console/console.go:251.66,253.42 2 1 -github.com/ethereum/go-ethereum/console/console.go:256.2,265.58 10 1 -github.com/ethereum/go-ethereum/console/console.go:253.42,255.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:268.34,271.46 3 0 -github.com/ethereum/go-ethereum/console/console.go:271.46,273.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:273.8,275.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:280.68,282.42 2 0 -github.com/ethereum/go-ethereum/console/console.go:285.2,286.20 2 0 -github.com/ethereum/go-ethereum/console/console.go:282.42,284.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:291.86,293.32 1 0 -github.com/ethereum/go-ethereum/console/console.go:298.2,299.27 2 0 -github.com/ethereum/go-ethereum/console/console.go:313.2,313.75 1 0 -github.com/ethereum/go-ethereum/console/console.go:293.32,295.3 1 0 -github.com/ethereum/go-ethereum/console/console.go:299.27,301.117 1 0 -github.com/ethereum/go-ethereum/console/console.go:305.3,305.50 1 0 -github.com/ethereum/go-ethereum/console/console.go:310.3,311.8 2 0 -github.com/ethereum/go-ethereum/console/console.go:301.117,302.12 1 0 -github.com/ethereum/go-ethereum/console/console.go:305.50,307.12 2 0 -github.com/ethereum/go-ethereum/console/console.go:318.29,332.17 2 1 -github.com/ethereum/go-ethereum/console/console.go:336.2,336.58 1 1 -github.com/ethereum/go-ethereum/console/console.go:344.2,345.34 2 1 -github.com/ethereum/go-ethereum/console/console.go:332.17,334.3 1 1 -github.com/ethereum/go-ethereum/console/console.go:336.58,338.34 2 1 -github.com/ethereum/go-ethereum/console/console.go:341.3,342.62 2 1 -github.com/ethereum/go-ethereum/console/console.go:338.34,340.4 1 1 -github.com/ethereum/go-ethereum/console/console.go:350.46,351.15 1 1 -github.com/ethereum/go-ethereum/console/console.go:356.2,359.25 2 1 -github.com/ethereum/go-ethereum/console/console.go:351.15,352.31 1 1 -github.com/ethereum/go-ethereum/console/console.go:352.31,354.4 1 0 -github.com/ethereum/go-ethereum/console/console.go:364.38,377.6 5 1 -github.com/ethereum/go-ethereum/console/console.go:377.6,378.10 1 1 -github.com/ethereum/go-ethereum/console/console.go:379.14,381.47 2 0 -github.com/ethereum/go-ethereum/console/console.go:382.30,384.47 2 0 -github.com/ethereum/go-ethereum/console/console.go:385.20,386.10 1 1 -github.com/ethereum/go-ethereum/console/console.go:391.39,392.9 1 0 -github.com/ethereum/go-ethereum/console/console.go:393.38,393.38 0 0 -github.com/ethereum/go-ethereum/console/console.go:394.10,394.10 0 0 -github.com/ethereum/go-ethereum/console/console.go:398.41,399.9 1 1 -github.com/ethereum/go-ethereum/console/console.go:400.26,400.26 0 0 -github.com/ethereum/go-ethereum/console/console.go:401.10,401.10 0 1 -github.com/ethereum/go-ethereum/console/console.go:406.37,407.9 1 0 -github.com/ethereum/go-ethereum/console/console.go:408.41,408.41 0 0 -github.com/ethereum/go-ethereum/console/console.go:409.19,409.19 0 0 -github.com/ethereum/go-ethereum/console/console.go:415.33,425.15 2 1 -github.com/ethereum/go-ethereum/console/console.go:430.2,433.6 3 1 -github.com/ethereum/go-ethereum/console/console.go:425.15,427.3 1 1 -github.com/ethereum/go-ethereum/console/console.go:433.6,437.10 2 1 -github.com/ethereum/go-ethereum/console/console.go:438.31,440.10 2 0 -github.com/ethereum/go-ethereum/console/console.go:442.27,447.10 2 0 -github.com/ethereum/go-ethereum/console/console.go:449.26,450.37 1 1 -github.com/ethereum/go-ethereum/console/console.go:456.4,456.10 1 1 -github.com/ethereum/go-ethereum/console/console.go:458.28,460.46 1 1 -github.com/ethereum/go-ethereum/console/console.go:463.4,463.40 1 1 -github.com/ethereum/go-ethereum/console/console.go:467.4,469.20 3 1 -github.com/ethereum/go-ethereum/console/console.go:475.4,475.20 1 1 -github.com/ethereum/go-ethereum/console/console.go:450.37,454.13 2 0 -github.com/ethereum/go-ethereum/console/console.go:460.46,462.5 1 0 -github.com/ethereum/go-ethereum/console/console.go:463.40,464.13 1 0 -github.com/ethereum/go-ethereum/console/console.go:469.20,471.5 1 1 -github.com/ethereum/go-ethereum/console/console.go:471.10,473.5 1 0 -github.com/ethereum/go-ethereum/console/console.go:475.20,476.80 1 1 -github.com/ethereum/go-ethereum/console/console.go:484.5,485.15 2 1 -github.com/ethereum/go-ethereum/console/console.go:476.80,477.108 1 1 -github.com/ethereum/go-ethereum/console/console.go:477.108,479.28 2 1 -github.com/ethereum/go-ethereum/console/console.go:479.28,481.8 1 1 -github.com/ethereum/go-ethereum/console/console.go:492.91,493.24 1 1 -github.com/ethereum/go-ethereum/console/console.go:493.24,495.17 2 1 -github.com/ethereum/go-ethereum/console/console.go:495.17,497.4 1 1 -github.com/ethereum/go-ethereum/console/console.go:497.9,499.4 1 1 -github.com/ethereum/go-ethereum/console/console.go:505.37,513.26 2 1 -github.com/ethereum/go-ethereum/console/console.go:543.2,543.16 1 1 -github.com/ethereum/go-ethereum/console/console.go:513.26,514.12 1 1 -github.com/ethereum/go-ethereum/console/console.go:515.13,517.32 1 1 -github.com/ethereum/go-ethereum/console/console.go:520.18,521.52 1 1 -github.com/ethereum/go-ethereum/console/console.go:527.4,527.23 1 1 -github.com/ethereum/go-ethereum/console/console.go:528.17,529.17 1 1 -github.com/ethereum/go-ethereum/console/console.go:532.4,532.23 1 1 -github.com/ethereum/go-ethereum/console/console.go:533.17,534.17 1 1 -github.com/ethereum/go-ethereum/console/console.go:537.4,537.23 1 1 -github.com/ethereum/go-ethereum/console/console.go:538.11,539.23 1 1 -github.com/ethereum/go-ethereum/console/console.go:517.32,519.5 1 1 -github.com/ethereum/go-ethereum/console/console.go:521.52,523.5 1 1 -github.com/ethereum/go-ethereum/console/console.go:523.10,523.40 1 1 -github.com/ethereum/go-ethereum/console/console.go:523.40,526.5 2 1 -github.com/ethereum/go-ethereum/console/console.go:529.17,531.5 1 1 -github.com/ethereum/go-ethereum/console/console.go:534.17,536.5 1 1 -github.com/ethereum/go-ethereum/console/console.go:547.46,549.2 1 1 -github.com/ethereum/go-ethereum/console/console.go:552.45,553.23 1 1 -github.com/ethereum/go-ethereum/console/console.go:559.2,560.12 2 1 -github.com/ethereum/go-ethereum/console/console.go:553.23,557.3 2 1 -github.com/ethereum/go-ethereum/console/console.go:563.40,564.98 1 1 -github.com/ethereum/go-ethereum/console/console.go:567.2,567.35 1 0 -github.com/ethereum/go-ethereum/console/console.go:564.98,566.3 1 1 -github.com/ethereum/go-ethereum/eth/backend.go:110.73,112.45 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:115.2,115.32 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:118.2,118.81 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:122.2,122.51 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:131.2,139.16 5 0 -github.com/ethereum/go-ethereum/eth/backend.go:142.2,143.79 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:146.2,148.127 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:151.2,172.40 4 0 -github.com/ethereum/go-ethereum/eth/backend.go:175.2,176.30 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:179.2,188.22 6 0 -github.com/ethereum/go-ethereum/eth/backend.go:191.2,193.32 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:203.2,220.16 3 0 -github.com/ethereum/go-ethereum/eth/backend.go:223.2,230.62 3 0 -github.com/ethereum/go-ethereum/eth/backend.go:235.2,237.33 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:240.2,245.23 4 0 -github.com/ethereum/go-ethereum/eth/backend.go:248.2,260.17 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:264.2,270.16 5 0 -github.com/ethereum/go-ethereum/eth/backend.go:273.2,274.16 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:279.2,289.17 6 0 -github.com/ethereum/go-ethereum/eth/backend.go:112.45,114.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:115.32,117.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:118.81,121.3 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:122.51,123.31 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:129.3,129.28 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:123.31,126.4 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:126.9,128.4 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:139.16,141.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:143.79,145.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:148.127,150.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:172.40,174.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:176.30,178.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:188.22,190.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:193.32,194.62 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:194.62,196.4 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:196.9,196.69 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:196.69,197.24 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:200.4,200.63 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:197.24,199.5 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:220.16,222.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:230.62,234.3 3 0 -github.com/ethereum/go-ethereum/eth/backend.go:237.33,239.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:245.23,247.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:260.17,262.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:270.16,272.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:274.16,276.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:292.41,293.21 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:302.2,302.54 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:306.2,306.14 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:293.21,301.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:302.54,305.3 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:311.37,371.2 5 0 -github.com/ethereum/go-ethereum/eth/backend.go:373.59,375.2 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:377.63,382.37 4 0 -github.com/ethereum/go-ethereum/eth/backend.go:385.2,385.63 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:397.2,397.79 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:382.37,384.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:385.63,386.59 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:386.59,395.4 6 0 -github.com/ethereum/go-ethereum/eth/backend.go:405.60,407.16 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:412.2,415.25 4 0 -github.com/ethereum/go-ethereum/eth/backend.go:420.2,420.49 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:425.2,425.14 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:407.16,410.3 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:415.25,417.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:420.49,421.24 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:421.24,423.4 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:431.62,448.44 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:451.2,451.31 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:448.44,450.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:455.59,461.2 4 0 -github.com/ethereum/go-ethereum/eth/backend.go:466.51,471.39 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:479.2,479.19 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:522.2,522.12 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:471.39,473.19 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:476.3,476.25 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:473.19,475.4 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:479.19,488.17 6 0 -github.com/ethereum/go-ethereum/eth/backend.go:492.3,493.45 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:500.3,500.17 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:508.3,508.41 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:518.3,520.23 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:488.17,491.4 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:493.45,495.4 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:495.9,495.53 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:495.53,496.54 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:496.54,498.5 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:500.17,502.35 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:506.4,506.38 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:502.35,505.5 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:508.41,510.35 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:514.4,514.38 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:510.35,513.5 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:527.33,532.39 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:536.2,536.16 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:532.39,534.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:539.41,539.68 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:540.41,540.59 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:542.56,542.83 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:543.56,543.79 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:544.56,544.75 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:545.56,545.77 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:546.56,546.75 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:547.56,547.76 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:548.56,548.71 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:549.56,549.87 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:550.56,550.111 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:551.56,551.103 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:552.56,552.85 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:553.56,553.81 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:554.56,554.75 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:555.51,558.2 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:562.47,564.32 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:567.2,567.15 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:564.32,566.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:572.34,583.28 5 0 -github.com/ethereum/go-ethereum/eth/backend.go:591.2,595.12 3 0 -github.com/ethereum/go-ethereum/eth/backend.go:583.28,584.50 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:587.3,587.34 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:584.50,586.4 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:600.54,603.16 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:611.2,614.6 3 0 -github.com/ethereum/go-ethereum/eth/backend.go:603.16,604.91 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:608.3,608.69 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:604.91,606.4 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:614.6,615.10 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:616.19,618.18 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:621.20,622.10 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:618.18,620.5 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:633.54,637.9 3 0 -github.com/ethereum/go-ethereum/eth/backend.go:641.2,641.25 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:645.2,646.16 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:651.2,653.12 2 0 -github.com/ethereum/go-ethereum/eth/backend.go:637.9,639.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:641.25,643.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:646.16,648.3 1 0 -github.com/ethereum/go-ethereum/eth/backend.go:658.33,684.2 14 0 -github.com/ethereum/go-ethereum/eth/backend.go:691.63,693.2 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:46.61,47.43 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:47.43,48.13 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:48.13,49.8 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:49.8,50.12 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:51.34,52.12 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:54.41,57.44 3 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:69.6,69.21 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:57.44,59.99 2 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:59.99,60.92 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:60.92,62.9 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:62.14,64.9 1 0 -github.com/ethereum/go-ethereum/eth/bloombits.go:65.13,67.8 1 0 -github.com/ethereum/go-ethereum/eth/peerset.go:62.28,68.2 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:73.65,76.62 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:80.2,84.31 4 1 -github.com/ethereum/go-ethereum/eth/peerset.go:87.2,87.34 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:91.2,91.37 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:96.2,97.12 2 1 -github.com/ethereum/go-ethereum/eth/peerset.go:76.62,78.3 1 0 -github.com/ethereum/go-ethereum/eth/peerset.go:84.31,86.3 1 0 -github.com/ethereum/go-ethereum/eth/peerset.go:87.34,89.3 1 0 -github.com/ethereum/go-ethereum/eth/peerset.go:91.37,95.3 3 1 -github.com/ethereum/go-ethereum/eth/peerset.go:102.74,104.64 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:108.2,111.31 3 1 -github.com/ethereum/go-ethereum/eth/peerset.go:115.2,115.34 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:120.2,120.37 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:127.2,131.20 4 1 -github.com/ethereum/go-ethereum/eth/peerset.go:104.64,106.3 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:111.31,114.3 2 0 -github.com/ethereum/go-ethereum/eth/peerset.go:115.34,118.3 2 0 -github.com/ethereum/go-ethereum/eth/peerset.go:120.37,125.3 3 1 -github.com/ethereum/go-ethereum/eth/peerset.go:136.71,141.15 3 1 -github.com/ethereum/go-ethereum/eth/peerset.go:144.2,145.31 2 1 -github.com/ethereum/go-ethereum/eth/peerset.go:148.2,151.16 2 1 -github.com/ethereum/go-ethereum/eth/peerset.go:155.2,156.12 2 1 -github.com/ethereum/go-ethereum/eth/peerset.go:141.15,143.3 1 0 -github.com/ethereum/go-ethereum/eth/peerset.go:145.31,147.3 1 0 -github.com/ethereum/go-ethereum/eth/peerset.go:151.16,154.3 2 1 -github.com/ethereum/go-ethereum/eth/peerset.go:161.52,166.9 4 1 -github.com/ethereum/go-ethereum/eth/peerset.go:169.2,170.25 2 1 -github.com/ethereum/go-ethereum/eth/peerset.go:173.2,173.12 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:166.9,168.3 1 0 -github.com/ethereum/go-ethereum/eth/peerset.go:170.25,172.3 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:177.45,182.2 3 1 -github.com/ethereum/go-ethereum/eth/peerset.go:186.67,191.29 4 1 -github.com/ethereum/go-ethereum/eth/peerset.go:196.2,196.13 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:191.29,192.26 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:192.26,194.4 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:201.73,206.29 4 1 -github.com/ethereum/go-ethereum/eth/peerset.go:211.2,211.13 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:206.29,207.32 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:207.32,209.4 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:217.30,222.2 3 1 -github.com/ethereum/go-ethereum/eth/peerset.go:225.34,230.2 3 1 -github.com/ethereum/go-ethereum/eth/peerset.go:234.50,242.29 4 1 -github.com/ethereum/go-ethereum/eth/peerset.go:247.2,247.17 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:242.29,243.63 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:243.63,245.4 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:251.28,255.29 3 1 -github.com/ethereum/go-ethereum/eth/peerset.go:258.2,258.18 1 1 -github.com/ethereum/go-ethereum/eth/peerset.go:255.29,257.3 1 1 -github.com/ethereum/go-ethereum/eth/peer.go:42.39,50.2 2 0 -github.com/ethereum/go-ethereum/eth/peer.go:64.41,68.2 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:48.160,56.15 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:62.2,62.17 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:118.2,123.35 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:154.2,154.12 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:158.2,158.21 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:56.15,58.17 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:58.17,60.4 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:62.17,63.17 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:73.3,74.77 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:63.17,67.73 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:67.73,70.5 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:75.8,86.17 3 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:93.3,93.39 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:108.3,108.17 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:86.17,88.18 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:88.18,90.5 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:93.39,94.32 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:97.4,98.21 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:101.4,104.18 3 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:94.32,96.5 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:98.21,100.5 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:104.18,105.10 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:108.17,109.22 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:110.32,111.88 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:112.12,113.20 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:123.35,125.51 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:130.3,131.70 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:134.3,135.17 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:139.3,140.17 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:144.3,145.17 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:148.3,149.32 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:152.3,152.16 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:125.51,128.4 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:131.70,133.4 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:135.17,137.4 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:140.17,143.4 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:145.17,147.4 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:149.32,151.4 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:154.12,157.3 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:162.144,164.28 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:168.2,169.19 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:174.2,175.16 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:178.2,178.52 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:182.2,183.44 2 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:201.2,201.122 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:164.28,166.3 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:169.19,171.3 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:175.16,177.3 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:178.52,180.3 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:183.44,188.21 4 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:192.3,194.94 3 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:199.3,199.65 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:188.21,190.4 1 0 -github.com/ethereum/go-ethereum/eth/state_accessor.go:194.94,196.4 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:17.113,19.63 2 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:25.2,25.16 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:29.2,30.16 2 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:33.2,33.18 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:19.63,20.30 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:20.30,22.4 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:25.16,27.3 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:30.16,32.3 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:37.107,39.20 2 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:43.2,43.21 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:39.20,41.3 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:47.102,49.20 2 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:52.2,52.26 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:49.20,51.3 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:56.144,59.2 2 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:61.182,64.2 2 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:67.99,69.2 1 0 -github.com/ethereum/go-ethereum/eth/bor_api_backend.go:72.101,74.2 1 0 -github.com/ethereum/go-ethereum/eth/discovery.go:36.35,38.2 1 0 -github.com/ethereum/go-ethereum/eth/discovery.go:41.63,45.12 3 0 -github.com/ethereum/go-ethereum/eth/discovery.go:45.12,47.7 2 0 -github.com/ethereum/go-ethereum/eth/discovery.go:47.7,48.11 1 0 -github.com/ethereum/go-ethereum/eth/discovery.go:49.19,50.34 1 0 -github.com/ethereum/go-ethereum/eth/discovery.go:51.21,54.11 1 0 -github.com/ethereum/go-ethereum/eth/discovery.go:60.50,63.2 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:135.58,137.28 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:140.2,153.40 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:177.2,177.30 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:183.2,183.20 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:205.2,208.48 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:226.2,226.28 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:229.2,229.53 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:292.2,294.59 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:301.2,303.15 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:137.28,139.3 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:153.40,163.62 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:163.62,166.4 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:167.8,168.45 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:168.45,171.4 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:171.9,174.4 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:177.30,180.3 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:183.20,186.42 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:192.3,193.45 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:186.42,189.4 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:193.45,196.66 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:196.66,198.5 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:208.48,211.30 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:219.3,219.58 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:224.3,224.62 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:211.30,214.4 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:219.58,220.34 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:220.34,222.5 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:226.28,228.3 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:229.53,232.30 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:250.3,250.62 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:259.3,259.42 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:263.3,263.28 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:286.3,287.17 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:290.3,290.16 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:232.30,235.23 3 0 -github.com/ethereum/go-ethereum/eth/handler.go:241.4,242.64 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:235.23,240.5 4 0 -github.com/ethereum/go-ethereum/eth/handler.go:250.62,253.4 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:259.42,262.4 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:263.28,270.33 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:284.4,284.17 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:270.33,272.19 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:275.5,276.54 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:280.5,280.68 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:272.19,274.6 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:276.54,279.6 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:280.68,282.6 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:287.17,289.4 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:294.59,296.15 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:299.3,299.30 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:296.15,298.4 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:308.73,312.16 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:317.2,317.40 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:320.2,332.100 5 1 -github.com/ethereum/go-ethereum/eth/handler.go:336.2,337.41 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:348.2,348.39 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:353.2,356.57 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:360.2,363.14 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:367.2,367.83 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:371.2,371.17 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:377.2,388.41 5 1 -github.com/ethereum/go-ethereum/eth/handler.go:435.2,435.43 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:472.2,472.22 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:312.16,315.3 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:317.40,319.3 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:332.100,335.3 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:337.41,338.18 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:338.18,342.69 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:342.69,344.5 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:348.39,349.44 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:349.44,351.4 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:356.57,359.3 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:363.14,365.3 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:367.83,370.3 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:371.17,372.64 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:372.64,375.4 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:388.41,391.96 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:395.3,395.13 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:391.96,393.4 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:395.13,399.11 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:400.24,402.26 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:415.5,415.25 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:419.5,419.46 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:423.5,423.20 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:425.21,427.28 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:429.16,429.16 0 0 -github.com/ethereum/go-ethereum/eth/handler.go:402.26,406.45 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:411.6,412.12 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:406.45,410.7 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:415.25,418.6 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:419.46,422.6 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:435.43,437.84 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:440.3,440.44 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:437.84,439.4 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:440.44,444.11 3 0 -github.com/ethereum/go-ethereum/eth/handler.go:445.24,447.26 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:454.5,454.25 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:458.5,458.74 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:463.5,464.20 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:465.21,467.28 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:447.26,452.6 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:454.25,457.6 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:458.74,462.6 3 0 -github.com/ethereum/go-ethereum/eth/handler.go:479.81,483.60 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:487.2,487.22 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:483.60,486.3 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:491.41,493.17 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:493.17,495.3 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:499.45,502.18 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:509.2,510.17 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:515.2,518.25 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:521.2,524.51 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:502.18,505.3 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:505.8,507.3 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:510.17,513.3 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:518.25,520.3 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:524.51,526.3 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:529.39,546.2 10 1 -github.com/ethereum/go-ethereum/eth/handler.go:548.26,565.2 7 1 -github.com/ethereum/go-ethereum/eth/handler.go:569.70,572.29 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:576.2,576.57 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:581.2,585.15 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:603.2,603.47 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:572.29,574.3 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:576.57,577.41 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:577.41,579.4 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:585.15,588.89 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:595.3,596.33 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:599.3,600.9 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:588.89,590.4 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:590.9,593.4 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:596.33,598.4 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:603.47,604.30 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:607.3,607.136 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:604.30,606.4 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:615.65,627.25 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:639.2,639.34 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:644.2,644.34 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:649.2,651.57 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:627.25,631.42 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:635.3,635.42 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:631.42,633.4 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:635.42,637.4 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:639.34,643.3 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:644.34,648.3 3 1 -github.com/ethereum/go-ethereum/eth/handler.go:655.40,658.42 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:658.42,659.55 1 0 -github.com/ethereum/go-ethereum/eth/handler.go:659.55,662.4 2 0 -github.com/ethereum/go-ethereum/eth/handler.go:667.37,669.6 2 1 -github.com/ethereum/go-ethereum/eth/handler.go:669.6,670.10 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:671.27,672.38 1 1 -github.com/ethereum/go-ethereum/eth/handler.go:673.25,674.10 1 1 -github.com/ethereum/go-ethereum/eth/handler_eth.go:36.47,36.65 1 1 -github.com/ethereum/go-ethereum/eth/handler_eth.go:37.47,37.66 1 1 -github.com/ethereum/go-ethereum/eth/handler_eth.go:40.70,42.2 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:45.56,46.46 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:49.2,49.12 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:46.46,48.3 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:54.39,56.2 1 1 -github.com/ethereum/go-ethereum/eth/handler_eth.go:60.70,62.33 1 1 -github.com/ethereum/go-ethereum/eth/handler_eth.go:63.33,65.55 2 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:67.27,68.63 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:70.45,71.48 1 1 -github.com/ethereum/go-ethereum/eth/handler_eth.go:73.31,74.56 1 1 -github.com/ethereum/go-ethereum/eth/handler_eth.go:76.37,77.55 1 1 -github.com/ethereum/go-ethereum/eth/handler_eth.go:79.10,80.62 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:86.105,90.29 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:96.2,100.35 2 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:106.2,106.42 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:109.2,109.12 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:90.29,94.3 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:100.35,101.47 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:101.47,104.4 2 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:106.42,108.3 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:114.98,118.29 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:124.2,133.46 3 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:137.2,137.12 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:118.29,122.3 1 0 -github.com/ethereum/go-ethereum/eth/handler_eth.go:133.46,136.3 2 0 -github.com/ethereum/go-ethereum/eth/handler_snap.go:29.48,29.66 1 1 -github.com/ethereum/go-ethereum/eth/handler_snap.go:32.73,34.2 1 0 -github.com/ethereum/go-ethereum/eth/handler_snap.go:37.57,38.46 1 0 -github.com/ethereum/go-ethereum/eth/handler_snap.go:43.2,43.12 1 0 -github.com/ethereum/go-ethereum/eth/handler_snap.go:38.46,39.23 1 0 -github.com/ethereum/go-ethereum/eth/handler_snap.go:39.23,41.4 1 0 -github.com/ethereum/go-ethereum/eth/handler_snap.go:48.73,50.2 1 1 -github.com/ethereum/go-ethereum/eth/api.go:51.59,53.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:56.67,58.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:61.66,63.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:66.57,68.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:77.53,79.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:82.42,84.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:93.55,95.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:102.55,103.20 1 0 -github.com/ethereum/go-ethereum/eth/api.go:106.2,106.36 1 0 -github.com/ethereum/go-ethereum/eth/api.go:103.20,105.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:111.36,113.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:116.66,117.62 1 0 -github.com/ethereum/go-ethereum/eth/api.go:120.2,120.18 1 0 -github.com/ethereum/go-ethereum/eth/api.go:117.62,119.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:124.68,131.2 5 0 -github.com/ethereum/go-ethereum/eth/api.go:134.71,137.2 2 0 -github.com/ethereum/go-ethereum/eth/api.go:140.73,143.2 2 0 -github.com/ethereum/go-ethereum/eth/api.go:146.63,148.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:158.57,160.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:164.97,165.33 1 0 -github.com/ethereum/go-ethereum/eth/api.go:168.2,168.33 1 0 -github.com/ethereum/go-ethereum/eth/api.go:172.2,172.41 1 0 -github.com/ethereum/go-ethereum/eth/api.go:178.2,179.16 2 0 -github.com/ethereum/go-ethereum/eth/api.go:182.2,185.36 3 0 -github.com/ethereum/go-ethereum/eth/api.go:191.2,191.18 1 0 -github.com/ethereum/go-ethereum/eth/api.go:198.2,198.18 1 0 -github.com/ethereum/go-ethereum/eth/api.go:165.33,167.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:168.33,171.3 2 0 -github.com/ethereum/go-ethereum/eth/api.go:172.41,176.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:179.16,181.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:185.36,188.3 2 0 -github.com/ethereum/go-ethereum/eth/api.go:191.18,192.77 1 0 -github.com/ethereum/go-ethereum/eth/api.go:192.77,194.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:195.8,195.67 1 0 -github.com/ethereum/go-ethereum/eth/api.go:195.67,197.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:201.67,202.23 1 0 -github.com/ethereum/go-ethereum/eth/api.go:208.2,208.13 1 0 -github.com/ethereum/go-ethereum/eth/api.go:202.23,203.47 1 0 -github.com/ethereum/go-ethereum/eth/api.go:203.47,205.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:212.68,215.16 2 0 -github.com/ethereum/go-ethereum/eth/api.go:218.2,221.36 3 0 -github.com/ethereum/go-ethereum/eth/api.go:228.2,231.28 3 0 -github.com/ethereum/go-ethereum/eth/api.go:257.2,257.18 1 0 -github.com/ethereum/go-ethereum/eth/api.go:215.16,217.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:221.36,222.55 1 0 -github.com/ethereum/go-ethereum/eth/api.go:222.55,224.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:231.28,233.33 1 0 -github.com/ethereum/go-ethereum/eth/api.go:243.3,243.23 1 0 -github.com/ethereum/go-ethereum/eth/api.go:247.3,247.49 1 0 -github.com/ethereum/go-ethereum/eth/api.go:252.3,252.69 1 0 -github.com/ethereum/go-ethereum/eth/api.go:255.3,255.22 1 0 -github.com/ethereum/go-ethereum/eth/api.go:233.33,235.50 2 0 -github.com/ethereum/go-ethereum/eth/api.go:240.4,241.11 2 0 -github.com/ethereum/go-ethereum/eth/api.go:235.50,236.10 1 0 -github.com/ethereum/go-ethereum/eth/api.go:237.10,237.25 1 0 -github.com/ethereum/go-ethereum/eth/api.go:237.25,239.5 1 0 -github.com/ethereum/go-ethereum/eth/api.go:243.23,244.9 1 0 -github.com/ethereum/go-ethereum/eth/api.go:247.49,249.12 2 0 -github.com/ethereum/go-ethereum/eth/api.go:252.69,254.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:268.55,270.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:273.83,278.39 2 0 -github.com/ethereum/go-ethereum/eth/api.go:285.2,286.38 2 0 -github.com/ethereum/go-ethereum/eth/api.go:291.2,291.18 1 0 -github.com/ethereum/go-ethereum/eth/api.go:294.2,295.16 2 0 -github.com/ethereum/go-ethereum/eth/api.go:298.2,298.35 1 0 -github.com/ethereum/go-ethereum/eth/api.go:278.39,284.3 2 0 -github.com/ethereum/go-ethereum/eth/api.go:286.38,288.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:288.8,290.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:291.18,293.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:295.16,297.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:309.57,311.2 1 0 -github.com/ethereum/go-ethereum/eth/api.go:314.100,315.78 1 0 -github.com/ethereum/go-ethereum/eth/api.go:318.2,318.44 1 0 -github.com/ethereum/go-ethereum/eth/api.go:315.78,317.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:330.88,336.31 2 0 -github.com/ethereum/go-ethereum/eth/api.go:355.2,355.21 1 0 -github.com/ethereum/go-ethereum/eth/api.go:336.31,341.60 2 0 -github.com/ethereum/go-ethereum/eth/api.go:346.3,346.111 1 0 -github.com/ethereum/go-ethereum/eth/api.go:349.3,353.5 1 0 -github.com/ethereum/go-ethereum/eth/api.go:341.60,343.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:343.9,345.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:346.111,348.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:362.173,366.46 3 0 -github.com/ethereum/go-ethereum/eth/api.go:400.2,407.60 2 0 -github.com/ethereum/go-ethereum/eth/api.go:410.2,410.40 1 0 -github.com/ethereum/go-ethereum/eth/api.go:366.46,367.39 1 0 -github.com/ethereum/go-ethereum/eth/api.go:367.39,372.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:372.9,374.39 2 0 -github.com/ethereum/go-ethereum/eth/api.go:379.4,379.20 1 0 -github.com/ethereum/go-ethereum/eth/api.go:382.4,383.18 2 0 -github.com/ethereum/go-ethereum/eth/api.go:374.39,376.5 1 0 -github.com/ethereum/go-ethereum/eth/api.go:376.10,378.5 1 0 -github.com/ethereum/go-ethereum/eth/api.go:379.20,381.5 1 0 -github.com/ethereum/go-ethereum/eth/api.go:383.18,385.5 1 0 -github.com/ethereum/go-ethereum/eth/api.go:387.8,387.49 1 0 -github.com/ethereum/go-ethereum/eth/api.go:387.49,389.19 2 0 -github.com/ethereum/go-ethereum/eth/api.go:392.3,393.17 2 0 -github.com/ethereum/go-ethereum/eth/api.go:389.19,391.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:393.17,395.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:396.8,398.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:407.60,409.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:427.179,430.18 2 0 -github.com/ethereum/go-ethereum/eth/api.go:433.2,434.16 2 0 -github.com/ethereum/go-ethereum/eth/api.go:437.2,438.15 2 0 -github.com/ethereum/go-ethereum/eth/api.go:441.2,441.48 1 0 -github.com/ethereum/go-ethereum/eth/api.go:430.18,432.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:434.16,436.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:438.15,440.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:444.93,447.46 3 1 -github.com/ethereum/go-ethereum/eth/api.go:460.2,460.15 1 1 -github.com/ethereum/go-ethereum/eth/api.go:464.2,464.20 1 1 -github.com/ethereum/go-ethereum/eth/api.go:447.46,449.17 2 1 -github.com/ethereum/go-ethereum/eth/api.go:452.3,453.53 2 1 -github.com/ethereum/go-ethereum/eth/api.go:457.3,457.49 1 1 -github.com/ethereum/go-ethereum/eth/api.go:449.17,451.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:453.53,456.4 2 1 -github.com/ethereum/go-ethereum/eth/api.go:460.15,463.3 2 1 -github.com/ethereum/go-ethereum/eth/api.go:472.116,476.23 3 0 -github.com/ethereum/go-ethereum/eth/api.go:480.2,480.19 1 0 -github.com/ethereum/go-ethereum/eth/api.go:492.2,492.54 1 0 -github.com/ethereum/go-ethereum/eth/api.go:476.23,478.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:480.19,483.24 3 0 -github.com/ethereum/go-ethereum/eth/api.go:483.24,485.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:486.8,488.22 2 0 -github.com/ethereum/go-ethereum/eth/api.go:488.22,490.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:500.126,503.23 3 0 -github.com/ethereum/go-ethereum/eth/api.go:507.2,507.20 1 0 -github.com/ethereum/go-ethereum/eth/api.go:519.2,519.54 1 0 -github.com/ethereum/go-ethereum/eth/api.go:503.23,505.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:507.20,510.24 3 0 -github.com/ethereum/go-ethereum/eth/api.go:510.24,512.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:513.8,515.22 2 0 -github.com/ethereum/go-ethereum/eth/api.go:515.22,517.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:522.110,523.64 1 0 -github.com/ethereum/go-ethereum/eth/api.go:526.2,529.16 3 0 -github.com/ethereum/go-ethereum/eth/api.go:532.2,533.16 2 0 -github.com/ethereum/go-ethereum/eth/api.go:536.2,540.18 4 0 -github.com/ethereum/go-ethereum/eth/api.go:547.2,547.19 1 0 -github.com/ethereum/go-ethereum/eth/api.go:523.64,525.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:529.16,531.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:533.16,535.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:540.18,542.17 2 0 -github.com/ethereum/go-ethereum/eth/api.go:545.3,545.52 1 0 -github.com/ethereum/go-ethereum/eth/api.go:542.17,544.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:555.90,558.50 3 0 -github.com/ethereum/go-ethereum/eth/api.go:562.2,562.61 1 0 -github.com/ethereum/go-ethereum/eth/api.go:573.2,580.47 2 0 -github.com/ethereum/go-ethereum/eth/api.go:583.2,583.43 1 0 -github.com/ethereum/go-ethereum/eth/api.go:586.2,586.18 1 0 -github.com/ethereum/go-ethereum/eth/api.go:589.2,589.17 1 0 -github.com/ethereum/go-ethereum/eth/api.go:592.2,592.53 1 0 -github.com/ethereum/go-ethereum/eth/api.go:608.2,608.40 1 0 -github.com/ethereum/go-ethereum/eth/api.go:558.50,561.3 2 0 -github.com/ethereum/go-ethereum/eth/api.go:562.61,564.22 1 0 -github.com/ethereum/go-ethereum/eth/api.go:571.3,571.34 1 0 -github.com/ethereum/go-ethereum/eth/api.go:564.22,566.20 2 0 -github.com/ethereum/go-ethereum/eth/api.go:569.4,569.33 1 0 -github.com/ethereum/go-ethereum/eth/api.go:566.20,568.5 1 0 -github.com/ethereum/go-ethereum/eth/api.go:580.47,582.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:583.43,585.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:586.18,588.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:589.17,591.3 1 0 -github.com/ethereum/go-ethereum/eth/api.go:592.53,593.42 1 0 -github.com/ethereum/go-ethereum/eth/api.go:597.3,597.23 1 0 -github.com/ethereum/go-ethereum/eth/api.go:600.3,601.15 2 0 -github.com/ethereum/go-ethereum/eth/api.go:604.3,604.52 1 0 -github.com/ethereum/go-ethereum/eth/api.go:593.42,596.4 2 0 -github.com/ethereum/go-ethereum/eth/api.go:597.23,598.12 1 0 -github.com/ethereum/go-ethereum/eth/api.go:601.15,603.4 1 0 -github.com/ethereum/go-ethereum/eth/api.go:604.52,606.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:52.59,54.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:56.53,58.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:60.48,63.2 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:65.108,67.38 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:72.2,72.37 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:75.2,75.64 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:67.38,70.3 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:72.37,74.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:78.127,79.47 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:82.2,82.42 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:92.2,92.79 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:79.47,81.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:82.42,84.20 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:87.3,87.106 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:90.3,90.21 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:84.20,86.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:87.106,89.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:95.100,97.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:99.106,101.38 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:106.2,106.37 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:109.2,109.63 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:101.38,104.3 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:106.37,108.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:112.98,114.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:116.125,117.47 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:120.2,120.42 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:134.2,134.79 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:117.47,119.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:120.42,122.20 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:125.3,125.106 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:128.3,129.19 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:132.3,132.20 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:122.20,124.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:125.106,127.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:129.19,131.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:137.82,139.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:141.132,143.38 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:148.2,149.16 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:152.2,152.19 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:155.2,156.29 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:143.38,146.3 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:149.16,151.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:152.19,154.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:159.151,160.47 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:163.2,163.42 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:177.2,177.84 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:160.47,162.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:163.42,165.17 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:168.3,168.20 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:171.3,171.106 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:174.3,175.30 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:165.17,167.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:168.20,170.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:171.106,173.4 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:180.100,182.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:184.96,187.19 3 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:190.2,191.17 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:194.2,194.18 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:187.19,189.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:191.17,193.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:197.79,198.69 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:201.2,201.12 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:198.69,200.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:204.167,205.26 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:206.2,206.21 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:209.2,211.97 3 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:205.26,205.40 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:206.21,208.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:214.103,216.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:218.94,220.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:222.91,224.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:226.99,228.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:230.99,232.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:234.87,236.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:238.88,240.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:242.75,245.32 3 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:248.2,248.17 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:245.32,247.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:251.81,253.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:255.138,258.2 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:260.96,262.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:264.59,266.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:268.120,270.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:272.105,274.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:276.47,278.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:280.93,282.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:284.62,286.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:288.81,290.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:292.227,294.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:296.50,298.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:300.51,302.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:304.60,306.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:308.46,310.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:312.51,314.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:316.44,318.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:320.55,322.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:324.47,326.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:328.56,331.2 2 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:333.95,334.42 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:334.42,336.3 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:339.51,341.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:343.55,345.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:347.46,349.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:351.56,353.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:355.167,357.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:359.168,361.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:363.73,365.2 1 0 -github.com/ethereum/go-ethereum/eth/api_backend.go:367.52,369.2 1 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:38.90,41.16 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:47.2,48.57 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:54.2,55.16 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:60.2,60.50 1 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:66.2,67.16 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:72.2,74.66 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:41.16,44.3 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:48.57,51.3 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:55.16,58.3 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:60.50,63.3 2 0 -github.com/ethereum/go-ethereum/eth/handler_bor.go:67.16,70.3 2 0 -github.com/ethereum/go-ethereum/eth/sync.go:39.49,48.32 3 1 -github.com/ethereum/go-ethereum/eth/sync.go:51.2,51.19 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:57.2,58.25 2 1 -github.com/ethereum/go-ethereum/eth/sync.go:61.2,61.44 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:48.32,50.3 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:51.19,53.3 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:58.25,60.3 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:83.52,88.2 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:93.61,94.9 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:95.36,96.14 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:97.29,98.15 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:103.31,117.6 9 1 -github.com/ethereum/go-ethereum/eth/sync.go:117.6,118.39 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:121.3,121.10 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:118.39,120.4 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:122.25,122.25 0 1 -github.com/ethereum/go-ethereum/eth/sync.go:124.27,132.95 4 0 -github.com/ethereum/go-ethereum/eth/sync.go:136.21,137.20 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:139.30,145.24 3 1 -github.com/ethereum/go-ethereum/eth/sync.go:148.4,148.10 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:132.95,135.5 2 0 -github.com/ethereum/go-ethereum/eth/sync.go:145.24,147.5 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:154.50,155.22 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:166.2,166.36 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:170.2,171.15 2 1 -github.com/ethereum/go-ethereum/eth/sync.go:176.2,176.39 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:182.2,183.17 2 1 -github.com/ethereum/go-ethereum/eth/sync.go:186.2,188.27 3 1 -github.com/ethereum/go-ethereum/eth/sync.go:198.2,198.11 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:155.22,157.3 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:166.36,168.3 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:171.15,173.3 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:173.8,173.43 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:173.43,175.3 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:176.39,178.3 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:183.17,185.3 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:188.27,192.140 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:196.3,196.13 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:192.140,195.4 2 0 -github.com/ethereum/go-ethereum/eth/sync.go:201.71,204.2 2 1 -github.com/ethereum/go-ethereum/eth/sync.go:206.75,208.50 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:215.2,215.75 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:223.2,225.32 3 1 -github.com/ethereum/go-ethereum/eth/sync.go:208.50,212.3 3 0 -github.com/ethereum/go-ethereum/eth/sync.go:215.75,216.73 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:216.73,220.4 3 0 -github.com/ethereum/go-ethereum/eth/sync.go:229.51,231.12 2 0 -github.com/ethereum/go-ethereum/eth/sync.go:231.12,231.50 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:235.49,236.36 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:255.2,256.16 2 1 -github.com/ethereum/go-ethereum/eth/sync.go:259.2,259.41 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:265.2,266.44 2 1 -github.com/ethereum/go-ethereum/eth/sync.go:273.2,273.26 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:282.2,282.12 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:236.36,247.71 2 1 -github.com/ethereum/go-ethereum/eth/sync.go:247.71,249.4 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:249.9,249.30 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:249.30,252.4 2 0 -github.com/ethereum/go-ethereum/eth/sync.go:256.16,258.3 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:259.41,262.3 2 1 -github.com/ethereum/go-ethereum/eth/sync.go:266.44,269.65 1 1 -github.com/ethereum/go-ethereum/eth/sync.go:269.65,271.4 1 0 -github.com/ethereum/go-ethereum/eth/sync.go:273.26,281.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:97.92,99.43 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:124.2,124.18 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:99.43,106.55 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:106.55,110.57 3 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:110.57,112.6 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:114.33,116.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:117.44,119.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:138.65,147.2 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:152.48,153.6 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:153.6,154.54 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:154.54,157.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:186.55,189.16 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:192.2,192.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:195.2,203.21 3 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:214.2,214.51 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:217.2,217.58 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:189.16,191.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:192.31,194.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:203.21,205.31 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:205.31,206.37 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:211.4,211.96 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:206.37,210.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handler.go:214.51,216.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:32.78,35.43 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:38.2,39.61 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:35.43,37.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:44.115,45.21 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:45.21,48.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:48.8,50.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:53.124,66.65 5 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:139.2,139.16 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:66.65,70.15 3 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:83.3,83.20 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:86.3,86.60 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:93.3,93.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:70.15,71.13 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:71.13,74.22 3 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:74.22,76.6 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:77.10,79.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:80.9,82.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:83.20,84.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:86.60,88.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:88.9,91.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:94.34,97.21 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:103.35,109.23 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:126.22,128.43 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:134.23,136.41 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:97.21,99.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:99.10,102.5 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:109.23,113.5 3 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:113.10,114.63 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:114.63,117.41 3 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:117.41,119.7 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:119.12,121.7 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:122.11,124.6 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:128.43,130.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:130.10,132.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:142.109,144.29 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:147.2,147.42 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:164.2,169.19 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:176.2,177.20 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:144.29,146.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:147.42,152.21 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:155.3,156.21 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:161.3,161.17 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:152.21,154.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:156.21,157.58 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:157.58,159.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:169.19,172.3 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:172.8,175.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:177.20,181.66 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:185.3,186.61 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:189.3,190.17 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:181.66,184.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:186.61,188.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:192.2,193.55 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:201.3,201.17 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:193.55,195.21 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:198.4,199.38 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:195.21,196.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:205.77,208.43 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:211.2,212.60 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:208.43,210.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:217.100,223.35 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:233.2,233.15 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:223.35,225.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:228.3,228.53 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:225.32,226.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:228.53,231.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:236.74,239.43 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:242.2,243.54 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:239.43,241.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:248.88,254.35 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:270.2,270.14 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:254.35,256.34 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:260.3,261.36 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:265.3,265.35 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:256.34,257.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:261.36,264.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:265.35,268.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:273.74,276.43 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:279.2,280.57 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:276.43,278.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:285.94,291.35 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:311.2,311.17 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:291.35,293.34 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:297.3,298.21 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:304.3,304.61 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:293.34,294.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:298.21,299.105 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:299.105,300.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:304.61,306.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:306.9,309.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:314.75,317.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:321.2,321.29 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:325.2,325.34 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:317.40,319.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:321.29,323.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:328.69,331.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:334.2,334.42 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:337.2,337.84 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:341.2,341.107 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:345.2,351.34 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:331.40,333.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:334.42,336.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:337.84,340.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:341.107,344.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:354.75,357.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:360.2,360.33 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:367.2,371.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:357.40,359.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:360.33,362.49 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:365.3,365.16 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:362.49,364.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:374.74,377.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:380.2,380.33 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:392.2,396.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:377.40,379.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:380.33,386.46 3 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:390.3,390.49 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:386.46,389.4 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:399.71,402.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:405.2,409.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:402.40,404.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:412.71,415.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:418.2,418.33 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:426.2,430.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:415.40,417.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:418.33,421.46 3 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:424.3,424.16 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:421.46,423.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:433.87,436.26 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:439.2,440.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:444.2,444.28 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:447.2,447.34 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:436.26,438.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:440.40,442.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:444.28,446.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:450.84,453.43 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:456.2,457.70 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:453.43,455.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:460.130,467.29 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:485.2,485.20 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:467.29,468.33 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:472.3,473.16 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:477.3,477.56 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:468.33,469.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:473.16,474.12 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:477.56,479.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:479.9,483.4 3 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:488.73,490.26 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:494.2,495.41 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:498.2,498.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:505.2,505.35 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:490.26,492.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:495.41,497.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:498.25,500.16 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:503.3,503.34 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:500.16,502.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:508.81,510.26 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:514.2,515.41 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:518.2,518.50 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:525.2,527.60 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:510.26,512.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:515.41,517.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:518.50,520.16 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:523.3,523.34 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handlers.go:520.16,522.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:37.144,43.12 3 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:53.2,53.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:56.2,58.25 3 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:68.2,72.41 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:75.2,75.12 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:43.12,52.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:53.12,55.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:58.25,59.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:60.22,61.18 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:64.20,65.30 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:61.18,63.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:72.41,74.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:79.118,81.16 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:84.2,84.27 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:87.2,87.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:91.2,91.44 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:94.2,94.33 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:97.2,97.47 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:100.2,100.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:103.2,103.50 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:106.2,106.12 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:81.16,83.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:84.27,86.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:87.31,89.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:91.44,93.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:94.33,96.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:97.47,99.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:100.31,102.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/handshake.go:103.50,105.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:105.67,110.26 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:113.2,113.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:110.26,112.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:141.54,142.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:145.2,145.20 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:148.2,148.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:142.32,144.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:145.20,147.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:153.56,155.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:156.18,157.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:158.18,160.28 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:161.17,163.30 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:164.10,165.62 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:195.52,196.52 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:201.2,201.47 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:204.2,204.12 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:196.52,198.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:201.47,203.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:244.82,249.26 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:252.2,252.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:249.26,251.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:330.36,330.55 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:331.36,331.56 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:333.44,333.71 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:334.44,334.72 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:336.42,336.67 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:337.42,337.68 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:339.45,339.73 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:340.45,340.74 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:342.42,342.67 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:343.42,343.68 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:345.44,345.71 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:346.44,346.72 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:348.41,348.65 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:349.41,349.66 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:351.38,351.59 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:352.38,352.60 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:354.41,354.65 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:355.41,355.66 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:357.38,357.59 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:358.38,358.60 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:360.41,360.65 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:361.41,361.66 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:363.38,363.59 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:364.38,364.60 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:366.56,366.95 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:367.56,367.96 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:369.51,369.85 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:370.51,370.86 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:372.48,372.79 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/protocol.go:373.48,373.80 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:42.34,43.6 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:43.6,44.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:45.33,46.62 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:49.4,49.110 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:51.37,52.105 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:55.4,55.84 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:57.17,58.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:46.62,48.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:52.105,54.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:66.40,73.6 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:73.6,75.36 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:105.3,105.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:75.36,82.62 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:89.4,92.20 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:82.62,83.48 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:87.5,87.18 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:83.48,86.6 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:92.20,94.15 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:94.15,95.52 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:99.6,100.59 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:95.52,98.7 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:106.34,108.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:112.4,113.33 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:118.15,119.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:121.15,122.17 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:124.17,125.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:108.14,109.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:113.33,116.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:133.39,140.6 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:140.6,142.36 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:172.3,172.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:142.36,149.73 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:156.4,159.24 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:149.73,150.42 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:150.42,153.6 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:159.24,161.15 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:161.15,162.67 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:166.6,167.76 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:162.67,165.7 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:173.33,175.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:179.4,180.36 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:185.15,186.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:188.15,189.17 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:191.17,192.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:175.14,176.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/broadcast.go:180.36,183.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:35.35,37.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:41.67,45.12 3 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:45.12,47.7 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:47.7,48.11 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:49.19,50.35 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:51.21,54.11 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/discovery.go:61.56,65.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:61.33,62.19 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:65.2,69.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:62.19,64.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:70.36,71.41 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:74.3,75.13 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:76.21,77.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:71.41,73.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:122.52,131.9 5 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:132.30,133.22 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:134.16,135.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:141.83,149.9 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:150.30,152.38 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:157.3,157.22 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:166.3,166.10 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:180.16,181.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:152.38,154.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:157.22,159.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:167.25,168.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:169.11,172.11 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:173.29,174.22 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:175.26,176.15 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:188.29,191.6 2 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:191.6,192.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:193.33,201.18 6 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:205.34,209.18 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:214.4,215.24 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:217.33,224.11 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:249.17,250.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:201.18,203.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:209.18,211.13 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:225.24,229.38 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:231.34,236.105 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/dispatcher.go:238.12,246.28 3 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:60.24,61.11 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:64.2,64.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:61.11,63.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:97.84,122.2 6 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:127.24,129.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:132.28,134.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:137.31,139.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:142.55,148.2 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:151.55,157.2 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:160.50,162.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:165.56,167.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:171.44,174.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:178.50,181.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:192.63,194.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:197.2,197.45 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:194.25,196.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:203.60,204.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:205.31,207.28 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:208.16,209.74 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:219.72,223.2 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:228.71,229.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:230.30,232.28 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:233.16,234.75 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:239.102,248.2 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:252.81,257.35 3 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:261.2,261.51 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:257.35,260.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:267.58,268.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:269.34,271.34 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:272.10,273.98 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:278.68,285.2 2 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:289.67,290.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:291.65,293.34 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:294.10,295.97 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:300.78,305.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:308.76,314.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:317.62,322.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:325.75,330.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:334.90,353.47 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:356.2,356.17 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:353.47,355.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:361.132,380.47 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:383.2,383.17 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:380.47,382.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:388.129,407.47 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:410.2,410.17 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:407.47,409.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:415.91,429.47 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:432.2,432.17 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:429.47,431.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:437.93,451.47 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:454.2,454.17 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:451.47,453.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:458.93,472.47 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:475.2,475.17 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:472.47,474.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:479.55,488.2 4 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:497.41,502.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:505.49,506.57 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:509.2,509.30 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:506.57,508.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:509.30,511.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:515.54,517.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/eth/peer.go:520.40,522.2 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:140.52,141.26 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:144.2,144.33 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:141.26,143.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:148.55,149.26 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:152.2,152.28 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:149.26,151.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:201.276,227.2 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:231.32,233.2 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:237.31,239.2 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:244.70,253.9 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:254.25,255.13 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:256.16,257.23 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:262.71,267.9 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:268.22,269.13 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:270.16,271.23 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:277.108,283.9 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:289.2,289.9 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:295.2,295.9 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:284.32,284.32 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:285.16,286.13 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:290.77,290.77 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:291.16,292.13 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:296.24,297.22 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:298.16,299.13 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:305.173,311.9 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:317.2,317.9 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:323.2,323.9 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:312.30,312.30 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:313.16,314.18 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:318.101,318.101 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:319.16,320.18 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:324.24,325.40 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:326.16,327.18 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:333.31,344.6 6 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:344.6,346.42 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:352.3,353.24 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:380.3,380.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:346.42,347.48 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:347.48,349.5 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:353.24,356.32 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:360.4,361.25 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:369.4,369.120 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:373.4,373.15 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:356.32,358.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:361.25,363.33 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:366.5,366.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:363.33,365.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:369.120,371.13 2 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:373.15,375.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:375.10,377.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:381.17,383.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:385.35,390.25 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:395.4,395.32 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:399.4,399.112 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:405.4,405.50 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:408.4,408.52 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:411.4,413.79 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:416.4,416.29 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:420.25,426.15 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:429.4,429.39 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:431.25,434.23 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:436.23,440.45 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:460.4,460.38 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:489.4,489.33 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:491.26,495.43 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:507.4,507.38 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:534.4,534.39 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:536.35,541.11 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:546.4,551.40 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:600.4,601.11 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:607.4,607.40 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:618.4,618.42 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:622.4,622.35 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:628.33,631.11 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:636.4,639.29 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:682.4,683.11 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:689.4,689.33 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:390.25,393.10 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:395.32,396.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:399.112,402.10 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:405.50,406.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:408.52,409.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:413.79,415.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:416.29,418.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:426.15,427.13 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:440.45,444.16 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:447.5,447.48 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:444.16,446.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:447.48,453.88 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:453.88,456.7 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:460.38,465.26 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:465.26,466.31 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:469.6,469.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:466.31,468.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:469.34,471.33 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:471.33,475.22 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:478.8,483.91 4 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:475.22,477.9 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:495.43,501.32 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:501.32,504.6 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:507.38,511.32 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:514.5,517.48 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:511.32,513.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:517.48,521.20 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:524.6,530.51 5 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:521.20,523.7 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:542.25,542.25 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:543.18,544.11 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:551.40,555.166 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:555.166,557.51 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:565.6,565.17 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:574.6,574.33 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:557.51,561.15 4 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:565.17,566.35 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:570.7,571.15 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:566.35,569.8 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:574.33,579.91 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:590.7,590.48 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:579.91,587.16 6 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:591.12,594.7 2 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:595.11,598.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:602.72,602.72 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:603.18,604.11 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:607.40,609.40 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:612.5,613.28 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:609.40,610.14 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:613.28,615.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:618.42,620.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:622.35,623.64 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:623.64,625.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:632.25,632.25 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:633.18,634.11 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:639.29,640.73 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:640.73,647.47 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:674.6,674.17 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:647.47,648.64 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:651.7,651.39 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:654.7,654.49 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:657.7,657.37 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:660.7,660.44 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:664.7,665.34 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:648.64,649.16 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:651.39,653.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:654.49,655.16 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:657.37,659.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:660.44,661.16 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:665.34,669.8 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:669.13,671.8 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:674.17,678.15 4 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:684.24,684.24 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:685.18,686.11 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:689.33,690.64 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:690.64,692.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:699.59,701.27 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:706.2,706.13 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:711.2,712.40 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:717.2,717.51 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:701.27,703.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:706.13,709.3 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:712.40,713.40 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:713.40,715.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:721.65,723.25 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:727.2,728.38 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:733.2,733.52 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:723.25,725.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:728.38,729.40 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:729.40,731.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:738.87,743.19 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:749.2,750.24 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:757.2,757.97 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:764.2,764.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:743.19,745.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:745.8,747.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:750.24,755.3 4 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:757.97,762.3 4 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:764.34,766.20 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:771.3,774.31 4 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:777.3,777.120 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:766.20,768.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:768.9,770.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:774.31,776.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:784.73,788.12 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:788.12,789.16 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:791.3,792.20 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:797.3,797.83 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:803.3,803.69 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:808.3,808.28 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:789.16,789.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:792.20,795.4 2 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:797.83,801.4 3 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:803.69,806.4 2 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:808.28,810.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:817.70,822.12 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:822.12,823.16 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:826.3,827.20 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:832.3,832.53 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:848.3,848.63 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:853.3,857.28 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:823.16,823.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:827.20,830.4 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:833.12,836.36 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:838.33,838.33 0 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:841.11,845.10 3 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:848.63,851.4 2 0 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:857.28,859.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:865.53,867.46 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:880.2,880.51 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:889.2,889.43 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:895.2,898.53 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:867.46,868.40 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:874.3,875.34 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:868.40,870.41 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:870.41,872.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:875.34,877.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:880.51,882.40 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:885.3,885.27 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:882.40,884.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:889.43,891.40 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:891.40,893.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:898.53,900.40 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:903.3,903.29 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:900.40,902.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:909.54,910.45 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:910.45,912.35 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:915.3,915.25 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/block_fetcher.go:912.35,914.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:183.147,185.2 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:191.51,212.2 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:216.69,229.30 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:241.2,245.24 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:248.2,252.9 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:229.30,230.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:231.22,232.15 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:234.37,235.17 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:237.11,238.37 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:245.24,247.3 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:253.28,254.13 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:255.16,256.23 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:264.87,266.12 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:273.2,280.27 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:305.2,305.12 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:314.2,314.9 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:266.12,268.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:268.8,270.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:280.27,284.88 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:291.3,291.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:303.3,303.39 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:284.88,285.63 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:288.4,288.36 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:285.63,287.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:292.19,292.19 0 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:294.45,295.15 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:297.90,298.17 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:300.11,301.17 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:305.12,309.3 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:309.8,313.3 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:315.77,316.13 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:317.16,318.23 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:324.45,325.9 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:326.37,327.13 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:328.16,329.23 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:335.29,337.2 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:341.28,343.2 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:345.28,353.6 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:353.6,354.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:671.3,679.20 7 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:355.26,361.30 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:369.4,370.29 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:375.4,378.36 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:430.4,430.39 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:435.4,435.52 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:439.22,443.43 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:467.4,467.27 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:471.4,471.24 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:475.25,480.38 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:515.4,519.53 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:521.32,524.41 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:560.4,560.23 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:614.25,616.43 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:630.4,631.55 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:652.4,652.43 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:662.4,662.22 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:667.17,668.10 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:361.30,367.10 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:370.29,373.5 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:378.36,382.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:395.5,395.33 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:409.5,409.32 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:420.5,423.63 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:382.34,386.64 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:391.6,391.14 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:386.64,388.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:388.12,390.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:395.33,399.64 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:404.6,404.14 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:399.64,401.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:401.12,403.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:409.32,412.64 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:417.6,417.14 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:412.64,414.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:414.12,416.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:423.63,425.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:425.11,427.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:430.39,432.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:435.52,437.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:443.43,444.78 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:444.78,446.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:449.6,450.41 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:462.6,463.30 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:446.34,447.63 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:450.41,451.59 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:456.7,457.38 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:460.7,460.33 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:451.59,453.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:453.13,455.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:457.38,459.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:467.27,469.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:471.24,473.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:480.38,481.77 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:481.77,485.38 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:507.6,507.37 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:511.6,511.35 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:485.38,487.28 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:493.7,493.41 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:496.7,496.36 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:499.7,500.38 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:503.7,505.31 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:487.28,488.41 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:488.41,489.17 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:493.41,494.66 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:496.36,498.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:500.38,502.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:507.37,509.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:524.41,525.38 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:525.38,526.43 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:532.6,533.30 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:526.43,528.26 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:528.26,530.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:534.11,535.43 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:541.6,547.95 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:555.6,555.30 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:535.43,537.26 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:537.26,539.8 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:547.95,549.24 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:553.7,553.32 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:549.24,552.8 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:560.23,566.19 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:570.5,575.42 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:578.5,579.37 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:585.5,585.37 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:611.5,611.57 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:566.19,568.11 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:575.42,577.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:579.37,580.38 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:580.38,582.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:585.37,587.27 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:592.6,592.39 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:607.6,608.30 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:587.27,588.40 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:588.40,589.16 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:592.39,593.21 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:600.7,600.38 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:593.21,596.50 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:596.50,598.9 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:600.38,601.42 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:604.8,604.46 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:601.42,602.103 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:616.43,617.46 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:624.5,625.28 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:617.46,619.36 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:619.36,622.7 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:625.28,627.6 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:631.55,632.41 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:649.5,649.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:632.41,634.31 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:640.6,641.38 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:647.6,647.30 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:634.31,635.44 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:635.44,636.16 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:641.38,643.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:643.12,646.7 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:652.43,653.46 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:659.5,659.35 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:653.46,655.37 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:655.37,657.7 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:662.22,665.5 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:679.20,681.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:691.80,692.19 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:695.2,698.38 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:706.2,706.81 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:692.19,694.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:698.38,699.26 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:699.26,701.65 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:701.65,702.10 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:706.81,708.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:725.83,726.19 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:729.2,732.33 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:744.2,744.80 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:726.19,728.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:732.33,734.24 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:737.3,737.26 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:734.24,735.12 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:737.26,739.64 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:739.64,740.10 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:744.80,746.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:750.112,753.20 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:759.2,759.23 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:763.2,765.43 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:808.2,808.33 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:753.20,755.33 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:755.33,757.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:759.23,761.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:765.43,766.30 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:769.3,769.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:772.3,773.64 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:793.3,793.22 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:766.30,768.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:769.34,771.4 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:773.64,774.38 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:790.4,790.15 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:774.38,778.40 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:781.5,786.39 4 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:778.40,779.100 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:786.39,788.6 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:793.22,797.47 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:797.47,800.52 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:800.52,803.6 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:808.33,810.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:815.82,817.19 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:824.2,825.26 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:828.2,830.28 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:817.19,818.27 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:821.3,821.9 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:818.27,820.4 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:825.26,827.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:830.28,832.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:837.98,839.19 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:848.2,849.27 2 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:852.2,854.28 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:839.19,840.28 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:845.3,845.9 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:840.28,841.17 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:841.17,843.5 1 0 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:849.27,851.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:854.28,855.16 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:855.16,857.4 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:863.43,867.33 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:867.33,869.3 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:874.38,875.34 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:875.34,876.39 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:876.39,877.51 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:877.51,879.5 1 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:886.47,890.33 3 1 -github.com/ethereum/go-ethereum/eth/fetcher/tx_fetcher.go:890.33,892.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:91.35,93.2 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:100.56,102.2 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:104.87,106.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:109.2,109.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:112.2,113.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:116.2,116.15 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:106.16,108.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:109.27,111.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:113.16,115.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:121.69,123.2 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:127.98,129.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:132.2,132.18 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:135.2,135.19 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:129.16,131.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:132.18,134.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:140.90,142.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:145.2,145.18 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:148.2,148.19 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:142.16,144.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:145.18,147.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:156.123,158.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:161.2,161.26 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:164.2,164.35 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:158.16,160.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:161.26,163.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:224.125,226.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:229.2,230.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:233.2,233.41 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:236.2,236.46 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:226.16,228.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:230.16,232.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:233.41,235.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:242.122,245.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:248.2,253.43 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:256.2,258.22 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:261.2,267.34 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:304.2,310.12 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:403.2,403.12 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:430.2,430.17 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:245.16,247.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:253.43,255.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:258.22,260.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:267.34,269.13 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:269.13,273.28 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:273.28,277.50 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:295.5,295.12 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:277.50,285.20 4 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:291.6,292.51 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:285.20,288.12 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:296.26,296.26 0 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:297.30,298.12 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:310.12,320.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:334.3,336.70 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:320.16,324.11 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:332.4,332.18 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:325.23,326.158 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:327.34,328.161 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:329.12,330.145 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:336.70,338.11 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:344.4,345.32 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:348.4,352.42 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:357.4,358.18 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:364.4,365.18 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:369.4,369.60 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:384.4,387.18 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:392.4,393.11 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:398.4,398.30 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:339.29,340.11 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:341.12,341.12 0 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:345.32,347.5 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:352.42,355.5 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:358.18,360.10 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:365.18,367.10 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:369.60,374.34 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:378.5,379.59 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:374.34,376.6 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:379.59,382.6 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:387.18,389.10 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:394.138,394.138 0 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:395.29,396.11 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:403.12,408.28 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:408.28,421.62 6 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:421.62,422.58 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:425.5,426.11 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:422.58,424.6 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:435.128,437.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:440.2,440.43 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:437.16,439.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:445.120,447.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:450.2,450.43 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:447.16,449.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:455.116,457.65 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:460.2,460.43 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:457.65,459.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:465.117,467.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:470.2,470.42 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:467.16,469.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:476.117,478.18 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:481.2,481.43 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:478.18,480.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:487.123,489.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:492.2,492.57 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:489.16,491.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:497.118,499.18 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:503.2,503.18 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:506.2,506.28 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:509.2,510.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:513.2,514.43 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:517.2,518.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:521.2,528.42 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:549.2,549.19 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:499.18,502.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:503.18,505.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:506.28,508.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:510.16,512.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:514.43,516.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:518.16,520.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:528.42,535.95 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:547.3,547.70 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:535.95,544.4 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:555.126,557.18 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:560.2,560.57 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:557.18,559.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:566.116,567.28 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:570.2,571.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:574.2,575.43 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:578.2,579.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:583.2,592.24 3 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:595.2,596.34 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:619.2,621.25 3 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:637.2,641.19 3 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:644.2,644.21 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:567.28,569.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:571.16,573.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:575.43,577.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:579.16,581.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:592.24,594.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:596.34,598.13 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:598.13,602.27 3 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:602.27,610.19 4 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:614.5,614.54 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:610.19,612.14 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:621.25,629.95 5 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:635.3,635.65 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:629.95,631.9 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:641.19,643.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:650.125,652.55 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:657.2,657.28 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:660.2,661.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:664.2,665.43 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:668.2,669.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:673.2,677.19 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:681.2,697.46 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:708.2,708.42 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:762.2,762.19 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:652.55,653.40 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:653.40,655.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:657.28,659.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:661.16,663.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:665.43,667.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:669.16,671.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:677.19,680.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:697.46,703.67 4 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:703.67,706.4 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:708.42,719.55 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:740.3,743.20 4 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:746.3,746.18 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:750.3,750.17 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:755.3,758.26 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:719.55,722.14 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:725.4,726.18 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:729.4,737.5 3 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:722.14,724.5 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:726.18,728.5 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:743.20,745.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:746.18,749.4 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:750.17,752.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:758.26,759.9 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:767.60,768.42 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:773.2,773.14 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:768.42,769.24 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:769.24,771.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:778.115,780.15 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:789.2,789.16 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:794.2,794.22 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:797.2,798.43 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:801.2,802.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:805.2,806.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:809.2,814.61 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:780.15,783.16 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:783.16,787.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:789.16,791.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:794.22,796.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:798.43,800.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:802.16,804.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:806.16,808.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:821.160,827.42 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:834.2,834.16 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:838.2,839.43 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:842.2,843.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:847.2,847.19 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:853.2,854.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:857.2,860.19 3 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:868.2,868.73 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:827.42,829.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:829.8,829.53 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:829.53,831.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:831.8,833.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:834.16,836.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:839.43,841.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:843.16,845.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:847.19,848.62 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:848.62,850.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:854.16,856.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:860.19,867.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:874.173,881.9 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:909.2,915.16 4 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:920.2,920.33 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:882.21,883.39 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:884.28,887.28 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:892.3,892.55 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:905.10,906.49 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:887.28,888.70 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:888.70,890.5 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:892.55,894.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:894.9,896.14 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:902.4,903.14 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:896.14,898.63 2 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:898.63,900.6 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:915.16,917.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:921.28,924.31 2 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:927.3,932.9 1 1 -github.com/ethereum/go-ethereum/eth/tracers/api.go:934.14,935.28 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:937.10,938.51 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:924.31,926.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/api.go:943.38,953.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/tracers.go:55.55,56.14 1 0 -github.com/ethereum/go-ethereum/eth/tracers/tracers.go:56.14,58.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/tracers.go:58.8,60.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/tracers.go:65.53,66.33 1 0 -github.com/ethereum/go-ethereum/eth/tracers/tracers.go:71.2,71.44 1 0 -github.com/ethereum/go-ethereum/eth/tracers/tracers.go:66.33,67.51 1 0 -github.com/ethereum/go-ethereum/eth/tracers/tracers.go:67.51,69.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:37.33,39.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:42.57,44.41 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:44.41,46.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:50.72,56.2 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:60.51,62.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:65.2,65.23 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:70.2,70.26 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:76.2,76.30 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:93.2,93.13 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:62.27,64.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:65.23,66.32 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:66.32,68.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:70.26,71.29 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:71.29,73.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:76.30,79.36 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:82.3,82.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:87.3,87.32 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:79.36,81.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:82.27,83.38 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:83.38,85.5 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:87.32,88.33 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:88.33,90.5 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:97.52,99.30 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:106.2,106.12 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:99.30,101.27 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:104.3,104.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:101.27,103.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:119.121,123.35 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:126.2,127.25 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:135.2,138.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:123.35,125.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:127.25,128.37 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:131.3,131.39 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:128.37,130.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:131.39,133.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:141.150,142.2 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:145.144,149.58 4 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:153.2,153.138 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:159.2,159.107 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:149.58,152.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:153.138,155.33 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:155.33,157.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:159.107,161.33 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:161.33,163.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:167.129,168.2 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:170.97,170.98 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:172.137,173.2 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:175.81,175.82 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:178.58,180.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/access_list_tracer.go:183.64,185.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:18.50,51.2 17 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:54.55,70.52 3 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:73.2,73.19 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:76.2,76.19 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:79.2,79.20 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:82.2,82.24 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:85.2,85.23 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:88.2,88.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:91.2,91.22 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:94.2,94.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:97.2,97.24 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:100.2,100.22 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:103.2,103.30 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:106.2,106.20 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:109.2,109.12 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:70.52,72.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:73.19,75.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:76.19,78.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:79.20,81.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:82.24,84.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:85.23,87.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:88.27,90.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:91.22,93.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:94.27,96.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:97.24,99.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:100.22,102.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:103.30,105.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/gen_structlog.go:106.20,108.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:40.33,42.28 2 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:45.2,45.12 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:42.28,44.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:90.37,92.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:95.42,96.18 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:99.2,99.11 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:96.18,98.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:118.49,122.16 2 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:125.2,125.15 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:122.16,124.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:129.32,134.2 4 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:137.145,139.2 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:144.140,149.52 4 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:153.2,154.24 2 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:159.2,160.25 2 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:166.2,170.66 4 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:194.2,195.28 2 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:200.2,201.30 2 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:149.52,151.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:154.24,157.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:160.25,162.37 2 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:162.37,164.4 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:170.66,173.43 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:177.3,177.38 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:173.43,175.4 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:177.38,184.4 3 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:184.9,184.46 1 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:184.46,192.4 3 1 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:195.28,198.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:206.127,207.2 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:210.94,213.17 3 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:213.17,215.17 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:215.17,217.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:221.135,222.2 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:224.79,224.80 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:227.49,227.66 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:230.38,230.54 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:233.40,233.59 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:236.53,237.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:237.27,239.21 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:242.3,244.25 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:250.3,250.26 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:254.3,254.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:260.3,260.30 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:264.3,264.23 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:239.21,241.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:244.25,246.45 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:246.45,248.5 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:250.26,253.4 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:254.27,256.37 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:256.37,258.5 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:260.30,263.4 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:269.53,270.27 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:270.27,273.36 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:277.3,278.23 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:273.36,275.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:290.65,292.18 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:295.2,295.10 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:292.18,294.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:298.141,300.13 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:310.2,313.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:300.13,304.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:304.8,308.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:317.136,321.25 3 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:330.2,332.16 3 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:321.25,324.37 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:327.3,328.34 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:324.37,326.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:332.16,334.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:337.122,339.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:341.91,344.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:346.131,347.2 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger.go:349.75,349.76 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:38.63,40.18 2 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:43.2,43.10 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:40.18,42.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:46.128,48.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:50.131,53.2 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:56.138,70.24 4 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:73.2,73.25 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:76.2,76.28 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:79.2,79.23 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:70.24,72.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:73.25,75.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:76.28,78.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:83.92,91.16 3 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:94.2,94.93 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:91.16,93.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:97.133,98.2 0 0 -github.com/ethereum/go-ethereum/eth/tracers/logger/logger_json.go:100.77,100.78 0 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter_system.go:12.90,13.51 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter_system.go:13.51,15.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter_system.go:19.91,32.2 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:70.116,75.24 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:82.2,82.35 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:89.2,98.15 6 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:75.24,77.37 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:80.3,80.36 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:77.37,79.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:82.35,84.35 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:87.3,87.36 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:84.35,86.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:103.117,108.2 3 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:112.93,119.2 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:123.66,125.32 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:136.2,137.19 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:140.2,142.19 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:145.2,146.17 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:150.2,155.59 3 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:165.2,167.18 3 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:125.32,127.17 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:130.3,130.20 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:133.3,133.34 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:127.17,129.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:130.20,132.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:137.19,139.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:142.19,144.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:146.17,148.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:155.59,156.20 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:161.3,161.17 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:156.20,158.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:158.9,160.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:161.17,163.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:172.85,177.16 3 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:180.2,187.6 4 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:177.16,179.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:187.6,188.10 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:189.32,191.11 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:198.4,202.35 3 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:205.4,206.18 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:209.4,209.33 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:211.21,212.26 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:191.11,193.19 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:196.5,196.21 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:193.19,195.6 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:202.35,204.5 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:206.18,208.5 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:219.87,222.41 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:233.2,233.18 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:222.41,224.34 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:227.3,228.17 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:231.3,231.32 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:224.34,226.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:228.17,230.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:237.102,238.54 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:245.2,245.18 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:238.54,240.17 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:243.3,243.32 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:240.17,242.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:250.105,253.16 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:256.2,257.32 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:260.2,261.19 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:276.2,276.17 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:253.16,255.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:257.32,259.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:261.19,263.40 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:274.3,274.19 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:263.40,265.18 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:268.4,269.37 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:272.4,272.66 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:265.18,267.5 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:269.37,271.5 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter.go:279.66,280.33 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:286.2,286.14 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:280.33,281.16 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:281.16,283.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:290.130,293.27 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:322.2,322.12 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:293.27,294.89 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:297.3,297.83 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:301.3,301.62 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:305.3,305.36 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:308.3,308.30 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:320.3,320.25 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:294.89,295.12 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:297.83,298.12 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:301.62,302.12 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:305.36,306.17 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:308.30,310.30 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:316.4,316.14 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:310.30,311.31 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:311.31,313.11 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:316.14,317.18 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:325.94,326.24 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:339.2,339.29 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:351.2,351.13 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:326.24,328.34 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:334.3,334.16 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:328.34,329.38 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:329.38,331.10 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:334.16,336.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:339.29,341.29 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:347.3,347.16 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:341.29,342.39 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:342.39,344.10 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter.go:347.16,349.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:123.67,146.111 8 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:150.2,151.10 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:146.111,148.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:163.45,165.2 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:168.40,169.26 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:169.26,171.7 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:188.3,188.14 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:171.7,176.11 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:177.35,178.24 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:179.22,179.22 0 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:180.24,180.24 0 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:181.25,181.25 0 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:193.67,197.2 3 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:202.112,204.27 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:209.2,209.25 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:216.2,216.68 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:220.2,220.66 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:224.2,224.40 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:228.2,228.67 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:232.2,232.46 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:235.2,235.76 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:204.27,206.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:206.8,208.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:209.25,211.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:211.8,213.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:216.68,218.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:220.66,222.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:224.40,226.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:228.67,230.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:232.46,234.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:240.115,253.2 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:257.103,270.2 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:274.110,287.2 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:291.84,303.2 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:307.85,319.2 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:323.73,324.18 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:327.2,327.46 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:324.18,326.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:327.46,329.27 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:329.27,331.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:335.80,336.18 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:339.2,339.53 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:336.18,338.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:339.53,341.27 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:341.27,343.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:347.89,348.46 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:348.46,350.27 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:350.27,352.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:356.81,358.28 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:361.2,361.61 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:358.28,360.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:361.61,363.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:366.82,367.48 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:370.2,370.56 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:367.48,369.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:370.56,371.84 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:371.84,372.48 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:372.48,373.121 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:373.121,375.6 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:381.104,384.17 3 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:387.2,390.33 3 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:405.2,405.31 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:409.2,409.44 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:384.17,386.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:390.33,391.51 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:395.3,395.50 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:391.51,394.4 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:395.50,398.19 3 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:398.19,401.5 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:405.31,407.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:409.44,411.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:415.140,416.50 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:451.2,451.12 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:416.50,421.17 4 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:424.3,425.33 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:432.3,433.57 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:449.3,449.14 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:421.17,423.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:425.33,426.29 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:426.29,430.5 3 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:433.57,436.18 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:439.4,440.37 2 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:447.4,447.62 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:436.18,438.5 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:440.37,441.38 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:441.38,445.6 3 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:455.36,457.15 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:466.2,467.63 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:471.2,471.6 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:457.15,464.3 6 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:467.63,469.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:471.6,472.10 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:473.25,474.32 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:475.26,476.28 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:477.28,478.35 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:479.33,480.35 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:481.27,482.34 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:483.31,484.38 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:486.26,487.48 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:494.4,494.22 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:496.28,497.48 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:504.4,504.16 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:507.26,508.10 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:509.27,510.10 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:511.29,512.10 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:513.28,514.10 1 0 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:487.48,491.5 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:491.10,493.5 1 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:497.48,501.5 2 1 -github.com/ethereum/go-ethereum/eth/filters/filter_system.go:501.10,503.5 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:64.112,75.2 3 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:79.64,83.6 4 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:83.6,86.34 3 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:95.3,100.33 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:103.3,103.20 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:86.34,87.11 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:88.24,90.28 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:91.12,92.13 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:100.33,102.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:114.66,124.12 5 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:142.2,142.24 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:124.12,125.7 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:125.7,126.11 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:127.28,129.56 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:132.5,132.27 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:133.30,137.11 4 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:129.56,131.6 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:147.100,149.16 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:153.2,155.12 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:177.2,177.20 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:149.16,151.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:155.12,159.7 3 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:159.7,160.11 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:161.30,164.30 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:167.24,169.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:170.29,172.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:164.30,166.6 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:184.53,194.12 5 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:212.2,212.21 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:194.12,195.7 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:195.7,196.11 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:197.24,199.53 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:202.5,202.27 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:203.27,207.11 4 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:199.53,201.6 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:216.86,218.16 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:222.2,224.12 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:242.2,242.20 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:218.16,220.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:224.12,228.7 3 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:228.7,229.11 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:230.24,231.34 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:232.24,234.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:235.29,237.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:246.103,248.16 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:252.2,258.16 3 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:262.2,262.12 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:280.2,280.20 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:248.16,250.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:258.16,260.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:262.12,264.7 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:264.7,265.11 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:266.31,267.30 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:270.24,272.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:273.29,275.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:267.30,269.6 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:300.76,303.16 3 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:307.2,311.12 4 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:329.2,329.24 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:303.16,305.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:311.12,312.7 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:312.7,313.11 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:314.21,316.51 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:319.5,319.27 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:320.25,324.11 4 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:316.51,318.6 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:335.101,336.28 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:341.2,345.27 4 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:371.2,372.16 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:376.2,376.26 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:387.2,387.30 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:336.28,338.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:345.27,349.18 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:349.18,351.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:352.8,355.28 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:358.3,359.26 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:363.3,365.18 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:355.28,357.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:359.26,361.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:365.18,367.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:372.16,374.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:376.26,379.17 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:383.3,383.65 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:379.17,381.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:393.61,396.11 3 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:399.2,400.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:404.2,404.14 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:396.11,398.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:400.11,402.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:411.97,416.41 4 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:420.2,421.29 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:438.2,439.16 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:442.2,442.30 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:416.41,418.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:421.29,424.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:424.8,427.30 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:430.3,431.28 2 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:435.3,435.84 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:427.30,429.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:431.28,433.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:439.16,441.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:452.78,456.40 3 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:476.2,476.56 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:456.40,457.25 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:462.3,464.16 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:457.25,461.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:465.60,468.36 3 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:469.58,472.32 3 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:481.55,482.19 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:485.2,485.15 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:482.19,484.3 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:490.49,491.17 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:494.2,494.13 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:491.17,493.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:498.62,508.51 3 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:512.2,512.26 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:528.2,530.26 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:558.2,558.25 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:597.2,597.12 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:508.51,510.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:512.26,513.49 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:517.3,517.33 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:513.49,516.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:518.8,519.27 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:523.3,523.25 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:519.27,521.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:523.25,525.4 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:530.26,532.42 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:533.22,534.33 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:545.15,547.18 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:550.4,550.43 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:551.11,552.51 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:534.33,535.41 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:535.41,537.20 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:540.6,540.51 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:537.20,539.7 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:541.11,543.6 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:547.18,549.5 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:558.25,560.32 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:560.32,561.29 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:562.13,562.13 0 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:565.16,568.19 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:571.5,571.40 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:573.23,575.36 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:591.12,592.42 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:568.19,570.6 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:575.36,576.25 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:581.6,581.44 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:576.25,579.12 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:581.44,583.21 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:586.7,586.54 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:583.21,585.8 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:587.12,589.7 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:600.54,602.50 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:605.2,605.38 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:602.50,604.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/api.go:608.49,610.47 2 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:613.2,613.35 1 1 -github.com/ethereum/go-ethereum/eth/filters/api.go:610.47,612.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:16.77,18.2 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:20.109,21.28 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:26.2,29.27 3 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:47.2,48.16 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:51.2,51.30 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:21.28,23.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:29.27,32.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:32.8,35.28 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:38.3,39.26 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:43.3,43.100 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:35.28,37.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:39.26,41.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:48.16,50.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:55.120,57.16 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:61.2,62.12 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:83.2,83.20 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:57.16,59.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:62.12,66.7 3 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:66.7,67.11 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:68.30,70.58 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:73.24,75.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:76.29,78.11 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_api.go:70.58,72.6 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:43.155,50.2 4 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:54.151,59.2 3 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:63.132,71.2 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:75.78,77.32 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:86.2,87.19 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:90.2,92.19 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:97.2,100.17 3 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:105.2,105.42 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:77.32,79.21 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:82.3,82.38 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:79.21,81.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:87.19,89.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:92.19,94.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:100.17,102.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:110.99,113.54 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:132.2,132.18 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:113.54,115.34 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:120.3,121.35 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:126.3,127.17 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:130.3,130.32 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:115.34,117.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:121.35,122.12 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:127.17,129.4 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:136.119,137.55 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:140.2,140.18 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:137.55,139.3 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:143.53,145.12 2 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:149.2,149.19 1 0 -github.com/ethereum/go-ethereum/eth/filters/bor_filter.go:145.12,147.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/discovery.go:30.35,32.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:86.76,88.59 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:93.2,94.43 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:116.2,116.18 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:88.59,91.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:94.43,101.55 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:101.55,102.76 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:102.76,104.6 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:106.33,108.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:109.44,111.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:121.48,122.6 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:122.6,123.54 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:123.54,126.4 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:133.55,136.16 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:139.2,139.31 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:142.2,145.21 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:157.2,157.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:136.16,138.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:139.31,141.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:145.21,147.31 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:147.31,148.37 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:153.4,153.96 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:148.37,152.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:158.38,161.42 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:165.3,172.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:174.35,177.41 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:181.3,181.42 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:186.3,188.35 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:190.39,193.42 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:197.3,204.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:206.36,209.41 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:213.3,213.35 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:220.3,222.35 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:224.35,227.42 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:231.3,237.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:239.32,242.41 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:245.3,247.35 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:249.35,252.42 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:256.3,257.17 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:261.3,264.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:266.32,269.41 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:272.3,274.35 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:276.10,277.59 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:161.42,163.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:177.41,179.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:181.42,182.78 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:182.78,184.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:193.42,195.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:209.41,211.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:213.35,214.36 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:214.36,215.65 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:215.65,217.6 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:227.42,229.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:242.41,244.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:252.42,254.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:257.17,259.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:269.41,271.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:283.113,284.35 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:288.2,289.16 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:292.2,293.16 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:297.2,302.16 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:322.2,326.58 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:330.2,330.29 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:336.2,337.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:340.2,340.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:284.35,286.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:289.16,291.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:293.16,295.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:302.16,315.48 5 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:318.3,318.23 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:315.48,316.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:318.23,319.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:326.58,329.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:330.29,331.53 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:331.53,334.4 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:337.40,339.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:343.117,344.35 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:352.2,360.39 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:448.2,448.22 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:344.35,346.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:360.39,363.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:367.3,368.26 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:371.3,372.25 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:376.3,377.17 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:381.3,386.17 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:407.3,413.41 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:363.24,364.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:368.26,370.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:372.25,374.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:377.17,379.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:386.17,387.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:391.4,403.45 5 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:387.25,389.10 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:403.45,404.10 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:413.41,417.18 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:420.4,421.73 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:424.4,425.18 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:428.4,429.60 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:433.4,433.31 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:439.4,439.42 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:445.4,445.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:417.18,419.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:421.73,423.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:425.18,427.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:429.60,432.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:433.31,434.59 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:434.59,437.6 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:439.42,441.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:453.89,454.35 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:457.2,457.38 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:461.2,465.34 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:478.2,478.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:454.35,456.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:457.38,459.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:465.34,466.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:474.3,474.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:466.24,470.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:470.9,470.73 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:470.73,473.4 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:474.24,475.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:483.115,484.35 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:488.2,491.16 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:495.2,496.17 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:504.2,509.36 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:557.2,557.19 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:484.35,486.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:491.16,494.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:496.17,502.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:509.36,510.23 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:553.3,553.98 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:511.10,513.76 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:515.10,519.18 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:522.4,523.30 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:525.11,529.36 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:532.4,534.18 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:537.4,537.37 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:519.18,520.10 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:529.36,530.10 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:534.18,535.10 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:537.37,540.19 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:543.5,547.100 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:540.19,541.11 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:547.100,548.11 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:553.98,554.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/handler.go:565.49,567.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:38.69,47.2 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:50.71,57.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:60.28,62.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:65.31,67.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:70.33,72.2 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:76.112,87.2 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:92.132,93.41 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:98.2,106.4 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:93.41,95.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:95.8,97.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:110.86,119.2 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/peer.go:123.107,133.2 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:101.72,106.33 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:113.2,113.30 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:106.33,108.17 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:111.3,111.41 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:108.17,110.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:141.70,146.32 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:154.2,154.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:146.32,149.30 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:149.30,152.4 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:196.45,196.73 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:197.45,197.74 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:199.42,199.67 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:200.42,200.68 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:202.46,202.75 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:203.46,203.76 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:205.43,205.69 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:206.43,206.70 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:208.42,208.67 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:209.42,209.68 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:211.39,211.61 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:212.39,212.62 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:214.42,214.67 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:215.42,215.68 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:217.39,217.61 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/protocol.go:218.39,218.62 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:35.61,48.2 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:51.33,53.14 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:56.2,57.13 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:53.14,55.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:61.41,63.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:66.39,69.14 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:72.2,72.42 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:69.14,71.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/range.go:76.41,81.2 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:456.48,481.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:484.48,489.30 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:495.2,508.12 10 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:489.30,494.3 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:512.46,515.31 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:521.2,536.12 11 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:515.31,520.3 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:543.69,556.34 6 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:560.2,561.60 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:565.2,565.15 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:573.2,576.15 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:582.2,585.15 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:596.2,619.6 8 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:556.34,558.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:561.60,564.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:565.15,566.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:569.3,570.21 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:566.32,568.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:576.15,577.36 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:577.36,580.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:585.15,594.3 8 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:619.6,623.61 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:627.3,631.24 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:637.3,637.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:670.3,670.18 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:623.61,625.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:631.24,635.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:638.19,638.19 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:640.19,640.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:642.25,643.24 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:644.17,645.23 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:647.33,648.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:649.34,650.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:651.33,652.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:653.38,654.36 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:655.38,656.36 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:658.30,659.33 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:660.31,661.34 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:662.30,663.33 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:664.35,665.38 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:666.35,667.38 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:676.35,679.65 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:727.2,741.42 9 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:679.65,680.59 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:680.59,682.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:682.9,683.40 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:686.4,687.33 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:708.4,721.10 12 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:683.40,685.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:687.33,690.44 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:694.5,696.44 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:690.44,692.7 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:696.44,697.39 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:697.39,700.46 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:704.7,704.60 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:700.46,702.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:741.42,743.32 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:747.3,749.42 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:753.3,761.69 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:743.32,746.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:749.42,751.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:766.35,768.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:781.2,795.16 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:798.2,798.45 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:768.31,769.47 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:772.3,772.42 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:769.47,771.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:772.42,773.37 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:773.37,774.52 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:774.52,776.6 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:795.16,796.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:802.59,819.21 5 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:823.2,823.26 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:819.21,822.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:828.38,830.23 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:834.2,834.36 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:841.2,841.23 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:830.23,832.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:834.36,835.22 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:835.22,838.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:841.23,848.3 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:853.38,854.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:854.31,855.48 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:855.48,857.39 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:863.4,863.25 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:868.4,868.41 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:873.4,877.22 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:857.39,858.25 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:858.25,861.6 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:863.25,865.13 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:868.41,869.24 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:869.24,871.6 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:877.22,879.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:886.117,896.34 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:903.2,903.26 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:906.2,909.31 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:896.34,897.40 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:900.3,901.86 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:897.40,898.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:903.26,905.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:909.31,911.41 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:917.3,917.27 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:920.3,929.7 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:940.3,952.64 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:957.3,961.29 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:978.3,978.17 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:911.41,912.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:917.27,919.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:929.7,931.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:934.4,934.41 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:937.4,937.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:931.18,932.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:934.41,935.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:952.64,956.4 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:961.29,965.28 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:968.4,968.28 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:971.4,971.100 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:965.28,967.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:968.28,970.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:971.100,974.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:983.120,993.35 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1000.2,1000.26 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1003.2,1006.31 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:993.35,994.40 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:997.3,998.83 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:994.40,995.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1000.26,1002.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1006.31,1008.22 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1012.3,1012.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1018.3,1018.27 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1021.3,1030.7 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1041.3,1041.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1044.3,1045.36 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1052.3,1063.64 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1068.3,1072.13 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1008.22,1009.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1012.31,1013.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1018.27,1020.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1030.7,1032.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1035.4,1035.42 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1038.4,1038.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1032.18,1033.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1035.42,1036.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1041.32,1043.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1045.36,1048.26 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1048.26,1049.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1063.64,1067.4 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1072.13,1076.79 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1076.79,1079.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1086.117,1096.34 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1103.2,1103.26 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1106.2,1109.31 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1096.34,1097.40 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1100.3,1101.87 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1097.40,1098.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1103.26,1105.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1109.31,1111.22 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1115.3,1115.59 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1121.3,1121.27 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1124.3,1133.7 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1146.3,1146.27 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1149.3,1149.27 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1152.3,1159.48 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1175.3,1175.21 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1190.3,1190.25 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1193.3,1206.21 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1210.3,1210.64 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1215.3,1219.29 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1234.3,1234.21 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1111.22,1112.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1115.59,1116.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1121.27,1123.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1133.7,1135.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1138.4,1138.41 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1141.4,1141.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1135.18,1136.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1138.41,1139.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1146.27,1148.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1149.27,1151.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1159.48,1160.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1171.4,1171.22 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1160.32,1162.22 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1166.5,1169.10 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1162.22,1163.14 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1171.22,1172.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1175.21,1177.48 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1177.48,1183.37 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1183.37,1184.11 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1190.25,1191.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1206.21,1209.4 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1210.64,1214.4 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1219.29,1224.22 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1227.4,1227.103 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1224.22,1226.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1227.103,1230.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1234.21,1236.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1242.132,1252.39 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1259.2,1259.26 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1262.2,1265.70 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1252.39,1253.40 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1256.3,1257.83 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1253.40,1254.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1259.26,1261.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1265.70,1273.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1283.3,1283.35 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1289.3,1289.27 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1292.3,1301.7 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1312.3,1312.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1315.3,1320.49 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1331.3,1343.64 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1348.3,1352.29 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1273.18,1275.31 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1278.4,1278.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1275.31,1277.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1278.31,1280.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1283.35,1285.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1289.27,1291.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1301.7,1303.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1306.4,1306.46 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1309.4,1309.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1303.18,1304.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1306.46,1307.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1312.32,1314.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1320.49,1327.26 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1327.26,1328.10 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1343.64,1347.4 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1352.29,1356.87 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1356.87,1359.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1366.132,1376.39 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1383.2,1383.26 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1386.2,1389.70 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1376.39,1377.40 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1380.3,1381.83 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1377.40,1378.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1383.26,1385.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1389.70,1397.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1407.3,1407.35 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1413.3,1413.27 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1416.3,1425.7 4 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1436.3,1436.32 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1439.3,1440.40 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1448.3,1459.64 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1464.3,1468.13 4 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1397.18,1399.31 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1402.4,1402.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1399.31,1401.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1402.31,1404.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1407.35,1409.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1413.27,1415.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1425.7,1427.18 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1430.4,1430.46 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1433.4,1433.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1427.18,1428.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1430.46,1431.13 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1436.32,1438.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1440.40,1444.26 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1444.26,1445.10 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1459.64,1463.4 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1468.13,1472.79 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1472.79,1475.5 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1482.46,1486.36 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1491.2,1492.37 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1497.2,1498.36 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1503.2,1504.41 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1509.2,1510.41 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1515.2,1518.34 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1521.2,1521.35 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1524.2,1524.34 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1527.2,1527.39 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1530.2,1530.39 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1486.36,1487.23 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1487.23,1489.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1492.37,1493.23 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1493.23,1495.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1498.36,1499.23 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1499.23,1501.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1504.41,1505.23 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1505.23,1507.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1510.41,1511.23 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1511.23,1513.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1518.34,1520.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1521.35,1523.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1524.34,1526.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1527.39,1529.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1530.39,1532.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1537.68,1538.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1539.25,1539.25 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1541.20,1541.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1543.19,1543.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1553.60,1555.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1561.2,1571.25 6 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1556.19,1558.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1559.10,1559.10 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1571.25,1573.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1578.70,1579.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1580.25,1580.25 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1582.20,1582.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1584.19,1584.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1594.62,1596.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1602.2,1612.34 6 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1597.19,1599.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1600.10,1600.10 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1612.34,1614.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1619.68,1620.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1621.25,1621.25 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1623.20,1623.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1625.19,1625.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1635.60,1637.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1643.2,1653.24 6 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1638.19,1640.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1641.10,1641.10 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1653.24,1655.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1655.8,1656.40 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1656.40,1658.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1664.78,1665.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1666.25,1666.25 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1668.20,1668.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1670.19,1670.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1680.70,1682.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1688.2,1698.34 6 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1683.19,1685.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1686.10,1686.10 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1698.34,1700.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1705.78,1706.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1707.25,1707.25 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1709.20,1709.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1711.19,1711.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1721.70,1723.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1729.2,1739.34 6 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1724.19,1726.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1727.10,1727.10 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1739.34,1741.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1746.63,1753.34 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1771.2,1781.39 8 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1815.2,1815.38 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1823.2,1823.24 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1753.34,1757.15 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1761.3,1761.14 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1757.15,1759.12 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1761.14,1766.9 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1781.39,1783.51 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1791.3,1791.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1783.51,1784.76 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1784.76,1788.5 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1791.32,1792.63 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1792.63,1797.61 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1807.5,1808.20 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1797.61,1799.39 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1802.6,1803.41 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1799.39,1801.7 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1804.11,1806.6 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1815.38,1816.34 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1816.34,1819.4 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1823.24,1826.3 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1833.65,1839.34 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1858.2,1859.38 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1862.2,1869.24 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1839.34,1843.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1848.3,1848.49 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1855.3,1856.37 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1843.18,1845.12 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1848.49,1849.76 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1849.76,1852.5 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1859.38,1861.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1869.24,1872.3 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1879.63,1881.24 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1884.2,1886.41 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1890.2,1896.39 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2043.2,2043.24 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2064.2,2064.38 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2067.2,2073.28 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1881.24,1883.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1886.41,1888.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1896.39,1898.27 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1904.3,1904.48 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2020.3,2022.50 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2032.3,2032.43 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1898.27,1900.12 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1904.48,1905.23 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1908.4,1913.95 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1919.4,1919.93 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1924.4,1924.64 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1992.4,1992.26 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1905.23,1906.13 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1913.95,1916.5 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1919.93,1921.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1924.64,1927.57 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1927.57,1933.23 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1942.6,1942.81 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1950.6,1955.45 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1959.6,1966.19 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1981.6,1981.33 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1984.6,1988.28 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1933.23,1935.7 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1942.81,1943.68 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1946.7,1946.125 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1943.68,1945.8 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1947.12,1949.7 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1955.45,1957.8 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1966.19,1969.46 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1973.7,1979.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1969.46,1971.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1981.33,1983.7 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1992.26,1997.63 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2004.5,2004.19 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2010.5,2010.17 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1997.63,1999.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2002.6,2002.20 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:1999.18,2001.7 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2004.19,2008.6 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2010.17,2012.6 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2012.11,2014.6 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2022.50,2024.44 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2027.4,2027.15 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2024.44,2026.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2032.43,2037.52 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2037.52,2039.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2043.24,2044.23 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2056.3,2056.82 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2044.23,2045.61 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2045.61,2047.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2047.10,2047.39 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2047.39,2049.53 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2049.53,2050.54 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2050.54,2052.7 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2056.82,2057.55 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2060.4,2060.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2057.55,2059.5 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2064.38,2066.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2073.28,2076.3 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2083.73,2084.34 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2107.2,2108.57 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2111.2,2111.38 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2114.2,2114.113 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2084.34,2088.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2093.3,2097.14 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2088.18,2090.12 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2098.12,2098.12 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2099.33,2100.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2101.29,2102.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2103.11,2104.69 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2108.57,2110.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2111.38,2113.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2119.73,2120.34 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2143.2,2144.57 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2147.2,2147.38 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2150.2,2150.112 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2120.34,2124.18 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2129.3,2133.14 4 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2124.18,2126.12 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2134.12,2134.12 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2135.33,2136.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2137.29,2138.24 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2139.11,2140.69 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2144.57,2146.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2147.38,2149.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2156.56,2159.16 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2162.2,2171.41 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2175.2,2175.34 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2193.2,2193.38 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2196.2,2200.34 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2207.2,2212.15 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2217.2,2217.67 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2223.2,2223.114 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2159.16,2161.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2171.41,2173.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2175.34,2176.44 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2179.3,2184.24 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2176.44,2177.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2184.24,2186.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2189.4,2189.38 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2186.18,2187.15 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2193.38,2195.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2200.34,2201.44 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2204.3,2204.28 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2201.44,2203.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2212.15,2213.50 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2213.50,2215.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2217.67,2218.47 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2221.3,2221.24 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2218.47,2220.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2228.118,2230.35 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2233.2,2233.29 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2236.2,2243.37 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2246.2,2246.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2251.2,2252.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2258.2,2263.25 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2272.2,2272.63 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2281.2,2286.29 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2289.2,2290.29 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2293.2,2296.19 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2299.2,2300.16 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2306.2,2307.35 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2314.2,2320.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2325.2,2325.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2230.35,2232.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2233.29,2235.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2243.37,2245.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2247.30,2247.30 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2248.10,2248.10 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2252.9,2257.3 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2263.25,2267.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2272.63,2280.3 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2286.29,2288.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2290.29,2292.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2296.19,2298.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2300.16,2305.3 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2307.35,2309.55 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2312.3,2312.16 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2309.55,2310.14 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2321.31,2321.31 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2322.20,2322.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2323.19,2323.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2330.82,2335.13 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2338.2,2338.47 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2335.13,2337.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2343.82,2345.33 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2348.2,2355.37 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2358.2,2358.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2363.2,2364.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2370.2,2375.25 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2384.2,2384.25 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2393.2,2401.44 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2422.2,2427.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2432.2,2432.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2345.33,2347.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2355.37,2357.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2359.30,2359.30 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2360.10,2360.10 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2364.9,2369.3 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2375.25,2379.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2384.25,2392.3 5 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2401.44,2407.67 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2410.3,2410.26 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2416.3,2419.43 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2407.67,2409.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2410.26,2413.12 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2428.31,2428.31 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2429.20,2429.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2430.19,2430.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2437.118,2444.33 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2448.2,2448.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2454.2,2454.29 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2457.2,2464.37 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2467.2,2467.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2472.2,2473.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2479.2,2484.25 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2492.2,2492.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2498.2,2498.37 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2508.2,2508.22 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2515.2,2520.35 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2560.2,2569.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2574.2,2574.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2444.33,2447.3 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2448.32,2449.32 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2452.3,2452.28 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2449.32,2451.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2454.29,2456.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2464.37,2466.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2468.30,2468.30 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2469.10,2469.10 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2473.9,2478.3 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2484.25,2488.3 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2492.31,2497.3 4 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2498.37,2503.3 4 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2508.22,2514.3 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2520.35,2523.33 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2526.3,2527.25 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2532.3,2533.22 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2523.33,2525.4 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2527.25,2528.31 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2528.31,2530.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2533.22,2537.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2537.18,2541.5 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2542.9,2548.21 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2551.4,2552.18 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2548.21,2550.5 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2552.18,2556.5 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2570.31,2570.31 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2571.20,2571.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2572.19,2572.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2579.82,2581.33 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2584.2,2591.37 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2594.2,2594.9 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2599.2,2600.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2606.2,2611.25 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2620.2,2620.25 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2629.2,2637.44 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2658.2,2664.9 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2669.2,2669.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2581.33,2583.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2591.37,2593.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2595.30,2595.30 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2596.10,2596.10 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2600.9,2605.3 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2611.25,2615.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2620.25,2628.3 5 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2637.44,2643.67 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2646.3,2646.26 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2652.3,2655.51 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2643.67,2645.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2646.26,2649.12 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2665.31,2665.31 0 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2666.20,2666.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2667.19,2667.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2674.86,2676.33 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2679.2,2686.37 4 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2689.2,2689.9 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2694.2,2695.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2701.2,2706.25 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2715.2,2715.25 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2724.2,2732.44 5 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2753.2,2758.9 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2763.2,2763.12 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2676.33,2678.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2686.37,2688.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2690.30,2690.30 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2691.10,2691.10 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2695.9,2700.3 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2706.25,2710.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2715.25,2723.3 5 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2732.44,2738.67 4 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2741.3,2741.26 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2747.3,2750.51 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2738.67,2740.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2741.26,2744.12 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2759.31,2759.31 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2760.20,2760.20 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2761.19,2761.19 0 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2770.66,2771.21 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2781.2,2781.21 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2786.2,2786.54 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2790.2,2790.12 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2771.21,2773.58 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2776.3,2779.80 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2773.58,2775.4 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2781.21,2785.3 3 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2786.54,2789.3 2 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2797.37,2798.22 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2802.2,2802.29 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2798.22,2801.3 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2806.49,2808.53 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2812.2,2813.17 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2816.2,2817.31 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2820.2,2821.32 2 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2824.2,2830.20 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2833.2,2844.108 4 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2808.53,2810.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2813.17,2815.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2817.31,2819.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2821.32,2823.3 1 0 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2830.20,2832.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2848.49,2850.53 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2853.2,2863.81 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2850.53,2852.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2869.75,2870.29 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2873.2,2875.23 3 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2879.2,2879.45 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2870.29,2872.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2875.23,2878.3 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2890.34,2892.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2894.44,2896.2 1 1 -github.com/ethereum/go-ethereum/eth/protocols/snap/sync.go:2898.39,2901.2 2 1 -github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:12.116,14.110 2 0 -github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:17.2,17.22 1 0 -github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:14.110,16.3 1 0 -github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:21.101,24.28 3 0 -github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:27.2,27.15 1 0 -github.com/ethereum/go-ethereum/ethclient/bor_ethclient.go:24.28,26.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:40.43,42.2 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:44.71,46.16 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:49.2,49.26 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:46.16,48.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:53.39,55.2 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:57.27,59.2 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:64.66,67.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:70.2,70.33 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:67.16,69.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:77.92,79.2 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:81.138,84.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:87.2,87.16 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:84.16,86.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:95.93,97.2 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:100.68,104.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:112.107,115.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:121.2,123.51 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:126.2,126.51 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:130.2,130.73 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:133.2,133.74 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:136.2,136.71 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:140.2,141.31 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:164.2,165.39 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:171.2,171.66 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:115.16,117.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:117.8,117.26 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:117.26,119.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:123.51,125.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:126.51,128.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:130.73,132.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:133.74,135.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:136.71,138.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:141.31,144.23 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:151.3,151.58 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:154.3,154.23 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:144.23,150.4 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:151.58,153.4 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:154.23,155.28 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:158.4,158.24 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:155.28,157.5 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:158.24,160.5 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:165.39,166.21 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:169.3,169.17 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:166.21,168.4 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:175.94,178.31 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:181.2,181.18 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:178.31,180.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:186.95,189.31 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:192.2,192.18 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:189.31,191.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:206.59,207.52 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:210.2,210.45 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:207.52,209.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:214.127,217.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:224.2,224.47 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:227.2,227.46 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:217.16,219.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:219.8,219.24 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:219.24,221.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:221.8,221.62 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:221.62,223.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:224.47,226.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:236.136,239.16 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:244.2,248.123 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:251.2,251.60 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:254.2,254.23 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:239.16,241.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:248.123,250.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:251.60,253.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:258.94,262.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:265.122,268.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:271.2,271.17 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:276.2,276.47 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:279.2,279.21 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:268.16,270.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:271.17,273.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:273.8,273.62 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:273.62,275.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:276.47,278.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:284.103,287.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:292.2,292.15 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:287.16,288.15 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:288.15,290.4 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:297.85,299.67 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:303.2,304.54 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:307.2,308.48 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:311.2,311.32 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:299.67,301.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:304.54,306.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:308.48,310.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:316.113,318.2 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:323.68,326.67 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:329.2,329.46 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:332.2,332.21 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:326.67,328.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:329.46,331.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:337.114,341.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:345.129,349.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:353.109,357.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:361.110,365.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:370.96,373.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:376.2,377.20 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:373.16,375.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:381.136,383.16 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:386.2,386.48 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:383.16,385.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:389.63,394.24 2 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:407.2,407.17 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:394.24,396.45 2 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:396.45,398.4 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:399.8,400.25 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:405.3,405.44 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:400.25,402.4 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:402.9,404.4 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:413.99,417.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:420.114,424.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:427.94,431.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:435.95,439.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:442.78,446.2 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:456.113,459.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:462.2,462.17 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:459.16,461.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:467.120,470.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:473.2,473.17 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:470.16,472.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:478.98,481.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:484.2,484.17 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:481.16,483.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:489.74,491.68 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:494.2,494.30 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:491.68,493.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:499.75,501.80 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:504.2,504.30 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:501.80,503.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:511.90,514.16 3 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:517.2,517.25 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:514.16,516.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:524.85,526.16 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:529.2,529.83 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:526.16,528.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:532.44,533.19 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:536.2,537.30 2 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:540.2,540.34 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:533.19,535.3 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:537.30,539.3 1 1 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:543.50,548.23 2 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:551.2,551.22 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:554.2,554.18 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:557.2,557.25 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:560.2,560.12 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:548.23,550.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:551.22,553.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:554.18,556.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:557.25,559.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:586.63,587.14 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:590.2,608.3 1 0 -github.com/ethereum/go-ethereum/ethclient/ethclient.go:587.14,589.3 1 0 -github.com/ethereum/go-ethereum/ethclient/signer.go:37.89,40.2 1 0 -github.com/ethereum/go-ethereum/ethclient/signer.go:42.59,45.2 2 0 -github.com/ethereum/go-ethereum/ethclient/signer.go:47.82,48.34 1 0 -github.com/ethereum/go-ethereum/ethclient/signer.go:51.2,51.20 1 0 -github.com/ethereum/go-ethereum/ethclient/signer.go:48.34,50.3 1 0 -github.com/ethereum/go-ethereum/ethclient/signer.go:54.47,55.43 1 0 -github.com/ethereum/go-ethereum/ethclient/signer.go:57.68,58.43 1 0 -github.com/ethereum/go-ethereum/ethclient/signer.go:60.109,61.43 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:43.31,45.35 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:48.2,48.33 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:45.35,47.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:54.13,55.44 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:59.2,59.44 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:55.44,58.3 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:68.54,76.2 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:79.44,83.2 3 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:86.51,90.2 3 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:99.54,102.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:103.2,105.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:106.2,108.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:109.2,109.33 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:102.51,102.88 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:105.51,105.95 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:108.51,108.96 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:118.57,119.18 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:122.2,122.30 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:128.2,128.32 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:134.2,134.44 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:119.18,121.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:122.30,127.3 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:128.32,133.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:138.55,139.48 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:145.2,145.58 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:139.48,144.3 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:150.58,154.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:162.2,165.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:172.2,172.34 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:154.51,161.3 5 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:165.51,171.3 4 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:181.48,182.44 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:188.2,188.35 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:182.44,187.3 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:193.57,196.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:197.2,200.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:207.2,207.31 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:196.51,196.98 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:200.51,206.3 4 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:217.54,221.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:225.2,228.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:232.2,235.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:242.2,245.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:255.2,258.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:262.2,262.33 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:221.51,224.3 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:228.51,231.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:235.51,241.3 4 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:245.51,254.3 6 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:258.51,261.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:272.60,276.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:281.2,284.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:289.2,292.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:296.2,299.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:306.2,306.35 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:276.51,280.3 3 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:284.51,288.3 3 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:292.51,295.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:299.51,305.3 4 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:318.24,325.2 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:327.49,330.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:331.2,333.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:334.2,336.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:337.2,339.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:340.2,342.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:343.2,345.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:353.2,353.35 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:330.51,330.87 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:333.51,333.88 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:336.51,336.86 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:339.51,339.88 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:342.51,342.87 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:345.51,346.21 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:351.3,351.11 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:346.21,348.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:348.9,350.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:362.36,366.2 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:368.55,371.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:372.2,374.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:375.2,377.51 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:385.2,385.35 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:371.51,371.91 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:374.51,374.89 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:377.51,378.26 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:383.3,383.11 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:378.26,380.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:380.9,382.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:427.79,428.37 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:431.2,431.16 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:434.2,450.38 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:459.2,459.73 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:463.2,463.74 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:474.2,474.77 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:485.2,485.78 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:499.2,499.79 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:521.2,521.81 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:532.2,532.73 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:550.2,550.64 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:554.2,559.60 4 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:562.2,564.61 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:567.2,573.25 6 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:576.2,600.58 15 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:601.2,603.58 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:604.2,606.58 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:607.2,609.58 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:610.2,612.58 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:613.2,615.58 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:623.2,636.20 9 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:428.37,430.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:431.16,433.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:450.38,453.36 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:453.36,456.4 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:459.73,462.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:463.74,465.49 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:470.3,472.11 3 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:465.49,467.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:467.9,469.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:474.77,476.49 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:481.3,483.11 3 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:476.49,478.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:478.9,480.4 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:485.78,487.49 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:492.3,497.11 5 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:487.49,489.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:489.9,491.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:499.79,501.49 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:507.3,510.49 3 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:515.3,519.11 5 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:501.49,503.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:503.9,505.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:510.49,512.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:512.9,514.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:521.81,523.46 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:529.3,530.11 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:523.46,524.17 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:524.17,527.5 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:532.73,539.50 5 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:546.3,547.11 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:539.50,545.4 3 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:550.64,553.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:559.60,561.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:564.61,566.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:573.25,575.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:600.58,600.101 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:603.58,603.102 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:606.58,606.103 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:609.58,609.104 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:612.58,612.105 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:615.58,616.31 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:621.3,621.11 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:616.31,618.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:618.9,620.4 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:640.38,643.2 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:647.95,650.27 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:653.2,656.15 3 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:661.2,661.11 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:667.2,671.39 4 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:675.2,675.54 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:650.27,652.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:656.15,659.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:661.11,663.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:671.39,674.3 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:678.49,680.2 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:683.143,686.12 3 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:689.2,707.16 14 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:710.2,710.40 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:686.12,688.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:707.16,709.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:714.138,715.21 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:718.2,718.20 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:722.2,722.43 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:727.2,739.16 11 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:744.2,744.63 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:715.21,717.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:718.20,720.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:722.43,726.3 3 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:739.16,742.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:744.63,746.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:750.124,751.20 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:755.2,758.64 3 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:751.20,753.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:758.64,760.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:764.92,769.16 4 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:769.16,771.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:775.132,776.26 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:779.2,779.20 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:783.2,783.43 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:788.2,794.18 7 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:798.2,798.60 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:776.26,778.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:779.20,781.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:783.43,786.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:794.18,796.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:798.60,800.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:805.76,806.26 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:810.2,810.43 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:815.2,818.16 4 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:823.2,823.65 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:806.26,808.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:810.43,813.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:818.16,821.3 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:823.65,825.3 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:829.59,833.32 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:836.2,840.16 3 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:844.2,847.24 3 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:833.32,835.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:840.16,842.3 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:851.69,854.2 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:856.55,857.27 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:858.14,859.26 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:860.14,861.22 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:862.14,864.44 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:865.22,867.35 2 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:868.16,869.23 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:870.11,871.19 1 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:872.12,873.20 1 1 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:874.19,876.35 2 0 -github.com/ethereum/go-ethereum/eth/tracers/js/tracer.go:877.10,878.50 1 0 -github.com/ethereum/go-ethereum/core/vm/runtime/env.go:24.34,42.2 3 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:53.31,54.28 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:74.2,74.27 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:77.2,77.21 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:80.2,80.23 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:83.2,83.25 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:86.2,86.22 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:89.2,89.28 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:92.2,92.26 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:97.2,97.24 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:54.28,72.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:74.27,76.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:77.21,79.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:80.23,82.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:83.25,85.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:86.22,88.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:89.28,91.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:92.26,93.46 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:93.46,95.4 1 0 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:97.24,99.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:107.79,108.16 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:111.2,113.22 2 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:116.2,121.108 2 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:124.2,136.28 4 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:108.16,110.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:113.22,115.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:121.108,123.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:140.80,141.16 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:144.2,146.22 2 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:149.2,153.108 2 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:157.2,163.40 2 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:141.16,143.3 1 0 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:146.22,148.3 1 0 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:153.108,155.3 1 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:171.86,179.108 5 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:183.2,190.30 2 1 -github.com/ethereum/go-ethereum/core/vm/runtime/runtime.go:179.108,181.3 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:54.22,58.2 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:62.37,66.2 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:70.35,76.2 4 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:79.51,83.18 3 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:86.2,87.16 2 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:83.18,85.3 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:91.53,95.18 3 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:98.2,98.41 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:101.2,101.33 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:95.18,97.3 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:98.41,100.3 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:105.57,109.18 3 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:112.2,113.12 2 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:109.18,111.3 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:117.46,121.18 3 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:124.2,125.12 2 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:121.18,123.3 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:130.44,134.2 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:137.60,141.2 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:146.77,158.25 4 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:167.2,168.27 2 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:171.2,174.3 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:158.25,159.34 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:162.3,162.16 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:159.34,160.12 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:162.16,164.4 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:168.27,170.3 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:180.59,182.2 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:185.59,187.2 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:191.63,193.2 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:199.31,204.2 3 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:223.46,227.2 3 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:230.42,234.2 3 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:237.33,239.2 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:242.31,246.36 3 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:253.2,253.12 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:246.36,247.22 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:251.3,251.49 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:247.22,249.12 2 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:257.25,260.2 2 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:263.54,264.36 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:275.2,275.12 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:264.36,265.22 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:271.3,271.61 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:265.22,266.49 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:269.4,269.12 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:266.49,268.5 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:271.61,273.4 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:289.33,291.16 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:296.2,296.22 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:300.2,300.25 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:291.16,294.3 2 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:296.22,299.3 2 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:305.35,307.2 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:312.34,313.22 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:316.2,316.12 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:313.22,315.3 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:322.36,323.24 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:326.2,326.12 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:323.24,325.3 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:331.31,333.2 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:343.42,348.30 4 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:351.2,351.30 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:348.30,350.3 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:356.53,360.20 3 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:363.2,364.16 2 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:360.20,362.3 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:369.55,373.20 3 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:376.2,376.43 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:379.2,379.33 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:373.20,375.3 1 0 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:376.43,378.3 1 1 -github.com/ethereum/go-ethereum/ethdb/memorydb/memorydb.go:384.33,389.2 3 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:42.33,44.2 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:48.122,55.95 3 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:58.2,58.69 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:55.95,57.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:81.134,103.38 6 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:110.2,118.21 2 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:103.38,109.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:140.160,147.2 3 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:150.72,154.2 3 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:157.76,161.2 3 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:166.71,168.2 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:171.75,175.2 3 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:178.125,180.2 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:182.44,183.19 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:186.2,187.30 2 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:190.2,190.34 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:183.19,185.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:187.30,189.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:193.50,198.23 2 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:201.2,201.22 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:204.2,204.18 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:207.2,207.25 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:210.2,210.12 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:198.23,200.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:201.22,203.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:204.18,206.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:207.25,209.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:213.79,214.22 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:217.2,225.41 3 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:234.2,234.16 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:214.22,216.3 1 0 -github.com/ethereum/go-ethereum/ethclient/gethclient/gethclient.go:225.41,233.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:87.99,88.63 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:88.63,90.23 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:93.3,93.27 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:97.3,100.15 4 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:90.23,92.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:93.27,95.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:100.15,102.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:109.104,114.22 5 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:117.2,121.59 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:124.2,124.16 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:128.2,149.17 15 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:114.22,116.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:121.59,123.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:124.16,126.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:153.68,160.24 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:163.2,163.16 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:160.24,162.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:168.35,172.24 3 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:180.2,180.22 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:172.24,175.32 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:178.3,178.20 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:175.32,177.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:184.51,186.2 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:189.53,191.16 2 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:194.2,194.17 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:191.16,193.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:198.57,200.2 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:203.46,205.2 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:209.44,214.2 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:217.60,222.2 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:227.77,229.2 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:236.59,238.16 2 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:241.2,241.33 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:238.16,240.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:245.59,247.2 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:256.63,258.2 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:261.35,263.2 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:282.50,285.25 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:289.2,306.46 6 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:462.2,462.17 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:465.2,465.14 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:285.25,287.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:306.46,309.17 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:315.3,316.70 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:319.3,319.22 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:324.3,327.46 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:330.3,330.30 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:346.3,346.30 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:349.3,349.30 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:352.3,352.30 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:355.3,355.31 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:359.3,360.17 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:365.3,371.127 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:376.3,377.17 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:382.3,382.33 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:385.3,385.32 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:390.3,391.67 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:395.3,399.17 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:404.3,406.21 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:411.3,411.82 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:416.3,416.84 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:421.3,421.30 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:424.3,424.31 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:427.3,430.17 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:436.3,442.167 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:447.3,453.10 5 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:309.17,312.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:316.70,318.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:319.22,322.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:327.46,329.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:330.30,332.23 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:335.4,335.40 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:332.23,333.10 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:335.40,337.19 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:342.5,342.35 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:337.19,340.14 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:346.30,348.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:349.30,351.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:352.30,354.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:355.31,357.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:360.17,363.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:371.127,374.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:377.17,380.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:382.33,384.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:385.32,387.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:391.67,394.4 2 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:399.17,402.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:406.21,409.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:411.82,414.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:416.84,419.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:421.30,423.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:424.31,426.4 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:430.17,433.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:442.167,445.12 3 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:454.29,454.29 0 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:456.18,457.24 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:462.17,464.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:477.46,481.2 3 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:484.42,488.2 3 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:491.33,493.2 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:496.31,498.2 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:501.25,504.2 2 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:507.54,509.2 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:518.43,520.22 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:523.2,523.38 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:520.22,522.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:527.39,529.22 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:532.2,532.34 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:529.22,531.3 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:538.57,542.2 3 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:551.53,553.2 1 0 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:557.55,559.2 1 1 -github.com/ethereum/go-ethereum/ethdb/leveldb/leveldb.go:563.33,565.2 1 0 -github.com/ethereum/go-ethereum/event/event.go:53.74,57.17 4 1 -github.com/ethereum/go-ethereum/event/event.go:78.2,78.12 1 1 -github.com/ethereum/go-ethereum/event/event.go:57.17,62.3 2 1 -github.com/ethereum/go-ethereum/event/event.go:62.8,63.22 1 1 -github.com/ethereum/go-ethereum/event/event.go:66.3,66.27 1 1 -github.com/ethereum/go-ethereum/event/event.go:63.22,65.4 1 1 -github.com/ethereum/go-ethereum/event/event.go:66.27,69.32 3 1 -github.com/ethereum/go-ethereum/event/event.go:72.4,75.25 4 1 -github.com/ethereum/go-ethereum/event/event.go:69.32,70.70 1 1 -github.com/ethereum/go-ethereum/event/event.go:83.48,90.17 4 1 -github.com/ethereum/go-ethereum/event/event.go:94.2,96.27 3 1 -github.com/ethereum/go-ethereum/event/event.go:99.2,99.12 1 1 -github.com/ethereum/go-ethereum/event/event.go:90.17,93.3 2 1 -github.com/ethereum/go-ethereum/event/event.go:96.27,98.3 1 1 -github.com/ethereum/go-ethereum/event/event.go:105.28,108.32 3 1 -github.com/ethereum/go-ethereum/event/event.go:113.2,114.20 2 1 -github.com/ethereum/go-ethereum/event/event.go:108.32,109.28 1 1 -github.com/ethereum/go-ethereum/event/event.go:109.28,111.4 1 1 -github.com/ethereum/go-ethereum/event/event.go:117.49,120.34 3 1 -github.com/ethereum/go-ethereum/event/event.go:120.34,121.37 1 1 -github.com/ethereum/go-ethereum/event/event.go:121.37,122.22 1 1 -github.com/ethereum/go-ethereum/event/event.go:122.22,124.5 1 1 -github.com/ethereum/go-ethereum/event/event.go:124.10,126.5 1 1 -github.com/ethereum/go-ethereum/event/event.go:131.72,132.26 1 1 -github.com/ethereum/go-ethereum/event/event.go:137.2,137.11 1 1 -github.com/ethereum/go-ethereum/event/event.go:132.26,133.16 1 1 -github.com/ethereum/go-ethereum/event/event.go:133.16,135.4 1 1 -github.com/ethereum/go-ethereum/event/event.go:140.78,145.2 4 1 -github.com/ethereum/go-ethereum/event/event.go:163.48,172.2 2 1 -github.com/ethereum/go-ethereum/event/event.go:174.59,176.2 1 1 -github.com/ethereum/go-ethereum/event/event.go:178.45,181.2 2 1 -github.com/ethereum/go-ethereum/event/event.go:183.45,187.2 3 0 -github.com/ethereum/go-ethereum/event/event.go:189.43,192.14 3 1 -github.com/ethereum/go-ethereum/event/event.go:195.2,201.15 6 1 -github.com/ethereum/go-ethereum/event/event.go:192.14,194.3 1 1 -github.com/ethereum/go-ethereum/event/event.go:204.60,206.33 1 1 -github.com/ethereum/go-ethereum/event/event.go:210.2,213.9 3 1 -github.com/ethereum/go-ethereum/event/event.go:206.33,208.3 1 1 -github.com/ethereum/go-ethereum/event/event.go:214.24,214.24 0 1 -github.com/ethereum/go-ethereum/event/event.go:215.19,215.19 0 1 -github.com/ethereum/go-ethereum/event/feed.go:56.39,58.2 1 0 -github.com/ethereum/go-ethereum/event/feed.go:60.23,65.2 4 1 -github.com/ethereum/go-ethereum/event/feed.go:72.60,77.78 4 1 -github.com/ethereum/go-ethereum/event/feed.go:80.2,84.34 4 1 -github.com/ethereum/go-ethereum/event/feed.go:89.2,91.12 3 1 -github.com/ethereum/go-ethereum/event/feed.go:77.78,78.23 1 1 -github.com/ethereum/go-ethereum/event/feed.go:84.34,85.102 1 1 -github.com/ethereum/go-ethereum/event/feed.go:95.49,96.20 1 1 -github.com/ethereum/go-ethereum/event/feed.go:100.2,100.23 1 1 -github.com/ethereum/go-ethereum/event/feed.go:96.20,99.3 2 1 -github.com/ethereum/go-ethereum/event/feed.go:103.37,109.17 4 1 -github.com/ethereum/go-ethereum/event/feed.go:114.2,116.9 2 1 -github.com/ethereum/go-ethereum/event/feed.go:109.17,113.3 3 1 -github.com/ethereum/go-ethereum/event/feed.go:117.25,117.25 0 1 -github.com/ethereum/go-ethereum/event/feed.go:119.20,122.27 2 1 -github.com/ethereum/go-ethereum/event/feed.go:128.52,139.33 7 1 -github.com/ethereum/go-ethereum/event/feed.go:144.2,147.55 2 1 -github.com/ethereum/go-ethereum/event/feed.go:154.2,155.6 2 1 -github.com/ethereum/go-ethereum/event/feed.go:185.2,185.55 1 1 -github.com/ethereum/go-ethereum/event/feed.go:188.2,189.14 2 1 -github.com/ethereum/go-ethereum/event/feed.go:139.33,142.70 3 1 -github.com/ethereum/go-ethereum/event/feed.go:147.55,149.3 1 1 -github.com/ethereum/go-ethereum/event/feed.go:155.6,159.50 1 1 -github.com/ethereum/go-ethereum/event/feed.go:166.3,166.37 1 1 -github.com/ethereum/go-ethereum/event/feed.go:170.3,171.38 2 1 -github.com/ethereum/go-ethereum/event/feed.go:159.50,160.37 1 1 -github.com/ethereum/go-ethereum/event/feed.go:160.37,164.5 3 1 -github.com/ethereum/go-ethereum/event/feed.go:166.37,167.9 1 1 -github.com/ethereum/go-ethereum/event/feed.go:171.38,174.40 3 1 -github.com/ethereum/go-ethereum/event/feed.go:174.40,177.5 1 1 -github.com/ethereum/go-ethereum/event/feed.go:178.9,181.4 2 1 -github.com/ethereum/go-ethereum/event/feed.go:185.55,187.3 1 1 -github.com/ethereum/go-ethereum/event/feed.go:199.35,200.24 1 1 -github.com/ethereum/go-ethereum/event/feed.go:200.24,203.3 2 1 -github.com/ethereum/go-ethereum/event/feed.go:206.40,208.2 1 1 -github.com/ethereum/go-ethereum/event/feed.go:213.50,214.25 1 1 -github.com/ethereum/go-ethereum/event/feed.go:219.2,219.11 1 1 -github.com/ethereum/go-ethereum/event/feed.go:214.25,215.38 1 1 -github.com/ethereum/go-ethereum/event/feed.go:215.38,217.4 1 1 -github.com/ethereum/go-ethereum/event/feed.go:223.47,225.2 1 1 -github.com/ethereum/go-ethereum/event/feed.go:228.51,232.2 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:49.73,51.12 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:63.2,63.10 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:51.12,56.22 5 1 -github.com/ethereum/go-ethereum/event/subscription.go:56.22,57.18 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:60.4,60.25 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:57.18,59.5 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:73.33,75.20 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:79.2,83.9 4 1 -github.com/ethereum/go-ethereum/event/subscription.go:75.20,78.3 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:86.38,88.2 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:97.77,98.93 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:98.93,100.3 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:117.83,127.2 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:144.40,145.24 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:145.24,148.3 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:151.45,153.2 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:155.33,158.12 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:158.12,160.17 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:163.3,164.20 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:160.17,161.9 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:168.51,171.6 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:171.6,174.13 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:179.3,179.10 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:174.13,178.4 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:180.28,182.18 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:189.4,189.23 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:192.18,195.14 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:182.18,183.19 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:186.5,186.15 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:183.19,184.76 1 0 -github.com/ethereum/go-ethereum/event/subscription.go:189.23,191.5 1 0 -github.com/ethereum/go-ethereum/event/subscription.go:200.62,202.9 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:203.26,205.20 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:206.17,207.14 1 0 -github.com/ethereum/go-ethereum/event/subscription.go:211.45,212.58 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:221.2,223.9 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:212.58,214.3 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:214.8,216.32 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:216.32,218.4 1 0 -github.com/ethereum/go-ethereum/event/subscription.go:224.13,225.15 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:226.17,227.14 1 0 -github.com/ethereum/go-ethereum/event/subscription.go:252.65,255.15 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:258.2,258.20 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:261.2,263.11 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:255.15,257.3 1 0 -github.com/ethereum/go-ethereum/event/subscription.go:258.20,260.3 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:268.38,271.15 3 1 -github.com/ethereum/go-ethereum/event/subscription.go:274.2,275.25 2 1 -github.com/ethereum/go-ethereum/event/subscription.go:278.2,278.15 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:271.15,273.3 1 0 -github.com/ethereum/go-ethereum/event/subscription.go:275.25,277.3 1 1 -github.com/ethereum/go-ethereum/event/subscription.go:283.42,287.2 3 0 -github.com/ethereum/go-ethereum/event/subscription.go:289.34,294.2 4 1 -github.com/ethereum/go-ethereum/event/subscription.go:296.39,298.2 1 1 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:94.51,96.2 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:142.62,144.2 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:147.54,152.2 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:155.53,160.2 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:163.37,167.2 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:172.63,176.48 3 1 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:179.2,182.21 3 1 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:185.2,186.33 2 1 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:190.2,190.44 1 1 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:176.48,178.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:182.21,184.3 1 1 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:186.33,188.3 1 1 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:194.87,196.16 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:199.2,211.12 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:196.16,198.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:215.33,227.2 9 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:230.32,235.2 4 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:239.135,247.12 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:290.2,294.36 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:298.2,301.6 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:247.12,251.7 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:286.3,286.16 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:251.7,252.11 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:254.31,255.12 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:261.38,262.12 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:268.21,269.57 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:272.5,274.12 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:280.25,281.21 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:282.27,283.21 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:256.31,256.31 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:257.13,257.13 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:263.32,263.32 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:264.13,264.13 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:269.57,270.14 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:275.29,275.29 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:276.13,276.13 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:294.36,296.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:301.6,302.10 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:303.17,304.10 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:305.21,314.29 5 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:322.4,322.18 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:328.4,328.39 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:334.4,337.40 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:344.4,346.19 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:381.4,385.21 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:314.29,317.19 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:317.19,319.11 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:322.18,325.13 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:328.39,332.13 4 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:337.40,341.13 4 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:346.19,347.12 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:348.19,352.12 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:354.25,355.42 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:358.29,359.55 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:362.27,363.53 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:366.6,366.49 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:370.34,371.65 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:375.17,376.49 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:355.42,357.7 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:359.55,361.7 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:363.53,365.7 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:366.49,368.7 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:371.65,373.7 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:376.49,378.7 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:394.47,398.6 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:398.6,401.46 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:406.3,407.98 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:415.3,416.52 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:420.3,421.28 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:425.3,426.10 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:431.3,431.54 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:443.3,443.52 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:476.3,476.48 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:401.46,404.4 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:407.98,408.84 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:412.4,412.12 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:408.84,411.5 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:416.52,419.4 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:421.28,424.4 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:426.10,429.4 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:431.54,432.11 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:433.32,435.13 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:436.12,439.11 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:443.52,446.11 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:454.4,455.11 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:460.4,461.29 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:469.4,469.11 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:446.11,448.12 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:452.5,452.13 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:449.26,449.26 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:450.13,450.13 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:455.11,458.5 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:461.29,463.12 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:467.5,467.27 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:463.12,466.6 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:470.29,471.13 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:472.12,472.12 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:504.50,509.43 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:512.2,513.49 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:518.2,538.46 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:542.2,543.98 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:546.2,546.12 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:509.43,511.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:513.49,515.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:515.8,517.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:538.46,540.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:543.98,545.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:552.51,553.46 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:556.2,556.49 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:559.2,559.46 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:562.2,562.44 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:565.2,565.12 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:553.46,555.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:556.49,558.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:559.46,561.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:562.44,564.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:570.58,580.45 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:584.2,584.9 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:591.2,602.30 4 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:580.45,582.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:585.18,585.18 0 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:587.37,589.38 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:631.51,632.53 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:635.2,635.26 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:632.53,634.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:639.76,654.2 5 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:658.70,669.8 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:693.2,709.3 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:669.8,670.19 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:673.3,677.43 4 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:680.3,680.26 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:670.19,672.4 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:677.43,679.4 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:681.8,683.19 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:688.3,689.20 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:683.19,685.4 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:685.9,687.4 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:714.73,717.19 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:732.2,733.33 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:754.2,754.22 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:759.2,766.31 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:717.19,720.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:720.8,724.16 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:727.3,727.50 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:724.16,726.4 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:727.50,729.4 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:733.33,737.9 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:745.3,745.19 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:750.3,751.8 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:737.9,739.4 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:739.9,740.107 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:740.107,742.5 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:745.19,747.12 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:754.22,756.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:756.8,758.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:776.58,792.2 5 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:800.44,807.2 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:816.99,820.48 2 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:823.2,823.48 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:827.2,834.31 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:820.48,822.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:823.48,825.3 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:850.56,860.8 3 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:877.2,894.31 4 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:860.8,869.69 7 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:869.69,871.4 1 0 -github.com/ethereum/go-ethereum/ethstats/ethstats.go:872.8,875.3 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:83.65,88.2 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:92.52,97.2 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:99.41,111.45 5 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:115.2,117.33 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:111.45,113.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:117.33,119.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:124.49,134.2 6 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:138.38,149.31 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:171.2,171.36 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:174.2,178.31 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:149.31,151.71 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:156.3,156.71 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:164.3,164.45 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:151.71,154.4 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:156.71,161.12 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:164.45,167.12 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:171.36,173.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:178.31,180.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:185.84,194.18 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:198.2,198.12 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:194.18,197.3 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:206.31,207.6 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:207.6,209.10 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:214.3,218.34 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:223.3,223.17 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:210.21,210.21 0 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:211.41,211.41 0 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:218.34,222.4 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:228.58,230.2 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:233.51,235.2 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:239.73,244.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:247.2,247.16 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:253.2,254.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:258.2,258.12 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:244.16,246.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:247.16,249.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:254.16,257.3 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:263.79,269.12 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:273.2,273.50 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:269.12,271.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:277.117,283.12 4 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:287.2,288.57 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:283.12,285.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:294.126,296.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:299.2,300.42 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:296.16,298.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:305.150,307.16 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:310.2,313.49 3 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:307.16,309.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:317.73,319.2 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:322.53,324.44 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:330.2,330.12 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:324.44,327.3 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:327.8,329.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:340.101,342.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:346.2,349.11 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:359.2,359.17 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:365.2,366.12 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:342.16,344.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:349.11,350.21 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:357.3,357.17 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:350.21,355.4 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:359.17,362.3 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:362.8,364.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:370.72,376.2 5 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:378.102,380.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:383.2,384.20 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:380.16,382.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:387.85,390.9 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:391.17,391.17 0 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:393.13,399.29 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:403.3,403.17 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:399.29,402.4 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:409.77,411.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:416.2,418.21 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:411.16,413.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:422.110,424.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:427.2,428.55 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:433.2,433.45 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:424.16,426.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:428.55,430.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:430.8,432.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:437.104,439.41 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:442.2,442.16 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:445.2,448.38 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:453.2,453.41 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:439.41,441.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:442.16,444.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:448.38,452.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:457.102,462.38 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:467.2,467.38 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:462.38,466.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:470.86,472.73 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:475.2,477.15 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:472.73,474.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:481.88,483.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:486.2,486.60 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:483.16,485.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:491.99,493.16 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:496.2,498.15 3 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:493.16,495.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:502.35,504.19 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/keystore.go:504.19,506.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:83.95,86.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:89.2,90.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:94.2,94.25 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:97.2,97.17 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:86.16,88.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:90.16,92.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:94.25,96.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:101.81,104.2 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:106.85,108.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:112.2,113.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:116.2,116.33 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:130.2,130.37 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:108.16,110.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:113.16,115.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:116.33,119.17 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:119.17,128.4 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:133.63,134.30 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:137.2,137.48 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:134.30,136.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:141.81,144.58 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:147.2,148.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:151.2,154.56 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:157.2,158.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:161.2,181.26 10 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:144.58,145.59 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:148.16,150.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:154.56,155.59 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:158.16,160.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:186.78,189.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:192.2,198.41 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:189.16,191.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:202.60,205.52 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:209.2,213.64 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:227.2,227.16 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:230.2,232.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:235.2,239.8 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:205.52,207.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:213.64,215.52 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:218.3,218.47 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:215.52,217.4 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:219.8,221.52 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:224.3,224.47 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:221.52,223.4 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:227.16,229.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:232.16,234.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:242.72,243.40 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:246.2,247.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:251.2,252.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:256.2,257.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:261.2,262.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:266.2,267.38 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:271.2,272.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:275.2,275.23 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:243.40,245.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:247.16,249.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:252.16,254.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:257.16,259.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:262.16,264.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:267.38,269.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:272.16,274.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:278.109,279.37 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:282.2,283.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:286.2,288.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:291.2,291.30 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:279.37,281.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:283.16,285.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:288.16,290.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:294.109,296.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:299.2,301.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:305.2,306.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:310.2,311.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:315.2,316.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:320.2,321.38 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:325.2,326.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:329.2,329.30 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:296.16,298.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:301.16,303.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:306.16,308.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:311.16,313.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:316.16,318.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:321.38,323.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:326.16,328.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:332.68,335.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:338.2,340.36 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:356.2,356.63 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:335.16,337.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:340.36,346.3 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:346.8,346.39 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:346.39,349.27 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:352.3,353.18 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:349.27,351.4 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:362.35,364.9 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:367.2,367.12 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/passphrase.go:364.9,366.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:32.90,34.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:37.2,39.56 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:42.2,42.25 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:45.2,45.17 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:34.16,36.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:39.56,41.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:42.25,44.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:48.80,50.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:53.2,53.40 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:50.16,52.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:56.58,57.30 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:60.2,60.48 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/plain.go:57.30,59.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:35.107,37.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:40.2,41.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:44.2,52.20 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:37.16,39.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:41.16,43.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:55.83,63.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:66.2,67.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:70.2,70.28 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:73.2,85.16 6 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:88.2,98.33 6 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:101.2,101.17 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:63.16,65.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:67.16,69.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:70.28,72.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:85.16,87.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:98.33,100.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:104.56,107.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:110.2,113.21 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:107.16,109.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:116.64,118.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:121.2,125.22 5 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:128.2,128.23 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:118.16,120.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:125.22,127.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:132.35,133.18 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:137.2,138.55 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:144.2,144.56 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:149.2,149.34 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:133.18,135.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:138.55,140.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:140.8,140.25 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:140.25,142.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:144.56,145.23 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/presale.go:145.23,147.4 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:40.86,45.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:48.2,58.27 7 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:76.2,88.39 8 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:45.16,47.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:58.27,61.21 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:66.3,69.33 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:72.3,72.33 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:61.21,63.12 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:69.33,71.4 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:72.33,74.4 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:92.38,94.76 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:98.2,98.46 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:101.2,101.14 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:94.76,96.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/file_cache.go:98.46,100.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:94.51,103.2 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:105.51,108.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:112.2,114.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:117.2,119.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:122.2,123.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:127.2,130.12 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:108.16,110.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:114.16,116.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:119.16,121.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:123.16,125.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:133.62,135.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:138.2,143.12 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:135.16,136.62 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:149.47,152.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:155.2,157.16 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:160.2,161.51 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:164.2,164.12 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:152.16,153.77 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:157.16,158.68 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:161.51,163.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:167.43,169.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:172.2,172.46 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:169.16,171.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:175.92,177.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:180.2,184.59 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:188.2,188.20 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:177.16,179.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:184.59,187.3 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:191.73,195.65 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:200.2,201.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:204.2,204.44 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:209.2,210.22 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:195.65,197.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:201.16,203.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:204.44,208.3 3 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:213.54,215.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:218.2,218.30 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:215.16,217.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:223.49,226.2 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:228.36,231.19 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:236.2,237.86 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:231.19,233.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/key.go:233.8,235.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:36.45,38.2 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:42.51,46.57 3 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:49.2,49.22 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:46.57,48.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:54.56,54.70 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:58.40,58.54 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:62.56,64.2 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:68.66,70.2 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:74.99,76.2 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:80.104,81.2 0 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:87.90,89.26 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:93.2,93.43 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:89.26,91.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:97.107,99.2 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:102.133,104.26 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:108.2,108.87 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:104.26,106.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:113.90,115.2 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:119.123,121.26 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:125.2,125.88 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:121.26,123.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:132.128,134.26 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:138.2,138.48 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:134.26,136.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:143.161,145.26 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:149.2,149.74 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/wallet.go:145.26,147.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:37.44,43.2 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:48.27,49.29 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:52.2,53.13 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:49.29,51.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:56.27,58.2 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:60.26,61.15 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:67.2,69.68 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:73.2,90.22 8 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:93.2,94.6 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:61.15,66.3 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:69.68,72.3 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:90.22,92.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:94.6,95.10 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:96.17,97.10 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:98.15,100.24 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:104.21,106.27 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/watch.go:100.24,103.5 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:43.44,43.61 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:44.44,44.81 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:45.44,45.71 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:54.47,56.32 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:62.2,62.63 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:56.32,58.29 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:58.29,60.4 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:77.68,86.2 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:88.55,95.2 6 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:97.62,102.2 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:104.58,108.49 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:109.2,109.48 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:113.2,116.83 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:108.49,108.98 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:109.48,111.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:120.58,125.76 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:125.76,127.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:127.8,129.3 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:133.51,136.49 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:138.2,138.51 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:136.49,136.86 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:138.51,141.77 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:141.77,143.4 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:143.9,145.4 1 0 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:149.88,150.23 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:155.2,155.14 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:150.23,151.23 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:151.23,153.4 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:161.76,164.37 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:167.2,167.22 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:181.2,181.22 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:164.37,166.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:167.22,169.60 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:172.3,172.26 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:177.3,177.38 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:169.60,171.4 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:172.26,173.31 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:173.31,175.5 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:177.38,179.4 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:182.9,183.25 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:184.9,185.40 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:186.10,190.33 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:194.39,197.24 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:201.2,201.24 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:212.2,215.19 4 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:197.24,200.3 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:201.24,203.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:203.8,204.10 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:205.24,205.24 0 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:206.11,208.10 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:218.33,221.24 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:224.2,224.22 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:228.2,228.16 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:221.24,223.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:224.22,227.3 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:233.46,236.16 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:240.2,240.92 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:244.2,250.53 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:276.2,278.38 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:283.2,283.38 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:286.2,286.38 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:293.2,295.9 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:299.2,300.12 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:236.16,239.3 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:240.92,242.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:250.53,252.17 2 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:256.3,262.10 6 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:273.3,273.13 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:252.17,255.4 2 0 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:263.19,264.72 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:265.33,266.94 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:267.11,271.5 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:278.38,279.45 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:279.45,281.4 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:283.38,285.3 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:286.38,289.39 3 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:289.39,291.4 1 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:296.31,296.31 0 1 -github.com/ethereum/go-ethereum/accounts/keystore/account_cache.go:297.10,297.10 0 1 -github.com/ethereum/go-ethereum/graphql/graphiql.go:37.60,42.2 4 0 -github.com/ethereum/go-ethereum/graphql/graphiql.go:44.35,48.2 3 0 -github.com/ethereum/go-ethereum/graphql/graphiql.go:50.69,51.23 1 0 -github.com/ethereum/go-ethereum/graphql/graphiql.go:55.2,56.19 2 0 -github.com/ethereum/go-ethereum/graphql/graphiql.go:51.23,54.3 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:46.55,46.80 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:49.58,51.31 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:71.2,71.12 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:52.14,62.13 3 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:64.13,65.19 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:66.13,67.19 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:68.10,69.57 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:82.73,85.2 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:87.72,89.2 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:91.69,93.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:96.2,97.20 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:100.2,100.35 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:93.16,95.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:97.20,99.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:103.81,105.86 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:112.2,113.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:116.2,116.55 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:105.86,107.17 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:110.3,110.36 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:107.17,109.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:113.16,115.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:119.68,121.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:124.2,124.38 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:121.16,123.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:127.102,129.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:132.2,132.50 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:129.16,131.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:142.61,144.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:146.75,152.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:154.48,156.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:158.57,160.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:162.55,164.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:172.68,174.2 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:176.71,178.2 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:191.80,192.17 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:208.2,208.18 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:192.17,195.30 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:206.3,206.46 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:195.30,204.4 5 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:211.61,213.2 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:215.77,217.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:220.2,220.23 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:217.29,219.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:223.72,225.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:228.2,228.38 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:225.29,227.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:231.74,233.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:236.2,236.19 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:233.29,235.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:237.30,238.42 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:239.30,240.21 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:246.3,246.42 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:247.10,248.42 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:240.21,241.64 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:241.64,244.5 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:252.84,254.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:258.2,258.20 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:261.2,262.33 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:265.2,265.27 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:268.2,268.107 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:254.29,256.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:258.20,260.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:262.33,264.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:265.27,267.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:271.79,273.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:276.2,276.19 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:273.29,275.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:277.30,278.18 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:279.30,280.45 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:281.10,282.18 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:286.87,288.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:291.2,291.19 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:288.29,290.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:292.30,293.18 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:294.30,295.45 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:296.10,297.18 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:301.79,303.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:307.2,307.20 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:310.2,311.33 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:314.2,314.27 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:318.2,319.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:322.2,322.33 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:303.29,305.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:307.20,309.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:311.33,313.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:314.27,316.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:319.16,321.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:325.71,327.29 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:330.2,330.23 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:333.2,333.38 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:327.29,329.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:330.23,332.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:336.74,338.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:341.2,341.40 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:338.29,340.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:344.87,346.29 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:349.2,350.15 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:353.2,357.8 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:346.29,348.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:350.15,352.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:360.89,362.29 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:365.2,371.8 3 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:362.29,364.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:374.66,375.42 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:378.2,378.21 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:375.42,377.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:381.66,382.42 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:385.2,385.20 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:388.2,389.20 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:382.42,384.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:385.20,387.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:393.79,394.42 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:397.2,397.20 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:400.2,401.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:404.2,404.31 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:394.42,396.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:397.20,399.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:401.16,403.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:407.66,409.34 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:412.2,412.33 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:415.2,416.18 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:409.34,411.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:412.33,414.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:419.67,421.34 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:424.2,425.18 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:421.34,423.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:428.77,430.34 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:433.2,434.18 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:430.34,432.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:437.100,439.83 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:442.2,446.8 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:439.83,441.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:449.66,451.34 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:454.2,455.35 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:462.2,462.18 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:451.34,453.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:455.35,461.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:465.65,467.16 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:470.2,471.21 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:467.16,469.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:474.80,476.29 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:479.2,481.32 3 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:487.2,487.18 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:476.29,478.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:481.32,486.3 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:490.67,492.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:495.2,496.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:492.29,494.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:499.67,501.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:504.2,505.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:501.29,503.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:508.67,510.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:513.2,514.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:510.29,512.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:533.68,534.20 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:537.2,537.27 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:541.2,543.39 3 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:549.2,549.21 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:534.20,536.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:537.27,540.3 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:543.39,545.44 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:545.44,547.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:555.75,556.56 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:559.2,560.21 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:567.2,567.22 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:556.56,558.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:560.21,561.32 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:561.32,563.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:563.9,565.4 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:572.80,573.23 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:588.2,588.24 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:573.23,575.30 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:582.3,583.17 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:586.3,586.24 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:575.30,577.18 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:580.4,580.24 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:577.18,579.5 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:583.17,585.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:591.59,593.16 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:597.2,597.42 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:593.16,595.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:600.64,601.31 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:608.2,608.20 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:601.31,603.17 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:606.3,606.25 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:603.17,605.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:611.61,613.16 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:616.2,616.35 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:613.16,615.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:619.60,621.16 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:624.2,624.34 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:621.16,623.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:627.74,629.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:632.2,632.27 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:635.2,635.44 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:629.16,631.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:632.27,634.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:638.78,640.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:643.2,644.27 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:650.2,651.41 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:640.16,642.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:644.27,646.71 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:646.71,648.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:654.61,655.48 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:658.2,658.53 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:661.2,666.8 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:655.48,657.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:658.53,660.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:669.70,671.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:674.2,674.45 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:671.16,673.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:677.72,679.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:682.2,682.41 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:679.16,681.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:685.67,687.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:690.2,690.29 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:687.16,689.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:693.67,695.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:698.2,698.30 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:695.16,697.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:701.76,703.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:706.2,706.27 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:703.16,705.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:709.69,711.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:714.2,714.25 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:711.16,713.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:717.72,719.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:722.2,722.32 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:719.16,721.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:725.69,727.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:730.2,730.30 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:727.16,729.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:733.65,735.32 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:738.2,739.20 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:735.32,737.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:742.64,744.32 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:747.2,748.39 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:756.2,756.18 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:744.32,746.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:748.39,755.3 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:759.71,761.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:764.2,764.26 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:761.16,763.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:767.71,769.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:772.2,772.34 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:769.16,771.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:775.75,777.26 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:784.2,785.15 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:788.2,788.30 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:777.26,779.17 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:782.3,782.20 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:779.17,781.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:785.15,787.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:801.88,802.20 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:806.2,806.16 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:802.20,805.3 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:811.65,813.2 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:815.84,817.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:820.2,824.8 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:817.16,819.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:827.71,829.32 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:832.2,833.20 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:829.32,831.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:836.76,838.32 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:841.2,842.42 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:851.2,851.18 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:838.32,840.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:842.42,850.3 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:854.102,856.32 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:859.2,860.51 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:863.2,870.8 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:856.32,858.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:860.51,862.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:873.90,875.32 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:878.2,879.54 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:882.2,888.8 3 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:875.32,877.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:879.54,881.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:912.96,914.31 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:917.2,918.27 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:925.2,925.17 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:914.31,916.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:918.27,924.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:928.102,930.34 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:933.2,934.31 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:937.2,938.29 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:946.2,949.42 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:930.34,932.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:934.31,936.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:938.29,940.17 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:943.3,943.23 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:940.17,942.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:954.22,955.27 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:961.2,965.8 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:955.27,957.17 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:957.17,959.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:988.43,990.2 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:992.37,994.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:996.36,998.2 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1002.25,1003.27 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1009.2,1010.16 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1013.2,1014.21 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1018.2,1022.8 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1003.27,1005.17 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1005.17,1007.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1010.16,1012.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1014.21,1016.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1027.18,1028.27 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1034.2,1035.23 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1028.27,1030.17 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1030.17,1032.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1042.72,1045.2 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1047.78,1049.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1052.2,1053.25 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1061.2,1061.18 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1049.16,1051.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1053.25,1060.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1066.13,1073.2 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1077.25,1080.16 3 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1083.2,1084.21 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1088.2,1092.8 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1080.16,1082.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1084.21,1086.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1097.18,1101.2 3 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1111.20,1113.24 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1139.2,1140.16 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1145.2,1145.19 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1113.24,1114.23 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1117.3,1122.4 3 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1114.23,1116.4 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1123.8,1123.29 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1123.29,1129.3 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1129.8,1135.3 2 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1140.16,1142.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1142.8,1142.21 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1142.21,1144.3 1 1 -github.com/ethereum/go-ethereum/graphql/graphql.go:1151.22,1155.20 3 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1160.2,1160.15 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1163.2,1164.30 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1182.2,1182.17 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1155.20,1157.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1157.8,1159.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1160.15,1162.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1164.30,1174.17 4 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1180.3,1180.27 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1174.17,1176.4 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1176.9,1176.22 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1176.22,1178.9 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1185.58,1187.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1189.108,1196.16 3 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1201.2,1201.16 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1196.16,1198.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1198.8,1198.21 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1198.21,1200.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1204.116,1206.54 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1209.2,1210.18 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1206.54,1208.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1233.100,1236.34 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1239.2,1240.32 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1243.2,1244.34 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1247.2,1248.31 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1252.2,1253.42 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1236.34,1238.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1240.32,1242.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1244.34,1246.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1248.31,1250.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1256.71,1258.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1261.2,1261.60 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1264.2,1264.36 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1258.16,1260.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1261.60,1263.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1267.83,1269.16 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1272.2,1272.36 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1269.16,1271.3 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1275.70,1277.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1284.52,1286.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1287.51,1289.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1290.51,1292.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1293.53,1295.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1296.57,1298.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1299.54,1301.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1302.58,1304.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1305.52,1307.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1308.57,1310.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1311.54,1313.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1314.58,1316.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1317.54,1319.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1320.58,1322.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1323.55,1325.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1326.54,1328.2 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1347.50,1351.52 2 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1355.2,1355.34 1 0 -github.com/ethereum/go-ethereum/graphql/graphql.go:1351.52,1353.3 1 0 -github.com/ethereum/go-ethereum/graphql/service.go:32.68,38.64 2 1 -github.com/ethereum/go-ethereum/graphql/service.go:43.2,45.16 3 1 -github.com/ethereum/go-ethereum/graphql/service.go:49.2,49.30 1 1 -github.com/ethereum/go-ethereum/graphql/service.go:53.2,54.23 2 1 -github.com/ethereum/go-ethereum/graphql/service.go:38.64,41.3 2 0 -github.com/ethereum/go-ethereum/graphql/service.go:45.16,48.3 2 0 -github.com/ethereum/go-ethereum/graphql/service.go:49.30,51.3 1 1 -github.com/ethereum/go-ethereum/graphql/service.go:59.81,60.20 1 1 -github.com/ethereum/go-ethereum/graphql/service.go:64.2,64.49 1 1 -github.com/ethereum/go-ethereum/graphql/service.go:60.20,61.27 1 0 -github.com/ethereum/go-ethereum/graphql/service.go:69.88,73.16 3 1 -github.com/ethereum/go-ethereum/graphql/service.go:76.2,83.12 6 1 -github.com/ethereum/go-ethereum/graphql/service.go:73.16,75.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:16.39,22.2 2 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:29.40,31.2 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:33.33,36.31 3 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:39.2,39.42 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:36.31,38.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:42.46,44.2 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:46.35,48.2 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:57.41,63.2 2 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:72.45,78.2 2 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:87.39,93.2 2 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:102.45,108.2 2 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:116.38,117.20 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:120.2,120.25 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:117.20,119.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:123.46,127.36 3 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:132.2,132.9 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:135.2,136.12 2 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:127.36,129.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:129.8,131.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:132.9,134.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:139.45,145.2 2 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:153.43,154.20 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:157.2,157.36 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:154.20,156.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:160.51,163.2 2 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:165.55,171.2 2 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:180.49,186.2 2 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:194.41,195.20 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:198.2,199.29 2 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:202.2,202.30 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:195.20,197.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:199.29,201.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:205.49,206.20 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:209.2,209.46 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:218.2,218.12 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:206.20,208.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:209.46,210.14 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:210.14,213.20 2 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:213.20,215.5 1 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:221.51,227.2 2 1 -github.com/ethereum/go-ethereum/internal/cli/flagset/flagset.go:236.47,242.2 2 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:50.51,53.16 3 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:56.2,56.29 1 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:61.2,61.16 1 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:53.16,55.3 1 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:56.29,57.32 1 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:57.32,59.4 1 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:66.56,67.19 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:70.2,73.16 4 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:67.19,69.3 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:78.54,80.2 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:82.52,84.29 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:96.2,96.16 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:84.29,95.3 9 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:114.51,119.2 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:122.48,125.2 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:128.54,129.20 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:134.2,134.28 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:129.20,133.3 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:138.46,141.14 3 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:141.14,143.3 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:143.8,145.3 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:155.53,161.2 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:163.44,165.2 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:168.50,170.2 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:172.42,174.14 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:177.2,179.20 3 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:174.14,176.3 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:189.66,191.2 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:193.59,194.17 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:218.2,218.15 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:194.17,195.16 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:202.3,203.16 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:209.3,212.17 4 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:215.3,216.19 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:195.16,196.60 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:199.4,199.19 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:196.60,198.5 1 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:203.16,207.4 3 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:212.17,214.4 1 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:222.32,223.14 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:223.14,226.3 2 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:230.37,232.23 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:237.2,237.14 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:232.23,233.15 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:233.15,235.4 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:241.36,245.2 3 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:247.48,250.12 3 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:262.2,263.17 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:250.12,252.16 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:260.3,260.13 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:252.16,253.36 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:253.36,258.5 4 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:275.23,275.24 0 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:279.23,282.2 2 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:285.20,289.2 3 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:292.27,296.2 3 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:300.36,304.2 3 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:308.52,311.55 3 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:314.2,314.38 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:311.55,313.3 1 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:318.38,321.2 2 1 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:324.54,327.2 2 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:330.38,333.2 2 0 -github.com/ethereum/go-ethereum/internal/utesting/utesting.go:336.54,339.2 2 0 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:28.58,30.33 2 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:33.2,33.16 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:30.33,32.3 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:36.71,38.21 2 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:44.2,45.36 2 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:56.2,57.52 2 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:69.2,69.45 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:80.2,81.16 2 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:38.21,40.3 1 0 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:45.36,47.56 2 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:50.3,50.23 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:47.56,49.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:57.52,58.35 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:58.35,59.23 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:59.23,61.5 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:61.10,63.5 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:69.45,71.17 2 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:71.17,72.53 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:72.53,74.5 1 1 -github.com/ethereum/go-ethereum/internal/jsre/completion.go:74.10,76.5 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:71.52,84.2 5 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:87.32,90.45 3 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:94.2,95.22 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:90.45,92.3 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:107.32,116.81 6 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:135.2,135.56 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:140.2,140.57 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:145.2,145.58 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:153.2,173.6 8 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:217.2,217.33 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:116.81,118.17 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:121.3,128.55 3 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:132.3,132.37 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:118.17,120.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:128.55,130.4 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:135.56,138.3 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:140.57,143.3 2 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:145.58,147.40 2 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:151.3,151.26 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:147.40,150.4 2 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:173.6,174.10 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:175.25,178.37 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:187.4,189.15 3 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:192.4,195.31 3 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:203.30,207.48 3 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:210.46,211.49 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:178.37,181.31 3 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:181.31,183.6 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:184.10,186.5 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:189.15,190.79 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:195.31,197.5 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:197.10,199.49 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:199.49,200.16 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:207.48,208.15 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:211.49,212.15 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:217.33,220.3 2 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:225.44,228.9 3 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:229.27,230.9 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:231.19,231.19 0 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:236.45,240.6 3 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:240.6,241.10 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:242.20,243.10 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:244.45,246.10 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:247.20,249.53 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:256.41,258.16 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:261.2,261.39 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:258.16,260.3 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:265.60,266.31 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:267.2,267.15 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:266.31,266.62 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:271.59,272.31 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:273.2,273.12 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:272.31,272.48 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:277.83,278.60 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:278.60,280.17 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:283.3,283.16 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:280.17,281.29 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:288.52,289.31 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:289.31,291.17 2 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:296.3,296.18 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:291.17,293.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:293.9,295.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:301.42,303.30 2 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:305.2,305.9 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:303.31,303.32 0 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:306.44,306.44 0 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:308.10,309.21 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:314.66,315.31 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:316.2,316.12 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:315.31,315.76 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:320.59,324.16 4 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:327.2,328.16 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:331.2,331.19 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:324.16,326.3 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:328.16,330.3 1 0 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:334.87,336.16 2 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:339.2,339.30 1 1 -github.com/ethereum/go-ethereum/internal/jsre/jsre.go:336.16,338.3 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:56.67,58.2 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:61.60,63.46 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:66.2,66.42 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:63.46,65.3 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:69.66,70.35 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:74.2,74.25 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:70.35,73.3 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:82.43,84.2 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:86.68,87.43 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:91.2,92.9 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:87.43,90.3 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:93.28,94.55 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:95.30,96.51 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:97.57,98.51 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:99.10,100.38 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:100.38,102.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:102.9,104.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:111.61,112.15 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:117.2,119.12 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:112.15,113.31 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:113.31,115.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:122.73,123.25 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:124.26,127.15 3 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:131.3,131.34 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:135.3,136.35 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:145.3,145.25 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:147.16,149.27 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:154.3,155.21 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:159.3,159.34 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:163.3,164.26 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:173.3,173.14 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:176.3,176.47 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:178.18,182.47 4 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:184.16,185.54 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:187.10,188.35 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:127.15,130.4 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:131.34,134.4 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:136.35,138.17 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:141.4,141.17 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:138.17,140.5 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:141.17,143.5 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:149.27,152.4 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:155.21,158.4 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:159.34,162.4 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:164.26,168.23 4 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:171.4,171.23 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:168.23,170.5 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:173.14,175.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:188.35,191.4 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:191.9,193.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:197.52,202.24 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:224.2,227.33 4 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:202.24,203.60 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:206.3,209.17 3 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:203.60,205.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:209.17,215.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:215.9,216.57 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:216.57,218.5 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:218.10,220.5 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:230.84,232.41 2 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:236.2,236.52 1 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:232.41,235.3 2 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:236.52,237.41 1 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:237.41,238.19 1 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:238.19,240.5 1 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:245.70,248.13 3 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:251.2,252.16 2 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:255.2,256.25 2 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:248.13,249.67 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:252.16,253.77 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:257.21,258.24 1 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:261.16,262.24 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:265.10,266.82 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:258.24,260.4 1 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:262.24,264.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:270.51,272.62 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:278.2,279.22 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:282.2,284.15 3 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:287.2,288.23 2 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:272.62,273.61 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:273.61,275.4 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:279.22,281.3 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:284.15,286.3 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:291.40,293.2 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:295.76,296.43 1 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:301.2,301.12 1 0 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:296.43,297.53 1 1 -github.com/ethereum/go-ethereum/internal/jsre/pretty.go:297.53,299.4 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:33.67,45.2 3 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:53.60,54.62 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:57.2,57.32 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:54.62,55.59 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:70.160,71.44 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:75.2,75.78 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:83.2,83.49 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:90.2,90.57 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:93.2,93.30 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:96.2,96.43 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:71.44,74.3 2 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:75.78,76.89 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:80.3,80.36 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:76.89,79.4 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:83.49,84.94 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:84.94,87.4 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:90.57,92.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:93.30,95.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:100.101,102.2 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:105.107,107.16 2 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:110.2,110.78 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:120.2,121.19 2 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:124.2,126.21 3 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:129.2,129.73 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:132.2,132.54 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:135.2,136.82 2 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:107.16,109.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:110.78,119.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:121.19,123.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:126.21,128.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:129.73,131.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:132.54,134.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:139.78,144.2 2 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:147.59,150.2 2 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:152.79,154.37 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:158.2,159.19 2 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:162.2,163.84 2 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:166.2,166.12 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:154.37,156.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:159.19,161.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:163.84,165.3 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:170.61,174.34 3 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:177.2,178.26 2 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:181.2,181.73 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:185.2,185.56 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:188.2,188.12 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:174.34,176.3 1 1 -github.com/ethereum/go-ethereum/les/catalyst/api.go:178.26,180.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:181.73,183.3 1 0 -github.com/ethereum/go-ethereum/les/catalyst/api.go:185.56,187.3 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:73.72,82.18 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:85.2,86.13 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:82.18,84.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:90.38,96.2 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:99.57,103.21 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:106.2,110.12 5 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:113.2,113.41 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:103.21,105.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:110.12,112.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:121.50,129.2 6 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:133.34,138.2 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:142.52,143.73 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:148.2,148.20 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:143.73,147.3 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:152.54,154.25 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:157.2,158.49 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:161.2,161.21 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:164.2,164.21 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:154.25,156.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:158.49,160.3 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:161.21,163.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:168.59,174.51 5 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:174.51,177.3 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:177.8,178.41 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:185.3,185.128 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:178.41,179.50 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:179.50,183.5 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:190.79,192.14 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:197.2,197.41 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:192.14,194.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:194.8,194.51 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:194.51,196.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:203.118,209.36 5 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:216.2,218.21 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:221.2,222.54 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:209.36,210.22 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:214.3,214.51 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:210.22,213.4 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:218.21,220.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:226.89,234.21 7 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:237.2,238.12 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:241.2,241.19 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:234.21,236.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:238.12,240.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:259.73,268.18 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:271.2,271.13 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:268.18,270.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:275.59,280.44 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:287.2,287.22 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:280.44,282.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:282.8,283.41 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:283.41,285.4 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:292.55,293.25 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:296.2,296.22 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:304.2,305.21 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:293.25,295.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:296.22,299.47 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:299.47,302.4 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:305.21,307.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:316.74,320.31 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:323.2,326.36 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:329.2,329.33 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:336.2,337.21 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:340.2,340.20 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:320.31,322.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:326.36,328.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:329.33,331.22 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:334.3,334.19 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:331.22,333.4 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:337.21,339.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:346.62,355.33 5 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:361.2,363.21 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:355.33,357.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:357.8,360.3 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:363.21,365.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:370.57,376.31 5 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:379.2,380.9 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:383.2,386.13 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:389.2,389.36 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:396.2,398.21 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:376.31,378.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:380.9,382.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:386.13,388.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:389.36,394.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:398.21,400.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:405.49,409.34 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:412.2,414.31 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:417.2,420.21 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:409.34,411.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:414.31,416.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:420.21,422.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:426.36,430.21 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/control.go:430.21,432.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:41.44,46.2 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:49.56,51.68 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:55.2,56.14 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:51.68,54.3 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:60.43,61.41 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/logger.go:61.41,64.3 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:108.81,111.65 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:115.2,115.18 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:118.2,118.12 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:132.2,132.11 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:111.65,111.99 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:115.18,117.3 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:118.12,120.7 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:120.7,121.11 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:122.35,125.21 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:126.27,128.11 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:136.33,140.2 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:143.66,150.20 6 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:150.20,152.3 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:152.8,154.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:161.77,162.13 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:165.2,166.13 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:169.2,172.22 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:162.13,164.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:166.13,168.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:177.52,189.2 10 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:192.55,201.2 7 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:207.106,214.2 5 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:220.100,221.24 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:224.2,224.53 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:221.24,223.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:229.88,234.39 4 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:234.39,235.22 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:238.3,238.36 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:235.22,237.4 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:243.98,252.2 7 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:256.45,257.36 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:261.2,263.20 3 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:266.2,266.15 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:269.2,269.44 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:257.36,260.3 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:263.20,265.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:266.15,268.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:274.61,279.25 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:279.25,281.37 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:284.3,287.21 4 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:290.3,295.18 4 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:302.3,304.60 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:308.3,308.45 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:281.37,283.4 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:287.21,289.4 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:295.18,301.4 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:304.60,307.4 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:314.110,317.54 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:325.2,327.14 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:330.2,331.49 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:335.2,335.14 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:338.2,338.28 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:341.2,341.13 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:317.54,320.54 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:323.3,323.42 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:320.54,322.4 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:327.14,329.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:331.49,334.3 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:335.14,337.3 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:338.28,340.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:341.13,343.28 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:346.3,348.46 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:343.28,345.4 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:353.64,358.35 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:361.2,364.40 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:367.2,367.35 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:358.35,360.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:364.40,366.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:376.80,380.47 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:386.2,386.40 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:389.2,389.13 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:380.47,382.48 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:382.48,384.4 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:386.40,388.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:389.13,391.3 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:396.44,398.88 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:401.2,402.31 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:398.88,400.3 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:402.31,403.10 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:404.55,404.55 0 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:405.11,405.11 0 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:412.72,418.2 4 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:424.54,427.12 3 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:430.2,430.13 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:438.2,438.12 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:441.2,442.19 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:445.2,446.12 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:449.2,449.87 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:427.12,429.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:430.13,432.19 2 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:432.19,434.4 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:434.9,436.4 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:438.12,440.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:442.19,444.3 1 1 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:446.12,448.3 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:453.41,455.24 2 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:461.2,461.13 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:455.24,456.18 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:459.3,459.14 1 0 -github.com/ethereum/go-ethereum/les/flowcontrol/manager.go:456.18,458.4 1 0 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:38.66,40.2 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:44.53,46.2 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:49.53,51.2 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:54.47,56.2 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:59.71,60.43 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:68.2,69.8 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:60.43,63.44 2 0 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:63.44,66.4 2 0 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:69.8,71.18 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:71.18,73.4 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:74.8,75.18 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:75.18,76.41 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:83.4,83.45 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:76.41,82.5 4 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:92.49,93.6 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:93.6,94.26 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:97.3,100.27 4 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:103.3,103.78 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:94.26,96.4 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:100.27,102.4 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:103.78,105.4 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:120.59,122.124 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:128.2,131.18 4 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:135.2,136.28 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:142.2,143.41 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:122.124,124.28 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:124.28,125.14 1 0 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:131.18,134.3 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:136.28,139.3 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:139.8,141.3 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:148.60,149.18 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:160.2,165.17 6 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:168.2,168.13 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:149.18,154.18 5 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:158.3,158.14 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:154.18,157.4 2 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:165.17,167.3 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:172.56,173.30 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:182.2,182.12 1 0 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:173.30,174.14 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:180.3,180.11 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:174.14,175.20 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:178.4,178.44 1 1 -github.com/ethereum/go-ethereum/les/utils/weighted_select.go:175.20,177.5 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:31.44,36.2 4 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:38.28,39.61 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:42.2,42.20 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:39.61,41.3 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:45.52,47.30 2 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:52.2,52.20 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:59.2,60.10 2 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:47.30,51.3 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:52.20,53.23 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:57.3,57.16 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:53.23,55.9 2 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:63.37,65.2 1 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:68.37,73.2 4 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:76.42,79.8 3 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:83.2,84.11 2 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:79.8,82.3 2 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:88.29,92.2 3 0 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:97.28,99.19 2 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:103.2,104.15 2 1 -github.com/ethereum/go-ethereum/les/utils/exec_queue.go:99.19,102.3 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:60.52,62.2 1 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:66.67,68.2 1 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:71.55,74.2 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:77.67,81.21 4 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:84.2,84.21 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:88.2,88.42 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:100.2,102.12 3 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:81.21,83.3 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:84.21,87.3 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:88.42,93.16 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:98.3,98.16 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:93.16,95.4 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:95.9,97.4 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:106.47,107.19 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:110.2,110.19 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:114.2,114.18 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:107.19,109.3 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:110.19,113.3 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:118.47,119.19 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:122.2,122.19 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:126.2,126.21 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:119.19,121.3 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:122.19,125.3 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:126.21,128.3 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:128.8,130.3 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:134.38,136.2 1 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:148.62,150.23 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:158.2,158.14 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:150.23,152.20 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:152.20,154.4 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:154.9,156.4 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:163.75,165.23 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:174.2,174.43 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:179.2,179.14 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:165.23,167.20 2 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:172.3,172.20 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:167.20,169.4 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:169.9,171.4 1 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:174.43,176.3 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:176.8,178.3 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:203.61,208.12 4 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:211.2,212.15 2 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:208.12,210.3 1 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:216.71,222.2 4 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:225.57,230.13 4 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:233.2,233.67 1 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:230.13,232.3 1 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:243.40,245.2 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:248.42,250.2 1 0 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:253.38,255.2 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:258.39,260.2 1 1 -github.com/ethereum/go-ethereum/les/utils/expiredvalue.go:268.35,270.2 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:71.42,71.81 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:76.44,77.25 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:80.2,85.35 6 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:77.25,78.59 1 0 -github.com/ethereum/go-ethereum/les/utils/limiter.go:91.62,92.92 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:95.2,98.26 4 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:92.92,93.59 1 0 -github.com/ethereum/go-ethereum/les/utils/limiter.go:103.47,104.92 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:108.2,109.24 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:113.2,116.12 4 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:121.2,121.26 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:104.92,105.59 1 0 -github.com/ethereum/go-ethereum/les/utils/limiter.go:109.24,112.3 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:116.12,118.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:118.8,120.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:125.45,127.2 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:130.45,132.72 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:138.2,140.10 3 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:132.72,132.115 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:133.72,133.112 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:146.98,147.24 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:150.2,150.15 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:154.2,154.25 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:157.2,159.22 3 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:164.2,166.21 3 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:169.2,169.8 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:147.24,149.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:150.15,153.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:154.25,156.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:159.22,161.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:161.8,163.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:166.21,168.3 1 0 -github.com/ethereum/go-ethereum/les/utils/limiter.go:177.100,182.12 4 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:186.2,186.18 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:189.2,189.31 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:224.2,225.32 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:228.2,228.16 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:182.12,185.3 2 0 -github.com/ethereum/go-ethereum/les/utils/limiter.go:186.18,188.3 1 0 -github.com/ethereum/go-ethereum/les/utils/limiter.go:189.31,190.22 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:190.22,194.29 4 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:194.29,198.5 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:199.9,205.4 4 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:206.8,215.24 3 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:218.3,219.26 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:222.3,222.28 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:215.24,217.4 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:219.26,221.4 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:225.32,227.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:232.41,234.21 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:239.2,244.26 6 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:234.21,236.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:236.8,238.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:249.61,252.15 3 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:256.2,257.28 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:252.15,255.3 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:261.50,264.24 3 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:267.2,267.28 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:264.24,266.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:272.41,274.25 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:277.2,277.24 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:274.25,276.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:281.39,282.52 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:288.2,290.11 3 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:282.52,283.61 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:283.61,286.4 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:294.33,298.6 3 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:298.6,299.13 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:307.3,308.16 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:312.3,312.22 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:299.13,300.31 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:305.4,305.10 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:300.31,301.38 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:301.38,303.6 1 0 -github.com/ethereum/go-ethereum/les/utils/limiter.go:308.16,310.12 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:312.22,322.25 10 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:322.25,324.5 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:324.10,326.5 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:327.9,330.4 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:335.26,341.2 4 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:351.29,353.2 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:355.39,357.2 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:359.34,361.2 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:366.34,371.29 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:374.2,374.29 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:387.2,388.28 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:371.29,373.3 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:374.29,375.22 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:378.3,379.19 2 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:382.3,385.5 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:375.22,376.12 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:379.19,381.4 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:388.28,389.41 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:396.3,401.36 6 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:389.41,391.4 1 1 -github.com/ethereum/go-ethereum/les/utils/limiter.go:401.36,403.4 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:33.79,35.19 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:39.2,39.18 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:42.2,46.3 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:35.19,37.3 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:39.18,41.3 1 0 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:49.75,51.2 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:53.96,58.14 4 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:61.2,61.24 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:64.2,64.20 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:68.2,68.14 1 0 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:58.14,60.3 1 0 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:61.24,63.3 1 1 -github.com/ethereum/go-ethereum/les/utils/timeutils.go:64.20,67.3 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:142.52,143.26 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:146.2,146.33 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:143.26,145.3 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:150.55,151.26 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:154.2,154.28 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:151.26,153.3 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:203.276,229.2 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:233.32,235.2 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:239.31,241.2 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:246.70,255.9 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:256.25,257.13 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:258.16,259.23 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:264.71,269.9 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:270.22,271.13 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:272.16,273.23 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:279.108,285.9 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:291.2,291.9 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:297.2,297.9 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:286.32,286.32 0 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:287.16,288.13 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:292.77,292.77 0 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:293.16,294.13 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:298.24,299.22 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:300.16,301.13 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:307.173,313.9 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:319.2,319.9 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:325.2,325.9 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:314.30,314.30 0 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:315.16,316.18 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:320.101,320.101 0 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:321.16,322.18 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:326.24,327.40 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:328.16,329.18 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:335.31,346.6 6 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:346.6,348.42 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:354.3,355.24 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:382.3,382.10 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:348.42,349.48 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:349.48,351.5 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:355.24,358.32 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:362.4,363.25 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:371.4,371.120 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:375.4,375.15 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:358.32,360.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:363.25,365.33 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:368.5,368.10 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:365.33,367.6 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:371.120,373.13 2 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:375.15,377.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:377.10,379.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:383.17,385.10 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:387.35,392.25 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:398.4,398.31 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:406.4,406.50 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:409.4,409.52 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:412.4,414.79 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:417.4,417.29 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:421.25,427.15 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:430.4,430.39 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:432.25,435.23 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:437.23,441.45 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:461.4,461.38 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:477.4,477.33 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:479.26,483.43 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:495.4,495.38 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:506.4,506.39 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:508.35,513.11 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:518.4,523.40 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:572.4,573.11 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:579.4,579.40 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:590.4,590.42 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:594.4,594.35 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:600.33,603.11 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:608.4,611.29 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:654.4,655.11 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:661.4,661.33 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:392.25,395.10 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:398.31,399.113 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:399.113,402.11 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:406.50,407.10 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:409.52,410.10 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:414.79,416.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:417.29,419.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:427.15,428.13 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:441.45,445.16 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:448.5,448.48 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:445.16,447.6 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:448.48,454.88 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:454.88,457.7 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:461.38,466.15 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:466.15,467.31 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:470.6,470.34 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:467.31,469.7 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:470.34,473.7 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:483.43,489.32 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:489.32,492.6 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:495.38,499.32 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:502.5,503.51 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:499.32,501.6 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:514.25,514.25 0 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:515.18,516.11 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:523.40,527.166 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:527.166,529.51 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:537.6,537.17 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:546.6,546.33 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:529.51,533.15 4 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:537.17,538.35 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:542.7,543.15 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:538.35,541.8 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:546.33,551.91 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:562.7,562.48 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:551.91,559.16 6 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:563.12,566.7 2 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:567.11,570.6 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:574.72,574.72 0 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:575.18,576.11 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:579.40,581.40 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:584.5,585.28 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:581.40,582.14 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:585.28,587.6 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:590.42,592.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:594.35,595.64 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:595.64,597.6 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:604.25,604.25 0 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:605.18,606.11 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:611.29,612.73 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:612.73,619.47 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:646.6,646.17 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:619.47,620.64 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:623.7,623.39 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:626.7,626.49 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:629.7,629.37 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:632.7,632.44 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:636.7,637.34 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:620.64,621.16 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:623.39,625.8 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:626.49,627.16 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:629.37,631.8 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:632.44,633.16 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:637.34,641.8 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:641.13,643.8 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:646.17,650.15 4 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:656.24,656.24 0 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:657.18,658.11 1 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:661.33,662.64 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:662.64,664.6 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:671.59,673.27 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:678.2,678.13 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:683.2,684.40 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:689.2,689.51 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:673.27,675.3 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:678.13,681.3 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:684.40,685.40 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:685.40,687.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:693.65,695.25 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:699.2,700.38 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:705.2,705.52 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:695.25,697.3 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:700.38,701.40 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:701.40,703.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:710.87,715.19 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:721.2,722.24 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:729.2,729.97 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:736.2,736.34 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:715.19,717.3 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:717.8,719.3 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:722.24,727.3 4 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:729.97,734.3 4 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:736.34,738.20 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:743.3,746.31 4 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:749.3,749.120 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:738.20,740.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:740.9,742.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:746.31,748.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:756.73,760.12 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:760.12,761.16 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:763.3,764.20 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:769.3,769.83 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:775.3,775.69 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:780.3,780.28 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:761.16,761.34 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:764.20,767.4 2 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:769.83,773.4 3 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:775.69,778.4 2 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:780.28,782.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:789.70,794.12 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:794.12,795.16 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:798.3,799.20 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:804.3,804.53 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:820.3,820.63 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:825.3,829.28 3 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:795.16,795.34 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:799.20,802.4 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:805.12,808.36 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:810.33,810.33 0 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:813.11,817.10 3 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:820.63,823.4 2 0 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:829.28,831.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:837.53,839.46 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:852.2,852.51 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:861.2,861.43 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:867.2,870.53 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:839.46,840.40 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:846.3,847.34 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:840.40,842.41 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:842.41,844.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:847.34,849.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:852.51,854.40 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:857.3,857.27 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:854.40,856.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:861.43,863.40 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:863.40,865.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:870.53,872.40 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:875.3,875.29 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:872.40,874.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:881.54,882.45 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:882.45,884.35 2 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:887.3,887.25 1 1 -github.com/ethereum/go-ethereum/les/fetcher/block_fetcher.go:884.35,886.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:33.62,35.2 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:38.53,39.51 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:42.2,42.71 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:39.51,41.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:42.71,44.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:44.8,46.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:51.64,53.2 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:61.100,63.17 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:66.2,66.19 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:69.2,69.50 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:63.17,65.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:66.19,68.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:69.50,71.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:71.8,73.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:83.89,84.19 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:87.2,87.50 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:84.19,86.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:87.50,89.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:89.8,91.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:96.86,99.19 3 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:102.2,102.50 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:99.19,101.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:102.50,104.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/api.go:104.8,106.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:42.103,50.83 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:64.2,65.11 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:50.83,52.29 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:55.3,55.29 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:58.3,58.27 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:61.3,61.19 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:52.29,54.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:55.29,57.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:58.27,60.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:70.31,71.6 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:71.6,73.43 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:77.3,78.23 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:81.3,81.66 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:73.43,75.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:78.23,80.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:89.42,94.26 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:94.26,96.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/fillset.go:100.28,107.2 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:42.150,50.107 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:74.2,74.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:50.107,53.27 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:57.3,60.15 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:72.3,72.19 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:53.27,55.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:60.15,62.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:62.9,64.32 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:64.32,65.22 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:65.22,68.11 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:78.38,80.38 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:91.2,91.15 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:97.2,97.13 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:105.2,106.13 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:80.38,81.29 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:84.3,84.40 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:87.3,87.29 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:81.29,83.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:84.40,86.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:87.29,89.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:91.15,95.3 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:97.13,101.3 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:101.8,104.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:110.34,115.2 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/queueiterator.go:118.45,123.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:75.44,76.17 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:85.2,85.17 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:76.17,78.32 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:83.3,83.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:78.32,82.4 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:85.17,87.32 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:92.3,92.14 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:87.32,91.4 3 0 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:98.39,99.27 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:99.27,101.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:106.105,111.2 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:115.57,117.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:122.62,127.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:139.2,139.12 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:127.35,130.20 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:133.3,133.19 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:136.3,137.36 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:130.20,132.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:133.19,135.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:144.42,148.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:153.56,160.36 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:164.2,164.19 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:172.2,172.21 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:160.36,163.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:164.19,167.37 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:167.37,170.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:177.45,179.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:179.35,180.19 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:180.19,182.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:182.9,184.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:189.39,191.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:195.2,196.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:191.35,194.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:196.35,199.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:204.69,209.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:213.2,213.19 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:216.2,216.55 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:209.35,212.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:213.19,215.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:220.51,222.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:225.53,229.40 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:232.2,233.12 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:229.40,231.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:237.54,239.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:242.56,247.39 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:250.2,251.12 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:247.39,249.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:259.112,261.34 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:264.2,266.34 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:273.2,273.22 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:278.2,278.34 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:284.2,284.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:261.34,263.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:266.34,267.34 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:267.34,271.4 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:273.22,275.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:275.8,277.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:278.34,279.34 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/requestbasket.go:279.34,282.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:110.43,111.40 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:120.4,120.48 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:111.40,119.5 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:122.41,131.4 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:136.43,137.42 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:141.4,141.48 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:137.42,140.5 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:143.41,145.53 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:148.4,148.20 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:145.53,147.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:154.200,158.30 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:164.2,172.18 8 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:176.2,176.132 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:184.2,186.34 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:158.30,158.58 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:172.18,174.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:176.132,177.63 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:177.63,181.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:186.34,187.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:187.26,190.5 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:203.42,204.27 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:208.2,208.14 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:204.27,207.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:212.49,214.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:217.38,219.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:224.54,229.34 4 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:232.2,232.30 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:235.2,235.33 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:229.34,231.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:232.30,234.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:235.33,237.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:241.55,242.19 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:242.19,244.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:250.92,252.93 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:297.2,297.88 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:252.93,253.32 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:260.3,262.30 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:265.3,265.48 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:274.3,274.13 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:253.32,254.32 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:258.4,258.10 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:254.32,257.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:262.30,264.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:265.48,273.4 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:274.13,276.15 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:286.4,286.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:276.15,279.34 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:279.34,282.6 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:283.10,285.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:286.26,288.15 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:293.5,293.55 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:288.15,290.6 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:290.11,292.6 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:297.88,298.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:298.14,300.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:300.9,302.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:307.30,309.36 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:314.2,314.36 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:321.2,322.24 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:337.2,337.35 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:309.36,313.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:314.36,315.64 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:315.64,317.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:317.9,319.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:322.24,323.93 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:323.93,325.100 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:325.100,328.24 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:333.5,333.93 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:328.24,332.6 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:341.29,342.22 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:345.2,345.24 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:351.2,352.13 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:342.22,344.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:345.24,346.91 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:346.91,349.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:356.80,357.40 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:360.2,361.24 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:368.2,368.17 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:357.40,359.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:361.24,364.29 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:364.29,366.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:372.55,373.24 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:378.2,378.28 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:373.24,377.3 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:384.37,390.69 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:394.2,404.40 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:407.2,407.44 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:410.2,411.26 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:422.2,423.24 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:390.69,392.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:404.40,406.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:407.44,409.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:411.26,415.37 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:418.3,418.31 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:415.37,417.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:418.31,420.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:427.49,432.2 4 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:436.81,441.2 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:445.71,447.16 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:450.2,451.30 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:454.2,454.22 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:447.16,449.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:451.30,453.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:458.88,460.16 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:463.2,468.85 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:476.2,476.8 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:460.16,462.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:468.85,472.33 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:472.33,474.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:482.95,484.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:493.2,493.20 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:484.35,487.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:487.8,492.3 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:505.91,522.32 7 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:537.2,538.34 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:543.2,545.23 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:548.2,548.33 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:551.2,552.26 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:522.32,525.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:525.8,534.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:538.34,540.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:545.23,547.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:548.33,550.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:552.26,558.3 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:558.8,564.3 3 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:571.56,576.2 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:579.46,581.2 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:585.65,585.79 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:586.65,586.81 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:595.58,596.68 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:600.2,600.10 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:596.68,599.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/serverpool.go:604.45,606.2 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:53.47,54.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:57.2,58.11 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:61.2,62.26 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:65.2,65.10 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:54.11,56.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:58.11,60.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:62.26,64.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:70.47,72.11 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:75.2,75.52 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:72.11,74.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:83.70,84.21 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:92.2,92.8 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:84.21,86.20 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:86.20,88.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:88.9,90.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:96.59,102.2 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:105.61,110.39 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:113.2,114.12 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:110.39,112.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:118.108,125.26 7 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:125.26,127.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:132.49,133.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:140.2,140.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:133.18,135.30 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:138.3,138.15 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:135.30,137.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:140.18,142.30 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:145.3,145.15 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:142.30,144.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:151.106,153.29 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:156.2,156.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:159.2,159.55 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:153.29,155.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:156.11,158.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:163.61,165.28 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:165.28,167.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:171.61,173.28 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:173.28,174.22 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:174.22,176.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:176.9,178.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:188.70,190.29 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:193.2,195.32 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:199.2,200.21 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:203.2,203.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:206.2,207.26 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:210.2,210.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:190.29,192.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:195.32,198.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:200.21,202.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:203.11,205.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:207.26,209.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:219.114,221.16 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:232.2,232.29 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:236.2,236.8 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:221.16,223.30 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:226.3,226.14 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:223.30,225.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:226.14,228.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:229.8,231.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/timestats.go:232.29,235.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:57.60,62.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:68.99,75.2 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:83.120,89.12 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:92.2,95.84 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:89.12,91.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:104.82,113.25 7 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:117.2,117.44 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:113.25,116.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:121.57,126.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:175.183,182.30 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:186.2,187.30 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:193.2,204.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:210.2,214.12 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:227.2,227.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:182.30,185.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:187.30,191.3 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:204.35,209.3 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:214.12,215.7 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:215.7,216.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:217.37,220.21 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:221.27,223.11 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:232.55,234.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:238.65,243.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:247.60,249.16 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:252.2,254.48 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:258.2,258.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:262.2,263.44 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:267.2,269.12 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:272.2,277.32 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:289.2,289.29 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:293.2,293.52 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:302.2,302.12 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:249.16,251.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:254.48,257.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:258.26,261.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:263.44,266.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:269.12,271.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:277.32,278.29 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:281.3,281.29 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:286.3,287.8 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:278.29,279.17 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:281.29,282.17 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:282.17,283.18 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:289.29,292.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:293.52,295.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:295.8,296.53 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:300.3,300.115 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:296.53,299.4 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:306.36,316.16 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:320.2,321.16 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:325.2,325.64 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:316.16,319.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:321.16,324.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:325.64,327.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:332.32,338.35 6 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:341.2,343.18 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:338.35,340.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:347.65,351.25 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:355.2,363.11 8 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:351.25,354.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:367.49,371.39 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:371.39,374.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:379.64,384.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:388.70,389.36 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:392.2,394.16 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:397.2,399.48 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:403.2,403.27 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:407.2,408.44 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:412.2,414.55 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:423.2,423.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:389.36,391.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:394.16,396.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:399.48,402.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:403.27,406.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:408.44,411.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:414.55,416.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:416.8,417.56 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:421.3,421.141 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:417.56,420.4 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:427.69,439.16 7 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:443.2,444.16 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:448.2,448.86 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:439.16,442.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:444.16,447.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:448.86,450.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:454.53,460.2 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:465.42,471.34 5 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:476.2,478.34 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:481.2,481.15 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:471.34,475.3 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:478.34,480.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:491.59,500.49 8 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:505.2,505.12 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/valuetracker.go:500.49,504.3 3 0 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:42.139,43.36 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:52.2,58.108 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:67.2,67.107 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:83.2,83.10 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:43.36,45.15 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:48.3,49.12 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:45.15,47.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:58.108,59.64 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:59.64,64.4 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:67.107,70.27 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:74.3,75.15 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:80.3,81.18 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:70.27,72.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:75.15,77.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:77.9,79.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:87.35,90.2 2 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:92.48,96.6 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:96.6,97.36 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:100.3,100.15 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:106.3,106.36 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:97.36,99.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:100.15,102.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:106.36,110.4 3 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:116.31,121.2 4 1 -github.com/ethereum/go-ethereum/les/vflux/client/wrsiterator.go:124.42,128.2 3 1 -github.com/ethereum/go-ethereum/log/handler_glog.go:54.45,58.2 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:61.46,63.2 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:74.44,76.2 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:93.53,95.51 2 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:136.2,143.12 6 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:95.51,97.21 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:101.3,102.22 2 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:105.3,107.47 3 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:111.3,112.17 2 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:115.3,115.17 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:119.3,120.53 2 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:127.3,127.42 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:130.3,133.51 3 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:97.21,98.12 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:102.22,104.4 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:107.47,109.4 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:112.17,114.4 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:115.17,116.12 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:120.53,121.19 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:121.19,123.5 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:123.10,123.25 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:123.25,125.5 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:127.42,129.4 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:151.58,154.21 2 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:157.2,159.46 3 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:163.2,163.41 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:166.2,166.50 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:170.2,176.12 5 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:154.21,156.3 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:159.46,161.3 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:163.41,165.3 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:166.50,168.3 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:181.44,183.41 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:201.2,201.50 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:205.2,205.41 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:209.2,214.9 4 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:228.2,228.18 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:231.2,231.12 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:183.41,191.12 4 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:191.12,198.4 4 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:201.50,203.3 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:205.41,207.3 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:214.9,216.35 2 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:223.3,223.10 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:226.3,226.18 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:216.35,217.60 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:217.60,219.10 2 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:223.10,225.4 1 0 -github.com/ethereum/go-ethereum/log/handler_glog.go:228.18,230.3 1 0 -github.com/ethereum/go-ethereum/log/handler_go14.go:14.44,16.2 1 0 -github.com/ethereum/go-ethereum/log/handler_go14.go:18.48,20.2 1 1 -github.com/ethereum/go-ethereum/log/handler_go14.go:22.37,24.2 1 0 -github.com/ethereum/go-ethereum/log/logger.go:30.37,31.11 1 0 -github.com/ethereum/go-ethereum/log/logger.go:32.16,33.17 1 0 -github.com/ethereum/go-ethereum/log/logger.go:34.16,35.17 1 0 -github.com/ethereum/go-ethereum/log/logger.go:36.15,37.17 1 0 -github.com/ethereum/go-ethereum/log/logger.go:38.15,39.17 1 0 -github.com/ethereum/go-ethereum/log/logger.go:40.16,41.17 1 0 -github.com/ethereum/go-ethereum/log/logger.go:42.15,43.17 1 0 -github.com/ethereum/go-ethereum/log/logger.go:44.10,45.21 1 0 -github.com/ethereum/go-ethereum/log/logger.go:50.30,51.11 1 0 -github.com/ethereum/go-ethereum/log/logger.go:52.16,53.16 1 0 -github.com/ethereum/go-ethereum/log/logger.go:54.16,55.16 1 0 -github.com/ethereum/go-ethereum/log/logger.go:56.15,57.16 1 0 -github.com/ethereum/go-ethereum/log/logger.go:58.15,59.16 1 0 -github.com/ethereum/go-ethereum/log/logger.go:60.16,61.16 1 0 -github.com/ethereum/go-ethereum/log/logger.go:62.15,63.16 1 0 -github.com/ethereum/go-ethereum/log/logger.go:64.10,65.21 1 0 -github.com/ethereum/go-ethereum/log/logger.go:71.51,72.19 1 0 -github.com/ethereum/go-ethereum/log/logger.go:73.23,74.23 1 0 -github.com/ethereum/go-ethereum/log/logger.go:75.23,76.23 1 0 -github.com/ethereum/go-ethereum/log/logger.go:77.14,78.22 1 0 -github.com/ethereum/go-ethereum/log/logger.go:79.14,80.22 1 0 -github.com/ethereum/go-ethereum/log/logger.go:81.23,82.23 1 0 -github.com/ethereum/go-ethereum/log/logger.go:83.14,84.22 1 0 -github.com/ethereum/go-ethereum/log/logger.go:85.10,86.62 1 0 -github.com/ethereum/go-ethereum/log/logger.go:133.74,147.2 1 0 -github.com/ethereum/go-ethereum/log/logger.go:149.49,153.2 3 0 -github.com/ethereum/go-ethereum/log/logger.go:155.75,161.2 5 0 -github.com/ethereum/go-ethereum/log/logger.go:163.56,165.2 1 0 -github.com/ethereum/go-ethereum/log/logger.go:167.56,169.2 1 0 -github.com/ethereum/go-ethereum/log/logger.go:171.55,173.2 1 0 -github.com/ethereum/go-ethereum/log/logger.go:175.55,177.2 1 0 -github.com/ethereum/go-ethereum/log/logger.go:179.56,181.2 1 0 -github.com/ethereum/go-ethereum/log/logger.go:183.55,186.2 2 0 -github.com/ethereum/go-ethereum/log/logger.go:188.39,190.2 1 0 -github.com/ethereum/go-ethereum/log/logger.go:192.40,194.2 1 1 -github.com/ethereum/go-ethereum/log/logger.go:196.49,198.19 1 0 -github.com/ethereum/go-ethereum/log/logger.go:209.2,209.21 1 0 -github.com/ethereum/go-ethereum/log/logger.go:213.2,213.12 1 0 -github.com/ethereum/go-ethereum/log/logger.go:198.19,199.37 1 0 -github.com/ethereum/go-ethereum/log/logger.go:199.37,201.4 1 0 -github.com/ethereum/go-ethereum/log/logger.go:209.21,211.3 1 0 -github.com/ethereum/go-ethereum/log/logger.go:234.38,238.22 3 0 -github.com/ethereum/go-ethereum/log/logger.go:244.2,244.12 1 0 -github.com/ethereum/go-ethereum/log/logger.go:238.22,242.3 3 0 -github.com/ethereum/go-ethereum/log/root.go:13.13,15.2 1 1 -github.com/ethereum/go-ethereum/log/root.go:19.37,21.2 1 0 -github.com/ethereum/go-ethereum/log/root.go:24.20,26.2 1 0 -github.com/ethereum/go-ethereum/log/root.go:33.44,35.2 1 0 -github.com/ethereum/go-ethereum/log/root.go:38.44,40.2 1 0 -github.com/ethereum/go-ethereum/log/root.go:43.43,45.2 1 0 -github.com/ethereum/go-ethereum/log/root.go:48.43,50.2 1 0 -github.com/ethereum/go-ethereum/log/root.go:53.44,55.2 1 0 -github.com/ethereum/go-ethereum/log/root.go:58.43,61.2 2 0 -github.com/ethereum/go-ethereum/log/root.go:68.69,70.2 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:13.88,16.2 2 0 -github.com/ethereum/go-ethereum/log/syslog.go:20.109,23.2 2 0 -github.com/ethereum/go-ethereum/log/syslog.go:25.82,26.16 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:29.2,29.41 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:49.2,49.52 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:26.16,28.3 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:29.41,31.16 2 0 -github.com/ethereum/go-ethereum/log/syslog.go:46.3,47.21 2 0 -github.com/ethereum/go-ethereum/log/syslog.go:32.16,33.25 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:34.17,35.24 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:36.16,37.28 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:38.16,39.25 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:40.17,41.26 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:42.17,43.36 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:43.36,43.50 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:52.90,54.2 1 0 -github.com/ethereum/go-ethereum/log/syslog.go:56.111,58.2 1 0 -github.com/ethereum/go-ethereum/log/format.go:32.31,33.11 1 0 -github.com/ethereum/go-ethereum/log/format.go:33.11,35.3 1 0 -github.com/ethereum/go-ethereum/log/format.go:35.8,37.3 1 0 -github.com/ethereum/go-ethereum/log/format.go:61.48,63.2 1 1 -github.com/ethereum/go-ethereum/log/format.go:67.46,69.2 1 0 -github.com/ethereum/go-ethereum/log/format.go:88.43,89.43 1 0 -github.com/ethereum/go-ethereum/log/format.go:89.43,91.15 2 0 -github.com/ethereum/go-ethereum/log/format.go:108.3,110.47 3 0 -github.com/ethereum/go-ethereum/log/format.go:138.3,139.45 2 0 -github.com/ethereum/go-ethereum/log/format.go:143.3,144.19 2 0 -github.com/ethereum/go-ethereum/log/format.go:91.15,92.17 1 0 -github.com/ethereum/go-ethereum/log/format.go:93.17,94.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:95.18,96.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:97.17,98.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:99.17,100.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:101.18,102.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:103.18,104.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:110.47,113.41 2 0 -github.com/ethereum/go-ethereum/log/format.go:117.4,118.29 2 0 -github.com/ethereum/go-ethereum/log/format.go:122.4,125.17 2 0 -github.com/ethereum/go-ethereum/log/format.go:113.41,115.5 1 0 -github.com/ethereum/go-ethereum/log/format.go:118.29,121.5 2 0 -github.com/ethereum/go-ethereum/log/format.go:125.17,127.5 1 0 -github.com/ethereum/go-ethereum/log/format.go:127.10,129.5 1 0 -github.com/ethereum/go-ethereum/log/format.go:130.9,131.17 1 0 -github.com/ethereum/go-ethereum/log/format.go:131.17,133.5 1 0 -github.com/ethereum/go-ethereum/log/format.go:133.10,135.5 1 0 -github.com/ethereum/go-ethereum/log/format.go:139.45,141.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:153.28,154.43 1 1 -github.com/ethereum/go-ethereum/log/format.go:154.43,159.3 4 0 -github.com/ethereum/go-ethereum/log/format.go:162.73,163.35 1 0 -github.com/ethereum/go-ethereum/log/format.go:198.2,198.21 1 0 -github.com/ethereum/go-ethereum/log/format.go:163.35,164.13 1 0 -github.com/ethereum/go-ethereum/log/format.go:168.3,170.10 3 0 -github.com/ethereum/go-ethereum/log/format.go:175.3,180.54 5 0 -github.com/ethereum/go-ethereum/log/format.go:187.3,187.16 1 0 -github.com/ethereum/go-ethereum/log/format.go:193.3,194.41 2 0 -github.com/ethereum/go-ethereum/log/format.go:164.13,166.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:170.10,172.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:180.54,186.4 4 0 -github.com/ethereum/go-ethereum/log/format.go:187.16,189.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:189.9,192.4 2 0 -github.com/ethereum/go-ethereum/log/format.go:194.41,196.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:203.26,205.2 1 0 -github.com/ethereum/go-ethereum/log/format.go:210.61,212.12 2 0 -github.com/ethereum/go-ethereum/log/format.go:217.2,217.43 1 0 -github.com/ethereum/go-ethereum/log/format.go:212.12,213.53 1 0 -github.com/ethereum/go-ethereum/log/format.go:213.53,215.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:217.43,225.38 6 0 -github.com/ethereum/go-ethereum/log/format.go:233.3,236.17 3 0 -github.com/ethereum/go-ethereum/log/format.go:242.3,242.20 1 0 -github.com/ethereum/go-ethereum/log/format.go:245.3,245.11 1 0 -github.com/ethereum/go-ethereum/log/format.go:225.38,227.11 2 0 -github.com/ethereum/go-ethereum/log/format.go:230.4,231.50 2 0 -github.com/ethereum/go-ethereum/log/format.go:227.11,229.5 1 0 -github.com/ethereum/go-ethereum/log/format.go:236.17,241.4 2 0 -github.com/ethereum/go-ethereum/log/format.go:242.20,244.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:252.54,254.12 2 0 -github.com/ethereum/go-ethereum/log/format.go:260.2,260.43 1 0 -github.com/ethereum/go-ethereum/log/format.go:254.12,255.53 1 0 -github.com/ethereum/go-ethereum/log/format.go:255.53,257.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:260.43,267.38 5 0 -github.com/ethereum/go-ethereum/log/format.go:275.3,276.17 2 0 -github.com/ethereum/go-ethereum/log/format.go:283.3,283.20 1 0 -github.com/ethereum/go-ethereum/log/format.go:287.3,287.11 1 0 -github.com/ethereum/go-ethereum/log/format.go:267.38,269.11 2 0 -github.com/ethereum/go-ethereum/log/format.go:272.4,272.42 1 0 -github.com/ethereum/go-ethereum/log/format.go:269.11,271.5 1 0 -github.com/ethereum/go-ethereum/log/format.go:276.17,281.4 2 0 -github.com/ethereum/go-ethereum/log/format.go:283.20,285.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:291.59,292.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:302.2,302.27 1 0 -github.com/ethereum/go-ethereum/log/format.go:292.15,293.35 1 0 -github.com/ethereum/go-ethereum/log/format.go:293.35,294.73 1 0 -github.com/ethereum/go-ethereum/log/format.go:294.73,296.5 1 0 -github.com/ethereum/go-ethereum/log/format.go:296.10,297.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:303.17,304.30 1 0 -github.com/ethereum/go-ethereum/log/format.go:306.13,307.19 1 0 -github.com/ethereum/go-ethereum/log/format.go:309.20,310.20 1 0 -github.com/ethereum/go-ethereum/log/format.go:312.10,313.11 1 0 -github.com/ethereum/go-ethereum/log/format.go:317.53,319.22 2 0 -github.com/ethereum/go-ethereum/log/format.go:320.101,321.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:322.10,323.35 1 0 -github.com/ethereum/go-ethereum/log/format.go:328.61,329.18 1 0 -github.com/ethereum/go-ethereum/log/format.go:333.2,333.27 1 0 -github.com/ethereum/go-ethereum/log/format.go:348.2,348.10 1 0 -github.com/ethereum/go-ethereum/log/format.go:354.2,355.27 2 0 -github.com/ethereum/go-ethereum/log/format.go:329.18,331.3 1 0 -github.com/ethereum/go-ethereum/log/format.go:334.17,338.30 1 0 -github.com/ethereum/go-ethereum/log/format.go:340.16,343.15 1 0 -github.com/ethereum/go-ethereum/log/format.go:346.3,346.31 1 0 -github.com/ethereum/go-ethereum/log/format.go:343.15,345.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:348.10,349.44 1 0 -github.com/ethereum/go-ethereum/log/format.go:349.44,352.4 1 0 -github.com/ethereum/go-ethereum/log/format.go:356.12,357.31 1 0 -github.com/ethereum/go-ethereum/log/format.go:358.15,359.61 1 0 -github.com/ethereum/go-ethereum/log/format.go:360.15,361.52 1 0 -github.com/ethereum/go-ethereum/log/format.go:362.12,363.41 1 0 -github.com/ethereum/go-ethereum/log/format.go:364.13,365.41 1 0 -github.com/ethereum/go-ethereum/log/format.go:366.13,367.41 1 0 -github.com/ethereum/go-ethereum/log/format.go:368.14,369.41 1 0 -github.com/ethereum/go-ethereum/log/format.go:371.11,372.37 1 0 -github.com/ethereum/go-ethereum/log/format.go:373.13,374.37 1 0 -github.com/ethereum/go-ethereum/log/format.go:375.13,376.30 1 0 -github.com/ethereum/go-ethereum/log/format.go:377.12,378.39 1 0 -github.com/ethereum/go-ethereum/log/format.go:379.14,380.39 1 0 -github.com/ethereum/go-ethereum/log/format.go:381.14,382.31 1 0 -github.com/ethereum/go-ethereum/log/format.go:383.14,384.25 1 0 -github.com/ethereum/go-ethereum/log/format.go:385.10,386.49 1 0 -github.com/ethereum/go-ethereum/log/format.go:391.40,392.11 1 1 -github.com/ethereum/go-ethereum/log/format.go:395.2,395.45 1 1 -github.com/ethereum/go-ethereum/log/format.go:392.11,394.3 1 1 -github.com/ethereum/go-ethereum/log/format.go:399.42,401.2 1 1 -github.com/ethereum/go-ethereum/log/format.go:403.52,405.16 1 1 -github.com/ethereum/go-ethereum/log/format.go:413.2,420.19 3 1 -github.com/ethereum/go-ethereum/log/format.go:430.2,430.9 1 1 -github.com/ethereum/go-ethereum/log/format.go:434.2,434.26 1 1 -github.com/ethereum/go-ethereum/log/format.go:405.16,406.10 1 1 -github.com/ethereum/go-ethereum/log/format.go:406.10,408.4 1 1 -github.com/ethereum/go-ethereum/log/format.go:408.9,410.4 1 1 -github.com/ethereum/go-ethereum/log/format.go:420.19,421.17 1 1 -github.com/ethereum/go-ethereum/log/format.go:421.17,424.4 2 1 -github.com/ethereum/go-ethereum/log/format.go:424.9,428.4 3 1 -github.com/ethereum/go-ethereum/log/format.go:430.9,433.3 2 1 -github.com/ethereum/go-ethereum/log/format.go:438.44,439.18 1 1 -github.com/ethereum/go-ethereum/log/format.go:442.2,442.17 1 1 -github.com/ethereum/go-ethereum/log/format.go:446.2,452.50 2 1 -github.com/ethereum/go-ethereum/log/format.go:468.2,468.26 1 1 -github.com/ethereum/go-ethereum/log/format.go:439.18,441.3 1 0 -github.com/ethereum/go-ethereum/log/format.go:442.17,444.3 1 0 -github.com/ethereum/go-ethereum/log/format.go:452.50,455.10 2 1 -github.com/ethereum/go-ethereum/log/format.go:456.17,457.14 1 1 -github.com/ethereum/go-ethereum/log/format.go:458.19,462.15 4 1 -github.com/ethereum/go-ethereum/log/format.go:463.11,465.11 2 1 -github.com/ethereum/go-ethereum/log/format.go:473.36,475.22 2 0 -github.com/ethereum/go-ethereum/log/format.go:482.2,482.19 1 0 -github.com/ethereum/go-ethereum/log/format.go:485.2,485.25 1 0 -github.com/ethereum/go-ethereum/log/format.go:475.22,477.38 1 0 -github.com/ethereum/go-ethereum/log/format.go:477.38,479.9 2 0 -github.com/ethereum/go-ethereum/log/format.go:482.19,484.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:24.52,26.2 1 1 -github.com/ethereum/go-ethereum/log/handler.go:30.43,32.2 1 0 -github.com/ethereum/go-ethereum/log/handler.go:41.55,42.41 1 1 -github.com/ethereum/go-ethereum/log/handler.go:46.2,46.36 1 1 -github.com/ethereum/go-ethereum/log/handler.go:42.41,45.3 2 0 -github.com/ethereum/go-ethereum/log/handler.go:52.37,54.43 2 1 -github.com/ethereum/go-ethereum/log/handler.go:54.43,58.3 3 0 -github.com/ethereum/go-ethereum/log/handler.go:65.61,67.16 2 0 -github.com/ethereum/go-ethereum/log/handler.go:70.2,70.55 1 0 -github.com/ethereum/go-ethereum/log/handler.go:67.16,69.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:75.69,77.16 2 0 -github.com/ethereum/go-ethereum/log/handler.go:81.2,81.61 1 0 -github.com/ethereum/go-ethereum/log/handler.go:77.16,79.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:92.40,94.2 1 0 -github.com/ethereum/go-ethereum/log/handler.go:98.43,99.43 1 0 -github.com/ethereum/go-ethereum/log/handler.go:99.43,102.3 2 0 -github.com/ethereum/go-ethereum/log/handler.go:107.43,108.43 1 0 -github.com/ethereum/go-ethereum/log/handler.go:108.43,111.3 2 0 -github.com/ethereum/go-ethereum/log/handler.go:115.53,117.2 1 0 -github.com/ethereum/go-ethereum/log/handler.go:124.59,125.43 1 0 -github.com/ethereum/go-ethereum/log/handler.go:125.43,127.17 2 0 -github.com/ethereum/go-ethereum/log/handler.go:130.3,130.18 1 0 -github.com/ethereum/go-ethereum/log/handler.go:127.17,129.4 1 0 -github.com/ethereum/go-ethereum/log/handler.go:147.64,148.43 1 0 -github.com/ethereum/go-ethereum/log/handler.go:148.43,149.12 1 0 -github.com/ethereum/go-ethereum/log/handler.go:152.3,152.13 1 0 -github.com/ethereum/go-ethereum/log/handler.go:149.12,151.4 1 0 -github.com/ethereum/go-ethereum/log/handler.go:163.75,164.51 1 0 -github.com/ethereum/go-ethereum/log/handler.go:164.51,165.14 1 0 -github.com/ethereum/go-ethereum/log/handler.go:174.3,174.38 1 0 -github.com/ethereum/go-ethereum/log/handler.go:179.3,179.15 1 0 -github.com/ethereum/go-ethereum/log/handler.go:166.23,167.25 1 0 -github.com/ethereum/go-ethereum/log/handler.go:168.24,169.26 1 0 -github.com/ethereum/go-ethereum/log/handler.go:170.23,171.25 1 0 -github.com/ethereum/go-ethereum/log/handler.go:174.38,175.23 1 0 -github.com/ethereum/go-ethereum/log/handler.go:175.23,177.5 1 0 -github.com/ethereum/go-ethereum/log/handler.go:190.54,191.51 1 0 -github.com/ethereum/go-ethereum/log/handler.go:191.51,193.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:205.42,206.43 1 0 -github.com/ethereum/go-ethereum/log/handler.go:206.43,207.24 1 0 -github.com/ethereum/go-ethereum/log/handler.go:211.3,211.13 1 0 -github.com/ethereum/go-ethereum/log/handler.go:207.24,210.4 1 0 -github.com/ethereum/go-ethereum/log/handler.go:230.45,231.43 1 0 -github.com/ethereum/go-ethereum/log/handler.go:231.43,233.24 2 0 -github.com/ethereum/go-ethereum/log/handler.go:241.3,241.13 1 0 -github.com/ethereum/go-ethereum/log/handler.go:233.24,235.18 2 0 -github.com/ethereum/go-ethereum/log/handler.go:238.4,238.65 1 0 -github.com/ethereum/go-ethereum/log/handler.go:235.18,237.5 1 0 -github.com/ethereum/go-ethereum/log/handler.go:248.50,249.43 1 0 -github.com/ethereum/go-ethereum/log/handler.go:249.43,252.3 2 0 -github.com/ethereum/go-ethereum/log/handler.go:260.54,262.12 2 0 -github.com/ethereum/go-ethereum/log/handler.go:267.2,267.29 1 0 -github.com/ethereum/go-ethereum/log/handler.go:262.12,263.23 1 0 -github.com/ethereum/go-ethereum/log/handler.go:263.23,265.4 1 0 -github.com/ethereum/go-ethereum/log/handler.go:274.37,275.43 1 1 -github.com/ethereum/go-ethereum/log/handler.go:275.43,279.38 2 0 -github.com/ethereum/go-ethereum/log/handler.go:295.3,295.13 1 0 -github.com/ethereum/go-ethereum/log/handler.go:299.3,299.18 1 0 -github.com/ethereum/go-ethereum/log/handler.go:279.38,281.10 2 0 -github.com/ethereum/go-ethereum/log/handler.go:281.10,283.19 2 0 -github.com/ethereum/go-ethereum/log/handler.go:283.19,286.6 2 0 -github.com/ethereum/go-ethereum/log/handler.go:286.11,287.43 1 0 -github.com/ethereum/go-ethereum/log/handler.go:290.6,290.18 1 0 -github.com/ethereum/go-ethereum/log/handler.go:287.43,289.7 1 0 -github.com/ethereum/go-ethereum/log/handler.go:295.13,297.4 1 0 -github.com/ethereum/go-ethereum/log/handler.go:303.49,306.30 2 0 -github.com/ethereum/go-ethereum/log/handler.go:310.2,310.19 1 0 -github.com/ethereum/go-ethereum/log/handler.go:314.2,314.21 1 0 -github.com/ethereum/go-ethereum/log/handler.go:318.2,320.23 3 0 -github.com/ethereum/go-ethereum/log/handler.go:323.2,324.28 2 0 -github.com/ethereum/go-ethereum/log/handler.go:327.2,327.20 1 0 -github.com/ethereum/go-ethereum/log/handler.go:306.30,308.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:310.19,312.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:314.21,316.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:320.23,322.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:324.28,326.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:333.31,334.43 1 1 -github.com/ethereum/go-ethereum/log/handler.go:334.43,336.3 1 0 -github.com/ethereum/go-ethereum/log/handler.go:344.41,345.16 1 0 -github.com/ethereum/go-ethereum/log/handler.go:348.2,348.10 1 0 -github.com/ethereum/go-ethereum/log/handler.go:345.16,346.13 1 0 -github.com/ethereum/go-ethereum/log/handler.go:353.63,355.2 1 0 -github.com/ethereum/go-ethereum/log/handler.go:357.71,359.2 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:117.92,122.2 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:125.88,129.2 3 0 -github.com/ethereum/go-ethereum/light/postprocess.go:144.118,156.2 3 0 -github.com/ethereum/go-ethereum/light/postprocess.go:160.108,163.6 3 0 -github.com/ethereum/go-ethereum/light/postprocess.go:163.6,165.14 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:166.12,168.24 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:169.19,171.11 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:177.11,178.14 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:172.22,173.21 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:174.40,174.40 0 0 -github.com/ethereum/go-ethereum/light/postprocess.go:184.107,186.17 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:189.2,192.32 3 0 -github.com/ethereum/go-ethereum/light/postprocess.go:198.2,199.12 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:186.17,188.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:192.32,194.17 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:194.17,196.4 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:203.86,208.15 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:211.2,215.12 5 0 -github.com/ethereum/go-ethereum/light/postprocess.go:208.15,209.13 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:219.44,221.16 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:225.2,225.23 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:251.2,253.12 3 0 -github.com/ethereum/go-ethereum/light/postprocess.go:221.16,223.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:225.23,228.55 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:230.3,238.17 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:247.3,247.140 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:228.55,228.78 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:238.17,240.56 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:240.56,243.5 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:243.10,245.5 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:248.8,250.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:259.59,261.22 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:264.2,269.6 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:294.2,294.38 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:297.2,298.12 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:261.22,263.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:269.6,271.24 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:274.3,274.37 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:286.3,286.47 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:292.3,292.38 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:271.24,272.9 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:274.37,285.4 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:286.47,287.40 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:290.4,290.17 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:287.40,289.5 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:294.38,296.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:307.98,312.2 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:315.94,319.2 3 0 -github.com/ethereum/go-ethereum/light/postprocess.go:337.126,352.2 5 0 -github.com/ethereum/go-ethereum/light/postprocess.go:356.114,363.26 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:385.2,385.50 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:388.2,390.50 3 0 -github.com/ethereum/go-ethereum/light/postprocess.go:397.2,397.22 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:363.26,364.13 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:364.13,365.34 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:365.34,367.9 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:367.9,368.58 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:368.58,370.14 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:371.25,373.14 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:374.43,374.43 0 0 -github.com/ethereum/go-ethereum/light/postprocess.go:377.12,379.12 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:385.50,387.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:390.50,392.21 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:395.3,395.25 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:392.21,394.4 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:401.113,403.17 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:406.2,408.32 3 0 -github.com/ethereum/go-ethereum/light/postprocess.go:414.2,415.12 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:403.17,405.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:408.32,410.17 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:410.17,412.4 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:419.92,421.31 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:424.2,424.12 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:421.31,423.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:428.50,431.50 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:457.2,458.16 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:462.2,462.23 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:488.2,492.12 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:431.50,436.49 5 0 -github.com/ethereum/go-ethereum/light/postprocess.go:447.3,451.20 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:436.49,438.18 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:441.4,442.19 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:445.4,445.42 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:438.18,440.5 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:442.19,444.5 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:451.20,453.4 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:453.9,455.4 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:458.16,460.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:462.23,465.55 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:467.3,475.17 4 0 -github.com/ethereum/go-ethereum/light/postprocess.go:484.3,484.142 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:465.55,465.78 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:475.17,477.56 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:477.56,480.5 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:480.10,482.5 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:485.8,487.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:497.65,499.22 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:502.2,503.50 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:506.2,507.12 2 0 -github.com/ethereum/go-ethereum/light/postprocess.go:499.22,501.3 1 0 -github.com/ethereum/go-ethereum/light/postprocess.go:503.50,505.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:38.87,41.2 2 1 -github.com/ethereum/go-ethereum/light/trie.go:43.95,45.2 1 1 -github.com/ethereum/go-ethereum/light/trie.go:53.71,55.2 1 1 -github.com/ethereum/go-ethereum/light/trie.go:57.88,59.2 1 1 -github.com/ethereum/go-ethereum/light/trie.go:61.58,62.23 1 0 -github.com/ethereum/go-ethereum/light/trie.go:63.16,65.20 2 0 -github.com/ethereum/go-ethereum/light/trie.go:69.3,69.13 1 0 -github.com/ethereum/go-ethereum/light/trie.go:70.10,71.47 1 0 -github.com/ethereum/go-ethereum/light/trie.go:65.20,68.4 2 0 -github.com/ethereum/go-ethereum/light/trie.go:75.85,76.25 1 1 -github.com/ethereum/go-ethereum/light/trie.go:79.2,80.20 2 1 -github.com/ethereum/go-ethereum/light/trie.go:83.2,87.22 5 1 -github.com/ethereum/go-ethereum/light/trie.go:76.25,78.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:80.20,82.3 1 1 -github.com/ethereum/go-ethereum/light/trie.go:90.86,93.2 2 0 -github.com/ethereum/go-ethereum/light/trie.go:95.48,97.2 1 0 -github.com/ethereum/go-ethereum/light/trie.go:105.54,108.38 3 1 -github.com/ethereum/go-ethereum/light/trie.go:112.2,112.17 1 1 -github.com/ethereum/go-ethereum/light/trie.go:108.38,111.3 2 1 -github.com/ethereum/go-ethereum/light/trie.go:115.79,118.16 3 0 -github.com/ethereum/go-ethereum/light/trie.go:121.2,121.32 1 0 -github.com/ethereum/go-ethereum/light/trie.go:118.16,120.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:121.32,123.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:126.54,128.32 2 0 -github.com/ethereum/go-ethereum/light/trie.go:128.32,130.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:133.47,135.32 2 0 -github.com/ethereum/go-ethereum/light/trie.go:135.32,137.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:140.78,141.19 1 0 -github.com/ethereum/go-ethereum/light/trie.go:144.2,144.30 1 0 -github.com/ethereum/go-ethereum/light/trie.go:141.19,143.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:147.38,148.19 1 0 -github.com/ethereum/go-ethereum/light/trie.go:151.2,151.22 1 0 -github.com/ethereum/go-ethereum/light/trie.go:148.19,150.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:154.67,156.2 1 1 -github.com/ethereum/go-ethereum/light/trie.go:158.45,160.2 1 0 -github.com/ethereum/go-ethereum/light/trie.go:162.89,164.2 1 0 -github.com/ethereum/go-ethereum/light/trie.go:168.57,169.6 1 1 -github.com/ethereum/go-ethereum/light/trie.go:169.6,171.20 2 1 -github.com/ethereum/go-ethereum/light/trie.go:174.3,174.17 1 1 -github.com/ethereum/go-ethereum/light/trie.go:177.3,177.49 1 1 -github.com/ethereum/go-ethereum/light/trie.go:180.3,181.60 2 1 -github.com/ethereum/go-ethereum/light/trie.go:171.20,173.4 1 1 -github.com/ethereum/go-ethereum/light/trie.go:174.17,176.4 1 1 -github.com/ethereum/go-ethereum/light/trie.go:177.49,179.4 1 1 -github.com/ethereum/go-ethereum/light/trie.go:181.60,183.4 1 1 -github.com/ethereum/go-ethereum/light/trie.go:193.69,196.19 2 1 -github.com/ethereum/go-ethereum/light/trie.go:205.2,205.21 1 1 -github.com/ethereum/go-ethereum/light/trie.go:209.2,209.11 1 1 -github.com/ethereum/go-ethereum/light/trie.go:196.19,197.22 1 1 -github.com/ethereum/go-ethereum/light/trie.go:197.22,199.18 2 1 -github.com/ethereum/go-ethereum/light/trie.go:202.4,202.14 1 1 -github.com/ethereum/go-ethereum/light/trie.go:199.18,201.5 1 1 -github.com/ethereum/go-ethereum/light/trie.go:205.21,208.3 2 1 -github.com/ethereum/go-ethereum/light/trie.go:212.49,214.21 2 1 -github.com/ethereum/go-ethereum/light/trie.go:218.2,218.11 1 1 -github.com/ethereum/go-ethereum/light/trie.go:214.21,217.3 2 1 -github.com/ethereum/go-ethereum/light/trie.go:222.45,224.6 2 1 -github.com/ethereum/go-ethereum/light/trie.go:224.6,227.10 3 1 -github.com/ethereum/go-ethereum/light/trie.go:230.3,230.35 1 1 -github.com/ethereum/go-ethereum/light/trie.go:234.3,236.71 3 1 -github.com/ethereum/go-ethereum/light/trie.go:227.10,229.4 1 1 -github.com/ethereum/go-ethereum/light/trie.go:230.35,233.4 2 0 -github.com/ethereum/go-ethereum/light/trie.go:236.71,238.4 1 0 -github.com/ethereum/go-ethereum/light/trie.go:242.39,243.19 1 1 -github.com/ethereum/go-ethereum/light/trie.go:246.2,246.32 1 1 -github.com/ethereum/go-ethereum/light/trie.go:243.19,245.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:249.38,250.45 1 1 -github.com/ethereum/go-ethereum/light/trie.go:253.2,253.21 1 1 -github.com/ethereum/go-ethereum/light/trie.go:256.2,257.57 2 1 -github.com/ethereum/go-ethereum/light/trie.go:260.2,260.12 1 1 -github.com/ethereum/go-ethereum/light/trie.go:250.45,252.3 1 0 -github.com/ethereum/go-ethereum/light/trie.go:253.21,255.3 1 1 -github.com/ethereum/go-ethereum/light/trie.go:257.57,259.3 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:90.93,111.2 4 1 -github.com/ethereum/go-ethereum/light/txpool.go:114.70,116.2 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:121.88,124.26 3 0 -github.com/ethereum/go-ethereum/light/txpool.go:127.2,128.22 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:131.2,131.23 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:134.2,134.19 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:124.26,126.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:128.22,130.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:131.23,133.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:142.68,144.27 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:144.27,146.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:146.8,148.3 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:152.84,153.29 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:160.2,160.8 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:153.29,154.10 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:154.10,156.4 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:156.9,158.4 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:166.115,168.28 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:171.2,172.16 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:176.2,177.42 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:183.2,183.17 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:197.2,197.12 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:168.28,170.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:172.16,174.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:177.42,178.43 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:178.43,180.4 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:183.17,185.74 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:188.3,191.27 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:195.3,195.26 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:185.74,187.4 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:191.27,194.4 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:202.71,204.38 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:213.2,213.15 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:204.38,205.27 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:211.3,211.27 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:205.27,210.4 4 0 -github.com/ethereum/go-ethereum/light/txpool.go:222.106,228.33 5 1 -github.com/ethereum/go-ethereum/light/txpool.go:242.2,242.42 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:246.2,246.33 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:249.2,251.43 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:260.2,260.71 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:278.2,278.17 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:228.33,229.51 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:233.3,233.50 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:229.51,232.4 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:233.50,236.19 3 1 -github.com/ethereum/go-ethereum/light/txpool.go:236.19,239.5 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:242.42,244.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:246.33,248.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:251.43,253.97 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:256.3,256.19 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:253.97,255.4 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:260.71,262.26 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:275.3,275.23 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:262.26,263.42 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:263.42,265.41 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:265.41,267.30 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:270.6,271.30 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:267.30,269.7 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:287.33,288.6 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:288.6,289.10 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:290.33,294.32 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:297.34,298.10 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:303.52,318.2 10 1 -github.com/ethereum/go-ethereum/light/txpool.go:321.28,328.2 4 0 -github.com/ethereum/go-ethereum/light/txpool.go:332.89,334.2 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:337.43,343.2 4 0 -github.com/ethereum/go-ethereum/light/txpool.go:346.82,355.59 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:359.2,360.54 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:366.2,367.32 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:374.2,374.27 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:380.2,380.62 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:385.2,386.16 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:389.2,389.20 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:392.2,392.29 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:355.59,357.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:360.54,362.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:367.32,369.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:374.27,376.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:380.62,382.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:386.16,388.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:389.20,391.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:397.75,400.31 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:403.2,404.16 2 1 -github.com/ethereum/go-ethereum/light/txpool.go:408.2,408.38 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:425.2,425.95 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:426.2,426.12 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:400.31,402.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:404.16,406.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:408.38,414.31 4 1 -github.com/ethereum/go-ethereum/light/txpool.go:421.3,421.69 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:414.31,416.4 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:425.95,425.152 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:431.75,435.16 4 1 -github.com/ethereum/go-ethereum/light/txpool.go:439.2,439.42 1 1 -github.com/ethereum/go-ethereum/light/txpool.go:443.2,446.12 3 1 -github.com/ethereum/go-ethereum/light/txpool.go:435.16,437.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:439.42,441.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:451.77,456.25 4 0 -github.com/ethereum/go-ethereum/light/txpool.go:461.2,461.21 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:456.25,457.43 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:457.43,459.4 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:461.21,463.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:468.73,470.38 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:473.2,473.12 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:470.38,472.3 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:478.75,484.34 5 0 -github.com/ethereum/go-ethereum/light/txpool.go:488.2,488.17 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:484.34,487.3 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:493.110,499.34 4 0 -github.com/ethereum/go-ethereum/light/txpool.go:504.2,505.24 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:499.34,502.3 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:510.95,516.34 4 0 -github.com/ethereum/go-ethereum/light/txpool.go:524.2,524.38 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:516.34,518.22 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:521.3,521.32 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:518.22,519.12 1 0 -github.com/ethereum/go-ethereum/light/txpool.go:528.64,534.25 5 0 -github.com/ethereum/go-ethereum/light/txpool.go:540.2,541.28 2 0 -github.com/ethereum/go-ethereum/light/txpool.go:534.25,539.3 4 0 -github.com/ethereum/go-ethereum/light/txpool.go:545.48,552.2 5 0 -github.com/ethereum/go-ethereum/light/lightchain.go:84.148,102.16 8 1 -github.com/ethereum/go-ethereum/light/lightchain.go:105.2,106.28 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:109.2,109.23 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:112.2,112.43 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:116.2,116.35 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:123.2,123.16 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:102.16,104.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:106.28,108.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:109.23,111.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:112.43,114.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:116.35,117.56 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:117.56,121.4 3 1 -github.com/ethereum/go-ethereum/light/lightchain.go:127.74,128.32 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:132.2,132.38 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:136.2,136.34 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:139.2,139.119 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:128.32,131.3 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:132.38,135.3 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:136.34,138.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:142.47,144.2 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:147.40,149.2 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:152.55,154.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:158.45,159.75 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:172.2,175.12 4 1 -github.com/ethereum/go-ethereum/light/lightchain.go:159.75,162.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:162.8,164.20 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:164.20,167.4 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:167.9,169.4 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:180.50,186.2 4 1 -github.com/ethereum/go-ethereum/light/lightchain.go:189.41,191.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:194.31,196.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:200.67,212.38 8 0 -github.com/ethereum/go-ethereum/light/lightchain.go:215.2,217.50 3 0 -github.com/ethereum/go-ethereum/light/lightchain.go:212.38,214.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:223.49,223.69 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:226.46,228.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:230.51,231.26 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:236.91,238.46 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:242.2,243.19 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:246.2,247.16 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:251.2,252.18 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:238.46,241.3 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:243.19,245.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:247.16,249.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:257.95,259.49 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:262.2,263.19 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:266.2,267.16 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:271.2,272.18 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:259.49,261.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:263.19,265.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:267.16,269.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:277.70,280.2 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:284.108,286.46 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:289.2,290.16 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:294.2,295.19 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:286.46,288.3 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:290.16,292.3 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:300.99,302.19 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:305.2,305.40 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:302.19,304.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:310.98,312.43 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:315.2,315.39 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:312.43,314.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:320.30,321.52 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:324.2,327.32 4 0 -github.com/ethereum/go-ethereum/light/lightchain.go:321.52,323.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:333.36,335.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:339.53,344.39 4 0 -github.com/ethereum/go-ethereum/light/lightchain.go:356.2,356.38 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:344.39,351.57 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:351.57,354.4 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:356.38,358.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:363.61,364.31 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:364.31,365.29 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:366.24,367.44 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:370.4,370.25 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:371.28,372.29 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:367.44,369.5 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:377.64,380.67 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:384.2,392.12 7 0 -github.com/ethereum/go-ethereum/light/lightchain.go:380.67,382.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:395.64,402.61 5 0 -github.com/ethereum/go-ethereum/light/lightchain.go:406.2,410.12 5 0 -github.com/ethereum/go-ethereum/light/lightchain.go:402.61,404.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:424.92,425.21 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:428.2,428.49 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:431.2,432.71 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:437.2,444.35 6 1 -github.com/ethereum/go-ethereum/light/lightchain.go:449.2,453.16 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:460.2,460.15 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:425.21,427.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:428.49,430.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:432.71,434.3 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:444.35,446.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:454.24,456.59 2 1 -github.com/ethereum/go-ethereum/light/lightchain.go:457.23,458.59 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:465.53,467.2 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:471.71,473.2 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:477.95,479.15 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:482.2,483.11 2 0 -github.com/ethereum/go-ethereum/light/lightchain.go:479.15,481.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:488.80,490.2 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:494.71,496.2 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:500.71,502.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:505.67,507.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:514.125,516.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:520.70,522.2 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:526.103,527.62 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:530.2,530.47 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:527.62,529.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:534.52,534.77 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:541.102,546.52 3 0 -github.com/ethereum/go-ethereum/light/lightchain.go:549.2,549.20 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:553.2,553.88 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:565.2,565.14 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:546.52,548.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:549.20,551.3 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:553.88,558.69 3 0 -github.com/ethereum/go-ethereum/light/lightchain.go:563.3,563.14 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:558.69,562.4 3 0 -github.com/ethereum/go-ethereum/light/lightchain.go:570.35,572.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:575.37,577.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:580.89,582.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:585.97,587.2 1 1 -github.com/ethereum/go-ethereum/light/lightchain.go:590.97,592.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:596.85,598.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:602.101,604.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:607.99,609.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:612.42,614.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:617.41,619.2 1 0 -github.com/ethereum/go-ethereum/light/lightchain.go:623.97,625.2 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:40.28,44.2 1 1 -github.com/ethereum/go-ethereum/light/nodeset.go:47.56,51.40 3 1 -github.com/ethereum/go-ethereum/light/nodeset.go:54.2,60.12 5 1 -github.com/ethereum/go-ethereum/light/nodeset.go:51.40,53.3 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:64.45,70.2 4 0 -github.com/ethereum/go-ethereum/light/nodeset.go:73.52,77.44 3 0 -github.com/ethereum/go-ethereum/light/nodeset.go:80.2,80.37 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:77.44,79.3 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:84.50,87.2 2 0 -github.com/ethereum/go-ethereum/light/nodeset.go:90.35,95.2 3 0 -github.com/ethereum/go-ethereum/light/nodeset.go:98.35,103.2 3 0 -github.com/ethereum/go-ethereum/light/nodeset.go:106.40,111.31 4 0 -github.com/ethereum/go-ethereum/light/nodeset.go:114.2,114.15 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:111.31,113.3 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:118.55,122.35 3 1 -github.com/ethereum/go-ethereum/light/nodeset.go:122.35,124.3 1 1 -github.com/ethereum/go-ethereum/light/nodeset.go:131.50,132.25 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:132.25,134.3 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:138.38,142.2 3 0 -github.com/ethereum/go-ethereum/light/nodeset.go:145.56,148.2 2 0 -github.com/ethereum/go-ethereum/light/nodeset.go:151.45,152.24 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:156.34,158.25 2 0 -github.com/ethereum/go-ethereum/light/nodeset.go:161.2,161.13 1 0 -github.com/ethereum/go-ethereum/light/nodeset.go:158.25,160.3 1 0 -github.com/ethereum/go-ethereum/light/odr.go:63.48,70.2 1 1 -github.com/ethereum/go-ethereum/light/odr.go:75.71,82.2 1 1 -github.com/ethereum/go-ethereum/light/odr.go:92.56,94.2 1 1 -github.com/ethereum/go-ethereum/light/odr.go:104.56,106.2 1 1 -github.com/ethereum/go-ethereum/light/odr.go:117.57,119.2 1 1 -github.com/ethereum/go-ethereum/light/odr.go:131.60,132.20 1 1 -github.com/ethereum/go-ethereum/light/odr.go:132.20,134.3 1 1 -github.com/ethereum/go-ethereum/light/odr.go:148.55,153.2 4 0 -github.com/ethereum/go-ethereum/light/odr.go:168.57,169.50 1 0 -github.com/ethereum/go-ethereum/light/odr.go:169.50,176.3 2 0 -github.com/ethereum/go-ethereum/light/odr.go:193.61,193.62 0 0 -github.com/ethereum/go-ethereum/light/odr_util.go:39.99,46.29 3 1 -github.com/ethereum/go-ethereum/light/odr_util.go:53.2,54.48 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:57.2,63.45 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:66.2,66.22 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:46.29,47.66 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:47.66,49.4 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:54.48,56.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:63.45,65.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:70.96,72.29 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:75.2,76.16 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:80.2,80.27 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:72.29,74.3 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:76.16,78.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:84.100,86.15 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:89.2,90.16 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:93.2,93.27 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:97.2,97.56 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:86.15,88.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:90.16,92.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:93.27,95.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:101.109,102.74 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:106.2,107.16 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:110.2,110.27 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:113.2,114.45 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:117.2,117.19 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:102.74,104.3 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:107.16,109.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:110.27,112.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:114.45,116.3 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:122.105,124.16 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:127.2,128.64 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:131.2,131.18 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:124.16,126.3 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:128.64,130.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:136.107,139.16 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:142.2,143.16 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:147.2,147.87 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:139.16,141.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:143.16,145.3 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:152.117,155.21 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:170.2,170.64 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:183.2,183.22 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:155.21,157.17 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:160.3,160.28 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:163.3,164.46 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:167.3,167.24 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:157.17,159.4 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:160.28,162.4 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:164.46,166.4 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:170.64,172.17 2 1 -github.com/ethereum/go-ethereum/light/odr_util.go:175.3,178.110 3 1 -github.com/ethereum/go-ethereum/light/odr_util.go:181.3,181.62 1 1 -github.com/ethereum/go-ethereum/light/odr_util.go:172.17,174.4 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:178.110,180.4 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:188.113,191.16 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:194.2,195.35 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:198.2,198.18 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:191.16,193.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:195.35,197.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:204.111,208.21 3 0 -github.com/ethereum/go-ethereum/light/odr_util.go:218.2,219.35 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:222.2,222.18 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:208.21,210.46 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:213.3,213.24 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:210.46,212.4 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:219.35,221.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:227.103,235.35 3 0 -github.com/ethereum/go-ethereum/light/odr_util.go:252.2,252.24 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:256.2,263.45 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:266.2,266.31 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:269.2,269.20 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:235.35,240.94 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:245.3,245.24 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:248.3,249.33 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:240.94,242.12 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:245.24,247.4 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:252.24,254.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:263.45,265.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:266.31,268.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:278.135,280.100 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:283.2,286.110 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:289.2,290.112 2 0 -github.com/ethereum/go-ethereum/light/odr_util.go:293.2,293.84 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:280.100,282.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:286.110,288.3 1 0 -github.com/ethereum/go-ethereum/light/odr_util.go:290.112,292.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:208.147,209.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:212.2,237.11 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:209.23,211.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:247.55,254.9 5 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:264.2,270.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:255.47,256.52 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:257.47,258.56 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:259.27,260.57 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:261.10,262.124 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:274.43,276.2 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:280.77,282.18 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:288.2,289.87 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:293.2,293.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:282.18,285.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:285.8,287.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:289.87,292.3 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:297.87,299.2 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:304.54,307.18 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:313.2,314.47 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:318.2,320.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:307.18,310.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:310.8,312.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:314.47,317.3 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:325.97,328.13 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:332.2,334.106 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:345.2,346.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:329.33,330.13 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:334.106,336.24 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:343.3,343.13 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:336.24,340.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:340.9,342.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:352.97,354.30 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:358.2,358.57 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:361.2,364.51 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:370.2,370.22 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:384.2,387.64 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:393.2,393.72 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:402.2,402.30 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:410.2,422.14 8 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:425.2,425.36 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:354.30,356.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:358.57,360.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:364.51,366.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:370.22,371.18 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:381.3,381.18 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:371.18,375.63 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:378.4,379.21 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:375.63,377.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:387.64,388.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:389.13,389.13 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:390.11,390.11 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:393.72,394.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:394.31,395.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:396.14,396.14 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:397.12,398.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:402.30,403.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:404.25,404.25 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:405.11,406.16 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:422.14,424.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:428.41,430.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:434.97,436.15 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:445.2,445.27 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:448.2,451.30 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:456.2,457.16 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:460.2,460.38 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:467.2,470.16 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:473.2,474.73 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:477.2,481.22 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:494.2,495.52 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:498.2,498.22 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:538.2,539.27 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:542.2,543.16 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:548.2,548.22 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:557.2,557.30 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:436.15,438.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:438.17,440.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:440.9,443.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:445.27,447.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:451.30,453.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:457.16,459.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:460.38,466.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:470.16,472.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:474.73,476.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:481.22,482.40 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:482.40,484.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:484.9,486.29 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:491.4,491.54 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:486.29,488.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:495.52,497.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:498.22,513.64 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:520.3,524.38 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:531.3,531.24 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:513.64,515.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:515.9,515.44 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:515.44,517.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:517.9,519.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:524.38,527.4 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:527.9,527.32 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:527.32,529.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:531.24,532.59 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:532.59,534.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:539.27,541.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:543.16,543.54 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:544.16,544.52 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:545.16,545.54 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:546.16,546.57 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:548.22,553.44 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:553.44,553.81 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:554.8,554.29 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:554.29,556.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:562.63,565.30 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:570.2,571.37 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:582.2,584.12 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:565.30,567.13 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:567.13,567.54 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:571.37,572.27 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:578.3,578.53 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:572.27,577.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:578.53,579.9 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:590.31,595.23 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:595.23,596.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:597.21,597.21 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:599.11,600.21 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:607.31,610.2 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:614.34,617.9 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:622.2,625.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:618.18,618.18 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:619.10,620.18 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:630.104,637.22 5 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:640.2,644.6 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:637.22,639.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:644.6,645.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:646.21,647.32 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:649.31,651.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:656.4,657.49 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:663.4,664.86 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:667.4,667.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:676.4,677.77 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:680.4,680.27 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:682.18,684.31 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:686.19,686.19 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:687.22,687.22 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:651.31,653.10 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:657.49,659.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:664.86,666.5 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:667.25,668.75 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:671.5,672.26 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:668.75,670.6 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:677.77,679.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:701.87,712.21 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:717.2,718.23 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:721.2,723.14 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:726.2,726.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:730.2,731.22 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:734.2,734.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:737.2,738.14 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:741.2,742.50 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:712.21,714.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:718.23,720.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:723.14,725.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:726.15,728.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:731.22,733.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:734.15,736.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:738.14,740.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:750.98,758.14 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:766.2,770.30 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:773.2,773.36 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:779.2,779.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:797.2,798.16 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:805.2,805.41 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:809.2,810.16 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:813.2,813.22 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:759.16,760.56 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:761.16,762.60 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:763.10,764.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:770.30,772.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:773.36,776.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:779.23,781.21 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:792.3,792.33 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:781.21,783.22 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:783.22,785.36 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:788.5,788.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:785.36,786.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:792.33,794.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:798.16,800.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:805.41,807.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:810.16,812.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:816.161,828.36 7 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:889.2,889.29 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:897.2,897.30 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:828.36,829.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:830.21,831.25 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:833.31,835.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:840.4,841.25 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:846.4,846.35 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:854.4,855.43 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:879.18,881.24 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:883.19,883.19 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:884.22,884.22 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:835.31,837.10 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:841.25,844.5 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:846.35,848.64 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:848.64,851.6 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:855.43,857.77 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:861.5,865.17 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:873.5,873.14 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:857.77,858.14 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:866.19,867.41 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:868.19,869.45 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:870.13,871.42 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:873.14,875.11 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:889.29,890.29 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:894.3,895.21 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:890.29,893.4 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:900.150,905.15 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:908.2,910.20 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:975.2,975.27 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:979.2,980.19 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:905.15,907.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:910.20,920.35 5 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:920.35,921.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:922.22,923.26 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:925.32,927.32 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:932.5,933.26 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:937.5,944.17 5 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:952.5,952.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:956.5,957.40 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:961.5,962.13 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:964.19,966.25 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:968.20,968.20 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:969.23,969.23 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:927.32,929.11 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:933.26,936.6 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:945.19,946.41 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:947.19,948.45 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:949.13,950.42 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:952.15,954.11 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:957.40,960.6 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:975.27,978.3 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:991.73,1004.34 10 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1018.2,1018.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1033.2,1037.6 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1004.34,1010.15 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1010.15,1013.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1013.9,1016.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1018.25,1031.3 9 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1037.6,1038.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1039.21,1040.22 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1042.31,1044.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1048.4,1055.28 5 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1058.4,1060.16 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1090.4,1090.39 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1096.4,1096.27 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1117.4,1120.16 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1160.4,1160.24 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1188.20,1189.25 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1196.4,1201.66 4 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1207.4,1207.11 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1211.4,1211.65 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1044.31,1046.10 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1055.28,1057.5 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1060.16,1061.28 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1085.5,1087.13 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1061.28,1065.95 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1069.6,1069.99 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1073.6,1083.50 6 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1065.95,1068.7 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1069.99,1072.7 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1090.39,1093.13 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1096.27,1098.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1109.5,1110.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1098.61,1100.13 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1101.43,1103.15 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1104.24,1105.25 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1111.32,1112.16 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1113.23,1114.24 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1120.16,1122.19 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1126.5,1127.27 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1122.19,1125.6 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1128.10,1132.33 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1132.33,1135.27 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1146.6,1146.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1150.6,1150.72 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1135.27,1137.7 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1137.12,1139.71 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1139.71,1141.8 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1146.25,1148.7 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1150.72,1152.20 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1155.7,1155.34 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1152.20,1154.8 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1160.24,1162.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1167.5,1171.30 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1163.36,1163.36 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1164.23,1165.24 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1171.30,1173.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1173.11,1175.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1176.10,1179.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1180.42,1182.14 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1183.23,1184.24 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1189.25,1193.10 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1201.66,1202.12 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1203.22,1203.22 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1204.23,1204.23 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1208.31,1208.31 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1209.22,1209.22 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1225.110,1230.48 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1244.2,1251.28 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1230.48,1233.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1234.35,1234.98 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1235.76,1237.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1238.63,1238.114 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1239.42,1239.102 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1240.76,1242.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1257.53,1261.48 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1270.2,1275.12 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1261.48,1264.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1265.36,1265.98 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1266.63,1266.92 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1267.42,1267.101 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1268.76,1268.119 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1281.55,1285.48 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1296.2,1301.12 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1285.48,1288.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1289.36,1289.100 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1290.63,1290.94 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1291.42,1291.103 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1292.76,1294.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1332.106,1342.6 5 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1342.6,1343.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1344.21,1345.22 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1347.31,1351.58 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1374.4,1374.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1379.25,1381.13 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1385.4,1385.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1390.19,1392.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1397.17,1399.26 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1403.4,1403.37 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1439.4,1439.22 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1447.4,1450.31 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1494.4,1494.85 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1351.58,1354.40 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1360.5,1360.42 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1364.5,1364.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1354.40,1356.6 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1360.42,1362.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1365.44,1366.66 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1367.21,1368.90 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1369.13,1370.82 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1375.30,1375.30 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1376.12,1376.12 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1381.13,1383.5 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1386.30,1386.30 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1387.12,1387.12 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1393.30,1393.30 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1394.12,1394.12 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1399.26,1401.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1403.37,1404.47 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1404.47,1412.19 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1412.19,1415.7 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1415.12,1418.28 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1418.28,1422.8 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1422.13,1430.18 5 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1430.18,1433.9 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1439.22,1440.32 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1444.5,1444.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1440.32,1443.6 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1450.31,1452.18 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1456.5,1456.46 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1462.5,1463.17 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1466.5,1466.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1470.5,1470.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1473.5,1473.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1479.5,1479.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1482.5,1482.48 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1490.5,1490.19 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1452.18,1453.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1456.46,1457.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1463.17,1465.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1466.17,1469.6 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1470.23,1471.14 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1473.25,1475.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1475.11,1477.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1479.25,1481.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1482.48,1488.70 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1494.85,1496.5 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1504.71,1511.15 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1534.2,1536.6 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1511.15,1512.19 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1512.19,1514.25 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1518.4,1518.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1522.4,1523.25 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1527.4,1530.80 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1514.25,1517.5 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1518.61,1521.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1523.25,1526.5 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1536.6,1537.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1538.21,1540.22 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1542.36,1544.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1588.4,1589.25 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1661.4,1662.39 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1665.4,1668.66 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1544.25,1546.67 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1564.5,1564.26 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1577.5,1577.46 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1584.5,1585.15 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1546.67,1547.13 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1548.23,1548.23 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1549.24,1549.24 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1564.26,1566.86 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1566.86,1568.7 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1577.46,1579.75 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1579.75,1581.7 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1589.25,1591.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1598.5,1599.29 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1602.5,1605.46 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1640.5,1640.45 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1657.5,1658.28 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1592.23,1594.24 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1595.13,1595.13 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1599.29,1601.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1605.46,1610.30 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1613.6,1616.81 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1619.6,1619.80 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1630.6,1630.26 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1610.30,1612.7 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1616.81,1618.7 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1619.80,1623.72 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1626.7,1627.56 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1623.72,1625.8 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1630.26,1632.52 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1632.52,1634.8 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1634.13,1636.8 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1640.45,1642.103 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1651.6,1652.36 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1642.103,1643.14 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1644.25,1646.26 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1647.38,1647.38 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1652.36,1655.7 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1662.39,1664.5 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1668.66,1669.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1670.21,1670.21 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1671.13,1671.13 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1679.53,1680.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1680.6,1682.24 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1685.3,1685.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1688.3,1688.55 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1682.24,1684.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1685.31,1687.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1688.55,1690.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1694.71,1696.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1699.2,1699.9 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1705.2,1711.33 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1714.2,1714.64 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1726.2,1726.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1696.23,1698.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1700.18,1701.36 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1702.10,1702.10 0 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1711.33,1713.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1714.64,1715.27 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1724.3,1724.52 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1715.27,1717.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1717.9,1723.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1731.53,1738.15 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1745.2,1745.35 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1750.2,1758.6 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1738.15,1743.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1745.35,1746.114 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1746.114,1748.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1758.6,1762.24 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1775.3,1775.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1780.3,1784.22 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1795.3,1795.42 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1817.3,1818.61 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1821.3,1821.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1847.3,1847.54 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1762.24,1764.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1768.4,1768.11 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1764.23,1766.5 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1769.22,1771.23 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1772.12,1772.12 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1775.31,1777.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1784.22,1785.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1785.31,1790.5 3 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1791.9,1793.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1795.42,1804.128 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1804.128,1815.5 6 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1818.61,1820.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1821.15,1823.21 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1831.4,1831.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1823.21,1829.5 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1832.21,1833.24 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1836.5,1836.49 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1839.5,1839.19 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1841.35,1843.13 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1833.24,1835.6 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1836.49,1838.6 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1847.54,1849.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1853.108,1854.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1857.2,1857.80 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1862.2,1862.33 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1873.2,1873.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1854.23,1856.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1857.80,1860.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1862.33,1864.10 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1865.20,1866.35 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1867.21,1868.14 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1869.11,1870.33 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1876.93,1878.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1881.2,1881.9 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1891.2,1898.33 5 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1902.2,1902.97 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1906.2,1906.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1878.23,1880.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1882.18,1883.36 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1884.24,1885.42 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1888.10,1888.10 0 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1885.42,1887.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1898.33,1901.3 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1902.97,1905.3 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1909.66,1914.133 3 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1917.2,1917.70 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1920.2,1921.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1914.133,1916.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1917.70,1919.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1926.79,1928.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1931.116,1933.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1936.84,1938.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1941.70,1943.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1947.83,1948.33 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1949.32,1951.17 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1954.3,1954.82 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1956.33,1958.81 2 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1960.29,1961.65 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1963.29,1964.65 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1966.10,1967.63 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1951.17,1953.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1972.115,1975.15 2 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1981.2,1984.19 4 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1987.2,1987.9 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1975.15,1976.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1976.17,1978.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1984.19,1986.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1988.24,1989.13 1 1 -github.com/ethereum/go-ethereum/les/downloader/downloader.go:1990.16,1991.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/modes.go:32.37,34.2 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:37.38,38.14 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:39.16,40.16 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:41.16,42.16 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:43.16,44.16 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:45.17,46.17 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:47.10,48.19 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:52.52,53.14 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:54.16,55.29 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:56.16,57.29 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:58.16,59.29 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:60.17,61.30 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:62.10,63.55 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:67.56,68.22 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:80.2,80.12 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:69.14,70.19 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:71.14,72.19 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:73.14,74.19 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:75.15,76.20 1 0 -github.com/ethereum/go-ethereum/les/downloader/modes.go:77.10,78.82 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:48.38,50.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:62.61,65.9 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:75.2,75.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:66.29,70.14 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:71.18,73.16 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:80.37,81.6 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:81.6,82.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:83.32,84.32 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:87.20,87.20 0 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:89.19,90.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:84.32,86.5 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:97.60,105.15 3 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:113.2,121.6 6 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:105.15,108.30 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:108.30,111.4 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:121.6,127.24 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:132.3,132.10 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:127.24,130.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:134.35,136.15 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:138.17,140.14 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:143.35,147.41 3 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:150.28,153.18 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:158.4,163.33 5 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:166.24,169.18 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:173.4,178.24 5 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:181.25,185.34 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:188.4,191.31 3 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:194.33,201.46 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:210.4,210.51 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:213.4,213.29 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:153.18,155.13 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:169.18,170.13 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:185.34,186.13 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:201.46,208.5 5 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:210.51,212.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:221.146,223.22 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:252.2,252.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:223.22,228.10 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:241.3,241.17 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:244.3,247.56 4 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:230.28,232.24 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:234.24,236.23 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:238.24,239.22 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:241.17,242.12 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:252.31,254.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:296.63,309.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:314.27,316.18 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:321.2,321.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:316.18,318.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:318.8,320.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:325.34,328.2 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:331.36,332.25 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:335.2,335.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:332.25,334.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:344.40,349.15 4 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:357.2,357.28 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:407.2,407.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:349.15,351.17 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:351.17,353.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:357.28,358.40 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:361.3,363.10 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:358.40,360.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:364.18,364.18 0 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:367.19,368.30 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:370.23,371.22 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:373.27,376.57 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:399.4,401.18 3 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:376.57,380.28 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:380.28,384.6 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:384.11,392.16 5 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:392.16,395.7 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:401.18,404.5 2 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:410.46,411.57 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:414.2,416.42 3 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:419.2,419.34 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:422.2,425.12 4 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:411.57,413.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:416.42,418.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:419.34,421.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:430.35,433.26 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:433.26,441.32 4 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:441.32,443.11 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:444.34,445.52 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:446.20,446.20 0 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:447.24,447.24 0 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:455.119,457.65 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:473.2,480.35 6 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:495.2,495.35 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:513.2,514.28 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:457.65,459.30 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:465.3,465.30 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:459.30,464.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:465.30,469.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:480.35,482.33 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:486.3,486.43 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:490.3,493.28 4 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:482.33,483.9 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:486.43,487.12 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:495.35,497.33 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:501.3,501.43 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:505.3,511.28 5 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:497.33,498.9 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:501.43,502.12 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:521.57,525.30 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:532.2,532.36 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:551.2,552.40 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:567.2,567.40 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:582.2,582.24 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:525.30,526.38 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:526.38,528.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:532.36,534.14 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:547.3,548.30 2 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:535.12,538.16 3 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:539.29,540.16 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:541.33,542.15 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:543.11,544.90 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:552.40,556.46 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:561.3,561.35 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:565.3,565.27 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:556.46,558.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:561.35,563.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:567.40,571.46 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:576.3,576.35 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:580.3,580.27 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:571.46,573.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:576.35,578.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:588.71,595.2 6 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:599.93,608.52 7 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:611.2,611.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:608.52,610.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/statesync.go:611.18,613.3 0 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:41.38,41.57 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:42.38,42.63 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:43.38,43.82 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:52.36,52.55 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:53.32,54.42 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:57.2,57.22 1 0 -github.com/ethereum/go-ethereum/les/downloader/types.go:54.42,56.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:59.35,59.102 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:67.39,67.58 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:68.39,68.65 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:69.39,69.84 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:77.37,77.56 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:78.37,78.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/types.go:79.37,79.80 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:41.83,52.2 3 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:56.45,62.6 2 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:62.6,63.10 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:64.43,65.37 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:66.45,68.24 2 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:69.30,70.20 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:74.4,75.29 2 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:85.4,85.37 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:70.20,72.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:76.20,80.6 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:81.32,82.25 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:85.37,87.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:93.89,95.16 2 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:99.2,101.12 2 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:119.2,119.20 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:95.16,97.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:101.12,105.7 3 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:105.7,106.11 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:107.30,108.39 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:109.24,111.11 2 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:112.29,114.11 2 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:144.48,145.24 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:145.24,149.7 3 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:149.7,150.11 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:151.15,153.13 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:154.27,155.11 1 0 -github.com/ethereum/go-ethereum/les/downloader/api.go:163.102,166.2 2 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:91.59,91.83 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:92.106,94.2 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:95.103,97.2 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:98.63,99.64 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:101.65,102.66 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:104.65,105.66 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:109.95,117.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:120.34,130.2 7 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:133.69,135.54 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:138.2,143.12 3 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:135.54,137.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:147.67,149.53 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:152.2,154.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:163.2,163.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:149.53,151.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:154.12,157.42 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:160.3,160.31 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:157.42,159.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:167.69,169.55 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:172.2,174.12 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:183.2,183.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:169.55,171.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:174.12,177.42 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:180.3,180.33 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:177.42,179.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:187.68,189.53 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:192.2,196.12 3 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:189.53,191.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:202.80,205.2 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:210.79,213.2 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:218.81,221.2 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:226.81,229.2 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:233.70,235.26 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:238.2,238.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:235.26,237.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:243.69,245.25 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:248.2,248.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:245.25,247.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:253.71,255.27 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:258.2,258.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:255.27,257.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:263.72,265.25 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:268.2,268.12 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:265.25,267.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:274.56,278.41 3 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:284.2,284.30 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:278.41,279.31 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:279.31,281.9 2 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:289.55,295.2 4 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:310.28,315.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:318.84,320.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:323.85,325.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:329.28,333.32 3 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:333.32,335.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:344.54,347.33 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:351.2,352.54 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:355.2,359.12 4 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:347.33,350.3 2 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:352.54,354.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:364.48,367.9 3 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:371.2,376.12 5 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:367.9,370.3 2 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:380.52,385.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:388.30,393.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:396.49,401.29 4 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:404.2,404.13 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:401.29,403.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/peer.go:409.63,410.39 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:413.2,413.44 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:416.2,416.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:410.39,412.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:413.44,415.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:421.61,422.39 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:425.2,425.44 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:428.2,428.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:422.39,424.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:425.44,427.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:433.64,434.39 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:437.2,437.44 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:440.2,440.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:434.39,436.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:437.44,439.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:445.65,446.39 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:449.2,449.44 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:452.2,452.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:446.39,448.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:449.44,451.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:458.160,467.29 4 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:478.2,480.27 3 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:467.29,468.59 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:468.59,469.20 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:473.4,473.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:469.20,472.5 2 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:490.39,492.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:494.49,496.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/peer.go:498.44,501.2 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:73.71,77.25 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:80.2,80.41 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:83.2,83.13 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:77.25,79.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:80.41,82.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:87.37,88.67 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:88.67,90.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:94.38,96.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:99.41,100.70 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:100.70,102.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:106.44,109.2 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:146.69,157.2 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:160.70,180.2 14 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:184.25,189.2 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:192.38,197.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:200.37,205.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:208.39,213.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:217.40,222.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:226.39,231.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:235.41,240.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:243.29,251.2 5 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:255.73,260.28 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:264.2,272.34 8 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:260.28,261.49 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:272.34,277.3 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:282.58,290.2 5 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:294.80,300.33 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:333.2,333.16 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:300.33,303.61 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:307.3,307.75 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:314.3,314.41 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:321.3,321.52 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:329.3,331.9 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:303.61,305.9 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:307.75,309.9 2 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:314.41,316.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:316.9,319.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:321.52,322.44 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:322.44,324.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:324.10,327.5 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:340.52,342.50 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:345.2,346.52 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:365.2,366.33 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:383.2,387.48 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:393.2,393.16 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:342.50,344.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:346.52,355.52 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:360.3,362.18 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:355.52,357.9 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:366.33,369.39 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:372.3,372.43 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:375.3,375.42 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:378.3,379.61 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:369.39,371.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:372.43,374.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:375.42,377.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:387.48,392.3 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:396.39,401.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:403.39,409.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:413.76,419.41 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:423.2,424.46 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:435.2,435.28 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:439.2,439.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:442.2,448.16 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:419.41,421.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:424.46,426.36 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:432.3,432.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:426.36,427.58 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:427.58,429.13 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:435.28,437.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:439.15,441.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:454.89,459.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:464.91,469.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:484.76,487.23 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:490.2,490.33 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:494.2,498.65 5 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:549.2,549.30 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:552.2,552.39 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:557.2,557.20 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:560.2,566.37 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:487.23,489.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:490.33,492.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:498.65,507.12 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:517.3,517.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:525.3,525.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:531.3,531.22 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:540.3,542.29 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:507.12,515.12 6 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:517.15,523.9 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:525.17,529.9 2 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:531.22,537.12 5 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:542.29,544.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:544.9,546.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:549.30,551.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:552.39,555.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:557.20,559.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:570.54,574.2 3 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:578.53,582.2 3 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:586.55,590.2 3 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:593.106,594.22 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:597.2,597.41 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:600.2,600.35 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:594.22,596.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:597.41,599.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:606.39,610.48 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:616.2,616.50 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:610.48,611.42 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:614.3,614.34 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:611.42,613.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:616.50,617.42 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:620.3,620.36 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:617.42,619.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:626.69,631.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:635.68,640.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:644.70,649.2 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:657.149,660.36 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:679.2,679.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:660.36,661.41 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:661.41,666.24 2 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:669.4,669.43 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:673.4,676.24 2 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:666.24,668.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:669.43,671.5 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:689.116,694.18 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:701.2,702.20 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:705.2,712.14 5 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:721.2,721.14 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:740.2,740.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:754.2,758.98 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:761.2,761.15 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:774.2,774.32 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:777.2,777.26 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:694.18,697.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:697.8,699.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:702.20,704.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:712.14,713.49 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:713.49,716.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:716.9,716.54 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:716.54,719.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:721.14,723.38 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:723.38,725.76 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:730.4,730.39 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:736.4,736.21 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:725.76,728.10 3 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:730.39,733.10 3 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:740.15,744.18 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:748.3,751.48 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:744.18,747.4 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:758.98,760.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:761.15,766.10 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:767.32,769.34 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:770.11,770.11 0 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:774.32,776.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:783.117,787.58 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:797.2,797.54 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:802.2,803.53 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:787.58,788.87 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:791.3,791.65 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:794.3,794.13 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:788.87,790.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:791.65,793.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:797.54,801.3 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:809.89,813.58 4 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:819.2,819.54 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:823.2,824.60 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:813.58,814.92 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:817.3,817.13 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:814.92,816.4 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:819.54,822.3 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:835.65,839.20 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:842.2,846.18 3 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:852.2,858.41 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:872.2,872.45 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:887.2,887.52 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:891.2,891.18 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:894.2,894.20 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:898.2,898.18 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:901.2,901.66 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:839.20,841.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:846.18,847.42 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:847.42,849.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:858.41,860.19 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:864.3,864.45 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:868.3,869.6 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:860.19,861.9 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:864.45,866.9 2 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:872.45,873.91 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:883.3,884.13 2 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:873.91,875.4 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:875.9,881.4 2 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:887.52,889.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:891.18,893.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:894.20,896.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/queue.go:898.18,900.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/queue.go:906.55,913.2 4 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:48.44,54.2 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:58.69,63.24 4 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:66.2,67.28 2 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:63.24,65.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:78.123,84.38 5 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:87.2,87.17 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:91.2,91.36 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:84.38,86.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:87.17,90.3 2 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:98.88,104.2 4 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:108.123,113.27 4 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:119.2,119.11 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:122.2,123.42 2 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:113.27,118.3 2 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:119.11,121.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:128.48,132.23 3 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:135.2,135.55 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:138.2,138.14 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:132.23,134.3 1 0 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:135.55,137.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:145.44,149.18 2 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:158.2,159.19 2 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:149.18,150.35 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:153.3,154.41 2 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:150.35,151.9 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:154.41,155.9 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:163.62,168.23 4 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:171.2,176.55 4 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:180.2,183.16 3 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:168.23,170.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:176.55,178.3 1 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:187.46,191.29 3 1 -github.com/ethereum/go-ethereum/les/downloader/resultstore.go:191.29,193.3 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:43.32,47.2 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:49.64,51.2 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:53.60,55.2 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:57.74,59.2 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:61.68,66.20 5 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:69.2,69.24 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:66.20,68.3 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:72.60,74.2 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:76.60,81.20 5 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:84.2,84.24 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:81.20,83.3 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:87.78,88.26 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:91.2,98.24 8 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:88.26,90.3 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:101.71,105.2 3 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:107.73,111.2 3 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:113.79,116.2 2 1 -github.com/ethereum/go-ethereum/metrics/prometheus/collector.go:118.35,120.2 1 1 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:30.49,31.71 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:31.71,34.45 2 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:37.3,42.30 3 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:64.3,66.26 3 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:34.45,36.4 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:42.30,45.25 2 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:46.25,47.37 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:48.23,49.35 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:50.30,51.42 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:52.27,53.39 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:54.23,55.35 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:56.23,57.35 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:58.32,59.44 1 0 -github.com/ethereum/go-ethereum/metrics/prometheus/prometheus.go:60.12,61.77 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:85.147,99.159 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:125.2,125.119 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:133.2,133.148 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:151.2,151.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:99.159,100.42 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:108.3,108.104 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:111.3,111.40 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:118.3,118.41 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:100.42,103.70 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:106.4,106.52 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:103.70,105.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:108.104,110.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:111.40,114.20 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:114.20,116.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:118.41,119.70 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:119.70,121.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:125.119,126.69 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:126.69,129.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:133.148,134.48 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:137.3,137.48 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:140.3,140.84 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:143.3,143.84 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:146.3,149.55 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:134.48,136.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:137.48,139.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:140.84,142.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:143.84,145.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:155.31,157.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:161.30,164.2 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:169.66,173.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:176.51,178.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:183.60,188.2 4 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:191.133,193.29 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:196.2,198.25 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:266.2,266.8 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:193.29,195.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:198.25,200.21 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:204.3,205.20 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:210.3,210.25 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:215.3,215.80 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:219.3,219.25 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:222.3,222.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:231.3,232.24 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:258.3,258.113 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:263.3,264.27 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:200.21,203.4 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:205.20,209.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:210.25,214.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:215.80,218.4 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:219.25,221.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:222.16,226.17 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:226.17,228.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:232.24,241.62 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:244.4,244.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:247.4,252.28 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:241.62,243.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:244.26,246.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:252.28,254.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:255.9,257.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:258.113,261.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:272.85,274.40 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:277.2,277.70 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:280.2,281.18 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:287.2,289.29 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:292.2,296.70 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:312.2,312.20 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:317.2,318.14 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:274.40,276.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:277.70,279.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:281.18,285.3 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:289.29,291.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:296.70,298.43 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:298.43,300.62 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:303.4,303.63 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:306.4,306.29 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:300.62,302.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:303.63,305.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:306.29,308.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:312.20,314.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:314.8,316.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:322.92,323.14 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:324.31,325.45 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientpool.go:326.10,327.13 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:102.186,113.38 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:116.2,118.121 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:137.2,137.126 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:147.2,147.100 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:152.2,152.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:113.38,115.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:118.121,119.22 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:119.22,128.4 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:128.9,130.81 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:133.4,134.50 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:130.81,132.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:137.126,138.80 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:138.80,139.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:142.4,142.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:139.26,141.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:142.26,144.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:147.100,148.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:148.26,150.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:160.115,164.27 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:167.2,167.27 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:170.2,170.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:173.2,174.14 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:179.2,180.28 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:184.2,193.19 10 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:164.27,166.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:167.27,169.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:170.26,172.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:174.14,178.3 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:180.28,183.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:197.60,205.9 7 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:209.2,209.9 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:212.2,213.25 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:205.9,208.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:209.9,211.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:213.25,213.52 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:217.59,220.38 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:223.2,225.25 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:220.38,222.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:225.25,225.52 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:229.51,234.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:237.40,242.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:245.51,250.2 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:253.49,255.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:258.47,260.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:264.36,265.24 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:268.2,268.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:265.24,267.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:272.42,274.17 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:274.17,276.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:276.8,278.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:282.86,285.16 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:288.2,288.98 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:285.16,287.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:292.63,294.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:298.52,301.17 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:305.2,309.25 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:301.17,304.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:315.55,318.18 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:322.2,327.21 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:332.2,333.25 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:318.18,321.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:327.21,331.3 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:340.53,341.17 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:344.2,345.34 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:349.2,352.40 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:341.17,343.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:345.34,347.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:357.55,358.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:361.2,362.34 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:365.2,367.12 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:358.18,360.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:362.34,364.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:373.68,374.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:378.2,379.25 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:382.2,382.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:385.2,385.22 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:374.18,377.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:379.25,381.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:382.14,384.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:389.72,390.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:394.2,394.15 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:390.18,393.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:398.71,399.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:403.2,403.21 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:399.18,402.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:409.62,410.64 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:413.2,417.70 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:436.2,436.45 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:410.64,412.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:417.70,421.68 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:434.3,434.66 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:421.68,423.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:423.9,425.16 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:428.4,428.40 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:431.4,432.26 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:425.16,427.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:428.40,430.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:442.76,443.33 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:466.2,467.12 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:470.2,470.8 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:443.33,448.13 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:453.3,455.18 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:448.13,450.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:450.9,452.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:455.18,456.23 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:461.4,461.33 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:456.23,458.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:458.10,460.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:461.33,463.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:467.12,469.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:482.58,483.28 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:483.28,484.20 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:487.3,487.20 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:484.20,486.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:487.20,490.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:490.9,492.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:497.62,498.34 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:512.2,513.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:498.34,505.25 7 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:505.25,508.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:508.9,509.9 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:519.58,523.30 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:527.2,529.21 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:534.2,536.25 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:523.30,526.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:529.21,531.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:531.8,533.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:554.59,560.72 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:564.2,576.23 8 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:615.2,620.24 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:623.2,623.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:560.72,562.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:576.23,578.31 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:584.3,590.27 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:596.3,597.18 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:601.3,602.19 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:611.3,612.42 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:578.31,580.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:580.9,582.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:590.27,593.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:593.9,595.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:597.18,599.9 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:602.19,608.4 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:620.24,622.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:627.62,628.41 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:638.2,638.11 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:628.41,637.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:641.53,643.31 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:647.2,647.51 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:655.2,655.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:643.31,646.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:647.51,649.13 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:652.3,653.40 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:649.13,650.9 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:662.78,664.16 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:673.2,674.34 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:677.2,678.41 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:681.2,682.18 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:690.2,690.13 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:664.16,667.59 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:667.59,669.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:669.9,671.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:674.34,676.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:678.41,680.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:682.18,684.48 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:684.48,686.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/prioritypool.go:686.9,688.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:53.55,59.2 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:62.55,64.35 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:69.2,71.17 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:64.35,68.3 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:78.92,80.52 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:84.2,85.15 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:90.2,92.31 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:97.2,100.16 4 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:80.52,82.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:85.15,87.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:92.31,93.57 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:93.57,95.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:104.82,106.56 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:109.2,110.20 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:113.2,114.12 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:106.56,108.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:110.20,112.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/service.go:118.25,120.2 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/status.go:48.36,59.2 10 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:52.79,54.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:122.54,124.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:127.54,129.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:134.115,139.9 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:144.2,145.76 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:152.2,153.9 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:158.2,158.41 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:139.9,141.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:141.8,143.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:145.76,146.13 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:149.3,150.22 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:146.13,148.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:153.9,155.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:155.8,157.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:163.78,164.42 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:167.2,172.12 6 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:164.42,166.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:184.53,191.2 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:195.80,202.2 5 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:209.72,218.41 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:227.2,227.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:231.2,231.31 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:234.2,234.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:241.2,241.22 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:218.41,220.82 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:223.3,225.14 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:220.82,222.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:227.16,229.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:231.31,233.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:234.16,235.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:239.3,239.27 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:235.18,237.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:246.57,253.41 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:263.2,263.31 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:266.2,266.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:273.2,273.12 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:253.41,255.59 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:258.3,260.14 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:255.59,257.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:263.31,265.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:266.16,267.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:271.3,271.27 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:267.18,269.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:277.70,286.29 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:302.2,302.49 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:306.2,309.11 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:312.2,314.22 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:321.2,321.8 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:286.29,288.19 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:288.19,291.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:291.9,294.22 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:299.4,299.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:294.22,296.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:296.10,298.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:302.49,305.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:309.11,311.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:314.22,315.28 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:315.28,316.33 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:316.33,318.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:325.55,332.2 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:339.122,347.21 6 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:350.2,350.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:358.2,358.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:361.2,367.20 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:370.2,370.12 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:373.2,373.12 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:347.21,349.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:350.16,353.23 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:356.3,356.61 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:353.23,355.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:358.14,360.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:367.20,369.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:370.12,372.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:378.74,385.22 7 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:385.22,386.28 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:386.28,387.33 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:387.33,389.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:395.77,400.2 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:403.34,404.41 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:404.41,405.15 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:408.3,410.14 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:405.15,407.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:415.36,416.41 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:416.41,417.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:420.3,421.27 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:425.3,427.14 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:417.16,419.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:421.27,424.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:432.57,433.36 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:433.36,436.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:440.51,441.9 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:444.2,444.9 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:441.9,443.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:444.9,446.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:454.77,457.70 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:460.2,460.46 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:464.2,469.22 6 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:457.70,459.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:460.46,463.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:474.51,476.15 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:479.2,480.43 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:484.2,485.13 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:476.15,478.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:480.43,483.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:491.79,492.45 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:495.2,496.78 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:501.2,502.8 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:492.45,494.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:496.78,500.3 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:507.57,508.26 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:508.26,510.10 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:515.3,515.64 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:510.10,514.4 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:515.64,516.23 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:523.4,524.20 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:516.23,522.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:526.8,529.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:533.53,534.50 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:534.50,535.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:535.14,537.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:537.9,538.52 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:538.52,541.29 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:546.5,547.25 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:541.29,545.6 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:547.25,548.31 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:548.31,549.36 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:549.36,551.8 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:561.42,566.16 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:566.16,568.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:574.50,575.47 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:580.2,580.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:575.47,577.48 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:578.3,578.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:577.48,577.72 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:585.46,588.2 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:593.52,600.31 7 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:600.31,602.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:608.95,610.13 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:613.2,613.32 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:610.13,612.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:619.91,620.18 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:623.2,623.29 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:620.18,622.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:628.134,635.21 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:645.2,645.13 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:649.2,649.10 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:635.21,639.18 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:639.18,641.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:641.9,643.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:645.13,648.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:658.71,665.13 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:684.2,685.21 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:692.2,692.38 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:665.13,667.25 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:670.3,670.20 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:667.25,669.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:670.20,671.23 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:674.4,675.40 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:671.23,673.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:676.9,678.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:679.8,680.20 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:680.20,682.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:685.21,687.25 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:690.3,690.49 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance.go:687.25,689.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:62.171,80.82 6 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:85.2,85.122 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:103.2,103.120 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:125.2,127.12 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:138.2,138.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:80.82,83.3 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:85.122,87.15 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:91.3,93.25 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:96.3,96.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:99.3,99.25 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:87.15,89.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:93.25,95.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:96.14,98.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:99.25,101.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:103.120,107.22 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:107.22,113.4 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:113.9,115.81 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:118.4,118.52 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:115.81,117.5 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:127.12,128.7 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:128.7,129.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:130.49,132.71 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:133.19,134.11 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:142.34,146.100 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:154.2,154.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:146.100,147.78 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:147.78,152.4 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:158.53,162.52 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:172.2,174.57 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:162.52,164.101 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:170.3,170.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:164.101,165.91 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:165.91,168.5 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:178.100,180.2 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:183.82,188.2 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:192.61,198.13 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:203.2,203.13 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:198.13,200.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:200.8,202.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:203.13,205.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:205.8,207.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:212.64,217.2 3 0 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:221.109,222.25 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:222.25,224.45 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:227.3,227.16 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:231.3,231.9 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:224.45,226.4 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:227.16,230.4 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:239.108,251.33 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:254.2,254.41 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:257.2,257.10 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:251.33,253.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:254.41,256.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:261.87,262.51 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:262.51,264.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:264.8,266.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:271.99,272.9 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:275.2,275.58 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:272.9,274.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:279.84,287.17 6 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:290.2,290.12 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:295.2,295.14 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:287.17,289.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:290.12,292.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:292.8,294.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:295.14,297.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/balance_tracker.go:297.8,299.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:69.68,81.2 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:83.27,85.2 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:87.46,89.9 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:92.2,92.40 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:89.9,91.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:95.51,97.9 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:100.2,100.57 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:103.2,106.55 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:97.9,99.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:100.57,102.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:109.66,111.35 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:114.2,114.109 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:111.35,113.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:117.57,122.2 4 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:124.75,127.11 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:130.2,132.33 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:135.2,135.49 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:138.2,139.10 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:127.11,129.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:132.33,134.3 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:135.49,137.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:142.73,145.16 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:148.2,149.30 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:145.16,147.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:152.51,156.2 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:160.92,161.19 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:164.2,170.16 5 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:184.2,184.8 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:161.19,163.3 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:170.16,172.30 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:175.3,176.51 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:179.3,180.30 2 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:172.30,174.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:176.51,178.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:180.30,182.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:188.105,195.16 5 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:195.16,197.30 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:200.3,203.57 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:206.3,206.23 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:197.30,199.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:203.57,204.12 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:206.23,208.4 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:212.29,213.6 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:213.6,214.10 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:215.41,216.20 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:217.21,218.10 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:225.33,231.42 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:246.2,246.27 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:249.2,249.120 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:231.42,233.19 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:233.19,236.66 3 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:239.4,239.81 1 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:236.66,238.5 1 0 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:239.81,242.5 2 1 -github.com/ethereum/go-ethereum/les/vflux/server/clientdb.go:246.27,248.3 1 1 -github.com/ethereum/go-ethereum/mobile/params.go:31.30,33.2 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:36.30,38.16 2 0 -github.com/ethereum/go-ethereum/mobile/params.go:41.2,41.20 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:38.16,39.13 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:45.30,47.16 2 0 -github.com/ethereum/go-ethereum/mobile/params.go:50.2,50.20 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:47.16,48.13 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:54.30,56.16 2 0 -github.com/ethereum/go-ethereum/mobile/params.go:59.2,59.20 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:56.16,57.13 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:63.29,65.16 2 0 -github.com/ethereum/go-ethereum/mobile/params.go:68.2,68.20 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:65.16,66.13 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:72.29,74.16 2 0 -github.com/ethereum/go-ethereum/mobile/params.go:77.2,77.20 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:74.16,75.13 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:81.33,83.16 2 0 -github.com/ethereum/go-ethereum/mobile/params.go:86.2,86.20 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:83.16,84.13 1 0 -github.com/ethereum/go-ethereum/mobile/params.go:91.36,93.46 2 1 -github.com/ethereum/go-ethereum/mobile/params.go:100.2,100.14 1 1 -github.com/ethereum/go-ethereum/mobile/params.go:93.46,96.17 3 1 -github.com/ethereum/go-ethereum/mobile/params.go:96.17,97.45 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:37.48,39.16 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:42.2,42.12 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:39.16,41.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:52.35,54.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:57.33,59.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:62.33,64.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:72.35,74.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:77.33,79.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:82.33,84.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:92.53,96.74 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:99.2,99.15 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:96.74,98.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:103.46,105.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:108.54,112.63 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:115.2,115.15 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:112.63,114.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:119.47,122.2 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:125.34,127.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:129.42,129.79 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:130.42,130.78 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:131.42,131.80 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:132.42,132.73 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:133.42,133.75 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:134.42,134.80 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:135.42,135.75 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:136.42,136.81 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:137.42,137.76 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:138.42,138.77 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:139.42,139.76 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:140.42,140.73 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:141.42,141.67 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:142.42,142.78 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:143.42,143.75 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:144.42,144.75 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:150.30,152.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:155.60,156.42 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:159.2,159.39 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:156.42,158.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:168.51,172.73 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:175.2,175.15 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:172.73,174.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:179.45,181.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:184.52,188.62 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:191.2,191.15 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:188.62,190.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:195.46,198.2 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:201.33,203.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:205.49,205.87 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:206.49,206.86 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:207.49,207.88 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:208.49,208.81 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:209.49,209.83 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:210.49,210.88 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:211.49,211.83 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:212.49,212.89 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:213.49,213.84 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:214.49,214.85 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:215.49,215.84 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:216.49,216.81 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:217.49,217.75 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:218.49,218.86 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:219.49,219.82 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:220.49,220.81 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:221.49,221.85 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:222.49,222.86 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:223.49,223.97 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:224.57,226.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:235.115,237.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:241.123,242.15 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:245.2,245.144 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:242.15,244.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:249.63,253.71 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:256.2,256.16 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:253.71,255.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:260.52,262.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:265.64,269.60 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:272.2,272.16 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:269.60,271.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:276.53,279.2 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:282.40,284.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:286.46,286.69 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:287.46,287.75 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:288.46,288.82 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:289.46,289.79 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:290.46,290.77 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:292.42,292.72 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:293.42,293.74 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:295.41,296.33 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:299.2,299.12 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:296.33,298.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:302.100,304.20 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:307.2,308.33 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:304.20,306.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:315.37,317.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:320.68,321.40 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:324.2,324.42 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:321.40,323.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:333.55,337.75 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:340.2,340.15 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:337.75,339.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:344.47,346.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:349.56,353.64 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:356.2,356.15 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:353.64,355.3 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:360.48,363.2 2 0 -github.com/ethereum/go-ethereum/mobile/types.go:366.35,368.2 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:370.49,370.81 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:371.49,371.79 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:372.49,372.94 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:373.49,373.83 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:374.49,374.81 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:375.49,375.83 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:376.49,376.95 1 0 -github.com/ethereum/go-ethereum/mobile/types.go:377.49,377.84 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:34.33,36.2 1 1 -github.com/ethereum/go-ethereum/mobile/big.go:40.54,42.14 2 0 -github.com/ethereum/go-ethereum/mobile/big.go:45.2,45.19 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:42.14,44.3 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:49.37,51.2 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:54.35,56.2 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:60.36,62.2 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:66.40,68.2 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:71.37,73.2 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:81.30,83.2 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:90.49,92.2 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:98.36,102.2 1 1 -github.com/ethereum/go-ethereum/mobile/big.go:105.31,107.2 1 1 -github.com/ethereum/go-ethereum/mobile/big.go:110.61,111.43 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:114.2,114.40 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:111.43,113.3 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:118.57,119.43 1 1 -github.com/ethereum/go-ethereum/mobile/big.go:122.2,123.12 2 1 -github.com/ethereum/go-ethereum/mobile/big.go:119.43,121.3 1 0 -github.com/ethereum/go-ethereum/mobile/big.go:127.46,129.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:37.60,39.61 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:42.2,42.15 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:39.61,41.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:46.55,48.38 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:51.2,51.15 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:48.38,50.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:55.44,56.54 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:59.2,60.12 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:56.54,58.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:64.34,66.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:69.42,71.40 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:74.2,74.56 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:77.2,78.16 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:81.2,82.12 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:71.40,73.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:74.56,76.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:78.16,80.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:86.32,88.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:91.32,93.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:99.34,103.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:106.31,108.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:111.29,113.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:116.55,117.41 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:120.2,120.36 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:117.41,119.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:124.51,125.41 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:128.2,129.12 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:125.41,127.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:133.37,135.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:143.69,145.61 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:148.2,148.15 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:145.61,147.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:152.64,154.38 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:157.2,157.15 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:154.38,156.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:161.50,162.60 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:165.2,166.12 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:162.60,164.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:170.37,172.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:175.48,177.46 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:180.2,180.62 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:183.2,184.16 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:187.2,188.12 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:177.46,179.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:180.62,182.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:184.16,186.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:192.35,194.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:197.35,199.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:205.40,209.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:212.37,214.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:217.32,219.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:222.64,223.44 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:226.2,226.42 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:223.44,225.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:230.60,231.44 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:234.2,235.12 2 0 -github.com/ethereum/go-ethereum/mobile/common.go:231.44,233.3 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:239.46,241.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:244.35,246.2 1 0 -github.com/ethereum/go-ethereum/mobile/common.go:249.46,251.2 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:88.34,91.2 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:94.55,96.2 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:99.54,102.2 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:105.41,107.2 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:115.73,117.19 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:120.2,120.26 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:123.2,123.71 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:127.2,127.31 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:132.2,148.16 3 0 -github.com/ethereum/go-ethereum/mobile/geth.go:152.2,155.34 3 0 -github.com/ethereum/go-ethereum/mobile/geth.go:205.2,205.28 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:222.2,222.29 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:117.19,119.3 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:120.26,122.3 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:123.71,125.3 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:127.31,129.3 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:148.16,150.3 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:155.34,158.81 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:162.3,162.49 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:169.3,169.49 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:176.3,176.49 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:183.3,183.48 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:190.3,190.52 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:197.3,197.48 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:158.81,160.4 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:162.49,164.37 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:164.37,166.5 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:169.49,171.37 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:171.37,173.5 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:176.49,178.37 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:178.37,180.5 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:183.48,185.37 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:185.37,187.5 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:190.52,192.37 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:192.37,194.5 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:197.48,199.37 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:199.37,201.5 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:205.28,212.17 7 0 -github.com/ethereum/go-ethereum/mobile/geth.go:216.3,216.36 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:212.17,214.4 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:216.36,217.118 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:217.118,219.5 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:227.30,229.2 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:232.30,235.2 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:238.70,240.16 2 0 -github.com/ethereum/go-ethereum/mobile/geth.go:243.2,243.55 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:240.16,242.3 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:247.40,249.2 1 0 -github.com/ethereum/go-ethereum/mobile/geth.go:252.42,254.2 1 0 -github.com/ethereum/go-ethereum/mobile/logger.go:26.30,28.2 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:32.49,32.70 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:33.49,33.72 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:34.49,34.73 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:35.49,35.70 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:36.49,36.83 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:37.49,37.82 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:38.49,38.78 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:39.45,41.39 2 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:44.2,44.25 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:41.39,43.3 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:52.47,52.68 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:53.47,53.70 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:54.47,54.80 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:55.47,55.86 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:56.47,56.87 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:64.33,66.2 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:69.63,70.41 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:73.2,73.40 1 0 -github.com/ethereum/go-ethereum/mobile/p2p.go:70.41,72.3 1 0 -github.com/ethereum/go-ethereum/mobile/context.go:37.28,41.2 1 0 -github.com/ethereum/go-ethereum/mobile/context.go:48.41,54.2 2 0 -github.com/ethereum/go-ethereum/mobile/context.go:61.64,67.2 2 0 -github.com/ethereum/go-ethereum/mobile/context.go:74.52,80.2 2 0 -github.com/ethereum/go-ethereum/mobile/discover.go:56.46,58.16 2 0 -github.com/ethereum/go-ethereum/mobile/discover.go:61.2,61.26 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:58.16,60.3 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:68.34,72.2 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:75.31,77.2 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:80.29,82.2 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:85.57,86.40 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:89.2,89.36 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:86.40,88.3 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:93.53,94.40 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:97.2,98.12 2 0 -github.com/ethereum/go-ethereum/mobile/discover.go:94.40,96.3 1 0 -github.com/ethereum/go-ethereum/mobile/discover.go:102.39,104.2 1 0 -github.com/ethereum/go-ethereum/mobile/init.go:28.13,34.2 2 1 -github.com/ethereum/go-ethereum/mobile/ethclient.go:34.73,37.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:40.92,43.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:47.96,48.16 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:52.2,53.30 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:48.16,51.3 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:57.95,60.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:64.99,65.16 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:69.2,70.32 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:65.16,68.3 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:74.101,78.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:82.134,85.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:88.94,91.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:94.113,98.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:102.103,105.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:109.88,111.24 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:114.2,114.41 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:111.24,113.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:126.123,130.16 3 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:134.2,134.12 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:148.2,148.35 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:130.16,132.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:134.12,135.7 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:135.7,136.11 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:137.24,138.39 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:140.31,141.19 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:144.5,144.11 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:141.19,143.6 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:155.113,156.16 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:160.2,161.33 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:156.16,159.3 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:166.123,167.16 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:170.2,170.88 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:167.16,169.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:175.106,176.16 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:179.2,179.75 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:176.16,178.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:184.107,185.16 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:189.2,190.29 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:185.16,188.3 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:196.94,198.16 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:202.2,203.25 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:206.2,206.24 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:198.16,200.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:203.25,205.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:217.149,221.16 3 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:225.2,225.12 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:239.2,239.35 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:221.16,223.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:225.12,226.7 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:226.7,227.11 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:228.21,229.37 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:231.31,232.19 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:235.5,235.11 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:232.19,234.6 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:245.106,248.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:251.116,253.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:256.99,258.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:262.100,265.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:268.89,271.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:281.107,282.16 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:285.2,285.73 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:282.16,284.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:290.100,292.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:296.82,299.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:305.88,308.2 2 0 -github.com/ethereum/go-ethereum/mobile/ethclient.go:314.80,316.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:36.38,38.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:46.28,48.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:50.43,50.76 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:51.43,51.72 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:52.43,52.79 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:53.43,53.76 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:54.43,54.66 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:55.38,56.33 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:59.2,59.12 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:56.33,58.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:62.48,62.82 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:63.48,63.77 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:64.48,64.83 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:65.48,65.80 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:66.48,66.89 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:67.45,68.20 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:72.2,72.31 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:68.20,71.3 2 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:81.55,81.97 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:82.55,82.96 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:83.55,83.96 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:84.55,84.98 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:85.55,85.102 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:86.55,86.99 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:87.55,87.103 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:88.55,88.97 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:89.55,89.102 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:90.55,90.99 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:91.55,91.103 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:92.55,92.99 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:93.55,93.103 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:94.55,94.100 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:95.55,95.99 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:101.34,105.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:108.31,110.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:113.29,115.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:118.59,119.41 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:122.2,122.38 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:119.41,121.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:126.55,127.41 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:130.2,131.12 2 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:127.41,129.3 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:135.41,137.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:145.36,147.2 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:149.50,149.88 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:150.50,150.86 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:151.50,151.91 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:152.50,152.85 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:154.59,154.100 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:155.59,155.96 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:156.59,156.103 1 0 -github.com/ethereum/go-ethereum/mobile/ethereum.go:157.59,157.94 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:41.32,43.2 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:45.53,45.70 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:46.53,46.77 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:47.53,47.72 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:48.53,48.78 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:49.53,49.101 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:50.53,50.86 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:51.53,51.84 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:52.53,52.84 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:53.53,53.78 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:54.53,54.82 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:55.53,55.70 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:56.53,56.70 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:57.53,57.70 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:58.53,58.70 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:59.48,61.37 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:64.2,64.18 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:61.37,63.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:66.49,68.37 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:71.2,71.18 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:68.37,70.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:73.49,75.37 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:78.2,78.18 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:75.37,77.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:80.49,82.37 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:85.2,85.18 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:82.37,84.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:87.47,87.100 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:88.47,88.101 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:89.47,89.101 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:90.47,90.93 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:91.49,93.37 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:96.2,96.18 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:93.37,95.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:98.50,100.37 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:103.2,103.18 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:100.37,102.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:105.50,107.37 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:110.2,110.18 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:107.37,109.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:112.50,114.37 2 1 -github.com/ethereum/go-ethereum/mobile/interface.go:117.2,117.18 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:114.37,116.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:119.50,119.79 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:120.50,120.81 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:122.43,122.67 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:123.43,123.69 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:124.43,124.69 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:125.43,125.71 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:126.43,126.69 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:127.43,127.71 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:128.43,128.77 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:129.43,129.79 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:130.43,130.74 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:131.43,131.76 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:132.43,132.67 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:133.43,133.69 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:134.43,134.68 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:135.43,135.70 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:136.43,136.68 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:137.43,137.70 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:138.43,138.68 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:139.43,139.70 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:140.43,140.68 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:141.43,141.70 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:142.43,142.69 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:143.43,143.71 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:144.43,144.69 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:145.43,145.71 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:146.43,146.69 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:147.43,147.71 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:148.43,148.71 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:149.43,149.73 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:151.47,151.75 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:152.47,152.85 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:153.47,153.77 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:154.47,154.89 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:155.47,155.77 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:156.47,156.90 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:157.47,157.95 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:158.47,158.99 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:159.47,159.89 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:160.47,160.93 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:161.47,161.75 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:162.47,162.76 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:163.47,163.76 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:164.47,164.76 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:165.41,168.25 3 1 -github.com/ethereum/go-ethereum/mobile/interface.go:171.2,171.16 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:168.25,170.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:173.42,176.25 3 1 -github.com/ethereum/go-ethereum/mobile/interface.go:179.2,179.16 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:176.25,178.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:181.42,184.25 3 1 -github.com/ethereum/go-ethereum/mobile/interface.go:187.2,187.16 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:184.25,186.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:189.42,192.25 3 1 -github.com/ethereum/go-ethereum/mobile/interface.go:195.2,195.16 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:192.25,194.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:197.40,199.2 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:200.41,202.2 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:203.41,205.2 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:206.41,208.2 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:209.42,212.25 3 1 -github.com/ethereum/go-ethereum/mobile/interface.go:215.2,215.16 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:212.25,214.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:217.43,220.25 3 1 -github.com/ethereum/go-ethereum/mobile/interface.go:223.2,223.16 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:220.25,222.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:225.43,228.25 3 1 -github.com/ethereum/go-ethereum/mobile/interface.go:231.2,231.16 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:228.25,230.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:233.43,236.25 3 1 -github.com/ethereum/go-ethereum/mobile/interface.go:239.2,239.16 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:236.25,238.3 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:241.43,241.84 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:242.43,242.87 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:250.42,252.2 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:255.33,257.2 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:262.65,263.42 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:266.2,266.50 1 1 -github.com/ethereum/go-ethereum/mobile/interface.go:263.42,265.3 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:270.62,271.42 1 0 -github.com/ethereum/go-ethereum/mobile/interface.go:274.2,275.12 2 0 -github.com/ethereum/go-ethereum/mobile/interface.go:271.42,273.3 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:33.38,33.72 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:34.38,34.70 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:35.38,35.59 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:36.38,36.73 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:37.38,37.68 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:38.38,38.67 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:39.38,39.71 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:40.38,40.65 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:46.27,48.2 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:51.51,52.39 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:55.2,55.33 1 0 -github.com/ethereum/go-ethereum/mobile/vm.go:52.39,54.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:57.31,59.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:62.63,63.43 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:66.2,66.41 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:63.43,65.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:70.59,71.43 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:74.2,75.12 2 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:71.43,73.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:79.41,81.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:84.35,86.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:92.65,94.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:97.55,99.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:102.45,104.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:108.78,110.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:114.89,116.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:119.102,120.20 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:123.2,124.16 2 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:127.2,127.34 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:120.20,122.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:124.16,126.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:133.118,135.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:139.131,140.20 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:143.2,144.16 2 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:147.2,147.34 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:140.20,142.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:144.16,146.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:151.71,153.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:156.50,158.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:167.91,169.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:173.69,175.16 2 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:178.2,178.31 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:175.16,177.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:182.93,184.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:187.105,189.2 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:192.109,194.16 2 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:197.2,197.27 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:194.16,196.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:201.95,203.16 2 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:206.2,207.16 2 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:210.2,210.27 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:203.16,205.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:207.16,209.3 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:215.100,217.16 2 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:220.2,220.31 1 0 -github.com/ethereum/go-ethereum/mobile/accounts.go:217.16,219.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:42.102,44.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:47.2,47.31 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:44.16,46.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:56.30,58.2 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:60.43,60.71 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:61.43,61.76 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:67.52,67.83 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:68.53,68.76 0 0 -github.com/ethereum/go-ethereum/mobile/bind.go:69.52,69.91 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:70.52,70.85 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:79.38,81.2 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:85.103,87.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:90.2,91.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:94.2,94.34 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:87.16,89.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:91.16,93.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:97.49,97.84 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:98.49,98.83 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:99.49,99.84 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:100.49,100.87 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:101.49,101.85 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:110.50,110.83 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:111.50,111.89 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:112.47,113.98 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:113.98,115.17 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:118.3,118.21 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:115.17,117.4 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:121.56,121.90 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:122.56,122.93 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:123.56,123.94 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:124.56,124.95 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:137.151,140.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:143.2,144.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:147.2,151.8 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:140.16,142.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:144.16,146.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:156.112,158.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:161.2,164.8 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:158.16,160.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:167.47,167.77 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:168.52,169.23 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:172.2,172.33 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:169.23,171.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:177.102,180.87 3 0 -github.com/ethereum/go-ethereum/mobile/bind.go:183.2,184.12 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:180.87,182.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:188.114,190.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:193.2,193.33 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:190.16,192.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:197.101,199.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:202.2,202.33 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:199.16,201.3 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:207.81,209.16 2 0 -github.com/ethereum/go-ethereum/mobile/bind.go:212.2,212.33 1 0 -github.com/ethereum/go-ethereum/mobile/bind.go:209.16,211.3 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:32.30,34.2 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:37.56,38.39 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:41.2,41.27 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:38.39,40.3 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:45.52,46.39 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:49.2,50.12 2 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:46.39,48.3 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:54.35,56.2 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:62.29,64.2 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:67.51,68.41 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:71.2,71.29 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:68.41,70.3 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:75.47,76.41 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:79.2,80.12 2 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:76.41,78.3 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:84.34,86.2 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:92.32,94.2 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:97.61,98.44 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:101.2,101.50 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:98.44,100.3 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:105.57,106.44 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:109.2,110.12 2 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:106.44,108.3 1 0 -github.com/ethereum/go-ethereum/mobile/primitives.go:114.37,116.2 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:85.75,91.2 4 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:95.65,99.61 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:103.2,105.12 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:99.61,101.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:109.42,113.23 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:116.2,116.19 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:113.23,115.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:120.36,124.43 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:129.2,130.40 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:138.2,139.16 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:146.2,149.19 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:157.2,157.21 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:161.2,170.35 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:173.2,175.29 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:182.2,182.12 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:124.43,126.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:130.40,135.3 4 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:139.16,145.3 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:149.19,151.30 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:154.3,154.46 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:151.30,153.4 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:157.21,159.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:170.35,172.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:175.29,177.20 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:177.20,180.4 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:185.72,188.33 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:195.2,196.16 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:212.2,212.36 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:188.33,189.38 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:192.3,192.9 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:189.38,191.4 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:196.16,202.20 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:207.3,207.40 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:202.20,205.4 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:207.40,210.4 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:216.51,218.16 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:222.2,222.71 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:218.16,220.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:226.46,227.16 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:230.2,230.20 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:233.2,233.37 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:239.2,239.12 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:227.16,229.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:230.20,232.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:233.37,238.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:243.29,247.2 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:249.31,250.23 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:255.2,257.24 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:261.2,261.22 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:265.2,271.33 5 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:250.23,252.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:257.24,260.3 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:261.22,264.3 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:275.73,279.20 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:284.2,285.71 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:288.2,293.12 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:279.20,281.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:285.71,287.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:297.40,299.20 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:303.2,303.23 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:299.20,302.3 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:307.70,311.19 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:315.2,316.71 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:319.2,324.12 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:311.19,313.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:316.71,318.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:328.31,332.19 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:332.19,333.22 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:333.22,335.4 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:340.39,342.15 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:346.2,346.18 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:342.15,345.3 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:350.40,352.2 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:355.39,357.2 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:360.40,363.2 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:366.107,370.25 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:373.2,373.32 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:370.25,372.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:377.73,378.25 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:381.2,381.12 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:378.25,380.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:384.77,386.30 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:389.2,395.23 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:386.30,388.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:407.71,409.37 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:412.2,412.44 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:409.37,411.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:416.80,418.18 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:422.2,423.16 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:427.2,427.48 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:434.2,434.38 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:438.2,438.39 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:442.2,442.63 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:418.18,421.3 2 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:423.16,426.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:427.48,432.3 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:434.38,437.3 2 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:438.39,441.3 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:446.26,449.3 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:457.54,460.2 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:462.59,464.2 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:466.53,467.71 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:467.71,468.65 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:473.3,481.72 6 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:468.65,471.4 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:494.63,496.2 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:499.50,503.24 3 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:506.2,507.16 2 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:511.2,513.12 3 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:503.24,505.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:507.16,510.3 2 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:516.35,520.24 3 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:523.2,527.12 5 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:520.24,522.3 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:532.92,533.76 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:537.2,538.33 2 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:542.2,542.27 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:549.2,549.12 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:533.76,535.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:538.33,540.3 1 0 -github.com/ethereum/go-ethereum/node/rpcstack.go:542.27,543.83 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:543.83,544.71 1 1 -github.com/ethereum/go-ethereum/node/rpcstack.go:544.71,546.5 1 0 -github.com/ethereum/go-ethereum/node/config.go:212.39,214.21 1 1 -github.com/ethereum/go-ethereum/node/config.go:218.2,218.31 1 1 -github.com/ethereum/go-ethereum/node/config.go:225.2,225.43 1 1 -github.com/ethereum/go-ethereum/node/config.go:231.2,231.18 1 1 -github.com/ethereum/go-ethereum/node/config.go:214.21,216.3 1 1 -github.com/ethereum/go-ethereum/node/config.go:218.31,219.48 1 0 -github.com/ethereum/go-ethereum/node/config.go:222.3,222.33 1 0 -github.com/ethereum/go-ethereum/node/config.go:219.48,221.4 1 0 -github.com/ethereum/go-ethereum/node/config.go:225.43,226.22 1 1 -github.com/ethereum/go-ethereum/node/config.go:229.3,229.45 1 1 -github.com/ethereum/go-ethereum/node/config.go:226.22,228.4 1 1 -github.com/ethereum/go-ethereum/node/config.go:235.34,236.21 1 1 -github.com/ethereum/go-ethereum/node/config.go:239.2,239.43 1 1 -github.com/ethereum/go-ethereum/node/config.go:236.21,238.3 1 1 -github.com/ethereum/go-ethereum/node/config.go:243.57,244.28 1 0 -github.com/ethereum/go-ethereum/node/config.go:250.2,251.29 2 0 -github.com/ethereum/go-ethereum/node/config.go:244.28,246.29 2 0 -github.com/ethereum/go-ethereum/node/config.go:246.29,247.34 1 0 -github.com/ethereum/go-ethereum/node/config.go:256.40,257.22 1 0 -github.com/ethereum/go-ethereum/node/config.go:260.2,260.53 1 0 -github.com/ethereum/go-ethereum/node/config.go:257.22,259.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:264.35,267.2 2 0 -github.com/ethereum/go-ethereum/node/config.go:271.38,272.20 1 0 -github.com/ethereum/go-ethereum/node/config.go:275.2,275.49 1 0 -github.com/ethereum/go-ethereum/node/config.go:272.20,274.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:279.33,282.2 2 0 -github.com/ethereum/go-ethereum/node/config.go:286.39,288.2 1 0 -github.com/ethereum/go-ethereum/node/config.go:291.36,294.46 2 1 -github.com/ethereum/go-ethereum/node/config.go:297.2,297.23 1 1 -github.com/ethereum/go-ethereum/node/config.go:300.2,300.21 1 1 -github.com/ethereum/go-ethereum/node/config.go:303.2,305.13 3 1 -github.com/ethereum/go-ethereum/node/config.go:294.46,296.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:297.23,299.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:300.21,302.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:308.32,309.18 1 1 -github.com/ethereum/go-ethereum/node/config.go:316.2,316.15 1 1 -github.com/ethereum/go-ethereum/node/config.go:309.18,311.21 2 1 -github.com/ethereum/go-ethereum/node/config.go:314.3,314.18 1 1 -github.com/ethereum/go-ethereum/node/config.go:311.21,312.51 1 0 -github.com/ethereum/go-ethereum/node/config.go:329.50,330.26 1 1 -github.com/ethereum/go-ethereum/node/config.go:333.2,333.21 1 1 -github.com/ethereum/go-ethereum/node/config.go:338.2,338.51 1 1 -github.com/ethereum/go-ethereum/node/config.go:350.2,350.45 1 1 -github.com/ethereum/go-ethereum/node/config.go:330.26,332.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:333.21,335.3 1 1 -github.com/ethereum/go-ethereum/node/config.go:338.51,340.25 2 1 -github.com/ethereum/go-ethereum/node/config.go:343.3,343.49 1 1 -github.com/ethereum/go-ethereum/node/config.go:340.25,342.4 1 0 -github.com/ethereum/go-ethereum/node/config.go:343.49,344.12 1 0 -github.com/ethereum/go-ethereum/node/config.go:347.4,347.18 1 0 -github.com/ethereum/go-ethereum/node/config.go:344.12,346.5 1 0 -github.com/ethereum/go-ethereum/node/config.go:353.39,354.21 1 1 -github.com/ethereum/go-ethereum/node/config.go:357.2,357.43 1 1 -github.com/ethereum/go-ethereum/node/config.go:354.21,356.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:363.46,365.29 1 1 -github.com/ethereum/go-ethereum/node/config.go:369.2,369.21 1 1 -github.com/ethereum/go-ethereum/node/config.go:377.2,378.55 2 1 -github.com/ethereum/go-ethereum/node/config.go:382.2,383.16 2 1 -github.com/ethereum/go-ethereum/node/config.go:386.2,387.55 2 1 -github.com/ethereum/go-ethereum/node/config.go:391.2,392.55 2 1 -github.com/ethereum/go-ethereum/node/config.go:395.2,395.12 1 1 -github.com/ethereum/go-ethereum/node/config.go:365.29,367.3 1 1 -github.com/ethereum/go-ethereum/node/config.go:369.21,371.17 2 1 -github.com/ethereum/go-ethereum/node/config.go:374.3,374.13 1 1 -github.com/ethereum/go-ethereum/node/config.go:371.17,373.4 1 0 -github.com/ethereum/go-ethereum/node/config.go:378.55,380.3 1 1 -github.com/ethereum/go-ethereum/node/config.go:383.16,385.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:387.55,390.3 2 0 -github.com/ethereum/go-ethereum/node/config.go:392.55,394.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:399.46,401.2 1 1 -github.com/ethereum/go-ethereum/node/config.go:404.47,406.2 1 1 -github.com/ethereum/go-ethereum/node/config.go:410.75,412.21 1 1 -github.com/ethereum/go-ethereum/node/config.go:415.2,415.41 1 1 -github.com/ethereum/go-ethereum/node/config.go:418.2,422.57 3 0 -github.com/ethereum/go-ethereum/node/config.go:427.2,428.31 2 0 -github.com/ethereum/go-ethereum/node/config.go:439.2,439.14 1 0 -github.com/ethereum/go-ethereum/node/config.go:412.21,414.3 1 1 -github.com/ethereum/go-ethereum/node/config.go:415.41,417.3 1 1 -github.com/ethereum/go-ethereum/node/config.go:422.57,425.3 2 0 -github.com/ethereum/go-ethereum/node/config.go:428.31,429.16 1 0 -github.com/ethereum/go-ethereum/node/config.go:432.3,433.17 2 0 -github.com/ethereum/go-ethereum/node/config.go:437.3,437.30 1 0 -github.com/ethereum/go-ethereum/node/config.go:429.16,430.12 1 0 -github.com/ethereum/go-ethereum/node/config.go:433.17,435.12 2 0 -github.com/ethereum/go-ethereum/node/config.go:443.49,448.9 2 1 -github.com/ethereum/go-ethereum/node/config.go:460.2,460.20 1 1 -github.com/ethereum/go-ethereum/node/config.go:449.37,450.25 1 0 -github.com/ethereum/go-ethereum/node/config.go:451.23,452.26 1 1 -github.com/ethereum/go-ethereum/node/config.go:457.27,458.44 1 0 -github.com/ethereum/go-ethereum/node/config.go:452.26,454.4 1 1 -github.com/ethereum/go-ethereum/node/config.go:454.9,456.4 1 0 -github.com/ethereum/go-ethereum/node/config.go:465.57,467.16 2 1 -github.com/ethereum/go-ethereum/node/config.go:470.2,471.18 2 1 -github.com/ethereum/go-ethereum/node/config.go:477.2,477.16 1 1 -github.com/ethereum/go-ethereum/node/config.go:480.2,480.50 1 1 -github.com/ethereum/go-ethereum/node/config.go:484.2,484.33 1 1 -github.com/ethereum/go-ethereum/node/config.go:467.16,469.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:471.18,475.3 2 1 -github.com/ethereum/go-ethereum/node/config.go:477.16,479.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:480.50,482.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:489.72,493.8 3 0 -github.com/ethereum/go-ethereum/node/config.go:496.2,497.14 2 0 -github.com/ethereum/go-ethereum/node/config.go:500.2,501.11 2 0 -github.com/ethereum/go-ethereum/node/config.go:493.8,495.3 1 0 -github.com/ethereum/go-ethereum/node/config.go:497.14,499.3 1 0 -github.com/ethereum/go-ethereum/node/endpoints.go:29.122,35.61 2 0 -github.com/ethereum/go-ethereum/node/endpoints.go:39.2,48.38 4 0 -github.com/ethereum/go-ethereum/node/endpoints.go:35.61,37.3 1 0 -github.com/ethereum/go-ethereum/node/endpoints.go:54.90,56.27 2 1 -github.com/ethereum/go-ethereum/node/endpoints.go:62.2,62.31 1 1 -github.com/ethereum/go-ethereum/node/endpoints.go:69.2,69.23 1 1 -github.com/ethereum/go-ethereum/node/endpoints.go:56.27,57.48 1 1 -github.com/ethereum/go-ethereum/node/endpoints.go:57.48,60.4 2 1 -github.com/ethereum/go-ethereum/node/endpoints.go:62.31,63.39 1 0 -github.com/ethereum/go-ethereum/node/endpoints.go:63.39,64.56 1 0 -github.com/ethereum/go-ethereum/node/endpoints.go:64.56,66.5 1 0 -github.com/ethereum/go-ethereum/node/endpoints.go:73.48,74.40 1 1 -github.com/ethereum/go-ethereum/node/endpoints.go:78.2,78.41 1 1 -github.com/ethereum/go-ethereum/node/endpoints.go:82.2,82.40 1 1 -github.com/ethereum/go-ethereum/node/endpoints.go:74.40,77.3 2 0 -github.com/ethereum/go-ethereum/node/endpoints.go:78.41,81.3 2 0 -github.com/ethereum/go-ethereum/node/endpoints.go:82.40,85.3 2 0 -github.com/ethereum/go-ethereum/node/errors.go:35.44,36.77 1 1 -github.com/ethereum/go-ethereum/node/errors.go:39.2,39.12 1 0 -github.com/ethereum/go-ethereum/node/errors.go:36.77,38.3 1 1 -github.com/ethereum/go-ethereum/node/errors.go:50.36,52.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:76.39,81.24 3 1 -github.com/ethereum/go-ethereum/node/node.go:88.2,88.24 1 1 -github.com/ethereum/go-ethereum/node/node.go:94.2,94.42 1 1 -github.com/ethereum/go-ethereum/node/node.go:97.2,97.41 1 1 -github.com/ethereum/go-ethereum/node/node.go:100.2,100.42 1 1 -github.com/ethereum/go-ethereum/node/node.go:104.2,118.43 3 1 -github.com/ethereum/go-ethereum/node/node.go:121.2,122.16 2 1 -github.com/ethereum/go-ethereum/node/node.go:125.2,135.43 7 1 -github.com/ethereum/go-ethereum/node/node.go:138.2,138.44 1 1 -github.com/ethereum/go-ethereum/node/node.go:141.2,141.43 1 1 -github.com/ethereum/go-ethereum/node/node.go:146.2,146.68 1 1 -github.com/ethereum/go-ethereum/node/node.go:149.2,149.71 1 1 -github.com/ethereum/go-ethereum/node/node.go:154.2,160.18 6 1 -github.com/ethereum/go-ethereum/node/node.go:81.24,83.17 2 1 -github.com/ethereum/go-ethereum/node/node.go:86.3,86.28 1 1 -github.com/ethereum/go-ethereum/node/node.go:83.17,85.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:88.24,90.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:94.42,96.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:97.41,99.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:100.42,102.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:118.43,120.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:122.16,124.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:135.43,137.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:138.44,140.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:141.43,143.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:146.68,148.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:149.71,151.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:165.30,170.17 4 1 -github.com/ethereum/go-ethereum/node/node.go:178.2,186.16 6 1 -github.com/ethereum/go-ethereum/node/node.go:191.2,192.39 2 1 -github.com/ethereum/go-ethereum/node/node.go:199.2,199.16 1 1 -github.com/ethereum/go-ethereum/node/node.go:203.2,203.12 1 1 -github.com/ethereum/go-ethereum/node/node.go:171.20,173.24 2 1 -github.com/ethereum/go-ethereum/node/node.go:174.19,176.24 2 0 -github.com/ethereum/go-ethereum/node/node.go:186.16,189.3 2 0 -github.com/ethereum/go-ethereum/node/node.go:192.39,193.42 1 1 -github.com/ethereum/go-ethereum/node/node.go:196.3,196.39 1 1 -github.com/ethereum/go-ethereum/node/node.go:193.42,194.9 1 1 -github.com/ethereum/go-ethereum/node/node.go:199.16,202.3 2 1 -github.com/ethereum/go-ethereum/node/node.go:208.30,215.15 6 1 -github.com/ethereum/go-ethereum/node/node.go:216.25,218.24 1 1 -github.com/ethereum/go-ethereum/node/node.go:219.20,222.54 2 1 -github.com/ethereum/go-ethereum/node/node.go:225.3,225.25 1 1 -github.com/ethereum/go-ethereum/node/node.go:226.19,227.24 1 1 -github.com/ethereum/go-ethereum/node/node.go:228.10,229.59 1 0 -github.com/ethereum/go-ethereum/node/node.go:222.54,224.4 1 1 -github.com/ethereum/go-ethereum/node/node.go:234.44,242.41 5 1 -github.com/ethereum/go-ethereum/node/node.go:245.2,245.18 1 1 -github.com/ethereum/go-ethereum/node/node.go:252.2,258.19 3 1 -github.com/ethereum/go-ethereum/node/node.go:242.41,244.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:245.18,246.48 1 1 -github.com/ethereum/go-ethereum/node/node.go:246.48,248.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:259.9,260.13 1 1 -github.com/ethereum/go-ethereum/node/node.go:261.9,262.17 1 1 -github.com/ethereum/go-ethereum/node/node.go:263.10,264.32 1 0 -github.com/ethereum/go-ethereum/node/node.go:269.38,272.41 2 1 -github.com/ethereum/go-ethereum/node/node.go:276.2,277.16 2 1 -github.com/ethereum/go-ethereum/node/node.go:281.2,281.12 1 1 -github.com/ethereum/go-ethereum/node/node.go:272.41,274.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:277.16,280.3 2 0 -github.com/ethereum/go-ethereum/node/node.go:285.59,286.26 1 1 -github.com/ethereum/go-ethereum/node/node.go:291.2,291.14 1 1 -github.com/ethereum/go-ethereum/node/node.go:286.26,287.15 1 1 -github.com/ethereum/go-ethereum/node/node.go:287.15,289.4 1 1 -github.com/ethereum/go-ethereum/node/node.go:296.56,301.41 3 1 -github.com/ethereum/go-ethereum/node/node.go:308.2,310.31 2 1 -github.com/ethereum/go-ethereum/node/node.go:313.2,313.12 1 1 -github.com/ethereum/go-ethereum/node/node.go:301.41,302.43 1 1 -github.com/ethereum/go-ethereum/node/node.go:302.43,304.4 1 1 -github.com/ethereum/go-ethereum/node/node.go:310.31,312.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:316.36,317.28 1 1 -github.com/ethereum/go-ethereum/node/node.go:321.2,322.51 2 1 -github.com/ethereum/go-ethereum/node/node.go:327.2,328.16 2 1 -github.com/ethereum/go-ethereum/node/node.go:331.2,332.12 2 1 -github.com/ethereum/go-ethereum/node/node.go:317.28,319.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:322.51,324.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:328.16,330.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:335.31,337.22 1 1 -github.com/ethereum/go-ethereum/node/node.go:337.22,338.45 1 1 -github.com/ethereum/go-ethereum/node/node.go:341.3,341.18 1 1 -github.com/ethereum/go-ethereum/node/node.go:338.45,340.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:348.65,350.24 2 0 -github.com/ethereum/go-ethereum/node/node.go:355.2,356.52 2 0 -github.com/ethereum/go-ethereum/node/node.go:365.2,368.20 3 0 -github.com/ethereum/go-ethereum/node/node.go:372.2,372.88 1 0 -github.com/ethereum/go-ethereum/node/node.go:375.2,376.23 2 0 -github.com/ethereum/go-ethereum/node/node.go:350.24,353.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:356.52,358.27 2 0 -github.com/ethereum/go-ethereum/node/node.go:361.3,362.47 2 0 -github.com/ethereum/go-ethereum/node/node.go:358.27,360.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:368.20,371.3 2 0 -github.com/ethereum/go-ethereum/node/node.go:372.88,374.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:382.33,383.40 1 1 -github.com/ethereum/go-ethereum/node/node.go:388.2,388.26 1 1 -github.com/ethereum/go-ethereum/node/node.go:393.2,398.71 2 1 -github.com/ethereum/go-ethereum/node/node.go:414.2,414.49 1 1 -github.com/ethereum/go-ethereum/node/node.go:430.2,430.66 1 1 -github.com/ethereum/go-ethereum/node/node.go:464.2,464.29 1 1 -github.com/ethereum/go-ethereum/node/node.go:471.2,471.27 1 1 -github.com/ethereum/go-ethereum/node/node.go:478.2,478.27 1 1 -github.com/ethereum/go-ethereum/node/node.go:488.2,488.33 1 1 -github.com/ethereum/go-ethereum/node/node.go:493.2,493.12 1 1 -github.com/ethereum/go-ethereum/node/node.go:383.40,385.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:388.26,389.48 1 0 -github.com/ethereum/go-ethereum/node/node.go:389.48,391.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:398.71,399.71 1 1 -github.com/ethereum/go-ethereum/node/node.go:402.3,407.18 1 1 -github.com/ethereum/go-ethereum/node/node.go:410.3,411.13 2 1 -github.com/ethereum/go-ethereum/node/node.go:399.71,401.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:407.18,409.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:414.49,416.69 2 1 -github.com/ethereum/go-ethereum/node/node.go:419.3,423.18 1 1 -github.com/ethereum/go-ethereum/node/node.go:426.3,427.13 2 1 -github.com/ethereum/go-ethereum/node/node.go:416.69,418.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:423.18,425.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:430.66,433.71 2 0 -github.com/ethereum/go-ethereum/node/node.go:436.3,442.18 1 0 -github.com/ethereum/go-ethereum/node/node.go:445.3,448.71 3 0 -github.com/ethereum/go-ethereum/node/node.go:451.3,456.18 1 0 -github.com/ethereum/go-ethereum/node/node.go:459.3,460.13 2 0 -github.com/ethereum/go-ethereum/node/node.go:433.71,435.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:442.18,444.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:448.71,450.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:456.18,458.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:464.29,466.67 1 1 -github.com/ethereum/go-ethereum/node/node.go:466.67,468.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:471.27,473.55 1 1 -github.com/ethereum/go-ethereum/node/node.go:473.55,475.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:478.27,480.17 2 0 -github.com/ethereum/go-ethereum/node/node.go:483.3,483.69 1 0 -github.com/ethereum/go-ethereum/node/node.go:480.17,482.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:483.69,485.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:488.33,489.40 1 1 -github.com/ethereum/go-ethereum/node/node.go:489.40,491.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:496.74,498.19 2 1 -github.com/ethereum/go-ethereum/node/node.go:501.2,501.56 1 1 -github.com/ethereum/go-ethereum/node/node.go:504.2,504.17 1 1 -github.com/ethereum/go-ethereum/node/node.go:498.19,500.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:501.56,503.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:507.26,514.2 6 1 -github.com/ethereum/go-ethereum/node/node.go:517.36,518.32 1 1 -github.com/ethereum/go-ethereum/node/node.go:523.2,523.12 1 1 -github.com/ethereum/go-ethereum/node/node.go:518.32,519.82 1 1 -github.com/ethereum/go-ethereum/node/node.go:519.82,521.4 1 0 -github.com/ethereum/go-ethereum/node/node.go:527.29,529.2 1 1 -github.com/ethereum/go-ethereum/node/node.go:532.23,534.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:537.55,541.34 3 1 -github.com/ethereum/go-ethereum/node/node.go:544.2,544.48 1 1 -github.com/ethereum/go-ethereum/node/node.go:547.2,547.48 1 1 -github.com/ethereum/go-ethereum/node/node.go:541.34,542.60 1 0 -github.com/ethereum/go-ethereum/node/node.go:544.48,545.83 1 0 -github.com/ethereum/go-ethereum/node/node.go:551.60,555.34 3 1 -github.com/ethereum/go-ethereum/node/node.go:558.2,558.63 1 1 -github.com/ethereum/go-ethereum/node/node.go:555.34,556.60 1 0 -github.com/ethereum/go-ethereum/node/node.go:562.45,566.34 3 1 -github.com/ethereum/go-ethereum/node/node.go:569.2,569.40 1 1 -github.com/ethereum/go-ethereum/node/node.go:566.34,567.55 1 0 -github.com/ethereum/go-ethereum/node/node.go:574.59,575.32 1 1 -github.com/ethereum/go-ethereum/node/node.go:580.2,580.35 1 1 -github.com/ethereum/go-ethereum/node/node.go:575.32,576.25 1 1 -github.com/ethereum/go-ethereum/node/node.go:576.25,578.4 1 1 -github.com/ethereum/go-ethereum/node/node.go:587.73,591.34 3 1 -github.com/ethereum/go-ethereum/node/node.go:595.2,596.34 2 1 -github.com/ethereum/go-ethereum/node/node.go:591.34,592.63 1 0 -github.com/ethereum/go-ethereum/node/node.go:600.46,602.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:605.50,609.28 3 0 -github.com/ethereum/go-ethereum/node/node.go:612.2,612.29 1 0 -github.com/ethereum/go-ethereum/node/node.go:609.28,611.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:616.33,618.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:623.37,628.2 3 0 -github.com/ethereum/go-ethereum/node/node.go:632.33,634.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:637.37,639.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:642.37,644.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:647.51,649.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:652.37,654.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:658.38,660.2 1 1 -github.com/ethereum/go-ethereum/node/node.go:663.36,664.24 1 1 -github.com/ethereum/go-ethereum/node/node.go:667.2,667.59 1 1 -github.com/ethereum/go-ethereum/node/node.go:664.24,666.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:672.42,674.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:679.119,682.28 3 1 -github.com/ethereum/go-ethereum/node/node.go:686.2,688.28 3 1 -github.com/ethereum/go-ethereum/node/node.go:694.2,694.16 1 1 -github.com/ethereum/go-ethereum/node/node.go:697.2,697.16 1 1 -github.com/ethereum/go-ethereum/node/node.go:682.28,684.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:688.28,690.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:690.8,692.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:694.16,696.3 1 1 -github.com/ethereum/go-ethereum/node/node.go:705.139,708.28 3 0 -github.com/ethereum/go-ethereum/node/node.go:712.2,714.28 3 0 -github.com/ethereum/go-ethereum/node/node.go:727.2,727.16 1 0 -github.com/ethereum/go-ethereum/node/node.go:730.2,730.16 1 0 -github.com/ethereum/go-ethereum/node/node.go:708.28,710.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:714.28,716.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:716.8,718.10 2 0 -github.com/ethereum/go-ethereum/node/node.go:724.3,724.100 1 0 -github.com/ethereum/go-ethereum/node/node.go:719.22,720.44 1 0 -github.com/ethereum/go-ethereum/node/node.go:721.33,722.36 1 0 -github.com/ethereum/go-ethereum/node/node.go:727.16,729.3 1 0 -github.com/ethereum/go-ethereum/node/node.go:734.45,736.2 1 0 -github.com/ethereum/go-ethereum/node/node.go:746.42,751.2 4 1 -github.com/ethereum/go-ethereum/node/node.go:754.63,758.2 3 1 -github.com/ethereum/go-ethereum/node/node.go:761.50,762.30 1 1 -github.com/ethereum/go-ethereum/node/node.go:768.2,768.15 1 1 -github.com/ethereum/go-ethereum/node/node.go:762.30,764.45 2 1 -github.com/ethereum/go-ethereum/node/node.go:764.45,766.4 1 0 -github.com/ethereum/go-ethereum/node/api.go:34.33,56.2 1 1 -github.com/ethereum/go-ethereum/node/api.go:66.63,69.19 2 0 -github.com/ethereum/go-ethereum/node/api.go:73.2,74.16 2 0 -github.com/ethereum/go-ethereum/node/api.go:77.2,78.18 2 0 -github.com/ethereum/go-ethereum/node/api.go:69.19,71.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:74.16,76.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:82.66,85.19 2 0 -github.com/ethereum/go-ethereum/node/api.go:89.2,90.16 2 0 -github.com/ethereum/go-ethereum/node/api.go:93.2,94.18 2 0 -github.com/ethereum/go-ethereum/node/api.go:85.19,87.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:90.16,92.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:98.70,101.19 2 0 -github.com/ethereum/go-ethereum/node/api.go:104.2,105.16 2 0 -github.com/ethereum/go-ethereum/node/api.go:108.2,109.18 2 0 -github.com/ethereum/go-ethereum/node/api.go:101.19,103.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:105.16,107.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:114.73,117.19 2 0 -github.com/ethereum/go-ethereum/node/api.go:120.2,121.16 2 0 -github.com/ethereum/go-ethereum/node/api.go:124.2,125.18 2 0 -github.com/ethereum/go-ethereum/node/api.go:117.19,119.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:121.16,123.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:130.88,133.19 2 0 -github.com/ethereum/go-ethereum/node/api.go:138.2,139.16 2 0 -github.com/ethereum/go-ethereum/node/api.go:142.2,144.12 2 0 -github.com/ethereum/go-ethereum/node/api.go:163.2,163.20 1 0 -github.com/ethereum/go-ethereum/node/api.go:133.19,135.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:139.16,141.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:144.12,149.7 4 0 -github.com/ethereum/go-ethereum/node/api.go:149.7,150.11 1 0 -github.com/ethereum/go-ethereum/node/api.go:151.27,152.38 1 0 -github.com/ethereum/go-ethereum/node/api.go:153.21,154.11 1 0 -github.com/ethereum/go-ethereum/node/api.go:155.24,156.11 1 0 -github.com/ethereum/go-ethereum/node/api.go:157.29,158.11 1 0 -github.com/ethereum/go-ethereum/node/api.go:167.122,172.17 3 1 -github.com/ethereum/go-ethereum/node/api.go:179.2,179.17 1 1 -github.com/ethereum/go-ethereum/node/api.go:184.2,189.17 2 1 -github.com/ethereum/go-ethereum/node/api.go:195.2,195.19 1 1 -github.com/ethereum/go-ethereum/node/api.go:201.2,201.17 1 1 -github.com/ethereum/go-ethereum/node/api.go:208.2,208.66 1 1 -github.com/ethereum/go-ethereum/node/api.go:211.2,211.74 1 1 -github.com/ethereum/go-ethereum/node/api.go:214.2,214.46 1 1 -github.com/ethereum/go-ethereum/node/api.go:217.2,217.18 1 1 -github.com/ethereum/go-ethereum/node/api.go:172.17,174.37 2 0 -github.com/ethereum/go-ethereum/node/api.go:177.3,177.12 1 0 -github.com/ethereum/go-ethereum/node/api.go:174.37,176.4 1 0 -github.com/ethereum/go-ethereum/node/api.go:179.17,181.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:189.17,191.52 2 0 -github.com/ethereum/go-ethereum/node/api.go:191.52,193.4 1 0 -github.com/ethereum/go-ethereum/node/api.go:195.19,197.51 2 0 -github.com/ethereum/go-ethereum/node/api.go:197.51,199.4 1 0 -github.com/ethereum/go-ethereum/node/api.go:201.17,203.47 2 0 -github.com/ethereum/go-ethereum/node/api.go:203.47,205.4 1 0 -github.com/ethereum/go-ethereum/node/api.go:208.66,210.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:211.74,213.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:214.46,216.3 1 1 -github.com/ethereum/go-ethereum/node/api.go:222.121,225.2 2 0 -github.com/ethereum/go-ethereum/node/api.go:228.54,231.2 2 1 -github.com/ethereum/go-ethereum/node/api.go:235.53,238.2 2 0 -github.com/ethereum/go-ethereum/node/api.go:241.114,246.17 3 1 -github.com/ethereum/go-ethereum/node/api.go:253.2,253.17 1 1 -github.com/ethereum/go-ethereum/node/api.go:258.2,263.17 2 1 -github.com/ethereum/go-ethereum/node/api.go:269.2,269.27 1 1 -github.com/ethereum/go-ethereum/node/api.go:277.2,278.59 2 1 -github.com/ethereum/go-ethereum/node/api.go:281.2,282.58 2 1 -github.com/ethereum/go-ethereum/node/api.go:285.2,285.39 1 1 -github.com/ethereum/go-ethereum/node/api.go:288.2,289.18 2 1 -github.com/ethereum/go-ethereum/node/api.go:246.17,248.35 2 0 -github.com/ethereum/go-ethereum/node/api.go:251.3,251.12 1 0 -github.com/ethereum/go-ethereum/node/api.go:248.35,250.4 1 0 -github.com/ethereum/go-ethereum/node/api.go:253.17,255.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:263.17,265.47 2 0 -github.com/ethereum/go-ethereum/node/api.go:265.47,267.4 1 0 -github.com/ethereum/go-ethereum/node/api.go:269.27,271.62 2 0 -github.com/ethereum/go-ethereum/node/api.go:271.62,273.4 1 0 -github.com/ethereum/go-ethereum/node/api.go:278.59,280.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:282.58,284.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:285.39,287.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:293.52,297.2 3 1 -github.com/ethereum/go-ethereum/node/api.go:307.61,309.19 2 0 -github.com/ethereum/go-ethereum/node/api.go:312.2,312.32 1 0 -github.com/ethereum/go-ethereum/node/api.go:309.19,311.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:317.62,319.19 2 0 -github.com/ethereum/go-ethereum/node/api.go:322.2,322.31 1 0 -github.com/ethereum/go-ethereum/node/api.go:319.19,321.3 1 0 -github.com/ethereum/go-ethereum/node/api.go:326.45,328.2 1 0 -github.com/ethereum/go-ethereum/node/api.go:336.48,338.2 1 0 -github.com/ethereum/go-ethereum/node/api.go:342.65,344.2 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:71.30,74.16 2 1 -github.com/ethereum/go-ethereum/node/defaults.go:93.2,93.11 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:74.16,75.23 1 1 -github.com/ethereum/go-ethereum/node/defaults.go:76.17,77.53 1 1 -github.com/ethereum/go-ethereum/node/defaults.go:78.18,84.48 3 0 -github.com/ethereum/go-ethereum/node/defaults.go:87.4,87.45 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:88.11,89.43 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:84.48,86.5 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:96.30,98.13 2 0 -github.com/ethereum/go-ethereum/node/defaults.go:104.2,104.10 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:98.13,102.58 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:107.37,109.16 2 0 -github.com/ethereum/go-ethereum/node/defaults.go:112.2,114.23 3 0 -github.com/ethereum/go-ethereum/node/defaults.go:109.16,111.3 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:117.23,118.43 1 1 -github.com/ethereum/go-ethereum/node/defaults.go:121.2,121.44 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:124.2,124.11 1 0 -github.com/ethereum/go-ethereum/node/defaults.go:118.43,120.3 1 1 -github.com/ethereum/go-ethereum/node/defaults.go:121.44,123.3 1 0 -github.com/ethereum/go-ethereum/node/jwt_handler.go:33.67,35.56 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:35.56,37.4 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:43.80,48.79 2 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:51.2,51.24 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:58.2,62.9 2 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:48.79,50.3 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:51.24,54.3 2 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:63.18,64.53 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:65.20,66.57 1 0 -github.com/ethereum/go-ethereum/node/jwt_handler.go:67.50,68.60 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:69.30,70.61 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:71.56,72.55 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:73.56,74.56 1 1 -github.com/ethereum/go-ethereum/node/jwt_handler.go:75.10,76.33 1 1 -github.com/ethereum/go-ethereum/metrics/graphite.go:27.78,36.2 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:40.43,42.39 2 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:42.39,43.38 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:43.38,45.4 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:52.43,55.2 2 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:57.40,61.16 4 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:64.2,66.51 3 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:112.2,112.12 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:61.16,63.3 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:66.51,67.29 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:110.3,110.12 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:68.16,69.78 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:70.14,71.78 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:72.21,73.78 1 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:74.18,82.44 8 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:86.14,92.77 6 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:93.14,101.44 8 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:105.4,108.82 4 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:82.44,85.5 2 0 -github.com/ethereum/go-ethereum/metrics/graphite.go:101.44,104.5 2 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:13.54,14.14 1 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:17.2,17.37 1 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:14.14,16.3 1 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:24.32,24.33 0 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:27.37,27.51 1 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:30.34,30.35 0 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:33.41,33.42 0 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:43.39,45.2 1 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:48.45,50.2 1 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:53.41,55.2 1 0 -github.com/ethereum/go-ethereum/metrics/healthcheck.go:59.52,61.2 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:26.56,27.14 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:30.2,30.48 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:27.14,29.3 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:37.62,38.14 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:41.2,41.54 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:38.14,40.3 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:46.23,47.14 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:50.2,54.22 5 1 -github.com/ethereum/go-ethereum/metrics/meter.go:58.2,58.10 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:47.14,49.3 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:54.22,57.3 2 1 -github.com/ethereum/go-ethereum/metrics/meter.go:64.29,69.22 5 0 -github.com/ethereum/go-ethereum/metrics/meter.go:73.2,73.10 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:69.22,72.3 2 0 -github.com/ethereum/go-ethereum/metrics/meter.go:80.56,82.14 2 1 -github.com/ethereum/go-ethereum/metrics/meter.go:85.2,86.10 2 1 -github.com/ethereum/go-ethereum/metrics/meter.go:82.14,84.3 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:93.62,95.14 2 0 -github.com/ethereum/go-ethereum/metrics/meter.go:98.2,99.10 2 0 -github.com/ethereum/go-ethereum/metrics/meter.go:95.14,97.3 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:114.39,114.57 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:117.37,118.41 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:123.41,123.59 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:127.41,127.59 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:131.42,131.61 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:135.44,135.65 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:138.42,138.54 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:141.33,141.34 0 0 -github.com/ethereum/go-ethereum/metrics/meter.go:147.31,147.43 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:150.32,150.33 0 0 -github.com/ethereum/go-ethereum/metrics/meter.go:153.33,153.47 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:156.33,156.47 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:159.34,159.48 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:162.36,162.50 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:165.34,165.55 1 0 -github.com/ethereum/go-ethereum/metrics/meter.go:168.25,168.26 0 0 -github.com/ethereum/go-ethereum/metrics/meter.go:179.40,187.2 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:190.32,192.18 2 1 -github.com/ethereum/go-ethereum/metrics/meter.go:192.18,196.3 3 1 -github.com/ethereum/go-ethereum/metrics/meter.go:201.39,206.2 4 1 -github.com/ethereum/go-ethereum/metrics/meter.go:209.39,211.2 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:214.41,218.2 3 1 -github.com/ethereum/go-ethereum/metrics/meter.go:221.41,225.2 3 1 -github.com/ethereum/go-ethereum/metrics/meter.go:228.42,232.2 3 1 -github.com/ethereum/go-ethereum/metrics/meter.go:235.44,239.2 3 1 -github.com/ethereum/go-ethereum/metrics/meter.go:242.42,247.2 4 1 -github.com/ethereum/go-ethereum/metrics/meter.go:249.42,256.2 5 1 -github.com/ethereum/go-ethereum/metrics/meter.go:258.39,265.2 5 1 -github.com/ethereum/go-ethereum/metrics/meter.go:267.32,275.2 7 1 -github.com/ethereum/go-ethereum/metrics/meter.go:289.32,290.24 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:290.24,292.3 1 1 -github.com/ethereum/go-ethereum/metrics/meter.go:295.38,298.31 3 1 -github.com/ethereum/go-ethereum/metrics/meter.go:298.31,300.3 1 1 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:28.78,36.2 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:40.43,41.39 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:41.39,42.38 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:42.38,44.4 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:48.32,49.25 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:57.2,57.22 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:49.25,51.51 2 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:51.51,53.4 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:53.9,55.4 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:60.40,65.16 5 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:68.2,70.51 3 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:118.2,118.12 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:65.16,67.3 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:70.51,71.29 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:116.3,116.12 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:72.16,73.105 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:74.14,75.105 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:76.21,77.105 1 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:78.18,90.107 12 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:91.14,97.104 6 0 -github.com/ethereum/go-ethereum/metrics/opentsdb.go:98.14,114.109 16 0 -github.com/ethereum/go-ethereum/metrics/counter.go:18.60,19.14 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:22.2,22.52 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:19.14,21.3 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:29.66,30.14 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:33.2,33.58 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:30.14,32.3 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:37.27,38.14 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:41.2,41.28 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:38.14,40.3 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:46.33,48.2 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:51.60,53.14 2 1 -github.com/ethereum/go-ethereum/metrics/counter.go:56.2,57.10 2 1 -github.com/ethereum/go-ethereum/metrics/counter.go:53.14,55.3 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:64.66,66.14 2 0 -github.com/ethereum/go-ethereum/metrics/counter.go:69.2,70.10 2 0 -github.com/ethereum/go-ethereum/metrics/counter.go:66.14,68.3 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:77.32,78.44 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:82.40,82.59 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:85.35,86.42 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:90.35,91.42 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:95.45,95.57 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:101.28,101.29 0 0 -github.com/ethereum/go-ethereum/metrics/counter.go:104.33,104.45 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:107.33,107.34 0 0 -github.com/ethereum/go-ethereum/metrics/counter.go:110.33,110.34 0 0 -github.com/ethereum/go-ethereum/metrics/counter.go:113.38,113.61 1 0 -github.com/ethereum/go-ethereum/metrics/counter.go:122.35,124.2 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:127.41,129.2 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:132.40,134.2 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:137.40,139.2 1 1 -github.com/ethereum/go-ethereum/metrics/counter.go:142.46,144.2 1 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:20.34,22.2 1 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:25.22,27.2 1 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:30.22,32.2 1 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:35.23,37.2 1 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:44.38,44.59 1 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:47.39,47.51 1 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:50.28,51.41 1 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:55.35,56.43 1 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:63.31,63.45 1 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:66.32,66.52 1 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:69.24,69.25 0 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:72.33,72.34 0 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:86.39,90.2 3 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:93.40,95.2 1 0 -github.com/ethereum/go-ethereum/metrics/ewma.go:99.31,105.12 6 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:105.12,107.3 1 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:107.8,110.3 2 1 -github.com/ethereum/go-ethereum/metrics/ewma.go:114.40,116.2 1 1 -github.com/ethereum/go-ethereum/metrics/log.go:11.52,13.2 1 0 -github.com/ethereum/go-ethereum/metrics/log.go:17.79,21.28 3 0 -github.com/ethereum/go-ethereum/metrics/log.go:21.28,22.43 1 0 -github.com/ethereum/go-ethereum/metrics/log.go:22.43,23.30 1 0 -github.com/ethereum/go-ethereum/metrics/log.go:24.17,26.53 2 0 -github.com/ethereum/go-ethereum/metrics/log.go:27.15,29.53 2 0 -github.com/ethereum/go-ethereum/metrics/log.go:30.22,32.52 2 0 -github.com/ethereum/go-ethereum/metrics/log.go:33.21,36.52 3 0 -github.com/ethereum/go-ethereum/metrics/log.go:37.19,50.48 13 0 -github.com/ethereum/go-ethereum/metrics/log.go:51.15,58.54 7 0 -github.com/ethereum/go-ethereum/metrics/log.go:59.15,76.54 17 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:38.13,39.30 1 1 -github.com/ethereum/go-ethereum/metrics/metrics.go:39.30,42.40 2 1 -github.com/ethereum/go-ethereum/metrics/metrics.go:48.3,48.49 1 1 -github.com/ethereum/go-ethereum/metrics/metrics.go:42.40,43.35 1 1 -github.com/ethereum/go-ethereum/metrics/metrics.go:43.35,46.5 2 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:48.49,49.44 1 1 -github.com/ethereum/go-ethereum/metrics/metrics.go:49.44,52.5 2 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:59.51,61.14 1 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:64.2,70.37 5 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:76.2,97.20 2 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:61.14,63.3 1 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:70.37,74.3 3 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:97.20,115.49 15 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:124.3,124.22 1 0 -github.com/ethereum/go-ethereum/metrics/metrics.go:115.49,123.4 6 0 -github.com/ethereum/go-ethereum/metrics/sample.go:48.65,49.14 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:52.2,59.10 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:49.14,51.3 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:63.34,70.2 6 0 -github.com/ethereum/go-ethereum/metrics/sample.go:74.40,78.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:82.38,84.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:87.41,89.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:93.38,95.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:98.56,100.2 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:104.62,106.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:109.37,113.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:116.44,121.25 5 1 -github.com/ethereum/go-ethereum/metrics/sample.go:124.2,127.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:121.25,123.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:131.43,133.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:136.38,138.2 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:141.42,143.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:146.43,151.25 5 1 -github.com/ethereum/go-ethereum/metrics/sample.go:154.2,154.15 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:151.25,153.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:158.45,160.2 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:164.55,168.40 4 1 -github.com/ethereum/go-ethereum/metrics/sample.go:171.2,175.19 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:168.40,170.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:175.19,181.28 6 1 -github.com/ethereum/go-ethereum/metrics/sample.go:181.28,184.4 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:192.27,192.28 0 0 -github.com/ethereum/go-ethereum/metrics/sample.go:195.32,195.44 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:198.30,198.42 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:201.33,201.47 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:204.30,204.42 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:207.48,207.62 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:210.54,212.2 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:215.29,215.41 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:218.36,218.58 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:221.35,221.49 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:224.30,224.42 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:227.35,227.36 0 0 -github.com/ethereum/go-ethereum/metrics/sample.go:230.35,230.55 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:233.37,233.51 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:236.38,237.22 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:240.2,241.27 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:246.2,246.12 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:237.22,239.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:241.27,242.14 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:242.14,244.4 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:250.41,251.22 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:254.2,254.58 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:251.22,253.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:258.38,259.22 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:262.2,263.27 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:268.2,268.12 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:259.22,261.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:263.27,264.14 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:264.14,266.4 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:272.61,274.2 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:278.67,281.14 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:296.2,296.15 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:281.14,283.24 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:283.24,285.17 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:285.17,287.5 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:287.10,287.35 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:287.35,289.5 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:289.10,293.5 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:305.69,310.2 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:313.32,314.43 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:318.40,318.58 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:321.38,321.68 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:324.41,324.72 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:327.38,327.68 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:331.56,333.2 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:337.62,339.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:342.37,342.61 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:345.44,345.56 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:349.43,349.76 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:352.38,352.68 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:355.38,356.44 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:360.43,364.2 3 0 -github.com/ethereum/go-ethereum/metrics/sample.go:367.45,367.80 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:370.43,372.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:375.38,377.27 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:380.2,380.12 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:377.27,379.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:384.45,385.22 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:388.2,390.27 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:394.2,394.35 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:385.22,387.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:390.27,393.3 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:409.49,410.14 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:413.2,416.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:410.14,412.3 1 0 -github.com/ethereum/go-ethereum/metrics/sample.go:420.33,425.2 4 0 -github.com/ethereum/go-ethereum/metrics/sample.go:429.39,433.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:437.37,441.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:444.40,448.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:452.37,456.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:459.55,463.2 3 0 -github.com/ethereum/go-ethereum/metrics/sample.go:467.61,471.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:474.36,478.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:481.43,490.2 5 1 -github.com/ethereum/go-ethereum/metrics/sample.go:493.42,497.2 3 1 -github.com/ethereum/go-ethereum/metrics/sample.go:500.37,504.2 3 0 -github.com/ethereum/go-ethereum/metrics/sample.go:507.41,511.37 4 1 -github.com/ethereum/go-ethereum/metrics/sample.go:511.37,513.3 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:513.8,515.31 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:515.31,517.4 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:522.42,528.2 5 1 -github.com/ethereum/go-ethereum/metrics/sample.go:531.44,535.2 3 0 -github.com/ethereum/go-ethereum/metrics/sample.go:543.67,545.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:553.38,555.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:557.53,562.2 4 1 -github.com/ethereum/go-ethereum/metrics/sample.go:564.51,573.2 7 1 -github.com/ethereum/go-ethereum/metrics/sample.go:575.41,577.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:579.56,581.2 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:583.40,584.6 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:584.6,586.39 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:589.3,590.8 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:586.39,587.9 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:594.45,595.6 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:595.6,597.24 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:600.3,601.55 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:604.3,604.29 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:607.3,608.8 2 1 -github.com/ethereum/go-ethereum/metrics/sample.go:597.24,598.9 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:601.55,603.4 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:604.29,605.9 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:614.41,614.58 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:615.41,615.63 1 1 -github.com/ethereum/go-ethereum/metrics/sample.go:616.41,616.68 1 1 -github.com/ethereum/go-ethereum/metrics/cputime_unix.go:29.32,31.71 2 0 -github.com/ethereum/go-ethereum/metrics/cputime_unix.go:35.2,35.100 1 0 -github.com/ethereum/go-ethereum/metrics/cputime_unix.go:31.71,34.3 2 0 -github.com/ethereum/go-ethereum/metrics/registry.go:15.43,17.2 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:61.29,63.2 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:66.62,67.38 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:67.38,69.3 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:73.57,77.2 3 1 -github.com/ethereum/go-ethereum/metrics/registry.go:83.82,86.39 3 1 -github.com/ethereum/go-ethereum/metrics/registry.go:89.2,89.55 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:92.2,93.10 2 1 -github.com/ethereum/go-ethereum/metrics/registry.go:86.39,88.3 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:89.55,91.3 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:98.71,102.2 3 1 -github.com/ethereum/go-ethereum/metrics/registry.go:105.46,108.30 3 0 -github.com/ethereum/go-ethereum/metrics/registry.go:108.30,109.35 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:109.35,111.4 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:116.71,118.42 2 1 -github.com/ethereum/go-ethereum/metrics/registry.go:173.2,173.13 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:118.42,120.29 2 1 -github.com/ethereum/go-ethereum/metrics/registry.go:171.3,171.22 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:121.16,122.36 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:123.14,124.36 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:125.21,126.36 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:127.20,130.41 3 0 -github.com/ethereum/go-ethereum/metrics/registry.go:133.18,145.27 12 0 -github.com/ethereum/go-ethereum/metrics/registry.go:146.14,152.38 6 0 -github.com/ethereum/go-ethereum/metrics/registry.go:153.14,169.38 16 0 -github.com/ethereum/go-ethereum/metrics/registry.go:130.41,132.5 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:177.52,182.2 4 1 -github.com/ethereum/go-ethereum/metrics/registry.go:185.44,188.30 3 0 -github.com/ethereum/go-ethereum/metrics/registry.go:188.30,191.3 2 0 -github.com/ethereum/go-ethereum/metrics/registry.go:194.71,195.34 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:198.2,198.18 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:202.2,202.12 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:195.34,197.3 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:199.90,200.22 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:205.64,209.33 4 1 -github.com/ethereum/go-ethereum/metrics/registry.go:212.2,212.16 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:209.33,211.3 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:215.46,216.34 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:216.34,217.33 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:217.33,219.4 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:233.50,238.2 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:240.72,245.2 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:248.63,249.61 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:259.2,260.38 2 1 -github.com/ethereum/go-ethereum/metrics/registry.go:249.61,250.47 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:250.47,251.39 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:251.39,253.5 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:253.10,255.5 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:263.70,264.30 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:270.2,270.16 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:265.25,266.51 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:267.25,268.19 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:274.57,277.2 2 1 -github.com/ethereum/go-ethereum/metrics/registry.go:282.87,285.2 2 1 -github.com/ethereum/go-ethereum/metrics/registry.go:288.76,291.2 2 1 -github.com/ethereum/go-ethereum/metrics/registry.go:294.46,296.2 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:299.71,301.2 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:304.52,307.2 2 1 -github.com/ethereum/go-ethereum/metrics/registry.go:310.44,312.2 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:321.40,323.2 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:326.35,328.2 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:332.60,334.2 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:338.49,340.2 1 1 -github.com/ethereum/go-ethereum/metrics/registry.go:344.47,345.42 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:345.42,346.13 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:351.24,353.2 1 0 -github.com/ethereum/go-ethereum/metrics/registry.go:356.30,358.2 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:26.74,27.14 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:30.2,30.66 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:27.14,29.3 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:34.74,36.14 2 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:39.2,40.10 2 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:36.14,38.3 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:44.41,45.14 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:48.2,50.3 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:45.14,47.3 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:58.43,58.57 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:61.52,65.2 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:68.40,68.41 0 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:71.49,71.50 0 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:74.57,75.52 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:79.41,80.45 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:84.50,84.51 0 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:94.51,96.2 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:99.60,108.2 5 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:111.65,112.57 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:116.49,117.50 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:121.49,125.2 3 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:128.58,132.2 3 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:135.60,139.2 3 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:150.60,150.72 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:153.45,154.50 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:158.54,159.52 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:163.55,164.57 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:168.51,170.2 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:173.77,177.2 2 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:180.49,181.19 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:185.2,185.15 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:181.19,183.3 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:188.62,192.15 3 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:233.2,233.21 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:192.15,198.30 5 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:202.3,206.35 3 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:226.3,227.41 2 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:198.30,200.4 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:206.35,207.17 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:223.4,223.48 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:207.17,209.17 2 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:216.5,217.36 2 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:220.5,220.46 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:209.17,211.6 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:211.11,213.6 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:217.36,219.6 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:228.8,231.3 2 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:239.41,239.58 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:240.41,240.63 1 1 -github.com/ethereum/go-ethereum/metrics/resetting_timer.go:241.41,241.68 1 1 -github.com/ethereum/go-ethereum/metrics/writer.go:12.54,13.25 1 0 -github.com/ethereum/go-ethereum/metrics/writer.go:13.25,15.3 1 0 -github.com/ethereum/go-ethereum/metrics/writer.go:20.41,22.42 2 0 -github.com/ethereum/go-ethereum/metrics/writer.go:26.2,27.43 2 0 -github.com/ethereum/go-ethereum/metrics/writer.go:22.42,24.3 1 0 -github.com/ethereum/go-ethereum/metrics/writer.go:27.43,28.41 1 0 -github.com/ethereum/go-ethereum/metrics/writer.go:29.16,31.58 2 0 -github.com/ethereum/go-ethereum/metrics/writer.go:32.14,34.58 2 0 -github.com/ethereum/go-ethereum/metrics/writer.go:35.21,37.57 2 0 -github.com/ethereum/go-ethereum/metrics/writer.go:38.20,41.57 3 0 -github.com/ethereum/go-ethereum/metrics/writer.go:42.18,55.53 13 0 -github.com/ethereum/go-ethereum/metrics/writer.go:56.14,63.59 7 0 -github.com/ethereum/go-ethereum/metrics/writer.go:64.14,81.59 17 0 -github.com/ethereum/go-ethereum/metrics/writer.go:94.39,94.58 1 1 -github.com/ethereum/go-ethereum/metrics/writer.go:96.44,96.79 1 1 -github.com/ethereum/go-ethereum/metrics/writer.go:98.49,100.2 1 1 -github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:28.36,31.16 2 0 -github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:35.2,35.25 1 0 -github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:40.2,43.39 4 0 -github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:31.16,34.3 2 0 -github.com/ethereum/go-ethereum/metrics/cpu_enabled.go:35.25,38.3 2 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:16.56,17.14 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:20.2,20.48 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:17.14,19.3 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:24.23,25.14 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:28.2,28.26 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:25.14,27.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:32.56,34.14 2 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:37.2,38.10 2 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:34.14,36.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:42.47,43.14 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:46.2,46.35 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:43.14,45.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:50.82,52.14 2 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:55.2,56.10 2 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:52.14,54.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:63.41,63.53 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:66.36,67.43 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:71.33,72.40 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:76.33,77.40 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:81.38,81.57 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:87.34,87.55 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:90.34,90.35 0 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:93.31,93.32 0 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:96.31,96.32 0 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:99.31,99.43 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:108.42,110.2 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:113.41,115.2 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:118.39,120.2 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:123.38,125.2 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:128.38,130.2 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:138.40,140.2 1 1 -github.com/ethereum/go-ethereum/metrics/gauge.go:143.43,143.78 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:146.38,147.45 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:151.35,152.42 1 0 -github.com/ethereum/go-ethereum/metrics/gauge.go:156.35,157.42 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:14.70,15.14 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:18.2,18.64 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:15.14,17.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:22.37,23.14 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:26.2,28.3 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:23.14,25.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:32.70,34.14 2 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:37.2,38.10 2 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:34.14,36.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:42.63,43.14 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:46.2,46.42 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:43.14,45.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:50.98,52.14 2 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:55.2,56.10 2 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:52.14,54.3 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:63.55,63.67 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:66.45,67.50 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:71.47,71.68 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:77.48,77.76 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:80.43,80.44 0 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:83.40,83.54 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:93.56,95.2 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:98.50,102.2 3 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:105.48,109.2 3 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:117.49,119.2 1 1 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:122.57,122.99 1 0 -github.com/ethereum/go-ethereum/metrics/gauge_float64.go:125.47,126.52 1 0 -github.com/ethereum/go-ethereum/metrics/runtime_cgo.go:8.25,10.2 1 1 -github.com/ethereum/go-ethereum/metrics/runtime_gccpufraction.go:8.56,10.2 1 1 -github.com/ethereum/go-ethereum/metrics/disk_nop.go:25.44,27.2 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:22.74,23.14 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:26.2,26.48 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:23.14,25.3 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:26.48,26.74 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:31.85,32.14 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:35.2,35.48 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:32.14,34.3 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:35.48,35.76 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:39.39,40.14 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:43.2,43.38 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:40.14,42.3 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:48.74,50.14 2 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:53.2,54.10 2 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:50.14,52.3 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:63.35,64.46 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:69.43,69.70 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:73.41,73.66 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:77.44,77.70 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:81.41,81.66 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:85.59,87.2 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:91.65,93.2 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:96.45,96.64 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:99.50,99.62 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:103.46,103.74 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:106.41,106.66 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:109.41,110.47 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:114.48,114.78 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:120.30,120.31 0 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:123.35,123.47 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:126.33,126.45 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:129.36,129.50 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:132.33,132.45 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:135.51,135.65 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:138.57,140.2 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:143.37,143.59 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:146.42,146.67 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:149.38,149.52 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:152.33,152.45 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:155.38,155.39 0 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:158.40,158.54 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:167.37,167.57 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:171.43,171.70 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:174.41,174.66 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:177.44,177.70 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:180.41,180.66 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:183.59,185.2 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:189.65,191.2 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:194.45,194.64 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:197.50,199.2 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:202.46,202.74 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:205.41,205.66 1 0 -github.com/ethereum/go-ethereum/metrics/histogram.go:208.45,208.67 1 1 -github.com/ethereum/go-ethereum/metrics/histogram.go:211.48,211.78 1 0 -github.com/ethereum/go-ethereum/metrics/runtime.go:57.58,58.25 1 0 -github.com/ethereum/go-ethereum/metrics/runtime.go:58.25,60.3 1 0 -github.com/ethereum/go-ethereum/metrics/runtime.go:71.45,78.22 6 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:83.2,83.23 1 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:89.2,110.59 20 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:125.2,142.69 14 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:78.22,80.3 1 0 -github.com/ethereum/go-ethereum/metrics/runtime.go:80.8,82.3 1 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:83.23,85.3 1 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:85.8,87.3 1 0 -github.com/ethereum/go-ethereum/metrics/runtime.go:110.59,111.53 1 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:111.53,113.4 1 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:114.8,115.13 1 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:121.3,121.21 1 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:115.13,116.49 1 0 -github.com/ethereum/go-ethereum/metrics/runtime.go:119.4,119.9 1 0 -github.com/ethereum/go-ethereum/metrics/runtime.go:116.49,118.5 1 0 -github.com/ethereum/go-ethereum/metrics/runtime.go:121.21,123.4 1 1 -github.com/ethereum/go-ethereum/metrics/runtime.go:148.42,212.2 62 1 -github.com/ethereum/go-ethereum/metrics/debug.go:24.55,25.25 1 0 -github.com/ethereum/go-ethereum/metrics/debug.go:25.25,27.3 1 0 -github.com/ethereum/go-ethereum/metrics/debug.go:38.42,46.56 7 0 -github.com/ethereum/go-ethereum/metrics/debug.go:50.2,50.67 1 0 -github.com/ethereum/go-ethereum/metrics/debug.go:46.56,48.3 1 0 -github.com/ethereum/go-ethereum/metrics/debug.go:56.39,70.2 10 0 -github.com/ethereum/go-ethereum/metrics/debug.go:74.13,76.2 1 1 -github.com/ethereum/go-ethereum/metrics/json.go:11.58,13.2 1 1 -github.com/ethereum/go-ethereum/metrics/json.go:17.58,18.25 1 0 -github.com/ethereum/go-ethereum/metrics/json.go:18.25,20.3 1 0 -github.com/ethereum/go-ethereum/metrics/json.go:25.45,27.2 1 1 -github.com/ethereum/go-ethereum/metrics/json.go:29.58,31.2 1 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:14.60,15.25 1 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:15.25,16.43 1 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:16.43,17.30 1 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:18.17,19.71 1 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:20.15,21.69 1 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:22.22,23.69 1 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:24.21,26.75 2 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:27.19,43.7 3 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:44.15,54.7 2 0 -github.com/ethereum/go-ethereum/metrics/syslog.go:55.15,75.7 3 0 -github.com/ethereum/go-ethereum/metrics/timer.go:34.56,35.14 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:38.2,38.48 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:35.14,37.3 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:43.49,44.14 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:47.2,50.3 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:44.14,46.3 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:56.56,58.14 2 1 -github.com/ethereum/go-ethereum/metrics/timer.go:61.2,62.10 2 1 -github.com/ethereum/go-ethereum/metrics/timer.go:58.14,60.3 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:68.23,69.14 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:72.2,75.3 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:69.14,71.3 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:82.31,82.43 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:85.29,85.41 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:88.32,88.46 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:91.29,91.41 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:94.47,94.61 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:97.53,99.2 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:102.33,102.47 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:105.33,105.47 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:108.34,108.48 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:111.36,111.50 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:114.34,114.55 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:117.34,117.48 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:120.25,120.26 0 0 -github.com/ethereum/go-ethereum/metrics/timer.go:123.29,123.41 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:126.31,126.32 0 0 -github.com/ethereum/go-ethereum/metrics/timer.go:129.40,129.41 0 0 -github.com/ethereum/go-ethereum/metrics/timer.go:132.41,132.42 0 0 -github.com/ethereum/go-ethereum/metrics/timer.go:135.36,135.50 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:146.39,148.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:151.37,153.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:156.40,158.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:161.37,163.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:166.55,168.2 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:172.61,174.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:177.41,179.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:182.41,184.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:187.42,189.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:192.44,194.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:197.42,204.2 3 0 -github.com/ethereum/go-ethereum/metrics/timer.go:207.42,209.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:212.32,214.2 1 1 -github.com/ethereum/go-ethereum/metrics/timer.go:217.37,219.2 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:222.40,226.2 3 1 -github.com/ethereum/go-ethereum/metrics/timer.go:229.49,234.2 4 1 -github.com/ethereum/go-ethereum/metrics/timer.go:237.51,242.2 4 1 -github.com/ethereum/go-ethereum/metrics/timer.go:245.44,247.2 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:257.39,257.69 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:260.37,260.65 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:263.40,263.69 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:266.37,266.65 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:270.55,272.2 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:276.61,278.2 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:282.41,282.67 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:286.41,286.67 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:290.42,290.69 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:294.44,294.73 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:297.42,297.54 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:301.42,301.73 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:304.33,304.34 0 0 -github.com/ethereum/go-ethereum/metrics/timer.go:307.37,307.65 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:310.36,311.41 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:315.45,316.43 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:320.46,321.48 1 0 -github.com/ethereum/go-ethereum/metrics/timer.go:326.44,326.77 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_sample.go:7.44,11.2 1 0 -github.com/ethereum/go-ethereum/metrics/resetting_sample.go:20.46,24.2 3 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:133.31,135.2 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:153.62,155.38 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:160.2,160.63 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:155.38,157.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:157.8,157.46 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:157.46,159.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:169.32,169.52 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:170.32,170.53 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:172.32,172.52 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:173.32,173.53 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:175.36,175.60 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:176.36,176.61 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:178.37,178.62 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:179.37,179.63 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:181.38,181.64 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:182.38,182.65 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:184.39,184.66 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:185.39,185.67 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:188.30,190.2 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:209.59,210.29 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:213.2,215.36 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:218.2,219.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:223.2,224.36 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:240.2,242.32 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:210.29,212.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:215.36,217.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:219.16,221.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:225.18,226.18 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:227.18,228.18 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:229.22,230.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:231.23,232.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:233.24,234.24 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:235.25,236.25 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:237.10,238.67 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:246.82,250.43 4 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:253.2,255.16 3 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:258.2,262.26 4 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:250.43,252.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:255.16,257.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:266.63,268.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:271.2,272.17 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:268.16,270.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:276.48,281.2 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:284.77,289.34 5 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:292.2,292.15 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4wire/v4wire.go:289.34,291.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:29.33,34.2 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:37.37,39.2 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:42.42,44.42 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:50.2,51.42 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:62.2,62.50 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:66.2,69.16 3 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:73.2,75.26 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:44.42,47.3 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:51.42,53.17 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:57.3,57.43 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:53.17,56.4 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:57.43,60.4 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:62.50,65.3 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:69.16,72.3 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:78.39,88.12 7 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:93.2,93.26 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:101.2,101.10 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:88.12,91.3 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:93.26,94.10 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:95.19,96.79 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/command.go:97.21,98.12 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:381.30,508.2 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:510.37,521.24 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:538.2,538.12 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:521.24,522.19 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:522.19,526.39 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:531.4,531.11 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:534.4,535.13 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:526.39,528.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:528.10,530.5 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:531.11,533.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:541.44,552.24 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:562.2,562.12 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:552.24,553.50 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:553.50,555.18 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:558.4,559.13 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:555.18,557.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:565.51,567.20 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:576.2,581.64 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:584.2,584.44 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:587.2,587.51 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:590.2,590.20 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:567.20,570.17 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:573.3,573.32 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:570.17,572.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:581.64,583.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:584.44,586.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:587.51,589.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:593.36,594.25 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:597.2,598.9 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:601.2,604.32 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:609.2,609.26 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:614.2,614.12 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:594.25,596.3 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:598.9,600.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:604.32,606.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:609.26,611.3 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:611.8,613.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:617.72,619.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:622.2,626.26 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:630.2,634.2 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:670.2,670.25 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:777.2,778.22 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:783.2,787.20 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:797.2,797.18 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:811.2,811.16 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:821.2,822.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:619.16,621.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:626.26,629.3 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:634.2,639.3 4 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:642.2,653.3 10 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:656.2,661.55 4 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:661.55,662.39 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:665.4,665.54 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:662.39,664.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:670.25,673.94 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:678.3,684.46 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:694.3,694.58 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:697.3,713.30 7 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:673.94,675.4 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:684.46,686.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:686.9,686.50 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:686.50,688.4 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:688.9,690.18 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:690.18,692.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:694.58,696.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:713.30,715.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:719.2,722.3 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:725.2,727.33 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:727.33,729.18 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:732.4,733.55 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:736.4,736.39 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:729.18,731.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:733.55,735.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:741.2,743.36 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:748.3,749.17 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:761.3,774.42 12 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:743.36,745.4 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:749.17,750.67 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:754.4,755.25 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:750.67,753.5 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:755.25,758.5 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:778.22,780.3 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:780.8,782.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:788.14,789.35 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:790.14,791.35 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:792.10,793.65 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:798.14,799.22 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:800.17,802.19 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:806.10,807.60 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:802.19,805.4 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:811.16,812.40 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:812.40,814.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:814.9,818.4 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:831.52,833.27 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:840.2,865.25 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:887.2,888.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:891.2,894.26 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:915.2,915.22 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:920.2,920.17 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:833.27,835.30 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:835.30,837.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:865.25,873.3 5 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:876.2,877.29 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:881.3,881.27 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:877.29,880.4 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:881.27,884.4 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:888.16,890.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:894.26,898.26 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:901.3,901.74 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:904.3,904.94 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:907.3,907.89 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:910.3,910.91 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:898.26,900.4 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:901.74,903.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:904.94,906.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:907.89,909.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:910.91,912.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:915.22,919.3 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:923.45,924.26 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:929.2,929.12 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:924.26,925.89 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:925.89,927.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:932.41,934.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:937.2,938.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:941.2,941.29 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:934.16,936.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:938.16,940.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:944.59,946.27 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:955.2,955.17 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:946.27,947.16 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:947.16,949.18 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:952.4,952.27 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:949.18,951.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:958.30,961.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:965.2,965.22 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:961.16,964.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:966.16,967.47 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:968.17,970.20 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:974.3,974.39 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:975.10,976.37 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:970.20,972.59 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:980.24,982.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:985.2,985.17 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config.go:982.16,984.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/config_legacy.go:18.41,23.2 4 1 -github.com/ethereum/go-ethereum/internal/cli/server/config_legacy.go:25.53,29.42 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/config_legacy.go:32.2,32.29 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/config_legacy.go:29.42,31.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/flags.go:7.44,484.2 91 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:44.49,52.62 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:57.2,57.43 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:62.2,63.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:66.2,67.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:70.2,73.2 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:83.2,84.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:88.2,89.16 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:92.2,98.36 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:105.2,105.27 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:112.2,112.55 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:118.2,118.72 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:123.2,123.41 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:126.2,126.17 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:52.62,54.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:57.43,59.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:63.16,65.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:67.16,69.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:73.2,76.40 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:79.3,79.72 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:76.40,78.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:84.16,86.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:89.16,91.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:98.36,99.107 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:99.107,101.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:105.27,106.100 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:106.100,108.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:112.55,113.48 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:113.48,115.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:118.72,120.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:123.41,125.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:129.25,133.21 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:133.21,134.65 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:134.65,136.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:140.82,144.22 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:149.2,152.106 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:172.2,174.33 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:195.2,195.40 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:236.2,236.12 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:144.22,147.3 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:152.106,153.29 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:157.3,161.16 4 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:165.3,165.16 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:153.29,155.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:161.16,164.4 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:165.16,168.4 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:174.33,178.85 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:182.3,187.13 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:178.85,180.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:187.13,188.54 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:188.54,190.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:195.40,205.17 3 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:210.3,215.17 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:221.3,233.28 5 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:205.17,207.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:215.17,217.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:239.53,244.16 4 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:248.2,248.12 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:254.2,255.12 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:244.16,246.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:248.12,249.49 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:249.49,251.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:258.66,260.2 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:262.157,267.2 4 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:269.35,272.14 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:275.2,280.16 4 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:285.2,285.32 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:272.14,274.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:280.16,282.3 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/server.go:282.8,284.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:21.85,27.18 5 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:35.2,35.16 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:40.2,48.16 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:53.2,56.72 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:60.2,60.47 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:65.2,68.16 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:71.2,71.12 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:28.30,29.66 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:30.32,31.61 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:32.33,33.59 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:35.16,37.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:48.16,50.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:56.72,58.4 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:60.47,62.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:68.16,70.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:74.109,76.16 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:79.2,80.17 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:85.2,85.39 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:76.16,78.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:80.17,82.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:82.8,84.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:88.118,90.16 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:93.2,94.17 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:99.2,99.42 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:90.16,92.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:94.17,96.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:96.8,98.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:102.112,106.26 3 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:109.2,109.18 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:106.26,108.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:112.118,114.48 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:122.2,123.21 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:126.2,126.18 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:114.48,115.41 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:115.41,116.23 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:119.4,119.16 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:116.23,118.5 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:123.21,125.3 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:129.53,139.2 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:141.121,144.2 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:146.93,163.2 4 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:165.57,170.2 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:175.74,178.36 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:220.2,220.14 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:178.36,180.34 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:184.3,187.40 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:180.34,182.4 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:187.40,190.42 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:193.4,193.47 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:197.4,202.29 3 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:217.4,217.31 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:190.42,191.13 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:193.47,194.13 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:203.17,205.20 2 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:210.24,211.35 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:213.12,214.13 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:205.20,207.6 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:207.11,209.6 1 1 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:223.72,227.31 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:235.2,235.19 1 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:227.31,233.3 2 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:238.99,246.6 5 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:246.6,253.17 3 0 -github.com/ethereum/go-ethereum/internal/cli/server/service.go:253.17,255.4 1 0 -github.com/ethereum/go-ethereum/p2p/peer_error.go:39.73,41.9 2 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:44.2,45.18 2 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:48.2,48.12 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:41.9,42.30 1 0 -github.com/ethereum/go-ethereum/p2p/peer_error.go:45.18,47.3 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:51.37,53.2 1 0 -github.com/ethereum/go-ethereum/p2p/peer_error.go:91.37,92.39 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:95.2,95.30 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:92.39,94.3 1 0 -github.com/ethereum/go-ethereum/p2p/peer_error.go:98.36,100.2 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:102.47,103.40 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:106.2,106.32 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:109.2,110.8 2 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:118.2,118.29 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:103.40,105.3 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:106.32,108.3 1 1 -github.com/ethereum/go-ethereum/p2p/peer_error.go:110.8,111.25 1 0 -github.com/ethereum/go-ethereum/p2p/peer_error.go:112.41,113.28 1 0 -github.com/ethereum/go-ethereum/p2p/peer_error.go:114.11,115.31 1 0 -github.com/ethereum/go-ethereum/p2p/protocol.go:66.29,68.2 1 1 -github.com/ethereum/go-ethereum/p2p/protocol.go:76.32,78.2 1 0 -github.com/ethereum/go-ethereum/p2p/protocol.go:82.47,82.65 1 1 -github.com/ethereum/go-ethereum/p2p/protocol.go:83.47,83.78 1 1 -github.com/ethereum/go-ethereum/p2p/protocol.go:84.52,86.2 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:54.66,56.2 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:58.48,65.16 6 1 -github.com/ethereum/go-ethereum/p2p/transport.go:78.2,78.17 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:65.16,77.3 2 1 -github.com/ethereum/go-ethereum/p2p/transport.go:81.49,87.75 4 1 -github.com/ethereum/go-ethereum/p2p/transport.go:92.2,94.16 3 1 -github.com/ethereum/go-ethereum/p2p/transport.go:99.2,100.48 2 1 -github.com/ethereum/go-ethereum/p2p/transport.go:105.2,105.12 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:87.75,89.3 1 0 -github.com/ethereum/go-ethereum/p2p/transport.go:94.16,96.3 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:100.48,104.3 3 0 -github.com/ethereum/go-ethereum/p2p/transport.go:108.42,115.19 3 1 -github.com/ethereum/go-ethereum/p2p/transport.go:126.2,126.16 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:115.19,116.61 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:116.61,118.60 2 1 -github.com/ethereum/go-ethereum/p2p/transport.go:118.60,123.5 3 1 -github.com/ethereum/go-ethereum/p2p/transport.go:129.89,132.2 2 1 -github.com/ethereum/go-ethereum/p2p/transport.go:134.98,140.12 2 1 -github.com/ethereum/go-ethereum/p2p/transport.go:141.2,141.55 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:145.2,145.31 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:149.2,151.19 2 1 -github.com/ethereum/go-ethereum/p2p/transport.go:140.12,140.50 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:141.55,144.3 2 0 -github.com/ethereum/go-ethereum/p2p/transport.go:145.31,147.3 1 0 -github.com/ethereum/go-ethereum/p2p/transport.go:154.67,156.16 2 1 -github.com/ethereum/go-ethereum/p2p/transport.go:159.2,159.39 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:162.2,162.25 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:171.2,171.30 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:174.2,175.40 2 1 -github.com/ethereum/go-ethereum/p2p/transport.go:178.2,178.51 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:181.2,181.17 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:156.16,158.3 1 0 -github.com/ethereum/go-ethereum/p2p/transport.go:159.39,161.3 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:162.25,170.3 3 1 -github.com/ethereum/go-ethereum/p2p/transport.go:171.30,173.3 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:175.40,177.3 1 1 -github.com/ethereum/go-ethereum/p2p/transport.go:178.51,180.3 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:35.47,37.2 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:40.56,42.2 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:45.45,46.22 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:51.2,51.14 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:46.22,47.21 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:47.21,49.4 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:55.66,56.42 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:56.42,58.19 2 1 -github.com/ethereum/go-ethereum/p2p/util.go:58.19,60.4 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:65.39,65.56 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:66.39,66.69 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:67.39,67.66 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:68.39,68.71 1 1 -github.com/ethereum/go-ethereum/p2p/util.go:69.37,75.2 5 1 -github.com/ethereum/go-ethereum/p2p/dial.go:66.82,68.2 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:70.39,72.2 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:144.49,145.29 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:148.2,148.20 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:151.2,151.22 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:154.2,154.21 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:160.2,160.12 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:145.29,147.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:148.20,150.3 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:151.22,153.3 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:154.21,159.3 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:163.101,183.2 7 1 -github.com/ethereum/go-ethereum/p2p/dial.go:186.32,189.2 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:192.50,193.9 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:194.26,194.26 0 1 -github.com/ethereum/go-ethereum/p2p/dial.go:195.22,195.22 0 0 -github.com/ethereum/go-ethereum/p2p/dial.go:200.53,201.9 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:202.26,202.26 0 1 -github.com/ethereum/go-ethereum/p2p/dial.go:203.22,203.22 0 0 -github.com/ethereum/go-ethereum/p2p/dial.go:208.44,209.9 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:210.24,210.24 0 1 -github.com/ethereum/go-ethereum/p2p/dial.go:211.22,211.22 0 0 -github.com/ethereum/go-ethereum/p2p/dial.go:216.46,217.9 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:218.24,218.24 0 1 -github.com/ethereum/go-ethereum/p2p/dial.go:219.22,219.22 0 0 -github.com/ethereum/go-ethereum/p2p/dial.go:224.49,231.6 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:310.2,311.22 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:314.2,314.13 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:231.6,235.16 3 1 -github.com/ethereum/go-ethereum/p2p/dial.go:240.3,243.10 3 1 -github.com/ethereum/go-ethereum/p2p/dial.go:235.16,237.4 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:237.9,239.4 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:244.26,245.44 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:251.27,255.24 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:257.27,258.53 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:261.4,265.48 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:270.27,271.53 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:274.4,275.35 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:277.32,281.14 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:284.4,286.32 3 1 -github.com/ethereum/go-ethereum/p2p/dial.go:290.32,294.19 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:301.21,302.21 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:304.23,306.14 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:245.44,247.5 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:247.10,249.5 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:258.53,260.5 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:265.48,267.5 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:271.53,273.5 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:281.14,282.18 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:286.32,288.5 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:294.19,296.34 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:296.34,298.6 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:311.22,313.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:319.54,322.16 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:322.16,323.10 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:324.31,324.31 0 1 -github.com/ethereum/go-ethereum/p2p/dial.go:325.23,325.23 0 1 -github.com/ethereum/go-ethereum/p2p/dial.go:333.36,335.52 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:338.2,338.70 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:341.2,342.22 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:335.52,337.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:338.70,340.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:347.61,348.73 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:351.2,354.53 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:348.73,350.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:354.53,354.73 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:358.60,359.53 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:359.53,361.3 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:365.41,369.52 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:369.52,373.3 3 1 -github.com/ethereum/go-ethereum/p2p/dial.go:378.45,380.30 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:383.2,384.13 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:380.30,382.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:388.56,389.22 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:392.2,392.35 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:398.2,398.36 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:401.2,401.34 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:404.2,404.61 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:407.2,407.48 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:410.2,410.12 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:389.22,391.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:392.35,397.3 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:398.36,400.3 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:401.34,403.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:404.61,406.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:407.48,409.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:414.63,415.67 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:421.2,421.16 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:415.67,420.3 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:425.55,427.69 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:427.69,429.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:432.57,433.31 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:436.2,437.46 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:433.31,434.51 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:442.55,450.2 7 1 -github.com/ethereum/go-ethereum/p2p/dial.go:453.51,458.12 5 1 -github.com/ethereum/go-ethereum/p2p/dial.go:458.12,461.3 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:475.62,477.2 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:483.42,484.38 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:488.2,489.16 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:484.38,486.3 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:489.16,491.69 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:491.69,492.20 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:492.20,494.5 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:499.39,501.2 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:509.51,510.23 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:513.2,513.25 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:516.2,516.88 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:519.2,521.21 3 1 -github.com/ethereum/go-ethereum/p2p/dial.go:530.2,533.13 4 1 -github.com/ethereum/go-ethereum/p2p/dial.go:510.23,512.3 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:513.25,515.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:516.88,518.3 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:521.21,523.39 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:526.3,527.15 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:523.39,525.4 1 0 -github.com/ethereum/go-ethereum/p2p/dial.go:537.67,539.16 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:543.2,544.40 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:539.16,542.3 2 1 -github.com/ethereum/go-ethereum/p2p/dial.go:547.36,550.2 2 0 -github.com/ethereum/go-ethereum/p2p/dial.go:552.38,553.65 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:556.2,556.12 1 1 -github.com/ethereum/go-ethereum/p2p/dial.go:553.65,555.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:55.46,57.38 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:60.2,60.12 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:57.38,59.3 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:63.32,65.2 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:68.32,71.2 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:73.33,75.2 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:100.64,102.16 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:105.2,105.71 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:102.16,104.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:117.73,119.2 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:132.51,133.18 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:141.2,142.29 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:145.2,147.50 3 1 -github.com/ethereum/go-ethereum/p2p/message.go:151.2,151.15 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:133.18,134.19 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:138.3,138.19 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:134.19,137.4 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:142.29,144.3 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:147.50,150.3 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:157.41,166.2 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:182.45,183.37 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:199.2,199.22 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:183.37,186.10 3 1 -github.com/ethereum/go-ethereum/p2p/message.go:187.19,188.20 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:195.4,195.14 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:196.20,196.20 0 1 -github.com/ethereum/go-ethereum/p2p/message.go:188.20,190.12 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:191.21,191.21 0 1 -github.com/ethereum/go-ethereum/p2p/message.go:192.22,192.22 0 0 -github.com/ethereum/go-ethereum/p2p/message.go:203.44,204.37 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:211.2,211.29 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:204.37,205.10 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:206.21,207.19 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:208.20,208.20 0 1 -github.com/ethereum/go-ethereum/p2p/message.go:217.35,218.39 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:223.2,224.12 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:218.39,222.3 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:230.69,232.16 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:235.2,235.22 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:238.2,238.20 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:241.2,242.16 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:245.2,245.38 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:248.2,249.16 2 1 -github.com/ethereum/go-ethereum/p2p/message.go:252.2,252.45 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:255.2,255.12 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:232.16,234.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:235.22,237.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:238.20,240.3 1 1 -github.com/ethereum/go-ethereum/p2p/message.go:242.16,243.48 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:245.38,247.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:249.16,251.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:252.45,254.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:272.114,281.2 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:285.46,287.16 2 0 -github.com/ethereum/go-ethereum/p2p/message.go:290.2,299.17 2 0 -github.com/ethereum/go-ethereum/p2p/message.go:287.16,289.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:304.47,306.16 2 0 -github.com/ethereum/go-ethereum/p2p/message.go:309.2,318.12 2 0 -github.com/ethereum/go-ethereum/p2p/message.go:306.16,308.3 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:323.37,324.47 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:327.2,327.12 1 0 -github.com/ethereum/go-ethereum/p2p/message.go:324.47,326.3 1 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:55.78,57.22 1 1 -github.com/ethereum/go-ethereum/p2p/metrics.go:61.2,61.13 1 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:66.2,67.33 2 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:57.22,59.3 1 1 -github.com/ethereum/go-ethereum/p2p/metrics.go:61.13,63.3 1 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:63.8,65.3 1 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:72.57,76.2 3 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:80.58,84.2 3 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:88.37,90.16 2 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:93.2,93.12 1 0 -github.com/ethereum/go-ethereum/p2p/metrics.go:90.16,92.3 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:123.58,128.27 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:132.2,137.13 6 1 -github.com/ethereum/go-ethereum/p2p/peer.go:128.27,131.3 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:143.79,147.2 3 0 -github.com/ethereum/go-ethereum/p2p/peer.go:150.30,152.2 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:155.35,157.2 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:160.30,162.17 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:165.2,165.10 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:162.17,164.3 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:169.34,171.2 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:174.29,177.2 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:182.66,183.42 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:190.2,190.14 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:183.42,184.32 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:184.32,185.28 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:185.28,187.5 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:194.38,196.2 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:199.37,201.2 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:205.46,206.23 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:210.2,210.9 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:206.23,208.3 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:211.24,211.24 0 1 -github.com/ethereum/go-ethereum/p2p/peer.go:212.18,212.18 0 1 -github.com/ethereum/go-ethereum/p2p/peer.go:217.32,220.2 2 0 -github.com/ethereum/go-ethereum/p2p/peer.go:223.31,225.2 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:227.70,239.2 3 1 -github.com/ethereum/go-ethereum/p2p/peer.go:241.33,243.2 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:245.56,262.6 7 1 -github.com/ethereum/go-ethereum/p2p/peer.go:289.2,292.29 4 1 -github.com/ethereum/go-ethereum/p2p/peer.go:262.6,263.10 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:264.25,267.18 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:271.4,271.28 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:272.24,273.37 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:279.4,279.14 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:280.27,282.14 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:283.23,285.14 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:267.18,269.15 2 0 -github.com/ethereum/go-ethereum/p2p/peer.go:273.37,276.5 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:276.10,278.5 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:295.27,299.6 4 1 -github.com/ethereum/go-ethereum/p2p/peer.go:299.6,300.10 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:301.17,302.51 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:306.4,306.28 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:307.19,308.10 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:302.51,305.5 2 0 -github.com/ethereum/go-ethereum/p2p/peer.go:313.44,315.6 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:315.6,317.17 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:321.3,322.38 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:317.17,320.4 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:322.38,325.4 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:329.38,330.9 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:361.2,361.12 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:331.27,333.30 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:334.27,339.13 3 1 -github.com/ethereum/go-ethereum/p2p/peer.go:340.37,342.23 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:343.10,346.17 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:349.3,349.22 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:354.3,354.10 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:346.17,348.4 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:349.22,353.4 3 0 -github.com/ethereum/go-ethereum/p2p/peer.go:355.24,356.14 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:357.19,358.17 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:364.67,366.27 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:373.2,373.10 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:366.27,367.35 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:367.35,368.62 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:368.62,370.5 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:377.93,383.27 4 1 -github.com/ethereum/go-ethereum/p2p/peer.go:398.2,398.15 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:383.27,384.35 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:384.35,385.62 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:385.62,387.44 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:391.5,394.19 3 1 -github.com/ethereum/go-ethereum/p2p/peer.go:387.44,389.6 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:401.82,403.34 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:403.34,409.22 6 1 -github.com/ethereum/go-ethereum/p2p/peer.go:412.3,413.13 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:409.22,411.4 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:413.13,416.18 3 1 -github.com/ethereum/go-ethereum/p2p/peer.go:422.4,422.21 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:416.18,419.5 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:419.10,419.28 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:419.28,421.5 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:429.56,430.34 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:435.2,435.57 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:430.34,431.63 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:431.63,433.4 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:448.50,449.27 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:452.2,457.9 4 1 -github.com/ethereum/go-ethereum/p2p/peer.go:468.2,468.12 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:449.27,451.3 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:458.19,464.17 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:465.19,466.24 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:471.43,472.9 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:473.22,475.18 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:476.19,477.23 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:501.33,504.31 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:508.2,515.24 2 1 -github.com/ethereum/go-ethereum/p2p/peer.go:518.2,525.34 6 1 -github.com/ethereum/go-ethereum/p2p/peer.go:536.2,536.13 1 1 -github.com/ethereum/go-ethereum/p2p/peer.go:504.31,506.3 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:515.24,517.3 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:525.34,527.53 2 0 -github.com/ethereum/go-ethereum/p2p/peer.go:534.3,534.41 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:527.53,528.50 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:528.50,530.5 1 0 -github.com/ethereum/go-ethereum/p2p/peer.go:530.10,532.5 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:245.32,247.33 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:250.2,251.10 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:247.33,249.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:254.35,256.24 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:259.2,259.26 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:262.2,262.29 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:265.2,265.24 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:268.2,268.13 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:271.2,271.10 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:256.24,258.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:259.26,261.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:262.29,264.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:265.24,267.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:268.13,270.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:274.36,277.2 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:279.42,280.6 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:280.6,283.10 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:288.3,288.84 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:283.10,285.4 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:285.9,287.4 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:288.84,290.4 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:295.49,297.2 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:300.36,302.46 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:307.2,307.11 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:302.46,303.27 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:303.27,305.4 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:311.36,313.43 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:316.2,316.14 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:313.43,315.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:322.46,324.2 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:331.49,337.46 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:346.2,346.15 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:337.46,339.44 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:339.44,343.4 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:346.15,348.22 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:348.22,349.60 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:349.60,351.5 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:358.53,359.9 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:360.30,360.30 0 1 -github.com/ethereum/go-ethereum/p2p/server.go:361.18,361.18 0 0 -github.com/ethereum/go-ethereum/p2p/server.go:366.56,367.9 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:368.33,368.33 0 1 -github.com/ethereum/go-ethereum/p2p/server.go:369.18,369.18 0 0 -github.com/ethereum/go-ethereum/p2p/server.go:374.75,376.2 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:379.39,384.15 4 1 -github.com/ethereum/go-ethereum/p2p/server.go:387.2,387.18 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:384.15,386.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:392.27,394.18 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:398.2,399.25 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:403.2,405.19 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:394.18,397.3 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:399.25,402.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:416.85,418.9 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:421.2,422.16 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:425.2,426.28 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:418.9,420.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:422.16,424.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:430.39,432.2 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:436.40,439.17 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:442.2,444.20 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:447.2,447.22 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:450.2,450.40 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:455.2,455.27 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:458.2,458.29 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:461.2,461.27 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:464.2,473.45 9 1 -github.com/ethereum/go-ethereum/p2p/server.go:476.2,476.26 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:481.2,481.45 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:484.2,488.12 4 1 -github.com/ethereum/go-ethereum/p2p/server.go:439.17,441.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:444.20,446.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:447.22,449.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:450.40,452.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:455.27,457.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:458.29,460.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:461.27,463.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:473.45,475.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:476.26,477.46 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:477.46,479.4 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:481.45,483.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:491.43,495.34 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:498.2,502.16 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:505.2,509.34 4 1 -github.com/ethereum/go-ethereum/p2p/server.go:514.2,514.24 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:532.2,532.12 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:495.34,497.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:502.16,504.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:509.34,510.34 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:510.34,512.4 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:515.11,515.11 0 1 -github.com/ethereum/go-ethereum/p2p/server.go:517.17,520.32 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:521.10,525.13 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:525.13,527.51 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:527.51,529.5 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:535.43,540.38 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:548.2,548.41 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:552.2,553.16 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:556.2,557.16 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:560.2,562.20 3 0 -github.com/ethereum/go-ethereum/p2p/server.go:571.2,576.22 4 0 -github.com/ethereum/go-ethereum/p2p/server.go:597.2,597.21 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:614.2,614.12 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:540.38,541.56 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:541.56,544.4 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:548.41,550.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:553.16,555.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:557.16,559.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:562.20,563.32 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:563.32,565.14 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:565.14,568.5 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:576.22,577.22 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:581.3,589.17 3 0 -github.com/ethereum/go-ethereum/p2p/server.go:592.3,593.44 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:577.22,580.4 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:589.17,591.4 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:597.21,605.19 3 0 -github.com/ethereum/go-ethereum/p2p/server.go:610.3,610.17 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:605.19,607.4 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:607.9,609.4 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:610.17,612.4 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:617.41,627.21 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:630.2,630.26 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:633.2,634.36 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:627.21,629.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:630.26,632.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:634.36,636.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:639.42,641.2 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:643.49,644.37 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:647.2,647.24 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:652.2,652.16 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:655.2,655.14 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:644.37,646.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:647.24,649.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:649.8,651.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:652.16,654.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:658.43,661.16 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:664.2,668.51 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:679.2,681.12 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:661.16,663.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:668.51,670.45 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:670.45,672.14 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:672.14,675.5 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:685.44,686.9 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:687.24,688.19 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:689.18,689.18 0 0 -github.com/ethereum/go-ethereum/p2p/server.go:694.26,708.37 7 1 -github.com/ethereum/go-ethereum/p2p/server.go:712.1,713.6 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:780.2,783.21 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:786.2,786.23 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:790.2,790.26 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:796.2,796.21 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:708.37,710.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:713.6,714.10 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:715.19,717.17 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:719.30,724.34 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:728.33,733.34 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:737.27,740.32 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:742.43,745.28 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:750.4,750.61 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:752.37,756.18 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:766.4,766.17 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:768.28,774.20 5 1 -github.com/ethereum/go-ethereum/p2p/server.go:724.34,726.5 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:733.34,735.5 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:745.28,748.5 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:756.18,762.20 5 1 -github.com/ethereum/go-ethereum/p2p/server.go:762.20,764.6 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:774.20,776.5 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:783.21,785.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:786.23,788.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:790.26,792.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:796.21,800.3 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:803.99,804.9 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:805.56,806.26 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:807.88,808.26 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:809.33,810.30 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:811.41,812.18 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:813.10,814.13 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:818.93,820.82 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:825.2,825.56 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:820.82,822.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:830.33,835.29 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:838.2,839.30 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:845.2,846.15 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:852.2,852.6 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:835.29,837.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:839.30,841.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:846.15,847.35 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:847.35,849.4 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:852.6,861.7 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:878.3,879.56 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:885.3,885.22 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:893.3,893.13 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:861.7,863.37 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:875.4,875.9 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:863.37,864.44 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:868.5,869.13 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:864.44,867.6 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:870.10,870.25 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:870.25,874.5 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:879.56,883.12 4 1 -github.com/ethereum/go-ethereum/p2p/server.go:885.22,887.53 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:890.4,891.65 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:887.53,889.5 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:893.13,896.4 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:900.60,901.21 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:905.2,905.67 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:909.2,911.80 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:914.2,915.12 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:901.21,903.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:905.67,907.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:911.80,913.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:921.87,923.21 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:929.2,930.16 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:933.2,933.12 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:923.21,925.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:925.8,927.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:930.16,932.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:936.83,941.14 4 1 -github.com/ethereum/go-ethereum/p2p/server.go:946.2,946.21 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:956.2,957.16 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:961.2,961.21 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:966.2,968.16 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:974.2,975.16 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:979.2,979.70 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:983.2,985.16 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:990.2,990.12 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:941.14,943.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:946.21,948.71 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:948.71,952.4 3 0 -github.com/ethereum/go-ethereum/p2p/server.go:957.16,960.3 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:961.21,963.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:963.8,965.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:968.16,971.3 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:975.16,978.3 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:979.70,982.3 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:985.16,988.3 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:993.71,996.53 3 1 -github.com/ethereum/go-ethereum/p2p/server.go:1000.2,1000.44 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:996.53,999.3 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:1005.66,1006.9 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:1011.2,1011.17 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:1007.18,1007.18 0 1 -github.com/ethereum/go-ethereum/p2p/server.go:1008.18,1009.26 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1014.46,1016.25 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:1021.2,1022.10 2 1 -github.com/ethereum/go-ethereum/p2p/server.go:1016.25,1020.3 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1026.37,1027.28 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:1030.2,1055.4 4 1 -github.com/ethereum/go-ethereum/p2p/server.go:1027.28,1029.3 1 1 -github.com/ethereum/go-ethereum/p2p/server.go:1074.41,1090.38 6 0 -github.com/ethereum/go-ethereum/p2p/server.go:1099.2,1099.13 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1090.38,1091.47 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1091.47,1093.45 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:1096.4,1096.41 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1093.45,1095.5 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1103.44,1106.35 2 0 -github.com/ethereum/go-ethereum/p2p/server.go:1112.2,1112.34 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1119.2,1119.14 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1106.35,1107.18 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1107.18,1109.4 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1112.34,1113.39 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1113.39,1114.33 1 0 -github.com/ethereum/go-ethereum/p2p/server.go:1114.33,1116.5 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:148.86,156.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:161.110,169.9 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:185.2,185.16 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:190.2,190.54 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:195.2,198.46 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:209.2,210.29 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:170.40,171.57 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:172.24,174.68 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:175.10,177.21 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:177.21,180.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:180.9,183.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:185.16,187.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:190.54,192.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:198.46,201.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:201.8,201.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:201.27,204.17 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:204.17,206.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:214.85,225.2 6 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:227.44,232.2 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:235.80,237.14 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:247.2,248.32 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:251.2,258.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:238.19,239.35 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:240.21,241.37 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:242.21,243.37 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:244.10,245.64 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:248.32,249.68 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:262.69,267.53 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:270.2,277.30 6 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:267.53,269.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:281.83,283.48 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:288.2,300.18 8 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:283.48,284.60 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:304.115,306.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:311.2,312.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:317.2,318.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:323.2,337.27 10 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:306.27,307.49 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:312.16,314.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:318.16,320.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:341.123,348.78 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:351.2,352.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:355.2,362.16 6 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:365.2,370.36 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:375.2,376.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:379.2,379.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:348.78,350.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:352.16,354.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:362.16,364.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:370.36,372.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:376.16,378.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:383.80,388.16 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:391.2,396.18 6 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:388.16,390.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:399.103,403.49 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:406.2,410.16 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:413.2,413.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:403.49,405.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:410.16,412.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:417.102,419.41 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:422.2,432.56 9 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:437.2,449.19 8 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:459.2,459.28 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:419.41,421.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:432.56,434.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:450.21,451.48 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:452.21,453.73 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:454.19,455.61 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:456.10,457.23 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:463.82,464.51 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:467.2,477.15 6 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:464.51,466.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:480.136,482.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:488.2,489.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:495.2,497.23 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:482.16,485.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:489.16,492.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:500.127,501.61 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:506.2,507.22 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:511.2,512.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:516.2,519.16 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:523.2,524.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:528.2,530.30 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:501.61,503.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:507.22,509.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:512.16,514.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:519.16,521.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:524.16,526.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:534.91,536.50 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:539.2,550.34 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:553.2,556.18 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:536.50,538.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:550.34,552.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:562.111,564.21 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:580.2,580.17 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:583.2,583.18 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:564.21,566.58 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:569.3,569.49 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:566.58,568.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:569.49,571.18 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:574.4,574.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:577.4,577.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:571.18,573.5 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:574.24,576.5 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:580.17,582.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:587.106,588.49 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:591.2,599.30 7 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:603.2,603.17 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:588.49,590.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:599.30,602.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:606.90,608.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:611.2,611.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:614.2,614.47 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:608.16,610.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:611.23,613.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:619.56,620.32 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:623.2,623.28 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:626.2,626.59 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:629.2,629.33 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:632.2,632.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:620.32,622.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:623.28,625.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:626.59,628.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:629.33,631.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:636.54,638.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:641.2,641.38 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:638.16,639.31 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/encoding.go:644.40,648.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:149.61,151.15 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:177.2,177.51 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:180.2,180.56 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:183.2,183.17 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:152.15,153.18 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:154.15,155.18 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:156.19,157.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:158.16,159.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:160.22,161.25 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:162.23,163.26 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:164.24,165.27 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:166.17,167.20 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:168.19,169.22 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:170.26,171.29 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:172.21,173.24 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:174.10,175.58 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:177.51,179.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:180.56,182.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:186.40,186.65 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:187.40,187.66 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:188.40,188.54 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:189.41,189.42 0 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:191.38,191.61 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:192.38,192.62 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:193.38,193.52 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:194.39,194.40 0 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:196.40,196.60 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:197.40,197.58 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:198.40,198.58 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:199.40,199.56 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:201.40,201.60 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:202.40,202.58 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:203.40,203.58 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:204.40,204.56 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:206.44,206.68 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:207.44,207.66 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:208.44,208.62 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:209.44,209.60 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:211.41,211.62 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:212.41,212.60 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:213.41,213.59 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:214.41,214.57 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:216.47,216.70 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:217.47,217.72 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:218.47,218.65 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:219.47,219.63 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:221.48,221.72 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:222.48,222.74 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:223.48,223.66 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:224.48,224.64 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:226.49,226.74 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:227.49,227.76 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:228.49,228.67 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:229.49,229.65 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:231.44,231.68 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:232.44,232.66 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:233.44,233.62 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:234.44,234.60 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:236.42,236.64 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:237.42,237.62 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:238.42,238.60 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:239.42,239.58 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:241.51,241.82 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:242.51,242.80 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:243.51,243.69 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:244.51,244.67 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:246.46,246.72 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:247.46,247.70 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:248.46,248.64 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/msg.go:249.46,249.62 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:60.42,62.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:64.70,66.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:69.2,76.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:66.16,67.38 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:79.57,83.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:85.42,88.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:91.62,94.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:97.68,99.9 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:102.2,102.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:99.9,101.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:106.66,107.41 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:110.2,110.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:107.41,109.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:114.79,116.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:119.75,121.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:124.92,127.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:130.67,132.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:135.39,137.44 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:137.44,138.32 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/session.go:138.32,140.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:44.48,45.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:46.21,47.36 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:48.10,49.77 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:54.77,55.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:56.21,57.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:60.3,60.36 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:61.10,62.86 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:57.19,59.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:67.81,74.2 6 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:77.120,79.19 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:80.21,82.17 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:85.3,85.35 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:86.10,87.74 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:82.17,84.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:94.32,94.54 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:97.116,98.59 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:99.12,101.29 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:104.3,105.50 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:108.3,108.13 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:109.10,110.83 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:101.29,103.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:105.50,107.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:117.120,125.16 7 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:128.2,132.21 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:135.2,135.13 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:125.16,127.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:132.21,134.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:139.70,141.17 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:144.2,147.12 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:141.17,143.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:153.79,155.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:158.2,159.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:162.2,162.59 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:155.16,156.58 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:159.16,160.49 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:166.66,168.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:171.2,171.32 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:174.2,175.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:178.2,179.45 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:168.16,170.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:171.32,173.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5wire/crypto.go:175.16,177.3 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:73.170,86.2 4 1 -github.com/ethereum/go-ethereum/miner/miner.go:92.30,96.15 3 1 -github.com/ethereum/go-ethereum/miner/miner.go:102.2,105.6 4 1 -github.com/ethereum/go-ethereum/miner/miner.go:96.15,97.23 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:97.23,99.4 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:105.6,106.10 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:107.26,108.17 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:113.4,113.26 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:138.32,140.16 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:143.4,143.22 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:144.23,146.23 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:147.23,149.10 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:108.17,111.13 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:114.31,118.18 4 1 -github.com/ethereum/go-ethereum/miner/miner.go:123.32,125.20 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:129.30,131.20 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:136.5,136.25 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:118.18,122.6 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:125.20,128.6 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:131.20,134.6 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:140.16,142.5 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:154.52,156.2 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:158.28,160.2 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:162.29,165.2 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:167.35,169.2 1 1 -github.com/ethereum/go-ethereum/miner/miner.go:171.39,172.49 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:175.2,175.10 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:172.49,174.3 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:178.50,179.54 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:182.2,183.12 2 0 -github.com/ethereum/go-ethereum/miner/miner.go:179.54,181.3 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:187.65,189.2 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:192.62,194.2 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:201.49,203.2 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:206.78,208.2 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:210.55,213.2 2 1 -github.com/ethereum/go-ethereum/miner/miner.go:217.45,219.2 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:225.37,227.2 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:234.38,236.2 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:240.142,242.2 1 0 -github.com/ethereum/go-ethereum/miner/miner.go:246.85,248.2 1 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:57.80,62.2 1 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:65.70,79.23 6 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:85.2,85.71 1 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:79.23,81.3 1 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:81.8,83.3 1 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:91.52,95.24 3 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:95.24,98.44 2 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:102.3,103.10 2 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:128.3,128.50 1 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:98.44,99.9 1 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:104.22,105.97 1 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:106.35,107.91 1 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:108.11,111.111 2 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:121.4,121.16 1 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:111.111,112.66 1 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:112.66,113.43 1 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:113.43,114.36 1 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:114.36,116.13 2 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:121.16,123.5 1 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:123.10,125.5 1 0 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:128.50,130.4 1 1 -github.com/ethereum/go-ethereum/miner/unconfirmed.go:130.9,134.4 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:99.45,110.24 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:116.2,119.38 4 1 -github.com/ethereum/go-ethereum/miner/worker.go:122.2,122.12 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:110.24,113.3 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:119.38,121.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:126.53,128.35 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:131.2,131.15 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:128.35,130.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:137.35,138.22 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:141.2,141.28 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:138.22,140.3 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:250.188,283.36 6 1 -github.com/ethereum/go-ethereum/miner/worker.go:288.2,295.10 6 1 -github.com/ethereum/go-ethereum/miner/worker.go:298.2,298.15 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:283.36,286.3 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:295.10,297.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:302.52,306.2 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:308.42,312.2 3 0 -github.com/ethereum/go-ethereum/miner/worker.go:315.41,319.2 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:322.62,323.9 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:324.40,324.40 0 0 -github.com/ethereum/go-ethereum/miner/worker.go:325.18,325.18 0 0 -github.com/ethereum/go-ethereum/miner/worker.go:330.35,332.2 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:335.34,337.2 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:340.59,344.28 3 0 -github.com/ethereum/go-ethereum/miner/worker.go:347.2,347.48 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:344.28,346.3 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:351.46,356.2 3 0 -github.com/ethereum/go-ethereum/miner/worker.go:359.75,364.2 3 0 -github.com/ethereum/go-ethereum/miner/worker.go:367.26,370.2 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:373.25,375.2 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:378.35,380.2 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:384.26,388.2 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:391.94,413.2 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:416.54,429.40 6 1 -github.com/ethereum/go-ethereum/miner/worker.go:443.2,443.38 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:453.2,453.6 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:429.40,430.23 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:433.3,434.10 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:439.3,440.34 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:430.23,432.4 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:435.97,435.97 0 1 -github.com/ethereum/go-ethereum/miner/worker.go:436.19,437.10 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:443.38,445.36 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:450.3,450.23 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:445.36,446.52 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:446.52,448.5 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:453.6,454.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:455.20,458.41 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:460.32,463.41 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:465.18,468.89 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:477.43,479.38 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:483.4,486.29 3 0 -github.com/ethereum/go-ethereum/miner/worker.go:490.39,492.18 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:503.4,503.29 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:507.19,508.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:468.89,470.41 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:474.5,474.42 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:470.41,472.14 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:479.38,482.5 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:486.29,488.5 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:492.18,497.5 4 0 -github.com/ethereum/go-ethereum/miner/worker.go:497.10,501.5 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:503.29,505.5 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:516.29,521.15 5 1 -github.com/ethereum/go-ethereum/miner/worker.go:527.2,530.6 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:521.15,522.23 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:522.23,524.4 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:530.6,531.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:532.29,533.59 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:535.29,537.18 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:544.30,546.57 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:549.4,549.58 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:553.4,553.66 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:561.4,561.70 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:568.24,570.43 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:575.4,575.44 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:581.24,587.42 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:614.4,614.50 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:617.19,618.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:619.25,620.10 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:621.31,622.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:623.31,624.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:537.18,540.5 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:540.10,542.5 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:546.57,547.13 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:549.58,550.13 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:553.66,555.5 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:555.10,557.5 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:561.70,563.71 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:563.71,565.6 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:570.43,571.66 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:571.66,573.6 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:575.44,576.66 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:576.66,578.6 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:587.42,589.70 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:592.5,593.31 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:597.5,603.35 4 0 -github.com/ethereum/go-ethereum/miner/worker.go:589.70,590.14 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:593.31,596.6 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:603.35,605.6 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:606.10,610.72 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:610.72,612.6 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:631.29,639.22 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:645.2,645.6 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:639.22,640.20 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:640.20,643.4 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:645.6,646.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:647.27,648.28 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:652.4,653.24 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:657.4,660.53 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:663.4,667.81 4 1 -github.com/ethereum/go-ethereum/miner/worker.go:673.19,675.10 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:648.28,650.5 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:653.24,654.13 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:660.53,661.13 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:667.81,672.5 4 1 -github.com/ethereum/go-ethereum/miner/worker.go:682.31,684.6 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:684.6,685.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:686.30,688.20 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:692.4,692.57 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:695.4,696.23 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:704.4,711.14 5 1 -github.com/ethereum/go-ethereum/miner/worker.go:716.4,720.46 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:742.4,743.18 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:747.4,754.57 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:756.19,757.10 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:688.20,689.13 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:692.57,693.13 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:696.23,699.41 3 0 -github.com/ethereum/go-ethereum/miner/worker.go:699.41,701.14 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:711.14,713.13 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:720.46,733.46 8 1 -github.com/ethereum/go-ethereum/miner/worker.go:739.5,739.41 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:733.46,738.6 4 1 -github.com/ethereum/go-ethereum/miner/worker.go:743.18,745.13 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:763.116,767.16 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:777.2,777.16 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:780.2,793.71 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:801.2,802.17 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:767.16,776.3 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:777.16,779.3 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:793.71,794.43 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:797.3,798.37 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:794.43,796.4 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:806.75,807.32 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:810.2,811.41 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:814.2,814.47 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:817.2,817.47 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:820.2,820.31 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:823.2,824.12 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:807.32,809.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:811.41,813.3 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:814.47,816.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:817.47,819.3 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:820.31,822.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:828.51,841.2 5 1 -github.com/ethereum/go-ethereum/miner/worker.go:843.99,847.16 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:851.2,854.26 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:847.16,850.3 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:857.118,859.24 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:862.2,864.6 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:947.2,947.46 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:964.2,964.22 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:967.2,967.14 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:859.24,861.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:864.6,871.77 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:886.3,886.39 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:891.3,892.16 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:899.3,902.67 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:909.3,912.10 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:871.77,873.62 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:883.4,883.64 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:873.62,875.20 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:878.5,881.6 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:875.20,877.6 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:886.39,888.9 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:892.16,893.9 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:902.67,906.12 3 0 -github.com/ethereum/go-ethereum/miner/worker.go:913.48,916.13 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:918.44,921.15 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:923.45,926.13 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:928.28,932.15 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:934.51,937.13 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:939.11,943.15 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:947.46,956.35 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:960.3,960.30 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:956.35,959.4 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:964.22,966.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:984.79,990.45 4 1 -github.com/ethereum/go-ethereum/miner/worker.go:993.2,993.19 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:998.2,999.32 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1006.2,1014.45 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:1018.2,1018.41 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1022.2,1022.43 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1030.2,1030.58 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1037.2,1038.16 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1043.2,1043.24 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1060.2,1060.17 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:990.45,992.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:993.19,995.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:999.32,1000.26 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1003.3,1003.32 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1000.26,1002.4 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:1014.45,1016.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1018.41,1020.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1022.43,1024.47 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1024.47,1027.4 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:1030.58,1033.3 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:1038.16,1041.3 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:1043.24,1044.61 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1057.3,1058.31 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1044.61,1045.36 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1045.36,1046.29 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1049.5,1049.62 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1046.29,1047.11 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1049.62,1051.6 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1051.11,1053.6 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1066.71,1071.50 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:1077.2,1077.23 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1083.2,1083.24 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1071.50,1072.46 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1072.46,1075.4 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1077.23,1079.48 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1079.48,1081.4 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:1083.24,1085.48 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:1085.48,1087.4 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:1092.77,1094.16 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1097.2,1100.114 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:1094.16,1096.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1105.78,1110.19 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:1117.2,1121.16 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1126.2,1126.52 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1130.2,1135.22 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:1138.2,1138.18 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1110.19,1111.39 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1115.3,1115.24 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1111.39,1114.4 2 0 -github.com/ethereum/go-ethereum/miner/worker.go:1121.16,1123.3 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:1126.52,1128.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1135.22,1137.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1145.96,1146.19 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1172.2,1172.12 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1175.2,1175.12 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1146.19,1147.22 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1152.3,1154.17 3 1 -github.com/ethereum/go-ethereum/miner/worker.go:1158.3,1158.38 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1147.22,1149.4 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1154.17,1156.4 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:1158.38,1159.11 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1160.106,1165.58 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1167.20,1168.34 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:1172.12,1174.3 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1179.139,1192.9 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1193.26,1195.19 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1198.3,1198.20 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1199.18,1200.41 1 0 -github.com/ethereum/go-ethereum/miner/worker.go:1195.19,1197.4 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1206.58,1209.2 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1212.63,1214.29 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1218.2,1218.15 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1214.29,1217.3 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1222.59,1223.9 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1224.30,1224.30 0 1 -github.com/ethereum/go-ethereum/miner/worker.go:1225.18,1225.18 0 0 -github.com/ethereum/go-ethereum/miner/worker.go:1230.74,1232.42 2 1 -github.com/ethereum/go-ethereum/miner/worker.go:1236.2,1236.108 1 1 -github.com/ethereum/go-ethereum/miner/worker.go:1232.42,1235.3 2 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:41.34,41.50 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:43.47,45.2 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:47.50,49.2 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:54.47,56.2 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:61.30,61.46 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:66.31,66.48 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:71.30,71.46 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:76.31,76.48 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:83.29,83.44 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:90.29,91.28 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:94.2,94.13 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:91.28,93.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:98.42,99.40 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:102.2,102.41 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:105.2,105.56 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:99.40,101.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:102.41,104.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:109.45,110.47 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:113.2,113.35 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:116.2,116.12 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:110.47,112.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:113.35,115.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:122.31,122.46 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:125.44,127.16 2 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:130.2,130.27 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:127.16,129.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:134.47,135.47 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:138.2,138.18 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:141.2,141.12 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:135.47,137.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:138.18,140.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:147.31,147.47 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:150.44,152.16 2 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:155.2,155.27 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:152.16,154.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:159.47,160.47 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:163.2,163.19 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:166.2,166.12 1 1 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:160.47,162.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:163.19,165.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:176.37,177.28 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:180.2,180.56 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:177.28,179.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/entries.go:185.33,188.2 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:69.56,71.14 2 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:74.2,74.25 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:71.14,73.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:77.47,79.14 2 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:82.2,82.22 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:79.14,81.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:100.31,102.2 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:107.35,111.2 3 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:118.38,119.50 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:120.2,120.52 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:126.2,126.53 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:119.50,119.87 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:120.52,121.58 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:124.3,124.13 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:121.58,123.4 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:132.31,134.16 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:137.2,141.48 4 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:142.2,142.9 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:156.2,156.17 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:134.16,135.65 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:141.48,141.83 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:143.50,145.20 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:146.24,151.16 4 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:152.10,154.48 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:159.31,160.24 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:163.2,164.13 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:160.24,162.3 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:168.37,169.24 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:172.2,174.12 3 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:169.24,171.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:179.46,180.24 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:183.2,184.12 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:180.24,182.3 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:188.49,190.16 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:193.2,195.12 3 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:190.16,192.3 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:198.70,200.16 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:203.2,203.26 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:208.2,209.36 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:212.2,212.48 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:218.2,218.42 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:225.2,226.20 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:251.2,251.30 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:200.16,202.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:203.26,205.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:209.36,211.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:212.48,213.21 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:216.3,216.23 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:213.21,215.4 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:218.42,219.21 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:222.3,222.23 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:219.21,221.4 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:226.20,228.41 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:234.3,234.41 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:240.3,240.12 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:248.3,249.17 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:228.41,229.22 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:232.4,232.24 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:229.22,230.10 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:234.41,235.22 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:238.4,238.24 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:235.22,237.5 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:240.12,241.23 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:244.4,244.22 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:241.23,243.5 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:244.22,246.5 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:255.42,259.2 3 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:262.58,264.2 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:273.61,274.9 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:294.2,294.12 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:276.30,277.77 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:278.30,279.77 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:281.16,282.42 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:285.3,286.17 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:289.3,289.32 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:291.10,292.32 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:282.42,284.4 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:286.17,288.4 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:298.67,300.28 2 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:303.2,303.13 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:300.28,302.3 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:306.61,310.52 4 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:313.2,313.26 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:316.2,316.17 1 1 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:310.52,312.3 1 0 -github.com/ethereum/go-ethereum/p2p/enr/enr.go:313.26,315.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:64.41,71.22 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:74.2,74.30 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:77.2,77.25 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:80.2,80.24 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:83.2,83.29 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:86.2,86.25 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:89.2,89.23 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:92.2,92.12 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:71.22,73.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:74.30,76.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:77.25,79.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:80.24,82.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:83.29,85.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:86.25,88.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:89.23,91.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:96.36,99.16 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:102.2,108.3 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:99.16,100.13 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:112.54,114.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:117.2,119.46 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:122.2,123.15 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:114.16,116.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:119.46,121.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:128.70,130.27 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:135.2,135.16 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:130.27,131.41 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:131.41,133.4 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:139.86,140.70 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:153.2,153.27 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:140.70,143.17 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:146.3,146.28 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:151.3,151.55 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:143.17,145.4 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:146.28,147.42 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:147.42,149.5 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:156.72,158.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:161.2,161.36 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:164.2,164.15 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:158.16,160.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:161.36,163.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:169.88,173.46 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:176.2,177.42 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:181.2,181.72 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:189.2,190.15 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:173.46,175.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:177.42,179.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:181.72,183.17 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:186.3,187.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:183.17,185.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:194.90,196.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:199.2,202.16 4 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:205.2,205.27 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:217.2,217.41 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:196.16,198.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:202.16,204.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:205.27,207.29 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:210.3,210.64 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:215.3,215.16 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:207.29,208.12 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:210.64,212.4 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:212.9,212.24 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:212.24,214.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:235.54,243.2 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:246.46,248.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:251.35,257.2 4 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:260.39,263.2 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:266.53,268.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:271.2,272.12 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:268.16,270.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:276.50,277.6 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:277.6,279.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:282.3,283.17 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:290.3,290.15 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:279.16,281.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:283.17,284.27 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:287.4,288.12 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:284.27,286.5 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:290.15,292.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:297.50,303.21 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:308.2,308.19 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:313.2,313.6 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:303.21,305.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:308.19,311.3 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:313.6,315.10 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:316.16,318.39 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:319.23,322.37 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:326.11,328.14 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:322.37,325.5 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:334.79,340.30 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:347.2,347.30 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:350.2,350.31 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:340.30,341.25 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:341.25,343.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:343.9,345.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:347.30,349.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:354.72,357.27 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:365.2,369.9 5 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:357.27,359.42 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:359.42,362.4 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:370.21,371.14 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:372.23,373.15 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:378.42,380.28 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:386.2,386.34 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:380.28,381.31 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:381.31,383.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:386.34,387.27 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/client.go:387.27,390.4 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/error.go:49.37,50.40 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/error.go:53.2,53.42 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/error.go:50.40,52.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/error.go:61.38,63.2 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:50.74,52.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:55.60,56.60 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:59.2,59.50 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:62.2,62.49 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:65.2,65.12 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:56.60,58.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:59.50,61.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:62.49,64.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:70.82,71.24 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:78.2,78.15 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:85.2,85.22 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:89.2,94.20 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:97.2,97.34 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:71.24,72.44 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:72.44,74.4 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:78.15,79.17 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:79.17,81.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:85.22,88.3 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:94.20,96.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:101.44,106.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:110.33,111.56 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:114.2,115.31 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:111.56,113.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:118.63,121.16 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:124.2,126.36 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:130.2,130.12 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:121.16,123.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:126.36,129.3 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:133.83,137.16 4 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:140.2,141.33 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:144.2,144.17 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:137.16,139.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:141.33,143.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:147.39,149.2 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:152.49,153.17 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:156.2,157.18 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:161.2,161.17 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:153.17,155.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:157.18,160.3 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:165.61,166.33 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:170.2,174.16 5 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:178.2,183.52 4 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:187.2,187.50 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:190.2,190.12 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:166.33,168.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:174.16,177.3 2 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:183.52,186.3 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:187.50,189.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:194.44,198.2 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:200.63,202.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:207.68,209.9 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:217.2,219.9 3 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:210.29,211.27 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:212.28,213.26 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:214.10,215.14 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:220.21,221.14 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:222.20,223.15 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:237.85,239.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:241.36,243.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:245.64,246.17 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:257.2,257.12 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:246.17,251.17 5 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:254.3,255.30 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:251.17,253.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:260.85,262.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:265.2,265.23 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:279.2,279.15 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:262.16,264.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:266.17,267.14 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:270.3,270.14 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:271.18,272.15 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:275.3,275.14 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:276.20,277.49 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:267.14,269.4 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:272.15,274.4 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:288.50,290.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:292.47,293.40 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:297.2,297.24 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:300.2,300.35 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:303.2,304.19 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:293.40,295.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:297.24,299.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:300.35,302.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:308.72,310.19 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:310.19,314.36 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:314.36,315.28 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:318.4,318.32 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:321.4,323.22 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:315.28,316.13 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:318.32,319.13 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/sync.go:323.22,326.5 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:43.83,46.16 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:49.2,52.27 4 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:46.16,48.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:57.78,59.54 2 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:62.2,64.35 3 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:67.2,68.12 2 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:59.54,61.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:64.35,66.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:72.27,74.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:77.35,79.2 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:82.55,84.30 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:91.2,91.16 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:84.30,86.19 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:89.3,89.27 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:86.19,88.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:95.33,97.30 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:102.2,102.14 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:97.30,98.35 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:98.35,100.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:106.38,108.30 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:113.2,113.14 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:108.30,109.34 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:109.34,111.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:154.77,160.28 4 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:167.2,168.28 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:171.2,172.26 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:181.2,187.15 7 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:160.28,161.39 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:161.39,163.4 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:168.28,170.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:172.26,174.17 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:177.3,177.22 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:174.17,176.4 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:190.45,191.23 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:194.2,194.33 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:202.2,203.23 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:213.2,213.26 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:191.23,193.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:194.33,196.29 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:200.3,200.30 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:196.29,199.4 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:203.23,205.23 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:208.3,211.34 4 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:205.23,207.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:216.50,217.40 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:220.2,220.14 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:217.40,219.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:263.32,267.2 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:269.37,271.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:273.38,277.2 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:279.67,283.2 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:285.39,287.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:289.36,291.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:293.37,295.2 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:297.70,301.2 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:305.75,306.9 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:307.40,308.27 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:309.42,310.24 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:311.39,312.35 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:313.10,314.30 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:318.45,321.108 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:324.2,324.48 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:327.2,328.55 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:331.2,331.48 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:321.108,323.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:324.48,326.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:328.55,330.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:334.46,336.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:339.2,339.16 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:336.16,338.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:342.46,343.39 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:346.2,348.15 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:351.2,353.16 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:356.2,357.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:360.2,360.40 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:343.39,345.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:348.15,350.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:353.16,355.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:357.16,359.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:363.43,365.13 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:368.2,369.42 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:375.2,375.34 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:365.13,367.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:369.42,370.22 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:373.3,373.29 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:370.22,372.4 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:378.73,381.16 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:384.2,385.51 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:388.2,389.16 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:392.2,392.26 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:381.16,383.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:385.51,387.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:389.16,391.3 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:395.33,397.73 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:400.2,402.19 3 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:397.73,399.3 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:406.39,408.24 2 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:411.2,411.22 1 1 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:408.24,409.59 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:417.79,419.16 2 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:422.2,422.34 1 0 -github.com/ethereum/go-ethereum/p2p/dnsdisc/tree.go:419.16,421.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:149.70,150.17 1 1 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:153.2,156.3 1 1 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:150.17,152.3 1 1 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:166.70,176.2 4 1 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:180.37,183.2 2 1 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:189.73,195.16 3 1 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:200.2,200.18 1 1 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:203.2,206.110 3 1 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:195.16,198.3 2 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:200.18,202.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:246.44,255.2 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:258.61,262.33 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:265.2,268.12 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:262.33,264.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:272.45,276.34 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:279.2,280.12 2 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:276.34,278.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:287.52,292.2 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:296.52,299.32 2 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:304.2,307.33 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:313.2,313.29 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:316.2,316.29 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:319.2,319.15 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:299.32,303.3 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:307.33,309.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:309.8,309.26 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:309.26,311.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:313.29,315.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:316.29,318.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:326.56,331.2 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:335.56,337.32 2 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:344.2,344.35 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:347.2,347.19 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:337.32,339.37 2 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:342.3,342.20 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:339.37,341.4 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:344.35,346.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:355.52,364.2 4 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:370.50,379.2 4 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:383.50,385.34 2 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:388.2,388.16 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:385.34,387.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:393.27,400.12 4 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:405.2,408.56 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:412.2,417.86 5 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:400.12,402.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:408.56,410.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:423.29,425.26 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:431.2,431.44 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:435.2,438.37 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:441.2,441.117 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:425.26,428.3 2 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:431.44,433.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:438.37,440.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:446.82,451.20 4 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:454.2,454.42 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:451.20,453.3 1 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:459.85,463.47 3 0 -github.com/ethereum/go-ethereum/p2p/msgrate/msgrate.go:463.47,465.3 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/toobig_notwindows.go:25.37,27.2 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:22.35,23.26 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:24.19,25.14 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:26.20,27.14 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:28.20,29.14 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/addrutil.go:30.10,31.13 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/error.go:20.39,25.2 2 0 -github.com/ethereum/go-ethereum/p2p/netutil/error.go:28.32,33.2 2 0 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:50.86,59.2 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:64.48,68.38 4 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:73.2,73.14 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:68.38,69.52 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:69.52,71.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:77.47,83.34 4 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:90.2,90.12 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:83.34,86.44 3 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:86.44,88.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:94.58,97.56 3 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:97.56,99.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:104.46,107.61 3 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:107.61,109.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:112.55,115.37 3 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:115.37,116.22 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:116.22,118.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:122.52,125.35 3 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:125.35,126.18 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/iptrack.go:126.18,128.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:31.13,66.2 30 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:73.47,77.29 4 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:87.2,87.16 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:77.29,78.17 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:81.3,82.17 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:85.3,85.20 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:78.17,79.12 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:82.17,84.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:91.44,93.24 2 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:96.2,96.13 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:93.24,95.3 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:100.67,102.35 2 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:105.2,105.29 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:112.2,112.12 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:102.35,104.3 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:105.29,107.17 2 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:110.3,110.22 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:107.17,109.4 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:117.36,119.16 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:122.2,122.21 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:119.16,120.13 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:126.44,127.14 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:130.2,130.25 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:135.2,135.14 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:127.14,129.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:130.25,131.23 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:131.23,133.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:139.28,140.21 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:143.2,143.31 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:146.2,146.26 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:140.21,142.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:143.31,145.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:151.39,152.22 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:155.2,155.31 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:158.2,158.30 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:152.22,154.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:155.31,157.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:177.46,178.58 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:181.2,181.26 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:184.2,184.28 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:187.2,187.47 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:190.2,190.35 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:193.2,193.12 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:178.58,180.3 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:181.26,183.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:184.28,186.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:187.47,189.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:190.35,192.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:197.48,199.9 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:200.39,201.15 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:202.18,203.36 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:204.10,205.48 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:209.48,212.64 3 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:215.2,215.51 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:212.64,214.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:230.46,233.17 3 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:237.2,237.14 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:233.17,236.3 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:241.44,243.41 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:243.41,244.13 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:244.13,246.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:246.9,248.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:253.50,257.2 3 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:260.35,262.30 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:265.2,265.15 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:262.30,264.3 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:272.48,274.22 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:279.2,280.33 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:283.2,284.28 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:288.2,292.31 5 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:295.2,295.12 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:274.22,277.3 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:280.33,282.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:284.28,286.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:292.31,294.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:299.41,303.27 4 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:306.2,307.25 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:320.2,321.21 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:303.27,305.3 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:307.25,309.18 2 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:314.3,316.23 3 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:309.18,311.4 1 1 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:311.9,313.4 1 0 -github.com/ethereum/go-ethereum/p2p/netutil/net.go:316.23,318.4 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:40.30,45.2 4 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:49.63,54.15 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:60.2,65.16 4 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:68.2,70.39 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:54.15,57.3 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:65.16,67.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:74.34,75.28 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:78.2,81.26 4 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:75.28,77.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:90.31,92.2 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:94.48,98.2 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:100.55,103.2 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:107.34,109.2 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:111.36,115.2 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:119.49,120.26 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:123.2,123.26 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:126.2,126.33 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:120.26,122.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/buffer.go:123.26,125.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:81.59,83.44 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:86.2,86.35 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:89.2,89.10 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:83.44,84.76 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:86.35,87.60 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:94.62,99.2 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:104.39,105.12 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:105.12,108.3 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:108.8,111.3 2 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:115.54,117.2 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:120.55,122.2 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:125.50,127.2 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:131.75,132.22 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:136.2,137.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:140.2,141.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:144.2,147.31 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:159.2,159.34 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:132.22,133.42 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:137.16,139.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:141.16,143.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:147.31,150.17 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:153.3,153.29 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:156.3,157.54 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:150.17,152.4 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:153.29,155.4 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:162.66,167.16 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:172.2,173.45 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:178.2,182.40 4 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:187.2,188.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:193.2,194.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:197.2,198.41 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:203.2,204.27 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:167.16,169.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:173.45,175.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:182.40,184.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:188.16,190.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:194.16,196.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:198.41,200.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:211.64,212.22 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:215.2,215.27 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:218.2,218.32 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:226.2,228.22 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:212.22,213.43 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:215.27,217.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:218.32,224.3 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:231.83,236.23 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:239.2,251.40 9 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:254.2,261.12 5 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:236.23,238.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:251.40,253.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:265.55,268.2 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:271.57,275.2 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:284.53,285.35 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:289.2,290.29 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:293.2,295.18 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:285.35,286.28 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:290.29,292.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:300.75,306.23 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:311.2,311.16 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:314.2,317.24 4 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:306.23,308.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:308.8,310.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:311.16,313.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:322.45,323.22 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:326.2,327.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:330.2,331.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:336.2,342.3 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:323.22,324.33 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:327.16,328.46 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:331.16,332.46 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:346.30,348.2 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:414.105,417.16 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:420.2,420.54 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:424.2,425.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:428.2,429.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:432.2,432.53 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:436.2,436.46 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:417.16,419.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:420.54,422.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:425.16,427.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:429.16,431.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:432.53,434.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:439.85,442.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:445.2,450.28 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:458.2,459.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:462.2,464.16 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:467.2,468.12 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:442.16,444.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:450.28,452.17 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:452.17,454.4 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:459.16,461.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:464.16,466.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:473.74,475.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:480.2,495.17 10 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:501.2,501.15 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:475.16,477.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:495.17,497.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:497.8,499.3 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:506.84,508.2 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:514.130,519.16 4 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:522.2,523.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:527.2,527.49 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:531.2,533.16 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:536.2,536.54 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:540.2,540.46 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:519.16,521.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:523.16,525.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:527.49,529.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:533.16,535.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:536.54,538.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:544.81,548.16 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:552.2,553.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:558.2,559.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:562.2,564.16 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:568.2,573.17 6 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:548.16,550.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:553.16,555.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:559.16,561.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:564.16,566.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:576.70,580.2 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:582.70,585.49 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:589.2,593.17 5 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:585.49,587.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:597.103,603.16 4 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:606.2,610.16 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:613.2,614.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:619.2,621.51 3 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:603.16,605.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:610.16,612.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:614.16,616.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:625.68,629.49 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:634.2,640.36 5 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:629.49,631.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:644.63,646.21 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:656.2,657.16 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:660.2,660.42 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:647.10,649.45 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:650.10,651.20 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:652.10,653.85 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:657.16,659.3 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:663.48,664.16 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:667.2,667.54 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:664.16,665.22 1 0 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:670.42,672.32 2 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:675.2,675.12 1 1 -github.com/ethereum/go-ethereum/p2p/rlpx/rlpx.go:672.32,674.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:185.44,186.20 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:189.2,191.10 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:186.20,188.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:195.54,196.20 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:199.2,201.10 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:196.20,198.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:205.37,207.2 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:210.65,217.2 3 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:220.159,229.2 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:232.66,233.20 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:239.2,239.20 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:245.2,245.24 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:248.2,249.13 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:252.2,252.13 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:255.2,255.16 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:258.2,258.12 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:233.20,234.18 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:237.3,237.20 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:234.18,235.53 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:239.20,240.18 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:243.3,243.20 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:240.18,241.53 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:245.24,246.56 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:249.13,251.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:252.13,254.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:255.16,257.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:262.35,262.78 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:265.38,265.81 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:268.34,268.75 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:271.35,271.77 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:274.37,274.90 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:277.38,277.91 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:280.37,280.89 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:283.31,283.53 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:286.38,287.20 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:290.2,291.33 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:294.2,294.12 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:287.20,289.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:291.33,293.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:298.32,299.17 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:302.2,304.41 3 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:313.2,314.10 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:299.17,301.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:304.41,305.44 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:305.44,306.13 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:309.4,310.16 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:306.13,308.5 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:320.116,321.24 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:324.2,324.57 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:327.2,337.39 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:346.2,347.41 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:354.2,354.11 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:321.24,322.34 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:324.57,325.37 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:337.39,338.43 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:341.3,342.22 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:338.43,339.57 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:342.22,344.4 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:347.41,348.44 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:351.3,352.35 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:348.44,349.53 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:358.60,359.48 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:362.2,362.19 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:359.48,360.56 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:366.57,367.29 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:370.2,370.20 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:367.29,368.51 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:382.81,386.16 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:389.2,389.78 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:386.16,387.41 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:393.81,397.16 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:400.2,401.35 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:397.16,398.41 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:405.62,407.2 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:410.44,411.17 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:411.17,412.41 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:418.37,420.16 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:423.2,424.18 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:428.2,431.18 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:420.16,421.41 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:424.18,426.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:435.36,440.19 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:443.2,443.32 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:448.2,448.18 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:451.2,453.15 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:440.19,441.26 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:443.32,447.3 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:448.18,450.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:457.42,459.16 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:459.16,461.49 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:465.3,466.32 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:461.49,463.12 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:472.65,472.79 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:473.65,473.81 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:476.66,478.52 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:482.2,486.37 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:491.2,491.44 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:496.2,496.38 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:514.2,519.92 6 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:478.52,481.3 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:486.37,490.3 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:491.44,494.3 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:496.38,497.25 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:500.3,500.51 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:497.25,498.12 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:500.51,501.50 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:501.50,504.5 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:504.10,507.5 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:508.9,511.4 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:523.73,524.18 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:528.2,529.34 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:532.2,540.32 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:555.2,555.41 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:563.2,565.16 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:568.2,568.72 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:571.2,573.28 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:576.2,576.12 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:524.18,526.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:529.34,531.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:540.32,541.15 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:544.3,545.20 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:548.3,549.17 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:552.3,553.16 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:541.15,542.12 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:545.20,546.12 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:549.17,551.4 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:555.41,556.14 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:560.3,561.13 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:556.14,559.4 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:565.16,567.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:568.72,570.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:573.28,575.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:580.53,582.2 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:585.40,586.33 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:586.33,587.17 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:587.17,589.18 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:589.18,591.5 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:597.78,600.46 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:604.2,604.17 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:600.46,603.3 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:608.58,613.62 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:620.2,620.12 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:613.62,615.17 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:618.3,618.13 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:615.17,617.4 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:625.110,629.19 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:632.2,634.12 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:629.19,631.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:639.107,645.2 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:647.104,651.17 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:658.2,668.30 6 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:671.2,671.26 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:674.2,674.43 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:684.2,684.21 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:691.2,691.47 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:651.17,652.15 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:655.3,656.22 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:652.15,654.4 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:668.30,670.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:671.26,673.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:674.43,676.14 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:676.14,678.4 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:679.8,680.32 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:680.32,682.4 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:684.21,685.36 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:685.36,686.29 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:686.29,688.5 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:695.39,696.16 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:696.16,697.37 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:702.44,703.16 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:706.2,706.15 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:709.2,710.13 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:703.16,705.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:706.15,708.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:717.40,718.29 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:727.2,729.23 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:718.29,721.27 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:724.3,725.42 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:721.27,723.4 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:735.56,739.14 4 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:742.2,746.12 5 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:739.14,741.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:750.58,751.44 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:781.2,781.30 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:751.44,753.22 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:779.3,779.48 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:753.22,754.37 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:766.4,766.32 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:754.37,757.28 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:760.5,760.14 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:757.28,758.14 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:760.14,762.6 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:762.11,764.6 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:766.32,767.45 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:770.5,770.44 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:767.45,768.14 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:770.44,771.15 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:771.15,773.7 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:773.12,775.7 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:786.97,791.15 4 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:794.2,795.12 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:791.15,793.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:799.92,801.17 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:804.2,805.15 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:808.2,810.47 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:820.2,821.28 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:801.17,803.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:805.15,807.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:810.47,814.20 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:817.3,818.16 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:814.20,816.4 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:821.28,823.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:830.74,831.42 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:831.42,834.17 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:837.3,838.18 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:841.3,845.30 5 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:834.17,835.12 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:838.18,839.12 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:845.30,847.4 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:854.78,859.15 4 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:862.2,862.47 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:865.2,865.12 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:859.15,861.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:862.47,864.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:871.59,876.15 4 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:879.2,879.47 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:882.2,882.16 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:876.15,878.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:879.47,881.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:886.91,890.19 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:893.2,895.12 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:890.19,892.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:900.94,906.2 4 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:908.91,911.17 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:918.2,920.54 3 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:924.2,925.23 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:928.2,928.21 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:931.2,931.18 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:934.2,935.45 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:945.2,946.21 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:951.2,952.12 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:911.17,912.19 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:915.3,916.22 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:912.19,914.4 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:920.54,923.3 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:925.23,927.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:928.21,930.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:931.18,933.3 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:935.45,937.14 2 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:937.14,939.4 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:940.8,941.22 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:941.22,943.4 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:946.21,947.29 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:947.29,949.4 1 1 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:959.108,968.32 6 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:973.2,974.30 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:968.32,969.63 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:969.63,971.4 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:974.30,976.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:980.62,985.39 4 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:988.2,988.12 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:985.39,987.3 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:993.144,995.97 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:995.97,998.27 3 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1002.3,1002.15 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1019.3,1019.19 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:998.27,1000.4 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1002.15,1004.18 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1007.4,1007.22 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1004.18,1006.5 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1007.22,1009.5 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1010.9,1012.18 2 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1015.4,1015.23 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1012.18,1014.5 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1015.23,1017.5 1 0 -github.com/ethereum/go-ethereum/p2p/nodestate/nodestate.go:1019.19,1021.4 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:40.39,42.16 2 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:45.2,45.10 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:42.16,43.44 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:72.44,73.65 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:80.2,80.30 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:73.65,75.17 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:78.3,78.35 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:75.17,77.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:85.68,87.17 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:90.2,90.14 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:93.2,93.14 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:96.2,98.16 3 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:101.2,101.10 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:87.17,89.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:90.14,92.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:93.14,95.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:98.16,99.13 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:105.28,108.2 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:110.50,116.16 3 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:119.2,119.25 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:123.2,123.19 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:126.2,126.56 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:130.2,131.15 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:139.2,139.35 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:143.2,143.68 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:146.2,148.30 3 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:154.2,154.55 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:116.16,118.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:119.25,121.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:123.19,125.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:126.56,128.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:131.15,133.17 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:136.3,136.14 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:133.17,135.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:139.35,141.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:143.68,145.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:148.30,150.17 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:150.17,152.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:158.55,160.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:165.2,166.34 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:160.16,162.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:162.8,162.25 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:162.25,164.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:169.31,177.9 4 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:183.2,184.20 2 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:194.2,194.19 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:178.50,179.60 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:180.10,181.49 1 0 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:184.20,186.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:186.8,190.25 4 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:190.25,192.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/urlv4.go:198.44,203.2 4 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:45.61,54.16 7 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:57.2,58.47 2 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:61.2,61.12 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:54.16,56.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:58.47,60.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:64.53,66.39 2 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:72.2,74.53 3 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:77.2,77.12 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:66.39,68.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:68.8,68.29 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:68.29,70.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:74.53,76.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:80.44,83.16 3 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:86.2,89.30 4 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:83.16,85.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:95.36,95.58 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:98.49,100.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:103.52,105.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:108.2,109.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:112.2,113.12 2 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:105.16,107.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:109.16,111.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:119.32,119.54 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:127.59,130.2 2 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:132.59,134.57 2 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:134.57,135.13 1 0 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:143.55,145.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:147.46,151.2 3 0 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:153.43,156.53 3 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:159.2,159.29 1 1 -github.com/ethereum/go-ethereum/p2p/enode/idscheme.go:156.53,157.13 1 0 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:36.44,38.38 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:47.2,48.28 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:51.2,51.15 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:38.38,42.40 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:45.3,45.25 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:42.40,43.12 1 0 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:48.28,50.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:55.40,57.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:60.41,62.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:71.34,75.24 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:78.2,79.31 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:87.2,87.13 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:75.24,77.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:79.31,80.15 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:80.15,82.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:82.9,85.4 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:90.35,93.24 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:96.2,96.27 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:93.24,95.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:99.30,104.2 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:108.59,110.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:117.34,118.24 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:123.2,123.14 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:118.24,119.24 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:119.24,121.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:160.49,167.2 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:170.42,174.21 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:177.2,180.34 4 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:174.21,176.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:185.27,189.21 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:192.2,192.30 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:195.2,199.16 5 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:189.21,191.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:192.30,194.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:203.31,207.20 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:212.2,212.6 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:207.20,211.3 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:212.6,214.20 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:217.3,217.10 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:214.20,216.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:218.31,219.10 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:225.4,225.26 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:226.18,228.26 2 0 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:219.10,223.5 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:234.32,236.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:240.38,242.8 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:245.2,245.11 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:242.8,244.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:249.43,253.25 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:256.2,257.26 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:253.25,255.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:261.46,265.27 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:265.27,266.24 1 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:266.24,270.9 4 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:276.65,279.18 3 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:279.18,281.10 2 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:282.20,282.20 0 1 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:283.23,283.23 0 0 -github.com/ethereum/go-ethereum/p2p/enode/iter.go:284.17,285.10 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:70.61,87.2 5 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:90.37,92.2 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:95.35,98.14 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:103.2,108.41 3 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:117.2,118.39 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:122.2,124.30 3 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:98.14,100.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:108.41,110.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:118.39,120.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:128.35,133.2 3 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:136.30,138.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:147.39,152.2 3 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:154.39,156.43 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:156.43,159.3 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:163.42,168.2 3 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:170.42,172.12 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:172.12,175.3 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:178.59,179.21 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:182.2,182.22 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:179.21,181.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:187.45,193.2 4 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:197.47,203.2 4 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:207.47,214.2 5 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:218.76,224.2 4 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:228.54,234.2 4 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:237.40,241.40 3 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:246.2,246.40 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:251.2,251.15 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:256.2,256.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:241.40,243.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:243.8,245.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:246.40,248.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:248.8,250.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:251.15,253.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:253.8,255.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:256.31,258.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:258.8,260.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:264.59,266.25 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:269.2,269.23 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:275.2,275.23 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:266.25,268.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:269.23,271.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:271.8,271.56 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:271.56,274.3 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:280.57,282.14 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:285.2,288.16 4 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:291.2,291.25 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:282.14,284.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:288.16,290.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:294.35,296.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:298.29,299.42 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:303.2,304.31 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:307.2,309.43 3 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:312.2,313.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:316.2,317.110 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:299.42,301.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:304.31,306.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:309.43,310.57 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:313.16,314.65 1 0 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:320.32,323.2 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:326.31,328.12 2 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:331.2,331.33 1 1 -github.com/ethereum/go-ethereum/p2p/enode/localnode.go:328.12,330.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:43.73,44.56 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:47.2,48.75 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:51.2,51.18 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:44.56,46.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:48.75,50.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:55.37,57.16 2 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:60.2,60.10 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:57.16,58.40 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:64.74,65.42 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:68.2,68.39 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:71.2,72.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:75.2,76.49 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:79.2,79.30 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:65.42,67.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:68.39,70.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:72.16,74.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:76.49,78.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:83.24,85.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:88.29,90.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:93.34,95.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:98.40,100.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:103.28,108.25 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:111.2,111.25 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:114.2,114.12 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:108.25,110.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:111.25,113.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:118.26,122.2 3 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:125.26,129.2 3 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:132.42,134.39 2 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:137.2,137.13 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:134.39,136.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:142.37,145.2 2 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:149.41,150.20 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:153.2,153.18 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:156.2,157.44 2 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:161.2,162.21 2 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:150.20,152.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:153.18,155.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:157.44,159.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:166.32,167.16 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:170.2,172.21 3 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:167.16,169.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:176.46,178.2 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:181.49,183.16 2 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:186.2,186.12 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:183.16,185.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:193.28,195.2 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:198.29,200.2 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:203.31,205.2 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:208.37,210.2 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:213.43,215.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:218.47,220.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:223.2,224.12 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:220.16,222.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:230.26,232.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:235.2,235.11 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:232.16,233.13 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:238.37,241.16 3 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:246.2,247.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:241.16,243.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:243.8,243.30 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:243.30,245.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/node.go:253.35,254.24 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:263.2,263.10 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:254.24,257.14 3 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:257.14,259.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:259.9,259.21 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:259.21,261.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:267.27,269.19 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:278.2,278.22 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:269.19,271.13 2 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:271.13,273.4 1 1 -github.com/ethereum/go-ethereum/p2p/enode/node.go:273.9,275.9 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:80.39,81.16 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:84.2,84.30 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:81.16,83.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:88.33,90.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:93.2,93.53 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:90.16,92.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:98.48,101.63 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:104.2,104.16 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:109.2,113.13 4 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:131.2,131.53 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:101.63,103.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:104.16,106.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:114.27,116.71 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:121.11,123.37 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:116.71,119.4 2 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:123.37,125.44 2 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:128.4,128.32 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:125.44,127.5 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:135.28,140.2 4 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:143.52,144.49 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:147.2,149.29 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:144.49,146.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:153.57,155.17 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:158.2,158.76 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:155.17,156.55 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:162.68,165.35 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:168.2,171.33 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:174.2,177.22 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:165.35,167.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:171.33,173.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:180.51,188.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:191.47,196.2 4 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:199.44,201.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:204.2,205.15 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:208.2,208.12 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:201.16,203.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:205.15,207.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:212.53,216.2 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:219.46,221.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:224.2,225.12 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:221.16,223.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:229.55,233.2 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:236.33,238.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:241.2,241.36 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:238.16,240.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:244.44,246.55 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:250.2,251.13 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:246.55,247.74 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:255.44,256.40 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:259.2,260.16 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:263.2,263.66 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:266.2,266.78 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:256.40,258.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:260.16,262.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:263.66,265.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:270.37,272.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:276.38,277.34 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:280.2,280.24 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:277.34,279.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:284.33,286.2 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:288.49,291.16 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:291.16,293.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:305.31,306.22 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:306.22,306.41 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:311.25,314.6 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:314.6,315.10 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:316.17,317.20 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:318.18,319.10 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:326.29,329.16 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:333.2,338.13 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:329.16,331.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:338.13,340.26 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:350.3,352.28 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:340.26,342.27 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:345.4,345.24 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:342.27,344.5 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:345.24,348.5 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:352.28,355.52 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:358.4,358.20 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:355.52,357.5 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:365.60,366.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:369.2,369.69 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:366.31,368.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:373.82,374.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:377.2,377.72 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:374.31,376.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:381.60,382.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:386.2,387.69 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:382.31,384.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:391.82,392.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:395.2,395.72 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:392.31,394.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:399.47,400.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:403.2,403.65 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:400.31,402.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:407.66,408.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:411.2,411.74 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:408.31,410.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:415.49,416.31 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:419.2,419.59 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:416.31,418.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:423.68,424.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:427.2,427.68 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:424.31,426.3 1 0 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:433.38,434.66 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:437.2,437.26 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:434.66,436.3 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:441.46,443.2 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:447.63,457.57 3 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:481.2,481.14 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:457.57,467.15 6 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:471.3,471.60 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:474.3,474.24 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:479.3,479.27 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:467.15,469.17 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:471.60,472.17 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:474.24,475.31 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:475.31,476.18 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:486.43,487.43 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:494.2,494.12 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:487.43,489.37 2 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:492.3,492.43 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:489.37,490.12 1 1 -github.com/ethereum/go-ethereum/p2p/enode/nodedb.go:498.23,501.2 2 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:52.34,55.31 3 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:59.2,59.25 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:55.31,58.3 2 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:62.54,64.31 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:69.2,69.16 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:72.2,73.15 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:76.2,76.16 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:64.31,67.3 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:69.16,71.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:73.15,75.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:79.109,81.16 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:84.2,88.38 4 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:81.16,83.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:88.38,90.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:93.50,95.16 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:98.2,99.16 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:102.2,102.31 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:113.2,113.83 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:95.16,97.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:99.16,101.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:102.31,104.17 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:107.3,107.30 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:104.17,106.4 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:107.30,108.64 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:108.64,110.5 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:116.75,117.38 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:117.38,119.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:122.32,124.2 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:126.53,131.25 4 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:134.2,136.12 3 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:131.25,133.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:141.31,144.101 2 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:154.2,154.101 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:165.2,165.34 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:170.2,170.12 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:144.101,145.33 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:151.3,151.13 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:146.47,147.101 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:148.48,149.103 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:154.101,155.33 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:163.3,163.13 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:156.47,157.101 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:158.47,159.101 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:160.48,161.103 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:165.34,166.29 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:166.29,168.4 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:176.90,178.16 2 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:182.2,183.43 2 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:212.2,212.12 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:178.16,181.3 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:183.43,184.26 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:187.3,187.67 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:184.26,185.12 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:187.67,188.13 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:192.4,200.19 4 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:203.4,206.25 2 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:188.13,190.5 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:200.19,202.5 1 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:206.25,209.5 2 1 -github.com/ethereum/go-ethereum/p2p/nat/natupnp.go:212.12,214.3 1 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:62.44,68.20 2 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:74.2,74.14 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:68.20,70.16 2 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:70.16,72.4 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:75.25,76.18 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:77.27,78.20 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:79.21,80.16 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:83.3,83.24 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:84.14,85.21 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:86.34,87.22 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:88.10,89.59 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:80.16,82.4 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:99.94,102.15 3 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:107.2,107.83 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:112.2,112.6 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:102.15,106.3 3 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:107.83,109.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:109.8,111.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:112.6,113.10 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:114.21,115.11 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:118.20,120.85 2 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:123.4,123.29 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:115.11,117.5 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:120.85,122.5 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:133.45,133.70 1 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:134.45,134.91 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:138.72,138.86 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:139.72,139.86 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:143.22,146.59 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:146.59,148.13 2 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:149.3,149.13 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:150.3,150.35 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:155.3,155.13 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:148.13,148.40 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:149.13,149.39 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:150.35,151.30 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:151.30,153.5 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:161.23,163.2 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:168.36,169.20 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:172.2,172.46 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:169.20,171.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:191.66,194.2 1 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:196.113,197.33 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:200.2,200.71 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:197.33,199.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:203.79,204.33 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:207.2,207.58 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:204.33,206.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:210.49,211.33 1 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:214.2,214.29 1 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:211.33,213.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:217.36,220.20 3 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:223.2,223.25 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:220.20,222.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:227.33,228.19 1 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:233.2,233.20 1 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:236.2,236.12 1 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:228.19,232.3 3 1 -github.com/ethereum/go-ethereum/p2p/nat/nat.go:233.20,235.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:35.31,37.2 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:39.44,41.16 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:44.2,44.43 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:41.16,43.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:47.108,48.19 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:53.2,54.12 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:48.19,50.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:57.80,63.2 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:65.30,69.21 3 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:83.2,85.16 3 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:95.2,95.12 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:69.21,71.13 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:71.13,73.52 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:73.52,75.5 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:75.10,77.5 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:85.16,86.10 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:87.21,88.16 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:91.20,92.14 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:88.16,90.5 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:107.41,109.16 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:112.2,112.31 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:129.2,129.12 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:109.16,111.3 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:112.31,114.17 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:117.3,117.32 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:114.17,116.4 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:117.32,118.38 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:118.38,119.79 1 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:119.79,121.19 2 0 -github.com/ethereum/go-ethereum/p2p/nat/natpmp.go:121.19,124.7 2 0 -github.com/ethereum/go-ethereum/params/config.go:422.62,423.15 1 0 -github.com/ethereum/go-ethereum/params/config.go:426.2,426.25 1 0 -github.com/ethereum/go-ethereum/params/config.go:423.15,425.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:430.48,443.2 10 0 -github.com/ethereum/go-ethereum/params/config.go:446.42,448.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:502.40,504.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:513.40,515.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:532.37,534.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:536.69,538.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:540.59,542.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:544.50,546.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:548.93,550.23 2 0 -github.com/ethereum/go-ethereum/params/config.go:553.2,554.35 2 0 -github.com/ethereum/go-ethereum/params/config.go:561.2,561.33 1 0 -github.com/ethereum/go-ethereum/params/config.go:550.23,552.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:554.35,557.47 3 0 -github.com/ethereum/go-ethereum/params/config.go:557.47,559.4 1 0 -github.com/ethereum/go-ethereum/params/config.go:564.66,566.33 2 0 -github.com/ethereum/go-ethereum/params/config.go:569.2,570.35 2 0 -github.com/ethereum/go-ethereum/params/config.go:577.2,577.43 1 0 -github.com/ethereum/go-ethereum/params/config.go:566.33,568.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:570.35,573.47 3 0 -github.com/ethereum/go-ethereum/params/config.go:573.47,575.4 1 0 -github.com/ethereum/go-ethereum/params/config.go:581.39,583.9 2 0 -github.com/ethereum/go-ethereum/params/config.go:593.2,612.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:584.23,585.20 1 0 -github.com/ethereum/go-ethereum/params/config.go:586.23,587.20 1 0 -github.com/ethereum/go-ethereum/params/config.go:588.20,589.17 1 0 -github.com/ethereum/go-ethereum/params/config.go:590.10,591.21 1 0 -github.com/ethereum/go-ethereum/params/config.go:616.54,618.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:621.52,623.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:626.51,628.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:631.51,633.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:636.51,638.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:641.54,643.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:646.59,648.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:651.56,653.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:658.55,660.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:663.53,665.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:668.51,670.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:673.51,675.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:678.57,680.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:683.93,684.38 1 0 -github.com/ethereum/go-ethereum/params/config.go:687.2,687.108 1 0 -github.com/ethereum/go-ethereum/params/config.go:684.38,686.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:692.94,697.6 3 1 -github.com/ethereum/go-ethereum/params/config.go:705.2,705.16 1 1 -github.com/ethereum/go-ethereum/params/config.go:697.6,699.73 2 1 -github.com/ethereum/go-ethereum/params/config.go:702.3,703.32 2 1 -github.com/ethereum/go-ethereum/params/config.go:699.73,700.9 1 1 -github.com/ethereum/go-ethereum/params/config.go:710.52,732.4 3 0 -github.com/ethereum/go-ethereum/params/config.go:751.2,751.12 1 0 -github.com/ethereum/go-ethereum/params/config.go:732.4,733.26 1 0 -github.com/ethereum/go-ethereum/params/config.go:747.3,747.40 1 0 -github.com/ethereum/go-ethereum/params/config.go:733.26,735.49 1 0 -github.com/ethereum/go-ethereum/params/config.go:739.4,739.49 1 0 -github.com/ethereum/go-ethereum/params/config.go:735.49,738.5 1 0 -github.com/ethereum/go-ethereum/params/config.go:739.49,740.42 1 0 -github.com/ethereum/go-ethereum/params/config.go:740.42,743.6 1 0 -github.com/ethereum/go-ethereum/params/config.go:747.40,749.4 1 0 -github.com/ethereum/go-ethereum/params/config.go:754.94,755.71 1 1 -github.com/ethereum/go-ethereum/params/config.go:758.2,758.67 1 1 -github.com/ethereum/go-ethereum/params/config.go:761.2,761.68 1 1 -github.com/ethereum/go-ethereum/params/config.go:764.2,764.65 1 1 -github.com/ethereum/go-ethereum/params/config.go:767.2,767.65 1 1 -github.com/ethereum/go-ethereum/params/config.go:770.2,770.65 1 1 -github.com/ethereum/go-ethereum/params/config.go:773.2,773.68 1 1 -github.com/ethereum/go-ethereum/params/config.go:776.2,776.71 1 1 -github.com/ethereum/go-ethereum/params/config.go:779.2,779.81 1 1 -github.com/ethereum/go-ethereum/params/config.go:782.2,782.73 1 1 -github.com/ethereum/go-ethereum/params/config.go:789.2,789.69 1 1 -github.com/ethereum/go-ethereum/params/config.go:792.2,792.75 1 1 -github.com/ethereum/go-ethereum/params/config.go:795.2,795.65 1 1 -github.com/ethereum/go-ethereum/params/config.go:798.2,798.65 1 1 -github.com/ethereum/go-ethereum/params/config.go:801.2,801.77 1 1 -github.com/ethereum/go-ethereum/params/config.go:804.2,804.71 1 1 -github.com/ethereum/go-ethereum/params/config.go:807.2,807.12 1 1 -github.com/ethereum/go-ethereum/params/config.go:755.71,757.3 1 1 -github.com/ethereum/go-ethereum/params/config.go:758.67,760.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:761.68,763.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:764.65,766.3 1 1 -github.com/ethereum/go-ethereum/params/config.go:767.65,769.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:770.65,772.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:773.68,775.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:776.71,778.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:779.81,781.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:782.73,785.78 1 1 -github.com/ethereum/go-ethereum/params/config.go:785.78,787.4 1 1 -github.com/ethereum/go-ethereum/params/config.go:789.69,791.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:792.75,794.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:795.65,797.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:798.65,800.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:801.77,803.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:804.71,806.3 1 0 -github.com/ethereum/go-ethereum/params/config.go:812.53,814.2 1 1 -github.com/ethereum/go-ethereum/params/config.go:817.38,818.29 1 1 -github.com/ethereum/go-ethereum/params/config.go:821.2,821.25 1 1 -github.com/ethereum/go-ethereum/params/config.go:818.29,820.3 1 1 -github.com/ethereum/go-ethereum/params/config.go:824.41,825.14 1 1 -github.com/ethereum/go-ethereum/params/config.go:828.2,828.14 1 1 -github.com/ethereum/go-ethereum/params/config.go:831.2,831.22 1 1 -github.com/ethereum/go-ethereum/params/config.go:825.14,827.3 1 1 -github.com/ethereum/go-ethereum/params/config.go:828.14,830.3 1 1 -github.com/ethereum/go-ethereum/params/config.go:844.85,846.9 2 1 -github.com/ethereum/go-ethereum/params/config.go:854.2,855.34 2 1 -github.com/ethereum/go-ethereum/params/config.go:858.2,858.12 1 1 -github.com/ethereum/go-ethereum/params/config.go:847.26,848.17 1 1 -github.com/ethereum/go-ethereum/params/config.go:849.56,850.20 1 1 -github.com/ethereum/go-ethereum/params/config.go:851.10,852.17 1 1 -github.com/ethereum/go-ethereum/params/config.go:855.34,857.3 1 1 -github.com/ethereum/go-ethereum/params/config.go:861.46,863.2 1 0 -github.com/ethereum/go-ethereum/params/config.go:879.63,881.20 2 1 -github.com/ethereum/go-ethereum/params/config.go:884.2,897.3 1 1 -github.com/ethereum/go-ethereum/params/config.go:881.20,883.3 1 0 -github.com/ethereum/go-ethereum/params/dao.go:39.38,158.2 1 0 -github.com/ethereum/go-ethereum/params/version.go:31.29,33.2 1 1 -github.com/ethereum/go-ethereum/params/version.go:36.37,38.23 2 1 -github.com/ethereum/go-ethereum/params/version.go:41.2,41.10 1 1 -github.com/ethereum/go-ethereum/params/version.go:38.23,40.3 1 1 -github.com/ethereum/go-ethereum/params/version.go:47.46,49.29 2 0 -github.com/ethereum/go-ethereum/params/version.go:52.2,52.25 1 0 -github.com/ethereum/go-ethereum/params/version.go:55.2,55.12 1 0 -github.com/ethereum/go-ethereum/params/version.go:49.29,51.3 1 0 -github.com/ethereum/go-ethereum/params/version.go:52.25,54.3 1 0 -github.com/ethereum/go-ethereum/params/version.go:58.58,60.25 2 0 -github.com/ethereum/go-ethereum/params/version.go:63.2,63.50 1 0 -github.com/ethereum/go-ethereum/params/version.go:66.2,66.12 1 0 -github.com/ethereum/go-ethereum/params/version.go:60.25,62.3 1 0 -github.com/ethereum/go-ethereum/params/version.go:63.50,65.3 1 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:123.67,125.17 2 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:141.2,141.59 1 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:126.26,127.18 1 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:128.26,129.18 1 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:130.26,131.18 1 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:132.25,133.17 1 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:134.25,135.17 1 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:136.29,137.22 1 0 -github.com/ethereum/go-ethereum/params/bootnodes.go:138.10,139.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:50.64,56.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:59.36,61.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:64.64,70.30 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:75.2,75.38 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:80.2,80.33 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:83.2,83.44 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:89.2,90.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:94.2,105.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:109.2,117.21 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:70.30,72.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:75.38,77.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:80.33,82.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:83.44,84.50 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:84.50,86.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:90.16,92.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:105.16,107.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:122.93,124.9 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:127.2,128.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:132.2,133.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:139.2,140.19 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:124.9,126.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:128.16,130.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:133.16,135.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:145.64,147.9 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:150.2,150.27 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:147.9,149.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:154.60,159.2 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:177.34,179.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:182.34,184.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:187.39,189.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:193.50,196.22 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:199.2,199.23 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:196.22,198.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:204.57,206.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:209.2,211.12 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:206.16,208.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:216.59,219.40 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:222.2,223.24 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:226.2,227.38 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:238.2,238.23 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:219.40,221.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:223.24,225.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:227.38,230.10 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:230.10,232.18 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:235.4,235.26 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:232.18,234.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:242.61,246.28 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:268.2,268.19 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:272.2,272.40 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:277.2,278.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:281.2,285.12 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:246.28,247.45 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:247.45,252.24 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:255.4,257.18 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:262.4,262.37 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:265.4,265.30 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:252.24,254.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:257.18,259.10 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:262.37,263.13 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:268.19,270.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:272.40,274.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:278.16,280.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:289.33,291.22 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:295.2,296.24 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:291.22,294.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:300.56,304.2 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:307.48,311.37 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:314.2,314.17 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:311.37,313.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:318.59,322.40 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:325.2,325.17 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:322.40,324.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:329.41,331.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:335.79,337.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:340.2,340.32 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:337.16,338.28 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:344.45,346.19 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:352.2,352.26 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/inproc.go:346.19,351.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:152.52,163.25 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:166.2,166.31 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:163.25,165.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:171.55,173.56 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:177.2,177.23 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:183.2,183.31 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:195.2,203.12 8 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:173.56,175.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:177.23,178.65 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:178.65,180.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:183.31,185.17 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:188.3,189.17 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:192.3,192.25 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:185.17,187.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:189.17,191.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:207.41,209.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:213.37,215.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:219.2,220.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:224.2,232.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:215.16,216.34 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:220.16,221.37 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:235.38,237.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:240.2,242.16 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:245.2,246.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:249.2,249.23 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:237.16,239.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:242.16,244.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:246.16,248.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:285.59,286.34 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:296.2,296.19 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:286.34,287.59 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:290.3,290.38 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:287.59,288.63 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:296.19,298.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:303.75,312.16 8 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:315.2,316.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:319.2,321.12 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:312.16,314.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:316.16,318.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/types.go:324.45,326.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:46.13,50.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:64.50,69.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:72.37,74.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:77.65,78.33 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:81.2,81.44 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:89.2,90.44 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:94.2,95.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:100.2,104.26 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:111.2,131.18 12 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:78.33,80.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:81.44,82.63 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:82.63,84.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:90.44,92.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:95.16,97.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:104.26,106.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:106.8,108.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:150.34,151.19 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:154.2,154.29 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:151.19,153.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:159.50,161.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:165.67,166.18 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:169.2,169.15 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:176.2,179.40 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:182.2,183.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:187.2,188.14 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:196.2,196.14 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:200.2,212.36 8 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:215.2,219.22 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:222.2,223.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:228.2,231.12 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:166.18,168.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:169.15,170.17 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:170.17,172.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:179.40,181.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:183.16,185.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:188.14,189.48 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:189.48,190.22 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:190.22,192.10 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:196.14,198.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:212.36,214.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:219.22,221.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:223.16,225.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:235.91,242.16 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:246.2,246.39 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:252.2,252.78 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:261.2,262.12 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:267.2,268.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:242.16,245.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:246.39,247.22 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:247.22,250.4 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:252.78,254.65 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:257.3,257.15 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:254.65,256.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:262.12,265.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:274.44,279.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:283.33,284.18 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:287.2,287.15 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:291.2,291.21 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:298.2,298.62 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:301.2,302.12 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:305.2,305.9 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:284.18,286.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:287.15,289.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:291.21,296.3 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:298.62,300.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:302.12,304.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:306.24,307.13 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:308.37,309.30 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:314.45,318.21 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:321.2,321.13 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:318.21,320.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:326.63,328.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:331.2,337.12 7 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:328.16,330.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:340.59,342.6 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:342.6,344.17 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:347.3,348.17 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:351.3,351.41 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:344.17,346.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:348.17,350.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:351.41,353.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:359.59,360.21 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:363.2,364.68 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:360.21,362.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:376.20,383.19 5 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:386.2,387.63 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:390.2,391.29 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:398.2,399.85 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:403.2,405.32 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:383.19,385.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:387.63,389.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:391.29,393.17 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:396.3,396.21 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:393.17,395.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:399.85,401.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:411.20,415.21 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:420.2,422.21 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:430.2,431.97 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:434.2,434.21 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:439.2,439.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:447.2,447.14 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:415.21,417.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:422.21,424.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:424.8,427.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:431.97,433.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:434.21,436.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:439.12,446.3 6 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:450.47,456.19 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:459.2,460.63 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:465.2,466.27 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:469.2,475.16 5 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:481.2,482.36 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:502.2,508.37 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:511.2,511.19 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:456.19,458.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:460.63,462.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:466.27,468.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:475.16,477.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:482.36,484.14 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:487.3,491.28 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:494.3,495.17 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:498.3,498.27 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:484.14,486.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:491.28,493.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:495.17,497.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:508.37,510.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:531.62,533.42 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:544.2,544.23 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:533.42,536.10 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:536.10,538.18 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:541.4,541.26 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:538.18,540.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:553.65,555.9 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:558.2,558.74 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/adapters/exec.go:555.9,557.3 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:19.26,19.51 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:22.32,26.2 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:28.31,32.2 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:35.34,37.2 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:40.40,44.2 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:46.40,49.32 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:59.2,59.33 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:49.32,57.3 5 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:63.56,65.34 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:80.2,80.27 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:84.2,84.12 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:65.34,67.29 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:75.3,76.40 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:67.29,70.18 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:70.18,72.5 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:76.40,78.4 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:80.27,83.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:88.52,91.2 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:94.41,95.7 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:95.7,97.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:97.8,99.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:102.45,103.12 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:103.12,105.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:105.8,105.20 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:105.20,108.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:108.8,112.3 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:115.44,116.33 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:116.33,119.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:119.8,122.3 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:125.45,127.2 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:133.45,135.18 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:142.2,147.29 6 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:135.18,138.3 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:147.29,148.47 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:148.47,152.4 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:158.34,161.2 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:163.42,166.18 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:166.18,168.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:168.8,170.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:173.53,176.16 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:179.2,179.26 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:176.16,178.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:182.52,183.15 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:183.15,185.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:185.8,189.3 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:201.55,202.6 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:202.6,203.41 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:213.3,215.24 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:220.3,220.16 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:203.41,207.20 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:211.4,211.20 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:207.20,210.5 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:215.24,219.4 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:226.35,227.9 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:228.20,229.13 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:231.22,233.17 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:235.35,239.21 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:245.3,246.39 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:248.33,252.11 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:254.10,255.13 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:239.21,244.4 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:259.50,260.23 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:261.21,262.15 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:263.22,264.15 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:265.18,266.11 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:267.10,268.13 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:284.52,288.2 3 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:291.46,292.34 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:298.2,298.16 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:306.2,306.18 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:310.2,311.13 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:292.34,293.45 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:298.16,299.54 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:299.54,302.4 2 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:306.18,309.3 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:316.39,318.18 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:322.2,322.17 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:325.2,326.12 2 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:318.18,320.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:322.17,324.3 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:330.42,332.2 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:335.58,340.2 4 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:343.53,345.2 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:348.42,350.2 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:353.46,355.2 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:359.48,361.2 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:364.45,366.2 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:369.46,371.2 1 0 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:375.35,377.2 1 1 -github.com/ethereum/go-ethereum/rlp/encbuffer.go:380.43,382.2 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:57.49,59.47 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:63.2,65.40 3 1 -github.com/ethereum/go-ethereum/rlp/encode.go:68.2,68.23 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:59.47,61.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:65.40,67.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:73.53,77.40 3 1 -github.com/ethereum/go-ethereum/rlp/encode.go:80.2,80.29 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:77.40,79.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:88.73,90.40 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:97.2,97.46 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:90.40,93.3 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:107.49,109.2 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:113.32,114.15 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:117.2,117.26 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:114.15,116.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:122.68,123.15 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:127.2,129.21 3 1 -github.com/ethereum/go-ethereum/rlp/encode.go:123.15,126.3 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:135.70,137.9 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:138.27,139.28 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:140.47,141.29 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:142.32,143.31 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:144.27,145.32 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:146.55,147.37 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:148.20,149.24 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:150.28,151.24 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:152.30,153.26 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:154.51,155.25 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:156.51,157.39 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:158.54,159.34 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:160.30,161.31 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:162.33,163.29 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:164.10,165.70 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:169.59,172.2 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:174.55,177.2 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:179.55,182.2 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:184.60,186.16 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:190.2,190.22 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:193.2,194.12 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:186.16,189.3 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:190.22,192.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:197.62,199.20 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:202.2,203.12 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:199.20,201.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:206.56,209.2 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:211.51,212.19 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:213.9,214.34 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:215.9,216.33 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:217.10,219.54 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:219.54,220.22 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:227.4,230.14 4 1 -github.com/ethereum/go-ethereum/rlp/encode.go:220.22,226.5 3 1 -github.com/ethereum/go-ethereum/rlp/encode.go:235.70,238.2 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:240.69,242.15 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:247.2,247.12 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:242.15,244.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:244.8,246.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:250.57,252.33 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:259.2,259.12 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:252.33,255.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:255.8,258.3 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:262.60,263.17 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:270.2,272.16 3 1 -github.com/ethereum/go-ethereum/rlp/encode.go:275.2,275.24 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:263.17,269.3 2 0 -github.com/ethereum/go-ethereum/rlp/encode.go:272.16,274.3 1 0 -github.com/ethereum/go-ethereum/rlp/encode.go:278.75,280.32 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:284.2,285.13 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:315.2,315.17 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:280.32,282.3 1 0 -github.com/ethereum/go-ethereum/rlp/encode.go:285.13,288.53 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:288.53,290.30 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:295.4,295.14 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:290.30,291.61 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:291.61,293.6 1 0 -github.com/ethereum/go-ethereum/rlp/encode.go:297.8,299.53 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:299.53,301.17 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:305.4,306.30 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:311.4,312.14 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:301.17,304.5 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:306.30,307.61 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:307.61,309.6 1 0 -github.com/ethereum/go-ethereum/rlp/encode.go:318.57,320.16 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:323.2,323.27 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:329.2,331.39 3 1 -github.com/ethereum/go-ethereum/rlp/encode.go:363.2,363.20 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:320.16,322.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:323.27,324.30 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:324.30,326.4 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:331.39,333.56 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:333.56,335.29 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:340.4,341.14 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:335.29,336.64 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:336.64,338.6 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:343.8,346.56 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:346.56,348.55 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:353.4,354.36 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:359.4,360.14 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:348.55,349.53 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:349.53,350.11 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:354.36,355.80 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:355.80,357.6 1 0 -github.com/ethereum/go-ethereum/rlp/encode.go:366.73,368.43 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:372.2,373.32 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:377.2,377.56 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:384.2,384.20 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:368.43,370.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:373.32,375.3 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:377.56,378.37 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:381.3,382.13 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:378.37,380.4 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:387.49,388.38 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:393.2,393.51 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:402.2,402.10 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:388.38,389.54 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:389.54,391.4 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:393.51,394.21 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:400.3,400.55 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:394.21,399.4 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:407.44,408.9 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:409.20,411.11 2 1 -github.com/ethereum/go-ethereum/rlp/encode.go:412.21,415.11 3 1 -github.com/ethereum/go-ethereum/rlp/encode.go:416.21,420.11 4 1 -github.com/ethereum/go-ethereum/rlp/encode.go:421.21,426.11 5 1 -github.com/ethereum/go-ethereum/rlp/encode.go:427.21,433.11 6 1 -github.com/ethereum/go-ethereum/rlp/encode.go:434.21,441.11 7 1 -github.com/ethereum/go-ethereum/rlp/encode.go:442.21,450.11 8 1 -github.com/ethereum/go-ethereum/rlp/encode.go:451.10,460.11 9 1 -github.com/ethereum/go-ethereum/rlp/encode.go:465.35,466.25 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:466.25,467.22 1 1 -github.com/ethereum/go-ethereum/rlp/encode.go:467.22,469.4 1 1 -github.com/ethereum/go-ethereum/rlp/iterator.go:27.60,29.16 2 1 -github.com/ethereum/go-ethereum/rlp/iterator.go:32.2,32.15 1 1 -github.com/ethereum/go-ethereum/rlp/iterator.go:35.2,38.16 2 1 -github.com/ethereum/go-ethereum/rlp/iterator.go:29.16,31.3 1 0 -github.com/ethereum/go-ethereum/rlp/iterator.go:32.15,34.3 1 0 -github.com/ethereum/go-ethereum/rlp/iterator.go:43.37,44.23 1 1 -github.com/ethereum/go-ethereum/rlp/iterator.go:47.2,51.13 5 1 -github.com/ethereum/go-ethereum/rlp/iterator.go:44.23,46.3 1 1 -github.com/ethereum/go-ethereum/rlp/iterator.go:55.40,57.2 1 1 -github.com/ethereum/go-ethereum/rlp/iterator.go:59.37,61.2 1 0 -github.com/ethereum/go-ethereum/rlp/raw.go:33.42,35.2 1 0 -github.com/ethereum/go-ethereum/rlp/raw.go:38.28,39.14 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:42.2,42.23 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:39.14,41.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:47.64,49.16 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:52.2,52.41 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:49.16,51.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:57.62,59.16 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:62.2,62.15 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:65.2,65.27 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:59.16,61.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:62.15,64.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:70.63,72.16 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:75.2,75.9 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:72.16,74.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:76.25,77.22 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:78.25,79.22 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:82.3,82.39 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:83.24,84.31 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:85.10,87.17 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:90.3,90.22 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:79.22,81.4 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:87.17,89.4 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:96.60,98.16 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:101.2,101.15 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:104.2,104.27 1 0 -github.com/ethereum/go-ethereum/rlp/raw.go:98.16,100.3 1 0 -github.com/ethereum/go-ethereum/rlp/raw.go:101.15,103.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:108.41,110.24 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:117.2,117.15 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:110.24,112.17 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:115.3,115.23 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:112.17,114.4 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:120.76,121.19 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:124.2,125.9 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:151.2,151.16 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:155.2,155.44 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:158.2,158.37 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:121.19,123.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:126.16,129.18 3 1 -github.com/ethereum/go-ethereum/rlp/raw.go:130.16,135.55 4 1 -github.com/ethereum/go-ethereum/rlp/raw.go:138.16,141.47 3 1 -github.com/ethereum/go-ethereum/rlp/raw.go:142.16,145.33 3 1 -github.com/ethereum/go-ethereum/rlp/raw.go:146.10,149.47 3 1 -github.com/ethereum/go-ethereum/rlp/raw.go:135.55,137.4 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:151.16,153.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:155.44,157.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:161.52,162.24 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:165.2,166.14 2 1 -github.com/ethereum/go-ethereum/rlp/raw.go:186.2,186.25 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:189.2,189.15 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:162.24,164.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:167.9,168.19 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:169.9,170.37 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:171.9,172.56 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:173.9,174.75 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:175.9,176.94 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:177.9,178.113 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:179.9,180.132 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:181.9,182.151 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:186.25,188.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:193.46,194.12 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:199.2,199.9 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:194.12,196.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:196.8,196.20 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:196.20,198.3 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:200.20,201.34 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:202.21,206.4 1 0 -github.com/ethereum/go-ethereum/rlp/raw.go:207.21,212.4 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:213.21,219.4 1 0 -github.com/ethereum/go-ethereum/rlp/raw.go:220.21,227.4 1 0 -github.com/ethereum/go-ethereum/rlp/raw.go:229.21,237.4 1 0 -github.com/ethereum/go-ethereum/rlp/raw.go:238.21,247.4 1 1 -github.com/ethereum/go-ethereum/rlp/raw.go:249.10,259.4 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:57.32,61.2 3 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:63.55,66.2 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:68.53,71.2 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:73.54,75.68 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:80.2,80.42 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:75.68,77.3 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:83.79,88.50 4 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:93.2,94.24 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:99.2,104.13 4 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:88.50,90.3 1 0 -github.com/ethereum/go-ethereum/rlp/typecache.go:94.24,96.3 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:107.90,109.38 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:115.2,118.13 4 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:109.38,111.3 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:128.65,131.38 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:143.2,144.16 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:153.2,153.34 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:159.2,159.20 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:131.38,140.3 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:144.16,145.49 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:149.3,149.18 1 0 -github.com/ethereum/go-ethereum/rlp/typecache.go:145.49,148.4 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:153.34,158.3 4 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:163.45,164.27 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:169.2,169.20 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:164.27,165.17 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:165.17,167.4 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:178.42,180.2 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:182.68,185.2 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:188.96,190.26 2 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:194.2,194.35 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:197.2,197.16 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:201.2,208.66 3 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:211.2,211.10 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:190.26,191.24 1 0 -github.com/ethereum/go-ethereum/rlp/typecache.go:194.35,196.3 1 0 -github.com/ethereum/go-ethereum/rlp/typecache.go:197.16,199.3 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:208.66,210.3 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:215.62,219.16 3 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:224.2,224.12 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:219.16,221.3 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:221.8,223.3 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:225.31,226.16 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:227.29,228.14 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:229.10,230.34 1 0 -github.com/ethereum/go-ethereum/rlp/typecache.go:234.34,236.2 1 1 -github.com/ethereum/go-ethereum/rlp/typecache.go:238.36,240.2 1 1 -github.com/ethereum/go-ethereum/rlp/unsafe.go:28.57,35.2 6 1 -github.com/ethereum/go-ethereum/rlp/decode.go:57.27,57.49 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:80.49,86.2 4 1 -github.com/ethereum/go-ethereum/rlp/decode.go:90.51,97.43 5 1 -github.com/ethereum/go-ethereum/rlp/decode.go:100.2,100.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:103.2,103.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:97.43,99.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:100.17,102.3 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:112.40,114.22 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:120.2,120.63 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:114.22,116.42 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:116.42,118.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:123.57,124.13 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:138.2,138.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:125.19,126.83 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:127.20,128.71 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:129.23,130.60 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:131.25,132.70 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:133.23,134.62 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:135.19,136.73 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:141.51,142.42 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:145.2,145.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:142.42,144.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:153.82,155.9 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:156.27,157.29 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:158.47,159.27 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:160.32,161.32 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:162.27,163.35 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:164.55,165.28 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:166.20,167.25 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:168.28,169.25 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:170.30,171.27 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:172.54,173.36 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:174.30,175.32 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:176.33,177.30 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:178.10,179.70 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:183.57,185.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:188.2,189.12 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:185.16,187.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:192.53,195.16 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:198.2,199.12 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:195.16,197.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:202.53,204.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:207.2,208.12 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:204.16,206.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:211.55,213.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:216.2,217.12 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:213.16,215.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:220.60,222.2 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:224.55,226.14 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:231.2,232.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:235.2,235.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:226.14,229.3 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:232.16,234.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:238.77,240.89 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:246.2,247.33 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:250.2,251.9 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:269.2,269.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:240.89,241.34 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:244.3,244.30 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:241.34,243.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:247.33,249.3 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:252.35,253.50 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:256.16,261.50 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:264.10,265.50 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:253.50,255.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:261.50,263.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:265.50,267.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:272.75,274.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:277.2,277.15 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:281.2,281.58 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:284.2,284.20 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:274.16,276.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:277.15,280.3 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:281.58,283.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:287.76,289.14 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:310.2,310.19 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:313.2,313.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:289.14,291.21 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:300.3,300.21 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:304.3,304.50 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:291.21,293.18 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:296.4,298.17 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:293.18,295.5 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:300.21,302.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:304.50,305.9 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:306.9,306.24 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:306.24,308.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:310.19,312.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:316.75,317.36 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:320.2,322.22 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:329.2,329.14 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:332.2,332.49 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:317.36,319.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:322.22,323.50 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:323.50,324.9 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:325.9,325.24 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:325.24,327.4 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:329.14,331.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:335.58,337.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:340.2,341.12 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:337.16,339.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:344.58,346.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:349.2,350.14 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:376.2,376.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:346.16,348.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:351.12,352.22 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:357.3,358.14 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:359.14,360.32 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:363.3,363.32 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:366.3,366.43 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:370.3,370.34 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:373.12,374.56 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:352.22,354.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:354.9,354.28 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:354.28,356.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:360.32,362.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:363.32,365.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:366.43,368.4 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:370.34,372.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:379.59,381.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:384.2,384.27 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:389.2,389.56 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:410.2,410.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:381.16,383.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:384.27,385.31 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:385.31,387.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:389.56,390.37 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:393.3,393.28 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:408.3,408.43 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:390.37,392.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:393.28,395.18 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:395.18,396.19 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:403.5,403.59 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:396.19,401.11 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:404.10,404.25 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:404.25,406.5 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:413.58,414.27 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:414.27,417.3 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:421.76,424.9 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:425.35,426.35 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:427.18,428.53 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:429.10,430.55 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:434.76,435.56 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:435.56,437.18 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:440.3,440.60 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:443.3,443.13 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:437.18,439.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:440.60,442.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:451.92,458.56 4 1 -github.com/ethereum/go-ethereum/rlp/decode.go:458.56,460.17 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:465.3,465.32 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:479.3,480.18 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:483.3,483.60 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:486.3,486.13 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:460.17,463.4 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:465.32,466.23 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:475.4,477.14 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:466.23,471.5 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:480.18,482.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:483.60,485.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:492.58,493.33 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:496.2,497.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:500.2,500.18 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:513.2,513.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:493.33,495.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:497.16,499.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:500.18,502.68 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:505.3,505.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:502.68,504.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:506.8,508.17 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:511.3,511.30 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:508.17,510.4 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:516.56,518.2 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:529.31,530.11 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:531.12,532.16 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:533.14,534.18 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:535.12,536.16 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:537.10,538.39 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:591.56,595.2 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:599.53,605.2 5 1 -github.com/ethereum/go-ethereum/rlp/decode.go:610.42,612.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:615.2,615.14 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:612.16,614.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:616.12,618.32 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:619.14,621.38 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:624.3,624.30 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:627.3,627.16 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:628.10,629.32 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:621.38,623.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:624.30,626.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:635.44,637.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:640.2,640.14 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:637.16,639.3 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:641.12,642.18 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:645.3,647.13 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:648.14,649.29 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:652.3,652.38 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:655.3,655.30 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:658.3,658.13 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:659.10,660.27 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:642.18,644.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:649.29,651.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:652.38,654.4 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:655.30,657.4 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:665.40,667.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:670.2,670.18 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:676.2,678.48 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:681.2,681.20 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:686.2,686.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:667.16,669.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:670.18,673.3 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:678.48,680.3 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:681.20,683.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:683.8,685.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:694.41,696.2 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:698.43,700.2 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:702.43,705.2 2 0 -github.com/ethereum/go-ethereum/rlp/decode.go:707.43,710.2 2 0 -github.com/ethereum/go-ethereum/rlp/decode.go:712.41,715.2 2 0 -github.com/ethereum/go-ethereum/rlp/decode.go:717.52,719.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:722.2,722.14 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:719.16,721.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:723.12,724.21 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:727.3,728.32 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:729.14,730.31 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:733.3,734.10 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:745.10,746.30 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:724.21,726.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:730.31,732.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:735.28,737.25 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:738.19,739.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:740.28,741.26 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:742.11,743.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:753.39,755.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:758.2,758.13 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:755.16,757.3 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:759.9,760.20 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:761.9,762.19 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:763.10,764.66 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:771.50,773.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:776.2,776.18 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:783.2,783.44 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:786.2,789.18 4 1 -github.com/ethereum/go-ethereum/rlp/decode.go:773.16,775.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:776.18,778.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:783.44,785.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:794.34,796.49 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:801.2,804.12 4 1 -github.com/ethereum/go-ethereum/rlp/decode.go:796.49,798.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:798.8,798.26 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:798.26,800.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:809.40,812.2 2 0 -github.com/ethereum/go-ethereum/rlp/decode.go:815.45,817.42 2 0 -github.com/ethereum/go-ethereum/rlp/decode.go:820.2,820.15 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:817.42,819.3 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:823.51,826.9 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:858.2,858.39 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:862.2,863.12 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:827.18,828.13 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:829.20,830.27 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:831.20,834.14 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:835.17,837.14 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:838.38,842.44 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:846.3,846.35 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:849.10,852.44 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:842.44,844.4 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:846.35,848.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:852.44,854.4 1 0 -github.com/ethereum/go-ethereum/rlp/decode.go:858.39,860.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:869.48,870.16 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:873.2,875.32 3 1 -github.com/ethereum/go-ethereum/rlp/decode.go:878.2,878.18 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:881.2,882.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:886.2,887.65 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:891.2,891.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:870.16,872.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:875.32,877.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:878.18,880.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:882.16,884.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:887.65,890.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:900.56,901.20 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:922.2,923.9 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:926.2,933.24 7 1 -github.com/ethereum/go-ethereum/rlp/decode.go:901.20,904.3 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:904.8,907.25 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:908.22,910.20 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:911.22,913.20 2 0 -github.com/ethereum/go-ethereum/rlp/decode.go:914.24,916.20 2 0 -github.com/ethereum/go-ethereum/rlp/decode.go:917.11,918.21 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:923.9,925.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:947.61,948.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:954.2,955.30 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:959.2,960.22 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:971.2,971.34 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:948.17,950.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:955.30,957.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:960.22,965.35 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:965.35,967.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:967.9,967.47 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:967.47,969.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:974.65,976.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:989.2,990.9 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:976.16,977.24 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:987.3,987.19 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:977.24,980.15 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:981.29,982.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:983.26,984.17 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:991.16,995.22 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:996.16,1000.39 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1001.16,1009.30 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1012.3,1012.27 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1013.16,1019.37 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1020.10,1027.30 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1030.3,1030.25 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1009.30,1011.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1027.30,1029.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1034.54,1035.14 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1036.9,1038.16 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1039.9,1041.24 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1042.10,1044.25 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1047.3,1048.52 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1051.3,1051.25 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1056.3,1056.49 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1044.25,1046.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1048.52,1050.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1051.25,1055.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1061.51,1062.53 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1065.2,1066.33 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1070.2,1070.19 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1079.2,1079.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1062.53,1064.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1066.33,1069.3 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1070.19,1071.19 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1071.19,1073.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1073.9,1077.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1083.43,1084.38 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1087.2,1088.19 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1091.2,1091.15 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1084.38,1086.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1088.19,1090.3 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1096.43,1099.44 2 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1105.2,1105.15 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1111.2,1111.12 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1099.44,1100.16 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1103.3,1103.38 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1100.16,1102.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1105.15,1106.22 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1109.3,1109.19 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1106.22,1108.4 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1115.58,1116.23 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1119.2,1119.38 1 1 -github.com/ethereum/go-ethereum/rlp/decode.go:1116.23,1118.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:10.51,11.27 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:12.20,14.47 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:18.3,18.24 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:21.3,21.31 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:24.3,24.49 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:25.20,26.23 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:27.19,28.22 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:29.24,30.27 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:31.18,32.21 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:33.22,34.21 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:35.24,36.22 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:37.20,38.23 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:39.21,40.24 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:41.10,42.46 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:14.47,17.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:18.24,20.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:21.31,23.4 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:47.78,50.27 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:51.20,53.10 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:63.35,64.73 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:65.58,66.37 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:67.32,68.39 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:69.10,70.46 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:54.24,55.12 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:56.49,57.36 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:58.26,59.37 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:60.11,61.50 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:75.36,77.9 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:80.2,81.64 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:77.9,79.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:85.34,88.2 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:90.51,91.6 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:91.6,93.15 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:96.3,96.10 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/types.go:93.15,95.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:24.63,34.2 4 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:36.58,38.2 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:40.58,42.2 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:45.76,46.54 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:51.2,52.6 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:61.2,70.20 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:75.2,75.10 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:46.54,48.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:52.6,54.19 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:57.3,57.14 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:54.19,55.9 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:71.50,73.40 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:87.58,92.2 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:94.38,98.2 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:100.36,102.2 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:104.47,105.34 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:109.2,109.32 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:105.34,107.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:113.47,115.29 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:118.2,119.12 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:115.29,117.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:123.59,124.40 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:127.2,129.19 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:124.40,126.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:152.64,155.9 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:175.2,175.16 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:156.26,160.43 4 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:161.51,166.26 5 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:167.28,171.45 4 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:172.10,173.58 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:178.59,179.25 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:182.2,189.3 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:179.25,180.50 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:192.47,201.2 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:203.47,205.2 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:207.48,209.2 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:211.62,212.31 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:215.2,215.53 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:212.31,214.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:218.63,224.22 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:232.2,235.32 4 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:240.2,240.27 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:224.22,229.3 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:235.32,239.3 3 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:249.92,251.17 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:254.2,254.29 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:251.17,253.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:257.66,259.2 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:261.67,268.2 5 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:277.63,284.17 6 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:287.2,290.16 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:300.2,300.19 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:284.17,286.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:290.16,298.3 7 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:303.64,311.17 6 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:314.2,314.27 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:311.17,313.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:325.71,327.2 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:329.72,338.2 6 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:348.90,350.16 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:353.2,356.16 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:363.2,363.16 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:350.16,352.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:356.16,359.3 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:359.8,362.3 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:366.60,376.29 4 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:382.2,388.19 7 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:376.29,378.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:378.8,380.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:391.61,393.15 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:401.2,407.42 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:412.2,420.28 9 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:393.15,396.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:407.42,409.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:409.8,411.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:437.91,440.39 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:452.2,453.16 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:458.2,459.31 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:477.2,477.16 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:440.39,449.3 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:453.16,455.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:459.31,462.63 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:465.3,467.17 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:470.3,471.19 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:462.63,464.4 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:467.17,469.4 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:471.19,473.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:473.9,475.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:480.67,481.14 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:484.2,484.12 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:481.14,483.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:487.63,491.34 4 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:495.2,497.19 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:491.34,494.3 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:500.84,501.33 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:505.2,506.42 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:512.2,512.42 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:501.33,503.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:506.42,510.3 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:512.42,515.47 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:521.3,523.24 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:515.47,516.13 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:519.4,519.20 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:516.13,518.5 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:527.64,532.21 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:539.2,546.34 6 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:552.2,555.28 4 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:532.21,534.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:534.8,536.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:546.34,551.3 4 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:558.91,560.42 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:568.2,568.19 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:560.42,567.3 6 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:577.69,579.16 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:582.2,582.47 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:579.16,581.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:585.62,599.2 8 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:601.63,614.2 11 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:616.102,617.27 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:618.20,619.20 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:622.3,622.31 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:625.3,625.26 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:629.3,629.50 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:630.22,631.27 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:635.3,635.26 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:641.3,641.26 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:645.3,645.42 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:646.20,647.31 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:648.21,649.38 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:650.20,652.44 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:655.3,655.31 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:656.20,658.44 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:661.3,661.58 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:662.10,663.52 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:619.20,621.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:622.31,624.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:625.26,627.4 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:631.27,633.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:635.26,636.27 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:639.4,639.85 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:636.27,638.5 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:641.26,643.4 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:652.44,654.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:658.44,660.4 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:668.65,680.2 10 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:683.65,695.2 10 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:697.93,702.16 4 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:706.2,711.13 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:714.2,714.13 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:718.2,720.40 3 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:723.2,723.13 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:727.2,727.13 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:732.2,734.30 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:702.16,704.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:711.13,713.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:714.13,716.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:720.40,722.3 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:723.13,726.3 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/gen.go:727.13,730.3 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:33.13,50.16 5 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:53.2,53.20 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:50.16,52.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:53.20,55.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:55.8,55.69 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:55.69,57.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:60.33,63.2 2 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:74.55,82.16 3 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:85.2,85.18 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:88.2,95.23 3 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:105.2,109.16 3 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:112.2,113.16 2 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:119.2,123.45 5 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:82.16,84.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:85.18,87.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:95.23,96.24 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:99.3,99.36 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:96.24,98.4 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:99.36,101.4 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:101.9,103.4 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:109.16,111.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:113.16,115.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:126.78,128.16 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:131.2,132.9 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:135.2,135.17 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:128.16,130.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:132.9,134.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:138.72,140.16 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:143.2,144.9 2 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:147.2,147.39 1 1 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:140.16,142.3 1 0 -github.com/ethereum/go-ethereum/rlp/rlpgen/main.go:144.9,146.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:57.48,59.2 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:60.48,62.2 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:63.48,65.2 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:68.50,70.33 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:75.2,75.23 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:78.2,78.12 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:70.33,71.41 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:71.41,73.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:75.23,77.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:105.40,107.16 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:110.2,110.20 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:107.16,109.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:114.60,117.20 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:122.2,123.23 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:129.2,130.9 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:168.2,168.26 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:117.20,120.3 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:123.23,125.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:125.8,125.29 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:125.29,127.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:131.32,133.29 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:136.3,146.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:147.30,157.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:158.10,166.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:133.29,135.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:214.31,216.2 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:220.34,221.37 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:224.2,224.15 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:221.37,223.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:227.39,228.22 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:232.2,233.27 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:228.22,230.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:255.106,257.16 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:260.2,260.43 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:257.16,259.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:264.87,266.50 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:275.2,275.34 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:278.2,278.41 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:281.2,282.53 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:289.2,289.14 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:266.50,267.27 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:272.3,272.15 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:267.27,268.18 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:268.18,270.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:275.34,277.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:278.41,280.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:282.53,283.65 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:283.65,284.29 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:284.29,286.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:296.74,299.19 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:306.2,307.27 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:319.2,319.23 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:299.19,303.3 3 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:307.27,310.44 3 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:316.3,317.26 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:310.44,315.4 4 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:323.72,325.2 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:331.123,332.45 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:336.2,339.73 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:344.2,347.53 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:397.2,397.28 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:332.45,334.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:339.73,341.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:347.53,350.38 3 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:350.38,352.11 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:356.4,358.36 3 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:378.4,378.55 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:352.11,354.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:358.36,359.43 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:359.43,361.13 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:364.6,365.20 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:368.6,368.54 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:361.13,363.7 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:365.20,367.7 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:369.11,371.20 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:374.6,374.35 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:371.20,373.7 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:379.9,379.48 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:379.48,381.11 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:384.4,385.18 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:388.4,388.47 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:381.11,383.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:385.18,387.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:389.9,391.18 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:394.4,394.27 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:391.18,393.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:401.53,402.29 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:403.14,404.17 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:405.21,406.17 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:407.14,409.17 2 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:412.3,412.21 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:413.10,414.20 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:409.17,411.4 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:418.75,424.43 2 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:439.2,439.30 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:457.2,457.14 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:460.2,460.25 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:463.2,463.31 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:466.2,466.15 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:424.43,426.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:426.8,428.41 2 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:433.3,434.17 2 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:437.3,437.20 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:428.41,430.4 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:430.9,432.4 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:434.17,436.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:440.29,441.20 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:442.14,444.62 2 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:447.3,447.31 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:448.15,451.29 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:444.62,446.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:451.29,453.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:453.9,455.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:457.14,459.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:460.25,462.3 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:463.31,465.3 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:471.115,472.17 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:503.2,503.41 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:521.2,521.77 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:528.2,528.59 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:473.17,475.47 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:478.3,480.21 3 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:481.14,483.10 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:486.3,486.16 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:489.3,489.51 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:490.16,492.10 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:495.3,495.47 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:496.15,498.10 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:501.3,501.43 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:475.47,477.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:483.10,485.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:486.16,488.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:492.10,494.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:498.10,500.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:503.41,506.17 3 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:509.3,509.32 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:512.3,512.77 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:506.17,508.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:509.32,511.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:512.77,514.4 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:514.9,519.4 3 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:521.77,523.17 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:526.3,526.32 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:523.17,525.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:534.68,536.2 1 1 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:539.46,540.51 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:543.2,543.52 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:546.2,546.12 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:540.51,542.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:543.52,545.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:550.58,558.2 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:562.64,564.16 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:567.2,568.16 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:571.2,582.18 4 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:564.16,566.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:568.16,570.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:585.115,589.53 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:634.2,634.20 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:589.53,596.22 4 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:632.3,632.32 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:596.22,599.33 3 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:599.33,600.43 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:600.43,603.20 3 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:606.6,606.28 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:603.20,605.7 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:607.11,609.20 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:612.6,612.34 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:609.20,611.7 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:615.9,615.48 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:615.48,616.61 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:616.61,618.19 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:621.5,621.27 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:618.19,620.6 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:622.10,624.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:625.9,627.18 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:630.4,630.32 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:627.18,629.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:637.81,638.17 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:654.2,654.41 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:658.2,658.77 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:665.2,665.53 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:639.17,640.48 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:645.14,646.44 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:651.25,652.42 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:640.48,642.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:642.9,644.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:646.44,648.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:648.9,650.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:654.41,657.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:658.77,659.60 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:659.60,661.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:661.9,663.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:669.33,670.34 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:696.2,696.12 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:670.34,671.24 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:674.3,674.35 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:671.24,673.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:674.35,675.30 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:678.4,678.30 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:681.4,681.31 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:684.4,684.33 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:675.30,677.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:678.30,680.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:681.31,683.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:684.33,685.50 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:688.5,688.64 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:685.50,687.6 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:688.64,690.6 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:691.10,691.50 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:691.50,693.5 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:700.54,706.31 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:709.2,774.32 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:777.2,790.31 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:793.2,806.32 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:809.2,809.14 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:706.31,708.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:774.32,776.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:790.31,792.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:806.32,808.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:814.49,815.143 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:819.2,819.12 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:815.143,817.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:823.61,826.27 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:830.2,830.26 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:834.2,834.29 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:838.2,838.39 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:842.2,842.26 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:845.2,845.16 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:826.27,828.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:830.26,832.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:834.29,836.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:838.39,840.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:842.26,844.3 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:857.52,861.50 4 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:874.2,874.24 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:861.50,863.29 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:863.29,866.4 2 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:867.8,868.23 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:868.23,870.4 1 0 -github.com/ethereum/go-ethereum/signer/core/apitypes/types.go:870.9,872.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:34.64,40.11 5 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:43.2,44.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:47.2,47.42 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:40.11,42.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:44.16,46.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:52.66,57.21 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:60.2,60.51 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:57.21,59.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:66.66,70.16 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:73.2,73.26 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:80.2,80.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:70.16,72.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:73.26,74.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:74.33,75.59 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:75.59,77.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:85.67,90.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:92.67,93.16 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:96.2,97.27 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:102.2,102.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:93.16,95.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:97.27,98.67 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:98.67,100.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:107.66,111.16 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:114.2,115.11 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:118.2,118.51 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:121.2,121.50 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:111.16,113.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:115.11,117.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:118.51,120.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:126.83,130.16 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:133.2,133.25 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:141.2,141.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:130.16,132.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:133.25,134.19 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:137.3,137.61 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:134.19,135.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:137.61,139.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:144.72,146.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:148.49,149.70 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:152.2,152.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/connect.go:149.70,151.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:71.37,73.23 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:88.2,88.14 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:74.13,76.24 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:77.13,80.21 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:81.12,84.19 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:85.10,86.50 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:92.41,96.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:99.33,100.16 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:101.21,102.94 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:103.21,104.129 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:105.20,106.186 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/events.go:107.10,108.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:54.36,59.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:62.49,65.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:68.39,70.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:73.38,75.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:78.54,81.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:84.53,86.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:102.103,105.16 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:108.2,110.16 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:113.2,113.37 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:122.2,122.47 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:167.2,167.45 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:105.16,107.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:110.16,112.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:113.37,117.3 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:122.47,129.13 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:143.3,143.7 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:129.13,131.17 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:138.4,138.19 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:131.17,132.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:133.28,133.28 0 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:134.17,135.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:143.7,144.11 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:145.25,146.42 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:149.5,151.63 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:154.5,154.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:159.23,160.15 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:161.16,162.15 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:146.42,147.14 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:151.63,153.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:155.26,155.26 0 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:156.17,157.16 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:171.54,174.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:177.81,180.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:183.64,186.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:189.49,191.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:194.48,196.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:199.59,201.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:204.62,206.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:209.85,212.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:216.58,218.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:222.63,224.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:227.44,229.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:233.71,235.15 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:242.2,243.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:246.2,249.16 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:252.2,253.77 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:257.2,257.16 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:262.2,262.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:235.15,238.17 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:238.17,240.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:243.16,245.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:249.16,251.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:253.77,256.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:257.16,258.63 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:258.63,260.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:274.42,301.2 21 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:304.71,306.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:309.73,310.45 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:315.2,315.30 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:310.45,313.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:319.72,320.44 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:325.2,325.30 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:320.44,323.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:329.72,332.25 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:336.2,338.21 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:342.2,343.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:347.2,350.30 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:332.25,335.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:338.21,341.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:343.16,346.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:354.71,357.25 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:361.2,364.30 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:357.25,360.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:368.71,372.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:375.73,379.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:382.80,392.36 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:399.2,399.41 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:407.2,407.30 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:412.2,413.69 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:422.2,425.36 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:430.2,430.46 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:452.2,453.6 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:392.36,395.37 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:395.37,397.4 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:399.41,401.17 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:404.3,405.13 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:401.17,403.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:407.30,409.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:413.69,416.17 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:416.17,419.4 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:425.36,427.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:430.46,432.17 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:436.3,436.35 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:443.3,443.35 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:432.17,435.4 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:436.35,438.44 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:438.44,441.5 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:443.35,445.44 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:445.44,448.5 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:453.6,454.10 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:455.26,457.53 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:460.4,460.44 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:464.21,465.10 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:457.53,458.13 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:460.44,463.5 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:478.60,480.57 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:498.2,498.21 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:480.57,482.73 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:485.3,486.58 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:482.73,484.4 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:486.58,487.35 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:491.4,492.18 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:495.4,495.65 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:487.35,489.13 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:492.18,494.5 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:506.42,508.62 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:513.2,513.75 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:517.2,517.14 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:508.62,510.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:513.75,515.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:531.75,533.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:538.2,538.32 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:533.16,536.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:542.73,544.63 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:549.2,549.45 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:554.2,554.37 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:544.63,547.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:549.45,552.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:558.71,562.33 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:567.2,568.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:573.2,573.48 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:562.33,565.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:568.16,571.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:577.69,581.29 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:585.2,585.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:581.29,583.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:589.68,593.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:596.70,599.51 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:604.2,604.43 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:599.51,602.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:608.69,611.50 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:616.2,616.43 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:611.50,614.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:620.72,624.64 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:629.2,629.43 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:624.64,627.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:633.75,637.67 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:642.2,642.43 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:637.67,640.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:647.68,650.2 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:653.40,653.55 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:658.68,660.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:663.2,665.21 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:660.16,662.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:670.70,672.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:675.60,677.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:680.61,682.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:685.63,687.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:690.64,692.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:695.76,699.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:703.74,704.82 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:704.82,710.46 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:725.3,725.46 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:740.3,740.35 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:710.46,713.47 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:718.4,718.19 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:722.4,722.46 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:713.47,715.5 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:715.10,717.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:718.19,721.5 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:725.46,728.47 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:733.4,733.19 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:737.4,737.46 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:728.47,730.5 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:730.10,732.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/http.go:733.19,736.5 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:40.92,42.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:46.31,48.28 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:51.2,51.13 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:48.28,50.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:55.60,57.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:57.16,58.53 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:63.65,65.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:68.2,70.6 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:65.16,66.53 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:70.6,71.10 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:72.15,74.10 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:75.17,78.39 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:83.4,83.11 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:90.4,91.40 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:78.39,81.5 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:84.16,86.11 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:87.39,87.39 0 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:91.40,94.5 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:103.69,105.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:114.2,114.6 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:105.16,106.10 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:107.15,109.10 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:110.11,111.54 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:114.6,115.10 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:121.3,126.21 6 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:133.3,135.35 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:158.3,158.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:116.15,118.10 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:119.11,119.11 0 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:126.21,129.4 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:129.9,129.27 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:129.27,132.4 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:135.35,136.11 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:142.4,144.18 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:149.4,149.25 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:137.16,139.11 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:140.32,140.32 0 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:144.18,147.13 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:149.25,152.19 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:155.5,155.14 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:152.19,154.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:164.74,166.33 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:176.2,176.25 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:183.2,183.25 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:191.2,191.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:166.33,169.17 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:173.3,173.21 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:169.17,172.4 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:176.25,177.39 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:181.3,181.52 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:177.39,180.4 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:183.25,185.49 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/mocker.go:185.49,188.4 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:71.81,80.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:83.42,85.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:89.81,93.27 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:104.2,104.47 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:107.2,107.55 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:112.2,112.31 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:117.2,118.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:121.2,129.43 6 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:134.2,136.18 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:93.27,94.48 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:94.48,96.73 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:99.4,99.15 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:96.73,98.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:104.47,106.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:107.55,109.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:112.31,114.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:118.16,120.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:129.43,131.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:140.45,142.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:145.38,146.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:154.2,154.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:146.33,147.16 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:150.3,150.46 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:147.16,148.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:150.46,152.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:158.37,159.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:167.2,167.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:159.33,160.17 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:163.3,163.45 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:160.17,161.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:163.45,165.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:171.46,173.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:177.88,182.17 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:185.2,185.15 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:188.2,189.46 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:193.2,200.16 6 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:203.2,205.16 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:208.2,209.12 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:182.17,184.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:185.15,187.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:189.46,192.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:200.16,202.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:205.16,207.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:214.102,215.15 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:230.2,230.6 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:215.15,223.18 5 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:226.3,228.22 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:223.18,225.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:230.6,231.10 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:232.30,233.11 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:236.4,237.22 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:253.27,254.18 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:257.4,257.10 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:233.11,235.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:239.30,240.29 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:242.31,243.32 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:245.34,246.58 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:248.34,249.61 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:254.18,256.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:263.45,271.37 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:285.2,285.16 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:289.2,294.16 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:298.2,301.12 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:271.37,276.18 4 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:279.3,279.17 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:282.3,283.19 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:276.18,278.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:279.17,281.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:285.16,287.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:294.16,297.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:306.60,310.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:312.60,315.16 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:318.2,319.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:322.2,323.69 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:315.16,317.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:319.16,321.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:328.63,330.17 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:333.2,333.14 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:336.2,337.16 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:340.2,341.72 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:330.17,332.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:333.14,335.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:337.16,339.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:345.59,349.16 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:352.2,352.13 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:355.2,357.12 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:349.16,351.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:352.13,354.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:362.62,366.17 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:369.2,369.14 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:372.2,375.12 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:366.17,368.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:369.14,371.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:379.89,389.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:392.92,402.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:406.48,410.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:412.48,414.12 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:417.2,417.21 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:414.12,416.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:422.54,426.2 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:428.54,429.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:434.2,434.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:429.33,430.31 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:430.31,432.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:439.67,444.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:446.66,449.30 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:453.2,453.25 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:457.2,457.16 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:449.30,451.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:453.25,456.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:462.62,467.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:469.61,470.25 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:474.2,474.18 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:470.25,473.3 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:479.62,484.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:486.62,488.29 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:495.2,495.14 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:488.29,490.18 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:490.18,492.4 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:499.65,504.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:506.65,508.54 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:512.2,512.14 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:508.54,510.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:516.70,521.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:523.70,525.54 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:530.2,530.16 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:525.54,528.3 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:534.67,538.2 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:541.67,543.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:545.53,546.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:551.2,551.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:546.33,547.16 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:547.16,549.4 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:555.69,559.2 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:561.55,562.33 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:567.2,567.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:562.33,563.17 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:563.17,565.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:571.65,575.2 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:577.80,581.12 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:584.2,584.44 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:581.12,583.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:587.66,589.32 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:592.2,593.25 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:598.2,598.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:589.32,591.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:593.25,594.38 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:594.38,596.4 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:603.60,607.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:611.77,615.2 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:617.77,618.54 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:622.2,623.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:626.2,627.18 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:630.2,639.18 5 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:618.54,620.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:623.16,625.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:627.18,629.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:642.60,645.12 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:648.2,648.21 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:645.12,647.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:659.70,663.2 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:665.70,666.22 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:669.2,670.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:673.2,673.13 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:676.2,676.49 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:680.2,681.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:685.2,687.18 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:666.22,668.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:670.16,672.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:673.13,675.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:676.49,678.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:681.16,684.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:691.32,692.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:698.2,698.18 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:692.33,694.37 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:694.37,696.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:703.29,714.2 7 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:729.72,731.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:733.29,736.2 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:739.26,743.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:746.31,750.2 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:753.30,755.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:758.32,760.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:763.41,765.19 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:768.2,770.13 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:765.19,767.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:775.46,785.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:789.48,796.51 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:799.2,800.12 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:796.51,798.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:821.32,822.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:825.2,825.19 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:828.2,828.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:822.17,824.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:825.19,827.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:832.32,834.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:846.31,848.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:853.48,855.55 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:862.2,862.44 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:855.55,858.3 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:858.8,861.3 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:881.51,883.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:885.108,887.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:889.96,895.33 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:935.2,935.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:940.2,940.18 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:895.33,897.17 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:900.3,901.17 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:904.3,905.38 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:917.3,917.30 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:897.17,898.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:901.17,903.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:905.38,907.61 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:913.4,913.16 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:907.61,908.22 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:908.22,910.11 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:913.16,915.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:917.30,919.61 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:932.4,932.58 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:919.61,921.42 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:927.5,927.17 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:921.42,922.22 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:922.22,924.12 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:927.17,929.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:935.33,936.14 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:936.14,938.4 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:947.48,949.31 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:962.2,973.12 7 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1023.2,1023.34 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1035.2,1035.9 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1042.2,1042.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:949.31,950.65 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:953.3,953.19 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:956.3,956.79 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:950.65,952.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:953.19,954.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:956.79,958.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:973.12,980.7 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:980.7,981.11 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:982.23,985.18 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:989.5,989.32 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:992.5,994.19 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1002.5,1002.37 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1015.16,1017.11 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:985.18,986.14 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:989.32,990.14 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:994.19,999.14 3 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1002.37,1003.62 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1003.62,1006.36 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1012.7,1012.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1006.36,1010.8 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1023.34,1025.67 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1030.3,1030.59 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1025.67,1028.12 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1030.59,1032.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1037.22,1037.22 0 1 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1039.41,1040.60 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1046.51,1047.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1047.6,1048.10 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1049.30,1050.11 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1053.4,1053.21 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1056.20,1057.10 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1050.11,1052.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1053.21,1055.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1062.55,1064.20 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1065.21,1066.53 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1069.21,1070.53 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1073.20,1074.41 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1066.53,1068.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1070.53,1072.4 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1078.54,1079.18 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1083.2,1083.64 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1086.2,1086.31 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1079.18,1081.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1083.64,1085.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1089.54,1090.15 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1093.2,1093.49 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/network.go:1090.15,1092.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:33.50,37.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:41.80,45.15 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:48.2,52.41 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:58.2,59.39 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:62.2,62.38 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:90.2,90.8 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:45.15,45.49 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:52.41,55.3 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:59.39,61.3 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:62.38,63.10 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:64.29,66.31 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:71.4,71.38 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:76.4,77.18 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:81.4,81.12 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:84.21,86.10 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:66.31,67.13 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:71.38,72.13 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:77.18,80.5 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:81.12,83.5 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:93.62,98.12 5 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:110.2,110.16 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:98.12,101.7 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:101.7,102.11 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:103.27,104.63 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:105.16,106.11 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:110.16,113.3 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/simulation.go:136.34,140.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:34.67,38.2 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:40.50,46.58 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:46.58,47.19 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:51.5,52.15 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:47.19,50.6 2 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:54.33,56.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:57.44,59.5 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:65.40,67.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:69.37,71.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:73.36,75.2 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:77.61,80.25 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:80.25,81.30 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:81.30,83.40 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:83.40,84.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:84.17,86.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:87.10,88.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:88.17,90.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:96.62,99.25 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:99.25,100.30 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:100.30,102.16 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:102.16,103.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:103.17,105.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:106.10,107.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:107.17,109.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:115.61,119.26 4 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:127.2,128.25 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:119.26,120.33 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:120.33,121.36 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:121.36,123.5 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:128.25,130.3 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:133.78,136.25 3 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:136.25,137.30 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:137.30,139.44 2 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:139.44,140.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:140.17,142.6 1 0 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:143.10,144.17 1 1 -github.com/ethereum/go-ethereum/p2p/simulations/test.go:144.17,146.6 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:30.41,32.2 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:33.40,35.2 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:36.46,38.2 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:39.47,41.2 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:42.40,44.2 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:45.45,47.2 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146894.40,146896.2 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146898.35,146900.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146904.2,146906.15 3 1 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146900.16,146902.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146912.41,146914.42 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146921.2,146921.52 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146914.42,146916.17 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146919.3,146919.22 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146916.17,146918.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146925.47,146928.2 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146932.36,146934.16 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146938.2,146938.10 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146934.16,146935.54 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146943.42,146945.2 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146950.50,146952.42 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146959.2,146959.56 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146952.42,146954.17 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146957.3,146957.21 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146954.17,146956.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146964.58,146966.42 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146973.2,146973.74 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146966.42,146968.17 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146971.3,146971.23 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146968.17,146970.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146977.54,146979.29 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146986.2,146986.16 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146979.29,146981.17 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146984.3,146984.22 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146981.17,146983.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146990.28,146992.29 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146995.2,146995.14 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:146992.29,146994.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147016.46,147018.20 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147028.2,147028.22 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147031.2,147032.39 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147035.2,147035.16 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147018.20,147021.30 3 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147021.30,147023.19 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147023.19,147025.5 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147028.22,147030.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147032.39,147034.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147048.43,147050.16 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147053.2,147054.16 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147057.2,147058.16 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147061.2,147062.16 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147065.2,147065.73 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147050.16,147052.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147054.16,147056.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147058.16,147060.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147062.16,147064.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147069.44,147072.16 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147076.2,147076.33 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147082.2,147082.12 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147072.16,147074.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147076.33,147078.17 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147078.17,147080.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/4byte.go:147085.41,147088.2 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:45.44,47.33 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:53.2,53.64 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:48.20,49.23 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:50.10,51.33 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:57.43,59.32 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:62.2,62.64 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:59.32,61.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:67.81,70.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:74.2,74.49 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:70.16,72.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:79.62,81.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:85.2,85.57 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:81.16,83.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:90.88,92.23 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:95.2,98.26 3 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:102.2,103.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:106.2,107.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:110.2,111.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:115.2,116.42 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:126.2,127.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:130.2,130.36 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:135.2,135.22 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:92.23,94.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:98.26,100.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:103.16,105.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:107.16,109.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:111.16,113.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:116.42,121.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:127.16,129.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/abi.go:130.36,134.3 3 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:41.27,46.2 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:49.31,51.2 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:59.50,61.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:64.2,67.66 3 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:70.2,70.16 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:61.16,63.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:67.66,69.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:76.50,81.16 4 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:84.2,84.59 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:88.2,88.41 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:96.2,96.16 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:81.16,83.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:84.59,86.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:88.41,89.52 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:92.3,92.58 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:89.52,91.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:92.58,94.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:100.39,102.2 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:107.57,108.17 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:111.2,112.50 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:115.2,115.48 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:118.2,118.54 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:108.17,110.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:112.50,114.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:115.48,117.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:126.69,128.19 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:131.2,131.49 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:135.2,136.25 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:139.2,140.16 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:143.2,143.52 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:128.19,130.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:131.49,133.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:136.25,138.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/fourbyte.go:140.16,142.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:32.122,36.76 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:40.2,41.21 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:45.2,45.20 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:49.2,49.18 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:70.2,70.28 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:73.2,73.68 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:76.2,76.9 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:87.2,88.22 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:36.76,38.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:41.21,44.3 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:45.20,47.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:49.18,53.21 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:64.3,64.22 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:67.3,67.23 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:53.21,55.47 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:59.4,59.71 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:55.47,57.5 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:60.9,60.28 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:60.28,62.4 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:64.22,66.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:70.28,72.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:73.68,75.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:77.52,78.68 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:79.60,80.76 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:81.52,82.65 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:83.60,84.73 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:93.108,95.20 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:99.2,99.19 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:103.2,103.35 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:107.2,107.21 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:117.2,118.16 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:122.2,122.61 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:95.20,97.3 1 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:99.19,102.3 2 1 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:103.35,105.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:107.21,108.63 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:114.3,114.9 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:108.63,110.4 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:110.9,113.4 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:118.16,121.3 2 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:122.61,124.3 1 0 -github.com/ethereum/go-ethereum/signer/fourbyte/validation.go:124.8,126.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:48.79,53.2 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:56.54,57.19 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:60.2,61.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:65.2,66.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:70.2,72.53 3 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:57.19,59.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:61.16,64.3 2 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:66.16,69.3 2 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:72.53,74.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:79.63,80.19 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:83.2,84.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:88.2,89.12 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:93.2,94.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:98.2,98.27 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:80.19,82.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:84.16,87.3 2 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:89.12,92.3 2 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:94.16,97.3 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:102.47,104.16 2 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:108.2,109.53 2 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:104.16,107.3 2 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:109.53,111.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:115.91,119.16 3 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:126.2,126.51 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:130.2,130.19 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:119.16,120.25 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:124.3,124.79 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:120.25,123.4 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:126.51,129.3 2 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:134.94,136.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:139.2,139.63 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:142.2,142.12 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:136.16,138.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:139.63,141.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:148.91,150.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:153.2,154.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:157.2,158.59 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:161.2,162.31 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:150.16,152.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:154.16,156.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:158.59,160.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:165.98,167.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:170.2,171.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:174.2,175.16 2 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:178.2,178.23 1 1 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:167.16,169.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:171.16,173.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/aes_gcm_storage.go:175.16,177.3 1 1 -github.com/ethereum/go-ethereum/signer/storage/storage.go:48.51,49.19 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:52.2,52.21 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:49.19,51.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:57.60,58.19 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:61.2,61.30 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:64.2,64.24 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:58.19,60.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:61.30,63.3 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:68.44,70.2 1 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:72.36,77.2 2 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:82.45,82.46 0 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:83.45,83.46 0 0 -github.com/ethereum/go-ethereum/signer/storage/storage.go:84.53,86.2 1 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:39.55,41.42 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:44.2,45.25 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:41.42,43.3 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:56.93,64.2 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:65.62,67.2 0 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:69.56,72.2 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:73.83,85.64 7 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:94.2,94.64 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:99.2,103.16 3 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:107.2,111.16 3 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:121.2,122.16 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:127.2,128.24 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:133.2,133.27 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:85.64,87.16 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:92.3,92.21 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:87.16,89.4 1 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:89.9,91.4 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:94.64,98.3 3 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:103.16,106.3 2 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:111.16,114.3 2 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:122.16,125.3 2 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:128.24,130.3 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:130.8,132.3 1 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:136.89,137.16 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:140.2,141.16 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:145.2,146.25 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:153.2,153.46 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:137.16,139.3 1 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:141.16,144.3 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:146.25,149.3 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:149.8,149.31 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:149.31,152.3 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:156.89,159.16 3 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:164.2,164.14 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:170.2,170.50 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:159.16,162.3 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:164.14,169.3 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:173.99,176.16 3 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:180.2,180.14 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:183.2,183.52 1 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:176.16,179.3 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:180.14,182.3 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:187.97,189.2 1 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:191.90,194.16 3 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:198.2,198.14 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:201.2,201.33 1 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:194.16,197.3 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:198.14,200.3 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:204.105,208.2 1 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:210.47,213.2 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:215.46,218.2 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:220.60,222.16 2 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:226.2,228.16 3 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:222.16,225.3 2 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:228.16,230.3 1 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:233.67,235.16 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:239.2,240.16 2 1 -github.com/ethereum/go-ethereum/signer/rules/rules.go:235.16,238.3 2 0 -github.com/ethereum/go-ethereum/signer/rules/rules.go:240.16,242.3 1 1 -github.com/ethereum/go-ethereum/signer/core/cliui.go:38.40,40.2 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:42.62,44.2 0 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:48.46,49.6 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:49.6,52.17 3 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:55.3,55.49 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:52.17,54.4 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:55.49,57.4 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:61.92,65.21 3 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:73.2,74.37 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:65.21,67.17 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:71.3,71.38 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:67.17,70.4 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:78.41,80.28 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:83.2,84.14 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:80.28,82.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:89.45,90.22 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:93.2,93.31 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:90.22,92.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:96.38,100.2 3 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:103.84,108.45 5 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:116.2,119.45 4 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:125.2,126.60 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:129.2,129.57 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:138.2,138.37 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:144.2,144.29 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:152.2,155.19 4 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:158.2,158.55 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:108.45,110.26 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:110.26,112.4 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:113.8,115.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:119.45,122.3 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:122.8,124.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:126.60,128.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:129.57,131.28 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:131.28,133.40 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:133.40,135.5 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:138.37,140.17 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:140.17,142.4 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:144.29,146.38 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:149.3,149.16 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:146.38,148.4 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:155.19,157.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:162.94,168.32 5 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:175.2,176.39 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:179.2,183.19 5 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:186.2,186.36 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:168.32,170.38 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:173.3,173.16 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:170.38,172.4 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:176.39,178.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:183.19,185.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:191.85,198.43 6 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:202.2,204.19 3 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:207.2,207.44 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:198.43,201.3 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:204.19,206.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:211.100,221.19 8 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:224.2,224.38 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:221.19,223.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:228.52,231.2 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:234.51,236.2 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:238.72,240.67 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:240.67,242.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:242.8,244.3 1 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:247.60,250.30 2 0 -github.com/ethereum/go-ethereum/signer/core/cliui.go:250.30,252.3 1 0 -github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:38.58,40.20 2 1 -github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:43.2,44.23 2 1 -github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:48.2,82.24 2 1 -github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:40.20,42.3 1 1 -github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:44.23,46.3 1 1 -github.com/ethereum/go-ethereum/signer/core/gnosis_safe.go:87.66,101.2 3 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:39.87,43.16 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:46.2,46.19 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:50.2,52.16 3 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:55.2,58.16 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:62.2,63.16 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:66.2,66.13 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:69.2,69.23 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:43.16,45.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:46.19,48.3 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:52.16,54.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:58.16,60.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:63.16,65.3 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:66.13,68.3 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:76.144,78.16 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:81.2,82.16 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:86.2,86.23 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:78.16,80.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:82.16,85.3 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:95.169,101.16 3 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:105.2,105.19 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:194.2,196.31 3 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:101.16,103.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:106.39,109.17 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:112.3,135.106 3 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:136.39,139.10 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:142.3,143.17 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:146.3,147.61 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:151.3,151.29 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:158.3,159.17 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:162.3,171.104 3 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:172.10,176.43 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:109.17,111.4 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:139.10,141.4 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:143.17,145.4 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:147.61,149.4 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:151.29,156.4 3 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:159.17,161.4 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:176.43,178.4 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:178.9,179.63 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:179.63,181.5 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:181.10,191.5 3 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:202.86,205.2 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:214.81,215.28 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:219.2,221.23 3 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:215.28,218.3 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:229.141,232.2 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:237.119,239.16 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:242.2,243.16 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:246.2,249.16 4 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:252.2,258.31 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:261.2,262.16 2 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:266.2,266.32 1 1 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:239.16,241.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:243.16,245.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:249.16,251.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:258.31,260.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:262.16,265.3 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:271.117,283.20 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:286.2,286.36 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:289.2,292.16 4 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:295.2,295.42 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:283.20,285.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:286.36,288.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:292.16,294.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:299.79,301.9 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:304.2,305.9 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:308.2,309.16 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:312.2,312.32 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:316.2,317.9 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:320.2,321.16 2 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:324.2,324.35 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:328.2,331.8 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:301.9,303.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:305.9,307.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:309.16,311.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:312.32,314.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:317.9,319.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:321.16,323.3 1 0 -github.com/ethereum/go-ethereum/signer/core/signed_data.go:324.35,326.3 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:31.28,33.16 2 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:36.2,37.11 2 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:33.16,35.3 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:40.55,42.2 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:45.94,47.16 2 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:50.2,50.12 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:47.16,49.3 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:54.73,57.16 3 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:60.2,60.12 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:57.16,59.3 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:63.78,67.2 3 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:69.88,73.2 3 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:75.79,79.2 3 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:81.94,85.2 3 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:87.46,89.16 2 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:89.16,91.3 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:94.45,96.16 2 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:96.16,98.3 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:100.66,102.16 2 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:102.16,104.3 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:107.54,109.16 2 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:109.16,111.3 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:113.86,116.16 3 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:119.2,119.20 1 0 -github.com/ethereum/go-ethereum/signer/core/stdioui.go:116.16,118.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:47.53,49.2 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:55.85,57.40 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:60.2,60.18 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:57.40,59.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:75.49,77.40 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:90.2,90.16 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:77.40,85.21 3 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:88.3,88.33 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:85.21,87.4 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:97.99,99.16 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:102.2,103.16 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:106.2,106.16 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:109.2,109.39 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:99.16,101.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:103.16,105.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:106.16,108.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:113.61,115.2 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:121.95,123.16 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:126.2,126.57 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:130.2,130.55 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:123.16,125.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:126.57,128.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:139.72,141.16 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:144.2,145.23 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:148.2,148.26 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:141.16,143.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:145.23,147.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:154.53,156.2 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:161.78,164.2 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:169.97,172.16 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:175.2,175.52 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:178.2,178.43 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:172.16,174.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:175.52,177.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:186.141,189.18 2 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:192.2,192.62 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:195.2,195.81 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:189.18,191.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:192.62,194.3 1 0 -github.com/ethereum/go-ethereum/signer/core/uiapi.go:204.74,206.2 1 0 -github.com/ethereum/go-ethereum/signer/core/validation.go:28.52,29.24 1 1 -github.com/ethereum/go-ethereum/signer/core/validation.go:32.2,32.47 1 1 -github.com/ethereum/go-ethereum/signer/core/validation.go:35.2,35.12 1 1 -github.com/ethereum/go-ethereum/signer/core/validation.go:29.24,31.3 1 1 -github.com/ethereum/go-ethereum/signer/core/validation.go:32.47,34.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:131.104,136.14 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:140.2,140.25 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:143.2,143.12 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:168.2,168.21 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:187.2,187.89 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:136.14,138.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:140.25,142.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:143.12,145.61 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:152.3,152.68 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:159.3,159.71 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:145.61,147.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:147.9,150.4 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:152.68,154.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:154.9,157.4 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:159.71,161.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:161.9,164.4 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:168.21,171.17 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:171.17,173.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:173.9,174.46 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:174.46,176.5 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:176.10,177.87 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:177.87,179.6 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:179.11,181.6 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:191.56,196.26 3 1 -github.com/ethereum/go-ethereum/signer/core/api.go:202.2,202.27 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:205.2,205.26 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:208.2,210.10 3 1 -github.com/ethereum/go-ethereum/signer/core/api.go:196.26,197.31 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:200.3,200.28 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:197.31,199.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:202.27,204.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:205.26,207.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:214.35,216.16 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:219.2,219.20 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:216.16,218.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:284.164,285.18 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:288.2,289.12 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:292.2,292.15 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:285.18,287.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:289.12,291.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:294.52,306.16 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:312.2,313.16 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:317.2,318.16 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:306.16,309.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:313.16,316.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:318.16,321.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:326.42,331.38 4 0 -github.com/ethereum/go-ethereum/signer/core/api.go:339.2,339.32 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:331.38,332.41 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:332.41,334.43 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:334.43,336.5 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:343.72,345.28 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:345.28,346.21 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:347.31,348.48 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:354.30,357.70 3 0 -github.com/ethereum/go-ethereum/signer/core/api.go:368.4,370.45 3 0 -github.com/ethereum/go-ethereum/signer/core/api.go:381.31,383.24 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:348.48,350.44 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:350.44,352.6 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:357.70,359.32 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:359.32,361.65 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:361.65,363.7 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:363.12,365.7 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:370.45,380.5 6 0 -github.com/ethereum/go-ethereum/signer/core/api.go:390.75,394.42 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:397.2,398.16 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:401.2,401.28 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:404.2,405.38 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:408.2,408.23 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:394.42,396.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:398.16,400.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:401.28,403.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:405.38,407.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:414.72,415.64 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:418.2,418.101 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:423.2,423.25 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:415.64,417.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:418.101,420.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:420.8,420.27 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:420.27,422.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:428.60,430.18 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:434.2,434.25 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:455.2,455.64 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:430.18,432.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:434.25,439.17 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:443.3,443.63 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:439.17,441.12 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:443.63,445.4 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:445.9,452.4 5 1 -github.com/ethereum/go-ethereum/signer/core/api.go:461.65,462.52 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:472.2,473.91 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:477.2,477.87 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:481.2,481.71 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:485.2,485.91 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:489.2,489.115 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:493.2,493.99 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:497.2,497.101 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:501.2,501.73 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:515.2,515.75 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:519.2,519.17 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:462.52,465.33 3 1 -github.com/ethereum/go-ethereum/signer/core/api.go:469.3,469.16 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:465.33,467.4 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:473.91,476.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:477.87,480.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:481.71,484.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:485.91,488.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:489.115,492.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:493.99,496.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:497.101,500.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:501.73,504.16 3 0 -github.com/ethereum/go-ethereum/signer/core/api.go:507.3,507.16 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:510.3,510.17 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:504.16,506.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:507.16,509.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:510.17,513.4 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:515.75,518.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:522.78,524.2 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:526.107,528.56 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:532.2,533.16 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:539.2,539.25 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:528.56,530.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:533.16,538.3 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:543.149,549.16 3 1 -github.com/ethereum/go-ethereum/signer/core/api.go:553.2,553.20 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:558.2,558.25 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:566.2,573.16 3 1 -github.com/ethereum/go-ethereum/signer/core/api.go:576.2,576.22 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:580.2,587.16 5 1 -github.com/ethereum/go-ethereum/signer/core/api.go:591.2,595.16 3 1 -github.com/ethereum/go-ethereum/signer/core/api.go:599.2,600.16 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:605.2,606.16 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:609.2,614.23 3 1 -github.com/ethereum/go-ethereum/signer/core/api.go:549.16,551.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:553.20,554.44 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:554.44,556.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:558.25,560.45 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:560.45,564.4 2 0 -github.com/ethereum/go-ethereum/signer/core/api.go:573.16,575.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:576.22,578.3 1 1 -github.com/ethereum/go-ethereum/signer/core/api.go:587.16,589.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:595.16,597.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:600.16,603.3 2 1 -github.com/ethereum/go-ethereum/signer/core/api.go:606.16,608.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:618.170,622.16 3 0 -github.com/ethereum/go-ethereum/signer/core/api.go:626.2,626.20 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:631.2,633.16 3 0 -github.com/ethereum/go-ethereum/signer/core/api.go:636.2,642.23 5 0 -github.com/ethereum/go-ethereum/signer/core/api.go:622.16,624.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:626.20,627.44 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:627.44,629.4 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:633.16,635.3 1 0 -github.com/ethereum/go-ethereum/signer/core/api.go:647.68,649.2 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:35.75,41.2 4 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:43.72,45.2 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:47.149,49.27 2 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:52.2,57.16 3 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:62.2,62.15 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:49.27,51.3 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:57.16,59.3 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:59.8,61.3 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:65.144,72.2 5 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:74.161,76.27 2 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:79.2,83.16 4 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:89.2,89.15 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:76.27,78.3 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:83.16,86.3 2 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:86.8,88.3 1 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:92.136,98.2 4 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:100.117,106.2 4 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:108.68,114.2 4 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:116.73,119.16 3 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:122.2,124.34 3 0 -github.com/ethereum/go-ethereum/signer/core/auditlog.go:119.16,121.3 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:48.40,49.54 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:52.2,52.19 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:55.2,55.28 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:49.54,51.3 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:52.19,54.3 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:59.31,61.16 2 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:66.2,66.42 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:71.2,73.16 3 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:76.2,76.27 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:80.2,81.35 2 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:61.16,63.3 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:66.42,68.3 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:73.16,75.3 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:76.27,78.3 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:84.57,86.9 2 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:92.2,92.12 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:87.29,88.48 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:89.30,90.59 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:96.47,97.23 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:98.15,99.19 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:100.14,101.32 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:108.3,108.19 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:109.21,111.20 2 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:114.3,114.13 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:115.10,116.42 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:101.32,103.11 2 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:106.4,106.14 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:103.11,104.54 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:111.20,113.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:124.64,125.27 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:165.2,165.12 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:126.14,128.17 2 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:131.3,131.15 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:134.16,136.40 2 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:139.3,139.24 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:142.14,144.17 2 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:147.3,147.27 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:150.21,151.37 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:154.3,154.25 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:159.3,159.37 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:162.10,163.47 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:128.17,130.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:131.15,133.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:136.40,138.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:139.24,141.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:144.17,146.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:147.27,149.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:151.37,153.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:154.25,155.52 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:155.52,157.5 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:159.37,161.4 1 0 -github.com/ethereum/go-ethereum/tests/rlp_test_util.go:168.60,172.2 3 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:55.52,57.2 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:129.96,135.43 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:138.2,138.34 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:148.2,148.30 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:135.43,137.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:138.34,139.51 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:139.51,141.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:141.9,142.28 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:145.4,145.31 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:142.28,144.5 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:152.47,154.37 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:159.2,159.12 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:154.37,155.22 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:155.22,157.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:163.125,165.16 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:168.2,171.36 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:174.2,174.69 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:177.2,177.28 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:165.16,167.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:171.36,173.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:174.69,176.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:181.146,183.16 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:186.2,191.35 5 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:199.2,201.16 3 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:206.2,206.28 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:219.2,223.30 5 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:228.2,233.64 5 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:238.2,247.34 4 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:183.16,185.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:191.35,193.21 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:193.21,197.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:201.16,203.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:206.28,209.17 3 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:213.3,213.75 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:209.17,211.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:213.75,215.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:223.30,227.3 3 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:233.64,235.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:250.59,252.2 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:254.117,257.32 3 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:266.2,269.17 3 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:272.2,273.23 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:257.32,261.31 4 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:261.31,263.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:269.17,271.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:276.71,286.30 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:291.2,291.16 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:286.30,290.3 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:294.92,297.28 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:305.2,306.17 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:314.2,314.36 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:317.2,317.38 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:320.2,320.39 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:323.2,328.22 5 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:335.2,336.16 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:339.2,340.69 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:344.2,345.20 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:358.2,358.21 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:362.2,364.17 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:297.28,299.17 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:302.3,302.47 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:299.17,301.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:306.17,308.57 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:308.57,310.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:314.36,316.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:317.38,319.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:320.39,322.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:328.22,330.10 2 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:333.3,333.12 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:330.10,332.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:336.16,338.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:340.69,342.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:345.20,346.29 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:349.3,349.29 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:352.3,352.37 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:355.3,356.20 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:346.29,348.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:349.29,351.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:352.37,354.4 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:358.21,360.3 1 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:367.45,372.2 4 0 -github.com/ethereum/go-ethereum/tests/state_test_util.go:374.44,376.2 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:16.55,33.2 9 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:36.60,46.52 3 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:49.2,49.32 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:52.2,52.33 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:55.2,55.26 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:58.2,58.33 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:61.2,61.35 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:64.2,64.34 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:67.2,67.12 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:46.52,48.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:49.32,51.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:52.33,54.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:55.26,57.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:58.33,60.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:61.35,63.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_difficultytest.go:64.34,66.3 1 0 -github.com/ethereum/go-ethereum/tests/init.go:203.32,205.23 2 0 -github.com/ethereum/go-ethereum/tests/init.go:208.2,209.23 2 0 -github.com/ethereum/go-ethereum/tests/init.go:205.23,207.3 1 0 -github.com/ethereum/go-ethereum/tests/init.go:217.46,219.2 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:18.49,57.2 20 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:60.54,81.52 3 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:84.2,84.22 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:87.2,87.25 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:90.2,90.24 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:93.2,93.22 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:96.2,96.23 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:99.2,99.21 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:102.2,102.27 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:105.2,105.28 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:108.2,108.26 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:111.2,111.33 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:114.2,114.26 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:117.2,117.26 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:120.2,120.27 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:123.2,123.25 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:126.2,126.24 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:129.2,129.26 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:132.2,132.30 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:135.2,135.12 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:81.52,83.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:84.22,86.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:87.25,89.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:90.24,92.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:93.22,95.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:96.23,98.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:99.21,101.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:102.27,104.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:105.28,107.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:108.26,110.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:111.33,113.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:114.26,116.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:117.26,119.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:120.27,122.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:123.25,125.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:126.24,128.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:129.26,131.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_btheader.go:132.30,134.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:17.46,36.2 10 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:39.51,50.52 3 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:53.2,53.25 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:56.2,57.27 2 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:60.2,60.23 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:63.2,63.25 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:66.2,67.23 2 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:70.2,71.26 2 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:74.2,75.24 2 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:78.2,78.12 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:50.52,52.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:53.25,55.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:57.27,59.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:60.23,62.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:63.25,65.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:67.23,69.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:71.26,73.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_stenv.go:75.24,77.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:17.54,38.23 10 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:44.2,46.27 3 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:38.23,40.32 2 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:40.32,42.4 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:50.59,64.52 3 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:67.2,67.25 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:70.2,70.29 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:73.2,73.37 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:76.2,76.22 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:79.2,79.19 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:82.2,82.21 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:85.2,85.28 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:88.2,88.25 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:94.2,94.22 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:97.2,97.27 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:100.2,100.12 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:64.52,66.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:67.25,69.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:70.29,72.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:73.37,75.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:76.22,78.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:79.19,81.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:82.21,84.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:85.28,87.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:88.25,90.34 2 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:90.34,92.4 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:94.22,96.3 1 0 -github.com/ethereum/go-ethereum/tests/gen_sttransaction.go:97.27,99.3 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:47.66,48.139 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:69.2,83.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:109.2,109.12 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:48.139,50.54 2 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:53.3,54.17 2 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:58.3,59.17 2 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:62.3,62.29 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:65.3,66.26 2 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:50.54,52.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:54.17,56.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:59.17,61.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:62.29,64.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:83.4,86.59 2 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:93.3,93.17 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:96.3,96.20 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:99.3,99.54 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:102.3,102.20 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:105.3,105.49 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:86.59,87.18 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:90.4,90.12 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:87.18,89.5 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:93.17,95.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:96.20,98.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:99.54,101.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:102.20,104.4 1 0 -github.com/ethereum/go-ethereum/tests/transaction_test_util.go:105.49,107.4 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:48.52,50.2 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:101.49,103.9 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:108.2,110.16 3 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:113.2,113.42 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:116.2,116.47 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:119.2,120.36 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:125.2,126.17 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:130.2,131.16 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:134.2,137.16 3 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:140.2,141.45 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:144.2,145.16 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:148.2,148.50 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:152.2,152.17 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:157.2,157.54 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:103.9,105.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:110.16,112.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:113.42,115.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:116.47,118.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:120.36,122.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:122.8,124.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:126.17,129.3 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:131.16,133.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:137.16,139.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:141.45,143.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:145.16,147.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:148.50,150.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:152.17,153.79 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:153.79,155.4 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:160.71,175.2 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:189.82,192.35 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:226.2,226.25 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:192.35,194.17 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:202.3,204.17 3 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:211.3,211.27 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:221.3,221.67 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:224.3,224.39 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:194.17,195.28 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:195.28,196.13 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:197.10,199.5 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:204.17,205.28 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:205.28,206.13 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:207.10,209.5 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:211.27,212.74 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:216.4,217.27 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:212.74,215.5 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:221.67,223.4 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:229.58,230.25 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:233.2,233.31 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:236.2,236.31 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:239.2,239.25 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:242.2,242.34 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:245.2,245.35 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:248.2,248.37 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:251.2,251.37 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:254.2,254.28 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:257.2,257.33 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:260.2,260.41 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:263.2,263.42 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:266.2,266.31 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:269.2,269.29 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:272.2,272.28 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:275.2,275.12 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:230.25,232.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:233.31,235.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:236.31,238.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:239.25,241.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:242.34,244.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:245.35,247.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:248.37,250.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:251.37,253.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:254.28,256.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:257.33,259.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:260.41,262.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:263.42,265.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:266.31,268.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:269.29,271.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:272.28,274.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:278.69,280.38 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:295.2,295.12 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:280.38,285.37 4 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:288.3,288.38 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:291.3,291.27 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:285.37,287.4 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:288.38,290.4 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:291.27,293.4 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:298.95,301.32 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:309.2,309.107 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:314.2,314.12 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:301.32,303.3 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:309.107,310.80 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:310.80,312.4 1 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:317.51,319.16 2 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:322.2,324.16 3 0 -github.com/ethereum/go-ethereum/tests/block_test_util.go:319.16,321.3 1 0 -github.com/ethereum/go-ethereum/tests/difficulty_test_util.go:50.67,62.26 5 0 -github.com/ethereum/go-ethereum/tests/difficulty_test_util.go:67.2,67.12 1 0 -github.com/ethereum/go-ethereum/tests/difficulty_test_util.go:62.26,66.3 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:50.81,51.55 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:63.2,63.19 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:51.55,53.17 2 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:61.3,61.19 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:53.17,56.69 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:59.4,59.14 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:56.69,58.5 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:66.72,67.56 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:79.2,79.14 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:67.56,70.17 3 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:73.3,74.37 2 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:77.3,77.14 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:70.17,71.14 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:74.37,75.87 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:87.95,89.28 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:92.2,92.20 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:95.2,95.21 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:113.2,115.41 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:89.28,91.3 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:92.20,94.3 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:95.21,97.30 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:103.3,105.30 3 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:111.3,111.15 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:97.30,99.25 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:99.25,101.5 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:105.30,107.25 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:107.25,109.5 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:118.34,126.30 7 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:150.2,150.10 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:153.2,153.10 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:126.30,128.26 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:142.3,143.17 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:146.3,148.24 3 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:128.26,131.31 3 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:137.4,140.6 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:131.31,133.5 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:133.10,133.38 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:133.38,136.5 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:143.17,144.12 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:150.10,152.3 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:156.29,158.2 1 0 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:160.39,163.11 3 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:169.2,169.10 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:163.11,165.12 2 1 -github.com/ethereum/go-ethereum/tests/fuzzers/abi/abifuzzer.go:165.12,167.4 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/secp256k1/secp_fuzzer.go:29.29,45.52 8 1 -github.com/ethereum/go-ethereum/tests/fuzzers/secp256k1/secp_fuzzer.go:49.2,49.10 1 1 -github.com/ethereum/go-ethereum/tests/fuzzers/secp256k1/secp_fuzzer.go:45.52,47.93 2 0 -github.com/ethereum/go-ethereum/les/client.go:86.78,88.16 2 0 -github.com/ethereum/go-ethereum/les/client.go:91.2,92.16 2 0 -github.com/ethereum/go-ethereum/les/client.go:95.2,96.91 2 0 -github.com/ethereum/go-ethereum/les/client.go:99.2,128.21 6 0 -github.com/ethereum/go-ethereum/les/client.go:131.2,143.23 10 0 -github.com/ethereum/go-ethereum/les/client.go:148.2,148.113 1 0 -github.com/ethereum/go-ethereum/les/client.go:151.2,166.62 8 0 -github.com/ethereum/go-ethereum/les/client.go:172.2,174.30 3 0 -github.com/ethereum/go-ethereum/les/client.go:177.2,180.29 3 0 -github.com/ethereum/go-ethereum/les/client.go:185.2,195.18 6 0 -github.com/ethereum/go-ethereum/les/client.go:88.16,90.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:92.16,94.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:96.91,98.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:128.21,130.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:143.23,145.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:148.113,150.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:166.62,170.3 3 0 -github.com/ethereum/go-ethereum/les/client.go:174.30,176.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:180.29,183.3 2 0 -github.com/ethereum/go-ethereum/les/client.go:199.88,200.19 1 0 -github.com/ethereum/go-ethereum/les/client.go:203.2,206.74 4 0 -github.com/ethereum/go-ethereum/les/client.go:209.2,209.16 1 0 -github.com/ethereum/go-ethereum/les/client.go:200.19,202.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:206.74,208.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:214.56,215.18 1 0 -github.com/ethereum/go-ethereum/les/client.go:227.2,228.75 2 0 -github.com/ethereum/go-ethereum/les/client.go:231.2,233.16 3 0 -github.com/ethereum/go-ethereum/les/client.go:215.18,217.20 2 0 -github.com/ethereum/go-ethereum/les/client.go:220.3,220.88 1 0 -github.com/ethereum/go-ethereum/les/client.go:217.20,219.4 1 0 -github.com/ethereum/go-ethereum/les/client.go:220.88,222.4 1 0 -github.com/ethereum/go-ethereum/les/client.go:222.9,224.4 1 0 -github.com/ethereum/go-ethereum/les/client.go:228.75,230.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:238.56,239.25 1 0 -github.com/ethereum/go-ethereum/les/client.go:244.2,251.50 5 0 -github.com/ethereum/go-ethereum/les/client.go:254.2,254.16 1 0 -github.com/ethereum/go-ethereum/les/client.go:257.2,257.10 1 0 -github.com/ethereum/go-ethereum/les/client.go:239.25,242.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:251.50,253.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:254.16,256.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:263.61,265.2 1 0 -github.com/ethereum/go-ethereum/les/client.go:268.60,270.2 1 0 -github.com/ethereum/go-ethereum/les/client.go:273.49,275.2 1 0 -github.com/ethereum/go-ethereum/les/client.go:278.39,280.2 1 0 -github.com/ethereum/go-ethereum/les/client.go:284.42,320.2 3 0 -github.com/ethereum/go-ethereum/les/client.go:322.64,324.2 1 0 -github.com/ethereum/go-ethereum/les/client.go:326.61,326.84 1 0 -github.com/ethereum/go-ethereum/les/client.go:327.61,327.80 1 0 -github.com/ethereum/go-ethereum/les/client.go:328.61,328.80 1 0 -github.com/ethereum/go-ethereum/les/client.go:329.61,329.102 1 0 -github.com/ethereum/go-ethereum/les/client.go:330.61,330.92 1 0 -github.com/ethereum/go-ethereum/les/client.go:331.61,331.82 1 0 -github.com/ethereum/go-ethereum/les/client.go:332.61,332.80 1 0 -github.com/ethereum/go-ethereum/les/client.go:335.52,336.98 1 0 -github.com/ethereum/go-ethereum/les/client.go:336.98,337.47 1 0 -github.com/ethereum/go-ethereum/les/client.go:340.3,340.13 1 0 -github.com/ethereum/go-ethereum/les/client.go:337.47,339.4 1 0 -github.com/ethereum/go-ethereum/les/client.go:346.39,352.47 3 0 -github.com/ethereum/go-ethereum/les/client.go:356.2,357.16 2 0 -github.com/ethereum/go-ethereum/les/client.go:360.2,367.12 6 0 -github.com/ethereum/go-ethereum/les/client.go:352.47,355.3 2 0 -github.com/ethereum/go-ethereum/les/client.go:357.16,359.3 1 0 -github.com/ethereum/go-ethereum/les/client.go:372.38,395.2 20 0 -github.com/ethereum/go-ethereum/les/metrics.go:122.79,123.22 1 0 -github.com/ethereum/go-ethereum/les/metrics.go:126.2,126.67 1 0 -github.com/ethereum/go-ethereum/les/metrics.go:123.22,125.3 1 0 -github.com/ethereum/go-ethereum/les/metrics.go:129.60,132.16 2 0 -github.com/ethereum/go-ethereum/les/metrics.go:136.2,140.17 4 0 -github.com/ethereum/go-ethereum/les/metrics.go:132.16,134.3 1 0 -github.com/ethereum/go-ethereum/les/metrics.go:143.61,151.2 4 0 -github.com/ethereum/go-ethereum/les/test_helper.go:109.57,114.25 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:114.25,115.12 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:178.3,178.19 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:116.10,128.36 5 1 -github.com/ethereum/go-ethereum/les/test_helper.go:129.10,152.37 11 1 -github.com/ethereum/go-ethereum/les/test_helper.go:153.10,166.37 6 1 -github.com/ethereum/go-ethereum/les/test_helper.go:167.10,176.36 4 1 -github.com/ethereum/go-ethereum/les/test_helper.go:183.131,191.2 6 1 -github.com/ethereum/go-ethereum/les/test_helper.go:193.211,207.21 4 1 -github.com/ethereum/go-ethereum/les/test_helper.go:225.2,247.26 3 1 -github.com/ethereum/go-ethereum/les/test_helper.go:250.2,251.32 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:207.21,213.59 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:223.3,223.60 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:213.59,222.4 3 0 -github.com/ethereum/go-ethereum/les/test_helper.go:247.26,249.3 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:251.32,253.3 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:256.162,275.21 8 1 -github.com/ethereum/go-ethereum/les/test_helper.go:293.2,317.93 7 1 -github.com/ethereum/go-ethereum/les/test_helper.go:318.2,318.26 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:321.2,323.19 3 1 -github.com/ethereum/go-ethereum/les/test_helper.go:324.2,324.43 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:275.21,281.59 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:291.3,291.60 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:281.59,290.4 3 1 -github.com/ethereum/go-ethereum/les/test_helper.go:317.93,317.108 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:318.26,320.3 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:323.19,323.36 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:327.26,329.2 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:341.140,343.20 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:346.2,353.29 8 1 -github.com/ethereum/go-ethereum/les/test_helper.go:356.2,356.61 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:359.2,359.62 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:343.20,345.3 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:353.29,355.3 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:356.61,358.3 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:359.62,361.3 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:365.189,367.20 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:370.2,385.29 16 1 -github.com/ethereum/go-ethereum/les/test_helper.go:389.2,389.61 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:392.2,392.62 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:367.20,369.3 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:385.29,388.3 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:389.61,391.3 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:392.62,394.3 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:399.28,401.2 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:403.145,417.12 8 1 -github.com/ethereum/go-ethereum/les/test_helper.go:424.2,424.12 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:432.2,432.6 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:445.2,445.102 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:417.12,418.10 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:419.25,420.29 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:421.38,421.38 0 1 -github.com/ethereum/go-ethereum/les/test_helper.go:424.12,425.10 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:426.25,427.29 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:428.54,428.54 0 1 -github.com/ethereum/go-ethereum/les/test_helper.go:432.6,433.10 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:440.3,440.87 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:443.3,443.36 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:434.23,435.82 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:436.23,437.82 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:438.11,438.11 0 1 -github.com/ethereum/go-ethereum/les/test_helper.go:440.87,441.9 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:463.135,474.12 6 1 -github.com/ethereum/go-ethereum/les/test_helper.go:481.2,495.6 5 1 -github.com/ethereum/go-ethereum/les/test_helper.go:506.2,506.22 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:510.2,510.29 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:474.12,475.10 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:476.33,477.29 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:478.52,478.52 0 1 -github.com/ethereum/go-ethereum/les/test_helper.go:495.6,496.10 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:501.3,501.44 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:504.3,504.36 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:497.16,498.24 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:499.11,499.11 0 1 -github.com/ethereum/go-ethereum/les/test_helper.go:501.44,502.9 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:506.22,509.3 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:527.112,538.12 6 1 -github.com/ethereum/go-ethereum/les/test_helper.go:545.2,559.6 5 1 -github.com/ethereum/go-ethereum/les/test_helper.go:570.2,570.22 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:574.2,574.29 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:538.12,539.10 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:540.33,541.29 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:542.45,542.45 0 1 -github.com/ethereum/go-ethereum/les/test_helper.go:559.6,560.10 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:565.3,565.44 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:568.3,568.36 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:561.16,562.24 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:563.11,563.11 0 1 -github.com/ethereum/go-ethereum/les/test_helper.go:565.44,566.9 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:570.22,573.3 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:589.96,596.21 3 1 -github.com/ethereum/go-ethereum/les/test_helper.go:599.2,600.62 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:601.2,618.27 13 1 -github.com/ethereum/go-ethereum/les/test_helper.go:621.2,625.20 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:638.2,657.21 3 1 -github.com/ethereum/go-ethereum/les/test_helper.go:673.2,673.23 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:596.21,598.3 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:600.62,600.95 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:618.27,620.3 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:625.20,627.42 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:628.3,629.17 2 1 -github.com/ethereum/go-ethereum/les/test_helper.go:632.3,632.10 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:627.42,627.57 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:629.17,631.4 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:633.15,633.15 0 1 -github.com/ethereum/go-ethereum/les/test_helper.go:634.39,635.59 1 0 -github.com/ethereum/go-ethereum/les/test_helper.go:657.21,658.21 1 1 -github.com/ethereum/go-ethereum/les/test_helper.go:664.3,671.16 8 1 -github.com/ethereum/go-ethereum/les/test_helper.go:658.21,663.4 4 1 -github.com/ethereum/go-ethereum/les/test_helper.go:679.64,681.19 2 0 -github.com/ethereum/go-ethereum/les/test_helper.go:681.19,681.44 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:32.121,34.2 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:37.171,39.28 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:43.2,44.16 2 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:47.2,48.16 2 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:51.2,51.52 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:55.2,56.44 2 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:74.2,74.122 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:39.28,41.3 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:44.16,46.3 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:48.16,50.3 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:51.52,53.3 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:56.44,62.21 5 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:66.3,67.94 2 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:72.3,72.65 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:62.21,64.4 1 0 -github.com/ethereum/go-ethereum/les/state_accessor.go:67.94,69.4 1 0 -github.com/ethereum/go-ethereum/les/bor_api_backend.go:12.113,14.2 1 0 -github.com/ethereum/go-ethereum/les/bor_api_backend.go:17.99,19.2 1 0 -github.com/ethereum/go-ethereum/les/bor_api_backend.go:22.101,24.2 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:33.33,33.49 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:41.33,41.49 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:44.68,48.43 2 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:58.2,58.20 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:62.2,63.56 2 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:64.2,64.22 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:48.43,51.17 3 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:54.3,54.20 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:51.17,53.4 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:58.20,60.3 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:63.56,63.94 1 0 -github.com/ethereum/go-ethereum/les/enr_entry.go:68.65,72.2 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:40.79,49.2 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:51.32,53.2 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:55.53,60.20 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:63.2,63.42 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:60.20,62.3 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:66.55,70.37 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:70.37,71.16 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:71.16,75.4 2 0 -github.com/ethereum/go-ethereum/les/txrelay.go:80.65,84.45 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:88.2,88.25 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:116.2,116.30 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:84.45,86.3 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:88.25,91.10 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:95.3,95.29 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:91.10,94.4 2 0 -github.com/ethereum/go-ethereum/les/txrelay.go:95.29,98.8 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:98.8,102.17 4 0 -github.com/ethereum/go-ethereum/les/txrelay.go:105.5,106.34 2 0 -github.com/ethereum/go-ethereum/les/txrelay.go:109.5,109.33 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:102.17,103.11 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:106.34,108.6 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:109.33,110.11 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:116.30,123.38 5 0 -github.com/ethereum/go-ethereum/les/txrelay.go:137.3,137.96 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:123.38,126.5 2 0 -github.com/ethereum/go-ethereum/les/txrelay.go:127.36,129.5 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:130.38,134.19 4 0 -github.com/ethereum/go-ethereum/les/txrelay.go:134.19,134.56 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:137.96,137.110 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:141.54,146.2 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:148.96,152.29 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:156.2,156.32 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:160.2,160.29 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:152.29,154.3 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:156.32,158.3 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:160.29,163.36 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:167.3,167.20 1 0 -github.com/ethereum/go-ethereum/les/txrelay.go:163.36,166.4 2 0 -github.com/ethereum/go-ethereum/les/txrelay.go:171.55,175.30 3 0 -github.com/ethereum/go-ethereum/les/txrelay.go:175.30,178.3 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:50.59,52.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:54.53,56.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:58.48,61.2 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:63.108,67.38 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:70.2,70.37 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:73.2,73.67 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:67.38,69.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:70.37,72.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:76.127,77.47 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:80.2,80.42 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:93.2,93.79 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:77.47,79.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:80.42,82.17 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:85.3,85.20 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:88.3,88.106 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:91.3,91.21 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:82.17,84.4 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:85.20,87.4 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:88.106,90.4 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:96.100,98.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:100.106,102.33 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:105.2,105.42 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:102.33,104.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:108.98,110.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:112.125,113.47 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:116.2,116.42 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:129.2,129.79 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:113.47,115.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:116.42,118.17 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:121.3,121.19 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:124.3,124.101 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:127.3,127.20 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:118.17,120.4 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:121.19,123.4 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:124.101,126.4 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:132.82,134.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:136.132,138.16 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:141.2,141.19 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:144.2,144.60 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:138.16,140.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:141.19,143.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:147.151,148.47 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:151.2,151.42 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:161.2,161.84 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:148.47,150.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:151.42,153.20 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:156.3,156.106 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:159.3,159.61 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:153.20,155.4 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:156.106,158.4 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:164.100,165.74 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:168.2,168.17 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:165.74,167.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:171.96,172.74 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:175.2,175.17 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:172.74,174.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:178.79,179.74 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:182.2,182.12 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:179.74,181.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:185.167,186.21 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:189.2,191.93 3 0 -github.com/ethereum/go-ethereum/les/api_backend.go:186.21,188.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:194.88,196.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:198.54,200.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:202.75,204.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:206.83,208.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:210.138,212.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:214.96,216.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:218.59,220.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:222.120,224.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:226.105,228.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:230.93,232.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:234.91,236.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:238.99,240.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:242.99,244.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:246.87,248.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:250.94,251.64 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:251.64,254.3 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:257.103,259.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:261.62,263.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:265.47,267.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:269.81,271.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:273.227,275.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:277.50,279.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:281.60,283.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:285.46,287.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:289.51,291.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:293.44,295.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:297.55,299.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:301.47,303.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:305.56,306.31 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:309.2,310.47 2 0 -github.com/ethereum/go-ethereum/les/api_backend.go:306.31,308.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:313.95,314.42 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:314.42,316.3 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:319.51,321.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:323.55,325.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:327.172,329.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:331.168,333.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:339.107,341.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:343.102,345.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:347.146,349.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:351.182,353.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:355.73,357.2 1 0 -github.com/ethereum/go-ethereum/les/api_backend.go:359.53,360.2 0 0 -github.com/ethereum/go-ethereum/les/benchmark.go:56.73,60.19 4 0 -github.com/ethereum/go-ethereum/les/benchmark.go:63.2,63.15 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:66.2,66.14 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:72.2,72.12 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:60.19,62.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:63.15,65.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:66.14,68.27 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:68.27,70.4 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:75.76,76.14 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:79.2,79.109 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:76.14,78.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:88.77,91.26 3 0 -github.com/ethereum/go-ethereum/les/benchmark.go:94.2,94.12 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:91.26,93.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:97.80,98.16 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:101.2,101.62 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:98.16,100.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:110.73,113.2 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:115.76,118.12 3 0 -github.com/ethereum/go-ethereum/les/benchmark.go:121.2,121.73 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:118.12,120.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:131.71,132.13 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:138.2,138.25 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:141.2,141.12 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:132.13,134.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:134.8,137.3 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:138.25,140.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:144.74,147.13 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:163.2,163.46 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:147.13,149.23 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:149.23,154.4 4 0 -github.com/ethereum/go-ethereum/les/benchmark.go:155.8,156.23 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:156.23,160.4 3 0 -github.com/ethereum/go-ethereum/les/benchmark.go:171.67,177.23 5 0 -github.com/ethereum/go-ethereum/les/benchmark.go:186.2,186.12 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:177.23,181.17 4 0 -github.com/ethereum/go-ethereum/les/benchmark.go:184.3,184.16 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:181.17,182.14 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:189.70,192.2 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:197.69,199.2 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:201.72,205.2 3 0 -github.com/ethereum/go-ethereum/les/benchmark.go:218.128,220.31 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:223.2,223.33 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:246.2,248.26 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:253.2,253.14 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:220.31,222.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:223.33,227.21 4 0 -github.com/ethereum/go-ethereum/les/benchmark.go:227.21,234.23 5 0 -github.com/ethereum/go-ethereum/les/benchmark.go:234.23,237.27 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:240.5,240.50 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:237.27,239.6 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:240.50,242.6 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:248.26,249.19 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:249.19,251.4 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:263.50,265.2 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:267.51,268.26 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:271.2,271.27 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:268.26,270.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:276.73,288.29 11 0 -github.com/ethereum/go-ethereum/les/benchmark.go:291.2,295.49 4 0 -github.com/ethereum/go-ethereum/les/benchmark.go:299.2,302.12 3 0 -github.com/ethereum/go-ethereum/les/benchmark.go:310.2,310.12 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:318.2,318.12 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:332.2,332.9 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:343.2,349.12 7 0 -github.com/ethereum/go-ethereum/les/benchmark.go:288.29,290.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:295.49,297.3 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:302.12,303.30 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:303.30,304.54 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:304.54,307.5 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:310.12,311.30 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:311.30,312.64 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:312.64,315.5 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:318.12,319.30 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:330.3,330.15 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:319.30,321.18 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:325.4,326.18 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:321.18,324.5 2 0 -github.com/ethereum/go-ethereum/les/benchmark.go:333.22,334.17 1 0 -github.com/ethereum/go-ethereum/les/benchmark.go:337.19,340.43 3 0 -github.com/ethereum/go-ethereum/les/benchmark.go:334.17,336.4 1 0 -github.com/ethereum/go-ethereum/les/odr.go:41.122,49.2 1 1 -github.com/ethereum/go-ethereum/les/odr.go:52.27,54.2 1 0 -github.com/ethereum/go-ethereum/les/odr.go:57.46,59.2 1 1 -github.com/ethereum/go-ethereum/les/odr.go:62.95,66.2 3 1 -github.com/ethereum/go-ethereum/les/odr.go:69.52,71.2 1 1 -github.com/ethereum/go-ethereum/les/odr.go:74.58,76.2 1 1 -github.com/ethereum/go-ethereum/les/odr.go:79.54,81.2 1 1 -github.com/ethereum/go-ethereum/les/odr.go:84.57,86.2 1 1 -github.com/ethereum/go-ethereum/les/odr.go:109.36,109.53 1 1 -github.com/ethereum/go-ethereum/les/odr.go:110.46,111.40 1 1 -github.com/ethereum/go-ethereum/les/odr.go:114.2,114.40 1 1 -github.com/ethereum/go-ethereum/les/odr.go:117.2,117.40 1 1 -github.com/ethereum/go-ethereum/les/odr.go:111.40,113.3 1 1 -github.com/ethereum/go-ethereum/les/odr.go:114.40,116.3 1 0 -github.com/ethereum/go-ethereum/les/odr.go:119.41,119.68 1 1 -github.com/ethereum/go-ethereum/les/odr.go:132.92,142.44 2 1 -github.com/ethereum/go-ethereum/les/odr.go:148.2,149.63 2 1 -github.com/ethereum/go-ethereum/les/odr.go:153.2,153.6 1 1 -github.com/ethereum/go-ethereum/les/odr.go:193.2,194.12 2 1 -github.com/ethereum/go-ethereum/les/odr.go:142.44,143.40 1 1 -github.com/ethereum/go-ethereum/les/odr.go:146.3,146.30 1 1 -github.com/ethereum/go-ethereum/les/odr.go:143.40,144.12 1 0 -github.com/ethereum/go-ethereum/les/odr.go:149.63,151.3 1 1 -github.com/ethereum/go-ethereum/les/odr.go:153.6,154.55 1 1 -github.com/ethereum/go-ethereum/les/odr.go:157.3,162.39 1 1 -github.com/ethereum/go-ethereum/les/odr.go:172.3,172.87 1 1 -github.com/ethereum/go-ethereum/les/odr.go:178.3,178.41 1 1 -github.com/ethereum/go-ethereum/les/odr.go:188.3,188.19 1 1 -github.com/ethereum/go-ethereum/les/odr.go:191.3,191.15 1 1 -github.com/ethereum/go-ethereum/les/odr.go:154.55,155.9 1 1 -github.com/ethereum/go-ethereum/les/odr.go:162.39,162.79 1 1 -github.com/ethereum/go-ethereum/les/odr.go:163.37,163.76 1 1 -github.com/ethereum/go-ethereum/les/odr.go:164.39,168.20 4 1 -github.com/ethereum/go-ethereum/les/odr.go:168.20,168.42 1 1 -github.com/ethereum/go-ethereum/les/odr.go:172.87,172.123 1 1 -github.com/ethereum/go-ethereum/les/odr.go:172.147,174.4 1 0 -github.com/ethereum/go-ethereum/les/odr.go:178.41,179.52 1 1 -github.com/ethereum/go-ethereum/les/odr.go:182.4,182.45 1 1 -github.com/ethereum/go-ethereum/les/odr.go:185.4,185.46 1 1 -github.com/ethereum/go-ethereum/les/odr.go:179.52,180.13 1 1 -github.com/ethereum/go-ethereum/les/odr.go:182.45,183.13 1 1 -github.com/ethereum/go-ethereum/les/odr.go:188.19,189.9 1 1 -github.com/ethereum/go-ethereum/les/odr.go:201.84,206.37 3 1 -github.com/ethereum/go-ethereum/les/odr.go:224.2,224.34 1 1 -github.com/ethereum/go-ethereum/les/odr.go:231.2,231.84 1 1 -github.com/ethereum/go-ethereum/les/odr.go:234.2,235.12 2 1 -github.com/ethereum/go-ethereum/les/odr.go:206.37,208.4 1 1 -github.com/ethereum/go-ethereum/les/odr.go:209.35,211.23 2 1 -github.com/ethereum/go-ethereum/les/odr.go:214.4,214.16 1 0 -github.com/ethereum/go-ethereum/les/odr.go:211.23,213.5 1 1 -github.com/ethereum/go-ethereum/les/odr.go:216.37,220.18 4 1 -github.com/ethereum/go-ethereum/les/odr.go:220.18,220.44 1 1 -github.com/ethereum/go-ethereum/les/odr.go:224.34,225.17 1 1 -github.com/ethereum/go-ethereum/les/odr.go:228.3,228.56 1 1 -github.com/ethereum/go-ethereum/les/odr.go:225.17,227.4 1 1 -github.com/ethereum/go-ethereum/les/odr.go:231.84,231.121 1 1 -github.com/ethereum/go-ethereum/les/odr.go:231.145,233.3 1 1 -github.com/ethereum/go-ethereum/les/server.go:79.96,81.16 2 0 -github.com/ethereum/go-ethereum/les/server.go:86.2,87.17 2 0 -github.com/ethereum/go-ethereum/les/server.go:90.2,114.29 3 0 -github.com/ethereum/go-ethereum/les/server.go:117.2,136.37 8 0 -github.com/ethereum/go-ethereum/les/server.go:139.2,146.25 7 0 -github.com/ethereum/go-ethereum/les/server.go:150.2,155.17 5 0 -github.com/ethereum/go-ethereum/les/server.go:81.16,83.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:87.17,89.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:114.29,115.24 1 0 -github.com/ethereum/go-ethereum/les/server.go:115.24,115.39 1 0 -github.com/ethereum/go-ethereum/les/server.go:136.37,138.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:146.25,149.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:158.38,179.2 1 0 -github.com/ethereum/go-ethereum/les/server.go:181.48,182.97 1 0 -github.com/ethereum/go-ethereum/les/server.go:189.2,189.20 1 0 -github.com/ethereum/go-ethereum/les/server.go:194.2,194.11 1 0 -github.com/ethereum/go-ethereum/les/server.go:182.97,183.38 1 0 -github.com/ethereum/go-ethereum/les/server.go:186.3,186.13 1 0 -github.com/ethereum/go-ethereum/les/server.go:183.38,185.4 1 0 -github.com/ethereum/go-ethereum/les/server.go:189.20,193.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:198.35,204.28 6 0 -github.com/ethereum/go-ethereum/les/server.go:207.2,207.12 1 0 -github.com/ethereum/go-ethereum/les/server.go:204.28,206.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:211.34,215.24 3 1 -github.com/ethereum/go-ethereum/les/server.go:218.2,223.26 6 1 -github.com/ethereum/go-ethereum/les/server.go:228.2,228.25 1 1 -github.com/ethereum/go-ethereum/les/server.go:231.2,231.20 1 1 -github.com/ethereum/go-ethereum/les/server.go:234.2,237.12 3 1 -github.com/ethereum/go-ethereum/les/server.go:215.24,217.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:223.26,225.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:228.25,230.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:231.20,233.3 1 0 -github.com/ethereum/go-ethereum/les/server.go:243.42,262.27 11 0 -github.com/ethereum/go-ethereum/les/server.go:271.2,273.6 2 0 -github.com/ethereum/go-ethereum/les/server.go:262.27,263.11 1 0 -github.com/ethereum/go-ethereum/les/server.go:263.11,266.4 2 0 -github.com/ethereum/go-ethereum/les/server.go:266.9,269.4 2 0 -github.com/ethereum/go-ethereum/les/server.go:273.6,274.10 1 0 -github.com/ethereum/go-ethereum/les/server.go:275.27,276.12 1 0 -github.com/ethereum/go-ethereum/les/server.go:281.4,281.20 1 0 -github.com/ethereum/go-ethereum/les/server.go:282.42,284.20 2 0 -github.com/ethereum/go-ethereum/les/server.go:285.42,288.78 3 0 -github.com/ethereum/go-ethereum/les/server.go:291.4,292.70 2 0 -github.com/ethereum/go-ethereum/les/server.go:293.20,294.10 1 0 -github.com/ethereum/go-ethereum/les/server.go:276.12,278.5 1 0 -github.com/ethereum/go-ethereum/les/server.go:278.10,280.5 1 0 -github.com/ethereum/go-ethereum/les/server.go:288.78,290.5 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:140.89,148.29 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:151.2,151.28 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:154.2,154.19 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:160.2,162.29 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:169.2,170.49 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:148.29,150.3 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:151.28,153.3 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:154.19,156.36 2 0 -github.com/ethereum/go-ethereum/les/costtracker.go:156.36,158.4 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:162.29,165.28 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:165.28,167.4 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:174.31,178.19 4 1 -github.com/ethereum/go-ethereum/les/costtracker.go:178.19,180.3 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:185.75,186.62 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:198.2,199.41 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:218.2,218.13 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:186.62,189.24 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:192.3,193.25 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:196.3,196.14 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:189.24,191.4 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:193.25,195.4 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:199.41,202.26 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:212.3,216.5 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:202.26,205.32 2 0 -github.com/ethereum/go-ethereum/les/costtracker.go:205.32,209.5 3 0 -github.com/ethereum/go-ethereum/les/costtracker.go:244.33,254.20 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:257.2,264.12 4 1 -github.com/ethereum/go-ethereum/les/costtracker.go:254.20,256.3 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:264.12,265.28 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:271.3,274.7 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:265.28,270.4 4 1 -github.com/ethereum/go-ethereum/les/costtracker.go:274.7,275.11 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:276.29,280.33 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:306.5,306.64 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:309.5,323.24 12 1 -github.com/ethereum/go-ethereum/les/costtracker.go:327.5,327.24 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:344.5,347.20 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:368.5,369.50 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:371.24,372.21 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:374.31,377.11 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:280.33,281.23 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:282.30,283.50 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:284.29,285.48 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:286.26,287.51 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:288.22,289.48 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:290.26,291.49 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:292.34,293.55 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:294.23,295.50 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:296.26,297.52 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:306.64,307.14 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:323.24,325.6 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:327.24,329.30 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:335.6,335.32 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:329.30,331.7 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:331.12,333.7 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:335.32,338.7 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:338.12,341.7 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:347.20,352.53 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:352.53,358.20 6 1 -github.com/ethereum/go-ethereum/les/costtracker.go:364.7,365.64 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:358.20,359.15 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:360.57,360.57 0 0 -github.com/ethereum/go-ethereum/les/costtracker.go:361.16,361.16 0 0 -github.com/ethereum/go-ethereum/les/costtracker.go:384.47,389.2 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:393.47,398.2 3 0 -github.com/ethereum/go-ethereum/les/costtracker.go:402.70,408.2 4 0 -github.com/ethereum/go-ethereum/les/costtracker.go:412.80,415.9 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:419.2,419.19 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:416.81,416.81 0 1 -github.com/ethereum/go-ethereum/les/costtracker.go:417.10,417.10 0 0 -github.com/ethereum/go-ethereum/les/costtracker.go:419.19,422.39 3 0 -github.com/ethereum/go-ethereum/les/costtracker.go:426.3,426.42 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:422.39,425.4 2 0 -github.com/ethereum/go-ethereum/les/costtracker.go:438.84,441.23 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:444.2,445.24 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:448.2,448.41 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:441.23,443.3 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:445.24,447.3 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:452.37,453.21 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:456.2,456.34 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:453.21,455.3 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:456.34,458.3 1 0 -github.com/ethereum/go-ethereum/les/costtracker.go:479.70,482.2 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:485.76,487.25 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:495.2,495.14 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:487.25,488.33 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:488.33,493.4 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:499.52,502.35 3 1 -github.com/ethereum/go-ethereum/les/costtracker.go:507.2,508.45 2 1 -github.com/ethereum/go-ethereum/les/costtracker.go:516.2,516.11 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:502.35,503.17 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:503.17,505.4 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:508.45,509.40 1 1 -github.com/ethereum/go-ethereum/les/costtracker.go:509.40,514.4 4 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:55.53,56.25 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:57.27,58.28 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:59.30,60.31 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:61.26,62.27 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:63.26,64.27 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:65.25,66.26 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:67.27,68.28 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:69.30,70.31 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:71.10,72.13 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:81.57,83.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:86.55,88.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:91.70,94.2 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:99.68,103.35 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:106.2,107.22 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:110.2,113.21 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:116.2,116.21 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:119.2,119.103 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:122.2,122.60 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:126.2,127.16 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:130.2,131.12 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:103.35,105.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:107.22,109.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:113.21,115.3 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:116.21,118.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:119.103,121.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:122.60,124.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:127.16,129.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:139.60,141.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:144.58,146.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:149.73,152.2 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:157.71,161.32 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:164.2,165.24 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:168.2,171.21 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:174.2,174.21 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:177.2,177.78 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:181.2,182.12 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:161.32,163.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:165.24,167.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:171.21,173.3 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:174.21,176.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:177.78,179.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:196.56,198.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:201.54,203.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:206.69,214.2 3 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:219.67,222.32 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:225.2,229.69 4 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:233.2,233.44 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:236.2,237.12 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:222.32,224.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:229.69,231.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:233.44,235.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:250.56,252.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:255.54,257.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:260.69,267.2 3 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:272.67,276.28 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:279.2,280.21 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:283.2,286.56 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:289.2,290.12 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:276.28,278.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:280.21,282.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:286.56,288.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:320.55,322.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:325.53,330.2 3 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:333.68,344.2 5 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:349.66,352.40 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:355.2,356.28 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:359.2,361.25 3 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:364.2,365.59 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:369.2,377.16 5 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:380.2,380.44 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:383.2,383.54 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:386.2,386.32 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:389.2,389.42 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:393.2,396.12 4 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:352.40,354.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:356.28,358.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:361.25,363.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:365.59,367.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:377.16,379.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:380.44,382.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:383.54,385.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:386.32,388.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:389.42,391.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:408.57,410.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:413.55,417.25 3 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:420.2,420.153 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:417.25,419.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:424.70,431.48 5 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:439.2,439.50 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:431.48,438.3 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:445.68,449.40 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:452.2,463.41 8 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:472.2,472.44 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:475.2,476.12 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:449.40,451.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:463.41,466.17 3 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:469.3,469.25 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:466.17,468.4 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:472.44,474.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:484.60,486.2 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:489.58,491.2 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:494.73,497.2 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:502.71,505.32 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:508.2,509.34 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:512.2,513.12 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:505.32,507.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:509.34,511.3 1 0 -github.com/ethereum/go-ethereum/les/odr_requests.go:524.54,525.21 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:528.2,529.21 2 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:525.21,527.3 1 1 -github.com/ethereum/go-ethereum/les/odr_requests.go:533.54,536.2 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:93.117,100.2 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:106.135,108.9 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:115.2,115.27 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:109.24,109.24 0 1 -github.com/ethereum/go-ethereum/les/retrieve.go:110.20,111.26 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:112.18,113.54 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:120.92,132.38 3 1 -github.com/ethereum/go-ethereum/les/retrieve.go:140.2,141.40 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:148.2,153.10 5 1 -github.com/ethereum/go-ethereum/les/retrieve.go:132.38,138.3 4 1 -github.com/ethereum/go-ethereum/les/retrieve.go:141.40,147.3 4 1 -github.com/ethereum/go-ethereum/les/retrieve.go:157.57,163.2 4 1 -github.com/ethereum/go-ethereum/les/retrieve.go:166.67,171.8 4 1 -github.com/ethereum/go-ethereum/les/retrieve.go:174.2,174.64 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:171.8,173.3 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:179.50,183.34 3 0 -github.com/ethereum/go-ethereum/les/retrieve.go:183.34,185.3 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:192.34,197.19 4 1 -github.com/ethereum/go-ethereum/les/retrieve.go:201.2,203.20 3 1 -github.com/ethereum/go-ethereum/les/retrieve.go:197.19,199.3 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:208.48,209.9 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:210.26,212.19 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:241.3,241.27 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:242.18,243.24 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:213.15,214.22 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:225.22,229.28 3 0 -github.com/ethereum/go-ethereum/les/retrieve.go:230.43,232.50 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:236.4,236.28 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:237.25,239.25 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:214.22,216.20 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:221.5,223.15 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:216.20,219.6 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:232.50,235.5 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:250.49,251.9 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:252.32,255.27 3 0 -github.com/ethereum/go-ethereum/les/retrieve.go:256.26,258.35 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:262.3,262.18 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:265.3,266.13 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:267.18,268.24 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:258.35,261.4 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:262.18,264.4 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:274.45,275.18 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:278.2,278.12 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:275.18,277.3 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:282.43,283.18 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:284.14,286.28 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:287.21,289.19 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:290.21,291.19 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:292.60,293.33 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:293.33,295.4 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:295.9,297.4 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:303.34,305.2 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:310.32,313.9 3 1 -github.com/ethereum/go-ethereum/les/retrieve.go:323.2,324.14 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:328.2,333.9 5 1 -github.com/ethereum/go-ethereum/les/retrieve.go:337.2,337.15 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:347.2,347.9 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:360.2,360.9 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:314.18,314.18 0 1 -github.com/ethereum/go-ethereum/les/retrieve.go:315.18,316.30 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:316.30,318.4 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:318.9,320.4 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:324.14,326.3 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:333.9,334.13 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:337.15,339.17 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:339.17,341.25 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:341.25,343.5 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:348.26,349.30 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:354.3,355.9 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:356.47,357.47 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:349.30,353.4 3 0 -github.com/ethereum/go-ethereum/les/retrieve.go:361.26,362.30 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:367.3,367.39 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:368.40,370.47 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:362.30,366.4 3 0 -github.com/ethereum/go-ethereum/les/retrieve.go:375.58,380.24 4 1 -github.com/ethereum/go-ethereum/les/retrieve.go:383.2,383.14 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:386.2,388.11 3 1 -github.com/ethereum/go-ethereum/les/retrieve.go:393.2,393.12 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:396.2,396.12 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:380.24,382.3 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:383.14,385.3 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:388.11,390.3 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:390.8,392.3 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:393.12,395.3 1 0 -github.com/ethereum/go-ethereum/les/retrieve.go:403.41,408.37 4 0 -github.com/ethereum/go-ethereum/les/retrieve.go:408.37,411.3 2 0 -github.com/ethereum/go-ethereum/les/retrieve.go:416.35,418.16 2 1 -github.com/ethereum/go-ethereum/les/retrieve.go:423.2,423.17 1 1 -github.com/ethereum/go-ethereum/les/retrieve.go:418.16,422.3 3 1 -github.com/ethereum/go-ethereum/les/retrieve.go:428.36,430.2 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:176.13,178.34 2 1 -github.com/ethereum/go-ethereum/les/protocol.go:178.34,186.29 4 1 -github.com/ethereum/go-ethereum/les/protocol.go:194.3,194.36 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:186.29,193.4 2 1 -github.com/ethereum/go-ethereum/les/protocol.go:219.34,221.2 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:252.44,253.41 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:256.2,256.12 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:253.41,255.3 1 0 -github.com/ethereum/go-ethereum/les/protocol.go:260.56,264.2 3 1 -github.com/ethereum/go-ethereum/les/protocol.go:267.78,269.49 2 1 -github.com/ethereum/go-ethereum/les/protocol.go:272.2,274.16 3 1 -github.com/ethereum/go-ethereum/les/protocol.go:277.2,277.41 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:280.2,280.38 1 0 -github.com/ethereum/go-ethereum/les/protocol.go:269.49,271.3 1 0 -github.com/ethereum/go-ethereum/les/protocol.go:274.16,276.3 1 0 -github.com/ethereum/go-ethereum/les/protocol.go:277.41,279.3 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:297.54,298.32 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:301.2,301.20 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:304.2,304.31 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:298.32,300.3 1 1 -github.com/ethereum/go-ethereum/les/protocol.go:301.20,303.3 1 0 -github.com/ethereum/go-ethereum/les/protocol.go:309.56,311.9 2 1 -github.com/ethereum/go-ethereum/les/protocol.go:312.18,313.13 1 0 -github.com/ethereum/go-ethereum/les/protocol.go:314.18,316.28 2 1 -github.com/ethereum/go-ethereum/les/protocol.go:317.17,319.30 2 1 -github.com/ethereum/go-ethereum/les/protocol.go:320.10,321.62 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:72.36,73.23 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:76.2,77.9 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:82.2,82.9 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:87.2,87.20 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:90.2,91.13 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:73.23,75.3 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:78.28,78.28 0 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:79.19,80.15 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:83.29,83.29 0 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:84.19,85.15 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:87.20,89.3 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:96.37,101.22 5 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:107.2,107.22 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:101.22,104.3 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:104.8,106.3 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:114.41,116.18 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:120.2,120.18 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:116.18,119.3 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:124.75,142.2 5 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:145.96,153.2 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:161.44,163.6 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:163.6,165.10 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:173.3,173.10 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:166.33,167.25 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:168.26,169.10 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:170.18,171.10 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:174.26,175.10 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:176.18,177.10 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:178.16,178.16 0 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:195.29,197.2 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:199.39,201.2 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:203.34,205.2 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:209.39,212.20 3 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:215.2,216.26 2 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:234.2,236.33 3 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:253.2,253.25 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:212.20,214.3 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:216.26,219.19 3 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:231.3,232.32 2 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:219.19,221.20 2 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:224.4,229.38 3 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:221.20,223.5 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:236.33,237.11 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:237.11,244.36 7 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:244.36,246.5 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:247.9,248.36 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:248.36,250.5 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:253.25,255.3 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:259.44,264.12 5 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:267.2,267.29 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:264.12,266.3 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:267.29,269.3 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:269.8,271.3 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:275.52,276.20 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:284.2,288.49 5 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:276.20,278.3 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:278.8,278.47 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:278.47,281.3 2 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:281.8,283.3 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:288.49,290.3 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:296.37,298.6 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:298.6,299.21 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:299.21,301.11 2 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:302.33,303.21 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:304.35,310.29 6 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:315.19,316.11 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:310.29,312.6 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:312.11,314.6 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:318.9,319.11 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:320.33,321.21 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:322.19,323.11 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:331.43,334.6 3 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:334.6,335.42 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:340.3,340.41 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:335.42,339.4 3 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:340.41,341.11 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:342.47,342.47 0 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:343.39,344.21 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:345.19,346.11 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:348.9,349.11 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:350.47,350.47 0 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:351.19,352.11 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:360.53,361.9 1 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:362.38,362.38 0 1 -github.com/ethereum/go-ethereum/les/servingqueue.go:363.17,364.9 1 0 -github.com/ethereum/go-ethereum/les/servingqueue.go:369.32,372.2 2 1 -github.com/ethereum/go-ethereum/les/sync.go:55.68,62.16 5 1 -github.com/ethereum/go-ethereum/les/sync.go:66.2,67.16 2 1 -github.com/ethereum/go-ethereum/les/sync.go:70.2,71.22 2 1 -github.com/ethereum/go-ethereum/les/sync.go:74.2,79.31 2 1 -github.com/ethereum/go-ethereum/les/sync.go:82.2,83.12 2 1 -github.com/ethereum/go-ethereum/les/sync.go:86.2,87.12 2 1 -github.com/ethereum/go-ethereum/les/sync.go:62.16,64.3 1 0 -github.com/ethereum/go-ethereum/les/sync.go:67.16,69.3 1 0 -github.com/ethereum/go-ethereum/les/sync.go:71.22,73.3 1 0 -github.com/ethereum/go-ethereum/les/sync.go:79.31,81.3 1 1 -github.com/ethereum/go-ethereum/les/sync.go:83.12,85.3 1 0 -github.com/ethereum/go-ethereum/les/sync.go:91.55,93.17 1 1 -github.com/ethereum/go-ethereum/les/sync.go:97.2,99.54 3 1 -github.com/ethereum/go-ethereum/les/sync.go:115.2,119.86 2 1 -github.com/ethereum/go-ethereum/les/sync.go:124.2,124.41 1 1 -github.com/ethereum/go-ethereum/les/sync.go:138.2,139.9 2 1 -github.com/ethereum/go-ethereum/les/sync.go:160.2,160.15 1 1 -github.com/ethereum/go-ethereum/les/sync.go:166.2,167.60 2 1 -github.com/ethereum/go-ethereum/les/sync.go:195.2,195.24 1 1 -github.com/ethereum/go-ethereum/les/sync.go:199.2,199.104 1 1 -github.com/ethereum/go-ethereum/les/sync.go:203.2,203.88 1 1 -github.com/ethereum/go-ethereum/les/sync.go:93.17,95.3 1 0 -github.com/ethereum/go-ethereum/les/sync.go:99.54,101.3 1 0 -github.com/ethereum/go-ethereum/les/sync.go:119.86,121.3 1 1 -github.com/ethereum/go-ethereum/les/sync.go:124.41,126.41 2 1 -github.com/ethereum/go-ethereum/les/sync.go:126.41,128.4 1 1 -github.com/ethereum/go-ethereum/les/sync.go:140.26,142.72 2 1 -github.com/ethereum/go-ethereum/les/sync.go:143.89,145.89 2 0 -github.com/ethereum/go-ethereum/les/sync.go:146.13,148.79 2 1 -github.com/ethereum/go-ethereum/les/sync.go:149.64,150.26 1 1 -github.com/ethereum/go-ethereum/les/sync.go:156.3,156.91 1 1 -github.com/ethereum/go-ethereum/les/sync.go:150.26,152.4 1 1 -github.com/ethereum/go-ethereum/les/sync.go:152.9,155.4 2 0 -github.com/ethereum/go-ethereum/les/sync.go:160.15,161.23 1 1 -github.com/ethereum/go-ethereum/les/sync.go:161.23,163.4 1 1 -github.com/ethereum/go-ethereum/les/sync.go:167.60,169.29 1 1 -github.com/ethereum/go-ethereum/les/sync.go:177.3,188.83 4 1 -github.com/ethereum/go-ethereum/les/sync.go:169.29,170.53 1 1 -github.com/ethereum/go-ethereum/les/sync.go:175.4,175.57 1 1 -github.com/ethereum/go-ethereum/les/sync.go:170.53,174.5 3 0 -github.com/ethereum/go-ethereum/les/sync.go:188.83,192.4 3 0 -github.com/ethereum/go-ethereum/les/sync.go:195.24,197.3 1 1 -github.com/ethereum/go-ethereum/les/sync.go:199.104,202.3 2 1 -github.com/ethereum/go-ethereum/les/api.go:43.73,49.2 1 0 -github.com/ethereum/go-ethereum/les/api.go:52.47,53.48 1 0 -github.com/ethereum/go-ethereum/les/api.go:56.2,56.68 1 0 -github.com/ethereum/go-ethereum/les/api.go:53.48,55.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:56.68,58.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:58.8,60.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:64.71,72.2 7 0 -github.com/ethereum/go-ethereum/les/api.go:75.98,77.29 2 0 -github.com/ethereum/go-ethereum/les/api.go:83.2,84.19 2 0 -github.com/ethereum/go-ethereum/les/api.go:87.2,87.25 1 0 -github.com/ethereum/go-ethereum/les/api.go:96.2,96.12 1 0 -github.com/ethereum/go-ethereum/les/api.go:77.29,78.45 1 0 -github.com/ethereum/go-ethereum/les/api.go:78.45,80.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:84.19,86.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:87.25,88.53 1 0 -github.com/ethereum/go-ethereum/les/api.go:88.53,90.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:90.9,91.91 1 0 -github.com/ethereum/go-ethereum/les/api.go:91.91,93.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:105.126,108.25 3 0 -github.com/ethereum/go-ethereum/les/api.go:112.2,112.25 1 0 -github.com/ethereum/go-ethereum/les/api.go:121.2,121.12 1 0 -github.com/ethereum/go-ethereum/les/api.go:108.25,111.3 2 0 -github.com/ethereum/go-ethereum/les/api.go:112.25,113.53 1 0 -github.com/ethereum/go-ethereum/les/api.go:113.53,115.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:115.9,116.91 1 0 -github.com/ethereum/go-ethereum/les/api.go:116.91,118.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:125.116,133.17 6 0 -github.com/ethereum/go-ethereum/les/api.go:138.2,138.13 1 0 -github.com/ethereum/go-ethereum/les/api.go:133.17,137.3 3 0 -github.com/ethereum/go-ethereum/les/api.go:143.170,145.34 2 0 -github.com/ethereum/go-ethereum/les/api.go:189.2,189.8 1 0 -github.com/ethereum/go-ethereum/les/api.go:145.34,146.28 1 0 -github.com/ethereum/go-ethereum/les/api.go:149.3,149.33 1 0 -github.com/ethereum/go-ethereum/les/api.go:158.3,158.10 1 0 -github.com/ethereum/go-ethereum/les/api.go:185.3,185.17 1 0 -github.com/ethereum/go-ethereum/les/api.go:146.28,148.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:149.33,150.50 1 0 -github.com/ethereum/go-ethereum/les/api.go:150.50,153.5 2 0 -github.com/ethereum/go-ethereum/les/api.go:153.10,155.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:159.37,160.37 1 0 -github.com/ethereum/go-ethereum/les/api.go:161.41,162.41 1 0 -github.com/ethereum/go-ethereum/les/api.go:163.44,164.40 1 0 -github.com/ethereum/go-ethereum/les/api.go:165.46,166.37 1 0 -github.com/ethereum/go-ethereum/les/api.go:167.50,168.41 1 0 -github.com/ethereum/go-ethereum/les/api.go:169.53,170.40 1 0 -github.com/ethereum/go-ethereum/les/api.go:171.41,172.89 1 0 -github.com/ethereum/go-ethereum/les/api.go:178.11,179.17 1 0 -github.com/ethereum/go-ethereum/les/api.go:172.89,175.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:175.10,177.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:179.17,181.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:181.10,183.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:185.17,187.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:194.104,196.29 2 0 -github.com/ethereum/go-ethereum/les/api.go:214.2,214.12 1 0 -github.com/ethereum/go-ethereum/les/api.go:196.29,198.44 2 0 -github.com/ethereum/go-ethereum/les/api.go:201.3,201.53 1 0 -github.com/ethereum/go-ethereum/les/api.go:198.44,200.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:201.53,204.14 3 0 -github.com/ethereum/go-ethereum/les/api.go:207.4,207.16 1 0 -github.com/ethereum/go-ethereum/les/api.go:204.14,206.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:207.16,209.5 1 0 -github.com/ethereum/go-ethereum/les/api.go:210.9,212.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:218.89,220.12 2 0 -github.com/ethereum/go-ethereum/les/api.go:223.2,223.12 1 0 -github.com/ethereum/go-ethereum/les/api.go:220.12,222.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:230.78,231.29 1 0 -github.com/ethereum/go-ethereum/les/api.go:234.2,235.12 2 0 -github.com/ethereum/go-ethereum/les/api.go:231.29,233.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:240.104,242.43 2 0 -github.com/ethereum/go-ethereum/les/api.go:245.2,245.84 1 0 -github.com/ethereum/go-ethereum/les/api.go:248.2,248.8 1 0 -github.com/ethereum/go-ethereum/les/api.go:242.43,244.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:245.84,247.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:257.135,259.31 2 0 -github.com/ethereum/go-ethereum/les/api.go:310.2,312.23 3 0 -github.com/ethereum/go-ethereum/les/api.go:324.2,324.20 1 0 -github.com/ethereum/go-ethereum/les/api.go:259.31,260.42 1 0 -github.com/ethereum/go-ethereum/les/api.go:260.42,261.46 1 0 -github.com/ethereum/go-ethereum/les/api.go:267.4,267.49 1 0 -github.com/ethereum/go-ethereum/les/api.go:273.4,273.13 1 0 -github.com/ethereum/go-ethereum/les/api.go:261.46,262.48 1 0 -github.com/ethereum/go-ethereum/les/api.go:265.5,265.15 1 0 -github.com/ethereum/go-ethereum/les/api.go:262.48,264.6 1 0 -github.com/ethereum/go-ethereum/les/api.go:267.49,268.45 1 0 -github.com/ethereum/go-ethereum/les/api.go:271.5,271.15 1 0 -github.com/ethereum/go-ethereum/les/api.go:268.45,270.6 1 0 -github.com/ethereum/go-ethereum/les/api.go:274.18,280.6 1 0 -github.com/ethereum/go-ethereum/les/api.go:281.16,282.64 1 0 -github.com/ethereum/go-ethereum/les/api.go:283.20,284.63 1 0 -github.com/ethereum/go-ethereum/les/api.go:285.17,286.56 1 0 -github.com/ethereum/go-ethereum/les/api.go:287.16,288.55 1 0 -github.com/ethereum/go-ethereum/les/api.go:289.15,293.6 1 0 -github.com/ethereum/go-ethereum/les/api.go:294.17,298.6 1 0 -github.com/ethereum/go-ethereum/les/api.go:299.18,300.39 1 0 -github.com/ethereum/go-ethereum/les/api.go:301.20,302.41 1 0 -github.com/ethereum/go-ethereum/les/api.go:303.12,304.40 1 0 -github.com/ethereum/go-ethereum/les/api.go:306.9,308.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:312.23,314.19 2 0 -github.com/ethereum/go-ethereum/les/api.go:322.3,322.18 1 0 -github.com/ethereum/go-ethereum/les/api.go:314.19,319.4 4 0 -github.com/ethereum/go-ethereum/les/api.go:319.9,321.4 1 0 -github.com/ethereum/go-ethereum/les/api.go:333.61,337.2 1 0 -github.com/ethereum/go-ethereum/les/api.go:340.61,345.43 2 0 -github.com/ethereum/go-ethereum/les/api.go:348.2,348.52 1 0 -github.com/ethereum/go-ethereum/les/api.go:345.43,347.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:348.52,351.3 2 0 -github.com/ethereum/go-ethereum/les/api.go:351.8,353.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:362.63,364.2 1 0 -github.com/ethereum/go-ethereum/les/api.go:373.67,376.16 3 0 -github.com/ethereum/go-ethereum/les/api.go:379.2,381.17 3 0 -github.com/ethereum/go-ethereum/les/api.go:376.16,378.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:390.76,393.16 3 0 -github.com/ethereum/go-ethereum/les/api.go:396.2,397.17 2 0 -github.com/ethereum/go-ethereum/les/api.go:393.16,395.3 1 0 -github.com/ethereum/go-ethereum/les/api.go:401.76,402.31 1 0 -github.com/ethereum/go-ethereum/les/api.go:405.2,405.64 1 0 -github.com/ethereum/go-ethereum/les/api.go:402.31,404.3 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:57.138,64.23 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:72.2,73.23 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:76.2,79.16 4 1 -github.com/ethereum/go-ethereum/les/client_handler.go:64.23,66.17 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:69.3,70.45 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:66.17,68.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:73.23,75.3 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:82.33,84.2 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:86.32,91.2 4 1 -github.com/ethereum/go-ethereum/les/client_handler.go:94.88,96.18 2 0 -github.com/ethereum/go-ethereum/les/client_handler.go:99.2,104.12 6 0 -github.com/ethereum/go-ethereum/les/client_handler.go:96.18,98.3 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:107.74,108.92 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:111.2,115.97 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:120.2,120.33 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:133.2,133.52 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:138.2,141.15 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:149.2,149.56 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:154.2,158.6 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:108.92,110.3 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:115.97,118.3 2 0 -github.com/ethereum/go-ethereum/les/client_handler.go:120.33,121.74 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:121.74,124.17 3 0 -github.com/ethereum/go-ethereum/les/client_handler.go:124.17,127.5 2 0 -github.com/ethereum/go-ethereum/les/client_handler.go:128.9,130.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:133.52,136.3 2 0 -github.com/ethereum/go-ethereum/les/client_handler.go:141.15,145.3 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:149.56,151.3 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:158.6,159.40 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:159.40,163.4 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:169.56,172.16 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:175.2,177.35 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:180.2,185.9 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:368.2,368.23 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:375.2,375.12 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:172.16,174.3 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:177.35,179.3 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:186.31,189.42 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:192.3,192.43 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:195.3,196.27 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:199.3,202.34 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:223.35,229.43 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:232.3,237.48 4 1 -github.com/ethereum/go-ethereum/les/client_handler.go:255.34,261.43 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:264.3,270.4 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:271.27,277.43 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:280.3,286.4 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:287.31,293.43 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:296.3,302.4 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:303.31,309.43 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:312.3,318.4 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:319.39,325.43 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:328.3,334.4 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:335.31,341.43 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:344.3,350.4 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:351.48,354.35 3 0 -github.com/ethereum/go-ethereum/les/client_handler.go:355.50,357.41 2 0 -github.com/ethereum/go-ethereum/les/client_handler.go:360.3,362.35 3 0 -github.com/ethereum/go-ethereum/les/client_handler.go:363.10,365.52 2 0 -github.com/ethereum/go-ethereum/les/client_handler.go:189.42,191.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:192.43,194.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:196.27,198.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:202.34,203.42 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:206.4,206.44 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:213.4,219.38 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:203.42,205.5 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:206.44,207.62 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:211.5,211.50 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:207.62,210.6 2 0 -github.com/ethereum/go-ethereum/les/client_handler.go:219.38,221.5 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:229.43,231.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:237.48,243.4 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:243.9,246.14 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:249.4,249.36 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:246.14,248.5 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:249.36,250.70 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:250.70,252.6 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:261.43,263.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:277.43,279.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:293.43,295.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:309.43,311.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:325.43,327.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:341.43,343.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:357.41,359.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:368.23,369.68 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:369.68,370.71 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:370.71,372.5 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:378.47,380.2 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:387.58,389.2 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:391.110,393.37 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:408.2,409.9 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:412.2,412.12 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:393.37,396.4 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:397.35,399.4 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:400.37,405.18 5 1 -github.com/ethereum/go-ethereum/les/client_handler.go:405.18,405.85 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:409.9,411.3 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:415.107,417.37 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:432.2,433.9 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:436.2,436.12 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:417.37,420.4 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:421.35,423.4 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:424.37,429.18 5 1 -github.com/ethereum/go-ethereum/les/client_handler.go:429.18,429.87 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:433.9,435.3 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:441.119,444.37 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:458.2,459.106 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:472.2,472.20 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:444.37,447.4 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:448.35,450.4 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:451.37,455.18 4 1 -github.com/ethereum/go-ethereum/les/client_handler.go:455.18,455.77 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:459.106,460.37 1 1 -github.com/ethereum/go-ethereum/les/client_handler.go:463.3,464.24 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:467.3,468.13 2 1 -github.com/ethereum/go-ethereum/les/client_handler.go:460.37,462.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:464.24,466.4 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:469.22,471.3 1 0 -github.com/ethereum/go-ethereum/les/client_handler.go:478.60,485.2 3 1 -github.com/ethereum/go-ethereum/les/client_handler.go:487.62,490.2 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:77.90,85.18 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:88.2,90.10 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:85.18,87.3 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:94.58,98.2 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:101.60,105.2 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:108.59,112.2 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:125.37,127.6 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:127.6,128.10 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:129.20,132.20 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:138.4,139.10 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:140.20,144.8 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:174.4,174.19 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:132.20,137.5 4 0 -github.com/ethereum/go-ethereum/les/distributor.go:144.8,146.32 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:146.32,150.21 4 1 -github.com/ethereum/go-ethereum/les/distributor.go:154.6,155.16 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:150.21,153.7 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:156.11,157.19 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:162.6,163.28 2 0 -github.com/ethereum/go-ethereum/les/distributor.go:167.6,167.16 1 0 -github.com/ethereum/go-ethereum/les/distributor.go:171.6,171.16 1 0 -github.com/ethereum/go-ethereum/les/distributor.go:157.19,160.17 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:163.28,166.7 1 0 -github.com/ethereum/go-ethereum/les/distributor.go:167.16,170.7 2 0 -github.com/ethereum/go-ethereum/les/distributor.go:186.45,188.2 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:192.80,204.83 7 1 -github.com/ethereum/go-ethereum/les/distributor.go:241.2,241.16 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:245.2,245.27 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:204.83,208.29 4 1 -github.com/ethereum/go-ethereum/les/distributor.go:215.3,215.29 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:233.3,234.45 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:238.3,238.14 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:208.29,211.40 3 0 -github.com/ethereum/go-ethereum/les/distributor.go:211.40,213.5 1 0 -github.com/ethereum/go-ethereum/les/distributor.go:215.29,216.80 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:216.80,220.18 4 1 -github.com/ethereum/go-ethereum/les/distributor.go:230.5,230.36 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:220.18,221.20 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:224.6,224.93 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:221.20,223.7 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:225.11,226.42 1 0 -github.com/ethereum/go-ethereum/les/distributor.go:226.42,228.7 1 0 -github.com/ethereum/go-ethereum/les/distributor.go:234.45,237.4 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:241.16,244.3 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:252.62,256.21 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:263.2,266.64 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:276.2,276.21 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:281.2,282.18 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:256.21,260.3 3 1 -github.com/ethereum/go-ethereum/les/distributor.go:266.64,268.3 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:268.8,270.53 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:273.3,273.49 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:270.53,272.4 1 1 -github.com/ethereum/go-ethereum/les/distributor.go:276.21,279.3 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:288.54,292.22 3 0 -github.com/ethereum/go-ethereum/les/distributor.go:296.2,298.13 3 0 -github.com/ethereum/go-ethereum/les/distributor.go:292.22,294.3 1 0 -github.com/ethereum/go-ethereum/les/distributor.go:302.49,304.22 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:304.22,307.3 2 1 -github.com/ethereum/go-ethereum/les/distributor.go:310.38,313.2 2 1 -github.com/ethereum/go-ethereum/les/pruner.go:38.75,47.2 4 1 -github.com/ethereum/go-ethereum/les/pruner.go:50.26,53.2 2 0 -github.com/ethereum/go-ethereum/les/pruner.go:60.25,71.20 4 1 -github.com/ethereum/go-ethereum/les/pruner.go:91.2,91.6 1 1 -github.com/ethereum/go-ethereum/les/pruner.go:71.20,73.38 2 1 -github.com/ethereum/go-ethereum/les/pruner.go:80.3,80.38 1 1 -github.com/ethereum/go-ethereum/les/pruner.go:83.3,83.38 1 1 -github.com/ethereum/go-ethereum/les/pruner.go:89.3,89.25 1 1 -github.com/ethereum/go-ethereum/les/pruner.go:73.38,75.22 2 1 -github.com/ethereum/go-ethereum/les/pruner.go:75.22,77.5 1 1 -github.com/ethereum/go-ethereum/les/pruner.go:80.38,82.4 1 0 -github.com/ethereum/go-ethereum/les/pruner.go:83.38,84.49 1 1 -github.com/ethereum/go-ethereum/les/pruner.go:84.49,87.5 2 0 -github.com/ethereum/go-ethereum/les/pruner.go:91.6,93.10 2 1 -github.com/ethereum/go-ethereum/les/pruner.go:94.24,94.24 0 0 -github.com/ethereum/go-ethereum/les/pruner.go:95.20,96.10 1 0 -github.com/ethereum/go-ethereum/les/ulc.go:32.59,34.29 2 1 -github.com/ethereum/go-ethereum/les/ulc.go:42.2,42.20 1 1 -github.com/ethereum/go-ethereum/les/ulc.go:45.2,48.8 1 1 -github.com/ethereum/go-ethereum/les/ulc.go:34.29,36.17 2 1 -github.com/ethereum/go-ethereum/les/ulc.go:40.3,40.34 1 1 -github.com/ethereum/go-ethereum/les/ulc.go:36.17,38.12 2 0 -github.com/ethereum/go-ethereum/les/ulc.go:42.20,44.3 1 0 -github.com/ethereum/go-ethereum/les/ulc.go:52.40,54.2 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:76.151,87.2 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:90.33,93.2 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:96.32,99.2 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:102.88,108.2 5 0 -github.com/ethereum/go-ethereum/les/server_handler.go:110.53,121.117 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:126.2,126.14 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:135.2,140.17 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:146.2,146.51 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:149.2,149.67 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:154.2,157.15 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:166.2,170.6 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:121.117,124.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:126.14,127.56 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:130.3,132.13 3 0 -github.com/ethereum/go-ethereum/les/server_handler.go:127.56,129.4 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:140.17,143.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:146.51,148.3 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:149.67,153.3 3 0 -github.com/ethereum/go-ethereum/les/server_handler.go:157.15,163.3 5 1 -github.com/ethereum/go-ethereum/les/server_handler.go:170.6,171.10 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:177.3,177.45 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:172.25,174.14 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:175.11,175.11 0 1 -github.com/ethereum/go-ethereum/les/server_handler.go:177.45,180.4 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:185.150,188.38 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:194.2,194.18 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:198.2,200.15 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:208.2,209.20 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:213.2,215.19 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:219.2,219.22 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:188.38,191.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:194.18,197.3 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:200.15,205.3 4 1 -github.com/ethereum/go-ethereum/les/server_handler.go:209.20,212.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:215.19,218.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:224.158,225.18 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:228.2,232.18 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:238.2,239.18 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:242.2,243.34 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:251.2,252.18 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:225.18,227.3 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:232.18,236.3 3 0 -github.com/ethereum/go-ethereum/les/server_handler.go:239.18,241.3 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:243.34,245.3 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:245.8,247.25 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:247.25,249.4 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:252.18,257.22 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:257.22,258.41 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:258.41,259.12 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:260.25,260.25 0 0 -github.com/ethereum/go-ethereum/les/server_handler.go:261.13,261.13 0 0 -github.com/ethereum/go-ethereum/les/server_handler.go:270.76,273.16 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:276.2,279.35 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:283.2,288.9 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:293.2,297.16 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:301.2,301.30 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:305.2,311.17 4 1 -github.com/ethereum/go-ethereum/les/server_handler.go:314.2,315.12 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:333.2,333.39 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:337.2,337.12 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:273.16,275.3 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:279.35,282.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:288.9,292.3 3 0 -github.com/ethereum/go-ethereum/les/server_handler.go:297.16,300.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:301.30,304.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:311.17,313.3 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:315.12,321.31 4 1 -github.com/ethereum/go-ethereum/les/server_handler.go:321.31,323.20 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:326.4,328.64 3 0 -github.com/ethereum/go-ethereum/les/server_handler.go:323.20,325.5 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:333.39,336.3 2 0 -github.com/ethereum/go-ethereum/les/server_handler.go:341.55,343.2 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:346.47,348.2 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:351.44,353.2 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:356.43,358.2 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:361.92,363.16 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:366.2,367.16 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:370.2,371.51 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:374.2,374.17 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:363.16,365.3 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:367.16,369.3 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:371.51,373.3 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:378.74,383.13 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:391.2,391.29 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:394.2,395.13 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:384.19,386.87 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:387.19,389.99 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:391.29,393.3 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:402.41,413.6 6 1 -github.com/ethereum/go-ethereum/les/server_handler.go:413.6,414.10 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:415.23,419.40 4 1 -github.com/ethereum/go-ethereum/les/server_handler.go:422.4,423.23 2 1 -github.com/ethereum/go-ethereum/les/server_handler.go:429.4,431.97 3 1 -github.com/ethereum/go-ethereum/les/server_handler.go:432.20,433.10 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:419.40,420.13 1 0 -github.com/ethereum/go-ethereum/les/server_handler.go:423.23,425.91 1 1 -github.com/ethereum/go-ethereum/les/server_handler.go:425.91,427.6 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:151.81,153.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:156.2,156.83 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:153.39,155.3 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:156.83,167.83 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:239.3,239.47 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:167.83,168.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:172.4,173.16 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:185.4,185.21 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:188.4,192.11 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:237.4,237.17 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:168.31,170.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:173.16,174.14 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:174.14,176.23 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:176.23,178.7 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:179.11,181.6 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:182.10,184.5 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:185.21,186.10 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:193.37,196.22 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:202.38,208.24 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:225.25,227.48 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:233.26,235.46 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:196.22,198.6 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:198.11,201.6 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:208.24,212.6 3 0 -github.com/ethereum/go-ethereum/les/server_requests.go:212.11,213.61 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:213.61,216.44 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:216.44,218.8 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:218.13,220.8 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:221.12,223.7 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:227.48,229.6 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:229.11,231.6 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:244.80,246.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:249.2,249.83 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:246.39,248.3 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:249.83,255.33 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:270.3,270.48 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:255.33,256.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:259.4,259.34 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:262.4,263.19 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:267.4,268.22 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:256.31,258.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:259.34,260.10 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:263.19,265.13 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:275.73,277.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:280.2,280.83 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:277.39,279.3 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:280.83,286.34 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:324.3,324.36 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:286.34,287.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:291.4,292.21 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:299.4,300.84 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:305.4,308.18 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:313.4,314.18 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:319.4,320.54 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:287.31,289.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:292.21,295.13 3 0 -github.com/ethereum/go-ethereum/les/server_requests.go:300.84,303.13 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:308.18,311.13 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:314.18,316.13 2 0 -github.com/ethereum/go-ethereum/les/server_requests.go:320.54,321.10 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:329.77,331.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:334.2,334.83 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:331.39,333.3 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:334.83,340.33 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:363.3,363.47 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:340.33,341.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:344.4,344.34 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:348.4,349.22 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:356.4,356.62 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:341.31,343.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:344.34,345.10 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:349.22,350.103 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:350.103,352.14 2 0 -github.com/ethereum/go-ethereum/les/server_requests.go:356.62,358.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:358.10,361.5 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:368.75,370.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:373.2,373.83 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:370.39,372.3 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:373.83,383.34 4 1 -github.com/ethereum/go-ethereum/les/server_requests.go:446.3,446.52 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:383.34,384.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:388.4,388.34 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:407.4,407.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:412.4,415.31 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:438.4,438.76 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:442.4,442.45 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:384.31,386.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:388.34,391.66 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:398.5,399.85 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:404.5,404.23 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:391.66,394.14 3 0 -github.com/ethereum/go-ethereum/les/server_requests.go:399.85,402.14 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:407.31,409.13 2 0 -github.com/ethereum/go-ethereum/les/server_requests.go:416.11,419.34 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:423.12,426.19 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:431.5,432.34 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:419.34,421.14 2 0 -github.com/ethereum/go-ethereum/les/server_requests.go:426.19,429.14 3 0 -github.com/ethereum/go-ethereum/les/server_requests.go:432.34,434.14 2 0 -github.com/ethereum/go-ethereum/les/server_requests.go:438.76,440.13 2 0 -github.com/ethereum/go-ethereum/les/server_requests.go:442.45,443.10 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:451.85,453.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:456.2,456.83 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:453.39,455.3 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:456.83,466.34 4 1 -github.com/ethereum/go-ethereum/les/server_requests.go:500.3,500.103 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:466.34,467.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:470.4,470.80 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:474.4,474.22 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:482.4,483.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:486.4,486.93 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:496.4,496.54 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:467.31,469.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:470.80,473.5 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:474.22,476.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:483.39,485.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:486.93,489.19 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:493.5,494.26 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:489.19,492.6 2 0 -github.com/ethereum/go-ethereum/les/server_requests.go:496.54,497.10 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:505.72,507.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:510.2,511.83 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:507.39,509.3 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:511.83,513.28 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:532.3,532.41 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:513.28,514.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:517.4,519.47 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:514.31,516.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:519.47,522.29 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:525.5,525.64 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:529.5,529.39 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:522.29,524.6 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:525.64,527.14 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:537.77,539.39 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:542.2,542.83 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:539.39,541.3 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:542.83,544.33 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:550.3,550.41 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:544.33,545.31 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:548.4,548.38 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:545.31,547.5 1 0 -github.com/ethereum/go-ethereum/les/server_requests.go:555.65,561.41 3 1 -github.com/ethereum/go-ethereum/les/server_requests.go:568.2,568.13 1 1 -github.com/ethereum/go-ethereum/les/server_requests.go:561.41,563.20 2 1 -github.com/ethereum/go-ethereum/les/server_requests.go:563.20,566.4 2 1 -github.com/ethereum/go-ethereum/les/bloombits.go:46.66,47.43 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:47.43,48.13 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:48.13,50.8 2 0 -github.com/ethereum/go-ethereum/les/bloombits.go:50.8,51.12 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:52.24,53.12 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:55.41,59.20 4 0 -github.com/ethereum/go-ethereum/les/bloombits.go:70.6,70.21 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:59.20,60.36 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:60.36,61.96 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:61.96,63.9 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:63.14,65.9 1 0 -github.com/ethereum/go-ethereum/les/bloombits.go:67.12,69.7 1 0 -github.com/ethereum/go-ethereum/les/commons.go:40.67,42.2 1 1 -github.com/ethereum/go-ethereum/les/commons.go:75.208,77.35 2 0 -github.com/ethereum/go-ethereum/les/commons.go:91.2,91.15 1 0 -github.com/ethereum/go-ethereum/les/commons.go:77.35,84.58 2 0 -github.com/ethereum/go-ethereum/les/commons.go:84.58,86.5 1 0 -github.com/ethereum/go-ethereum/les/commons.go:95.45,106.2 3 0 -github.com/ethereum/go-ethereum/les/commons.go:111.71,115.26 3 0 -github.com/ethereum/go-ethereum/les/commons.go:118.2,118.19 1 0 -github.com/ethereum/go-ethereum/les/commons.go:122.2,122.40 1 0 -github.com/ethereum/go-ethereum/les/commons.go:115.26,117.3 1 0 -github.com/ethereum/go-ethereum/les/commons.go:118.19,121.3 1 0 -github.com/ethereum/go-ethereum/les/commons.go:130.77,138.2 2 0 -github.com/ethereum/go-ethereum/les/commons.go:141.136,143.19 2 0 -github.com/ethereum/go-ethereum/les/commons.go:147.2,147.19 1 0 -github.com/ethereum/go-ethereum/les/commons.go:151.2,151.92 1 0 -github.com/ethereum/go-ethereum/les/commons.go:155.2,160.15 6 0 -github.com/ethereum/go-ethereum/les/commons.go:143.19,146.3 1 0 -github.com/ethereum/go-ethereum/les/commons.go:147.19,150.3 2 0 -github.com/ethereum/go-ethereum/les/commons.go:151.92,154.3 2 0 -github.com/ethereum/go-ethereum/les/fetcher.go:80.48,86.43 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:89.2,93.43 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:86.43,88.3 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:93.43,94.58 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:97.3,98.43 2 0 -github.com/ethereum/go-ethereum/les/fetcher.go:94.58,96.4 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:104.61,109.40 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:120.2,120.16 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:124.2,124.16 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:109.40,111.18 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:114.3,114.31 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:117.3,118.39 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:111.18,112.12 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:114.31,115.9 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:120.16,123.3 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:160.199,162.48 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:166.2,166.28 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:167.2,167.29 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:168.2,168.57 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:176.2,192.10 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:162.48,165.3 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:166.28,166.76 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:167.29,167.53 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:168.57,171.17 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:174.3,174.53 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:171.17,173.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:195.32,199.2 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:201.31,205.2 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:208.52,213.2 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:216.54,221.2 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:224.55,229.2 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:233.82,237.32 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:237.32,238.23 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:238.23,240.4 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:257.35,277.38 5 1 -github.com/ethereum/go-ethereum/les/fetcher.go:284.2,284.76 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:301.2,301.6 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:277.38,280.3 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:284.76,289.56 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:299.3,299.25 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:289.56,290.90 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:297.4,297.15 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:290.90,292.58 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:292.58,295.6 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:301.6,302.10 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:303.31,308.19 4 1 -github.com/ethereum/go-ethereum/les/fetcher.go:314.4,314.62 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:319.4,322.51 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:325.4,328.24 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:344.4,344.25 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:361.29,363.26 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:367.25,368.41 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:375.4,375.45 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:377.30,378.47 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:402.23,404.15 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:407.4,411.57 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:429.4,429.32 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:433.4,433.28 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:437.31,441.11 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:461.4,462.28 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:465.4,465.90 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:467.20,468.10 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:308.19,310.13 2 0 -github.com/ethereum/go-ethereum/les/fetcher.go:314.62,317.13 3 0 -github.com/ethereum/go-ethereum/les/fetcher.go:322.51,323.13 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:328.24,334.84 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:340.5,341.100 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:334.84,338.14 4 1 -github.com/ethereum/go-ethereum/les/fetcher.go:344.25,348.28 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:348.28,349.85 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:355.6,357.93 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:349.85,353.15 4 1 -github.com/ethereum/go-ethereum/les/fetcher.go:363.26,365.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:368.41,369.67 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:369.67,373.6 3 0 -github.com/ethereum/go-ethereum/les/fetcher.go:378.47,386.31 3 1 -github.com/ethereum/go-ethereum/les/fetcher.go:391.5,391.43 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:396.5,396.91 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:386.31,389.14 3 0 -github.com/ethereum/go-ethereum/les/fetcher.go:391.43,394.14 3 0 -github.com/ethereum/go-ethereum/les/fetcher.go:397.10,400.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:404.15,405.13 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:411.57,413.34 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:427.5,427.16 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:413.34,414.74 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:414.74,415.53 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:420.7,421.49 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:415.53,417.13 2 0 -github.com/ethereum/go-ethereum/les/fetcher.go:421.49,423.13 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:429.32,432.5 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:433.28,435.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:441.11,445.46 4 1 -github.com/ethereum/go-ethereum/les/fetcher.go:453.5,453.27 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:445.46,447.60 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:450.6,451.57 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:447.60,448.12 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:453.27,454.62 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:457.6,457.33 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:454.62,456.7 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:462.28,464.5 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:474.68,475.9 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:476.79,476.79 0 1 -github.com/ethereum/go-ethereum/les/fetcher.go:477.19,478.9 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:483.86,484.9 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:485.93,485.93 0 1 -github.com/ethereum/go-ethereum/les/fetcher.go:486.19,486.19 0 0 -github.com/ethereum/go-ethereum/les/fetcher.go:496.85,497.38 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:497.38,499.38 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:512.3,513.13 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:499.38,499.103 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:500.36,500.78 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:501.38,506.19 4 1 -github.com/ethereum/go-ethereum/les/fetcher.go:506.19,509.6 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:518.47,519.35 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:523.2,524.38 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:527.2,527.21 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:519.35,521.3 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:524.38,526.3 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:531.112,533.9 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:538.2,538.17 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:534.99,534.99 0 1 -github.com/ethereum/go-ethereum/les/fetcher.go:535.19,536.13 1 0 -github.com/ethereum/go-ethereum/les/fetcher.go:542.89,544.24 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:549.2,550.31 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:555.2,555.55 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:544.24,547.3 2 1 -github.com/ethereum/go-ethereum/les/fetcher.go:550.31,551.33 1 1 -github.com/ethereum/go-ethereum/les/fetcher.go:551.33,553.4 1 1 -github.com/ethereum/go-ethereum/les/peer.go:86.69,89.16 3 1 -github.com/ethereum/go-ethereum/les/peer.go:92.2,93.16 2 1 -github.com/ethereum/go-ethereum/les/peer.go:96.2,96.25 1 1 -github.com/ethereum/go-ethereum/les/peer.go:89.16,91.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:93.16,95.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:99.54,102.26 3 1 -github.com/ethereum/go-ethereum/les/peer.go:106.2,106.16 1 1 -github.com/ethereum/go-ethereum/les/peer.go:102.26,105.3 2 1 -github.com/ethereum/go-ethereum/les/peer.go:109.61,111.9 2 1 -github.com/ethereum/go-ethereum/les/peer.go:114.2,114.16 1 1 -github.com/ethereum/go-ethereum/les/peer.go:117.2,117.34 1 1 -github.com/ethereum/go-ethereum/les/peer.go:111.9,113.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:114.16,116.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:146.39,148.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:151.39,153.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:157.48,159.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:162.39,164.2 1 0 -github.com/ethereum/go-ethereum/les/peer.go:175.40,181.2 1 0 -github.com/ethereum/go-ethereum/les/peer.go:184.49,189.2 3 1 -github.com/ethereum/go-ethereum/les/peer.go:192.37,197.2 3 1 -github.com/ethereum/go-ethereum/les/peer.go:200.67,205.2 3 1 -github.com/ethereum/go-ethereum/les/peer.go:209.89,215.12 2 1 -github.com/ethereum/go-ethereum/les/peer.go:218.2,218.12 1 1 -github.com/ethereum/go-ethereum/les/peer.go:240.2,242.25 3 1 -github.com/ethereum/go-ethereum/les/peer.go:252.2,252.22 1 1 -github.com/ethereum/go-ethereum/les/peer.go:215.12,217.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:218.12,221.17 2 1 -github.com/ethereum/go-ethereum/les/peer.go:225.3,225.28 1 1 -github.com/ethereum/go-ethereum/les/peer.go:229.3,229.36 1 1 -github.com/ethereum/go-ethereum/les/peer.go:234.3,234.47 1 1 -github.com/ethereum/go-ethereum/les/peer.go:238.3,238.14 1 1 -github.com/ethereum/go-ethereum/les/peer.go:221.17,224.4 2 0 -github.com/ethereum/go-ethereum/les/peer.go:225.28,228.4 2 0 -github.com/ethereum/go-ethereum/les/peer.go:229.36,232.4 2 0 -github.com/ethereum/go-ethereum/les/peer.go:234.47,237.4 2 0 -github.com/ethereum/go-ethereum/les/peer.go:242.25,243.10 1 1 -github.com/ethereum/go-ethereum/les/peer.go:244.22,245.18 1 1 -github.com/ethereum/go-ethereum/les/peer.go:248.20,249.35 1 0 -github.com/ethereum/go-ethereum/les/peer.go:245.18,247.5 1 0 -github.com/ethereum/go-ethereum/les/peer.go:259.223,278.23 10 1 -github.com/ethereum/go-ethereum/les/peer.go:282.2,282.25 1 1 -github.com/ethereum/go-ethereum/les/peer.go:286.2,287.16 2 1 -github.com/ethereum/go-ethereum/les/peer.go:290.2,291.31 2 1 -github.com/ethereum/go-ethereum/les/peer.go:294.2,296.63 3 1 -github.com/ethereum/go-ethereum/les/peer.go:299.2,299.57 1 1 -github.com/ethereum/go-ethereum/les/peer.go:302.2,302.59 1 1 -github.com/ethereum/go-ethereum/les/peer.go:305.2,305.25 1 1 -github.com/ethereum/go-ethereum/les/peer.go:308.2,308.27 1 1 -github.com/ethereum/go-ethereum/les/peer.go:311.2,311.32 1 1 -github.com/ethereum/go-ethereum/les/peer.go:315.2,315.23 1 1 -github.com/ethereum/go-ethereum/les/peer.go:324.2,324.25 1 1 -github.com/ethereum/go-ethereum/les/peer.go:327.2,327.12 1 1 -github.com/ethereum/go-ethereum/les/peer.go:278.23,280.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:282.25,284.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:287.16,289.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:291.31,293.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:296.63,298.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:299.57,301.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:302.59,304.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:305.25,307.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:308.27,310.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:311.32,313.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:315.23,317.53 2 1 -github.com/ethereum/go-ethereum/les/peer.go:320.3,320.44 1 1 -github.com/ethereum/go-ethereum/les/peer.go:317.53,319.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:320.44,322.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:324.25,326.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:331.31,334.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:366.110,380.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:384.53,386.24 2 1 -github.com/ethereum/go-ethereum/les/peer.go:399.2,400.43 2 1 -github.com/ethereum/go-ethereum/les/peer.go:386.24,388.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:388.8,393.24 4 1 -github.com/ethereum/go-ethereum/les/peer.go:393.24,395.4 1 1 -github.com/ethereum/go-ethereum/les/peer.go:395.9,397.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:405.31,406.50 1 0 -github.com/ethereum/go-ethereum/les/peer.go:406.50,408.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:413.33,415.2 1 0 -github.com/ethereum/go-ethereum/les/peer.go:419.82,425.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:427.93,430.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:434.119,437.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:441.109,444.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:448.78,451.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:455.70,458.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:461.80,464.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:467.73,470.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:473.88,476.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:479.82,482.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:485.80,488.25 3 0 -github.com/ethereum/go-ethereum/les/peer.go:491.2,491.55 1 0 -github.com/ethereum/go-ethereum/les/peer.go:488.25,490.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:495.74,497.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:501.72,506.18 4 1 -github.com/ethereum/go-ethereum/les/peer.go:509.2,510.32 2 1 -github.com/ethereum/go-ethereum/les/peer.go:513.2,513.13 1 1 -github.com/ethereum/go-ethereum/les/peer.go:506.18,508.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:510.32,512.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:518.62,523.18 4 0 -github.com/ethereum/go-ethereum/les/peer.go:526.2,528.21 3 0 -github.com/ethereum/go-ethereum/les/peer.go:531.2,531.32 1 0 -github.com/ethereum/go-ethereum/les/peer.go:534.2,534.13 1 0 -github.com/ethereum/go-ethereum/les/peer.go:523.18,525.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:528.21,530.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:531.32,533.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:538.84,542.27 3 1 -github.com/ethereum/go-ethereum/les/peer.go:545.2,547.14 3 1 -github.com/ethereum/go-ethereum/les/peer.go:554.2,554.85 1 1 -github.com/ethereum/go-ethereum/les/peer.go:542.27,544.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:547.14,550.3 2 1 -github.com/ethereum/go-ethereum/les/peer.go:550.8,553.3 2 1 -github.com/ethereum/go-ethereum/les/peer.go:559.60,565.120 4 1 -github.com/ethereum/go-ethereum/les/peer.go:570.2,571.48 2 1 -github.com/ethereum/go-ethereum/les/peer.go:565.120,569.3 2 1 -github.com/ethereum/go-ethereum/les/peer.go:571.48,573.38 2 0 -github.com/ethereum/go-ethereum/les/peer.go:573.38,575.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:581.79,586.2 3 1 -github.com/ethereum/go-ethereum/les/peer.go:590.103,593.107 1 1 -github.com/ethereum/go-ethereum/les/peer.go:593.107,598.16 2 1 -github.com/ethereum/go-ethereum/les/peer.go:601.3,601.56 1 1 -github.com/ethereum/go-ethereum/les/peer.go:598.16,600.4 1 1 -github.com/ethereum/go-ethereum/les/peer.go:602.34,608.50 2 1 -github.com/ethereum/go-ethereum/les/peer.go:611.3,611.54 1 1 -github.com/ethereum/go-ethereum/les/peer.go:614.3,614.52 1 1 -github.com/ethereum/go-ethereum/les/peer.go:617.3,618.56 2 1 -github.com/ethereum/go-ethereum/les/peer.go:621.3,621.58 1 1 -github.com/ethereum/go-ethereum/les/peer.go:624.3,624.56 1 1 -github.com/ethereum/go-ethereum/les/peer.go:627.3,627.58 1 1 -github.com/ethereum/go-ethereum/les/peer.go:630.3,630.38 1 1 -github.com/ethereum/go-ethereum/les/peer.go:633.3,633.24 1 1 -github.com/ethereum/go-ethereum/les/peer.go:645.3,645.35 1 1 -github.com/ethereum/go-ethereum/les/peer.go:649.3,650.71 2 1 -github.com/ethereum/go-ethereum/les/peer.go:653.3,653.75 1 1 -github.com/ethereum/go-ethereum/les/peer.go:656.3,657.59 2 1 -github.com/ethereum/go-ethereum/les/peer.go:660.3,667.22 6 1 -github.com/ethereum/go-ethereum/les/peer.go:674.3,674.13 1 1 -github.com/ethereum/go-ethereum/les/peer.go:608.50,610.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:611.54,613.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:614.52,616.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:618.56,620.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:621.58,623.4 1 1 -github.com/ethereum/go-ethereum/les/peer.go:624.56,626.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:627.58,629.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:630.38,632.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:633.24,635.64 2 1 -github.com/ethereum/go-ethereum/les/peer.go:638.4,638.34 1 1 -github.com/ethereum/go-ethereum/les/peer.go:635.64,637.5 1 0 -github.com/ethereum/go-ethereum/les/peer.go:639.9,644.4 1 1 -github.com/ethereum/go-ethereum/les/peer.go:645.35,647.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:650.71,652.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:653.75,655.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:657.59,659.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:667.22,668.40 1 1 -github.com/ethereum/go-ethereum/les/peer.go:668.40,669.34 1 1 -github.com/ethereum/go-ethereum/les/peer.go:669.34,671.6 1 0 -github.com/ethereum/go-ethereum/les/peer.go:680.65,683.16 3 0 -github.com/ethereum/go-ethereum/les/peer.go:688.2,688.19 1 0 -github.com/ethereum/go-ethereum/les/peer.go:683.16,685.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:685.8,687.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:692.39,696.31 3 1 -github.com/ethereum/go-ethereum/les/peer.go:699.2,700.37 2 0 -github.com/ethereum/go-ethereum/les/peer.go:708.2,708.42 1 0 -github.com/ethereum/go-ethereum/les/peer.go:696.31,698.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:700.37,701.48 1 0 -github.com/ethereum/go-ethereum/les/peer.go:701.48,703.20 2 0 -github.com/ethereum/go-ethereum/les/peer.go:703.20,705.5 1 0 -github.com/ethereum/go-ethereum/les/peer.go:718.69,720.23 2 1 -github.com/ethereum/go-ethereum/les/peer.go:723.2,723.19 1 1 -github.com/ethereum/go-ethereum/les/peer.go:720.23,722.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:727.49,729.23 2 1 -github.com/ethereum/go-ethereum/les/peer.go:733.2,737.9 5 0 -github.com/ethereum/go-ethereum/les/peer.go:740.2,745.35 3 0 -github.com/ethereum/go-ethereum/les/peer.go:753.2,754.35 2 0 -github.com/ethereum/go-ethereum/les/peer.go:729.23,732.3 2 1 -github.com/ethereum/go-ethereum/les/peer.go:737.9,739.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:745.35,748.3 2 0 -github.com/ethereum/go-ethereum/les/peer.go:748.8,752.3 3 0 -github.com/ethereum/go-ethereum/les/peer.go:785.96,799.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:803.44,804.51 1 1 -github.com/ethereum/go-ethereum/les/peer.go:813.2,813.13 1 1 -github.com/ethereum/go-ethereum/les/peer.go:804.51,805.27 1 0 -github.com/ethereum/go-ethereum/les/peer.go:805.27,809.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:809.9,811.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:817.39,819.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:822.50,824.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:830.31,831.22 1 1 -github.com/ethereum/go-ethereum/les/peer.go:838.2,838.42 1 1 -github.com/ethereum/go-ethereum/les/peer.go:831.22,837.3 3 0 -github.com/ethereum/go-ethereum/les/peer.go:838.42,839.13 1 1 -github.com/ethereum/go-ethereum/les/peer.go:839.13,842.8 3 1 -github.com/ethereum/go-ethereum/les/peer.go:842.8,844.22 2 1 -github.com/ethereum/go-ethereum/les/peer.go:847.5,847.31 1 1 -github.com/ethereum/go-ethereum/les/peer.go:851.5,853.11 3 1 -github.com/ethereum/go-ethereum/les/peer.go:844.22,846.6 1 0 -github.com/ethereum/go-ethereum/les/peer.go:847.31,849.14 2 0 -github.com/ethereum/go-ethereum/les/peer.go:869.39,875.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:878.31,880.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:883.86,886.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:890.86,893.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:897.69,900.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:904.85,907.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:910.80,913.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:916.87,919.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:922.81,925.2 2 1 -github.com/ethereum/go-ethereum/les/peer.go:929.63,931.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:934.56,936.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:939.43,944.2 3 0 -github.com/ethereum/go-ethereum/les/peer.go:950.68,954.38 3 1 -github.com/ethereum/go-ethereum/les/peer.go:963.2,963.36 1 1 -github.com/ethereum/go-ethereum/les/peer.go:966.2,966.21 1 1 -github.com/ethereum/go-ethereum/les/peer.go:954.38,960.22 6 1 -github.com/ethereum/go-ethereum/les/peer.go:960.22,960.70 1 1 -github.com/ethereum/go-ethereum/les/peer.go:963.36,965.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:973.61,978.21 4 1 -github.com/ethereum/go-ethereum/les/peer.go:978.21,980.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:984.41,985.30 1 1 -github.com/ethereum/go-ethereum/les/peer.go:988.2,988.70 1 1 -github.com/ethereum/go-ethereum/les/peer.go:985.30,987.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:988.70,989.26 1 1 -github.com/ethereum/go-ethereum/les/peer.go:994.3,994.106 1 1 -github.com/ethereum/go-ethereum/les/peer.go:989.26,989.60 1 1 -github.com/ethereum/go-ethereum/les/peer.go:989.62,991.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:991.9,993.4 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1003.37,1004.22 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1011.2,1011.42 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1004.22,1010.3 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1011.42,1012.13 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1012.13,1015.8 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1015.8,1017.22 2 0 -github.com/ethereum/go-ethereum/les/peer.go:1020.5,1020.31 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1017.22,1019.6 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1020.31,1022.6 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1022.11,1025.11 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1034.169,1036.34 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1043.2,1043.42 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1046.2,1046.54 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1051.2,1052.95 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1036.34,1037.35 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1037.35,1039.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1039.9,1041.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1043.42,1045.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1046.54,1048.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1052.95,1054.44 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1068.3,1068.24 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1071.3,1075.45 4 1 -github.com/ethereum/go-ethereum/les/peer.go:1080.3,1086.56 4 1 -github.com/ethereum/go-ethereum/les/peer.go:1054.44,1062.26 5 1 -github.com/ethereum/go-ethereum/les/peer.go:1065.4,1066.41 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1062.26,1064.5 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1068.24,1070.4 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1075.45,1077.4 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1077.9,1079.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1086.56,1088.17 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1088.17,1091.5 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1093.34,1095.15 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1103.3,1103.13 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1095.15,1097.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1097.9,1098.56 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1098.56,1101.5 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1107.36,1111.2 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1113.42,1117.2 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1120.35,1122.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1144.40,1146.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1150.62,1155.29 4 1 -github.com/ethereum/go-ethereum/les/peer.go:1155.29,1157.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1161.64,1165.35 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1165.35,1166.15 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1166.15,1169.4 2 0 -github.com/ethereum/go-ethereum/les/peer.go:1175.59,1179.15 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1182.2,1182.42 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1185.2,1186.37 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1189.2,1189.12 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1179.15,1181.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1182.42,1184.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1186.37,1188.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1195.54,1200.9 4 1 -github.com/ethereum/go-ethereum/les/peer.go:1203.2,1204.37 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1207.2,1208.12 2 1 -github.com/ethereum/go-ethereum/les/peer.go:1200.9,1202.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1204.37,1206.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1212.41,1217.27 4 1 -github.com/ethereum/go-ethereum/les/peer.go:1220.2,1220.12 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1217.27,1219.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1224.54,1229.2 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1232.36,1237.2 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1242.49,1250.29 4 0 -github.com/ethereum/go-ethereum/les/peer.go:1255.2,1255.17 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1250.29,1251.56 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1251.56,1253.4 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1259.51,1264.29 4 1 -github.com/ethereum/go-ethereum/les/peer.go:1267.2,1267.13 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1264.29,1266.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1272.34,1276.29 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1279.2,1279.18 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1276.29,1278.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1294.40,1296.2 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1300.59,1304.15 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1307.2,1307.44 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1310.2,1312.12 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1304.15,1306.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1307.44,1309.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1318.56,1323.9 4 1 -github.com/ethereum/go-ethereum/les/peer.go:1326.2,1328.12 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1323.9,1325.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1332.43,1337.27 4 0 -github.com/ethereum/go-ethereum/les/peer.go:1340.2,1340.12 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1337.27,1339.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1344.56,1349.2 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1352.36,1357.2 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1361.69,1363.2 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1366.59,1371.32 4 1 -github.com/ethereum/go-ethereum/les/peer.go:1371.32,1373.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1378.57,1379.31 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1382.2,1382.24 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1379.31,1381.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1383.26,1384.37 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1385.26,1386.53 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1390.3,1390.39 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1386.53,1389.4 2 0 -github.com/ethereum/go-ethereum/les/peer.go:1396.34,1400.29 3 1 -github.com/ethereum/go-ethereum/les/peer.go:1403.2,1403.18 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1400.29,1402.3 1 1 -github.com/ethereum/go-ethereum/les/peer.go:1417.32,1419.2 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1421.54,1425.14 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1428.2,1428.39 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1431.2,1432.12 2 0 -github.com/ethereum/go-ethereum/les/peer.go:1425.14,1427.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1428.39,1430.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1435.56,1439.14 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1442.2,1442.40 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1445.2,1447.12 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1439.14,1441.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1442.40,1444.3 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1450.29,1454.26 3 0 -github.com/ethereum/go-ethereum/les/peer.go:1457.2,1457.17 1 0 -github.com/ethereum/go-ethereum/les/peer.go:1454.26,1456.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:48.77,50.16 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:53.2,54.57 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:57.2,63.16 4 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:67.2,71.3 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:50.16,52.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:54.57,56.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:63.16,65.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:74.79,75.68 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:75.68,77.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:80.151,85.19 4 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:89.2,98.15 8 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:105.2,105.17 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:115.2,115.44 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:123.2,124.16 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:127.2,128.16 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:131.2,132.41 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:85.19,87.3 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:98.15,102.3 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:102.8,102.24 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:102.24,104.3 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:105.17,109.41 4 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:112.3,112.42 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:109.41,111.4 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:115.44,117.47 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:117.47,120.4 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:124.16,126.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:128.16,130.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:135.83,137.16 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:140.2,140.55 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:137.16,139.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:143.67,145.16 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:148.2,149.55 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:152.2,152.12 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:145.16,147.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:149.55,151.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:155.82,157.16 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:160.2,161.54 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:165.2,166.65 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:169.2,169.26 1 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:157.16,159.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:161.54,163.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:166.65,168.3 1 0 -github.com/ethereum/go-ethereum/tests/bor/helper.go:172.41,175.17 3 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:179.2,180.13 2 1 -github.com/ethereum/go-ethereum/tests/bor/helper.go:175.17,178.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:30.154,36.16 4 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:39.2,47.9 5 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:36.16,38.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:48.20,49.31 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:51.24,56.30 3 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:58.22,68.75 4 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:75.153,81.16 4 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:84.2,92.9 5 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:81.16,83.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:93.20,94.31 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:96.24,101.30 3 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers.go:103.22,113.75 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:72.71,76.25 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:79.2,79.41 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:82.2,82.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:76.25,78.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:79.41,81.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:86.37,87.67 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:87.67,89.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:93.38,95.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:98.41,99.70 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:99.70,101.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:105.44,108.2 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:148.69,161.2 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:164.70,184.2 14 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:188.25,193.2 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:196.38,201.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:204.37,209.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:212.39,217.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:221.39,226.2 3 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:230.41,235.2 3 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:238.29,246.2 5 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:250.73,255.28 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:259.2,268.34 9 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:255.28,256.49 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:268.34,273.3 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:278.73,286.2 5 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:290.102,296.33 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:329.2,329.16 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:296.33,299.61 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:303.3,303.75 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:310.3,310.41 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:317.3,317.52 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:325.3,327.9 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:299.61,301.9 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:303.75,305.9 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:310.41,312.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:312.9,315.4 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:317.52,318.44 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:318.44,320.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:320.10,323.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:336.52,338.50 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:341.2,342.52 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:361.2,362.33 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:379.2,383.65 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:390.2,390.48 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:396.2,396.16 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:338.50,340.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:342.52,351.52 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:356.3,358.18 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:351.52,353.9 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:362.33,365.39 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:368.3,368.43 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:371.3,371.42 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:374.3,375.61 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:365.39,367.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:368.43,370.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:371.42,373.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:383.65,384.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:385.19,385.19 0 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:386.11,386.11 0 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:390.48,395.3 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:399.39,404.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:406.39,412.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:416.76,422.41 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:426.2,427.46 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:438.2,438.28 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:442.2,442.15 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:445.2,451.16 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:422.41,424.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:427.46,429.36 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:435.3,435.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:429.36,430.58 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:430.58,432.13 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:438.28,440.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:442.15,444.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:457.89,462.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:467.91,472.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:487.76,490.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:493.2,493.33 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:497.2,501.65 5 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:552.2,552.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:555.2,555.39 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:560.2,560.20 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:563.2,569.37 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:490.23,492.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:493.33,495.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:501.65,510.12 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:520.3,520.15 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:528.3,528.17 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:534.3,534.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:543.3,545.29 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:510.12,518.12 6 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:520.15,526.9 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:528.17,532.9 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:534.22,540.12 5 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:545.29,547.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:547.9,549.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:552.30,554.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:555.39,558.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:560.20,562.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:575.39,579.49 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:583.2,583.48 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:589.2,589.50 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:579.49,582.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:583.48,584.42 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:587.3,587.34 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:584.42,586.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:589.50,590.42 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:593.3,593.36 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:590.42,592.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:599.48,605.2 4 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:609.47,615.2 4 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:619.49,625.2 4 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:633.100,637.16 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:641.2,644.18 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:647.2,647.37 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:650.2,650.25 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:637.16,640.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:644.18,646.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:647.37,649.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:660.134,665.18 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:672.2,673.20 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:677.2,686.14 6 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:695.2,695.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:714.2,714.15 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:729.2,735.98 5 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:738.2,738.15 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:757.2,757.32 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:760.2,760.26 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:665.18,668.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:668.8,670.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:673.20,676.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:686.14,687.49 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:687.49,690.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:690.9,690.46 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:690.46,693.4 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:695.14,697.38 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:697.38,699.76 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:704.4,704.39 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:710.4,710.21 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:699.76,702.10 3 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:704.39,707.10 3 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:714.15,719.18 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:723.3,726.48 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:719.18,722.4 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:735.98,737.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:738.15,746.10 5 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:750.5,752.41 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:753.11,753.11 0 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:757.32,759.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:766.176,770.58 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:780.2,780.54 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:785.2,786.81 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:770.58,771.43 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:774.3,774.49 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:777.3,777.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:771.43,773.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:774.49,776.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:780.54,784.3 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:792.122,796.58 3 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:802.2,802.54 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:806.2,807.94 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:796.58,797.53 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:800.3,800.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:797.53,799.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:802.54,805.3 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:819.65,823.20 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:827.2,833.18 4 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:839.2,845.41 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:859.2,859.45 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:873.2,876.52 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:880.2,880.18 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:883.2,883.20 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:887.2,887.18 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:890.2,890.66 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:823.20,826.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:833.18,834.42 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:834.42,836.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:845.41,847.19 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:851.3,851.45 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:855.3,856.6 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:847.19,848.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:851.45,853.9 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:859.45,860.91 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:870.3,871.13 2 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:860.91,862.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:862.9,868.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:876.52,878.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:880.18,882.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:883.20,885.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:887.18,889.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/queue.go:895.55,902.2 4 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:33.41,35.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:39.37,41.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:45.77,47.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:51.91,53.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:57.92,59.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:64.50,66.15 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:71.2,71.14 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:66.15,68.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:68.8,70.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:76.120,79.2 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:83.88,88.9 4 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:96.2,96.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:89.39,90.48 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:91.18,92.96 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_headers.go:93.10,94.68 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:33.42,35.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:39.38,41.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:45.78,47.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:51.92,53.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:57.93,59.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:64.51,66.15 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:71.2,71.14 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:66.15,68.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:68.8,70.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:76.121,78.31 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:81.2,82.37 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:85.2,85.49 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:78.31,80.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:82.37,84.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:90.89,95.9 4 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:103.2,103.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:96.40,97.49 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:98.18,99.98 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_receipts.go:100.10,101.69 1 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:77.59,77.83 1 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:78.147,80.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:81.144,83.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:84.99,85.64 1 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:87.101,88.66 1 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:92.95,100.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:103.34,108.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:112.81,114.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:118.79,120.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:124.82,126.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:130.70,132.26 2 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:135.2,135.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:132.26,134.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:140.68,142.25 2 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:145.2,145.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:142.25,144.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:150.71,152.27 2 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:155.2,155.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:152.27,154.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:161.56,165.41 3 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:171.2,171.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:165.41,166.31 1 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:166.31,168.9 2 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:176.55,182.2 4 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:202.28,207.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:210.80,212.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:216.28,220.32 3 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:220.32,222.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:231.54,234.33 2 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:238.2,239.54 2 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:242.2,246.12 4 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:234.33,237.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:239.54,241.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:251.48,254.9 3 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:258.2,263.12 5 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:254.9,257.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:267.52,272.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:275.30,280.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:283.49,288.29 4 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:291.2,291.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:288.29,290.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:301.39,303.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:305.49,307.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/peer.go:309.44,312.2 2 1 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:44.69,49.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:52.38,59.14 5 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:67.2,71.23 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:59.14,61.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:75.37,77.15 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:83.2,90.12 5 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:77.15,82.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:90.12,92.16 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:99.3,99.102 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:105.3,105.23 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:92.16,96.4 3 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:99.102,102.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:105.23,107.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:113.51,123.26 6 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:126.2,128.12 3 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:123.26,125.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:137.74,139.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:147.76,149.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:157.86,167.53 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:170.2,170.12 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:167.53,169.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:178.59,182.21 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:190.2,194.16 3 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:201.2,202.21 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:210.2,210.13 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:221.2,222.56 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:229.2,229.20 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:251.2,251.19 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:183.16,184.51 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:185.16,186.55 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:187.10,188.43 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:194.16,200.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:203.16,204.86 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:205.16,206.90 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:207.10,208.87 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:210.13,219.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:222.56,228.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:229.20,237.22 5 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:245.3,245.13 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:249.3,249.16 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:238.17,239.46 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:240.17,241.50 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:242.11,243.47 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:245.13,247.12 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:256.60,258.16 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:261.2,261.6 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:258.16,260.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:261.6,267.74 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:272.3,272.23 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:284.3,284.35 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:288.3,288.42 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:297.3,298.10 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:303.3,304.17 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:267.74,271.4 3 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:272.23,274.11 2 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:278.6,278.6 0 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:279.22,280.23 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:284.35,285.12 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:288.42,289.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:290.31,291.15 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:292.22,293.23 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:299.40,299.40 0 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:300.21,301.22 1 0 -github.com/ethereum/go-ethereum/eth/downloader/beaconsync.go:304.17,306.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:33.39,35.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:39.35,41.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:45.75,47.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:51.89,53.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:57.90,59.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:64.48,66.15 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:71.2,71.14 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:66.15,68.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:68.8,70.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:76.118,78.28 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:82.2,83.37 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:86.2,86.47 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:78.28,80.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:83.37,85.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:91.86,96.9 4 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:104.2,104.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:97.35,98.47 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:99.18,100.91 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent_bodies.go:101.10,102.67 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:31.37,33.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:36.38,37.14 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:38.16,39.16 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:40.16,41.16 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:42.17,43.17 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:44.10,45.19 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:49.52,50.14 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:51.16,52.29 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:53.16,54.29 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:55.17,56.30 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:57.10,58.55 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:62.56,63.22 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:73.2,73.12 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:64.14,65.19 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:66.14,67.19 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:68.15,69.20 1 0 -github.com/ethereum/go-ethereum/eth/downloader/modes.go:70.10,71.82 1 0 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:48.44,54.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:58.69,63.24 4 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:66.2,67.28 2 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:63.24,65.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:78.123,84.38 5 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:87.2,87.17 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:91.2,91.36 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:84.38,86.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:87.17,90.3 2 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:98.88,104.2 4 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:108.123,113.27 4 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:119.2,119.11 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:122.2,123.42 2 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:113.27,118.3 2 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:119.11,121.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:128.48,132.23 3 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:135.2,135.55 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:138.2,138.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:132.23,134.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:135.55,137.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:145.44,149.18 2 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:158.2,159.19 2 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:149.18,150.35 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:153.3,154.41 2 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:150.35,151.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:154.41,155.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:163.62,168.23 4 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:171.2,176.55 4 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:180.2,183.16 3 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:168.23,170.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:176.55,178.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:187.46,191.29 3 1 -github.com/ethereum/go-ethereum/eth/downloader/resultstore.go:191.29,193.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/api.go:41.83,52.2 3 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:56.45,62.6 2 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:62.6,63.10 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:64.43,65.37 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:66.45,68.24 2 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:69.30,70.20 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:74.4,75.29 2 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:85.4,85.37 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:70.20,72.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:76.20,80.6 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:81.32,82.25 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:85.37,87.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:93.89,95.16 2 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:99.2,101.12 2 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:119.2,119.20 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:95.16,97.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:101.12,105.7 3 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:105.7,106.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:107.30,108.39 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:109.24,111.11 2 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:112.29,114.11 2 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:144.48,145.24 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:145.24,149.7 3 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:149.7,150.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:151.15,153.13 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:154.27,155.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/api.go:163.102,166.2 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:218.196,219.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:222.2,240.11 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:219.23,221.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:250.55,257.9 5 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:267.2,285.3 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:258.47,259.52 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:260.47,261.56 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:262.27,263.57 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:264.10,265.124 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:289.43,291.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:295.77,297.18 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:303.2,304.87 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:308.2,308.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:297.18,300.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:300.8,302.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:304.87,307.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:312.87,314.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:319.54,322.18 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:328.2,329.47 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:333.2,335.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:322.18,325.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:325.8,327.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:329.47,332.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:340.101,343.13 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:348.2,351.51 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:363.2,363.40 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:367.2,367.52 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:371.2,373.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:344.33,345.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:351.51,353.24 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:360.3,360.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:353.24,357.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:357.9,359.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:363.40,365.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:367.52,369.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:379.145,385.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:395.2,395.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:399.2,399.57 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:402.2,405.51 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:408.2,408.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:417.2,420.77 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:426.2,426.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:434.2,446.17 8 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:452.2,452.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:455.2,455.53 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:385.23,386.16 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:386.16,387.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:388.22,388.22 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:389.12,390.22 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:395.30,397.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:399.57,401.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:405.51,407.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:408.22,412.62 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:412.62,414.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:420.77,421.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:422.13,422.13 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:423.11,423.11 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:426.30,427.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:428.25,428.25 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:429.11,430.16 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:446.17,448.15 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:448.15,450.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:452.23,454.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:458.41,460.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:464.119,466.15 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:475.2,477.17 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:482.2,482.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:487.2,488.17 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:508.2,508.38 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:511.2,514.17 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:527.2,528.73 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:531.2,535.22 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:548.2,549.52 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:552.2,552.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:592.2,593.27 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:596.2,597.17 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:604.2,606.16 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:610.2,610.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:619.2,619.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:466.15,468.17 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:468.17,470.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:470.9,473.4 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:477.17,479.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:479.8,481.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:482.30,484.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:488.17,491.17 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:491.17,493.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:494.8,497.17 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:500.3,500.55 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:497.17,499.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:500.55,502.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:508.38,510.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:514.17,517.17 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:517.17,519.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:520.8,523.17 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:523.17,525.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:528.73,530.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:535.22,536.40 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:536.40,538.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:538.9,540.29 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:545.4,545.54 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:540.29,542.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:549.52,551.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:552.22,567.64 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:574.3,578.38 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:585.3,585.24 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:567.64,569.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:569.9,569.44 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:569.44,571.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:571.9,573.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:578.38,581.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:581.9,581.32 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:581.32,583.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:585.24,586.55 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:586.55,588.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:593.27,595.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:597.17,599.32 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:599.32,599.94 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:600.8,602.32 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:602.32,602.75 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:606.16,606.62 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:607.16,607.64 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:608.16,608.74 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:610.22,615.44 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:615.44,615.81 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:616.8,616.29 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:616.29,617.44 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:617.44,617.96 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:624.63,627.30 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:632.2,633.37 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:644.2,646.12 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:627.30,629.13 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:629.13,629.54 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:633.37,634.27 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:640.3,640.53 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:634.27,639.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:640.53,641.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:652.31,657.23 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:657.23,658.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:659.21,659.21 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:661.11,662.21 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:669.31,672.2 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:676.34,679.9 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:687.2,690.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:680.18,680.18 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:681.10,685.25 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:695.104,702.22 5 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:705.2,706.16 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:710.2,710.47 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:716.2,717.84 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:720.2,720.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:729.2,730.75 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:733.2,733.25 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:702.22,704.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:706.16,708.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:710.47,712.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:717.84,719.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:720.23,721.73 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:724.3,725.24 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:721.73,723.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:730.75,732.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:744.87,755.21 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:760.2,761.23 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:764.2,766.14 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:769.2,769.15 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:773.2,774.22 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:777.2,777.15 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:780.2,781.14 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:784.2,785.50 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:755.21,757.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:761.23,763.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:766.14,768.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:769.15,771.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:774.22,776.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:777.15,779.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:781.14,783.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:789.161,790.105 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:790.105,792.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:800.98,802.86 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:807.2,813.14 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:821.2,825.30 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:828.2,828.36 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:834.2,834.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:852.2,853.16 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:860.2,860.41 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:864.2,865.16 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:868.2,868.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:802.86,804.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:814.16,815.56 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:816.16,817.60 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:818.10,819.61 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:825.30,827.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:828.36,831.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:834.23,836.21 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:847.3,847.33 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:836.21,838.22 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:838.22,840.36 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:843.5,843.61 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:840.36,841.11 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:847.33,849.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:853.16,855.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:860.41,862.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:865.16,867.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:871.142,876.16 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:880.2,883.23 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:888.2,888.33 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:896.2,896.41 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:920.2,920.29 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:928.2,928.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:876.16,878.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:883.23,886.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:888.33,890.62 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:890.62,893.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:896.41,898.75 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:902.3,906.15 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:914.3,914.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:898.75,899.12 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:907.17,908.39 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:909.17,910.43 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:911.11,912.40 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:914.12,916.9 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:920.29,921.29 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:925.3,926.21 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:921.29,924.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:931.131,936.15 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:939.2,941.20 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:980.2,980.27 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:984.2,985.19 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:936.15,938.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:941.20,946.17 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:950.3,950.24 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:955.3,959.15 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:967.3,967.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:971.3,972.38 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:976.3,977.11 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:946.17,948.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:950.24,953.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:960.17,961.39 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:962.17,963.43 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:964.11,965.40 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:967.13,969.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:972.38,975.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:980.27,983.3 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:996.86,1007.6 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1007.6,1017.10 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1034.3,1034.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1061.3,1064.27 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1067.3,1069.15 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1096.3,1096.36 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1107.3,1107.24 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1128.3,1129.15 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1180.3,1180.39 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1190.3,1190.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1204.3,1204.28 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1018.17,1024.112 5 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1026.17,1028.125 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1030.11,1032.84 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1035.12,1035.12 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1038.20,1040.14 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1042.11,1048.79 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1054.4,1054.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1058.4,1058.71 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1048.79,1049.12 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1050.22,1050.22 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1051.23,1051.23 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1055.31,1055.31 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1056.22,1056.22 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1064.27,1066.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1069.15,1070.25 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1092.4,1093.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1070.25,1071.94 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1075.5,1075.98 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1079.5,1089.49 6 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1071.94,1074.6 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1075.98,1078.6 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1096.36,1098.45 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1102.4,1104.12 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1098.45,1101.5 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1107.24,1109.60 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1119.4,1120.11 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1109.60,1111.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1112.42,1113.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1114.23,1115.24 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1121.31,1122.15 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1123.22,1124.23 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1129.15,1131.18 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1135.4,1139.26 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1131.18,1134.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1140.9,1142.84 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1149.4,1149.32 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1142.84,1145.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1149.32,1152.26 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1163.5,1163.24 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1167.5,1167.71 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1152.26,1154.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1154.11,1156.70 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1156.70,1158.7 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1163.24,1165.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1167.71,1169.19 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1172.6,1173.31 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1169.19,1171.7 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1180.39,1182.11 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1183.41,1184.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1185.22,1186.23 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1190.23,1192.11 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1200.4,1200.32 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1196.6,1196.6 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1197.22,1198.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1204.28,1206.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1219.125,1224.16 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1227.2,1228.16 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1231.2,1231.36 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1224.16,1226.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1228.16,1230.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1237.70,1243.2 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1248.72,1254.2 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1259.93,1266.15 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1289.2,1291.6 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1266.15,1267.19 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1267.19,1269.25 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1273.4,1273.61 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1277.4,1278.25 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1282.4,1285.80 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1269.25,1272.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1273.61,1276.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1278.25,1281.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1291.6,1292.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1293.21,1295.22 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1297.33,1299.45 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1348.4,1351.25 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1472.4,1473.39 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1476.4,1479.79 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1299.45,1301.80 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1310.5,1310.20 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1344.5,1345.15 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1301.80,1302.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1303.23,1303.23 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1304.24,1304.24 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1310.20,1323.27 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1336.6,1336.47 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1323.27,1325.87 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1325.87,1327.8 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1336.47,1338.76 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1338.76,1340.8 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1351.25,1353.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1360.5,1361.29 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1364.5,1368.46 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1450.5,1450.45 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1467.5,1469.28 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1354.23,1356.24 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1357.13,1357.13 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1361.29,1363.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1368.46,1373.30 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1376.6,1379.95 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1385.6,1389.35 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1413.6,1413.31 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1434.6,1434.28 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1441.6,1441.28 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1373.30,1375.7 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1379.95,1381.7 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1389.35,1391.20 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1396.7,1396.43 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1391.20,1395.8 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1396.43,1398.28 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1398.28,1400.65 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1409.9,1409.14 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1400.65,1402.31 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1402.31,1405.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1406.15,1408.10 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1413.31,1414.88 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1425.7,1425.27 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1414.88,1418.73 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1421.8,1422.57 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1418.73,1420.9 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1425.27,1427.53 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1427.53,1429.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1429.14,1431.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1434.28,1440.7 3 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1441.28,1447.7 3 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1450.45,1452.103 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1461.6,1462.43 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1452.103,1453.14 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1454.25,1456.26 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1457.38,1457.38 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1462.43,1465.7 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1473.39,1475.5 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1479.79,1480.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1481.21,1481.21 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1482.13,1482.13 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1490.82,1491.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1491.6,1493.24 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1496.3,1496.31 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1502.3,1506.32 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1530.3,1530.55 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1533.3,1533.25 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1493.24,1495.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1496.31,1498.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1506.32,1508.17 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1513.4,1513.35 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1508.17,1512.5 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1513.35,1515.25 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1515.25,1517.69 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1526.6,1526.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1517.69,1519.28 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1519.28,1522.8 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1523.12,1525.7 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1530.55,1532.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1533.25,1536.4 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1540.71,1542.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1545.2,1545.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1551.2,1557.33 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1563.2,1563.64 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1575.2,1575.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1542.23,1544.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1546.18,1547.36 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1548.10,1548.10 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1557.33,1559.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1563.64,1564.27 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1573.3,1573.52 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1564.27,1566.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1566.9,1572.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1580.53,1587.15 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1594.2,1594.35 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1599.2,1607.6 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1587.15,1592.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1594.35,1595.114 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1595.114,1597.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1607.6,1611.24 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1624.3,1624.31 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1629.3,1633.22 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1644.3,1644.42 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1666.3,1667.61 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1670.3,1670.15 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1696.3,1696.54 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1611.24,1613.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1617.4,1617.11 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1613.23,1615.5 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1618.22,1620.23 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1621.12,1621.12 0 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1624.31,1626.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1633.22,1634.31 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1634.31,1639.5 3 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1640.9,1642.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1644.42,1653.128 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1653.128,1664.5 6 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1667.61,1669.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1670.15,1672.21 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1680.4,1680.11 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1672.21,1678.5 4 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1681.21,1682.24 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1685.5,1685.49 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1688.5,1688.19 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1690.35,1692.13 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1682.24,1684.6 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1685.49,1687.6 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1696.54,1698.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1702.108,1703.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1706.2,1706.80 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1711.2,1711.33 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1722.2,1722.25 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1703.23,1705.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1706.80,1709.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1711.33,1713.10 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1714.20,1715.35 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1716.21,1717.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1718.11,1719.33 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1725.93,1727.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1730.2,1730.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1740.2,1747.33 5 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1751.2,1751.97 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1755.2,1755.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1727.23,1729.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1731.18,1732.36 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1733.24,1734.42 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1737.10,1737.10 0 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1734.42,1736.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1747.33,1750.3 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1751.97,1754.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1758.66,1763.133 3 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1766.2,1766.70 1 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1769.2,1770.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1763.133,1765.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1766.70,1768.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1775.83,1776.33 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1777.32,1779.17 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1782.3,1782.82 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1784.33,1786.81 2 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1788.29,1789.65 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1791.29,1792.65 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1794.10,1795.63 1 0 -github.com/ethereum/go-ethereum/eth/downloader/downloader.go:1779.17,1781.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:79.79,85.15 3 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:93.2,94.58 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:98.2,99.21 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:102.2,110.15 3 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:121.2,128.6 5 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:85.15,89.31 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:89.31,91.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:94.58,96.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:99.21,101.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:110.15,114.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:114.30,116.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:128.6,130.40 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:134.3,134.27 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:217.3,217.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:130.40,132.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:134.27,135.37 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:135.37,137.5 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:138.9,144.44 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:159.4,166.31 3 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:212.4,212.114 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:144.44,146.39 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:146.39,149.6 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:149.11,149.28 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:149.28,150.71 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:150.71,156.7 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:166.31,169.18 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:172.5,172.46 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:178.5,179.17 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:182.5,182.17 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:186.5,186.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:190.5,191.19 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:200.5,206.29 5 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:169.18,170.11 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:172.46,173.11 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:179.17,181.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:182.17,185.6 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:186.23,187.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:191.19,198.14 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:206.29,208.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:212.114,214.5 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:218.21,222.22 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:224.27,229.18 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:242.4,242.38 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:261.4,261.37 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:266.20,272.65 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:277.4,288.27 6 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:294.4,308.19 3 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:315.4,315.17 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:331.27,336.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:350.4,360.55 5 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:374.32,376.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:229.18,231.37 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:234.5,234.36 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:238.5,238.13 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:231.37,233.6 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:234.36,236.6 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:242.38,247.43 4 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:247.43,249.20 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:258.6,258.27 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:249.20,250.26 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:253.7,253.30 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:250.26,252.8 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:253.30,256.8 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:261.37,264.5 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:272.65,275.13 3 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:288.27,291.5 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:308.19,313.13 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:315.17,317.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:317.10,325.15 5 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:325.15,328.6 2 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:336.12,338.19 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:347.5,347.30 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:338.19,339.25 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:342.6,342.29 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:339.25,341.7 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:342.29,345.7 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:360.55,363.40 2 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:369.5,369.42 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:363.40,365.6 1 0 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:369.42,371.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/fetchers_concurrent.go:376.13,378.5 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:75.13,78.40 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:78.40,79.66 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:215.99,228.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:234.30,242.6 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:242.6,243.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:244.30,247.10 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:249.32,252.20 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:256.4,260.8 4 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:252.20,254.13 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:260.8,265.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:266.31,270.16 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:272.31,276.16 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:278.32,282.20 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:284.31,287.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:289.13,294.12 3 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:302.38,311.2 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:319.63,323.9 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:324.75,325.16 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:326.22,327.23 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:334.68,337.17 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:345.2,346.15 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:348.2,349.15 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:351.2,358.12 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:361.2,376.15 6 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:382.2,388.42 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:392.2,392.27 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:395.2,395.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:337.17,339.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:339.8,343.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:346.15,346.39 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:349.15,349.40 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:358.12,360.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:376.15,379.3 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:388.42,390.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:392.27,394.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:395.6,397.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:401.3,401.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:397.14,399.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:402.27,406.18 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:415.30,417.29 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:419.32,425.71 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:436.4,441.14 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:445.30,446.24 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:448.27,456.14 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:460.4,460.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:406.18,409.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:409.10,413.5 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:425.71,429.20 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:433.5,434.13 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:429.20,432.6 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:441.14,443.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:456.14,459.5 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:460.14,463.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:472.49,477.67 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:545.2,559.38 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:562.2,562.80 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:477.67,479.60 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:479.60,481.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:481.9,483.50 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:488.4,493.38 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:510.4,511.45 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:522.4,522.17 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:531.4,536.40 4 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:539.4,539.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:483.50,485.5 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:493.38,496.41 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:502.5,502.41 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:506.5,506.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:496.41,499.14 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:502.41,505.6 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:511.45,513.43 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:513.43,515.44 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:515.44,519.7 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:522.17,525.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:536.40,538.5 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:559.38,561.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:566.60,568.16 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:571.2,571.43 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:568.16,569.13 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:578.72,584.30 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:590.2,590.31 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:596.2,596.90 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:607.2,613.38 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:616.2,616.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:584.30,585.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:588.3,588.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:585.12,587.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:590.31,591.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:594.3,594.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:591.12,593.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:596.90,597.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:600.3,600.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:597.12,599.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:613.38,615.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:620.110,627.31 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:631.2,631.28 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:634.2,637.43 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:627.31,630.3 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:631.28,633.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:637.43,639.29 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:643.3,643.18 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:647.3,647.51 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:651.3,658.7 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:669.3,685.34 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:639.29,641.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:643.18,644.12 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:647.51,649.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:658.7,660.18 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:663.4,663.38 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:666.4,666.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:660.18,661.13 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:663.38,664.13 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:692.74,701.31 4 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:704.2,706.16 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:711.2,719.9 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:701.31,703.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:706.16,710.3 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:720.20,722.31 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:724.24,740.18 5 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:742.22,750.10 4 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:751.26,755.32 3 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:757.47,761.32 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:763.69,767.32 3 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:769.70,773.32 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:775.11,778.40 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:790.4,792.11 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:778.40,779.53 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:779.53,784.6 4 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:797.6,797.6 0 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:798.22,798.22 0 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:806.48,809.33 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:815.2,815.31 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:809.33,810.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:810.23,812.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:815.31,817.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:822.62,823.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:824.25,824.25 0 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:826.20,826.20 0 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:828.19,828.19 0 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:838.54,840.9 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:846.2,853.63 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:841.19,843.9 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:844.10,844.10 0 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:856.84,865.41 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:872.2,880.30 4 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:884.2,885.31 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1004.2,1005.38 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1009.2,1010.12 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1013.2,1013.55 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1023.2,1023.23 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:865.41,871.3 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:880.30,882.3 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:885.31,888.63 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:908.3,909.58 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:937.3,945.13 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:956.3,957.39 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:960.3,968.101 4 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1000.3,1000.13 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:888.63,899.40 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:902.4,904.9 3 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:899.40,901.5 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:909.58,910.21 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:910.21,931.30 7 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:931.30,933.11 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:945.13,949.37 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:953.4,953.9 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:949.37,952.5 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:957.39,959.4 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:968.101,976.68 4 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:988.4,988.107 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:976.68,980.13 3 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:981.10,985.5 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:988.107,995.5 5 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1000.13,1001.9 1 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1005.38,1007.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1010.12,1012.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1013.55,1016.20 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1016.20,1018.4 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1018.9,1021.4 2 1 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1036.81,1042.22 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1045.2,1046.57 2 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1049.2,1052.24 3 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1042.22,1044.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1046.57,1048.3 1 0 -github.com/ethereum/go-ethereum/eth/downloader/skeleton.go:1061.56,1063.2 1 0 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:27.61,30.9 2 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:40.2,40.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:31.29,35.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:36.18,38.16 2 0 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:45.37,46.6 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:46.6,47.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:48.32,49.32 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:52.19,53.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:49.32,51.5 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:60.60,66.6 4 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:66.6,67.10 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:68.35,69.15 1 0 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:71.17,72.14 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:92.63,100.2 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:105.27,109.2 3 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:112.34,115.2 2 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:118.36,119.25 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:122.2,122.17 1 1 -github.com/ethereum/go-ethereum/eth/downloader/statesync.go:119.25,121.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:72.35,74.2 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:82.57,83.15 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:86.2,89.50 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:96.2,96.18 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:83.15,84.46 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:89.50,91.17 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:94.3,94.23 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:91.17,93.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:101.56,103.2 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:107.39,109.16 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:112.2,112.12 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:109.16,111.3 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:118.51,120.30 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:123.2,123.19 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:120.30,122.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:126.116,127.32 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:128.11,129.30 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:130.17,131.26 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:132.18,133.80 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:137.3,138.31 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:142.3,142.35 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:143.17,145.31 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:149.3,149.35 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:150.16,152.17 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:155.3,156.35 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:157.10,158.65 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:133.80,136.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:138.31,141.4 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:145.31,148.4 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:152.17,154.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:164.61,166.16 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:169.2,169.18 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:172.2,172.17 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:175.2,175.28 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:166.16,168.3 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:169.18,171.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:172.17,174.3 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:178.117,180.21 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:184.2,184.22 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:201.2,201.32 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:180.21,182.3 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:184.22,189.42 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:194.3,194.18 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:197.3,198.32 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:189.42,191.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:191.9,193.4 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:194.18,196.4 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:202.17,204.26 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:206.18,207.82 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:211.3,212.33 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:216.3,216.32 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:218.17,220.33 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:224.3,224.32 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:226.16,228.17 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:231.3,232.42 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:234.10,235.65 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:207.82,210.4 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:212.33,215.4 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:220.33,223.4 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:228.17,230.4 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:245.42,246.48 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:246.48,248.3 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:251.76,253.16 2 0 -github.com/ethereum/go-ethereum/trie/trie.go:256.2,256.31 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:253.16,255.3 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:267.51,270.21 3 1 -github.com/ethereum/go-ethereum/trie/trie.go:283.2,283.12 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:270.21,272.17 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:275.3,275.13 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:272.17,274.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:276.8,278.17 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:281.3,281.13 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:278.17,280.4 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:286.83,287.19 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:293.2,293.23 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:287.19,288.33 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:291.3,291.26 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:288.33,290.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:294.18,298.29 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:306.3,309.17 4 1 -github.com/ethereum/go-ethereum/trie/trie.go:312.3,313.17 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:317.3,317.20 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:321.3,321.68 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:323.17,325.27 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:328.3,331.22 4 1 -github.com/ethereum/go-ethereum/trie/trie.go:333.11,334.56 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:336.16,341.17 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:344.3,345.27 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:348.3,348.23 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:350.10,351.51 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:298.29,300.28 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:303.4,303.56 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:300.28,302.5 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:309.17,311.4 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:313.17,315.4 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:317.20,319.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:325.27,327.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:341.17,343.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:345.27,347.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:356.35,357.41 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:357.41,359.3 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:364.44,368.16 4 1 -github.com/ethereum/go-ethereum/trie/trie.go:371.2,372.12 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:368.16,370.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:378.71,379.23 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:380.18,382.28 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:385.3,385.27 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:392.3,393.27 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:396.3,396.32 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:409.17,411.27 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:414.3,422.16 4 1 -github.com/ethereum/go-ethereum/trie/trie.go:435.3,436.35 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:446.3,446.15 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:468.3,468.22 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:470.17,471.24 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:473.11,474.25 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:476.16,481.17 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:484.3,485.27 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:488.3,488.23 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:490.10,491.61 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:382.28,384.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:385.27,387.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:393.27,395.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:397.19,404.85 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:405.11,406.59 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:411.27,413.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:422.16,424.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:436.35,437.18 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:437.18,438.18 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:438.18,440.6 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:440.11,442.11 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:446.15,447.17 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:465.4,465.81 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:447.17,455.19 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:458.5,458.44 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:455.19,457.6 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:458.44,461.6 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:481.17,483.4 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:485.27,487.4 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:495.43,500.2 4 1 -github.com/ethereum/go-ethereum/trie/trie.go:502.61,503.31 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:506.2,506.15 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:503.31,505.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:509.69,511.42 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:514.2,514.61 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:511.42,513.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:517.71,520.20 3 1 -github.com/ethereum/go-ethereum/trie/trie.go:523.2,523.61 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:520.20,522.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:528.35,532.2 3 1 -github.com/ethereum/go-ethereum/trie/trie.go:536.70,537.17 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:540.2,540.19 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:545.2,552.40 4 1 -github.com/ethereum/go-ethereum/trie/trie.go:555.2,556.19 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:565.2,566.19 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:574.2,574.16 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:577.2,578.33 2 1 -github.com/ethereum/go-ethereum/trie/trie.go:537.17,538.51 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:540.19,542.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:552.40,554.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:556.19,560.13 4 0 -github.com/ethereum/go-ethereum/trie/trie.go:560.13,563.4 2 0 -github.com/ethereum/go-ethereum/trie/trie.go:566.19,573.3 2 0 -github.com/ethereum/go-ethereum/trie/trie.go:574.16,576.3 1 0 -github.com/ethereum/go-ethereum/trie/trie.go:582.47,583.19 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:587.2,591.28 5 1 -github.com/ethereum/go-ethereum/trie/trie.go:583.19,585.3 1 1 -github.com/ethereum/go-ethereum/trie/trie.go:595.24,598.2 2 0 -github.com/ethereum/go-ethereum/trie/committer.go:55.26,59.3 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:63.32,65.2 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:67.42,71.2 3 1 -github.com/ethereum/go-ethereum/trie/committer.go:74.73,75.15 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:78.2,79.16 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:82.2,82.37 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:75.15,77.3 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:79.16,81.3 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:86.69,89.27 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:93.2,93.24 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:89.27,91.3 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:94.18,101.38 3 1 -github.com/ethereum/go-ethereum/trie/committer.go:109.3,111.42 3 1 -github.com/ethereum/go-ethereum/trie/committer.go:114.3,114.40 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:115.17,117.17 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:120.3,124.42 4 1 -github.com/ethereum/go-ethereum/trie/committer.go:127.3,127.40 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:128.16,129.20 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:130.10,132.51 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:101.38,103.18 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:106.4,106.53 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:103.18,105.5 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:111.42,113.4 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:117.17,119.4 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:124.42,126.4 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:137.86,142.26 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:165.2,165.27 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:168.2,168.33 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:142.26,144.19 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:150.3,150.37 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:157.3,158.17 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:161.3,162.30 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:144.19,145.12 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:150.37,152.12 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:158.17,160.4 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:165.27,167.3 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:174.54,180.17 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:193.2,193.21 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:206.2,206.13 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:180.17,186.3 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:186.8,190.3 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:193.21,199.3 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:199.8,199.22 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:199.22,205.3 3 1 -github.com/ethereum/go-ethereum/trie/committer.go:210.46,211.29 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:211.29,222.22 5 0 -github.com/ethereum/go-ethereum/trie/committer.go:222.22,223.25 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:224.20,225.43 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:228.19,231.30 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:225.43,227.6 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:231.30,233.6 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:239.56,245.2 5 0 -github.com/ethereum/go-ethereum/trie/committer.go:251.31,252.23 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:253.18,255.46 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:256.17,259.27 2 1 -github.com/ethereum/go-ethereum/trie/committer.go:266.3,266.11 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:267.17,268.20 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:269.16,270.20 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:271.10,272.40 1 0 -github.com/ethereum/go-ethereum/trie/committer.go:259.27,260.44 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:260.44,262.5 1 1 -github.com/ethereum/go-ethereum/trie/committer.go:262.10,264.5 1 1 -github.com/ethereum/go-ethereum/trie/errors.go:33.45,35.2 1 0 -github.com/ethereum/go-ethereum/trie/node_enc.go:23.33,29.2 5 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:31.48,33.31 2 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:40.2,40.19 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:33.31,34.15 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:34.15,36.4 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:36.9,38.4 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:43.49,46.18 3 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:51.2,51.19 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:46.18,48.3 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:48.8,50.3 1 0 -github.com/ethereum/go-ethereum/trie/node_enc.go:54.47,56.2 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:58.48,60.2 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:62.50,64.22 2 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:71.2,71.19 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:64.22,65.15 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:65.15,67.4 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:67.9,69.4 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:74.52,77.18 3 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:82.2,82.19 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:77.18,79.3 1 1 -github.com/ethereum/go-ethereum/trie/node_enc.go:79.8,81.3 1 0 -github.com/ethereum/go-ethereum/trie/node_enc.go:85.46,87.2 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:37.86,42.32 4 1 -github.com/ethereum/go-ethereum/trie/proof.go:68.2,71.26 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:88.2,88.12 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:42.32,43.25 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:44.19,45.70 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:52.4,52.28 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:53.18,56.28 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:57.17,60.18 3 0 -github.com/ethereum/go-ethereum/trie/proof.go:64.11,65.54 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:45.70,48.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:48.10,51.5 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:60.18,63.5 2 0 -github.com/ethereum/go-ethereum/trie/proof.go:71.26,72.20 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:76.3,78.46 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:72.20,74.12 2 0 -github.com/ethereum/go-ethereum/trie/proof.go:78.46,82.11 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:85.4,85.26 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:82.11,84.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:98.92,100.2 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:105.108,108.20 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:108.20,110.17 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:113.3,114.17 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:117.3,118.28 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:110.17,112.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:114.17,116.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:119.12,121.19 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:122.17,124.26 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:125.18,126.19 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:136.138,138.54 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:151.2,151.17 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:158.2,165.6 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:138.54,140.17 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:143.3,144.17 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:147.3,147.16 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:140.17,142.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:144.17,146.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:151.17,153.17 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:156.3,156.11 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:153.17,155.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:165.6,167.30 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:192.3,192.33 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:200.3,200.23 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:203.3,203.31 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:168.12,173.24 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:176.4,176.68 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:177.19,179.12 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:180.18,182.12 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:183.17,185.18 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:188.18,189.17 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:173.24,175.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:185.18,187.5 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:193.19,194.21 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:195.18,196.34 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:197.11,198.60 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:200.23,202.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:218.69,234.6 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:271.2,271.24 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:234.6,235.27 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:236.19,241.35 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:246.4,246.36 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:251.4,251.49 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:254.4,255.36 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:256.18,262.68 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:265.4,266.42 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:267.11,268.52 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:241.35,243.5 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:243.10,245.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:246.36,248.5 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:248.10,250.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:251.49,252.19 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:262.68,263.19 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:272.18,279.50 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:282.3,282.48 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:285.3,285.48 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:294.3,294.26 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:305.3,305.25 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:316.3,316.20 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:317.17,319.47 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:322.3,322.81 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:325.3,325.82 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:328.3,328.20 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:329.10,330.51 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:279.50,281.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:282.48,284.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:285.48,287.21 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:290.4,291.21 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:287.21,289.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:294.26,295.39 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:303.4,303.67 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:295.39,297.22 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:300.5,301.22 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:297.22,299.6 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:305.25,306.39 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:314.4,314.67 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:306.39,308.22 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:311.5,312.22 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:308.22,310.6 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:319.47,321.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:322.81,324.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:325.82,327.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:346.81,347.29 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:348.17,349.17 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:360.3,360.68 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:361.18,362.88 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:391.3,391.39 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:396.3,397.64 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:398.11,401.13 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:402.10,403.31 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:349.17,350.39 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:353.4,353.37 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:350.39,352.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:354.9,355.39 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:358.4,358.37 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:355.39,357.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:362.88,364.18 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:389.4,389.14 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:364.18,365.46 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:365.46,371.6 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:371.12,375.6 0 0 -github.com/ethereum/go-ethereum/trie/proof.go:376.10,377.46 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:377.46,383.6 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:383.12,387.6 0 0 -github.com/ethereum/go-ethereum/trie/proof.go:391.39,395.4 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:411.50,413.18 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:433.2,433.14 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:413.18,414.28 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:415.18,416.39 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:421.4,421.44 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:422.19,423.84 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:426.4,426.39 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:427.18,428.16 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:429.11,430.58 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:416.39,417.30 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:417.30,419.6 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:423.84,425.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:470.152,471.30 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:475.2,475.35 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:480.2,480.31 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:487.2,487.18 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:499.2,499.20 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:511.2,511.54 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:526.2,526.43 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:530.2,530.35 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:536.2,537.16 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:543.2,544.16 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:549.2,550.16 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:555.2,556.11 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:559.2,559.31 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:562.2,562.27 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:565.2,565.57 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:471.30,473.3 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:475.35,476.45 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:476.45,478.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:480.31,481.22 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:481.22,483.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:487.18,489.32 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:492.3,492.54 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:495.3,495.20 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:489.32,491.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:492.54,494.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:499.20,501.17 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:504.3,504.52 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:507.3,507.20 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:501.17,503.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:504.52,506.4 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:511.54,513.17 2 1 -github.com/ethereum/go-ethereum/trie/proof.go:516.3,516.38 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:519.3,519.35 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:522.3,522.46 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:513.17,515.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:516.38,518.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:519.35,521.4 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:526.43,528.3 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:530.35,532.3 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:537.16,539.3 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:544.16,546.3 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:550.16,552.3 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:556.11,558.3 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:559.31,561.3 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:562.27,564.3 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:573.65,574.6 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:574.6,575.25 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:576.19,577.70 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:580.4,582.21 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:585.18,588.21 3 1 -github.com/ethereum/go-ethereum/trie/proof.go:591.17,592.17 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:593.12,594.19 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:595.18,596.17 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:597.11,598.54 1 0 -github.com/ethereum/go-ethereum/trie/proof.go:577.70,579.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:582.21,584.5 1 1 -github.com/ethereum/go-ethereum/trie/proof.go:588.21,590.5 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:36.26,38.3 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:41.60,45.2 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:47.34,50.2 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:64.55,69.2 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:72.78,74.49 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:78.2,78.15 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:81.2,81.17 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:74.49,76.3 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:78.15,80.3 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:85.63,98.17 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:101.2,101.36 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:113.2,114.23 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:98.17,100.3 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:101.36,102.19 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:106.3,107.58 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:102.19,104.12 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:107.58,109.4 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:109.9,111.4 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:118.57,121.2 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:123.57,135.29 7 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:145.2,145.12 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:135.29,136.45 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:141.3,143.26 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:136.45,138.4 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:138.9,138.30 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:138.30,139.12 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:148.53,150.36 2 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:150.36,151.19 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:151.19,153.4 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:157.67,163.2 5 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:165.79,171.2 5 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:183.57,185.21 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:188.2,189.12 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:185.21,186.34 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:192.48,193.49 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:193.49,195.3 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:198.30,202.29 4 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:205.2,205.25 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:202.29,204.3 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:211.51,212.34 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:217.2,217.20 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:212.34,213.25 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:213.25,215.4 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:222.48,223.21 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:224.18,227.33 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:237.3,237.30 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:242.15,251.29 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:261.3,262.30 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:270.3,272.19 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:288.3,295.28 6 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:297.16,307.29 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:314.3,315.19 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:332.3,342.15 7 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:344.17,347.17 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:349.18,350.38 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:352.10,353.24 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:227.33,228.29 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:228.29,229.46 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:232.5,232.10 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:229.46,231.6 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:237.30,239.4 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:239.9,241.4 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:251.29,256.4 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:262.30,264.4 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:264.9,268.4 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:272.19,279.4 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:279.9,286.4 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:307.29,308.47 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:315.19,320.4 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:320.9,327.4 4 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:367.29,372.2 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:374.46,378.21 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:441.2,443.27 3 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:450.2,451.18 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:379.18,380.9 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:382.17,386.9 4 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:388.18,390.37 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:408.3,409.38 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:411.15,416.35 4 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:422.3,427.23 4 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:429.16,435.38 5 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:437.10,438.29 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:390.37,391.20 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:396.4,397.27 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:404.4,405.23 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:391.20,393.13 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:397.27,399.5 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:399.10,401.5 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:416.35,418.4 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:418.9,420.4 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:443.27,446.3 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:451.18,455.3 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:459.45,464.23 4 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:472.2,475.10 4 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:464.23,467.3 2 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:485.58,486.18 1 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:490.2,494.23 4 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:502.2,506.15 5 1 -github.com/ethereum/go-ethereum/trie/stacktrie.go:486.18,488.3 1 0 -github.com/ethereum/go-ethereum/trie/stacktrie.go:494.23,497.3 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:76.40,82.20 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:85.2,85.68 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:82.20,84.3 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:102.38,107.2 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:110.59,113.2 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:116.59,119.2 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:134.92,145.2 3 1 -github.com/ethereum/go-ethereum/trie/sync.go:148.101,150.23 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:153.2,153.30 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:158.2,158.41 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:162.2,168.31 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:176.2,176.17 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:150.23,152.3 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:153.30,155.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:158.41,160.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:168.31,170.22 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:173.3,174.46 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:170.22,171.65 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:182.80,184.24 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:187.2,187.30 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:195.2,195.47 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:199.2,205.31 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:213.2,213.17 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:184.24,186.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:187.30,189.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:195.47,197.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:205.31,207.22 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:210.3,211.46 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:207.22,208.66 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:219.94,225.78 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:246.2,246.42 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:225.78,231.44 3 1 -github.com/ethereum/go-ethereum/trie/sync.go:235.3,239.38 4 1 -github.com/ethereum/go-ethereum/trie/sync.go:231.44,232.9 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:239.38,242.4 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:242.9,244.4 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:255.49,257.70 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:261.2,262.67 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:268.2,268.67 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:291.2,291.13 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:294.2,294.12 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:257.70,259.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:262.67,266.3 3 0 -github.com/ethereum/go-ethereum/trie/sync.go:268.67,272.17 3 1 -github.com/ethereum/go-ethereum/trie/sync.go:275.3,279.17 3 1 -github.com/ethereum/go-ethereum/trie/sync.go:282.3,282.42 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:272.17,274.4 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:279.17,281.4 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:282.42,284.4 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:284.9,286.35 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:286.35,288.5 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:291.13,293.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:299.46,301.43 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:304.2,304.43 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:308.2,309.12 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:301.43,303.3 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:304.43,306.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:313.30,315.2 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:320.39,322.14 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:326.2,326.37 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:330.2,338.47 3 1 -github.com/ethereum/go-ethereum/trie/sync.go:341.2,341.30 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:322.14,324.3 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:326.37,329.3 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:338.47,340.3 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:346.72,354.33 3 1 -github.com/ethereum/go-ethereum/trie/sync.go:377.2,378.33 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:415.2,415.22 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:355.18,357.19 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:360.3,363.5 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:364.17,365.27 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:373.10,374.48 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:357.19,359.4 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:365.27,366.31 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:366.31,371.5 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:378.33,380.26 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:395.3,395.46 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:380.26,381.48 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:381.48,383.47 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:389.5,389.75 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:383.47,385.6 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:385.11,385.54 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:385.54,388.6 2 0 -github.com/ethereum/go-ethereum/trie/sync.go:389.75,391.6 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:395.46,398.32 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:403.4,403.43 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:407.4,412.6 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:398.32,399.13 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:403.43,404.13 1 0 -github.com/ethereum/go-ethereum/trie/sync.go:421.49,423.14 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:433.2,433.37 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:441.2,441.12 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:423.14,427.3 3 0 -github.com/ethereum/go-ethereum/trie/sync.go:427.8,431.3 3 1 -github.com/ethereum/go-ethereum/trie/sync.go:433.37,435.23 2 1 -github.com/ethereum/go-ethereum/trie/sync.go:435.23,436.43 1 1 -github.com/ethereum/go-ethereum/trie/sync.go:436.43,438.5 1 0 -github.com/ethereum/go-ethereum/trie/database.go:99.45,99.95 1 0 -github.com/ethereum/go-ethereum/trie/database.go:100.45,100.95 1 0 -github.com/ethereum/go-ethereum/trie/database.go:102.47,105.2 2 0 -github.com/ethereum/go-ethereum/trie/database.go:112.49,112.99 1 0 -github.com/ethereum/go-ethereum/trie/database.go:113.49,113.99 1 0 -github.com/ethereum/go-ethereum/trie/database.go:115.51,119.2 3 0 -github.com/ethereum/go-ethereum/trie/database.go:129.50,129.100 1 0 -github.com/ethereum/go-ethereum/trie/database.go:130.50,130.100 1 0 -github.com/ethereum/go-ethereum/trie/database.go:156.35,157.38 1 1 -github.com/ethereum/go-ethereum/trie/database.go:160.2,160.28 1 1 -github.com/ethereum/go-ethereum/trie/database.go:157.38,159.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:165.49,166.38 1 1 -github.com/ethereum/go-ethereum/trie/database.go:169.2,169.36 1 1 -github.com/ethereum/go-ethereum/trie/database.go:166.38,168.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:175.64,176.32 1 1 -github.com/ethereum/go-ethereum/trie/database.go:179.2,179.36 1 1 -github.com/ethereum/go-ethereum/trie/database.go:176.32,178.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:179.36,181.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:186.64,187.23 1 1 -github.com/ethereum/go-ethereum/trie/database.go:188.21,189.36 1 1 -github.com/ethereum/go-ethereum/trie/database.go:190.19,191.27 1 1 -github.com/ethereum/go-ethereum/trie/database.go:194.16,195.33 1 1 -github.com/ethereum/go-ethereum/trie/database.go:196.31,196.31 0 1 -github.com/ethereum/go-ethereum/trie/database.go:197.10,198.49 1 0 -github.com/ethereum/go-ethereum/trie/database.go:191.27,193.4 1 1 -github.com/ethereum/go-ethereum/trie/database.go:204.32,205.23 1 1 -github.com/ethereum/go-ethereum/trie/database.go:206.18,208.61 1 1 -github.com/ethereum/go-ethereum/trie/database.go:210.17,213.34 2 1 -github.com/ethereum/go-ethereum/trie/database.go:218.3,218.14 1 1 -github.com/ethereum/go-ethereum/trie/database.go:220.36,221.11 1 1 -github.com/ethereum/go-ethereum/trie/database.go:223.10,224.49 1 0 -github.com/ethereum/go-ethereum/trie/database.go:213.34,214.22 1 1 -github.com/ethereum/go-ethereum/trie/database.go:214.22,216.5 1 1 -github.com/ethereum/go-ethereum/trie/database.go:230.45,231.23 1 1 -github.com/ethereum/go-ethereum/trie/database.go:232.21,240.4 1 1 -github.com/ethereum/go-ethereum/trie/database.go:242.19,249.43 2 1 -github.com/ethereum/go-ethereum/trie/database.go:254.3,254.14 1 1 -github.com/ethereum/go-ethereum/trie/database.go:256.27,257.11 1 1 -github.com/ethereum/go-ethereum/trie/database.go:259.10,260.49 1 0 -github.com/ethereum/go-ethereum/trie/database.go:249.43,250.19 1 1 -github.com/ethereum/go-ethereum/trie/database.go:250.19,252.5 1 1 -github.com/ethereum/go-ethereum/trie/database.go:274.56,276.2 1 1 -github.com/ethereum/go-ethereum/trie/database.go:281.82,283.39 2 1 -github.com/ethereum/go-ethereum/trie/database.go:290.2,297.39 2 1 -github.com/ethereum/go-ethereum/trie/database.go:300.2,300.11 1 1 -github.com/ethereum/go-ethereum/trie/database.go:283.39,284.27 1 0 -github.com/ethereum/go-ethereum/trie/database.go:284.27,286.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:286.9,288.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:297.39,299.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:304.50,306.2 1 0 -github.com/ethereum/go-ethereum/trie/database.go:312.67,314.35 1 1 -github.com/ethereum/go-ethereum/trie/database.go:317.2,325.42 3 1 -github.com/ethereum/go-ethereum/trie/database.go:330.2,333.34 2 1 -github.com/ethereum/go-ethereum/trie/database.go:338.2,338.70 1 1 -github.com/ethereum/go-ethereum/trie/database.go:314.35,316.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:325.42,326.39 1 1 -github.com/ethereum/go-ethereum/trie/database.go:326.39,328.4 1 1 -github.com/ethereum/go-ethereum/trie/database.go:333.34,335.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:335.8,337.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:346.71,348.25 1 1 -github.com/ethereum/go-ethereum/trie/database.go:352.2,352.37 1 1 -github.com/ethereum/go-ethereum/trie/database.go:355.2,356.75 2 1 -github.com/ethereum/go-ethereum/trie/database.go:348.25,350.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:352.37,354.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:361.49,363.22 1 1 -github.com/ethereum/go-ethereum/trie/database.go:371.2,375.18 4 1 -github.com/ethereum/go-ethereum/trie/database.go:380.2,384.30 3 1 -github.com/ethereum/go-ethereum/trie/database.go:387.2,387.22 1 1 -github.com/ethereum/go-ethereum/trie/database.go:392.2,392.37 1 1 -github.com/ethereum/go-ethereum/trie/database.go:363.22,364.53 1 0 -github.com/ethereum/go-ethereum/trie/database.go:364.53,368.4 3 0 -github.com/ethereum/go-ethereum/trie/database.go:375.18,379.3 3 1 -github.com/ethereum/go-ethereum/trie/database.go:384.30,386.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:387.22,391.3 3 0 -github.com/ethereum/go-ethereum/trie/database.go:397.60,399.29 1 1 -github.com/ethereum/go-ethereum/trie/database.go:403.2,403.22 1 1 -github.com/ethereum/go-ethereum/trie/database.go:411.2,415.18 4 1 -github.com/ethereum/go-ethereum/trie/database.go:420.2,424.19 3 1 -github.com/ethereum/go-ethereum/trie/database.go:432.2,432.37 1 0 -github.com/ethereum/go-ethereum/trie/database.go:399.29,401.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:403.22,404.53 1 0 -github.com/ethereum/go-ethereum/trie/database.go:404.53,408.4 3 0 -github.com/ethereum/go-ethereum/trie/database.go:415.18,419.3 3 1 -github.com/ethereum/go-ethereum/trie/database.go:424.19,425.23 1 1 -github.com/ethereum/go-ethereum/trie/database.go:430.3,430.18 1 1 -github.com/ethereum/go-ethereum/trie/database.go:425.23,429.4 3 0 -github.com/ethereum/go-ethereum/trie/database.go:437.55,439.25 1 0 -github.com/ethereum/go-ethereum/trie/database.go:443.2,447.21 4 0 -github.com/ethereum/go-ethereum/trie/database.go:450.2,450.44 1 0 -github.com/ethereum/go-ethereum/trie/database.go:439.25,441.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:447.21,449.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:456.43,461.31 4 1 -github.com/ethereum/go-ethereum/trie/database.go:466.2,466.15 1 1 -github.com/ethereum/go-ethereum/trie/database.go:461.31,462.30 1 1 -github.com/ethereum/go-ethereum/trie/database.go:462.30,464.4 1 1 -github.com/ethereum/go-ethereum/trie/database.go:473.70,478.2 3 0 -github.com/ethereum/go-ethereum/trie/database.go:481.70,484.9 2 0 -github.com/ethereum/go-ethereum/trie/database.go:488.2,488.40 1 0 -github.com/ethereum/go-ethereum/trie/database.go:494.2,496.45 3 0 -github.com/ethereum/go-ethereum/trie/database.go:484.9,486.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:488.40,491.3 2 0 -github.com/ethereum/go-ethereum/trie/database.go:491.8,491.88 1 0 -github.com/ethereum/go-ethereum/trie/database.go:491.88,493.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:496.45,498.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:502.51,504.29 1 0 -github.com/ethereum/go-ethereum/trie/database.go:508.2,523.125 11 0 -github.com/ethereum/go-ethereum/trie/database.go:504.29,507.3 2 0 -github.com/ethereum/go-ethereum/trie/database.go:527.72,531.54 2 0 -github.com/ethereum/go-ethereum/trie/database.go:539.2,540.9 2 0 -github.com/ethereum/go-ethereum/trie/database.go:544.2,544.22 1 0 -github.com/ethereum/go-ethereum/trie/database.go:551.2,551.23 1 0 -github.com/ethereum/go-ethereum/trie/database.go:531.54,533.32 2 0 -github.com/ethereum/go-ethereum/trie/database.go:533.32,536.4 2 0 -github.com/ethereum/go-ethereum/trie/database.go:540.9,542.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:544.22,550.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:551.23,553.16 1 0 -github.com/ethereum/go-ethereum/trie/database.go:565.3,565.41 1 0 -github.com/ethereum/go-ethereum/trie/database.go:568.3,570.27 3 0 -github.com/ethereum/go-ethereum/trie/database.go:554.18,556.56 2 0 -github.com/ethereum/go-ethereum/trie/database.go:557.18,559.56 2 0 -github.com/ethereum/go-ethereum/trie/database.go:560.11,562.57 2 0 -github.com/ethereum/go-ethereum/trie/database.go:565.41,567.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:570.27,572.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:581.57,598.20 6 1 -github.com/ethereum/go-ethereum/trie/database.go:612.2,613.48 2 1 -github.com/ethereum/go-ethereum/trie/database.go:636.2,636.38 1 1 -github.com/ethereum/go-ethereum/trie/database.go:641.2,644.20 3 1 -github.com/ethereum/go-ethereum/trie/database.go:651.2,651.26 1 1 -github.com/ethereum/go-ethereum/trie/database.go:661.2,661.34 1 1 -github.com/ethereum/go-ethereum/trie/database.go:664.2,675.12 8 1 -github.com/ethereum/go-ethereum/trie/database.go:598.20,599.26 1 0 -github.com/ethereum/go-ethereum/trie/database.go:599.26,601.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:601.9,603.48 2 0 -github.com/ethereum/go-ethereum/trie/database.go:603.48,604.41 1 0 -github.com/ethereum/go-ethereum/trie/database.go:607.5,607.18 1 0 -github.com/ethereum/go-ethereum/trie/database.go:604.41,606.6 1 0 -github.com/ethereum/go-ethereum/trie/database.go:613.48,619.48 3 1 -github.com/ethereum/go-ethereum/trie/database.go:629.3,630.27 2 1 -github.com/ethereum/go-ethereum/trie/database.go:633.3,633.26 1 1 -github.com/ethereum/go-ethereum/trie/database.go:619.48,620.40 1 1 -github.com/ethereum/go-ethereum/trie/database.go:624.4,624.17 1 1 -github.com/ethereum/go-ethereum/trie/database.go:620.40,623.5 2 0 -github.com/ethereum/go-ethereum/trie/database.go:630.27,632.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:636.38,639.3 2 0 -github.com/ethereum/go-ethereum/trie/database.go:644.20,645.26 1 0 -github.com/ethereum/go-ethereum/trie/database.go:645.26,647.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:647.9,649.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:651.26,657.27 5 1 -github.com/ethereum/go-ethereum/trie/database.go:657.27,659.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:661.34,663.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:684.93,693.25 3 1 -github.com/ethereum/go-ethereum/trie/database.go:703.2,706.67 3 1 -github.com/ethereum/go-ethereum/trie/database.go:711.2,711.38 1 1 -github.com/ethereum/go-ethereum/trie/database.go:716.2,723.25 5 1 -github.com/ethereum/go-ethereum/trie/database.go:726.2,731.13 5 1 -github.com/ethereum/go-ethereum/trie/database.go:734.2,741.12 4 1 -github.com/ethereum/go-ethereum/trie/database.go:693.25,697.39 2 1 -github.com/ethereum/go-ethereum/trie/database.go:700.3,700.16 1 1 -github.com/ethereum/go-ethereum/trie/database.go:697.39,699.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:706.67,709.3 2 0 -github.com/ethereum/go-ethereum/trie/database.go:711.38,714.3 2 0 -github.com/ethereum/go-ethereum/trie/database.go:723.25,725.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:731.13,733.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:745.118,748.9 2 1 -github.com/ethereum/go-ethereum/trie/database.go:751.2,752.41 2 1 -github.com/ethereum/go-ethereum/trie/database.go:757.2,757.16 1 1 -github.com/ethereum/go-ethereum/trie/database.go:761.2,762.21 2 1 -github.com/ethereum/go-ethereum/trie/database.go:765.2,765.47 1 1 -github.com/ethereum/go-ethereum/trie/database.go:774.2,774.12 1 1 -github.com/ethereum/go-ethereum/trie/database.go:748.9,750.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:752.41,753.17 1 1 -github.com/ethereum/go-ethereum/trie/database.go:753.17,755.4 1 1 -github.com/ethereum/go-ethereum/trie/database.go:757.16,759.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:762.21,764.3 1 1 -github.com/ethereum/go-ethereum/trie/database.go:765.47,766.39 1 0 -github.com/ethereum/go-ethereum/trie/database.go:769.3,772.19 4 0 -github.com/ethereum/go-ethereum/trie/database.go:766.39,768.4 1 0 -github.com/ethereum/go-ethereum/trie/database.go:788.53,793.9 3 1 -github.com/ethereum/go-ethereum/trie/database.go:797.2,797.14 1 1 -github.com/ethereum/go-ethereum/trie/database.go:809.2,811.26 3 1 -github.com/ethereum/go-ethereum/trie/database.go:815.2,815.24 1 1 -github.com/ethereum/go-ethereum/trie/database.go:819.2,819.12 1 1 -github.com/ethereum/go-ethereum/trie/database.go:793.9,795.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:798.19,800.57 2 1 -github.com/ethereum/go-ethereum/trie/database.go:801.19,803.57 2 0 -github.com/ethereum/go-ethereum/trie/database.go:804.10,806.58 2 0 -github.com/ethereum/go-ethereum/trie/database.go:811.26,813.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:815.24,818.3 2 0 -github.com/ethereum/go-ethereum/trie/database.go:822.44,823.26 1 0 -github.com/ethereum/go-ethereum/trie/database.go:828.69,838.2 5 0 -github.com/ethereum/go-ethereum/trie/database.go:842.62,843.22 1 0 -github.com/ethereum/go-ethereum/trie/database.go:846.2,850.16 4 0 -github.com/ethereum/go-ethereum/trie/database.go:854.2,855.12 2 0 -github.com/ethereum/go-ethereum/trie/database.go:843.22,845.3 1 0 -github.com/ethereum/go-ethereum/trie/database.go:850.16,853.3 2 0 -github.com/ethereum/go-ethereum/trie/database.go:860.49,862.2 1 0 -github.com/ethereum/go-ethereum/trie/database.go:866.103,870.6 3 0 -github.com/ethereum/go-ethereum/trie/database.go:870.6,871.10 1 0 -github.com/ethereum/go-ethereum/trie/database.go:872.19,873.24 1 0 -github.com/ethereum/go-ethereum/trie/database.go:874.17,875.10 1 0 -github.com/ethereum/go-ethereum/trie/encoding.go:37.38,39.18 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:43.2,45.21 3 1 -github.com/ethereum/go-ethereum/trie/encoding.go:50.2,51.12 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:39.18,42.3 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:45.21,49.3 3 1 -github.com/ethereum/go-ethereum/trie/encoding.go:56.42,62.39 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:66.2,71.19 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:76.2,76.41 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:79.2,80.15 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:62.39,65.3 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:71.19,75.3 3 1 -github.com/ethereum/go-ethereum/trie/encoding.go:76.41,78.3 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:83.42,84.23 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:87.2,89.17 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:93.2,94.20 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:84.23,86.3 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:89.17,91.3 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:97.39,100.24 3 1 -github.com/ethereum/go-ethereum/trie/encoding.go:104.2,105.16 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:100.24,103.3 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:110.39,111.18 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:114.2,114.21 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:117.2,119.12 3 1 -github.com/ethereum/go-ethereum/trie/encoding.go:111.18,113.3 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:114.21,115.47 1 0 -github.com/ethereum/go-ethereum/trie/encoding.go:122.50,123.61 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:123.61,125.3 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:129.33,131.21 2 1 -github.com/ethereum/go-ethereum/trie/encoding.go:134.2,134.24 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:139.2,139.10 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:131.21,133.3 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:134.24,135.19 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:135.19,136.9 1 1 -github.com/ethereum/go-ethereum/trie/encoding.go:143.29,145.2 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:38.26,44.3 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:47.39,51.2 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:53.36,55.2 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:59.70,61.39 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:65.2,65.23 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:61.39,63.3 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:66.18,71.38 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:76.3,76.24 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:77.17,80.38 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:85.3,85.24 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:86.10,88.14 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:71.38,73.4 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:73.9,75.4 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:80.38,82.4 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:82.9,84.4 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:95.85,103.22 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:107.2,107.26 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:104.29,105.51 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:110.92,114.16 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:139.2,139.26 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:114.16,117.27 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:129.3,129.12 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:117.27,118.19 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:118.19,120.45 2 1 -github.com/ethereum/go-ethereum/trie/hasher.go:125.5,126.14 2 1 -github.com/ethereum/go-ethereum/trie/hasher.go:120.45,122.6 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:122.11,124.6 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:130.8,131.27 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:131.27,132.44 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:132.44,134.5 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:134.10,136.5 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:146.65,150.29 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:153.2,153.24 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:150.29,152.3 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:158.63,162.29 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:165.2,165.24 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:162.29,164.3 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:178.40,182.2 3 1 -github.com/ethereum/go-ethereum/trie/hasher.go:185.49,191.2 5 1 -github.com/ethereum/go-ethereum/trie/hasher.go:197.68,198.30 1 1 -github.com/ethereum/go-ethereum/trie/hasher.go:199.18,201.42 2 1 -github.com/ethereum/go-ethereum/trie/hasher.go:202.17,204.41 2 1 -github.com/ethereum/go-ethereum/trie/hasher.go:205.10,207.14 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:40.45,44.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:47.33,48.27 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:55.2,58.14 4 1 -github.com/ethereum/go-ethereum/trie/iterator.go:48.27,49.23 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:49.23,53.4 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:63.38,65.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:152.35,154.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:156.61,157.30 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:163.2,165.11 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:157.30,162.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:168.68,170.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:172.44,173.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:176.2,176.39 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:173.24,175.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:179.46,180.24 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:183.2,183.41 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:180.24,182.3 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:186.37,188.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:190.42,191.23 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:196.2,196.22 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:191.23,192.62 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:192.62,194.4 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:199.43,200.23 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:205.2,205.22 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:200.23,201.65 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:201.65,203.4 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:208.46,209.23 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:225.2,225.22 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:209.23,210.62 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:210.62,215.52 4 1 -github.com/ethereum/go-ethereum/trie/iterator.go:222.4,222.17 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:215.52,218.49 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:218.49,220.6 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:228.39,230.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:232.43,233.34 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:236.2,237.16 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:241.2,241.13 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:233.34,235.3 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:237.16,240.3 2 0 -github.com/ethereum/go-ethereum/trie/iterator.go:244.39,245.30 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:248.2,248.40 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:251.2,251.15 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:245.30,247.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:248.40,250.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:258.49,259.30 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:262.2,262.40 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:268.2,270.19 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:273.2,274.13 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:259.30,261.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:262.40,263.48 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:263.48,265.4 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:270.19,272.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:277.51,282.6 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:282.6,284.28 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:291.3,291.36 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:284.28,286.4 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:286.9,286.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:286.24,288.4 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:288.9,288.43 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:288.43,290.4 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:296.60,299.23 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:302.2,302.38 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:299.23,301.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:306.86,308.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:312.2,312.14 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:318.2,318.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:334.2,334.38 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:308.24,311.3 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:312.14,315.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:318.24,321.34 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:324.3,325.9 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:332.3,332.11 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:321.34,323.4 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:325.9,326.50 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:329.4,329.42 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:326.50,328.5 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:339.92,341.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:345.2,345.40 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:351.2,351.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:367.2,367.38 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:341.24,344.3 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:345.40,348.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:351.24,354.34 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:357.3,358.9 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:365.3,365.11 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:354.34,356.4 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:358.9,359.50 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:362.4,362.42 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:359.50,361.5 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:370.79,371.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:378.2,379.22 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:371.24,372.70 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:372.70,373.59 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:373.59,375.5 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:382.81,383.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:388.2,388.40 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:383.24,384.70 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:384.70,386.4 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:391.75,392.40 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:400.2,400.12 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:392.40,394.17 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:397.3,398.37 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:394.17,396.4 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:403.115,409.41 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:425.2,425.25 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:409.41,410.31 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:410.31,423.4 6 1 -github.com/ethereum/go-ethereum/trie/iterator.go:428.119,429.36 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:451.2,451.31 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:430.17,432.100 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:436.18,438.23 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:432.100,435.4 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:438.23,449.4 4 1 -github.com/ethereum/go-ethereum/trie/iterator.go:456.133,457.33 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:497.2,497.31 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:458.17,461.19 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:466.3,466.36 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:471.3,471.7 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:482.18,484.23 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:461.19,464.4 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:466.36,469.4 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:471.7,475.61 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:480.4,480.55 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:475.61,478.5 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:484.23,495.4 4 1 -github.com/ethereum/go-ethereum/trie/iterator.go:500.87,503.24 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:503.24,505.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:508.31,513.2 4 1 -github.com/ethereum/go-ethereum/trie/iterator.go:515.42,516.56 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:519.2,519.27 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:524.2,524.72 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:527.2,527.26 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:530.2,530.10 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:516.56,518.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:519.27,521.3 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:521.8,521.34 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:521.34,523.3 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:524.72,526.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:527.26,529.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:542.68,549.2 3 1 -github.com/ethereum/go-ethereum/trie/iterator.go:551.50,553.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:555.52,557.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:559.43,561.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:563.48,565.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:567.49,569.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:571.52,573.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:575.45,577.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:579.49,581.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:583.74,584.26 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:587.47,591.22 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:594.2,596.12 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:601.2,601.6 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:591.22,593.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:596.12,599.3 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:601.6,602.35 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:603.11,605.24 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:609.4,609.14 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:610.10,612.15 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:613.10,616.27 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:619.4,620.27 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:624.4,624.14 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:605.24,608.5 2 0 -github.com/ethereum/go-ethereum/trie/iterator.go:616.27,618.5 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:620.27,623.5 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:629.45,630.37 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:633.2,633.21 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:630.37,632.3 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:638.48,638.65 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:639.48,639.87 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:640.48,640.75 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:641.48,641.85 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:642.46,647.2 4 1 -github.com/ethereum/go-ethereum/trie/iterator.go:657.66,664.2 5 1 -github.com/ethereum/go-ethereum/trie/iterator.go:666.45,668.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:670.47,672.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:674.38,676.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:678.43,680.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:682.44,684.2 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:686.47,688.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:690.40,692.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:694.44,696.2 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:698.69,699.26 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:716.50,717.25 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:722.2,726.141 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:735.2,735.25 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:739.2,739.27 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:717.25,719.3 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:726.141,729.52 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:729.52,733.4 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:735.25,738.3 2 1 -github.com/ethereum/go-ethereum/trie/iterator.go:742.40,743.38 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:748.2,748.12 1 1 -github.com/ethereum/go-ethereum/trie/iterator.go:743.38,744.48 1 0 -github.com/ethereum/go-ethereum/trie/iterator.go:744.48,746.4 1 0 -github.com/ethereum/go-ethereum/trie/node.go:55.49,59.2 3 0 -github.com/ethereum/go-ethereum/trie/node.go:61.39,61.67 2 1 -github.com/ethereum/go-ethereum/trie/node.go:62.39,62.67 2 1 -github.com/ethereum/go-ethereum/trie/node.go:70.46,70.84 1 1 -github.com/ethereum/go-ethereum/trie/node.go:71.46,71.84 1 1 -github.com/ethereum/go-ethereum/trie/node.go:72.46,72.66 1 1 -github.com/ethereum/go-ethereum/trie/node.go:73.46,73.66 1 1 -github.com/ethereum/go-ethereum/trie/node.go:76.37,76.61 1 0 -github.com/ethereum/go-ethereum/trie/node.go:77.37,77.61 1 0 -github.com/ethereum/go-ethereum/trie/node.go:78.37,78.61 1 0 -github.com/ethereum/go-ethereum/trie/node.go:79.37,79.61 1 0 -github.com/ethereum/go-ethereum/trie/node.go:81.47,83.35 2 0 -github.com/ethereum/go-ethereum/trie/node.go:90.2,90.42 1 0 -github.com/ethereum/go-ethereum/trie/node.go:83.35,84.18 1 0 -github.com/ethereum/go-ethereum/trie/node.go:84.18,86.4 1 0 -github.com/ethereum/go-ethereum/trie/node.go:86.9,88.4 1 0 -github.com/ethereum/go-ethereum/trie/node.go:92.48,94.2 1 0 -github.com/ethereum/go-ethereum/trie/node.go:95.46,97.2 1 0 -github.com/ethereum/go-ethereum/trie/node.go:98.47,100.2 1 0 -github.com/ethereum/go-ethereum/trie/node.go:102.44,104.16 2 1 -github.com/ethereum/go-ethereum/trie/node.go:107.2,107.10 1 1 -github.com/ethereum/go-ethereum/trie/node.go:104.16,105.47 1 0 -github.com/ethereum/go-ethereum/trie/node.go:111.49,112.19 1 1 -github.com/ethereum/go-ethereum/trie/node.go:115.2,116.16 2 1 -github.com/ethereum/go-ethereum/trie/node.go:119.2,119.43 1 1 -github.com/ethereum/go-ethereum/trie/node.go:112.19,114.3 1 0 -github.com/ethereum/go-ethereum/trie/node.go:116.16,118.3 1 1 -github.com/ethereum/go-ethereum/trie/node.go:120.9,122.36 2 1 -github.com/ethereum/go-ethereum/trie/node.go:123.10,125.35 2 1 -github.com/ethereum/go-ethereum/trie/node.go:126.10,127.67 1 1 -github.com/ethereum/go-ethereum/trie/node.go:131.52,133.16 2 1 -github.com/ethereum/go-ethereum/trie/node.go:136.2,138.18 3 1 -github.com/ethereum/go-ethereum/trie/node.go:146.2,147.16 2 1 -github.com/ethereum/go-ethereum/trie/node.go:150.2,150.38 1 1 -github.com/ethereum/go-ethereum/trie/node.go:133.16,135.3 1 1 -github.com/ethereum/go-ethereum/trie/node.go:138.18,141.17 2 1 -github.com/ethereum/go-ethereum/trie/node.go:144.3,144.65 1 1 -github.com/ethereum/go-ethereum/trie/node.go:141.17,143.4 1 1 -github.com/ethereum/go-ethereum/trie/node.go:147.16,149.3 1 1 -github.com/ethereum/go-ethereum/trie/node.go:153.56,155.26 2 1 -github.com/ethereum/go-ethereum/trie/node.go:162.2,163.16 2 1 -github.com/ethereum/go-ethereum/trie/node.go:166.2,166.18 1 1 -github.com/ethereum/go-ethereum/trie/node.go:169.2,169.15 1 1 -github.com/ethereum/go-ethereum/trie/node.go:155.26,157.17 2 1 -github.com/ethereum/go-ethereum/trie/node.go:160.3,160.35 1 1 -github.com/ethereum/go-ethereum/trie/node.go:157.17,159.4 1 1 -github.com/ethereum/go-ethereum/trie/node.go:163.16,165.3 1 0 -github.com/ethereum/go-ethereum/trie/node.go:166.18,168.3 1 1 -github.com/ethereum/go-ethereum/trie/node.go:174.50,176.16 2 1 -github.com/ethereum/go-ethereum/trie/node.go:179.2,179.9 1 1 -github.com/ethereum/go-ethereum/trie/node.go:176.16,178.3 1 0 -github.com/ethereum/go-ethereum/trie/node.go:180.24,183.51 1 1 -github.com/ethereum/go-ethereum/trie/node.go:187.3,188.22 2 1 -github.com/ethereum/go-ethereum/trie/node.go:189.43,191.24 1 1 -github.com/ethereum/go-ethereum/trie/node.go:192.44,193.47 1 1 -github.com/ethereum/go-ethereum/trie/node.go:194.10,195.85 1 1 -github.com/ethereum/go-ethereum/trie/node.go:183.51,186.4 2 1 -github.com/ethereum/go-ethereum/trie/node.go:206.45,207.16 1 1 -github.com/ethereum/go-ethereum/trie/node.go:210.2,210.42 1 1 -github.com/ethereum/go-ethereum/trie/node.go:214.2,214.41 1 1 -github.com/ethereum/go-ethereum/trie/node.go:207.16,209.3 1 1 -github.com/ethereum/go-ethereum/trie/node.go:210.42,213.3 2 1 -github.com/ethereum/go-ethereum/trie/node.go:217.40,219.2 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:56.69,57.15 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:60.2,61.16 2 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:64.2,64.38 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:57.15,58.52 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:61.16,63.3 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:69.45,71.16 2 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:74.2,74.12 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:71.16,73.3 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:80.57,82.2 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:86.67,88.2 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:92.82,95.16 3 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:98.2,98.51 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:101.2,102.12 2 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:95.16,97.3 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:98.51,100.3 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:111.48,112.48 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:112.48,114.3 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:125.57,128.16 3 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:131.2,132.12 2 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:128.16,130.3 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:136.41,137.41 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:137.41,139.3 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:144.50,148.2 3 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:152.51,153.55 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:156.2,156.55 1 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:153.55,155.3 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:164.76,166.33 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:177.2,177.30 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:166.33,167.33 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:174.3,174.42 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:167.33,169.39 2 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:172.4,172.27 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:169.39,171.5 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:182.41,184.2 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:187.41,190.2 2 0 -github.com/ethereum/go-ethereum/trie/secure_trie.go:194.62,196.2 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:201.49,208.2 6 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:213.57,214.29 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:218.2,218.22 1 1 -github.com/ethereum/go-ethereum/trie/secure_trie.go:214.29,217.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:42.87,57.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:60.39,61.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:63.2,63.39 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:61.20,62.3 0 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:68.34,69.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:88.2,88.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:69.24,70.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:71.30,73.28 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:80.4,81.31 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:84.22,85.17 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:73.28,74.37 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:74.37,78.6 3 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:81.31,83.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:91.30,92.21 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:96.2,97.22 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:92.21,95.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:100.39,101.25 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:106.2,106.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:120.2,120.68 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:129.2,129.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:101.25,103.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:106.22,111.32 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:114.3,116.14 3 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:111.32,113.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:120.68,122.24 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:122.24,126.4 3 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:132.30,135.9 3 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:136.17,136.17 0 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:137.25,137.25 0 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:141.56,144.22 3 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:166.2,166.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:169.2,169.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:144.22,148.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:148.8,148.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:148.24,154.79 4 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:158.3,158.104 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:154.79,157.4 2 0 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:159.8,159.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:159.22,162.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:166.22,168.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:184.78,187.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:190.46,191.25 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:194.2,194.33 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:191.25,193.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:198.39,200.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:204.2,204.26 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:220.2,220.13 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:200.24,202.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:204.26,205.26 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:210.3,210.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:214.3,214.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:218.3,218.36 1 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:205.26,209.4 3 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:210.23,212.12 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:214.27,216.12 2 1 -github.com/ethereum/go-ethereum/p2p/discover/lookup.go:224.35,226.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:42.51,47.2 4 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:49.77,50.32 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:53.2,57.34 5 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:60.2,60.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:50.32,52.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/node.go:57.34,59.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/node.go:63.34,65.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:67.36,69.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:71.42,73.23 2 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:76.2,76.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:73.23,75.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:79.38,81.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:83.44,85.23 2 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:88.2,88.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:85.23,87.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:91.36,93.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/node.go:95.32,97.2 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:40.44,40.61 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:41.44,41.66 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:42.44,42.71 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:46.24,48.16 2 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:51.2,51.55 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:48.16,50.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:51.55,54.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:54.8,56.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:65.57,68.16 2 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:74.2,79.38 4 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:112.2,115.37 3 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:118.2,118.49 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:68.16,70.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:79.38,82.17 2 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:85.3,88.47 3 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:92.3,95.44 3 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:98.3,109.49 6 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:82.17,84.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:88.47,90.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:95.44,97.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/ntp.go:115.37,117.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:102.99,114.56 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:117.2,117.29 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:122.2,125.17 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:114.56,116.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:117.29,121.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:128.38,130.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:132.30,139.2 5 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:143.62,144.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:147.2,151.33 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:157.2,157.34 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:161.2,161.25 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:144.23,146.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:151.33,152.31 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:152.31,154.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:157.34,160.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:165.52,170.30 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:175.2,175.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:170.30,171.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:171.19,173.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:179.27,182.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:187.63,188.26 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:193.2,194.12 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:188.26,189.46 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:189.46,191.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:198.37,199.9 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:200.22,201.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:202.10,203.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:207.45,209.9 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:214.2,214.13 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:210.30,210.30 0 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:211.22,212.14 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:218.26,235.6 6 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:267.2,267.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:270.2,270.29 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:273.2,273.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:276.2,276.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:235.6,236.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:237.20,239.26 2 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:243.32,245.26 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:249.22,250.31 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:253.4,253.35 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:254.23,256.39 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:257.25,259.24 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:260.22,261.26 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:262.23,263.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:239.26,242.5 2 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:245.26,248.5 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:250.31,252.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:267.24,269.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:270.29,272.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:273.27,275.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:281.49,298.25 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:298.25,300.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:303.35,306.23 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:306.23,308.42 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:309.3,310.24 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:308.42,308.110 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:316.54,317.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:319.2,320.17 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:326.2,329.28 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:338.2,341.16 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:350.2,350.41 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:317.15,317.37 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:320.17,323.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:329.28,331.17 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:331.17,333.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:333.9,335.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:341.16,347.3 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:350.41,352.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:352.8,354.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:358.56,362.52 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:369.2,369.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:362.52,364.25 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:364.25,367.4 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:372.54,377.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:381.35,386.33 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:386.33,387.31 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:387.31,388.70 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:388.70,390.5 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:402.97,411.33 5 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:420.2,420.46 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:423.2,423.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:411.33,412.31 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:412.31,414.42 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:414.42,416.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:420.46,422.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:427.33,431.33 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:434.2,434.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:431.33,433.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:438.46,443.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:446.47,449.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:451.51,452.28 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:455.2,455.43 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:452.28,454.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:463.40,464.31 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:468.2,471.33 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:475.2,475.34 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:480.2,480.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:485.2,488.30 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:464.31,466.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:471.33,474.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:475.34,479.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:480.27,483.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:488.30,490.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:502.44,503.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:506.2,506.31 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:510.2,513.28 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:517.2,517.34 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:522.2,522.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:527.2,530.30 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:503.23,505.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:506.31,508.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:513.28,516.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:517.34,521.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:522.27,525.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:530.30,532.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:536.38,541.2 3 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:543.52,544.18 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:547.2,547.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:550.2,550.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:554.2,554.20 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:559.2,559.13 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:544.18,546.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:547.23,549.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:550.22,553.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:554.20,558.3 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:562.50,563.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:566.2,567.18 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:563.23,565.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:570.54,571.35 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:576.2,576.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:579.2,581.20 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:571.35,572.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:572.23,574.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:576.27,578.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:581.20,583.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:589.56,590.74 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:595.2,595.30 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:599.2,603.10 5 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:590.74,593.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:595.30,598.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:608.57,609.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:626.2,626.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:609.27,610.34 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:610.34,611.40 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:621.4,623.15 3 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:611.40,614.30 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:614.30,618.6 2 0 -github.com/ethereum/go-ethereum/p2p/discover/table.go:629.54,632.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:634.45,635.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:640.2,640.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:635.23,636.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:636.19,638.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:644.64,645.21 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:648.2,651.22 4 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:645.21,647.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:655.48,656.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:661.2,661.13 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:656.22,657.29 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:657.29,659.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:671.55,672.53 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:675.2,675.31 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:678.2,678.26 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:672.53,674.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:675.31,677.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:678.27,681.3 0 1 -github.com/ethereum/go-ethereum/p2p/discover/table.go:681.8,686.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:129.75,146.16 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:149.2,155.15 6 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:146.16,148.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:159.36,161.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:164.25,165.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:165.24,170.3 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:175.52,177.44 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:181.2,181.81 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:188.2,189.25 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:192.2,193.28 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:200.2,200.10 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:177.44,179.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:181.81,183.45 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:183.45,185.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:189.25,191.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:193.28,194.24 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:194.24,195.47 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:195.47,197.5 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:203.47,207.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:210.43,213.2 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:216.61,218.33 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:221.2,221.17 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:218.33,220.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:226.93,229.16 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:236.2,236.109 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:244.2,246.11 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:229.16,233.3 3 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:236.109,238.33 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:241.3,241.26 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:238.33,240.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:249.60,257.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:260.66,261.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:266.2,266.57 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:261.22,265.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:270.46,272.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:275.46,277.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:280.44,282.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:284.62,288.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:290.77,293.69 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:296.2,296.11 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:293.69,295.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:301.101,308.114 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:321.2,331.42 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:334.2,334.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:308.114,310.34 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:319.3,319.39 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:310.34,313.18 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:317.4,317.28 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:313.18,315.13 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:331.42,333.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:338.64,346.16 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:352.2,352.116 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:357.2,358.34 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:362.2,363.16 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:366.2,366.26 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:369.2,369.27 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:372.2,372.66 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:375.2,375.19 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:346.16,348.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:352.116,355.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:358.34,360.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:363.16,365.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:366.26,368.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:369.27,371.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:372.66,374.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:380.100,383.9 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:389.2,389.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:384.30,384.30 0 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:386.27,387.18 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:394.83,396.9 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:397.55,399.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:400.27,401.15 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:407.24,420.25 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:442.2,442.6 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:420.25,421.65 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:425.3,426.54 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:438.3,439.17 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:421.65,423.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:426.54,428.67 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:435.4,436.20 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:428.67,431.5 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:442.6,445.10 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:446.28,447.55 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:450.4,450.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:452.33,454.21 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:456.26,458.55 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:473.4,473.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:475.27,479.55 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:488.4,488.42 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:447.55,449.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:458.55,460.73 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:460.73,465.21 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:470.6,470.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:465.21,468.7 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:479.55,481.55 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:481.55,485.6 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:488.42,489.54 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:493.5,493.21 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:489.54,492.6 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:499.93,501.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:504.2,504.56 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:501.16,503.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:507.93,511.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:514.55,516.22 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:520.2,521.6 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:516.22,518.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:521.6,523.36 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:534.3,534.68 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:523.36,526.12 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:527.9,527.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:527.24,529.21 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:532.4,532.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:529.21,531.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:534.68,535.11 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:536.53,536.53 0 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:537.12,537.12 0 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:543.67,545.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:549.2,551.43 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:554.2,555.40 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:558.2,558.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:545.16,548.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:551.43,553.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:555.40,557.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:562.56,564.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:568.64,570.69 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:570.69,575.3 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:578.81,579.20 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:582.2,582.63 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:585.2,585.60 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:588.2,589.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:592.2,594.15 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:579.20,581.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:582.63,584.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:585.60,587.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:589.16,591.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:597.37,600.57 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:603.2,603.86 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:600.57,602.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:607.62,610.18 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:627.2,627.11 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:611.20,613.26 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:614.20,615.29 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:616.24,618.30 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:619.25,620.34 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:621.26,623.32 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:624.27,625.36 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:643.113,647.16 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:650.2,650.36 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:653.2,654.12 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:647.16,649.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:650.36,652.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:657.96,670.73 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:679.2,680.92 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:670.73,671.35 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:671.35,673.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:674.8,676.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:685.113,688.36 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:691.2,691.42 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:694.2,696.12 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:688.36,690.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:691.42,693.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:701.117,704.36 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:707.2,707.35 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:716.2,716.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:704.36,706.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:707.35,715.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:719.100,730.28 6 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:740.2,740.31 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:730.28,731.51 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:734.3,734.42 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:731.51,733.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:734.42,738.4 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:740.31,742.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:747.118,750.36 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:753.2,753.47 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:756.2,756.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:750.36,752.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:753.47,755.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:761.119,764.36 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:767.2,767.35 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:770.2,770.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:764.36,766.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:767.35,769.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:773.102,778.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:782.120,783.47 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:786.2,786.12 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v4_udp.go:783.47,785.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:125.78,127.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:130.2,134.15 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:127.16,129.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:138.78,168.16 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:171.2,172.15 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:168.16,170.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:176.36,178.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:181.25,182.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:182.24,187.3 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:191.43,194.2 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:198.52,199.81 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:203.2,203.46 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:207.2,208.28 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:213.2,213.10 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:199.81,201.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:203.46,205.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:208.28,209.46 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:209.46,211.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:217.42,222.35 4 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:227.2,227.14 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:222.35,223.31 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:223.31,225.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:232.46,234.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:239.82,243.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:246.93,250.9 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:251.28,252.53 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:253.25,254.18 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:259.46,260.22 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:266.2,266.57 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:260.22,264.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:271.55,273.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:277.46,279.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:283.44,285.2 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:287.62,291.2 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:293.73,294.70 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:294.70,296.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:300.80,308.22 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:311.2,311.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:316.2,316.27 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:308.22,310.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:311.22,312.30 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:312.30,314.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:322.60,325.51 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:333.2,333.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:325.51,326.17 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:329.3,329.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:326.17,328.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:329.15,331.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:337.53,342.9 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:343.25,344.41 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:345.25,346.16 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:351.64,353.16 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:356.2,356.21 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:359.2,359.22 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:353.16,355.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:356.21,358.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:363.82,366.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:369.82,377.6 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:377.6,378.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:379.28,381.42 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:389.4,389.19 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:392.4,392.37 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:395.23,396.21 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:381.42,383.19 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:387.5,387.32 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:383.19,385.14 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:389.19,391.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:392.37,394.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:402.129,404.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:407.2,407.69 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:410.2,410.26 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:413.2,413.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:419.2,419.34 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:422.2,423.18 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:404.16,406.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:407.69,409.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:410.26,412.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:413.22,415.41 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:415.41,417.4 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:419.34,421.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:426.43,427.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:432.2,432.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:427.23,428.13 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:428.13,430.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:437.89,450.9 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:455.2,455.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:451.21,451.21 0 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:452.27,453.21 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:459.37,463.6 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:463.6,464.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:465.15,465.15 0 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:467.16,467.16 0 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:469.26,470.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:471.28,472.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:488.28,494.6 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:494.6,495.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:496.24,499.22 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:501.32,503.52 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:507.28,510.19 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:513.4,516.22 4 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:518.28,521.30 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:523.28,525.39 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:531.4,531.42 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:536.4,536.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:503.52,505.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:510.19,511.45 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:525.39,526.29 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:529.5,529.28 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:526.29,528.6 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:531.42,535.5 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:542.49,543.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:546.2,550.50 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:557.2,558.13 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:543.22,545.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:550.50,552.10 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:553.50,553.50 0 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:554.28,554.28 0 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:562.43,564.54 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:567.2,569.21 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:564.54,566.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:569.21,571.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:571.8,574.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:579.37,582.33 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:586.2,590.27 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:582.33,584.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:595.94,598.2 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:601.123,604.16 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:608.2,610.19 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:604.16,607.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:614.28,618.25 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:618.25,620.36 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:631.3,631.43 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:620.36,623.12 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:624.9,624.24 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:624.24,626.21 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:629.4,629.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:626.21,628.5 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:636.76,637.9 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:638.49,639.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:640.27,641.15 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:646.77,649.16 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:653.2,653.21 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:657.2,657.45 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:661.2,662.12 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:649.16,652.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:653.21,656.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:657.45,660.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:666.98,668.56 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:672.2,672.72 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:676.2,676.33 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:680.2,682.13 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:668.56,671.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:672.72,675.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:676.33,679.3 2 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:686.50,687.38 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:690.2,690.52 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:693.2,693.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:687.38,689.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:690.52,692.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:697.81,698.23 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:699.23,700.39 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:701.25,702.41 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:703.20,704.36 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:705.20,706.48 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:709.24,710.40 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:711.21,712.44 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:713.27,714.43 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:715.28,716.44 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:706.48,708.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:721.90,724.38 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:728.2,728.45 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:724.38,727.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:737.94,739.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:745.2,749.15 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:739.16,742.3 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:753.85,755.14 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:758.2,758.26 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:761.2,761.15 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:755.14,757.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:758.26,760.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:765.84,770.27 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:773.2,778.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:770.27,772.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:782.92,784.49 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:784.49,786.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:790.90,793.33 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:823.2,823.14 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:793.33,796.25 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:801.3,802.16 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:809.3,812.24 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:796.25,797.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:802.16,804.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:804.9,804.25 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:804.25,808.4 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:812.24,814.48 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:817.4,818.27 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:814.48,815.13 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:818.27,820.5 1 0 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:827.67,828.21 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:832.2,834.21 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:843.2,843.13 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:828.21,830.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:834.21,837.30 3 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:840.3,841.25 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:837.30,839.4 1 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:847.98,853.20 5 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:856.2,857.40 2 1 -github.com/ethereum/go-ethereum/p2p/discover/v5_udp.go:853.20,855.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:52.41,53.20 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:56.2,56.29 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:59.2,59.22 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:62.2,62.12 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:53.20,55.3 1 0 -github.com/ethereum/go-ethereum/p2p/discover/common.go:56.29,58.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:59.22,61.3 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:66.76,68.2 1 0 -github.com/ethereum/go-ethereum/p2p/discover/common.go:77.24,78.11 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:81.2,81.10 1 1 -github.com/ethereum/go-ethereum/p2p/discover/common.go:78.11,80.3 1 1 -github.com/ethereum/go-ethereum/rpc/ipc_unix.go:33.55,34.40 1 1 -github.com/ethereum/go-ethereum/rpc/ipc_unix.go:40.2,40.66 1 1 -github.com/ethereum/go-ethereum/rpc/ipc_unix.go:43.2,45.16 3 1 -github.com/ethereum/go-ethereum/rpc/ipc_unix.go:48.2,49.15 2 1 -github.com/ethereum/go-ethereum/rpc/ipc_unix.go:34.40,37.3 1 0 -github.com/ethereum/go-ethereum/rpc/ipc_unix.go:40.66,42.3 1 0 -github.com/ethereum/go-ethereum/rpc/ipc_unix.go:45.16,47.3 1 0 -github.com/ethereum/go-ethereum/rpc/ipc_unix.go:53.79,55.2 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:50.73,57.71 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:57.71,59.17 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:63.3,64.25 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:59.17,62.4 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:71.77,75.40 3 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:84.2,84.33 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:90.2,92.36 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:109.2,109.10 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:75.40,76.20 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:79.3,79.19 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:76.20,78.4 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:79.19,81.4 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:84.33,86.49 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:86.49,88.4 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:92.36,97.41 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:101.3,102.58 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:105.3,106.15 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:97.41,99.4 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:102.58,104.4 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:117.42,119.20 2 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:122.2,122.10 1 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:119.20,121.3 1 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:125.76,127.27 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:132.2,132.14 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:127.27,128.55 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:128.55,130.4 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:135.72,142.16 3 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:146.2,147.16 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:151.2,151.59 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:154.2,154.65 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:157.2,157.53 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:160.2,160.13 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:142.16,145.3 2 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:147.16,150.3 2 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:151.59,153.3 1 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:154.65,156.3 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:157.53,159.3 1 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:163.68,165.16 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:168.2,169.37 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:181.2,181.36 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:165.16,167.3 1 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:169.37,173.3 3 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:173.8,177.21 4 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:177.21,179.4 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:186.118,188.16 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:191.2,191.71 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:188.16,190.3 1 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:191.71,193.17 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:200.3,200.56 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:193.17,195.19 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:198.4,198.20 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:195.19,197.5 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:209.83,216.2 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:218.76,220.16 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:223.2,224.18 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:227.2,227.29 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:232.2,232.42 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:220.16,222.3 1 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:224.18,226.3 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:227.29,231.3 3 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:244.88,246.49 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:250.2,266.11 7 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:246.49,249.3 2 0 -github.com/ethereum/go-ethereum/rpc/websocket.go:269.35,272.2 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:274.47,276.2 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:278.79,280.16 2 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:287.2,287.12 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:280.16,282.10 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:283.35,283.35 0 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:284.11,284.11 0 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:291.38,296.6 4 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:296.6,297.10 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:298.22,299.10 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:300.23,301.21 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:304.4,304.31 1 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:305.18,311.31 6 1 -github.com/ethereum/go-ethereum/rpc/websocket.go:301.21,303.5 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:111.62,117.2 5 1 -github.com/ethereum/go-ethereum/rpc/client.go:119.64,122.2 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:136.84,137.9 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:138.20,140.16 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:146.3,146.24 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:147.25,148.22 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:140.16,141.11 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:142.28,142.28 0 1 -github.com/ethereum/go-ethereum/rpc/client.go:143.21,143.21 0 0 -github.com/ethereum/go-ethereum/rpc/client.go:162.43,164.2 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:170.71,172.16 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:175.2,175.18 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:172.16,174.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:176.23,177.26 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:178.19,179.40 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:180.15,181.24 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:182.10,183.30 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:184.10,185.75 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:191.61,194.2 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:196.81,198.16 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:201.2,203.15 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:198.16,200.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:206.87,223.13 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:226.2,226.10 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:223.13,225.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:233.72,235.2 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:237.43,240.2 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:244.64,250.2 5 1 -github.com/ethereum/go-ethereum/rpc/client.go:253.26,254.14 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:257.2,257.9 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:254.14,256.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:258.29,259.15 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:260.20,260.20 0 1 -github.com/ethereum/go-ethereum/rpc/client.go:267.47,268.15 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:271.2,274.18 4 1 -github.com/ethereum/go-ethereum/rpc/client.go:268.15,270.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:282.85,285.2 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:292.113,293.67 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:296.2,297.16 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:300.2,302.14 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:307.2,307.16 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:312.2,312.39 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:293.67,295.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:297.16,299.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:302.14,304.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:304.8,306.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:307.16,309.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:313.18,314.13 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:315.25,316.20 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:317.29,318.21 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:319.10,320.46 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:331.49,334.2 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:345.77,354.25 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:364.2,365.14 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:372.2,372.44 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:392.2,392.12 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:354.25,356.17 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:359.3,361.27 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:356.17,358.4 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:365.14,367.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:367.8,369.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:372.44,375.17 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:381.3,382.24 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:386.3,386.28 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:390.3,390.56 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:375.17,376.9 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:382.24,384.12 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:386.28,388.12 2 0 -github.com/ethereum/go-ethereum/rpc/client.go:396.88,399.16 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:402.2,404.14 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:407.2,407.29 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:399.16,401.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:404.14,406.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:411.123,413.2 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:417.123,419.2 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:433.138,436.85 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:439.2,439.21 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:442.2,442.14 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:446.2,447.16 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:450.2,458.45 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:461.2,461.43 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:464.2,464.20 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:436.85,437.98 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:439.21,440.54 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:442.14,444.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:447.16,449.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:458.45,460.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:461.43,463.3 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:467.94,469.21 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:475.2,475.17 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:469.21,471.59 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:471.59,473.4 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:480.82,481.9 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:482.23,485.13 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:486.20,489.19 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:490.19,491.23 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:495.80,496.24 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:502.2,503.16 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:509.2,509.12 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:496.24,498.42 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:498.42,500.4 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:503.16,505.13 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:505.13,507.4 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:512.55,513.28 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:517.2,517.34 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:522.2,523.16 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:527.2,527.9 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:513.28,515.3 1 0 -github.com/ethereum/go-ethereum/rpc/client.go:517.34,521.3 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:523.16,526.3 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:528.32,530.13 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:531.20,533.23 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:540.46,547.15 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:557.2,559.6 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:547.15,549.14 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:553.3,553.20 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:549.14,552.4 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:559.6,560.10 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:561.18,562.10 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:565.25,566.16 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:572.27,575.19 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:578.36,580.15 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:589.4,594.37 4 1 -github.com/ethereum/go-ethereum/rpc/client.go:597.28,601.33 3 1 -github.com/ethereum/go-ethereum/rpc/client.go:603.27,604.18 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:610.4,611.16 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:613.29,614.36 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:566.16,568.5 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:568.10,570.5 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:580.15,588.5 2 0 -github.com/ethereum/go-ethereum/rpc/client.go:604.18,608.5 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:620.30,621.6 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:621.6,622.10 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:623.19,623.19 0 1 -github.com/ethereum/go-ethereum/rpc/client.go:624.20,625.10 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:631.42,632.6 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:632.6,634.43 2 1 -github.com/ethereum/go-ethereum/rpc/client.go:637.3,637.17 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:641.3,641.34 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:634.43,636.4 1 1 -github.com/ethereum/go-ethereum/rpc/client.go:637.17,640.4 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:74.107,88.29 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:91.2,92.10 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:88.29,90.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:96.55,98.20 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:106.2,107.27 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:112.2,112.21 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:116.2,116.37 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:98.20,99.38 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:102.3,102.9 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:99.38,101.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:107.27,108.50 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:108.50,110.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:112.21,114.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:116.37,118.29 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:123.3,124.23 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:127.3,127.34 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:118.29,119.57 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:119.57,121.5 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:124.23,126.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:127.34,129.4 1 0 -github.com/ethereum/go-ethereum/rpc/handler.go:134.50,135.38 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:138.2,138.37 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:135.38,137.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:138.37,141.20 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:144.3,144.34 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:141.20,143.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:144.34,146.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:152.60,157.2 4 1 -github.com/ethereum/go-ethereum/rpc/handler.go:160.47,161.28 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:161.28,163.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:167.50,168.28 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:168.28,170.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:174.72,176.24 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:180.2,180.33 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:190.2,190.36 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:176.24,178.3 1 0 -github.com/ethereum/go-ethereum/rpc/handler.go:180.33,184.20 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:184.20,188.4 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:190.36,193.3 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:196.52,200.23 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:200.23,201.46 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:201.46,203.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:208.56,212.34 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:212.34,216.3 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:220.53,222.12 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:222.12,227.3 4 1 -github.com/ethereum/go-ethereum/rpc/handler.go:232.61,234.9 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:235.28,236.62 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:240.3,240.15 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:241.24,244.14 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:245.10,246.15 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:236.62,239.4 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:251.65,253.60 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:257.2,257.36 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:253.60,256.3 2 0 -github.com/ethereum/go-ethereum/rpc/handler.go:257.36,259.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:263.55,265.15 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:269.2,271.19 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:278.2,279.22 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:283.2,283.71 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:265.15,268.3 2 0 -github.com/ethereum/go-ethereum/rpc/handler.go:271.19,274.3 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:279.22,282.3 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:283.71,286.3 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:290.85,292.9 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:293.28,296.13 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:297.20,301.24 4 1 -github.com/ethereum/go-ethereum/rpc/handler.go:310.3,310.14 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:311.24,312.68 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:313.10,314.63 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:301.24,303.30 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:306.4,306.44 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:303.30,305.5 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:307.9,309.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:319.81,320.23 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:323.2,324.25 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:329.2,329.18 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:332.2,333.16 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:336.2,341.30 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:351.2,351.15 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:320.23,322.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:324.25,326.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:326.8,328.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:329.18,331.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:333.16,335.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:341.30,343.26 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:348.3,349.73 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:343.26,345.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:345.9,347.4 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:355.86,356.23 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:361.2,362.16 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:365.2,367.18 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:372.2,374.16 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:377.2,384.43 5 1 -github.com/ethereum/go-ethereum/rpc/handler.go:356.23,358.3 1 0 -github.com/ethereum/go-ethereum/rpc/handler.go:362.16,364.3 1 0 -github.com/ethereum/go-ethereum/rpc/handler.go:367.18,369.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:374.16,376.3 1 0 -github.com/ethereum/go-ethereum/rpc/handler.go:388.126,390.16 2 1 -github.com/ethereum/go-ethereum/rpc/handler.go:393.2,393.29 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:390.16,392.3 1 1 -github.com/ethereum/go-ethereum/rpc/handler.go:397.73,402.14 4 1 -github.com/ethereum/go-ethereum/rpc/handler.go:405.2,407.18 3 1 -github.com/ethereum/go-ethereum/rpc/handler.go:402.14,404.3 1 0 -github.com/ethereum/go-ethereum/rpc/handler.go:412.36,413.66 1 0 -github.com/ethereum/go-ethereum/rpc/handler.go:416.2,416.30 1 0 -github.com/ethereum/go-ethereum/rpc/handler.go:413.66,415.3 1 0 -github.com/ethereum/go-ethereum/rpc/ipc.go:28.54,29.6 1 1 -github.com/ethereum/go-ethereum/rpc/ipc.go:29.6,31.36 2 1 -github.com/ethereum/go-ethereum/rpc/ipc.go:37.3,38.37 2 1 -github.com/ethereum/go-ethereum/rpc/ipc.go:31.36,33.12 2 0 -github.com/ethereum/go-ethereum/rpc/ipc.go:34.9,34.24 1 1 -github.com/ethereum/go-ethereum/rpc/ipc.go:34.24,36.4 1 1 -github.com/ethereum/go-ethereum/rpc/ipc.go:48.69,49.71 1 1 -github.com/ethereum/go-ethereum/rpc/ipc.go:49.71,51.17 2 1 -github.com/ethereum/go-ethereum/rpc/ipc.go:54.3,54.29 1 1 -github.com/ethereum/go-ethereum/rpc/ipc.go:51.17,53.4 1 0 -github.com/ethereum/go-ethereum/rpc/service.go:61.77,63.16 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:66.2,67.25 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:71.2,73.23 3 1 -github.com/ethereum/go-ethereum/rpc/service.go:76.2,77.9 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:85.2,85.34 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:92.2,92.12 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:63.16,65.3 1 0 -github.com/ethereum/go-ethereum/rpc/service.go:67.25,69.3 1 0 -github.com/ethereum/go-ethereum/rpc/service.go:73.23,75.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:77.9,84.3 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:85.34,86.21 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:86.21,88.4 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:88.9,90.4 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:96.61,98.20 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:101.2,103.47 3 1 -github.com/ethereum/go-ethereum/rpc/service.go:98.20,100.3 1 0 -github.com/ethereum/go-ethereum/rpc/service.go:107.72,111.2 3 1 -github.com/ethereum/go-ethereum/rpc/service.go:116.69,119.39 3 1 -github.com/ethereum/go-ethereum/rpc/service.go:131.2,131.18 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:119.39,121.27 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:124.3,125.16 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:128.3,129.23 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:121.27,122.12 1 0 -github.com/ethereum/go-ethereum/rpc/service.go:125.16,126.12 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:136.56,145.39 5 1 -github.com/ethereum/go-ethereum/rpc/service.go:148.2,148.19 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:152.2,152.9 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:161.2,161.10 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:145.39,147.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:148.19,150.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:153.46,154.15 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:155.22,156.52 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:159.3,159.15 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:156.52,158.4 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:165.35,169.22 3 1 -github.com/ethereum/go-ethereum/rpc/service.go:172.2,172.69 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:177.2,178.45 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:169.22,171.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:172.69,175.3 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:178.45,180.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:184.115,187.22 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:190.2,190.14 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:193.2,196.15 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:206.2,207.23 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:210.2,210.49 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:215.2,215.36 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:187.22,189.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:190.14,192.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:196.15,197.35 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:197.35,203.4 5 0 -github.com/ethereum/go-ethereum/rpc/service.go:207.23,209.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:210.49,214.3 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:219.41,220.30 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:223.2,223.25 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:220.30,222.3 1 0 -github.com/ethereum/go-ethereum/rpc/service.go:227.39,228.30 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:231.2,231.32 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:228.30,230.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:235.46,236.30 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:239.2,239.30 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:236.30,238.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:244.45,246.56 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:249.2,251.33 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:246.56,248.3 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:255.37,257.18 2 1 -github.com/ethereum/go-ethereum/rpc/service.go:260.2,260.20 1 1 -github.com/ethereum/go-ethereum/rpc/service.go:257.18,259.3 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:47.17,49.2 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:52.36,55.43 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:61.2,65.19 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:55.43,57.3 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:57.8,59.3 1 0 -github.com/ethereum/go-ethereum/rpc/subscription.go:65.19,71.3 5 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:74.28,77.14 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:80.2,80.22 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:77.14,79.3 1 0 -github.com/ethereum/go-ethereum/rpc/subscription.go:86.65,89.2 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:108.55,112.18 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:117.2,118.14 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:112.18,113.61 1 0 -github.com/ethereum/go-ethereum/rpc/subscription.go:114.8,114.27 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:114.27,115.71 1 0 -github.com/ethereum/go-ethereum/rpc/subscription.go:123.58,125.16 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:129.2,132.18 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:137.2,137.17 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:140.2,141.12 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:125.16,127.3 1 0 -github.com/ethereum/go-ethereum/rpc/subscription.go:132.18,133.55 1 0 -github.com/ethereum/go-ethereum/rpc/subscription.go:134.8,134.27 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:134.27,135.32 1 0 -github.com/ethereum/go-ethereum/rpc/subscription.go:137.17,139.3 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:146.48,148.2 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:152.53,157.2 4 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:162.37,166.32 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:171.2,172.12 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:166.32,167.45 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:167.45,169.4 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:175.72,183.2 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:194.43,196.2 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:199.54,201.2 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:231.100,244.2 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:254.51,256.2 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:260.46,261.24 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:261.24,262.10 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:267.3,267.17 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:263.36,264.19 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:265.24,265.24 0 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:272.74,273.9 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:274.24,275.14 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:276.25,277.15 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:282.49,283.9 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:284.23,284.23 0 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:285.25,285.25 0 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:291.38,301.17 4 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:306.2,306.16 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:301.17,303.3 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:306.16,307.27 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:312.3,312.17 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:307.27,311.4 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:318.78,326.6 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:326.6,329.24 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:338.3,338.17 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:329.24,332.4 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:332.9,336.4 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:339.10,340.21 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:343.4,343.30 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:347.4,347.21 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:349.10,351.18 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:354.4,354.51 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:357.4,357.24 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:359.10,361.33 2 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:340.21,342.5 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:343.30,346.5 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:351.18,353.5 1 0 -github.com/ethereum/go-ethereum/rpc/subscription.go:354.51,356.5 1 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:366.87,370.2 3 1 -github.com/ethereum/go-ethereum/rpc/subscription.go:372.59,375.2 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:60.50,62.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:64.42,66.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:68.46,70.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:72.46,74.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:76.47,78.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:80.49,82.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:84.47,87.2 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:89.44,92.2 2 0 -github.com/ethereum/go-ethereum/rpc/json.go:94.69,98.2 3 1 -github.com/ethereum/go-ethereum/rpc/json.go:100.73,102.16 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:106.2,106.63 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:102.16,105.3 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:109.46,115.8 3 1 -github.com/ethereum/go-ethereum/rpc/json.go:118.2,119.8 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:122.2,122.12 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:115.8,117.3 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:119.8,121.3 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:131.38,132.23 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:135.2,135.20 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:132.23,134.3 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:138.39,140.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:142.47,144.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:179.94,186.41 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:189.2,189.14 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:186.41,188.3 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:194.38,199.2 4 1 -github.com/ethereum/go-ethereum/rpc/json.go:201.41,204.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:206.41,208.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:210.85,214.42 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:217.2,218.31 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:225.2,225.29 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:214.42,216.3 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:218.31,219.17 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:219.17,223.4 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:228.73,233.9 4 1 -github.com/ethereum/go-ethereum/rpc/json.go:236.2,237.20 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:233.9,235.3 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:240.29,241.21 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:241.21,244.3 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:248.49,250.2 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:256.66,257.19 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:262.2,265.17 4 1 -github.com/ethereum/go-ethereum/rpc/json.go:269.2,269.19 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:257.19,261.3 3 1 -github.com/ethereum/go-ethereum/rpc/json.go:265.17,268.3 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:273.40,274.24 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:281.2,281.14 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:274.24,276.55 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:279.3,279.18 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:276.55,277.12 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:287.103,291.9 4 1 -github.com/ethereum/go-ethereum/rpc/json.go:306.2,306.42 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:312.2,312.18 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:292.49,292.49 0 1 -github.com/ethereum/go-ethereum/rpc/json.go:295.18,296.18 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:297.30,299.61 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:302.10,303.43 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:299.61,301.4 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:306.42,307.37 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:310.3,310.46 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:307.37,309.4 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:315.91,317.30 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:331.2,332.18 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:317.30,318.22 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:321.3,322.56 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:325.3,325.55 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:328.3,328.37 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:318.22,320.4 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:322.56,324.4 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:325.55,327.4 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:336.69,338.51 2 1 -github.com/ethereum/go-ethereum/rpc/json.go:341.2,343.9 3 1 -github.com/ethereum/go-ethereum/rpc/json.go:346.2,346.20 1 1 -github.com/ethereum/go-ethereum/rpc/json.go:338.51,340.3 1 0 -github.com/ethereum/go-ethereum/rpc/json.go:343.9,345.3 1 0 -github.com/ethereum/go-ethereum/rpc/errors.go:29.37,30.24 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:33.2,33.52 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:30.24,32.3 1 0 -github.com/ethereum/go-ethereum/rpc/errors.go:64.47,64.64 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:66.46,68.2 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:72.53,72.70 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:74.52,76.2 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:81.38,81.55 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:83.37,83.57 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:88.47,88.64 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:90.46,90.66 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:95.47,95.64 1 0 -github.com/ethereum/go-ethereum/rpc/errors.go:97.46,97.66 1 0 -github.com/ethereum/go-ethereum/rpc/errors.go:102.46,102.63 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:104.45,104.65 1 1 -github.com/ethereum/go-ethereum/rpc/errors.go:111.39,111.56 1 0 -github.com/ethereum/go-ethereum/rpc/errors.go:113.38,113.66 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:55.67,56.39 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:59.41,60.38 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:63.41,65.2 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:67.66,70.2 2 0 -github.com/ethereum/go-ethereum/rpc/http.go:72.29,73.25 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:73.25,73.46 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:76.49,78.2 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:114.80,117.16 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:121.2,125.71 5 1 -github.com/ethereum/go-ethereum/rpc/http.go:117.16,119.3 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:125.71,133.3 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:137.49,139.2 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:141.86,144.16 3 1 -github.com/ethereum/go-ethereum/rpc/http.go:147.2,150.67 3 1 -github.com/ethereum/go-ethereum/rpc/http.go:153.2,154.12 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:144.16,146.3 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:150.67,152.3 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:157.98,160.16 3 0 -github.com/ethereum/go-ethereum/rpc/http.go:163.2,165.68 3 0 -github.com/ethereum/go-ethereum/rpc/http.go:168.2,168.37 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:171.2,171.12 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:160.16,162.3 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:165.68,167.3 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:168.37,170.3 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:174.92,176.16 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:179.2,180.16 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:183.2,184.46 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:187.2,193.16 5 1 -github.com/ethereum/go-ethereum/rpc/http.go:196.2,196.53 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:209.2,209.23 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:176.16,178.3 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:180.16,182.3 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:184.46,184.101 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:193.16,195.3 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:196.53,199.52 3 1 -github.com/ethereum/go-ethereum/rpc/http.go:203.3,207.4 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:199.52,201.4 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:219.76,223.2 3 1 -github.com/ethereum/go-ethereum/rpc/http.go:226.40,226.54 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:229.46,231.2 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:234.60,234.74 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:237.68,239.80 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:243.2,243.49 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:249.2,263.34 11 1 -github.com/ethereum/go-ethereum/rpc/http.go:239.80,242.3 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:243.49,246.3 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:268.52,269.65 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:272.2,272.47 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:277.2,277.36 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:281.2,281.81 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:289.2,290.45 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:269.65,271.3 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:272.47,275.3 2 1 -github.com/ethereum/go-ethereum/rpc/http.go:277.36,279.3 1 0 -github.com/ethereum/go-ethereum/rpc/http.go:281.81,282.49 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:282.49,283.22 1 1 -github.com/ethereum/go-ethereum/rpc/http.go:283.22,285.5 1 1 -github.com/ethereum/go-ethereum/rpc/metrics.go:32.66,34.12 2 1 -github.com/ethereum/go-ethereum/rpc/metrics.go:37.2,38.43 2 1 -github.com/ethereum/go-ethereum/rpc/metrics.go:34.12,36.3 1 1 -github.com/ethereum/go-ethereum/rpc/stdio.go:29.54,31.2 1 0 -github.com/ethereum/go-ethereum/rpc/stdio.go:34.80,35.69 1 0 -github.com/ethereum/go-ethereum/rpc/stdio.go:35.69,40.3 1 0 -github.com/ethereum/go-ethereum/rpc/stdio.go:48.55,50.2 1 0 -github.com/ethereum/go-ethereum/rpc/stdio.go:52.56,54.2 1 0 -github.com/ethereum/go-ethereum/rpc/stdio.go:56.35,58.2 1 0 -github.com/ethereum/go-ethereum/rpc/stdio.go:60.41,62.2 1 0 -github.com/ethereum/go-ethereum/rpc/stdio.go:64.57,66.2 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:75.57,77.70 2 1 -github.com/ethereum/go-ethereum/rpc/types.go:81.2,81.15 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:93.2,94.16 2 1 -github.com/ethereum/go-ethereum/rpc/types.go:97.2,97.29 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:100.2,101.12 2 1 -github.com/ethereum/go-ethereum/rpc/types.go:77.70,79.3 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:82.18,84.13 2 1 -github.com/ethereum/go-ethereum/rpc/types.go:85.16,87.13 2 1 -github.com/ethereum/go-ethereum/rpc/types.go:88.17,90.13 2 1 -github.com/ethereum/go-ethereum/rpc/types.go:94.16,96.3 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:97.29,99.3 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:107.53,108.12 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:109.27,110.33 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:111.25,112.31 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:113.26,114.32 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:115.10,116.42 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:120.37,122.2 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:130.64,134.16 4 1 -github.com/ethereum/go-ethereum/rpc/types.go:143.2,145.16 3 1 -github.com/ethereum/go-ethereum/rpc/types.go:148.2,148.15 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:134.16,135.49 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:138.3,141.13 4 1 -github.com/ethereum/go-ethereum/rpc/types.go:135.49,137.4 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:145.16,147.3 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:149.18,152.13 3 1 -github.com/ethereum/go-ethereum/rpc/types.go:153.16,156.13 3 1 -github.com/ethereum/go-ethereum/rpc/types.go:157.17,160.13 3 1 -github.com/ethereum/go-ethereum/rpc/types.go:161.10,162.23 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:162.23,165.18 3 1 -github.com/ethereum/go-ethereum/rpc/types.go:168.4,169.14 2 1 -github.com/ethereum/go-ethereum/rpc/types.go:165.18,167.5 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:170.9,172.18 2 1 -github.com/ethereum/go-ethereum/rpc/types.go:175.4,175.31 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:178.4,180.14 3 1 -github.com/ethereum/go-ethereum/rpc/types.go:172.18,174.5 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:175.31,177.5 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:185.60,186.28 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:189.2,189.30 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:186.28,188.3 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:192.47,193.28 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:196.2,196.26 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:199.2,199.14 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:193.28,195.3 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:196.26,198.3 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:202.58,203.26 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:206.2,206.29 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:203.26,205.3 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:209.73,215.2 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:217.84,223.2 1 1 -github.com/ethereum/go-ethereum/rpc/types.go:229.58,231.70 2 0 -github.com/ethereum/go-ethereum/rpc/types.go:235.2,236.16 2 0 -github.com/ethereum/go-ethereum/rpc/types.go:239.2,239.16 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:242.2,243.12 2 0 -github.com/ethereum/go-ethereum/rpc/types.go:231.70,233.3 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:236.16,238.3 1 0 -github.com/ethereum/go-ethereum/rpc/types.go:239.16,241.3 1 0 -github.com/ethereum/go-ethereum/rpc/endpoints.go:27.86,34.27 2 0 -github.com/ethereum/go-ethereum/rpc/endpoints.go:44.2,47.16 3 0 -github.com/ethereum/go-ethereum/rpc/endpoints.go:50.2,51.31 2 0 -github.com/ethereum/go-ethereum/rpc/endpoints.go:34.27,35.74 1 0 -github.com/ethereum/go-ethereum/rpc/endpoints.go:39.3,39.42 1 0 -github.com/ethereum/go-ethereum/rpc/endpoints.go:35.74,38.4 2 0 -github.com/ethereum/go-ethereum/rpc/endpoints.go:39.42,42.4 2 0 -github.com/ethereum/go-ethereum/rpc/endpoints.go:47.16,49.3 1 0 -github.com/ethereum/go-ethereum/rpc/inproc.go:25.42,27.72 2 1 -github.com/ethereum/go-ethereum/rpc/inproc.go:32.2,32.10 1 1 -github.com/ethereum/go-ethereum/rpc/inproc.go:27.72,31.3 3 1 -github.com/ethereum/go-ethereum/rpc/server.go:53.26,60.2 4 1 -github.com/ethereum/go-ethereum/rpc/server.go:66.72,68.2 1 1 -github.com/ethereum/go-ethereum/rpc/server.go:75.69,79.35 2 1 -github.com/ethereum/go-ethereum/rpc/server.go:84.2,89.11 5 1 -github.com/ethereum/go-ethereum/rpc/server.go:79.35,81.3 1 0 -github.com/ethereum/go-ethereum/rpc/server.go:95.77,97.35 1 1 -github.com/ethereum/go-ethereum/rpc/server.go:101.2,106.16 5 1 -github.com/ethereum/go-ethereum/rpc/server.go:112.2,112.11 1 1 -github.com/ethereum/go-ethereum/rpc/server.go:97.35,99.3 1 0 -github.com/ethereum/go-ethereum/rpc/server.go:106.16,107.20 1 0 -github.com/ethereum/go-ethereum/rpc/server.go:110.3,110.9 1 0 -github.com/ethereum/go-ethereum/rpc/server.go:107.20,109.4 1 0 -github.com/ethereum/go-ethereum/rpc/server.go:112.11,114.3 1 0 -github.com/ethereum/go-ethereum/rpc/server.go:114.8,116.3 1 1 -github.com/ethereum/go-ethereum/rpc/server.go:122.25,123.46 1 1 -github.com/ethereum/go-ethereum/rpc/server.go:123.46,125.42 2 1 -github.com/ethereum/go-ethereum/rpc/server.go:125.42,128.4 2 1 -github.com/ethereum/go-ethereum/rpc/server.go:139.50,144.47 4 1 -github.com/ethereum/go-ethereum/rpc/server.go:147.2,147.16 1 1 -github.com/ethereum/go-ethereum/rpc/server.go:144.47,146.3 1 1 -github.com/ethereum/go-ethereum/rpc/server.go:180.56,183.2 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:37.48,39.36 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:42.2,42.14 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:39.36,41.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:46.84,48.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:51.82,53.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:56.36,57.34 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:57.34,59.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:64.79,67.37 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:75.2,75.34 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:81.2,81.29 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:67.37,68.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:71.3,71.20 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:68.50,70.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:75.34,76.37 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:79.3,79.29 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:76.37,78.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:97.54,99.22 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:102.2,103.14 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:99.22,101.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:107.41,112.2 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:117.77,118.27 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:123.2,124.59 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:127.2,128.21 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:131.2,131.34 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:118.27,120.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:124.59,126.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:128.21,130.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:137.75,138.27 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:142.2,143.21 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:146.2,146.34 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:138.27,140.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:143.21,145.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:149.63,153.54 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:165.2,173.28 6 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:153.54,155.40 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:158.3,158.47 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:161.3,161.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:155.40,157.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:158.47,160.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:177.53,178.53 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:181.2,181.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:178.53,180.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:185.48,188.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:191.2,196.16 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:199.2,209.12 7 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:188.16,190.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:196.16,198.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:219.53,225.58 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:232.2,233.14 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:225.58,226.21 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:229.3,229.20 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:226.21,228.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:241.56,244.2 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_batch.go:246.32,248.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:31.64,36.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:39.31,41.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:44.47,46.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:49.49,51.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:55.70,57.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:61.69,63.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:67.92,69.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:73.44,75.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:79.40,81.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:85.58,87.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:90.84,92.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:94.85,96.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:100.50,102.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:106.50,108.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:112.30,114.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:118.74,120.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:124.53,126.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:129.42,131.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:136.73,143.2 3 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:146.55,148.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:157.59,159.18 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:166.2,166.18 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:183.2,183.35 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:159.18,161.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:161.8,163.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:166.18,168.40 2 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:168.40,171.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:175.4,175.14 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:171.20,172.10 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:175.14,177.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:179.8,181.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:189.40,191.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:194.56,196.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:201.55,203.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:213.51,215.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:218.47,220.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:223.38,225.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:228.36,230.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:233.30,235.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:245.61,248.2 2 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:251.50,254.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:257.59,259.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:270.40,272.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:276.42,278.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:283.41,285.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:288.2,288.31 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:285.16,287.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/table.go:294.43,296.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/table.go:300.38,302.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:33.67,35.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:39.2,39.35 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:44.2,44.36 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:48.2,49.54 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:53.2,53.26 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:35.20,37.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:39.35,42.3 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:44.36,46.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:49.54,52.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:58.88,59.63 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:59.63,61.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:66.89,68.30 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:68.30,70.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:75.79,77.42 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:77.42,79.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:83.69,84.53 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:84.53,86.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:90.75,91.30 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:91.30,93.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:98.107,100.24 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:103.2,104.34 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:107.2,108.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:112.2,112.45 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:117.2,118.33 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:100.24,102.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:104.34,106.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:108.17,111.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:112.45,113.24 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:113.24,115.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:123.127,126.24 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:129.2,130.34 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:134.2,135.46 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:140.2,141.33 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:126.24,128.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:130.34,132.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:135.46,136.29 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:136.29,138.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:146.105,148.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:152.103,153.71 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:153.71,155.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:160.75,165.16 4 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:174.2,174.23 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:165.16,166.40 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:169.3,169.51 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:172.3,172.22 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:166.40,167.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:169.51,170.12 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_indexes.go:174.23,176.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:28.46,30.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:34.75,35.101 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:39.2,39.73 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:43.2,43.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:35.101,37.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:39.73,41.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:47.87,52.19 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:59.2,60.19 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:67.2,68.19 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:74.2,74.12 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:52.19,54.36 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:54.36,56.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:60.19,62.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:68.19,70.36 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:70.36,72.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:80.89,83.35 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:88.2,89.63 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:94.2,94.42 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:83.35,85.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:89.63,92.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:100.86,103.23 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:108.2,109.21 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:113.2,114.17 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:119.2,119.92 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:123.2,123.19 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:103.23,105.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:109.21,111.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:114.17,117.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:119.92,122.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:127.117,130.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:135.2,135.67 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:130.16,132.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:135.67,137.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:141.81,144.39 2 1 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:144.39,146.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:151.148,153.24 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:157.2,158.17 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:164.2,164.91 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:153.24,155.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:158.17,161.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:169.110,171.24 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:175.2,176.34 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:180.2,181.17 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:187.2,187.91 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:171.24,173.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:176.34,178.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:181.17,184.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:196.72,198.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:202.2,203.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:198.20,200.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:207.86,209.96 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:209.96,211.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:215.87,218.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:221.82,222.58 1 0 -github.com/ethereum/go-ethereum/core/rawdb/bor_receipt.go:222.58,224.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:28.57,31.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:34.53,35.66 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:35.66,37.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:41.54,42.55 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:42.55,44.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:49.60,51.36 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:54.2,54.33 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:51.36,53.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:59.67,60.57 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:60.57,62.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:69.50,70.51 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:70.51,72.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:76.76,79.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:82.84,83.64 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:83.64,85.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:89.71,90.60 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:90.60,92.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:96.96,99.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:102.104,103.84 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:103.84,105.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:109.91,110.80 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:110.80,112.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:117.89,119.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:123.58,126.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:130.68,131.60 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:131.60,133.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:138.53,139.54 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:139.54,141.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:146.60,149.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:153.72,154.64 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:154.64,156.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:161.55,162.56 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:162.56,164.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:169.66,171.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:174.2,174.20 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:177.2,178.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:171.20,173.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:174.20,176.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:183.74,186.60 3 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:186.60,188.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:193.60,194.55 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:194.55,196.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:200.61,203.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:206.70,207.62 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_snapshot.go:207.62,209.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:106.129,114.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:122.2,123.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:127.2,137.42 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:157.2,157.57 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:162.2,162.22 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:170.2,170.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:179.2,182.21 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:114.57,115.38 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:115.38,118.4 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:123.16,125.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:137.42,139.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:146.3,146.31 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:139.17,140.41 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:143.4,144.19 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:140.41,142.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:157.57,158.111 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:158.111,160.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:162.22,166.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:166.8,169.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:170.16,171.40 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:174.3,175.18 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:171.40,173.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:186.33,191.24 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:204.2,204.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:207.2,207.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:191.24,195.34 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:200.3,200.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:195.34,196.40 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:196.40,198.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:200.50,202.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:204.17,206.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:212.72,213.43 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:216.2,216.19 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:213.43,215.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:220.71,221.43 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:224.2,224.29 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:221.43,223.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:232.94,233.43 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:236.2,236.29 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:233.43,235.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:240.46,242.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:245.42,247.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:250.60,256.43 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:259.2,259.27 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:256.43,258.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:264.80,268.2 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:271.100,272.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:275.2,280.15 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:292.2,293.41 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:296.2,297.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:300.2,301.23 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:272.16,274.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:280.15,281.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:281.17,283.38 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:283.38,285.19 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:285.19,287.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:293.41,295.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:297.16,299.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:305.52,306.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:309.2,312.43 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:315.2,315.33 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:320.2,321.12 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:306.16,308.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:312.43,314.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:315.33,316.51 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:316.51,318.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:325.51,326.16 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:329.2,332.40 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:335.2,335.33 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:340.2,341.12 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:326.16,328.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:332.40,334.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:335.33,336.50 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:336.50,338.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:345.32,347.33 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:352.2,352.17 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:355.2,355.12 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:347.33,348.38 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:348.38,350.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:352.17,354.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:360.36,361.24 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:364.2,369.36 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:375.2,375.36 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:381.2,382.12 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:361.24,363.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:369.36,372.8 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:375.36,377.22 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:377.22,379.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:386.34,391.33 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:401.2,401.33 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:409.2,411.12 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:391.33,393.19 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:396.3,397.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:393.19,395.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:397.20,399.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:401.33,402.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:405.3,405.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:402.50,404.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:405.50,407.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:419.50,426.6 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:426.6,427.10 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:433.3,433.14 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:449.3,450.30 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:455.3,458.10 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:474.3,475.18 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:482.3,487.38 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:490.3,491.17 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:498.3,498.34 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:503.3,504.38 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:511.3,511.39 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:514.3,518.52 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:528.3,528.39 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:531.3,534.19 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:568.3,571.32 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:574.3,577.41 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:428.17,430.10 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:431.11,431.11 0 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:433.14,435.24 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:439.4,439.11 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:435.24,438.5 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:440.51,441.20 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:442.33,443.20 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:444.18,445.11 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:450.30,453.12 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:459.22,462.12 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:464.28,467.12 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:469.38,472.12 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:475.18,478.12 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:487.38,489.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:491.17,494.12 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:498.34,500.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:504.38,506.28 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:506.28,509.5 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:511.39,513.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:518.52,520.19 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:520.19,522.35 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:522.35,525.6 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:528.39,530.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:534.19,536.26 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:562.4,562.40 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:536.26,538.35 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:542.5,543.40 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:559.5,560.10 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:538.35,541.6 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:543.40,546.22 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:550.6,550.46 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:556.6,557.42 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:546.22,548.15 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:550.46,553.15 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:562.40,564.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:571.32,573.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:577.41,579.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:583.105,586.64 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:638.2,638.20 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:586.64,587.35 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:635.3,635.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:587.35,590.31 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:593.4,594.24 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:597.4,598.22 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:601.4,602.26 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:605.4,606.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:611.4,611.74 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:614.4,614.75 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:617.4,617.73 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:620.4,620.78 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:623.4,623.75 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:628.4,629.88 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:633.4,633.33 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:590.31,592.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:594.24,596.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:598.22,600.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:602.26,604.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:606.20,608.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:611.74,613.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:614.75,616.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:617.73,619.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:620.78,622.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:623.75,625.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:629.88,631.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:647.76,648.16 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:651.2,655.9 4 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:661.2,661.87 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:686.2,686.50 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:689.2,694.16 4 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:697.2,704.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:708.2,708.69 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:724.2,724.39 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:727.2,732.41 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:735.2,736.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:740.2,740.26 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:747.2,747.49 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:751.2,751.12 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:648.16,650.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:655.9,657.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:661.87,667.31 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:682.3,682.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:667.31,668.27 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:671.4,672.18 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:675.4,675.30 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:680.4,680.26 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:668.27,670.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:672.18,674.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:675.30,676.49 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:676.49,678.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:686.50,688.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:694.16,696.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:704.16,706.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:708.69,709.58 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:713.3,714.17 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:717.3,717.49 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:720.3,720.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:709.58,712.4 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:714.17,716.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:717.49,719.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:721.17,723.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:724.39,726.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:732.41,734.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:736.16,738.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:740.26,742.114 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:742.114,744.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer.go:747.49,749.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:60.48,63.2 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:66.46,72.2 5 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:77.86,78.30 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:84.2,84.42 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:78.30,83.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:127.94,129.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:134.190,136.48 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:139.2,140.19 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:145.2,150.14 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:179.2,193.37 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:198.2,199.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:203.2,205.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:136.48,138.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:140.19,142.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:142.8,144.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:150.14,153.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:164.3,165.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:153.17,155.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:165.17,167.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:168.8,170.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:173.3,174.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:170.17,172.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:174.17,176.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:193.37,196.3 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:199.16,202.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:210.39,216.16 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:219.2,219.22 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:225.2,225.61 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:229.2,229.44 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:232.2,255.16 8 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:258.2,261.35 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:267.2,267.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:272.2,272.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:275.2,275.43 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:278.2,282.32 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:327.2,327.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:340.2,351.36 6 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:354.2,355.12 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:216.16,218.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:219.22,220.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:220.50,222.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:225.61,227.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:229.44,231.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:255.16,257.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:261.35,263.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:263.8,266.3 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:267.16,269.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:269.8,271.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:272.16,274.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:275.43,277.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:282.32,284.31 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:292.3,292.31 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:284.31,286.66 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:289.4,289.28 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:286.66,288.5 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:292.31,294.83 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:297.4,302.37 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:309.4,309.49 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:322.4,323.40 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:294.83,296.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:302.37,304.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:304.10,307.5 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:309.49,312.93 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:315.5,315.46 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:320.5,320.30 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:312.93,314.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:315.46,319.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:327.17,329.40 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:332.3,332.39 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:335.3,335.39 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:329.40,331.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:332.39,334.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:335.39,337.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:351.36,353.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:362.46,367.39 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:372.2,372.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:378.2,378.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:367.39,368.69 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:368.69,370.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:372.16,374.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:374.8,377.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:382.57,388.23 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:391.2,391.46 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:395.2,396.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:400.2,401.24 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:404.2,409.85 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:413.2,414.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:424.2,424.34 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:438.2,438.76 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:442.2,447.16 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:450.2,451.12 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:388.23,390.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:391.46,393.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:396.16,398.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:401.24,403.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:409.85,411.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:414.17,416.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:416.8,418.81 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:421.3,421.35 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:418.81,420.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:424.34,428.17 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:433.3,436.30 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:428.17,430.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:438.76,440.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:447.16,449.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:455.57,460.47 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:463.2,463.41 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:467.2,471.42 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:483.2,484.66 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:489.2,489.27 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:493.2,493.26 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:499.2,500.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:504.2,508.61 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:521.2,521.38 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:525.2,525.111 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:533.2,533.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:537.2,537.40 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:540.2,541.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:545.2,551.16 5 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:554.2,555.12 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:460.47,462.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:463.41,465.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:471.42,473.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:473.8,475.85 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:478.3,480.30 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:475.85,477.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:484.66,486.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:489.27,491.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:493.26,495.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:500.16,502.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:508.61,509.94 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:512.3,514.31 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:517.3,517.23 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:509.94,511.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:514.31,515.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:521.38,523.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:525.111,532.3 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:533.16,535.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:537.40,539.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:541.16,543.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:551.16,553.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:559.38,564.40 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:567.2,569.39 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:572.2,574.28 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:579.2,581.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:584.2,584.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:564.40,566.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:569.39,571.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:574.28,575.35 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:575.35,577.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:581.17,583.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:588.108,590.37 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:603.2,603.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:590.37,592.22 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:597.3,598.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:601.3,601.19 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:592.22,594.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:594.9,596.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:598.17,600.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:608.48,609.37 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:609.37,612.3 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:616.67,617.31 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:617.31,618.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:618.17,621.14 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:621.14,623.5 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:629.68,630.31 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:630.31,631.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:631.17,634.14 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:634.14,636.5 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:647.78,652.78 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:655.2,659.38 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:665.2,665.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:674.2,674.21 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:652.78,654.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:659.38,664.3 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:665.15,673.3 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:679.62,681.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:684.2,684.22 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:681.16,683.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:691.87,694.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:697.2,703.33 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:724.2,724.20 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:694.16,696.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:703.33,707.23 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:710.3,710.62 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:713.3,713.23 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:722.3,722.33 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:707.23,709.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:710.62,711.9 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:713.23,715.18 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:718.4,718.33 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:715.18,717.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:719.9,721.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:730.92,735.37 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:738.2,744.52 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:747.2,747.25 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:750.2,755.59 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:772.2,773.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:776.2,783.54 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:821.2,821.40 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:735.37,737.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:744.52,746.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:747.25,749.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:755.59,758.27 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:761.3,762.13 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:765.3,765.96 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:768.3,769.13 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:758.27,760.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:762.13,764.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:765.96,767.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:773.16,775.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:783.54,789.48 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:799.3,799.49 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:810.3,813.58 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:789.48,791.22 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:797.4,797.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:791.22,792.79 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:795.5,795.19 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:792.79,794.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:799.49,802.22 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:807.4,807.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:802.22,803.80 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:803.80,805.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:813.58,815.79 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:818.4,818.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:815.79,817.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:826.48,828.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:831.47,836.2 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:840.53,842.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:845.2,846.19 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:842.16,844.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:852.44,860.16 5 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:865.2,872.12 6 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:860.16,862.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:877.37,878.39 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:881.2,881.38 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:884.2,884.22 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:878.39,880.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:881.38,883.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:889.53,891.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:893.66,898.2 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:900.66,902.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:906.2,913.32 5 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:924.2,924.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:902.16,905.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:913.32,914.77 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:917.3,920.36 4 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:914.77,915.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:920.36,921.9 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:932.50,933.22 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:944.2,944.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:933.22,936.24 3 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:942.3,942.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:936.24,937.49 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_table.go:937.49,940.5 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:31.93,34.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:37.2,40.15 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:48.2,48.19 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:54.2,55.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:58.2,58.53 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:63.2,64.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:71.2,73.34 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:76.2,78.51 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:81.2,81.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:34.16,36.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:40.15,41.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:44.3,44.19 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:41.15,43.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:48.19,49.35 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:49.35,51.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:55.16,57.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:58.53,61.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:64.16,67.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:73.34,75.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:78.51,80.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:85.66,90.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:94.2,94.51 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:97.2,97.18 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:90.16,92.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:94.51,96.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:101.68,103.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:106.66,108.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:111.59,112.44 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:116.2,116.52 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:119.2,119.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:112.44,114.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_utils.go:116.52,118.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:37.68,39.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:47.2,47.33 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:39.57,41.21 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:45.3,45.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:41.21,44.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:51.83,52.68 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:52.68,54.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:58.66,59.57 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:59.57,61.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:66.68,73.16 5 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:78.2,78.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:73.16,74.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:74.50,76.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:89.80,97.16 3 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:109.2,109.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:97.16,99.28 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:102.3,103.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:106.3,107.50 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:99.28,100.12 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:103.17,104.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:115.109,117.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:120.2,129.16 5 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:142.2,142.24 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:117.16,119.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:129.16,130.40 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:133.3,133.108 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:130.40,131.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:133.108,137.29 3 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:137.29,138.10 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:146.74,148.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:151.2,152.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:148.20,150.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:156.82,159.41 3 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:159.41,161.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:165.68,166.57 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:166.57,168.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:172.62,174.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:177.2,177.33 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:174.20,176.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:181.69,182.60 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:182.60,184.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:188.61,190.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:193.2,193.33 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:190.20,192.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:197.68,198.59 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:198.59,200.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:204.65,206.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:209.2,209.33 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:206.20,208.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:213.72,214.63 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:214.63,216.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:221.59,223.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:226.2,227.54 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:231.2,231.15 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:223.20,225.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:227.54,230.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:235.66,237.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:240.2,240.50 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:237.16,239.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:240.50,242.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:248.55,250.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:253.2,254.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:250.20,252.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:259.63,260.74 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:260.74,262.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:266.61,268.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:271.2,272.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:268.20,270.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:276.69,277.80 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:277.80,279.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:291.83,293.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:296.2,297.22 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:301.2,303.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:317.2,317.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:321.2,323.46 3 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:329.2,329.19 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:293.16,295.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:297.22,300.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:303.16,306.38 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:306.38,307.60 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:314.4,314.11 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:307.60,311.5 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:311.10,312.10 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:317.16,319.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:323.46,325.23 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:325.23,327.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:333.83,335.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:347.2,347.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:335.57,340.58 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:344.3,345.13 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:340.58,342.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:351.71,352.31 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:355.2,355.69 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:358.2,358.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:352.31,354.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:355.69,357.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:362.81,364.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:367.2,368.66 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:372.2,372.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:364.20,366.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:368.66,371.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:377.65,387.16 4 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:390.2,391.42 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:387.16,389.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:391.42,393.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:397.77,399.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:399.57,401.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:406.90,407.59 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:407.59,409.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:414.80,416.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:419.2,419.32 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:416.16,418.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:423.81,428.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:438.2,438.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:428.57,430.36 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:435.3,436.13 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:430.36,433.4 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:443.72,445.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:457.2,457.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:445.57,447.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:453.3,455.13 3 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:447.20,449.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:461.95,462.64 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:462.64,464.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:468.69,469.31 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:472.2,472.72 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:475.2,475.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:469.31,471.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:472.72,474.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:479.77,481.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:484.2,485.64 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:489.2,489.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:481.20,483.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:485.64,488.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:493.92,495.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:498.2,498.38 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:495.16,497.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:502.75,503.62 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:503.62,505.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:509.79,511.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:521.2,521.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:511.57,513.36 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:518.3,519.13 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:513.36,516.4 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:525.72,527.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:530.2,531.62 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:535.2,535.11 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:527.20,529.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:531.62,534.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:539.85,541.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:544.2,544.64 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:541.16,543.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:544.64,546.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:550.73,551.61 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:551.61,553.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:558.73,559.31 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:562.2,562.76 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:565.2,565.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:559.31,561.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:562.76,564.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:569.85,571.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:581.2,581.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:571.57,573.36 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:578.3,579.13 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:573.36,576.4 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:587.87,590.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:594.2,595.64 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:599.2,600.49 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:603.2,603.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:590.20,592.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:595.64,598.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:600.49,602.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:613.112,616.21 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:619.2,620.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:624.2,624.87 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:628.2,628.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:616.21,618.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:620.17,623.3 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:624.87,627.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:632.103,635.35 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:638.2,639.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:643.2,643.70 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:635.35,637.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:639.16,641.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:643.70,645.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:649.79,650.66 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:650.66,652.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:671.54,673.42 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:676.2,677.34 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:680.2,680.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:673.42,675.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:677.34,679.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:684.110,686.31 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:689.2,689.37 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:701.2,701.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:686.31,688.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:689.37,692.46 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:692.46,699.4 6 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:707.108,710.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:713.2,714.57 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:724.2,725.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:729.2,729.83 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:733.2,734.35 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:737.2,737.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:710.20,712.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:714.57,717.68 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:720.3,721.13 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:717.68,719.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:725.17,728.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:729.83,732.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:734.35,736.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:743.114,745.21 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:748.2,749.35 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:752.2,752.13 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:745.21,747.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:749.35,751.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:761.79,763.19 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:766.2,767.17 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:770.2,770.82 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:763.19,765.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:767.17,769.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:774.62,777.2 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:780.157,786.63 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:786.63,787.32 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:808.3,808.13 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:787.32,790.40 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:795.4,796.46 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:800.4,801.13 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:804.4,804.97 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:790.40,792.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:796.46,798.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:801.13,803.5 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:804.97,806.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:812.187,814.82 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:817.2,817.67 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:820.2,820.73 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:823.2,823.70 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:826.2,826.67 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:829.2,829.76 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:832.2,832.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:814.82,816.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:817.67,819.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:820.73,822.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:823.70,825.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:826.67,828.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:829.76,831.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:836.76,844.2 5 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:848.89,856.2 5 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:869.33,869.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:870.43,872.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:873.38,873.65 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:876.67,878.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:881.2,882.58 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:885.2,885.32 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:890.2,890.12 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:878.16,880.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:882.58,884.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:885.32,886.32 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:886.32,888.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:895.55,897.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:900.2,901.58 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:904.2,905.32 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:908.2,908.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:897.16,899.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:901.58,903.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:905.32,907.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:913.64,915.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:918.2,919.19 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:924.2,924.30 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:930.2,935.37 3 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:938.2,939.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:942.2,942.50 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:915.16,917.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:919.19,920.59 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:920.59,922.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:924.30,925.87 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:925.87,928.4 2 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:935.37,937.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:939.16,941.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:942.50,944.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:948.47,949.47 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:949.47,951.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:955.76,956.55 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:962.2,962.55 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:968.2,968.27 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:978.2,978.10 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:956.55,958.15 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:958.15,960.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:962.55,964.15 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:964.15,966.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:968.27,970.15 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:973.3,974.15 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:970.15,972.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:974.15,976.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:982.52,984.39 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:987.2,988.29 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:991.2,991.58 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:984.39,986.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:988.29,990.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:995.50,997.38 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:1000.2,1001.28 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:1004.2,1004.55 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:997.38,999.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_chain.go:1001.28,1003.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:31.59,35.19 3 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:38.2,38.55 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:42.2,42.17 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:35.19,37.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:38.55,40.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:46.68,48.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:51.2,51.55 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:48.16,50.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:51.55,53.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:57.85,59.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:62.2,63.54 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:67.2,67.16 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:59.20,61.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:63.54,66.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:71.91,72.16 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:75.2,76.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:79.2,79.54 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:72.16,74.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:76.16,78.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:79.54,81.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:85.73,88.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:91.80,92.55 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:92.55,94.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:110.82,113.57 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:118.2,123.68 5 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:129.2,130.57 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:134.2,134.33 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:113.57,115.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:115.8,115.72 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:115.72,117.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:123.68,127.3 3 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:130.57,133.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:138.55,141.57 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:146.2,146.46 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:149.2,150.57 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:141.57,143.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:143.8,143.72 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:143.72,145.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:146.46,148.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:150.57,152.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:156.58,159.57 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:165.2,166.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:170.2,172.57 3 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:159.57,161.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:161.8,161.72 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:161.72,163.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:166.16,169.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:172.57,174.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:178.59,181.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:184.66,185.58 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_metadata.go:185.58,187.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:43.38,45.50 2 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:48.2,48.51 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:51.2,51.20 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:54.2,54.12 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:45.50,47.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:48.51,50.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:51.20,53.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:60.55,61.43 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:65.2,65.25 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:68.2,74.12 5 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:61.43,63.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:65.25,67.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:83.76,85.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:88.75,90.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:93.99,95.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:98.50,100.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:103.46,105.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:108.64,110.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:113.87,115.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:118.56,120.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:123.56,125.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:128.36,130.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:132.91,146.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:150.80,152.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:156.57,158.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:163.126,166.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:191.2,191.66 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:234.2,234.20 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:241.2,244.8 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:166.16,168.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:191.66,192.47 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:192.47,197.18 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:204.4,204.68 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:197.18,199.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:199.10,199.49 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:199.49,201.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:204.68,207.65 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:207.65,209.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:216.9,221.63 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:221.63,224.64 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:224.64,226.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:234.20,236.13 2 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:236.13,239.4 2 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:249.41,251.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/database.go:256.56,258.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:262.119,264.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:267.2,267.29 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:264.16,266.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:272.146,274.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:277.2,278.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:282.2,282.18 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:274.16,276.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:278.16,281.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:287.34,289.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:291.52,293.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:302.45,305.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:307.30,309.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:311.31,313.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:317.75,362.16 4 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:438.2,439.139 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:446.2,447.45 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:451.2,482.26 7 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:486.2,486.12 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:362.16,368.10 3 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:431.3,432.60 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:369.98,370.21 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:371.104,372.20 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:373.112,374.22 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:375.83,376.17 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:377.85,378.29 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:379.108,380.29 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:381.38,382.19 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:383.90,384.19 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:385.100,386.23 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:387.114,388.26 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:389.116,390.26 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:391.100,392.23 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:393.96,394.22 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:395.98,396.22 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:397.105,398.23 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:399.51,400.23 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:401.96,402.27 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:403.83,404.25 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:407.47,408.26 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:411.45,412.28 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:413.11,420.6 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:427.4,427.18 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:420.6,421.31 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:421.31,424.11 3 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:427.18,429.5 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:432.60,435.4 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:439.139,440.56 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:440.56,443.4 2 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:447.45,449.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/database.go:482.26,484.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:30.73,35.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:37.42,39.25 1 1 -github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:46.2,46.14 1 1 -github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:39.25,40.53 1 1 -github.com/ethereum/go-ethereum/core/rawdb/key_length_iterator.go:40.53,42.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:26.69,29.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:32.65,36.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:39.2,40.13 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:36.20,38.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:46.75,49.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:52.69,55.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:59.62,62.43 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:65.2,66.11 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:62.43,64.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:72.72,75.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:78.66,81.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:84.80,85.40 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:90.2,91.47 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:85.40,86.61 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:86.61,88.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:95.72,96.52 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:96.52,98.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:102.76,103.51 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:103.51,105.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:109.60,110.49 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:110.49,112.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:116.64,117.48 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_state.go:117.48,119.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:29.61,32.2 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:35.70,36.62 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:36.62,38.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:43.56,44.57 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:44.57,46.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:50.79,52.20 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:55.2,56.66 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:60.2,60.15 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:52.20,54.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:56.66,59.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:64.73,66.16 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:69.2,70.42 2 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:66.16,68.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:70.42,72.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:76.67,77.61 1 0 -github.com/ethereum/go-ethereum/core/rawdb/accessors_sync.go:77.61,79.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:148.46,152.2 3 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:155.44,157.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:160.56,162.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:165.58,167.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:170.42,172.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:175.47,177.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:180.59,182.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:185.63,187.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:190.43,192.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:195.50,197.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:200.70,202.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:205.58,207.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:210.70,217.2 4 1 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:220.46,222.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:225.43,227.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:230.39,232.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:236.43,237.87 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:240.2,240.19 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:237.87,239.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:244.41,246.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/schema.go:249.42,251.2 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:35.49,38.31 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:41.2,47.34 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:76.2,76.38 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:79.2,83.118 4 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:38.31,40.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:47.34,50.23 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:53.3,54.17 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:57.3,57.26 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:69.3,71.41 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:50.23,52.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:54.17,56.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:57.26,62.48 4 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:62.48,63.41 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:66.5,66.18 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:63.41,65.6 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:71.41,74.4 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:76.38,78.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:95.128,101.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:104.2,105.54 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:108.2,113.19 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:135.2,136.20 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:165.2,166.36 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:169.2,169.17 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:101.16,103.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:105.54,107.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:113.19,115.14 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:118.3,119.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:115.14,117.4 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:119.16,122.11 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:127.4,127.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:123.38,123.38 0 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:124.21,125.11 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:127.15,129.5 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:129.10,131.5 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:136.20,137.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:143.3,143.27 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:137.16,139.48 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:139.48,141.5 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:143.27,145.59 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:149.4,150.41 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:153.4,158.11 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:145.59,148.5 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:150.41,152.5 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:159.28,159.28 0 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:160.21,161.11 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:166.36,168.3 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:180.116,182.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:185.2,198.37 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:237.2,238.38 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:242.2,242.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:182.16,184.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:198.37,203.22 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:203.22,205.65 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:209.4,209.39 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:213.4,219.48 6 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:228.4,228.42 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:205.65,206.10 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:209.39,210.10 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:219.48,221.41 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:225.5,225.18 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:221.41,224.6 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:228.42,231.5 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:238.38,241.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:243.19,244.148 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:245.10,246.135 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:259.92,261.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:264.126,266.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:272.118,274.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:277.2,290.33 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:329.2,330.38 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:334.2,334.9 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:274.16,276.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:290.33,293.22 2 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:293.22,295.64 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:299.4,299.37 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:302.4,311.24 6 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:320.4,320.42 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:295.64,296.10 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:299.37,300.10 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:311.24,313.41 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:317.5,317.18 1 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:313.41,316.6 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:320.42,323.5 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:330.38,333.3 2 0 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:335.19,336.145 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:337.10,338.132 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:347.94,349.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/chain_iterator.go:352.128,354.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:42.49,47.2 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:51.61,53.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:56.2,57.48 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:60.2,60.19 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:53.16,55.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:57.48,59.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:65.65,67.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:70.2,70.31 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:67.16,69.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:76.74,78.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:87.2,87.22 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:94.2,95.16 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:101.2,101.26 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:108.2,108.15 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:78.16,80.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:87.22,89.48 2 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:92.3,92.16 1 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:89.48,91.4 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:95.16,97.3 1 0 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:101.26,104.48 3 1 -github.com/ethereum/go-ethereum/core/rawdb/freezer_meta.go:104.48,106.4 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:79.147,86.16 5 1 -github.com/ethereum/go-ethereum/core/headerchain.go:89.2,100.29 3 1 -github.com/ethereum/go-ethereum/core/headerchain.go:103.2,104.71 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:109.2,111.16 3 1 -github.com/ethereum/go-ethereum/core/headerchain.go:86.16,88.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:100.29,102.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:104.71,105.54 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:105.54,107.4 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:116.65,117.48 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:121.2,122.19 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:125.2,125.15 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:117.48,120.3 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:122.19,124.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:139.61,141.23 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:148.2,153.46 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:183.2,183.38 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:190.2,195.38 5 1 -github.com/ethereum/go-ethereum/core/headerchain.go:199.2,202.12 4 1 -github.com/ethereum/go-ethereum/core/headerchain.go:141.23,143.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:153.46,155.44 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:165.3,170.67 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:155.44,157.31 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:160.4,160.39 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:157.31,158.10 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:170.67,172.23 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:175.4,177.21 3 1 -github.com/ethereum/go-ethereum/core/headerchain.go:172.23,173.10 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:177.21,179.5 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:183.38,188.3 4 1 -github.com/ethereum/go-ethereum/core/headerchain.go:195.38,197.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:209.75,210.23 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:213.2,214.16 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:217.2,223.33 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:252.2,252.24 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:257.2,257.38 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:260.2,260.27 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:210.23,212.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:214.16,216.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:223.33,228.25 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:233.3,239.20 4 1 -github.com/ethereum/go-ethereum/core/headerchain.go:249.3,249.29 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:228.25,230.4 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:230.9,232.4 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:239.20,248.4 6 1 -github.com/ethereum/go-ethereum/core/headerchain.go:252.24,255.3 2 0 -github.com/ethereum/go-ethereum/core/headerchain.go:257.38,259.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:270.120,272.16 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:275.2,287.82 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:297.2,297.133 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:301.2,301.42 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:304.2,305.20 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:272.16,274.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:287.82,289.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:289.8,289.19 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:289.19,290.20 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:293.3,293.21 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:290.20,292.4 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:297.133,299.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:301.42,303.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:308.95,310.34 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:332.2,333.20 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:346.2,350.23 3 1 -github.com/ethereum/go-ethereum/core/headerchain.go:362.2,362.15 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:310.34,311.63 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:322.3,322.37 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:326.3,326.54 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:311.63,320.4 4 0 -github.com/ethereum/go-ethereum/core/headerchain.go:322.37,324.4 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:326.54,328.4 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:333.20,335.46 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:343.3,343.29 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:335.46,337.27 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:340.4,340.23 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:337.27,339.5 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:350.23,352.25 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:357.3,357.35 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:352.25,355.4 2 0 -github.com/ethereum/go-ethereum/core/headerchain.go:357.35,359.4 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:375.123,376.24 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:379.2,380.16 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:384.2,388.41 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:394.2,394.21 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:397.2,398.24 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:376.24,378.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:380.16,382.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:388.41,390.87 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:390.87,392.4 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:394.21,396.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:406.126,407.23 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:410.2,410.19 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:417.2,417.20 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:437.2,437.21 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:407.23,409.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:410.19,412.58 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:415.3,415.26 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:412.58,414.4 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:417.20,418.58 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:425.3,425.28 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:428.3,431.20 4 0 -github.com/ethereum/go-ethereum/core/headerchain.go:434.3,435.11 2 0 -github.com/ethereum/go-ethereum/core/headerchain.go:418.58,420.59 2 0 -github.com/ethereum/go-ethereum/core/headerchain.go:420.59,423.5 2 0 -github.com/ethereum/go-ethereum/core/headerchain.go:425.28,427.4 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:431.20,433.4 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:442.72,444.44 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:447.2,448.15 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:452.2,453.11 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:444.44,446.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:448.15,450.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:458.81,460.48 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:463.2,464.19 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:468.2,469.15 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:460.48,462.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:464.19,466.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:474.72,476.19 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:479.2,479.36 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:476.19,478.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:485.72,486.68 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:489.2,489.50 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:486.68,488.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:494.71,496.29 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:499.2,499.35 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:496.29,498.3 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:506.76,509.69 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:517.2,520.29 3 0 -github.com/ethereum/go-ethereum/core/headerchain.go:523.2,523.16 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:536.2,536.15 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:539.2,539.16 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:509.69,510.29 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:510.29,513.4 2 0 -github.com/ethereum/go-ethereum/core/headerchain.go:513.9,515.4 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:520.29,522.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:523.16,525.10 2 0 -github.com/ethereum/go-ethereum/core/headerchain.go:528.3,533.11 6 0 -github.com/ethereum/go-ethereum/core/headerchain.go:525.10,526.9 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:536.15,538.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:542.68,544.2 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:548.54,550.2 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:554.61,558.2 3 1 -github.com/ethereum/go-ethereum/core/headerchain.go:574.114,580.100 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:644.2,644.38 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:648.2,650.24 3 1 -github.com/ethereum/go-ethereum/core/headerchain.go:580.100,585.20 3 1 -github.com/ethereum/go-ethereum/core/headerchain.go:588.3,598.22 3 1 -github.com/ethereum/go-ethereum/core/headerchain.go:606.3,607.45 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:610.3,617.13 5 1 -github.com/ethereum/go-ethereum/core/headerchain.go:623.3,626.28 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:585.20,587.4 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:598.22,600.31 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:600.31,603.5 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:607.45,609.4 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:617.13,618.71 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:621.4,621.18 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:618.71,620.5 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:626.28,629.24 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:633.4,633.32 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:640.4,640.41 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:629.24,632.5 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:633.32,634.21 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:637.5,638.37 2 1 -github.com/ethereum/go-ethereum/core/headerchain.go:634.21,636.6 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:644.38,646.3 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:654.55,656.2 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:659.53,659.73 1 1 -github.com/ethereum/go-ethereum/core/headerchain.go:662.50,662.70 1 0 -github.com/ethereum/go-ethereum/core/headerchain.go:666.79,668.2 1 0 -github.com/ethereum/go-ethereum/core/gaspool.go:29.51,30.41 1 1 -github.com/ethereum/go-ethereum/core/gaspool.go:33.2,34.11 2 1 -github.com/ethereum/go-ethereum/core/gaspool.go:30.41,31.40 1 0 -github.com/ethereum/go-ethereum/core/gaspool.go:39.48,40.26 1 1 -github.com/ethereum/go-ethereum/core/gaspool.go:43.2,44.12 2 1 -github.com/ethereum/go-ethereum/core/gaspool.go:40.26,42.3 1 1 -github.com/ethereum/go-ethereum/core/gaspool.go:48.33,50.2 1 0 -github.com/ethereum/go-ethereum/core/gaspool.go:52.36,54.2 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:189.53,191.34 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:195.2,195.25 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:199.2,199.24 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:203.2,203.27 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:207.2,207.26 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:211.2,211.27 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:215.2,215.26 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:219.2,219.23 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:223.2,223.13 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:191.34,194.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:195.25,198.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:199.24,202.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:203.27,206.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:207.26,210.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:211.27,214.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:215.26,218.3 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:219.23,222.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:279.96,303.37 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:307.2,315.46 5 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:327.2,331.13 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:303.37,306.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:315.46,318.59 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:321.3,321.59 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:318.59,320.4 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:321.59,323.4 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:337.28,355.6 7 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:355.6,356.10 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:358.33,359.23 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:365.34,367.10 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:370.19,376.78 5 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:382.18,384.33 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:398.4,398.20 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:401.20,402.27 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:359.23,362.5 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:376.78,379.5 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:384.33,386.35 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:390.5,390.60 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:386.35,387.14 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:390.60,392.30 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:395.6,395.48 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:392.30,394.7 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:402.27,404.61 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:407.5,407.21 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:404.61,406.6 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:414.28,422.25 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:425.2,425.38 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:422.25,424.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:430.84,432.2 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:435.41,440.2 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:444.49,451.24 5 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:460.2,460.70 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:451.24,454.27 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:457.3,457.33 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:454.27,456.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:465.55,470.2 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:474.40,479.2 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:483.40,485.36 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:488.2,489.34 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:492.2,492.24 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:485.36,487.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:489.34,491.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:497.110,502.39 4 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:505.2,506.37 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:509.2,509.24 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:502.39,504.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:506.37,508.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:514.95,519.40 4 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:522.2,523.38 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:526.2,526.24 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:519.40,521.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:523.38,525.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:536.85,541.39 4 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:557.2,557.16 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:541.39,545.49 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:553.3,553.19 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:545.49,546.27 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:546.27,547.80 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:547.80,549.11 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:553.19,555.4 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:561.47,566.2 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:571.67,573.41 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:581.2,581.12 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:573.41,574.52 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:577.3,577.48 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:574.52,576.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:577.48,579.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:586.73,588.54 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:592.2,592.58 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:596.2,596.35 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:601.2,601.27 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:605.2,605.35 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:609.2,609.35 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:612.2,612.35 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:616.2,616.44 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:620.2,621.16 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:625.2,625.53 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:629.2,629.51 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:634.2,634.59 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:638.2,639.16 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:642.2,642.24 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:645.2,645.12 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:588.54,590.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:592.58,594.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:596.35,598.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:601.27,603.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:605.35,607.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:609.35,611.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:612.35,614.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:616.44,618.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:621.16,623.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:625.53,627.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:629.51,631.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:634.59,636.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:639.16,641.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:642.24,644.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:655.87,658.31 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:665.2,668.53 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:674.2,674.93 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:711.2,712.66 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:736.2,737.16 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:741.2,741.42 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:746.2,746.13 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:749.2,752.22 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:658.31,662.3 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:668.53,672.3 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:674.93,676.46 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:685.3,685.62 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:693.3,696.27 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:702.3,704.27 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:676.46,680.4 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:685.62,688.4 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:696.27,700.4 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:704.27,708.4 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:712.66,715.16 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:720.3,720.17 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:725.3,733.25 7 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:715.16,718.4 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:720.17,724.4 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:737.16,739.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:741.42,745.3 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:746.13,748.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:758.111,761.29 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:764.2,765.15 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:771.2,771.16 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:781.2,781.42 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:784.2,784.12 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:789.2,789.42 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:792.2,792.24 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:761.29,763.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:765.15,769.3 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:771.16,775.3 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:775.8,778.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:781.42,783.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:784.12,787.3 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:789.42,791.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:797.75,799.56 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:802.2,802.48 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:799.56,801.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:802.48,804.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:811.98,813.31 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:816.2,819.15 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:827.2,827.16 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:836.2,840.13 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:813.31,815.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:819.15,825.3 4 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:827.16,831.3 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:831.8,834.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:848.65,850.2 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:854.59,857.2 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:864.66,866.2 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:869.70,871.2 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:874.64,877.2 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:883.60,886.2 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:889.80,895.25 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:914.2,914.20 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:919.2,924.30 5 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:932.2,933.10 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:936.2,936.13 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:895.25,897.37 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:905.3,906.17 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:912.3,912.26 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:897.37,900.12 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:906.17,909.12 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:914.20,916.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:924.30,925.28 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:928.3,929.12 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:925.28,927.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:933.10,935.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:941.95,944.25 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:951.2,952.20 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:944.25,947.30 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:947.30,949.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:957.61,959.30 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:975.2,975.15 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:959.30,961.16 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:964.3,966.89 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:973.3,973.20 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:961.16,962.12 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:966.89,968.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:968.9,968.94 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:968.94,970.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:979.62,981.2 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:985.48,987.2 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:991.65,994.15 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:997.2,1001.16 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1004.2,1004.32 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1008.2,1008.51 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1027.2,1027.47 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:994.15,996.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1001.16,1003.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1004.32,1006.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1008.51,1009.55 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1009.55,1011.23 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1015.4,1015.32 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1020.4,1023.10 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1011.23,1013.5 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1015.32,1018.5 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1027.47,1028.47 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1032.3,1032.21 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1028.47,1031.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1032.21,1035.4 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1041.94,1042.9 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1043.64,1044.28 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1045.30,1046.30 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1052.78,1053.9 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1054.32,1055.28 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1056.30,1057.30 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1062.57,1063.9 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1064.33,1064.33 0 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1065.30,1065.30 0 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1072.41,1083.6 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1083.6,1085.38 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1097.3,1097.10 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1085.38,1095.4 5 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1098.33,1100.20 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1105.4,1106.32 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1108.35,1110.28 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1115.4,1116.32 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1118.36,1122.40 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1125.4,1125.30 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1127.18,1128.17 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1130.31,1132.22 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1135.4,1136.10 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1100.20,1102.5 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1102.10,1104.5 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1110.28,1112.5 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1112.10,1114.5 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1122.40,1124.5 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1132.22,1134.5 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1142.144,1143.27 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1146.2,1149.42 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1155.2,1156.18 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1174.2,1179.18 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1200.2,1208.30 6 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1215.2,1215.21 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1143.27,1145.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1149.42,1154.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1156.18,1161.28 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1168.3,1169.32 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1161.28,1163.31 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1163.31,1165.5 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1169.32,1171.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1179.18,1181.27 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1192.3,1193.40 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1197.3,1197.36 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1181.27,1182.88 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1182.88,1186.5 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1186.10,1189.5 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1193.40,1196.4 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1208.30,1210.33 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1213.3,1213.23 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1210.33,1212.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1215.21,1217.30 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1220.3,1220.37 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1217.30,1219.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1226.59,1230.60 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1291.2,1291.20 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1294.2,1295.16 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1299.2,1312.48 10 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1230.60,1235.79 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1235.79,1237.4 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1237.9,1244.18 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1244.18,1249.25 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1256.5,1257.87 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1249.25,1254.6 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1259.10,1260.43 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1267.5,1267.43 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1274.5,1274.34 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1286.5,1286.55 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1260.43,1262.84 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1262.84,1265.7 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1267.43,1269.84 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1269.84,1272.7 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1274.34,1276.84 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1280.6,1281.84 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1276.84,1279.7 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1281.84,1284.7 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1291.20,1293.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1295.16,1298.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1318.88,1323.32 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1378.2,1378.17 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1323.32,1325.18 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1329.3,1330.31 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1334.3,1337.28 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1341.3,1346.30 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1352.3,1357.34 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1367.3,1369.33 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1373.3,1373.19 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1325.18,1326.12 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1330.31,1333.4 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1337.28,1340.4 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1346.30,1348.38 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1348.38,1350.5 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1357.34,1359.28 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1364.4,1364.47 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1359.28,1363.5 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1369.33,1371.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1373.19,1376.4 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1384.39,1386.36 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1389.2,1389.40 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1393.2,1396.39 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1403.2,1404.61 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1441.2,1441.61 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1465.2,1465.63 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1386.36,1388.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1389.40,1391.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1396.39,1398.83 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1398.83,1400.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1404.61,1410.25 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1410.25,1415.105 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1415.105,1416.43 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1416.43,1420.30 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1429.6,1431.44 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1434.6,1434.15 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1420.30,1428.7 4 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1431.44,1433.7 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1441.61,1442.127 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1442.127,1443.35 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1443.35,1447.29 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1456.5,1458.35 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1461.5,1461.14 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1447.29,1455.6 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1458.35,1460.6 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1469.37,1471.34 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1474.2,1474.39 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1479.2,1480.31 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1485.2,1488.80 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1471.34,1473.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1474.39,1476.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1480.31,1481.34 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1481.34,1483.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1488.80,1495.47 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1504.3,1505.50 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1495.47,1496.38 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1499.4,1501.12 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1496.38,1498.5 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1505.50,1509.4 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1520.43,1522.39 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1522.39,1527.27 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1533.3,1534.28 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1539.3,1541.31 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1548.3,1549.33 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1553.3,1553.51 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1567.3,1567.19 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1527.27,1531.4 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1534.28,1538.4 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1541.31,1547.4 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1549.33,1551.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1553.51,1555.30 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1562.4,1564.52 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1555.30,1561.5 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1567.19,1569.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1581.51,1581.68 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1582.51,1582.99 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1583.51,1583.78 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1595.78,1600.29 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1603.2,1603.11 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1600.29,1602.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1607.58,1610.2 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1612.36,1614.2 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1618.62,1619.58 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1622.2,1622.14 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1619.58,1621.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1626.48,1629.2 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1632.52,1633.58 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1633.58,1635.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1640.50,1641.21 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1648.2,1648.18 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1641.21,1643.36 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1646.3,1646.23 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1643.36,1645.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1652.48,1653.35 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1656.2,1656.16 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1653.35,1655.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1679.30,1684.2 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1689.117,1693.11 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1700.2,1700.12 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1693.11,1694.36 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1694.36,1695.28 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1695.28,1697.5 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1700.12,1701.37 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1701.37,1702.29 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1702.29,1704.5 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1710.61,1714.37 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1717.2,1717.24 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1714.37,1716.3 1 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1721.66,1726.2 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1729.67,1734.2 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1737.32,1742.2 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1745.37,1750.2 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1753.38,1758.2 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1761.32,1766.2 3 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1769.59,1776.11 5 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1776.11,1778.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1778.8,1780.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1784.45,1789.9 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1792.2,1792.9 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1796.2,1800.25 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1789.9,1791.3 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1792.9,1795.3 2 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1805.59,1810.34 4 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1817.2,1817.17 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1810.34,1811.28 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1811.28,1815.4 3 0 -github.com/ethereum/go-ethereum/core/tx_pool.go:1821.75,1823.73 2 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1829.2,1829.14 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1823.73,1824.40 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1827.3,1827.14 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1824.40,1826.4 1 1 -github.com/ethereum/go-ethereum/core/tx_pool.go:1833.42,1835.2 1 1 -github.com/ethereum/go-ethereum/core/evm.go:39.107,47.19 2 1 -github.com/ethereum/go-ethereum/core/evm.go:52.2,52.27 1 1 -github.com/ethereum/go-ethereum/core/evm.go:55.2,55.45 1 1 -github.com/ethereum/go-ethereum/core/evm.go:58.2,69.3 1 1 -github.com/ethereum/go-ethereum/core/evm.go:47.19,49.3 1 1 -github.com/ethereum/go-ethereum/core/evm.go:49.8,51.3 1 1 -github.com/ethereum/go-ethereum/core/evm.go:52.27,54.3 1 1 -github.com/ethereum/go-ethereum/core/evm.go:55.45,57.3 1 1 -github.com/ethereum/go-ethereum/core/evm.go:73.48,78.2 1 1 -github.com/ethereum/go-ethereum/core/evm.go:81.82,86.36 2 1 -github.com/ethereum/go-ethereum/core/evm.go:86.36,88.22 1 0 -github.com/ethereum/go-ethereum/core/evm.go:91.3,91.67 1 0 -github.com/ethereum/go-ethereum/core/evm.go:95.3,98.7 3 0 -github.com/ethereum/go-ethereum/core/evm.go:110.3,110.23 1 0 -github.com/ethereum/go-ethereum/core/evm.go:88.22,90.4 1 0 -github.com/ethereum/go-ethereum/core/evm.go:91.67,93.4 1 0 -github.com/ethereum/go-ethereum/core/evm.go:98.7,100.21 2 0 -github.com/ethereum/go-ethereum/core/evm.go:103.4,106.28 4 0 -github.com/ethereum/go-ethereum/core/evm.go:100.21,101.10 1 0 -github.com/ethereum/go-ethereum/core/evm.go:106.28,108.5 1 0 -github.com/ethereum/go-ethereum/core/evm.go:116.76,118.2 1 1 -github.com/ethereum/go-ethereum/core/evm.go:121.81,135.2 7 1 -github.com/ethereum/go-ethereum/core/state_processor.go:44.109,50.2 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:59.139,70.111 2 1 -github.com/ethereum/go-ethereum/core/state_processor.go:73.2,76.42 3 1 -github.com/ethereum/go-ethereum/core/state_processor.go:90.2,92.41 2 1 -github.com/ethereum/go-ethereum/core/state_processor.go:70.111,72.3 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:76.42,78.17 2 1 -github.com/ethereum/go-ethereum/core/state_processor.go:81.3,83.17 3 1 -github.com/ethereum/go-ethereum/core/state_processor.go:86.3,87.45 2 1 -github.com/ethereum/go-ethereum/core/state_processor.go:78.17,80.4 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:83.17,85.4 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:95.270,102.16 4 1 -github.com/ethereum/go-ethereum/core/state_processor.go:107.2,108.37 2 1 -github.com/ethereum/go-ethereum/core/state_processor.go:113.2,118.21 3 1 -github.com/ethereum/go-ethereum/core/state_processor.go:123.2,127.21 3 1 -github.com/ethereum/go-ethereum/core/state_processor.go:132.2,137.21 6 1 -github.com/ethereum/go-ethereum/core/state_processor.go:102.16,104.3 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:108.37,110.3 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:110.8,112.3 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:118.21,120.3 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:120.8,122.3 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:127.21,129.3 1 1 -github.com/ethereum/go-ethereum/core/state_processor.go:144.230,146.16 2 1 -github.com/ethereum/go-ethereum/core/state_processor.go:150.2,152.113 3 1 -github.com/ethereum/go-ethereum/core/state_processor.go:146.16,148.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:42.104,49.58 2 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:49.58,52.55 2 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:55.3,63.88 3 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:66.3,68.20 2 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:71.3,71.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:74.3,74.14 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:80.3,80.58 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:52.55,54.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:63.88,65.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:68.20,70.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:71.21,73.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:74.14,76.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:76.9,78.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:97.103,105.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:109.56,111.33 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:116.2,117.32 2 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:120.2,120.32 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:124.2,124.74 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:111.33,114.3 2 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:117.32,119.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:120.32,122.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:132.56,134.33 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:138.2,138.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:141.2,141.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:145.2,145.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:134.33,136.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:138.34,140.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:141.34,143.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:149.52,150.18 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:153.2,153.38 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:150.18,152.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:157.51,158.49 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:161.2,161.36 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:158.49,160.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:165.48,167.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:170.43,172.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_insert.go:175.43,177.2 1 0 -github.com/ethereum/go-ethereum/core/bor_fee_log.go:28.3,42.2 1 1 -github.com/ethereum/go-ethereum/core/bor_fee_log.go:57.3,71.2 1 1 -github.com/ethereum/go-ethereum/core/bor_fee_log.go:86.3,88.30 1 1 -github.com/ethereum/go-ethereum/core/bor_fee_log.go:92.2,101.31 3 1 -github.com/ethereum/go-ethereum/core/bor_fee_log.go:106.2,115.4 1 1 -github.com/ethereum/go-ethereum/core/bor_fee_log.go:88.30,90.3 1 1 -github.com/ethereum/go-ethereum/core/bor_fee_log.go:101.31,103.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:36.40,36.57 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:37.40,37.62 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:38.40,38.67 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:40.41,42.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:44.39,50.2 5 1 -github.com/ethereum/go-ethereum/core/tx_list.go:61.36,66.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:69.60,71.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:75.50,77.27 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:80.2,80.35 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:77.27,79.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:86.68,90.53 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:96.2,96.20 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:99.2,99.16 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:90.53,94.3 3 1 -github.com/ethereum/go-ethereum/core/tx_list.go:96.20,98.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:107.87,110.22 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:113.2,113.16 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:110.22,112.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:116.32,118.29 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:121.2,122.15 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:118.29,120.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:127.87,131.33 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:137.2,137.22 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:140.2,140.16 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:131.33,132.17 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:132.17,135.4 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:137.22,139.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:145.61,147.31 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:151.2,154.53 3 1 -github.com/ethereum/go-ethereum/core/tx_list.go:158.2,162.20 3 1 -github.com/ethereum/go-ethereum/core/tx_list.go:165.2,165.14 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:147.31,149.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:154.53,157.3 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:162.20,164.3 1 0 -github.com/ethereum/go-ethereum/core/tx_list.go:170.49,173.9 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:177.2,177.37 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:183.2,186.13 3 1 -github.com/ethereum/go-ethereum/core/tx_list.go:173.9,175.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:177.37,178.29 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:178.29,180.9 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:196.62,198.49 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:202.2,203.80 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:208.2,210.14 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:198.49,200.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:203.80,207.3 3 1 -github.com/ethereum/go-ethereum/core/tx_list.go:214.33,216.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:218.52,220.20 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:227.2,227.16 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:220.20,222.30 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:225.3,225.38 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:222.30,224.4 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:233.52,239.2 4 1 -github.com/ethereum/go-ethereum/core/tx_list.go:243.56,246.2 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:262.37,268.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:272.55,274.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:281.90,284.16 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:306.2,307.48 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:310.2,310.37 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:313.2,313.18 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:284.16,285.61 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:289.3,301.86 7 1 -github.com/ethereum/go-ethereum/core/tx_list.go:285.61,287.4 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:301.86,303.4 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:307.48,309.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:310.37,312.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:319.63,321.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:332.103,334.59 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:337.2,341.59 3 1 -github.com/ethereum/go-ethereum/core/tx_list.go:345.2,345.23 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:348.2,350.14 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:359.2,360.26 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:334.59,336.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:341.59,343.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:345.23,347.3 1 0 -github.com/ethereum/go-ethereum/core/tx_list.go:350.14,352.30 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:357.3,357.60 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:352.30,353.43 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:353.43,355.5 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:357.60,357.90 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:365.56,367.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:372.75,375.46 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:379.2,379.14 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:382.2,382.18 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:375.46,377.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:379.14,380.62 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:380.62,380.91 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:392.57,394.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:397.28,399.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:402.31,404.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:409.47,411.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:415.51,417.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:428.36,428.58 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:429.36,429.83 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:431.41,432.37 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:433.10,434.14 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:435.9,436.15 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:437.10,438.47 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:442.54,443.22 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:450.2,450.36 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:454.2,454.26 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:443.22,445.54 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:445.54,447.4 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:450.36,452.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:457.41,460.2 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:462.39,469.2 6 1 -github.com/ethereum/go-ethereum/core/tx_list.go:501.51,505.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:508.63,509.11 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:513.2,513.26 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:509.11,511.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:519.43,522.64 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:526.2,526.12 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:522.64,524.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:531.64,537.2 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:541.81,543.22 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:553.2,553.22 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:558.2,558.34 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:543.22,545.42 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:550.3,550.8 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:545.42,548.12 3 0 -github.com/ethereum/go-ethereum/core/tx_list.go:553.22,555.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:565.82,567.16 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:594.2,594.25 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:600.2,600.19 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:567.16,568.96 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:568.96,571.41 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:576.4,576.30 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:571.41,573.13 2 0 -github.com/ethereum/go-ethereum/core/tx_list.go:577.9,578.33 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:583.4,584.41 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:589.4,590.25 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:578.33,580.10 1 0 -github.com/ethereum/go-ethereum/core/tx_list.go:584.41,586.13 2 0 -github.com/ethereum/go-ethereum/core/tx_list.go:594.25,595.27 1 0 -github.com/ethereum/go-ethereum/core/tx_list.go:598.3,598.20 1 0 -github.com/ethereum/go-ethereum/core/tx_list.go:595.27,597.4 1 0 -github.com/ethereum/go-ethereum/core/tx_list.go:604.33,610.77 6 1 -github.com/ethereum/go-ethereum/core/tx_list.go:614.2,623.37 4 1 -github.com/ethereum/go-ethereum/core/tx_list.go:626.2,627.39 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:610.77,613.3 2 1 -github.com/ethereum/go-ethereum/core/tx_list.go:623.37,625.3 1 1 -github.com/ethereum/go-ethereum/core/tx_list.go:632.53,635.2 2 1 -github.com/ethereum/go-ethereum/core/bor_blockchain.go:10.76,11.54 1 1 -github.com/ethereum/go-ethereum/core/bor_blockchain.go:16.2,17.19 2 1 -github.com/ethereum/go-ethereum/core/bor_blockchain.go:22.2,23.20 2 1 -github.com/ethereum/go-ethereum/core/bor_blockchain.go:28.2,29.16 2 0 -github.com/ethereum/go-ethereum/core/bor_blockchain.go:11.54,13.3 1 0 -github.com/ethereum/go-ethereum/core/bor_blockchain.go:17.19,19.3 1 0 -github.com/ethereum/go-ethereum/core/bor_blockchain.go:23.20,25.3 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:40.52,40.74 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:41.52,41.66 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:51.43,55.2 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:59.78,61.57 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:65.2,66.16 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:69.2,73.15 3 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:76.2,82.44 3 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:90.2,94.6 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:114.2,116.16 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:61.57,63.3 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:66.16,68.3 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:73.15,73.39 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:82.44,83.32 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:83.32,84.18 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:84.18,87.5 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:94.6,97.42 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:107.3,109.52 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:97.42,98.21 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:101.4,101.23 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:104.4,104.9 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:98.21,100.5 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:101.23,103.5 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:109.52,112.4 2 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:120.63,121.27 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:124.2,124.55 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:127.2,127.12 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:121.27,123.3 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:124.55,126.3 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:132.83,134.27 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:141.2,142.16 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:145.2,146.26 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:155.2,158.68 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:161.2,162.16 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:165.2,168.12 3 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:134.27,135.48 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:138.3,138.23 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:135.48,137.4 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:142.16,144.3 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:146.26,147.26 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:153.3,153.24 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:147.26,148.53 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:148.53,151.5 2 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:158.68,160.3 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:162.16,164.3 1 0 -github.com/ethereum/go-ethereum/core/tx_journal.go:172.41,175.27 2 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:179.2,179.12 1 1 -github.com/ethereum/go-ethereum/core/tx_journal.go:175.27,178.3 2 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:36.52,41.2 1 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:45.54,51.36 3 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:54.2,54.25 1 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:51.36,53.3 1 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:59.61,64.2 3 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:68.68,72.36 3 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:75.2,75.31 1 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:78.2,78.26 1 1 -github.com/ethereum/go-ethereum/core/tx_noncer.go:72.36,74.3 1 0 -github.com/ethereum/go-ethereum/core/tx_noncer.go:75.31,77.3 1 0 -github.com/ethereum/go-ethereum/core/tx_noncer.go:82.60,87.2 3 1 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:49.78,57.2 3 0 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:61.102,65.2 3 0 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:69.81,73.2 3 0 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:77.39,79.44 2 0 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:86.2,86.22 1 0 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:79.44,81.17 2 0 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:84.3,84.87 1 0 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:81.17,83.4 1 0 -github.com/ethereum/go-ethereum/core/bloom_indexer.go:90.54,92.2 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:18.55,28.22 4 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:34.2,37.27 4 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:28.22,30.31 2 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:30.31,32.4 1 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:41.60,50.52 3 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:53.2,53.21 1 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:56.2,56.24 1 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:62.2,62.24 1 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:65.2,66.22 2 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:69.2,69.27 1 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:72.2,72.12 1 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:50.52,52.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:53.21,55.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:56.24,58.33 2 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:58.33,60.4 1 1 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:62.24,64.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:66.22,68.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis_account.go:69.27,71.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:75.58,77.49 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:80.2,81.25 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:84.2,84.12 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:77.49,79.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:81.25,83.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:89.71,91.16 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:94.2,94.33 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:102.2,103.16 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:106.2,107.16 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:110.2,110.18 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:91.16,93.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:94.33,98.43 4 1 -github.com/ethereum/go-ethereum/core/genesis.go:98.43,100.4 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:103.16,105.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:107.16,109.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:115.80,117.16 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:120.2,121.12 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:117.16,119.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:126.68,129.20 3 0 -github.com/ethereum/go-ethereum/core/genesis.go:158.2,159.12 2 0 -github.com/ethereum/go-ethereum/core/genesis.go:129.20,130.51 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:130.51,132.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:133.8,140.15 2 0 -github.com/ethereum/go-ethereum/core/genesis.go:152.3,152.21 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:141.34,142.35 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:143.34,144.42 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:145.34,146.42 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:147.33,148.41 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:149.34,150.42 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:152.21,154.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:154.9,156.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:196.56,198.20 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:201.2,202.56 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:206.2,206.12 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:198.20,200.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:202.56,205.3 2 0 -github.com/ethereum/go-ethereum/core/genesis.go:209.52,211.2 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:219.47,221.2 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:236.103,238.2 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:240.179,241.45 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:245.2,246.31 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:261.2,262.93 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:278.2,278.20 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:285.2,286.33 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:289.2,289.44 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:292.2,292.54 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:296.2,297.22 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:307.2,307.59 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:318.2,319.19 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:322.2,323.65 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:327.2,328.28 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:241.45,243.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:246.31,247.21 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:253.3,254.17 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:257.3,257.43 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:247.21,250.4 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:250.9,252.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:254.17,256.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:262.93,263.21 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:267.3,268.21 2 0 -github.com/ethereum/go-ethereum/core/genesis.go:271.3,272.17 2 0 -github.com/ethereum/go-ethereum/core/genesis.go:275.3,275.43 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:263.21,265.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:268.21,270.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:272.17,274.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:278.20,280.21 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:280.21,282.4 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:286.33,288.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:289.44,291.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:292.54,294.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:297.22,301.3 3 0 -github.com/ethereum/go-ethereum/core/genesis.go:307.59,309.34 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:312.3,312.45 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:309.34,311.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:312.45,314.4 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:319.19,321.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:323.65,325.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:331.74,332.9 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:333.16,334.18 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:335.42,336.35 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:337.42,338.35 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:339.42,340.35 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:341.42,342.35 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:343.41,344.34 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:345.41,346.34 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:347.45,348.38 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:349.39,350.42 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:351.10,352.41 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:358.59,359.15 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:362.2,363.16 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:366.2,380.21 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:383.2,383.57 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:386.2,386.55 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:393.2,393.68 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:359.15,361.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:363.16,364.13 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:380.21,382.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:383.57,385.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:386.55,387.23 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:387.23,389.4 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:389.9,391.4 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:398.67,400.32 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:403.2,404.19 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:407.2,407.54 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:410.2,410.53 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:413.2,413.56 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:416.2,424.19 9 1 -github.com/ethereum/go-ethereum/core/genesis.go:400.32,402.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:404.19,406.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:407.54,409.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:410.53,412.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:413.56,415.3 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:429.62,431.16 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:434.2,434.14 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:431.16,432.13 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:438.100,444.2 2 0 -github.com/ethereum/go-ethereum/core/genesis.go:447.37,456.2 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:459.44,468.2 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:471.44,480.2 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:483.43,492.2 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:495.43,506.2 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:509.47,520.2 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:523.44,533.2 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:535.41,538.58 3 0 -github.com/ethereum/go-ethereum/core/genesis.go:541.2,541.10 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:538.58,539.13 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:545.92,573.2 3 0 -github.com/ethereum/go-ethereum/core/genesis.go:575.47,577.77 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:580.2,581.28 2 1 -github.com/ethereum/go-ethereum/core/genesis.go:584.2,584.11 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:577.77,578.13 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:581.28,583.3 1 1 -github.com/ethereum/go-ethereum/core/genesis.go:587.49,589.16 2 0 -github.com/ethereum/go-ethereum/core/genesis.go:592.2,596.16 5 0 -github.com/ethereum/go-ethereum/core/genesis.go:599.2,599.11 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:589.16,590.87 1 0 -github.com/ethereum/go-ethereum/core/genesis.go:596.16,597.88 1 0 -github.com/ethereum/go-ethereum/core/forkchoice.go:59.99,62.16 2 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:65.2,69.3 1 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:62.16,64.3 1 0 -github.com/ethereum/go-ethereum/core/forkchoice.go:77.93,82.39 2 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:88.2,88.91 1 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:94.2,95.42 2 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:107.2,107.19 1 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:82.39,84.3 1 0 -github.com/ethereum/go-ethereum/core/forkchoice.go:88.91,90.3 1 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:95.42,97.26 2 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:97.26,99.4 1 0 -github.com/ethereum/go-ethereum/core/forkchoice.go:99.9,99.34 1 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:99.34,101.25 2 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:104.4,104.74 1 1 -github.com/ethereum/go-ethereum/core/forkchoice.go:101.25,103.5 1 0 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:39.111,45.2 1 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:50.114,60.42 3 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:80.2,80.15 1 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:60.42,62.60 1 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:66.3,67.17 2 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:70.3,71.91 2 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:75.3,75.17 1 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:62.60,64.4 1 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:67.17,69.4 1 0 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:71.91,73.4 1 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:75.17,77.4 1 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:80.15,82.3 1 1 -github.com/ethereum/go-ethereum/core/state_prefetcher.go:88.156,94.2 3 1 -github.com/ethereum/go-ethereum/core/state_transition.go:92.47,94.2 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:97.46,97.74 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:101.48,102.23 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:105.2,105.44 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:102.23,104.3 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:110.48,111.43 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:114.2,114.44 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:111.43,113.3 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:118.131,121.39 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:127.2,127.19 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:151.2,151.23 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:155.2,155.17 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:121.39,123.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:123.8,125.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:127.19,130.28 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:136.3,137.16 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:140.3,140.43 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:143.3,146.52 3 1 -github.com/ethereum/go-ethereum/core/state_transition.go:149.3,149.34 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:130.28,131.16 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:131.16,133.5 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:137.16,139.4 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:140.43,142.4 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:146.52,148.4 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:151.23,154.3 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:159.81,171.2 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:180.84,182.2 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:185.48,186.65 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:189.2,189.21 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:186.65,188.3 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:192.43,196.25 4 1 -github.com/ethereum/go-ethereum/core/state_transition.go:201.2,201.88 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:204.2,204.51 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:207.2,211.12 4 1 -github.com/ethereum/go-ethereum/core/state_transition.go:196.25,200.3 3 1 -github.com/ethereum/go-ethereum/core/state_transition.go:201.88,203.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:204.51,206.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:214.45,216.22 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:236.2,236.63 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:259.2,259.20 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:216.22,219.53 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:230.3,230.112 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:219.53,222.4 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:222.9,222.32 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:222.32,225.4 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:225.9,225.33 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:225.33,228.4 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:230.112,233.4 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:236.63,238.89 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:238.89,239.43 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:243.4,243.43 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:247.4,247.42 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:253.4,253.52 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:239.43,242.5 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:243.43,246.5 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:247.42,250.5 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:253.52,256.5 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:275.69,290.38 3 1 -github.com/ethereum/go-ethereum/core/state_transition.go:293.2,302.16 8 1 -github.com/ethereum/go-ethereum/core/state_transition.go:305.2,305.18 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:308.2,311.94 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:316.2,316.115 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:319.2,323.22 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:331.2,331.13 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:338.2,339.12 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:342.2,343.12 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:348.2,371.8 5 1 -github.com/ethereum/go-ethereum/core/state_transition.go:290.38,292.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:302.16,304.3 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:305.18,307.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:311.94,313.3 1 0 -github.com/ethereum/go-ethereum/core/state_transition.go:316.115,318.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:323.22,325.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:325.8,329.3 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:331.13,334.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:334.8,337.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:339.12,341.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:343.12,347.3 3 1 -github.com/ethereum/go-ethereum/core/state_transition.go:374.61,377.35 2 1 -github.com/ethereum/go-ethereum/core/state_transition.go:380.2,388.22 4 1 -github.com/ethereum/go-ethereum/core/state_transition.go:377.35,379.3 1 1 -github.com/ethereum/go-ethereum/core/state_transition.go:392.45,394.2 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:49.53,54.31 2 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:57.2,57.15 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:54.31,56.3 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:62.39,63.33 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:63.33,64.48 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:64.48,66.4 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:73.86,75.19 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:79.2,80.24 2 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:83.2,83.29 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:75.19,77.3 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:80.24,82.3 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:83.29,89.3 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:95.93,97.31 2 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:100.2,101.31 2 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:104.2,104.29 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:97.31,99.3 1 1 -github.com/ethereum/go-ethereum/core/tx_cacher.go:101.31,103.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:223.235,224.24 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:227.2,266.16 15 1 -github.com/ethereum/go-ethereum/core/blockchain.go:269.2,270.28 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:274.2,281.16 5 1 -github.com/ethereum/go-ethereum/core/blockchain.go:290.2,290.43 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:295.2,296.75 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:324.2,324.63 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:360.2,360.30 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:376.2,376.38 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:392.2,396.26 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:404.2,404.43 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:416.2,416.16 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:224.24,226.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:266.16,268.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:270.28,272.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:281.16,286.17 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:286.17,288.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:290.43,292.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:296.75,301.39 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:304.3,304.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:301.39,303.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:304.34,308.18 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:312.4,312.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:308.18,310.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:312.21,314.5 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:315.9,317.89 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:317.89,319.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:324.63,333.105 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:340.3,341.59 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:347.3,347.17 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:333.105,336.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:341.59,343.47 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:343.47,345.5 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:347.17,349.42 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:349.42,351.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:360.30,361.56 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:361.56,365.71 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:365.71,367.66 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:370.5,370.72 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:367.66,369.6 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:376.38,384.98 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:388.3,388.148 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:384.98,387.4 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:396.26,401.3 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:404.43,405.54 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:409.3,411.13 3 0 -github.com/ethereum/go-ethereum/core/blockchain.go:405.54,408.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:411.13,414.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:423.36,425.138 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:430.2,430.13 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:425.138,426.22 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:426.22,428.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:435.45,438.29 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:444.2,445.25 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:451.2,456.70 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:461.2,467.73 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:474.2,483.61 8 1 -github.com/ethereum/go-ethereum/core/blockchain.go:486.2,486.12 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:438.29,442.3 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:445.25,449.3 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:456.70,457.56 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:457.56,459.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:467.73,468.53 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:468.53,471.4 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:483.61,485.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:492.50,495.2 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:505.101,506.27 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:509.2,519.81 5 1 -github.com/ethereum/go-ethereum/core/blockchain.go:612.2,612.71 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:636.2,636.12 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:647.2,655.39 8 1 -github.com/ethereum/go-ethereum/core/blockchain.go:506.27,508.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:519.81,523.115 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:585.3,585.130 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:600.3,606.22 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:609.3,609.20 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:523.115,525.27 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:575.4,582.58 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:525.27,528.5 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:528.10,534.9 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:534.9,536.79 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:539.6,539.87 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:554.6,554.53 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:571.6,572.87 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:536.79,538.7 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:539.87,541.60 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:541.60,543.25 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:547.8,548.38 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:543.25,545.17 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:549.13,552.8 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:554.53,555.40 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:568.7,569.12 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:555.40,561.48 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:561.48,562.81 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:565.9,565.55 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:562.81,564.10 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:585.130,588.31 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:591.4,598.66 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:588.31,590.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:606.22,608.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:612.71,615.22 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:615.22,618.50 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:622.4,622.38 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:618.50,620.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:623.9,631.4 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:636.12,637.74 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:637.74,639.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:640.8,645.3 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:660.66,663.18 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:666.2,666.80 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:671.2,671.27 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:674.2,680.21 4 0 -github.com/ethereum/go-ethereum/core/blockchain.go:683.2,684.12 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:663.18,665.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:666.80,668.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:671.27,673.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:680.21,682.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:688.37,690.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:694.73,696.38 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:699.2,699.27 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:702.2,708.38 5 0 -github.com/ethereum/go-ethereum/core/blockchain.go:711.2,721.12 9 0 -github.com/ethereum/go-ethereum/core/blockchain.go:696.38,698.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:699.27,701.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:708.38,710.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:725.49,727.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:730.77,731.27 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:734.2,736.18 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:739.2,742.36 3 0 -github.com/ethereum/go-ethereum/core/blockchain.go:755.2,755.12 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:731.27,733.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:736.18,738.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:742.36,744.19 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:747.3,747.44 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:750.3,750.47 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:744.19,746.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:747.44,749.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:750.47,753.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:764.58,774.38 7 1 -github.com/ethereum/go-ethereum/core/blockchain.go:778.2,784.49 5 1 -github.com/ethereum/go-ethereum/core/blockchain.go:774.38,776.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:789.30,790.52 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:795.2,812.21 7 1 -github.com/ethereum/go-ethereum/core/blockchain.go:824.2,824.39 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:852.2,852.43 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:856.2,856.32 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:790.52,792.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:812.21,814.77 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:814.77,816.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:824.39,827.60 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:837.3,837.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:843.3,843.26 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:846.3,846.42 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:827.60,828.64 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:828.64,832.67 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:832.67,834.6 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:837.34,839.61 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:839.61,841.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:843.26,845.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:846.42,848.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:852.43,855.3 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:862.36,864.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:867.44,869.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:871.42,873.46 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:878.2,878.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:873.46,874.56 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:874.56,876.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:878.21,879.42 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:883.3,883.25 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:879.42,881.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:883.25,885.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:900.132,911.39 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:927.2,935.45 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:962.2,962.92 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1074.2,1074.89 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1129.2,1129.28 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1138.2,1138.72 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1150.2,1150.25 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1159.2,1165.23 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1168.2,1170.15 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:911.39,912.13 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:920.3,920.48 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:912.13,913.122 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:913.122,918.5 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:920.48,922.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:922.9,924.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:935.45,936.28 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:939.3,942.56 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:955.3,955.15 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:936.28,938.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:942.56,944.18 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:950.4,953.15 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:944.18,947.5 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:947.10,947.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:947.21,949.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:962.92,967.29 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:983.3,983.51 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:988.3,989.36 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:994.3,997.17 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1013.3,1014.36 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1036.3,1036.38 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1040.3,1041.49 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1051.3,1053.36 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1062.3,1062.93 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1067.3,1067.39 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1070.3,1070.16 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:967.29,968.50 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:968.50,973.19 5 1 -github.com/ethereum/go-ethereum/core/blockchain.go:977.5,977.42 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:973.19,976.6 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:983.51,985.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:989.36,991.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:997.17,1000.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1014.36,1015.119 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1020.4,1022.74 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1015.119,1017.5 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1017.10,1017.50 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1017.50,1019.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1022.74,1024.40 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1031.5,1031.18 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1024.40,1026.62 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1029.6,1029.19 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1026.62,1028.7 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1036.38,1038.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1041.49,1044.68 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1047.4,1047.34 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1044.68,1046.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1053.36,1055.30 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1058.4,1059.74 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1055.30,1056.13 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1062.93,1063.48 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1063.48,1065.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1067.39,1069.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1074.89,1077.36 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1118.3,1118.28 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1124.3,1125.16 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1077.36,1079.26 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1083.4,1083.54 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1086.4,1086.26 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1099.4,1106.49 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1113.4,1113.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1079.26,1081.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1083.54,1085.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1086.26,1088.53 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1088.53,1090.14 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1091.11,1096.6 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1106.49,1107.41 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1110.5,1111.18 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1107.41,1109.6 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1118.28,1120.40 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1120.40,1122.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1129.28,1130.73 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1130.73,1131.38 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1134.4,1134.17 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1131.38,1133.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1138.72,1142.56 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1142.56,1143.65 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1143.65,1145.5 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1145.10,1147.5 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1150.25,1151.64 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1151.64,1152.38 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1155.4,1155.17 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1152.38,1154.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1165.23,1167.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1178.91,1179.24 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1183.2,1186.38 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1189.2,1189.12 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1179.24,1181.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1186.38,1188.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1194.65,1196.42 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1201.2,1202.12 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1196.42,1197.50 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1197.50,1199.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1207.153,1210.16 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1214.2,1235.24 8 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1258.2,1259.43 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1263.2,1264.16 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1267.2,1270.38 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1319.2,1319.27 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1210.16,1212.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1235.24,1236.51 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1240.3,1240.33 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1236.51,1238.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1240.33,1255.4 4 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1259.43,1261.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1264.16,1266.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1270.38,1272.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1272.8,1277.60 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1277.60,1283.43 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1287.4,1290.48 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1309.4,1309.27 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1283.43,1285.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1290.48,1294.22 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1294.22,1296.6 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1296.11,1299.89 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1303.6,1305.19 3 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1299.89,1301.7 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1309.27,1311.33 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1315.5,1315.43 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1311.33,1313.11 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1323.184,1324.27 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1327.2,1329.77 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1324.27,1326.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1335.184,1337.91 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1340.2,1342.16 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1345.2,1345.11 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1357.2,1357.27 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1360.2,1362.27 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1394.2,1394.20 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1337.91,1339.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1342.16,1344.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1345.11,1347.48 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1352.3,1352.23 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1347.48,1348.56 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1348.56,1350.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1353.8,1355.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1357.27,1359.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1362.27,1364.20 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1369.3,1369.29 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1378.3,1378.20 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1364.20,1366.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1369.29,1371.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1378.20,1381.42 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1381.42,1383.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1386.8,1393.3 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1403.64,1405.24 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1408.2,1408.46 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1412.2,1413.12 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1405.24,1407.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1408.46,1411.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1420.68,1422.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1425.2,1429.34 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1444.2,1444.27 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1447.2,1448.42 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1422.21,1424.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1429.34,1431.83 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1431.83,1441.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1444.27,1446.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1459.95,1461.24 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1466.2,1473.15 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1479.2,1482.30 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1486.2,1494.27 5 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1543.2,1543.9 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1580.2,1581.15 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1592.2,1594.22 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1607.2,1607.92 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1801.2,1805.62 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1818.2,1820.22 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1461.24,1463.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1473.15,1474.71 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1474.71,1476.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1482.30,1485.3 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1494.27,1504.45 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1532.3,1532.45 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1504.45,1506.18 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1509.4,1509.13 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1519.4,1522.26 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1506.18,1508.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1509.13,1515.106 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1515.106,1516.11 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1532.45,1534.52 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1537.4,1539.26 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1534.52,1536.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1545.51,1546.14 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1556.151,1557.87 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1564.3,1568.23 3 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1573.52,1577.23 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1546.14,1550.4 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1550.9,1554.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1557.87,1559.51 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1562.4,1562.26 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1559.51,1561.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1581.15,1586.25 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1586.25,1588.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1594.22,1596.28 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1600.3,1604.30 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1596.28,1599.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1607.92,1609.25 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1614.3,1614.30 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1624.3,1624.28 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1659.3,1661.20 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1664.3,1665.17 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1670.3,1676.42 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1692.3,1694.17 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1700.3,1700.41 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1706.3,1720.87 12 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1725.3,1735.15 7 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1741.3,1742.17 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1746.3,1760.15 10 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1765.3,1765.28 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1772.3,1772.17 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1609.25,1611.9 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1614.30,1617.4 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1624.28,1626.36 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1629.4,1641.38 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1647.4,1647.52 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1650.4,1655.12 3 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1626.36,1628.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1641.38,1643.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1643.10,1646.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1647.52,1649.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1661.20,1663.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1665.17,1667.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1676.42,1677.65 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1677.65,1680.98 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1680.98,1684.43 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1684.43,1686.7 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1694.17,1698.4 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1700.41,1702.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1720.87,1724.4 3 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1735.15,1738.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1738.9,1740.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1742.17,1744.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1760.15,1762.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1765.28,1767.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1767.9,1769.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1773.20,1782.25 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1784.19,1788.26 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1790.11,1796.26 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1805.62,1806.50 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1809.3,1811.94 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1806.50,1808.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1811.94,1812.51 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1815.4,1815.18 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1812.51,1814.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1830.92,1841.92 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1893.2,1894.16 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1897.2,1897.12 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1903.2,1908.49 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1914.2,1914.19 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1918.2,1922.40 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1946.2,1946.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1950.2,1950.15 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1841.92,1843.65 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1870.3,1870.22 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1873.3,1875.52 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1885.3,1885.20 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1843.65,1845.60 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1854.4,1854.60 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1845.60,1852.13 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1854.60,1868.5 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1870.22,1872.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1875.52,1877.69 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1880.4,1883.26 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1877.69,1879.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1894.16,1896.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1897.12,1901.3 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1908.49,1913.3 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1914.19,1916.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1922.40,1932.51 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1932.51,1934.65 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1937.4,1940.26 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1934.65,1936.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1940.26,1943.5 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1946.21,1949.3 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:1956.66,1963.51 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1974.2,1974.19 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1978.2,1978.40 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1994.2,1994.12 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1963.51,1969.25 4 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1969.25,1972.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1974.19,1976.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1978.40,1980.25 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1984.3,1985.13 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1990.3,1990.74 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1980.25,1983.4 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1985.13,1987.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1987.9,1989.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:1990.74,1992.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2000.80,2002.19 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2005.2,2009.23 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2013.2,2014.35 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2023.2,2023.13 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2002.19,2004.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2009.23,2011.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2014.35,2015.36 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2015.36,2017.15 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2020.4,2020.27 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2017.15,2019.5 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2027.64,2029.13 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2038.2,2038.12 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2029.13,2030.39 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2030.39,2032.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2033.8,2034.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2034.34,2036.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2046.68,2059.49 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2077.2,2077.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2080.2,2080.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2085.2,2085.6 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2113.2,2113.44 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2144.2,2144.42 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2158.2,2159.62 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2163.2,2164.29 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2171.2,2171.45 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2178.2,2178.26 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2181.2,2181.26 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2184.2,2184.23 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2189.2,2189.12 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2059.49,2061.144 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2061.144,2067.21 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2067.21,2069.5 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2071.8,2073.144 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2073.144,2075.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2077.21,2079.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2080.21,2082.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2085.6,2087.41 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2092.3,2097.20 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2100.3,2104.22 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2107.3,2108.22 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2087.41,2089.9 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2097.20,2099.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2104.22,2106.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2108.22,2110.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2113.44,2123.25 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2127.3,2131.26 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2123.25,2126.4 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2132.8,2132.30 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2132.30,2137.3 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2137.8,2141.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2144.42,2150.20 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2154.3,2154.61 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2150.20,2152.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2159.62,2161.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2164.29,2166.30 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2169.3,2169.45 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2166.30,2167.9 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2171.45,2173.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2178.26,2180.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2181.26,2183.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2184.23,2185.43 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2185.43,2187.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2197.75,2198.27 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2201.2,2204.12 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2198.27,2200.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2211.61,2212.27 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2215.2,2219.51 3 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2224.2,2229.19 4 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2232.2,2240.88 3 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2243.2,2244.12 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2212.27,2214.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2219.51,2220.59 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2220.59,2222.4 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2229.19,2231.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2240.88,2242.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2247.44,2251.6 4 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2251.6,2252.10 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2253.24,2254.25 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2255.18,2256.10 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2263.69,2267.36 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2272.2,2272.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2275.2,2280.43 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2287.2,2287.44 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2292.2,2292.35 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2296.2,2296.42 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2299.2,2299.14 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2267.36,2269.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2272.21,2274.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2280.43,2282.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2287.44,2289.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2289.8,2289.74 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2289.74,2291.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2292.35,2294.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2296.42,2298.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2312.56,2319.18 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2328.2,2328.69 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2368.2,2373.16 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2376.2,2378.6 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2319.18,2321.59 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2324.3,2324.58 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2321.59,2323.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2328.69,2329.16 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2333.3,2333.18 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2344.3,2344.55 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2358.3,2358.38 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2329.16,2329.38 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2333.18,2334.56 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2341.4,2341.10 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2334.56,2337.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2337.10,2340.5 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2344.55,2345.17 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2355.4,2355.10 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2345.17,2350.21 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2353.5,2353.52 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2350.21,2352.6 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2358.38,2361.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2361.9,2364.4 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2373.16,2375.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2378.6,2379.10 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2380.25,2381.19 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2385.15,2386.14 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2387.18,2388.19 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2392.4,2392.10 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2381.19,2384.5 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2388.19,2391.5 2 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2398.91,2402.35 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2407.2,2417.70 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2402.35,2406.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2428.92,2429.21 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2432.2,2433.71 2 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2437.2,2437.27 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2440.2,2442.15 3 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2429.21,2431.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain.go:2433.71,2435.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain.go:2437.27,2439.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:36.53,38.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:42.51,44.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:48.55,50.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:54.71,56.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:60.80,62.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:66.71,68.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:72.70,74.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:78.75,80.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:84.61,86.46 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:90.2,91.19 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:94.2,95.17 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:99.2,100.13 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:86.46,89.3 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:91.19,93.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:95.17,97.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:105.65,107.49 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:110.2,111.19 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:114.2,115.20 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:119.2,120.13 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:107.49,109.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:111.19,113.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:115.20,117.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:124.70,125.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:128.2,128.43 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:125.34,127.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:132.74,133.32 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:136.2,136.37 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:139.2,139.47 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:133.32,135.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:136.37,138.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:144.78,146.46 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:149.2,150.18 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:154.2,155.14 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:146.46,148.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:150.18,152.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:159.69,161.19 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:164.2,164.35 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:161.19,163.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:169.68,171.29 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:174.2,174.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:171.29,173.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:179.90,181.19 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:184.2,184.25 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:193.2,193.8 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:181.19,183.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:184.25,186.19 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:189.3,191.12 3 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:186.19,187.9 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:197.74,198.52 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:201.2,202.19 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:205.2,206.21 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:209.2,210.17 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:198.52,200.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:202.19,204.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:206.21,208.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:215.88,217.46 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:221.2,221.15 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:217.46,220.3 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:225.67,227.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:234.125,236.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:240.89,242.56 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:245.2,246.15 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:249.2,251.15 3 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:242.56,244.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:246.15,248.3 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:256.71,258.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:261.55,264.2 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:268.78,271.18 2 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:274.2,274.34 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:271.18,273.3 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:279.66,281.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:285.70,287.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:294.80,299.2 2 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:302.55,304.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:307.73,309.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:312.52,312.77 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:315.49,315.69 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:318.50,320.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:323.45,325.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:328.45,330.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:333.51,335.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:338.41,340.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:343.46,345.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:348.48,350.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:354.54,356.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:360.46,362.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:365.96,367.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:370.84,372.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:375.92,377.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:380.94,382.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:385.92,387.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:390.85,392.2 1 1 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:396.88,398.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:405.70,407.2 1 0 -github.com/ethereum/go-ethereum/core/blockchain_reader.go:410.92,412.2 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:53.53,54.22 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:60.2,61.52 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:54.22,55.21 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:58.3,58.41 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:55.21,56.60 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:65.42,67.2 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:70.53,72.2 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:77.49,79.2 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:89.49,91.2 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:101.74,102.22 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:105.2,107.16 3 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:110.2,111.42 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:102.22,104.3 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:107.16,108.13 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:115.61,117.2 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:124.58,126.2 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:129.38,131.2 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:134.39,136.2 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:143.64,145.2 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:149.56,150.28 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:153.2,153.33 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:150.28,151.34 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:157.46,162.32 3 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:168.2,173.33 4 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:180.2,180.32 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:162.32,163.40 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:163.40,165.9 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:173.33,175.40 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:175.40,178.4 2 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:186.54,187.18 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:190.2,190.17 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:193.2,193.23 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:187.18,188.75 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:190.17,192.3 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:199.46,201.45 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:204.2,205.94 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:201.45,202.35 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:220.181,221.19 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:224.2,226.102 3 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:274.2,274.25 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:284.2,284.25 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:221.19,223.3 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:226.102,233.33 3 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:243.3,243.55 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:251.3,251.107 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:255.3,255.17 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:258.3,258.22 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:272.3,272.18 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:233.33,234.45 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:234.45,237.5 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:237.10,240.5 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:243.55,245.76 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:245.76,246.30 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:246.30,248.6 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:251.107,253.4 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:255.17,257.4 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:258.22,264.18 3 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:267.4,267.79 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:270.4,270.28 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:264.18,265.53 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:267.79,268.52 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:274.25,276.17 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:279.3,282.17 4 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:276.17,277.14 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:287.128,289.24 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:294.2,308.44 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:315.2,315.15 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:289.24,291.3 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:291.8,293.3 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:308.44,310.48 2 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:310.48,313.4 2 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:319.121,322.31 3 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:325.2,325.16 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:322.31,324.3 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:329.118,330.101 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:333.2,333.15 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:330.101,332.3 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:341.57,343.2 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:345.85,345.99 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:346.85,346.99 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:347.85,347.99 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:348.85,348.99 1 1 -github.com/ethereum/go-ethereum/core/chain_makers.go:349.85,349.99 1 0 -github.com/ethereum/go-ethereum/core/chain_makers.go:350.85,350.99 1 1 -github.com/ethereum/go-ethereum/core/gen_genesis.go:19.48,44.20 11 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:50.2,54.27 5 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:44.20,46.29 2 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:46.29,48.4 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:58.53,75.52 3 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:78.2,78.23 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:81.2,81.22 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:84.2,84.26 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:87.2,87.26 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:90.2,90.25 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:93.2,94.27 2 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:97.2,98.24 2 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:101.2,101.25 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:104.2,104.22 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:107.2,108.30 2 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:111.2,111.23 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:114.2,114.24 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:117.2,117.27 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:120.2,120.24 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:123.2,123.12 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:75.52,77.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:78.23,80.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:81.22,83.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:84.26,86.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:87.26,89.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:90.25,92.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:94.27,96.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:98.24,100.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:101.25,103.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:104.22,106.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:108.30,110.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:111.23,113.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:114.24,116.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:117.27,119.3 1 0 -github.com/ethereum/go-ethereum/core/gen_genesis.go:120.24,122.3 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:40.117,47.2 2 1 -github.com/ethereum/go-ethereum/core/block_validator.go:52.65,54.60 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:58.2,59.59 2 1 -github.com/ethereum/go-ethereum/core/block_validator.go:62.2,62.75 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:65.2,65.98 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:68.2,68.69 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:74.2,74.12 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:54.60,56.3 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:59.59,61.3 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:62.75,64.3 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:65.98,67.3 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:68.69,69.62 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:72.3,72.37 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:69.62,71.4 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:81.131,83.32 2 1 -github.com/ethereum/go-ethereum/core/block_validator.go:88.2,89.28 2 1 -github.com/ethereum/go-ethereum/core/block_validator.go:93.2,94.38 2 1 -github.com/ethereum/go-ethereum/core/block_validator.go:99.2,99.93 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:102.2,102.12 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:83.32,85.3 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:89.28,91.3 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:94.38,96.3 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:99.93,101.3 1 0 -github.com/ethereum/go-ethereum/core/block_validator.go:108.63,111.39 3 1 -github.com/ethereum/go-ethereum/core/block_validator.go:115.2,115.26 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:122.2,122.26 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:128.2,128.14 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:111.39,113.3 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:115.26,117.27 2 1 -github.com/ethereum/go-ethereum/core/block_validator.go:120.3,120.15 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:117.27,119.4 1 1 -github.com/ethereum/go-ethereum/core/block_validator.go:122.26,124.27 2 1 -github.com/ethereum/go-ethereum/core/block_validator.go:124.27,126.4 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:103.177,122.2 5 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:130.73,135.69 3 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:138.2,142.33 4 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:135.69,137.3 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:148.55,153.2 3 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:157.38,165.31 5 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:169.2,169.39 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:176.2,176.35 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:182.2,182.9 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:165.31,167.3 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:169.39,171.32 2 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:171.32,173.4 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:176.35,177.39 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:177.39,179.4 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:183.22,184.13 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:186.22,187.17 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:189.10,190.32 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:197.115,210.6 5 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:210.6,211.10 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:212.25,215.10 2 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:217.27,219.11 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:224.4,225.37 2 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:235.4,237.48 2 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:219.11,223.5 3 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:225.37,229.83 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:229.83,230.80 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:230.80,232.7 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:243.57,248.11 3 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:277.2,278.27 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:248.11,252.35 3 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:255.3,255.36 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:258.3,258.30 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:262.3,262.32 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:266.3,268.28 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:274.3,274.9 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:252.35,254.4 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:255.36,257.4 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:258.30,260.4 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:262.32,264.4 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:268.28,270.37 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:270.37,272.5 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:278.27,280.38 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:283.3,283.33 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:280.38,282.4 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:283.33,284.46 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:292.4,294.11 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:284.46,287.39 2 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:287.39,290.6 2 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:295.32,295.32 0 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:296.12,296.12 0 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:304.37,310.6 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:310.6,311.10 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:312.25,315.10 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:317.19,320.42 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:371.4,371.42 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:379.4,379.19 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:320.42,322.44 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:330.5,333.20 4 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:337.5,339.19 3 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:348.5,351.76 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:322.44,323.46 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:327.6,327.26 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:323.46,326.7 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:333.20,335.6 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:339.19,340.13 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:346.6,346.60 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:341.26,343.13 2 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:344.14,344.14 0 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:351.76,354.57 3 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:358.6,359.39 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:354.57,357.7 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:359.39,362.7 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:363.11,368.6 3 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:371.42,372.41 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:372.41,373.13 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:374.34,374.34 0 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:375.14,375.14 0 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:388.98,392.66 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:397.2,397.86 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:413.2,413.43 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:416.2,416.22 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:392.66,395.3 2 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:397.86,399.30 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:402.3,403.20 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:408.3,408.58 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:411.3,411.27 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:399.30,401.4 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:403.20,405.4 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:405.9,405.43 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:405.43,407.4 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:408.58,410.4 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:413.43,415.3 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:422.41,423.70 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:423.70,424.112 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:427.3,427.43 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:424.112,426.4 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:434.65,440.2 4 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:443.63,444.18 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:447.2,454.32 5 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:459.2,459.18 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:444.18,445.50 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:454.32,458.3 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:459.18,461.3 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:465.54,467.2 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:471.44,473.20 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:473.20,475.3 1 0 -github.com/ethereum/go-ethereum/core/chain_indexer.go:479.58,486.34 4 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:490.2,490.29 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:486.34,489.3 2 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:495.64,500.37 4 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:503.2,503.22 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:500.37,502.3 1 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:508.73,513.2 3 1 -github.com/ethereum/go-ethereum/core/chain_indexer.go:517.58,522.2 3 1 From 208133b6dac1b406359cb2b265442cb3b20fceca Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 3 Jun 2022 14:15:56 +0300 Subject: [PATCH 125/190] fix --- eth/backend.go | 7 +++++++ tests/bor/bor_test.go | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/eth/backend.go b/eth/backend.go index bd941a6b11..fcba1c573b 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -598,6 +598,13 @@ func (s *Ethereum) Start() error { // StartCheckpointWhitelistService starts the goroutine to fetch checkpoints and update the // checkpoint whitelist map. func (s *Ethereum) startCheckpointWhitelistService() { + // a shortcut helps with tests and early exit + select { + case <-s.closeCh: + return + default: + } + // first run the checkpoint whitelist err := s.handleWhitelistCheckpoint() if err != nil { diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index 7768b0fc9c..2d05baa490 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -37,10 +37,18 @@ func TestInsertingSpanSizeBlocks(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer engine.Close() + h, heimdallSpan, ctrl := getMockedHeimdallClient(t) defer ctrl.Finish() - h.EXPECT().FetchLatestCheckpoint().Return(&bor.Checkpoint{}, nil).AnyTimes() + _, span := loadSpanFromFile(t) + + h.EXPECT().FetchLatestCheckpoint().Return(&bor.Checkpoint{ + Proposer: span.SelectedProducers[0].Address, + StartBlock: big.NewInt(0), + EndBlock: big.NewInt(int64(spanSize)), + }, nil).Times(1) _bor.SetHeimdallClient(h) From f8a56b81883ca3211b4daf8ee536843ab7e30ef5 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 3 Jun 2022 14:30:58 +0300 Subject: [PATCH 126/190] fix close --- tests/bor/bor_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index 2d05baa490..fdfa2d29c8 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -44,6 +44,7 @@ func TestInsertingSpanSizeBlocks(t *testing.T) { _, span := loadSpanFromFile(t) + h.EXPECT().Close().AnyTimes() h.EXPECT().FetchLatestCheckpoint().Return(&bor.Checkpoint{ Proposer: span.SelectedProducers[0].Address, StartBlock: big.NewInt(0), @@ -80,6 +81,8 @@ func TestFetchStateSyncEvents(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer engine.Close() + // A. Insert blocks for 0th sprint db := init.ethereum.ChainDb() block := init.genesis.ToBlock(db) @@ -97,6 +100,7 @@ func TestFetchStateSyncEvents(t *testing.T) { defer ctrl.Finish() h := mocks.NewMockIHeimdallClient(ctrl) + h.EXPECT().Close().AnyTimes() // B.2 Mock State Sync events fromID := uint64(1) @@ -123,6 +127,8 @@ func TestFetchStateSyncEvents_2(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer _bor.Close() + // Mock /bor/span/1 res, _ := loadSpanFromFile(t) @@ -130,6 +136,7 @@ func TestFetchStateSyncEvents_2(t *testing.T) { defer ctrl.Finish() h := mocks.NewMockIHeimdallClient(ctrl) + h.EXPECT().Close().AnyTimes() h.EXPECT().FetchWithRetry(spanPath, "").Return(res, nil).AnyTimes() // Mock State Sync events @@ -190,9 +197,12 @@ func TestOutOfTurnSigning(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer _bor.Close() + h, _, ctrl := getMockedHeimdallClient(t) defer ctrl.Finish() + h.EXPECT().Close().AnyTimes() _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -243,9 +253,13 @@ func TestSignerNotFound(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer _bor.Close() + h, _, ctrl := getMockedHeimdallClient(t) defer ctrl.Finish() + h.EXPECT().Close().AnyTimes() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() From b4872cacc4ce3f6052255ac2c6d02258541a2684 Mon Sep 17 00:00:00 2001 From: Evgeny Danienko <6655321@bk.ru> Date: Fri, 3 Jun 2022 14:31:41 +0300 Subject: [PATCH 127/190] fix --- tests/bor/bor_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index fdfa2d29c8..a179616290 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -49,7 +49,7 @@ func TestInsertingSpanSizeBlocks(t *testing.T) { Proposer: span.SelectedProducers[0].Address, StartBlock: big.NewInt(0), EndBlock: big.NewInt(int64(spanSize)), - }, nil).Times(1) + }, nil).AnyTimes() _bor.SetHeimdallClient(h) From 0d2b1d0630ab81e9646c84d9f0a95b38e7feb1de Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Mon, 6 Jun 2022 14:54:05 +0530 Subject: [PATCH 128/190] internal/cli: add block tracing (#397) * bad block tracing * Add debug env framework * add implementation of custom block tracing * add few comments * use tar name fn * wip: add unit tests for block tracing * complete test for block tracer * fix: close grpc server * refactor cli tests * fix: change condition for parsing args * Fix port binding for test server * add helper for creating and closing mock server for tests * consume mock server in tests * fixes due to geth merge * fix: handle port selection for http server * update help and markdown for debug command * update docs * update debug synopsis * fix: use chunked encoder to handle large data over grpc * fix prints * lint * rm unused function, rename fn to TraceBorBlock Co-authored-by: Ferran Borreguero --- docs/cli/README.md | 4 + docs/cli/debug.md | 8 +- docs/cli/debug_block.md | 9 + docs/cli/debug_pprof.md | 11 + eth/tracers/api_bor.go | 143 +++ internal/cli/command.go | 10 + internal/cli/debug.go | 232 ++--- internal/cli/debug_block.go | 126 +++ internal/cli/debug_pprof.go | 159 ++++ internal/cli/debug_test.go | 112 +++ internal/cli/server/helper.go | 72 ++ internal/cli/server/proto/server.pb.go | 954 ++++++++++++-------- internal/cli/server/proto/server.proto | 25 +- internal/cli/server/proto/server_grpc.pb.go | 193 ++-- internal/cli/server/server.go | 14 + internal/cli/server/server_test.go | 35 +- internal/cli/server/service.go | 96 +- 17 files changed, 1560 insertions(+), 643 deletions(-) create mode 100644 docs/cli/debug_block.md create mode 100644 docs/cli/debug_pprof.md create mode 100644 eth/tracers/api_bor.go create mode 100644 internal/cli/debug_block.go create mode 100644 internal/cli/debug_pprof.go create mode 100644 internal/cli/debug_test.go create mode 100644 internal/cli/server/helper.go diff --git a/docs/cli/README.md b/docs/cli/README.md index d5648dca7d..d92a7b5a05 100644 --- a/docs/cli/README.md +++ b/docs/cli/README.md @@ -22,6 +22,10 @@ - [```debug```](./debug.md) +- [```debug block```](./debug_block.md) + +- [```debug pprof```](./debug_pprof.md) + - [```fingerprint```](./fingerprint.md) - [```peers```](./peers.md) diff --git a/docs/cli/debug.md b/docs/cli/debug.md index eecc6c6ef0..a59e465745 100644 --- a/docs/cli/debug.md +++ b/docs/cli/debug.md @@ -2,13 +2,9 @@ The ```bor debug``` command takes a debug dump of the running client. -## Options +- [```bor debug pprof```](./debug_pprof.md): Dumps bor pprof traces. -- ```address```: Address of the grpc endpoint - -- ```seconds```: seconds to trace - -- ```output```: Output directory +- [```bor debug block ```](./debug_block.md): Dumps bor block traces. ## Examples diff --git a/docs/cli/debug_block.md b/docs/cli/debug_block.md new file mode 100644 index 0000000000..ced7e482ee --- /dev/null +++ b/docs/cli/debug_block.md @@ -0,0 +1,9 @@ +# Debug trace + +The ```bor debug block ``` command will create an archive containing traces of a bor block. + +## Options + +- ```address```: Address of the grpc endpoint + +- ```output```: Output directory \ No newline at end of file diff --git a/docs/cli/debug_pprof.md b/docs/cli/debug_pprof.md new file mode 100644 index 0000000000..86a84b6065 --- /dev/null +++ b/docs/cli/debug_pprof.md @@ -0,0 +1,11 @@ +# Debug Pprof + +The ```debug pprof ``` command will create an archive containing bor pprof traces. + +## Options + +- ```address```: Address of the grpc endpoint + +- ```seconds```: seconds to trace + +- ```output```: Output directory \ No newline at end of file diff --git a/eth/tracers/api_bor.go b/eth/tracers/api_bor.go new file mode 100644 index 0000000000..7f5e2c34d6 --- /dev/null +++ b/eth/tracers/api_bor.go @@ -0,0 +1,143 @@ +package tracers + +import ( + "context" + "fmt" + + "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/eth/tracers/logger" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" +) + +type BlockTraceResult struct { + // Trace of each transaction executed + Transactions []*TxTraceResult `json:"transactions,omitempty"` + + // Block that we are executing on the trace + Block interface{} `json:"block"` +} + +type TxTraceResult struct { + // Trace results produced by the tracer + Result interface{} `json:"result,omitempty"` + + // Trace failure produced by the tracer + Error string `json:"error,omitempty"` + + // IntermediateHash of the execution if succeeds + IntermediateHash common.Hash `json:"intermediatehash"` +} + +func (api *API) traceBorBlock(ctx context.Context, block *types.Block, config *TraceConfig) (*BlockTraceResult, error) { + if block.NumberU64() == 0 { + return nil, fmt.Errorf("genesis is not traceable") + } + + res := &BlockTraceResult{ + Block: block, + } + + // block object cannot be converted to JSON since much of the fields are non-public + blockFields, err := ethapi.RPCMarshalBlock(block, true, true, api.backend.ChainConfig()) + if err != nil { + return nil, err + } + res.Block = blockFields + + parent, err := api.blockByNumberAndHash(ctx, rpc.BlockNumber(block.NumberU64()-1), block.ParentHash()) + if err != nil { + return nil, err + } + reexec := defaultTraceReexec + if config != nil && config.Reexec != nil { + reexec = *config.Reexec + } + // TODO: discuss consequences of setting preferDisk false. + statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true, false) + if err != nil { + return nil, err + } + + // Execute all the transaction contained within the block concurrently + var ( + signer = types.MakeSigner(api.backend.ChainConfig(), block.Number()) + txs = block.Transactions() + deleteEmptyObjects = api.backend.ChainConfig().IsEIP158(block.Number()) + ) + + blockCtx := core.NewEVMBlockContext(block.Header(), api.chainContext(ctx), nil) + + traceTxn := func(indx int, tx *types.Transaction) *TxTraceResult { + message, _ := tx.AsMessage(signer, block.BaseFee()) + txContext := core.NewEVMTxContext(message) + + tracer := logger.NewStructLogger(config.Config) + + // Run the transaction with tracing enabled. + vmenv := vm.NewEVM(blockCtx, txContext, statedb, api.backend.ChainConfig(), vm.Config{Debug: true, Tracer: tracer, NoBaseFee: true}) + + // Call Prepare to clear out the statedb access list + // Not sure if we need to do this + statedb.Prepare(tx.Hash(), indx) + + execRes, err := core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) + if err != nil { + return &TxTraceResult{ + Error: err.Error(), + } + } + + returnVal := fmt.Sprintf("%x", execRes.Return()) + if len(execRes.Revert()) > 0 { + returnVal = fmt.Sprintf("%x", execRes.Revert()) + } + result := ðapi.ExecutionResult{ + Gas: execRes.UsedGas, + Failed: execRes.Failed(), + ReturnValue: returnVal, + StructLogs: ethapi.FormatLogs(tracer.StructLogs()), + } + res := &TxTraceResult{ + Result: result, + IntermediateHash: statedb.IntermediateRoot(deleteEmptyObjects), + } + return res + } + + for indx, tx := range txs { + res.Transactions = append(res.Transactions, traceTxn(indx, tx)) + } + return res, nil +} + +type TraceBlockRequest struct { + Number int64 + Hash string + IsBadBlock bool + Config *TraceConfig +} + +// If you use context as first parameter this function gets exposed automaticall on rpc endpoint +func (api *API) TraceBorBlock(req *TraceBlockRequest) (*BlockTraceResult, error) { + ctx := context.Background() + + var blockNumber rpc.BlockNumber + if req.Number == -1 { + blockNumber = rpc.LatestBlockNumber + } else { + blockNumber = rpc.BlockNumber(req.Number) + } + + log.Debug("Tracing Bor Block", "block number", blockNumber) + + block, err := api.blockByNumber(ctx, blockNumber) + if err != nil { + return nil, err + } + return api.traceBorBlock(ctx, block, req.Config) +} diff --git a/internal/cli/command.go b/internal/cli/command.go index 34f7c4ef12..1ff95b410f 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -84,6 +84,16 @@ func Commands() map[string]MarkDownCommandFactory { }, "debug": func() (MarkDownCommand, error) { return &DebugCommand{ + UI: ui, + }, nil + }, + "debug pprof": func() (MarkDownCommand, error) { + return &DebugPprofCommand{ + Meta2: meta2, + }, nil + }, + "debug block": func() (MarkDownCommand, error) { + return &DebugBlockCommand{ Meta2: meta2, }, nil }, diff --git a/internal/cli/debug.go b/internal/cli/debug.go index fb998ee4b9..6e083a6974 100644 --- a/internal/cli/debug.go +++ b/internal/cli/debug.go @@ -1,11 +1,8 @@ package cli -// Based on https://github.com/hashicorp/nomad/blob/main/command/operator_debug.go - import ( "archive/tar" "compress/gzip" - "context" "fmt" "io" "io/ioutil" @@ -16,20 +13,20 @@ import ( "syscall" "time" - "github.com/ethereum/go-ethereum/internal/cli/flagset" + "github.com/mitchellh/cli" + "github.com/ethereum/go-ethereum/internal/cli/server/proto" "github.com/golang/protobuf/jsonpb" // nolint:staticcheck gproto "github.com/golang/protobuf/proto" // nolint:staticcheck - "github.com/golang/protobuf/ptypes/empty" grpc_net_conn "github.com/mitchellh/go-grpc-net-conn" + "google.golang.org/grpc" + "google.golang.org/protobuf/runtime/protoiface" ) +// DebugCommand is the command to group the peers commands type DebugCommand struct { - *Meta2 - - seconds uint64 - output string + UI cli.Ui } // MarkDown implements cli.MarkDown interface @@ -53,7 +50,8 @@ func (d *DebugCommand) MarkDown() string { items := []string{ "# Debug", "The ```bor debug``` command takes a debug dump of the running client.", - d.Flags().MarkDown(), + "- [```bor debug pprof```](./debug_pprof.md): Dumps bor pprof traces.", + "- [```bor debug block ```](./debug_block.md): Dumps bor block traces.", } items = append(items, examples...) @@ -61,185 +59,141 @@ func (d *DebugCommand) MarkDown() string { } // Help implements the cli.Command interface -func (d *DebugCommand) Help() string { - return `Usage: bor debug +func (c *DebugCommand) Help() string { + return `Usage: bor debug - Build an archive containing Bor pprof traces + This command takes a debug dump of the running client. + + Get the pprof traces: - ` + d.Flags().Help() -} + $ bor debug pprof -func (d *DebugCommand) Flags() *flagset.Flagset { - flags := d.NewFlagSet("debug") + Get the block traces: - flags.Uint64Flag(&flagset.Uint64Flag{ - Name: "seconds", - Usage: "seconds to trace", - Value: &d.seconds, - Default: 2, - }) - flags.StringFlag(&flagset.StringFlag{ - Name: "output", - Value: &d.output, - Usage: "Output directory", - }) - - return flags + $ bor debug block ` } // Synopsis implements the cli.Command interface -func (d *DebugCommand) Synopsis() string { - return "Build an archive containing Bor pprof traces" +func (c *DebugCommand) Synopsis() string { + return "Get traces of the running client" } // Run implements the cli.Command interface -func (d *DebugCommand) Run(args []string) int { - flags := d.Flags() - if err := flags.Parse(args); err != nil { - d.UI.Error(err.Error()) - return 1 - } +func (c *DebugCommand) Run(args []string) int { + return cli.RunResultHelp +} - clt, err := d.BorConn() - if err != nil { - d.UI.Error(err.Error()) - return 1 - } +type debugEnv struct { + output string + prefix string + + name string + dst string +} - stamped := "bor-debug-" + time.Now().UTC().Format("2006-01-02-150405Z") +func (d *debugEnv) init() error { + d.name = d.prefix + time.Now().UTC().Format("2006-01-02-150405Z") + + var err error // Create the output directory var tmp string if d.output != "" { // User specified output directory - tmp = filepath.Join(d.output, stamped) + tmp = filepath.Join(d.output, d.name) _, err := os.Stat(tmp) if !os.IsNotExist(err) { - d.UI.Error("Output directory already exists") - return 1 + return fmt.Errorf("output directory already exists") } } else { // Generate temp directory - tmp, err = ioutil.TempDir(os.TempDir(), stamped) + tmp, err = ioutil.TempDir(os.TempDir(), d.name) if err != nil { - d.UI.Error(fmt.Sprintf("Error creating tmp directory: %s", err.Error())) - return 1 + return fmt.Errorf("error creating tmp directory: %s", err.Error()) } - defer os.RemoveAll(tmp) } - d.UI.Output("Starting debugger...") - d.UI.Output("") - // ensure destine folder exists if err := os.MkdirAll(tmp, os.ModePerm); err != nil { - d.UI.Error(fmt.Sprintf("failed to create parent directory: %v", err)) - return 1 + return fmt.Errorf("failed to create parent directory: %v", err) } - pprofProfile := func(ctx context.Context, profile string, filename string) error { - req := &proto.PprofRequest{ - Seconds: int64(d.seconds), - } + d.dst = tmp - switch profile { - case "cpu": - req.Type = proto.PprofRequest_CPU - case "trace": - req.Type = proto.PprofRequest_TRACE - default: - req.Type = proto.PprofRequest_LOOKUP - req.Profile = profile - } - - stream, err := clt.Pprof(ctx, req) + return nil +} - if err != nil { - return err - } - // wait for open request - msg, err := stream.Recv() - if err != nil { - return err - } +func (d *debugEnv) tarName() string { + return d.name + ".tar.gz" +} - if _, ok := msg.Event.(*proto.PprofResponse_Open_); !ok { - return fmt.Errorf("expected open message") - } +func (d *debugEnv) finish() error { + // Exit before archive if output directory was specified + if d.output != "" { + return nil + } - // create the stream - conn := &grpc_net_conn.Conn{ - Stream: stream, - Response: &proto.PprofResponse_Input{}, - Decode: grpc_net_conn.SimpleDecoder(func(msg gproto.Message) *[]byte { - return &msg.(*proto.PprofResponse_Input).Data - }), - } + // Create archive tarball + archiveFile := d.tarName() + if err := tarCZF(archiveFile, d.dst, d.name); err != nil { + return fmt.Errorf("error creating archive: %s", err.Error()) + } - file, err := os.OpenFile(filepath.Join(tmp, filename+".prof"), os.O_RDWR|os.O_CREATE, 0644) - if err != nil { - return err - } - defer file.Close() + return nil +} - if _, err := io.Copy(file, conn); err != nil { - return err - } +type debugStream interface { + Recv() (*proto.DebugFileResponse, error) + grpc.ClientStream +} - return nil +func (d *debugEnv) writeFromStream(name string, stream debugStream) error { + // wait for open request + msg, err := stream.Recv() + if err != nil { + return err } - ctx, cancelFn := context.WithCancel(context.Background()) - trapSignal(cancelFn) - - profiles := map[string]string{ - "heap": "heap", - "cpu": "cpu", - "trace": "trace", + if _, ok := msg.Event.(*proto.DebugFileResponse_Open_); !ok { + return fmt.Errorf("expected open message") } - for profile, filename := range profiles { - if err := pprofProfile(ctx, profile, filename); err != nil { - d.UI.Error(fmt.Sprintf("Error creating profile '%s': %v", profile, err)) - return 1 - } + + // create the stream + conn := &grpc_net_conn.Conn{ + Stream: stream, + Response: &proto.DebugFileResponse_Input{}, + Decode: grpc_net_conn.SimpleDecoder(func(msg gproto.Message) *[]byte { + return &msg.(*proto.DebugFileResponse_Input).Data + }), } - // append the status - { - statusResp, err := clt.Status(ctx, &empty.Empty{}) - if err != nil { - d.UI.Output(fmt.Sprintf("Failed to get status: %v", err)) - return 1 - } - m := jsonpb.Marshaler{} - data, err := m.MarshalToString(statusResp) - if err != nil { - d.UI.Output(err.Error()) - return 1 - } - if err := ioutil.WriteFile(filepath.Join(tmp, "status.json"), []byte(data), 0600); err != nil { - d.UI.Output(fmt.Sprintf("Failed to write status: %v", err)) - return 1 - } + file, err := os.OpenFile(filepath.Join(d.dst, name), os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return err } + defer file.Close() - // Exit before archive if output directory was specified - if d.output != "" { - d.UI.Output(fmt.Sprintf("Created debug directory: %s", tmp)) - return 0 + if _, err := io.Copy(file, conn); err != nil { + return err } - // Create archive tarball - archiveFile := stamped + ".tar.gz" - if err = tarCZF(archiveFile, tmp, stamped); err != nil { - d.UI.Error(fmt.Sprintf("Error creating archive: %s", err.Error())) - return 1 + return nil +} + +func (d *debugEnv) writeJSON(name string, msg protoiface.MessageV1) error { + m := jsonpb.Marshaler{} + data, err := m.MarshalToString(msg) + + if err != nil { + return err } - d.UI.Output(fmt.Sprintf("Created debug archive: %s", archiveFile)) + if err := ioutil.WriteFile(filepath.Join(d.dst, name), []byte(data), 0600); err != nil { + return fmt.Errorf("failed to write status: %v", err) + } - return 0 + return nil } func trapSignal(cancel func()) { diff --git a/internal/cli/debug_block.go b/internal/cli/debug_block.go new file mode 100644 index 0000000000..5a282cc550 --- /dev/null +++ b/internal/cli/debug_block.go @@ -0,0 +1,126 @@ +package cli + +import ( + "context" + "fmt" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/internal/cli/flagset" + "github.com/ethereum/go-ethereum/internal/cli/server/proto" +) + +// DebugBlockCommand is the command to group the peers commands +type DebugBlockCommand struct { + *Meta2 + + output string +} + +func (p *DebugBlockCommand) MarkDown() string { + items := []string{ + "# Debug trace", + "The ```bor debug block ``` command will create an archive containing traces of a bor block.", + p.Flags().MarkDown(), + } + + return strings.Join(items, "\n\n") +} + +// Help implements the cli.Command interface +func (c *DebugBlockCommand) Help() string { + return `Usage: bor debug block + + This command is used get traces of a bor block` +} + +func (c *DebugBlockCommand) Flags() *flagset.Flagset { + flags := c.NewFlagSet("trace") + + flags.StringFlag(&flagset.StringFlag{ + Name: "output", + Value: &c.output, + Usage: "Output directory", + }) + + return flags +} + +// Synopsis implements the cli.Command interface +func (c *DebugBlockCommand) Synopsis() string { + return "Get trace of a bor block" +} + +// Run implements the cli.Command interface +func (c *DebugBlockCommand) Run(args []string) int { + flags := c.Flags() + + var number *int64 = nil + + // parse the block number (if available) + if len(args)%2 != 0 { + num, err := strconv.ParseInt(args[0], 10, 64) + if err == nil { + number = &num + } + + args = args[1:] + } + // parse output directory + if err := flags.Parse(args); err != nil { + c.UI.Error(err.Error()) + return 1 + } + + borClt, err := c.BorConn() + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + dEnv := &debugEnv{ + output: c.output, + prefix: "bor-block-trace-", + } + if err := dEnv.init(); err != nil { + c.UI.Error(err.Error()) + return 1 + } + + c.UI.Output("Starting block tracer...") + c.UI.Output("") + + // create a debug block request + var debugRequest *proto.DebugBlockRequest = &proto.DebugBlockRequest{} + if number != nil { + debugRequest.Number = *number + } else { + debugRequest.Number = -1 + } + + // send the request + // receives a grpc stream of debug block response + stream, err := borClt.DebugBlock(context.Background(), debugRequest) + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + if err := dEnv.writeFromStream("block.json", stream); err != nil { + c.UI.Error(err.Error()) + return 1 + } + + if err := dEnv.finish(); err != nil { + c.UI.Error(err.Error()) + return 1 + } + + if c.output != "" { + c.UI.Output(fmt.Sprintf("Created debug directory: %s", dEnv.dst)) + } else { + c.UI.Output(fmt.Sprintf("Created block trace archive: %s", dEnv.tarName())) + } + + return 0 +} diff --git a/internal/cli/debug_pprof.go b/internal/cli/debug_pprof.go new file mode 100644 index 0000000000..ef15e45b58 --- /dev/null +++ b/internal/cli/debug_pprof.go @@ -0,0 +1,159 @@ +package cli + +// Based on https://github.com/hashicorp/nomad/blob/main/command/operator_debug.go + +import ( + "context" + "fmt" + "strings" + + "github.com/golang/protobuf/ptypes/empty" + + "github.com/ethereum/go-ethereum/internal/cli/flagset" + "github.com/ethereum/go-ethereum/internal/cli/server/proto" +) + +type DebugPprofCommand struct { + *Meta2 + + seconds uint64 + output string +} + +func (p *DebugPprofCommand) MarkDown() string { + items := []string{ + "# Debug Pprof", + "The ```debug pprof ``` command will create an archive containing bor pprof traces.", + p.Flags().MarkDown(), + } + + return strings.Join(items, "\n\n") +} + +// Help implements the cli.Command interface +func (d *DebugPprofCommand) Help() string { + return `Usage: bor debug + + Build an archive containing Bor pprof traces + + ` + d.Flags().Help() +} + +func (d *DebugPprofCommand) Flags() *flagset.Flagset { + flags := d.NewFlagSet("debug") + + flags.Uint64Flag(&flagset.Uint64Flag{ + Name: "seconds", + Usage: "seconds to trace", + Value: &d.seconds, + Default: 2, + }) + flags.StringFlag(&flagset.StringFlag{ + Name: "output", + Value: &d.output, + Usage: "Output directory", + }) + + return flags +} + +// Synopsis implements the cli.Command interface +func (d *DebugPprofCommand) Synopsis() string { + return "Build an archive containing Bor pprof traces" +} + +// Run implements the cli.Command interface +func (d *DebugPprofCommand) Run(args []string) int { + flags := d.Flags() + if err := flags.Parse(args); err != nil { + d.UI.Error(err.Error()) + return 1 + } + + clt, err := d.BorConn() + if err != nil { + d.UI.Error(err.Error()) + return 1 + } + + dEnv := &debugEnv{ + output: d.output, + prefix: "bor-debug-", + } + if err := dEnv.init(); err != nil { + d.UI.Error(err.Error()) + return 1 + } + + d.UI.Output("Starting debugger...") + d.UI.Output("") + + pprofProfile := func(ctx context.Context, profile string, filename string) error { + req := &proto.DebugPprofRequest{ + Seconds: int64(d.seconds), + } + + switch profile { + case "cpu": + req.Type = proto.DebugPprofRequest_CPU + case "trace": + req.Type = proto.DebugPprofRequest_TRACE + default: + req.Type = proto.DebugPprofRequest_LOOKUP + req.Profile = profile + } + + stream, err := clt.DebugPprof(ctx, req) + + if err != nil { + return err + } + + if err := dEnv.writeFromStream(filename+".prof", stream); err != nil { + return err + } + + return nil + } + + ctx, cancelFn := context.WithCancel(context.Background()) + trapSignal(cancelFn) + + profiles := map[string]string{ + "heap": "heap", + "cpu": "cpu", + "trace": "trace", + } + for profile, filename := range profiles { + if err := pprofProfile(ctx, profile, filename); err != nil { + d.UI.Error(fmt.Sprintf("Error creating profile '%s': %v", profile, err)) + return 1 + } + } + + // append the status + { + statusResp, err := clt.Status(ctx, &empty.Empty{}) + if err != nil { + d.UI.Output(fmt.Sprintf("Failed to get status: %v", err)) + return 1 + } + if err := dEnv.writeJSON("status.json", statusResp); err != nil { + d.UI.Error(err.Error()) + return 1 + } + } + + if err := dEnv.finish(); err != nil { + d.UI.Error(err.Error()) + return 1 + } + + if d.output != "" { + d.UI.Output(fmt.Sprintf("Created debug directory: %s", dEnv.dst)) + } else { + d.UI.Output(fmt.Sprintf("Created debug archive: %s", dEnv.tarName())) + } + + return 0 +} diff --git a/internal/cli/debug_test.go b/internal/cli/debug_test.go new file mode 100644 index 0000000000..f77cf839ac --- /dev/null +++ b/internal/cli/debug_test.go @@ -0,0 +1,112 @@ +package cli + +import ( + "os" + "path" + "strconv" + "testing" + "time" + + "github.com/mitchellh/cli" + "github.com/stretchr/testify/assert" + + "github.com/ethereum/go-ethereum/internal/cli/server" +) + +var currentDir string = "" + +func TestCommand_DebugBlock(t *testing.T) { + t.Parallel() + + // Start a blockchain in developer mode and get trace of block + config := server.DefaultConfig() + + // enable developer mode + config.Developer.Enabled = true + config.Developer.Period = 2 // block time + + // enable archive mode for getting traces of ancient blocks + config.GcMode = "archive" + + // start the mock server + srv, err := server.CreateMockServer(config) + assert.NoError(t, err) + + defer server.CloseMockServer(srv) + + // get the grpc port + port := srv.GetGrpcAddr() + + // wait for 4 seconds to mine a 2 blocks + time.Sleep(2 * time.Duration(config.Developer.Period) * time.Second) + + // add prefix for debug trace + prefix := "bor-block-trace-" + + // output dir + output := "debug_block_test" + + // set current directory + currentDir, _ = os.Getwd() + + // trace 1st block + start := time.Now() + dst1 := path.Join(output, prefix+time.Now().UTC().Format("2006-01-02-150405Z"), "block.json") + res := traceBlock(port, 1, output) + assert.Equal(t, 0, res) + t.Logf("Completed trace of block %d in %d ms at %s", 1, time.Since(start).Milliseconds(), dst1) + + // adding this to avoid debug directory name conflicts + time.Sleep(time.Second) + + // trace last/recent block + start = time.Now() + latestBlock := srv.GetLatestBlockNumber().Int64() + dst2 := path.Join(output, prefix+time.Now().UTC().Format("2006-01-02-150405Z"), "block.json") + res = traceBlock(port, latestBlock, output) + assert.Equal(t, 0, res) + t.Logf("Completed trace of block %d in %d ms at %s", latestBlock, time.Since(start).Milliseconds(), dst2) + + // verify if the trace files are created + done := verify(dst1) + assert.Equal(t, true, done) + done = verify(dst2) + assert.Equal(t, true, done) + + // delete the traces + deleteTraces(output) +} + +// traceBlock calls the cli command to trace a block +func traceBlock(port string, number int64, output string) int { + ui := cli.NewMockUi() + command := &DebugBlockCommand{ + Meta2: &Meta2{ + UI: ui, + addr: "127.0.0.1:" + port, + }, + } + + // run trace (by explicitly passing the output directory and grpc address) + return command.Run([]string{strconv.FormatInt(number, 10), "--output", output, "--address", command.Meta2.addr}) +} + +// verify checks if the trace file is created at the destination +// directory or not +func verify(dst string) bool { + dst = path.Join(currentDir, dst) + if file, err := os.Stat(dst); err == nil { + // check if the file has content + if file.Size() > 0 { + return true + } + } + + return false +} + +// deleteTraces removes the traces created during the test +func deleteTraces(dst string) { + dst = path.Join(currentDir, dst) + os.RemoveAll(dst) +} diff --git a/internal/cli/server/helper.go b/internal/cli/server/helper.go new file mode 100644 index 0000000000..c6831382b3 --- /dev/null +++ b/internal/cli/server/helper.go @@ -0,0 +1,72 @@ +package server + +import ( + "fmt" + "io/ioutil" + "math/rand" + "net" + "os" + "sync/atomic" + "time" +) + +var maxPortCheck int32 = 100 + +// findAvailablePort returns the next available port starting from `from` +func findAvailablePort(from int32, count int32) (int32, error) { + if count == maxPortCheck { + return 0, fmt.Errorf("no available port found") + } + port := atomic.AddInt32(&from, 1) + addr := fmt.Sprintf("localhost:%d", port) + lis, err := net.Listen("tcp", addr) + count++ + if err == nil { + lis.Close() + return port, nil + } else { + return findAvailablePort(from, count) + } +} + +func CreateMockServer(config *Config) (*Server, error) { + if config == nil { + config = DefaultConfig() + } + + // find available port for grpc server + rand.Seed(time.Now().UnixNano()) + var from int32 = 60000 // the min port to start checking from + var to int32 = 61000 // the max port to start checking from + port, err := findAvailablePort(rand.Int31n(to-from+1)+from, 0) + if err != nil { + return nil, err + } + + // grpc port + config.GRPC.Addr = fmt.Sprintf(":%d", port) + + // datadir + datadir, _ := ioutil.TempDir("/tmp", "bor-cli-test") + config.DataDir = datadir + + // find available port for http server + from = 8545 + to = 9545 + port, err = findAvailablePort(rand.Int31n(to-from+1)+from, 0) + if err != nil { + return nil, err + } + config.JsonRPC.Http.Port = uint64(port) + + // start the server + return NewServer(config) +} + +func CloseMockServer(server *Server) { + // remove the contents of temp data dir + os.RemoveAll(server.config.DataDir) + + // close the server + server.Stop() +} diff --git a/internal/cli/server/proto/server.pb.go b/internal/cli/server/proto/server.pb.go index 2b45fb37e9..5512d83b72 100644 --- a/internal/cli/server/proto/server.pb.go +++ b/internal/cli/server/proto/server.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 +// protoc-gen-go v1.27.1 // protoc v3.19.3 // source: internal/cli/server/proto/server.proto package proto import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" @@ -22,57 +21,138 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - -type PprofRequest_Type int32 +type DebugPprofRequest_Type int32 const ( - PprofRequest_LOOKUP PprofRequest_Type = 0 - PprofRequest_CPU PprofRequest_Type = 1 - PprofRequest_TRACE PprofRequest_Type = 2 + DebugPprofRequest_LOOKUP DebugPprofRequest_Type = 0 + DebugPprofRequest_CPU DebugPprofRequest_Type = 1 + DebugPprofRequest_TRACE DebugPprofRequest_Type = 2 ) -// Enum value maps for PprofRequest_Type. +// Enum value maps for DebugPprofRequest_Type. var ( - PprofRequest_Type_name = map[int32]string{ + DebugPprofRequest_Type_name = map[int32]string{ 0: "LOOKUP", 1: "CPU", 2: "TRACE", } - PprofRequest_Type_value = map[string]int32{ + DebugPprofRequest_Type_value = map[string]int32{ "LOOKUP": 0, "CPU": 1, "TRACE": 2, } ) -func (x PprofRequest_Type) Enum() *PprofRequest_Type { - p := new(PprofRequest_Type) +func (x DebugPprofRequest_Type) Enum() *DebugPprofRequest_Type { + p := new(DebugPprofRequest_Type) *p = x return p } -func (x PprofRequest_Type) String() string { +func (x DebugPprofRequest_Type) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (PprofRequest_Type) Descriptor() protoreflect.EnumDescriptor { +func (DebugPprofRequest_Type) Descriptor() protoreflect.EnumDescriptor { return file_internal_cli_server_proto_server_proto_enumTypes[0].Descriptor() } -func (PprofRequest_Type) Type() protoreflect.EnumType { +func (DebugPprofRequest_Type) Type() protoreflect.EnumType { return &file_internal_cli_server_proto_server_proto_enumTypes[0] } -func (x PprofRequest_Type) Number() protoreflect.EnumNumber { +func (x DebugPprofRequest_Type) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use PprofRequest_Type.Descriptor instead. -func (PprofRequest_Type) EnumDescriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{16, 0} +// Deprecated: Use DebugPprofRequest_Type.Descriptor instead. +func (DebugPprofRequest_Type) EnumDescriptor() ([]byte, []int) { + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{18, 0} +} + +type TraceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number int64 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` +} + +func (x *TraceRequest) Reset() { + *x = TraceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TraceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TraceRequest) ProtoMessage() {} + +func (x *TraceRequest) ProtoReflect() protoreflect.Message { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TraceRequest.ProtoReflect.Descriptor instead. +func (*TraceRequest) Descriptor() ([]byte, []int) { + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{0} +} + +func (x *TraceRequest) GetNumber() int64 { + if x != nil { + return x.Number + } + return 0 +} + +type TraceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *TraceResponse) Reset() { + *x = TraceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TraceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TraceResponse) ProtoMessage() {} + +func (x *TraceResponse) ProtoReflect() protoreflect.Message { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TraceResponse.ProtoReflect.Descriptor instead. +func (*TraceResponse) Descriptor() ([]byte, []int) { + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{1} } type ChainWatchRequest struct { @@ -84,7 +164,7 @@ type ChainWatchRequest struct { func (x *ChainWatchRequest) Reset() { *x = ChainWatchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[0] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -97,7 +177,7 @@ func (x *ChainWatchRequest) String() string { func (*ChainWatchRequest) ProtoMessage() {} func (x *ChainWatchRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[0] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -110,7 +190,7 @@ func (x *ChainWatchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainWatchRequest.ProtoReflect.Descriptor instead. func (*ChainWatchRequest) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{0} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{2} } type ChainWatchResponse struct { @@ -126,7 +206,7 @@ type ChainWatchResponse struct { func (x *ChainWatchResponse) Reset() { *x = ChainWatchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[1] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -139,7 +219,7 @@ func (x *ChainWatchResponse) String() string { func (*ChainWatchResponse) ProtoMessage() {} func (x *ChainWatchResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[1] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -152,7 +232,7 @@ func (x *ChainWatchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainWatchResponse.ProtoReflect.Descriptor instead. func (*ChainWatchResponse) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{1} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{3} } func (x *ChainWatchResponse) GetOldchain() []*BlockStub { @@ -188,7 +268,7 @@ type BlockStub struct { func (x *BlockStub) Reset() { *x = BlockStub{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[2] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -201,7 +281,7 @@ func (x *BlockStub) String() string { func (*BlockStub) ProtoMessage() {} func (x *BlockStub) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[2] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -214,7 +294,7 @@ func (x *BlockStub) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockStub.ProtoReflect.Descriptor instead. func (*BlockStub) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{2} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{4} } func (x *BlockStub) GetHash() string { @@ -243,7 +323,7 @@ type PeersAddRequest struct { func (x *PeersAddRequest) Reset() { *x = PeersAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[3] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -256,7 +336,7 @@ func (x *PeersAddRequest) String() string { func (*PeersAddRequest) ProtoMessage() {} func (x *PeersAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[3] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -269,7 +349,7 @@ func (x *PeersAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersAddRequest.ProtoReflect.Descriptor instead. func (*PeersAddRequest) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{3} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{5} } func (x *PeersAddRequest) GetEnode() string { @@ -295,7 +375,7 @@ type PeersAddResponse struct { func (x *PeersAddResponse) Reset() { *x = PeersAddResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[4] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -308,7 +388,7 @@ func (x *PeersAddResponse) String() string { func (*PeersAddResponse) ProtoMessage() {} func (x *PeersAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[4] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -321,7 +401,7 @@ func (x *PeersAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersAddResponse.ProtoReflect.Descriptor instead. func (*PeersAddResponse) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{4} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{6} } type PeersRemoveRequest struct { @@ -336,7 +416,7 @@ type PeersRemoveRequest struct { func (x *PeersRemoveRequest) Reset() { *x = PeersRemoveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[5] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -349,7 +429,7 @@ func (x *PeersRemoveRequest) String() string { func (*PeersRemoveRequest) ProtoMessage() {} func (x *PeersRemoveRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[5] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -362,7 +442,7 @@ func (x *PeersRemoveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersRemoveRequest.ProtoReflect.Descriptor instead. func (*PeersRemoveRequest) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{5} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{7} } func (x *PeersRemoveRequest) GetEnode() string { @@ -388,7 +468,7 @@ type PeersRemoveResponse struct { func (x *PeersRemoveResponse) Reset() { *x = PeersRemoveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[6] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -401,7 +481,7 @@ func (x *PeersRemoveResponse) String() string { func (*PeersRemoveResponse) ProtoMessage() {} func (x *PeersRemoveResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[6] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -414,7 +494,7 @@ func (x *PeersRemoveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersRemoveResponse.ProtoReflect.Descriptor instead. func (*PeersRemoveResponse) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{6} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{8} } type PeersListRequest struct { @@ -426,7 +506,7 @@ type PeersListRequest struct { func (x *PeersListRequest) Reset() { *x = PeersListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[7] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -439,7 +519,7 @@ func (x *PeersListRequest) String() string { func (*PeersListRequest) ProtoMessage() {} func (x *PeersListRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[7] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -452,7 +532,7 @@ func (x *PeersListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersListRequest.ProtoReflect.Descriptor instead. func (*PeersListRequest) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{7} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{9} } type PeersListResponse struct { @@ -466,7 +546,7 @@ type PeersListResponse struct { func (x *PeersListResponse) Reset() { *x = PeersListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[8] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -479,7 +559,7 @@ func (x *PeersListResponse) String() string { func (*PeersListResponse) ProtoMessage() {} func (x *PeersListResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[8] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -492,7 +572,7 @@ func (x *PeersListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersListResponse.ProtoReflect.Descriptor instead. func (*PeersListResponse) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{8} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{10} } func (x *PeersListResponse) GetPeers() []*Peer { @@ -513,7 +593,7 @@ type PeersStatusRequest struct { func (x *PeersStatusRequest) Reset() { *x = PeersStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[9] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -526,7 +606,7 @@ func (x *PeersStatusRequest) String() string { func (*PeersStatusRequest) ProtoMessage() {} func (x *PeersStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[9] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -539,7 +619,7 @@ func (x *PeersStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersStatusRequest.ProtoReflect.Descriptor instead. func (*PeersStatusRequest) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{9} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{11} } func (x *PeersStatusRequest) GetEnode() string { @@ -560,7 +640,7 @@ type PeersStatusResponse struct { func (x *PeersStatusResponse) Reset() { *x = PeersStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[10] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -573,7 +653,7 @@ func (x *PeersStatusResponse) String() string { func (*PeersStatusResponse) ProtoMessage() {} func (x *PeersStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[10] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -586,7 +666,7 @@ func (x *PeersStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeersStatusResponse.ProtoReflect.Descriptor instead. func (*PeersStatusResponse) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{10} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{12} } func (x *PeersStatusResponse) GetPeer() *Peer { @@ -613,7 +693,7 @@ type Peer struct { func (x *Peer) Reset() { *x = Peer{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[11] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -626,7 +706,7 @@ func (x *Peer) String() string { func (*Peer) ProtoMessage() {} func (x *Peer) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[11] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -639,7 +719,7 @@ func (x *Peer) ProtoReflect() protoreflect.Message { // Deprecated: Use Peer.ProtoReflect.Descriptor instead. func (*Peer) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{11} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{13} } func (x *Peer) GetId() string { @@ -702,7 +782,7 @@ type ChainSetHeadRequest struct { func (x *ChainSetHeadRequest) Reset() { *x = ChainSetHeadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[12] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -715,7 +795,7 @@ func (x *ChainSetHeadRequest) String() string { func (*ChainSetHeadRequest) ProtoMessage() {} func (x *ChainSetHeadRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[12] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -728,7 +808,7 @@ func (x *ChainSetHeadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainSetHeadRequest.ProtoReflect.Descriptor instead. func (*ChainSetHeadRequest) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{12} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{14} } func (x *ChainSetHeadRequest) GetNumber() uint64 { @@ -747,7 +827,7 @@ type ChainSetHeadResponse struct { func (x *ChainSetHeadResponse) Reset() { *x = ChainSetHeadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[13] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -760,7 +840,7 @@ func (x *ChainSetHeadResponse) String() string { func (*ChainSetHeadResponse) ProtoMessage() {} func (x *ChainSetHeadResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[13] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -773,7 +853,7 @@ func (x *ChainSetHeadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainSetHeadResponse.ProtoReflect.Descriptor instead. func (*ChainSetHeadResponse) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{13} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{15} } type StatusResponse struct { @@ -792,7 +872,7 @@ type StatusResponse struct { func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[14] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -805,7 +885,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[14] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -818,7 +898,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{14} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{16} } func (x *StatusResponse) GetCurrentBlock() *Header { @@ -875,7 +955,7 @@ type Header struct { func (x *Header) Reset() { *x = Header{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[15] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -888,7 +968,7 @@ func (x *Header) String() string { func (*Header) ProtoMessage() {} func (x *Header) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[15] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -901,7 +981,7 @@ func (x *Header) ProtoReflect() protoreflect.Message { // Deprecated: Use Header.ProtoReflect.Descriptor instead. func (*Header) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{15} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{17} } func (x *Header) GetHash() string { @@ -918,33 +998,33 @@ func (x *Header) GetNumber() uint64 { return 0 } -type PprofRequest struct { +type DebugPprofRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type PprofRequest_Type `protobuf:"varint,1,opt,name=type,proto3,enum=proto.PprofRequest_Type" json:"type,omitempty"` - Profile string `protobuf:"bytes,2,opt,name=profile,proto3" json:"profile,omitempty"` - Seconds int64 `protobuf:"varint,3,opt,name=seconds,proto3" json:"seconds,omitempty"` + Type DebugPprofRequest_Type `protobuf:"varint,1,opt,name=type,proto3,enum=proto.DebugPprofRequest_Type" json:"type,omitempty"` + Profile string `protobuf:"bytes,2,opt,name=profile,proto3" json:"profile,omitempty"` + Seconds int64 `protobuf:"varint,3,opt,name=seconds,proto3" json:"seconds,omitempty"` } -func (x *PprofRequest) Reset() { - *x = PprofRequest{} +func (x *DebugPprofRequest) Reset() { + *x = DebugPprofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[16] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PprofRequest) String() string { +func (x *DebugPprofRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PprofRequest) ProtoMessage() {} +func (*DebugPprofRequest) ProtoMessage() {} -func (x *PprofRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[16] +func (x *DebugPprofRequest) ProtoReflect() protoreflect.Message { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -955,61 +1035,108 @@ func (x *PprofRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PprofRequest.ProtoReflect.Descriptor instead. -func (*PprofRequest) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{16} +// Deprecated: Use DebugPprofRequest.ProtoReflect.Descriptor instead. +func (*DebugPprofRequest) Descriptor() ([]byte, []int) { + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{18} } -func (x *PprofRequest) GetType() PprofRequest_Type { +func (x *DebugPprofRequest) GetType() DebugPprofRequest_Type { if x != nil { return x.Type } - return PprofRequest_LOOKUP + return DebugPprofRequest_LOOKUP } -func (x *PprofRequest) GetProfile() string { +func (x *DebugPprofRequest) GetProfile() string { if x != nil { return x.Profile } return "" } -func (x *PprofRequest) GetSeconds() int64 { +func (x *DebugPprofRequest) GetSeconds() int64 { if x != nil { return x.Seconds } return 0 } -type PprofResponse struct { +type DebugBlockRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number int64 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` +} + +func (x *DebugBlockRequest) Reset() { + *x = DebugBlockRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DebugBlockRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DebugBlockRequest) ProtoMessage() {} + +func (x *DebugBlockRequest) ProtoReflect() protoreflect.Message { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DebugBlockRequest.ProtoReflect.Descriptor instead. +func (*DebugBlockRequest) Descriptor() ([]byte, []int) { + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{19} +} + +func (x *DebugBlockRequest) GetNumber() int64 { + if x != nil { + return x.Number + } + return 0 +} + +type DebugFileResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to Event: - // *PprofResponse_Open_ - // *PprofResponse_Input_ - // *PprofResponse_Eof - Event isPprofResponse_Event `protobuf_oneof:"event"` + // *DebugFileResponse_Open_ + // *DebugFileResponse_Input_ + // *DebugFileResponse_Eof + Event isDebugFileResponse_Event `protobuf_oneof:"event"` } -func (x *PprofResponse) Reset() { - *x = PprofResponse{} +func (x *DebugFileResponse) Reset() { + *x = DebugFileResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[17] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PprofResponse) String() string { +func (x *DebugFileResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PprofResponse) ProtoMessage() {} +func (*DebugFileResponse) ProtoMessage() {} -func (x *PprofResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[17] +func (x *DebugFileResponse) ProtoReflect() protoreflect.Message { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1020,60 +1147,60 @@ func (x *PprofResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PprofResponse.ProtoReflect.Descriptor instead. -func (*PprofResponse) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{17} +// Deprecated: Use DebugFileResponse.ProtoReflect.Descriptor instead. +func (*DebugFileResponse) Descriptor() ([]byte, []int) { + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{20} } -func (m *PprofResponse) GetEvent() isPprofResponse_Event { +func (m *DebugFileResponse) GetEvent() isDebugFileResponse_Event { if m != nil { return m.Event } return nil } -func (x *PprofResponse) GetOpen() *PprofResponse_Open { - if x, ok := x.GetEvent().(*PprofResponse_Open_); ok { +func (x *DebugFileResponse) GetOpen() *DebugFileResponse_Open { + if x, ok := x.GetEvent().(*DebugFileResponse_Open_); ok { return x.Open } return nil } -func (x *PprofResponse) GetInput() *PprofResponse_Input { - if x, ok := x.GetEvent().(*PprofResponse_Input_); ok { +func (x *DebugFileResponse) GetInput() *DebugFileResponse_Input { + if x, ok := x.GetEvent().(*DebugFileResponse_Input_); ok { return x.Input } return nil } -func (x *PprofResponse) GetEof() *emptypb.Empty { - if x, ok := x.GetEvent().(*PprofResponse_Eof); ok { +func (x *DebugFileResponse) GetEof() *emptypb.Empty { + if x, ok := x.GetEvent().(*DebugFileResponse_Eof); ok { return x.Eof } return nil } -type isPprofResponse_Event interface { - isPprofResponse_Event() +type isDebugFileResponse_Event interface { + isDebugFileResponse_Event() } -type PprofResponse_Open_ struct { - Open *PprofResponse_Open `protobuf:"bytes,1,opt,name=open,proto3,oneof"` +type DebugFileResponse_Open_ struct { + Open *DebugFileResponse_Open `protobuf:"bytes,1,opt,name=open,proto3,oneof"` } -type PprofResponse_Input_ struct { - Input *PprofResponse_Input `protobuf:"bytes,2,opt,name=input,proto3,oneof"` +type DebugFileResponse_Input_ struct { + Input *DebugFileResponse_Input `protobuf:"bytes,2,opt,name=input,proto3,oneof"` } -type PprofResponse_Eof struct { +type DebugFileResponse_Eof struct { Eof *emptypb.Empty `protobuf:"bytes,3,opt,name=eof,proto3,oneof"` } -func (*PprofResponse_Open_) isPprofResponse_Event() {} +func (*DebugFileResponse_Open_) isDebugFileResponse_Event() {} -func (*PprofResponse_Input_) isPprofResponse_Event() {} +func (*DebugFileResponse_Input_) isDebugFileResponse_Event() {} -func (*PprofResponse_Eof) isPprofResponse_Event() {} +func (*DebugFileResponse_Eof) isDebugFileResponse_Event() {} type StatusResponse_Fork struct { state protoimpl.MessageState @@ -1088,7 +1215,7 @@ type StatusResponse_Fork struct { func (x *StatusResponse_Fork) Reset() { *x = StatusResponse_Fork{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[18] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1101,7 +1228,7 @@ func (x *StatusResponse_Fork) String() string { func (*StatusResponse_Fork) ProtoMessage() {} func (x *StatusResponse_Fork) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[18] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1114,7 +1241,7 @@ func (x *StatusResponse_Fork) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse_Fork.ProtoReflect.Descriptor instead. func (*StatusResponse_Fork) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{14, 0} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{16, 0} } func (x *StatusResponse_Fork) GetName() string { @@ -1151,7 +1278,7 @@ type StatusResponse_Syncing struct { func (x *StatusResponse_Syncing) Reset() { *x = StatusResponse_Syncing{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[19] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1164,7 +1291,7 @@ func (x *StatusResponse_Syncing) String() string { func (*StatusResponse_Syncing) ProtoMessage() {} func (x *StatusResponse_Syncing) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[19] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1177,7 +1304,7 @@ func (x *StatusResponse_Syncing) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse_Syncing.ProtoReflect.Descriptor instead. func (*StatusResponse_Syncing) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{14, 1} + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{16, 1} } func (x *StatusResponse_Syncing) GetStartingBlock() int64 { @@ -1201,32 +1328,31 @@ func (x *StatusResponse_Syncing) GetCurrentBlock() int64 { return 0 } -type PprofResponse_Open struct { +type DebugFileResponse_Open struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Headers map[string]string `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` } -func (x *PprofResponse_Open) Reset() { - *x = PprofResponse_Open{} +func (x *DebugFileResponse_Open) Reset() { + *x = DebugFileResponse_Open{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[20] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PprofResponse_Open) String() string { +func (x *DebugFileResponse_Open) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PprofResponse_Open) ProtoMessage() {} +func (*DebugFileResponse_Open) ProtoMessage() {} -func (x *PprofResponse_Open) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[20] +func (x *DebugFileResponse_Open) ProtoReflect() protoreflect.Message { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1237,26 +1363,19 @@ func (x *PprofResponse_Open) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PprofResponse_Open.ProtoReflect.Descriptor instead. -func (*PprofResponse_Open) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{17, 0} +// Deprecated: Use DebugFileResponse_Open.ProtoReflect.Descriptor instead. +func (*DebugFileResponse_Open) Descriptor() ([]byte, []int) { + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{20, 0} } -func (x *PprofResponse_Open) GetHeaders() map[string]string { +func (x *DebugFileResponse_Open) GetHeaders() map[string]string { if x != nil { return x.Headers } return nil } -func (x *PprofResponse_Open) GetSize() int64 { - if x != nil { - return x.Size - } - return 0 -} - -type PprofResponse_Input struct { +type DebugFileResponse_Input struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1264,23 +1383,23 @@ type PprofResponse_Input struct { Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` } -func (x *PprofResponse_Input) Reset() { - *x = PprofResponse_Input{} +func (x *DebugFileResponse_Input) Reset() { + *x = DebugFileResponse_Input{} if protoimpl.UnsafeEnabled { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[21] + mi := &file_internal_cli_server_proto_server_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PprofResponse_Input) String() string { +func (x *DebugFileResponse_Input) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PprofResponse_Input) ProtoMessage() {} +func (*DebugFileResponse_Input) ProtoMessage() {} -func (x *PprofResponse_Input) ProtoReflect() protoreflect.Message { - mi := &file_internal_cli_server_proto_server_proto_msgTypes[21] +func (x *DebugFileResponse_Input) ProtoReflect() protoreflect.Message { + mi := &file_internal_cli_server_proto_server_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1291,12 +1410,12 @@ func (x *PprofResponse_Input) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PprofResponse_Input.ProtoReflect.Descriptor instead. -func (*PprofResponse_Input) Descriptor() ([]byte, []int) { - return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{17, 1} +// Deprecated: Use DebugFileResponse_Input.ProtoReflect.Descriptor instead. +func (*DebugFileResponse_Input) Descriptor() ([]byte, []int) { + return file_internal_cli_server_proto_server_proto_rawDescGZIP(), []int{20, 1} } -func (x *PprofResponse_Input) GetData() []byte { +func (x *DebugFileResponse_Input) GetData() []byte { if x != nil { return x.Data } @@ -1310,158 +1429,170 @@ var file_internal_cli_server_proto_server_proto_rawDesc = []byte{ 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x13, 0x0a, 0x11, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x62, 0x52, 0x08, 0x6f, 0x6c, - 0x64, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x2c, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x62, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x37, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x53, 0x74, 0x75, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x41, 0x0a, 0x0f, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, - 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, - 0x73, 0x74, 0x65, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x22, 0x15, - 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x11, 0x50, 0x65, 0x65, - 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, - 0x0a, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, - 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x26, 0x0a, 0x0c, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x53, 0x74, 0x75, 0x62, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, + 0x2c, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, + 0x74, 0x75, 0x62, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x37, 0x0a, 0x09, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x62, 0x12, 0x12, + 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x0f, 0x50, 0x65, + 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, + 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x22, 0x12, 0x0a, + 0x10, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x44, 0x0a, 0x12, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x36, 0x0a, - 0x13, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, - 0x04, 0x70, 0x65, 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x65, 0x6e, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x61, 0x70, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x63, 0x61, 0x70, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x22, 0x2d, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, - 0x16, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe2, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0c, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, - 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x33, 0x0a, - 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x79, - 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, + 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x36, 0x0a, 0x11, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, + 0x65, 0x65, 0x72, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x50, 0x65, + 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x36, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, + 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x22, 0x98, + 0x01, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x61, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x63, + 0x61, 0x70, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x22, 0x2d, 0x0a, 0x13, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xe2, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x33, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6e, + 0x75, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, + 0x75, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, + 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x79, 0x6e, 0x63, - 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x1a, 0x4c, 0x0a, 0x04, 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x1a, 0x77, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x24, - 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x68, 0x69, 0x67, 0x68, - 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x34, 0x0a, 0x06, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x0c, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x26, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x55, - 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x02, 0x22, 0xe1, 0x02, - 0x0a, 0x0d, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2f, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, - 0x12, 0x32, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x05, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x2a, 0x0a, 0x03, 0x65, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x03, 0x65, 0x6f, 0x66, - 0x1a, 0x98, 0x01, 0x0a, 0x04, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x40, 0x0a, 0x07, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x65, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x6b, 0x73, 0x1a, 0x4c, + 0x0a, 0x04, 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x77, 0x0a, 0x07, + 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x22, 0x0a, + 0x0c, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x34, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xa2, 0x01, 0x0a, 0x11, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x70, 0x72, + 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x26, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x43, 0x50, 0x55, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x02, + 0x22, 0x2b, 0x0a, 0x11, 0x44, 0x65, 0x62, 0x75, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xdd, 0x02, + 0x0a, 0x11, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x48, 0x00, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x2a, 0x0a, 0x03, 0x65, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x03, 0x65, 0x6f, 0x66, 0x1a, 0x88, 0x01, 0x0a, + 0x04, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x44, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, + 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x1a, - 0x3a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x1b, 0x0a, 0x05, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x32, 0x8b, 0x04, 0x0a, 0x03, 0x42, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x05, 0x50, 0x70, 0x72, - 0x6f, 0x66, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x70, 0x72, 0x6f, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, - 0x3b, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, - 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0b, - 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x19, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x37, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, - 0x1c, 0x5a, 0x1a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6c, 0x69, - 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x1b, 0x0a, 0x05, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x32, 0xdd, 0x04, + 0x0a, 0x03, 0x42, 0x6f, 0x72, 0x12, 0x3b, 0x0a, 0x08, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, + 0x64, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x50, 0x65, 0x65, 0x72, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x50, 0x65, 0x65, 0x72, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x50, 0x65, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, + 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x12, 0x1a, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, + 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x65, 0x61, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x18, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x70, + 0x72, 0x6f, 0x66, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x62, 0x75, + 0x67, 0x50, 0x70, 0x72, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x1c, 0x5a, + 0x1a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1477,66 +1608,71 @@ func file_internal_cli_server_proto_server_proto_rawDescGZIP() []byte { } var file_internal_cli_server_proto_server_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_internal_cli_server_proto_server_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_internal_cli_server_proto_server_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_internal_cli_server_proto_server_proto_goTypes = []interface{}{ - (PprofRequest_Type)(0), // 0: proto.PprofRequest.Type - (*ChainWatchRequest)(nil), // 1: proto.ChainWatchRequest - (*ChainWatchResponse)(nil), // 2: proto.ChainWatchResponse - (*BlockStub)(nil), // 3: proto.BlockStub - (*PeersAddRequest)(nil), // 4: proto.PeersAddRequest - (*PeersAddResponse)(nil), // 5: proto.PeersAddResponse - (*PeersRemoveRequest)(nil), // 6: proto.PeersRemoveRequest - (*PeersRemoveResponse)(nil), // 7: proto.PeersRemoveResponse - (*PeersListRequest)(nil), // 8: proto.PeersListRequest - (*PeersListResponse)(nil), // 9: proto.PeersListResponse - (*PeersStatusRequest)(nil), // 10: proto.PeersStatusRequest - (*PeersStatusResponse)(nil), // 11: proto.PeersStatusResponse - (*Peer)(nil), // 12: proto.Peer - (*ChainSetHeadRequest)(nil), // 13: proto.ChainSetHeadRequest - (*ChainSetHeadResponse)(nil), // 14: proto.ChainSetHeadResponse - (*StatusResponse)(nil), // 15: proto.StatusResponse - (*Header)(nil), // 16: proto.Header - (*PprofRequest)(nil), // 17: proto.PprofRequest - (*PprofResponse)(nil), // 18: proto.PprofResponse - (*StatusResponse_Fork)(nil), // 19: proto.StatusResponse.Fork - (*StatusResponse_Syncing)(nil), // 20: proto.StatusResponse.Syncing - (*PprofResponse_Open)(nil), // 21: proto.PprofResponse.Open - (*PprofResponse_Input)(nil), // 22: proto.PprofResponse.Input - nil, // 23: proto.PprofResponse.Open.HeadersEntry - (*emptypb.Empty)(nil), // 24: google.protobuf.Empty + (DebugPprofRequest_Type)(0), // 0: proto.DebugPprofRequest.Type + (*TraceRequest)(nil), // 1: proto.TraceRequest + (*TraceResponse)(nil), // 2: proto.TraceResponse + (*ChainWatchRequest)(nil), // 3: proto.ChainWatchRequest + (*ChainWatchResponse)(nil), // 4: proto.ChainWatchResponse + (*BlockStub)(nil), // 5: proto.BlockStub + (*PeersAddRequest)(nil), // 6: proto.PeersAddRequest + (*PeersAddResponse)(nil), // 7: proto.PeersAddResponse + (*PeersRemoveRequest)(nil), // 8: proto.PeersRemoveRequest + (*PeersRemoveResponse)(nil), // 9: proto.PeersRemoveResponse + (*PeersListRequest)(nil), // 10: proto.PeersListRequest + (*PeersListResponse)(nil), // 11: proto.PeersListResponse + (*PeersStatusRequest)(nil), // 12: proto.PeersStatusRequest + (*PeersStatusResponse)(nil), // 13: proto.PeersStatusResponse + (*Peer)(nil), // 14: proto.Peer + (*ChainSetHeadRequest)(nil), // 15: proto.ChainSetHeadRequest + (*ChainSetHeadResponse)(nil), // 16: proto.ChainSetHeadResponse + (*StatusResponse)(nil), // 17: proto.StatusResponse + (*Header)(nil), // 18: proto.Header + (*DebugPprofRequest)(nil), // 19: proto.DebugPprofRequest + (*DebugBlockRequest)(nil), // 20: proto.DebugBlockRequest + (*DebugFileResponse)(nil), // 21: proto.DebugFileResponse + (*StatusResponse_Fork)(nil), // 22: proto.StatusResponse.Fork + (*StatusResponse_Syncing)(nil), // 23: proto.StatusResponse.Syncing + (*DebugFileResponse_Open)(nil), // 24: proto.DebugFileResponse.Open + (*DebugFileResponse_Input)(nil), // 25: proto.DebugFileResponse.Input + nil, // 26: proto.DebugFileResponse.Open.HeadersEntry + (*emptypb.Empty)(nil), // 27: google.protobuf.Empty } var file_internal_cli_server_proto_server_proto_depIdxs = []int32{ - 3, // 0: proto.ChainWatchResponse.oldchain:type_name -> proto.BlockStub - 3, // 1: proto.ChainWatchResponse.newchain:type_name -> proto.BlockStub - 12, // 2: proto.PeersListResponse.peers:type_name -> proto.Peer - 12, // 3: proto.PeersStatusResponse.peer:type_name -> proto.Peer - 16, // 4: proto.StatusResponse.currentBlock:type_name -> proto.Header - 16, // 5: proto.StatusResponse.currentHeader:type_name -> proto.Header - 20, // 6: proto.StatusResponse.syncing:type_name -> proto.StatusResponse.Syncing - 19, // 7: proto.StatusResponse.forks:type_name -> proto.StatusResponse.Fork - 0, // 8: proto.PprofRequest.type:type_name -> proto.PprofRequest.Type - 21, // 9: proto.PprofResponse.open:type_name -> proto.PprofResponse.Open - 22, // 10: proto.PprofResponse.input:type_name -> proto.PprofResponse.Input - 24, // 11: proto.PprofResponse.eof:type_name -> google.protobuf.Empty - 23, // 12: proto.PprofResponse.Open.headers:type_name -> proto.PprofResponse.Open.HeadersEntry - 17, // 13: proto.Bor.Pprof:input_type -> proto.PprofRequest - 4, // 14: proto.Bor.PeersAdd:input_type -> proto.PeersAddRequest - 6, // 15: proto.Bor.PeersRemove:input_type -> proto.PeersRemoveRequest - 8, // 16: proto.Bor.PeersList:input_type -> proto.PeersListRequest - 10, // 17: proto.Bor.PeersStatus:input_type -> proto.PeersStatusRequest - 13, // 18: proto.Bor.ChainSetHead:input_type -> proto.ChainSetHeadRequest - 24, // 19: proto.Bor.Status:input_type -> google.protobuf.Empty - 1, // 20: proto.Bor.ChainWatch:input_type -> proto.ChainWatchRequest - 18, // 21: proto.Bor.Pprof:output_type -> proto.PprofResponse - 5, // 22: proto.Bor.PeersAdd:output_type -> proto.PeersAddResponse - 7, // 23: proto.Bor.PeersRemove:output_type -> proto.PeersRemoveResponse - 9, // 24: proto.Bor.PeersList:output_type -> proto.PeersListResponse - 11, // 25: proto.Bor.PeersStatus:output_type -> proto.PeersStatusResponse - 14, // 26: proto.Bor.ChainSetHead:output_type -> proto.ChainSetHeadResponse - 15, // 27: proto.Bor.Status:output_type -> proto.StatusResponse - 2, // 28: proto.Bor.ChainWatch:output_type -> proto.ChainWatchResponse - 21, // [21:29] is the sub-list for method output_type - 13, // [13:21] is the sub-list for method input_type + 5, // 0: proto.ChainWatchResponse.oldchain:type_name -> proto.BlockStub + 5, // 1: proto.ChainWatchResponse.newchain:type_name -> proto.BlockStub + 14, // 2: proto.PeersListResponse.peers:type_name -> proto.Peer + 14, // 3: proto.PeersStatusResponse.peer:type_name -> proto.Peer + 18, // 4: proto.StatusResponse.currentBlock:type_name -> proto.Header + 18, // 5: proto.StatusResponse.currentHeader:type_name -> proto.Header + 23, // 6: proto.StatusResponse.syncing:type_name -> proto.StatusResponse.Syncing + 22, // 7: proto.StatusResponse.forks:type_name -> proto.StatusResponse.Fork + 0, // 8: proto.DebugPprofRequest.type:type_name -> proto.DebugPprofRequest.Type + 24, // 9: proto.DebugFileResponse.open:type_name -> proto.DebugFileResponse.Open + 25, // 10: proto.DebugFileResponse.input:type_name -> proto.DebugFileResponse.Input + 27, // 11: proto.DebugFileResponse.eof:type_name -> google.protobuf.Empty + 26, // 12: proto.DebugFileResponse.Open.headers:type_name -> proto.DebugFileResponse.Open.HeadersEntry + 6, // 13: proto.Bor.PeersAdd:input_type -> proto.PeersAddRequest + 8, // 14: proto.Bor.PeersRemove:input_type -> proto.PeersRemoveRequest + 10, // 15: proto.Bor.PeersList:input_type -> proto.PeersListRequest + 12, // 16: proto.Bor.PeersStatus:input_type -> proto.PeersStatusRequest + 15, // 17: proto.Bor.ChainSetHead:input_type -> proto.ChainSetHeadRequest + 27, // 18: proto.Bor.Status:input_type -> google.protobuf.Empty + 3, // 19: proto.Bor.ChainWatch:input_type -> proto.ChainWatchRequest + 19, // 20: proto.Bor.DebugPprof:input_type -> proto.DebugPprofRequest + 20, // 21: proto.Bor.DebugBlock:input_type -> proto.DebugBlockRequest + 7, // 22: proto.Bor.PeersAdd:output_type -> proto.PeersAddResponse + 9, // 23: proto.Bor.PeersRemove:output_type -> proto.PeersRemoveResponse + 11, // 24: proto.Bor.PeersList:output_type -> proto.PeersListResponse + 13, // 25: proto.Bor.PeersStatus:output_type -> proto.PeersStatusResponse + 16, // 26: proto.Bor.ChainSetHead:output_type -> proto.ChainSetHeadResponse + 17, // 27: proto.Bor.Status:output_type -> proto.StatusResponse + 4, // 28: proto.Bor.ChainWatch:output_type -> proto.ChainWatchResponse + 21, // 29: proto.Bor.DebugPprof:output_type -> proto.DebugFileResponse + 21, // 30: proto.Bor.DebugBlock:output_type -> proto.DebugFileResponse + 22, // [22:31] is the sub-list for method output_type + 13, // [13:22] is the sub-list for method input_type 13, // [13:13] is the sub-list for extension type_name 13, // [13:13] is the sub-list for extension extendee 0, // [0:13] is the sub-list for field type_name @@ -1549,7 +1685,7 @@ func file_internal_cli_server_proto_server_proto_init() { } if !protoimpl.UnsafeEnabled { file_internal_cli_server_proto_server_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainWatchRequest); i { + switch v := v.(*TraceRequest); i { case 0: return &v.state case 1: @@ -1561,7 +1697,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainWatchResponse); i { + switch v := v.(*TraceResponse); i { case 0: return &v.state case 1: @@ -1573,7 +1709,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockStub); i { + switch v := v.(*ChainWatchRequest); i { case 0: return &v.state case 1: @@ -1585,7 +1721,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeersAddRequest); i { + switch v := v.(*ChainWatchResponse); i { case 0: return &v.state case 1: @@ -1597,7 +1733,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeersAddResponse); i { + switch v := v.(*BlockStub); i { case 0: return &v.state case 1: @@ -1609,7 +1745,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeersRemoveRequest); i { + switch v := v.(*PeersAddRequest); i { case 0: return &v.state case 1: @@ -1621,7 +1757,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeersRemoveResponse); i { + switch v := v.(*PeersAddResponse); i { case 0: return &v.state case 1: @@ -1633,7 +1769,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeersListRequest); i { + switch v := v.(*PeersRemoveRequest); i { case 0: return &v.state case 1: @@ -1645,7 +1781,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeersListResponse); i { + switch v := v.(*PeersRemoveResponse); i { case 0: return &v.state case 1: @@ -1657,7 +1793,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeersStatusRequest); i { + switch v := v.(*PeersListRequest); i { case 0: return &v.state case 1: @@ -1669,7 +1805,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeersStatusResponse); i { + switch v := v.(*PeersListResponse); i { case 0: return &v.state case 1: @@ -1681,7 +1817,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Peer); i { + switch v := v.(*PeersStatusRequest); i { case 0: return &v.state case 1: @@ -1693,7 +1829,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainSetHeadRequest); i { + switch v := v.(*PeersStatusResponse); i { case 0: return &v.state case 1: @@ -1705,7 +1841,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainSetHeadResponse); i { + switch v := v.(*Peer); i { case 0: return &v.state case 1: @@ -1717,7 +1853,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusResponse); i { + switch v := v.(*ChainSetHeadRequest); i { case 0: return &v.state case 1: @@ -1729,7 +1865,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Header); i { + switch v := v.(*ChainSetHeadResponse); i { case 0: return &v.state case 1: @@ -1741,7 +1877,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PprofRequest); i { + switch v := v.(*StatusResponse); i { case 0: return &v.state case 1: @@ -1753,7 +1889,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PprofResponse); i { + switch v := v.(*Header); i { case 0: return &v.state case 1: @@ -1765,7 +1901,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusResponse_Fork); i { + switch v := v.(*DebugPprofRequest); i { case 0: return &v.state case 1: @@ -1777,7 +1913,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusResponse_Syncing); i { + switch v := v.(*DebugBlockRequest); i { case 0: return &v.state case 1: @@ -1789,7 +1925,7 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PprofResponse_Open); i { + switch v := v.(*DebugFileResponse); i { case 0: return &v.state case 1: @@ -1801,7 +1937,43 @@ func file_internal_cli_server_proto_server_proto_init() { } } file_internal_cli_server_proto_server_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PprofResponse_Input); i { + switch v := v.(*StatusResponse_Fork); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internal_cli_server_proto_server_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusResponse_Syncing); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internal_cli_server_proto_server_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DebugFileResponse_Open); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internal_cli_server_proto_server_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DebugFileResponse_Input); i { case 0: return &v.state case 1: @@ -1813,10 +1985,10 @@ func file_internal_cli_server_proto_server_proto_init() { } } } - file_internal_cli_server_proto_server_proto_msgTypes[17].OneofWrappers = []interface{}{ - (*PprofResponse_Open_)(nil), - (*PprofResponse_Input_)(nil), - (*PprofResponse_Eof)(nil), + file_internal_cli_server_proto_server_proto_msgTypes[20].OneofWrappers = []interface{}{ + (*DebugFileResponse_Open_)(nil), + (*DebugFileResponse_Input_)(nil), + (*DebugFileResponse_Eof)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -1824,7 +1996,7 @@ func file_internal_cli_server_proto_server_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_internal_cli_server_proto_server_proto_rawDesc, NumEnums: 1, - NumMessages: 23, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/internal/cli/server/proto/server.proto b/internal/cli/server/proto/server.proto index 7259e7dacb..1520ab6536 100644 --- a/internal/cli/server/proto/server.proto +++ b/internal/cli/server/proto/server.proto @@ -7,8 +7,6 @@ import "google/protobuf/empty.proto"; option go_package = "/internal/cli/server/proto"; service Bor { - rpc Pprof(PprofRequest) returns (stream PprofResponse); - rpc PeersAdd(PeersAddRequest) returns (PeersAddResponse); rpc PeersRemove(PeersRemoveRequest) returns (PeersRemoveResponse); @@ -20,8 +18,20 @@ service Bor { rpc ChainSetHead(ChainSetHeadRequest) returns (ChainSetHeadResponse); rpc Status(google.protobuf.Empty) returns (StatusResponse); - + rpc ChainWatch(ChainWatchRequest) returns (stream ChainWatchResponse); + + rpc DebugPprof(DebugPprofRequest) returns (stream DebugFileResponse); + + rpc DebugBlock(DebugBlockRequest) returns (stream DebugFileResponse); +} + +message TraceRequest { + int64 number = 1; +} + +message TraceResponse { + } message ChainWatchRequest { @@ -113,7 +123,7 @@ message Header { uint64 number = 2; } -message PprofRequest { +message DebugPprofRequest { Type type = 1; string profile = 2; @@ -127,7 +137,11 @@ message PprofRequest { } } -message PprofResponse { +message DebugBlockRequest { + int64 number = 1; +} + +message DebugFileResponse { oneof event { Open open = 1; Input input = 2; @@ -136,7 +150,6 @@ message PprofResponse { message Open { map headers = 1; - int64 size = 2; } message Input { diff --git a/internal/cli/server/proto/server_grpc.pb.go b/internal/cli/server/proto/server_grpc.pb.go index b3a6244c18..63f1fa6187 100644 --- a/internal/cli/server/proto/server_grpc.pb.go +++ b/internal/cli/server/proto/server_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.19.3 +// source: internal/cli/server/proto/server.proto package proto @@ -19,7 +23,6 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type BorClient interface { - Pprof(ctx context.Context, in *PprofRequest, opts ...grpc.CallOption) (Bor_PprofClient, error) PeersAdd(ctx context.Context, in *PeersAddRequest, opts ...grpc.CallOption) (*PeersAddResponse, error) PeersRemove(ctx context.Context, in *PeersRemoveRequest, opts ...grpc.CallOption) (*PeersRemoveResponse, error) PeersList(ctx context.Context, in *PeersListRequest, opts ...grpc.CallOption) (*PeersListResponse, error) @@ -27,6 +30,8 @@ type BorClient interface { ChainSetHead(ctx context.Context, in *ChainSetHeadRequest, opts ...grpc.CallOption) (*ChainSetHeadResponse, error) Status(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*StatusResponse, error) ChainWatch(ctx context.Context, in *ChainWatchRequest, opts ...grpc.CallOption) (Bor_ChainWatchClient, error) + DebugPprof(ctx context.Context, in *DebugPprofRequest, opts ...grpc.CallOption) (Bor_DebugPprofClient, error) + DebugBlock(ctx context.Context, in *DebugBlockRequest, opts ...grpc.CallOption) (Bor_DebugBlockClient, error) } type borClient struct { @@ -37,38 +42,6 @@ func NewBorClient(cc grpc.ClientConnInterface) BorClient { return &borClient{cc} } -func (c *borClient) Pprof(ctx context.Context, in *PprofRequest, opts ...grpc.CallOption) (Bor_PprofClient, error) { - stream, err := c.cc.NewStream(ctx, &Bor_ServiceDesc.Streams[0], "/proto.Bor/Pprof", opts...) - if err != nil { - return nil, err - } - x := &borPprofClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Bor_PprofClient interface { - Recv() (*PprofResponse, error) - grpc.ClientStream -} - -type borPprofClient struct { - grpc.ClientStream -} - -func (x *borPprofClient) Recv() (*PprofResponse, error) { - m := new(PprofResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - func (c *borClient) PeersAdd(ctx context.Context, in *PeersAddRequest, opts ...grpc.CallOption) (*PeersAddResponse, error) { out := new(PeersAddResponse) err := c.cc.Invoke(ctx, "/proto.Bor/PeersAdd", in, out, opts...) @@ -124,7 +97,7 @@ func (c *borClient) Status(ctx context.Context, in *emptypb.Empty, opts ...grpc. } func (c *borClient) ChainWatch(ctx context.Context, in *ChainWatchRequest, opts ...grpc.CallOption) (Bor_ChainWatchClient, error) { - stream, err := c.cc.NewStream(ctx, &Bor_ServiceDesc.Streams[1], "/proto.Bor/ChainWatch", opts...) + stream, err := c.cc.NewStream(ctx, &Bor_ServiceDesc.Streams[0], "/proto.Bor/ChainWatch", opts...) if err != nil { return nil, err } @@ -155,11 +128,74 @@ func (x *borChainWatchClient) Recv() (*ChainWatchResponse, error) { return m, nil } +func (c *borClient) DebugPprof(ctx context.Context, in *DebugPprofRequest, opts ...grpc.CallOption) (Bor_DebugPprofClient, error) { + stream, err := c.cc.NewStream(ctx, &Bor_ServiceDesc.Streams[1], "/proto.Bor/DebugPprof", opts...) + if err != nil { + return nil, err + } + x := &borDebugPprofClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Bor_DebugPprofClient interface { + Recv() (*DebugFileResponse, error) + grpc.ClientStream +} + +type borDebugPprofClient struct { + grpc.ClientStream +} + +func (x *borDebugPprofClient) Recv() (*DebugFileResponse, error) { + m := new(DebugFileResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *borClient) DebugBlock(ctx context.Context, in *DebugBlockRequest, opts ...grpc.CallOption) (Bor_DebugBlockClient, error) { + stream, err := c.cc.NewStream(ctx, &Bor_ServiceDesc.Streams[2], "/proto.Bor/DebugBlock", opts...) + if err != nil { + return nil, err + } + x := &borDebugBlockClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Bor_DebugBlockClient interface { + Recv() (*DebugFileResponse, error) + grpc.ClientStream +} + +type borDebugBlockClient struct { + grpc.ClientStream +} + +func (x *borDebugBlockClient) Recv() (*DebugFileResponse, error) { + m := new(DebugFileResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // BorServer is the server API for Bor service. // All implementations must embed UnimplementedBorServer // for forward compatibility type BorServer interface { - Pprof(*PprofRequest, Bor_PprofServer) error PeersAdd(context.Context, *PeersAddRequest) (*PeersAddResponse, error) PeersRemove(context.Context, *PeersRemoveRequest) (*PeersRemoveResponse, error) PeersList(context.Context, *PeersListRequest) (*PeersListResponse, error) @@ -167,6 +203,8 @@ type BorServer interface { ChainSetHead(context.Context, *ChainSetHeadRequest) (*ChainSetHeadResponse, error) Status(context.Context, *emptypb.Empty) (*StatusResponse, error) ChainWatch(*ChainWatchRequest, Bor_ChainWatchServer) error + DebugPprof(*DebugPprofRequest, Bor_DebugPprofServer) error + DebugBlock(*DebugBlockRequest, Bor_DebugBlockServer) error mustEmbedUnimplementedBorServer() } @@ -174,9 +212,6 @@ type BorServer interface { type UnimplementedBorServer struct { } -func (UnimplementedBorServer) Pprof(*PprofRequest, Bor_PprofServer) error { - return status.Errorf(codes.Unimplemented, "method Pprof not implemented") -} func (UnimplementedBorServer) PeersAdd(context.Context, *PeersAddRequest) (*PeersAddResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PeersAdd not implemented") } @@ -198,6 +233,12 @@ func (UnimplementedBorServer) Status(context.Context, *emptypb.Empty) (*StatusRe func (UnimplementedBorServer) ChainWatch(*ChainWatchRequest, Bor_ChainWatchServer) error { return status.Errorf(codes.Unimplemented, "method ChainWatch not implemented") } +func (UnimplementedBorServer) DebugPprof(*DebugPprofRequest, Bor_DebugPprofServer) error { + return status.Errorf(codes.Unimplemented, "method DebugPprof not implemented") +} +func (UnimplementedBorServer) DebugBlock(*DebugBlockRequest, Bor_DebugBlockServer) error { + return status.Errorf(codes.Unimplemented, "method DebugBlock not implemented") +} func (UnimplementedBorServer) mustEmbedUnimplementedBorServer() {} // UnsafeBorServer may be embedded to opt out of forward compatibility for this service. @@ -211,27 +252,6 @@ func RegisterBorServer(s grpc.ServiceRegistrar, srv BorServer) { s.RegisterService(&Bor_ServiceDesc, srv) } -func _Bor_Pprof_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(PprofRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(BorServer).Pprof(m, &borPprofServer{stream}) -} - -type Bor_PprofServer interface { - Send(*PprofResponse) error - grpc.ServerStream -} - -type borPprofServer struct { - grpc.ServerStream -} - -func (x *borPprofServer) Send(m *PprofResponse) error { - return x.ServerStream.SendMsg(m) -} - func _Bor_PeersAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PeersAddRequest) if err := dec(in); err != nil { @@ -361,6 +381,48 @@ func (x *borChainWatchServer) Send(m *ChainWatchResponse) error { return x.ServerStream.SendMsg(m) } +func _Bor_DebugPprof_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(DebugPprofRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(BorServer).DebugPprof(m, &borDebugPprofServer{stream}) +} + +type Bor_DebugPprofServer interface { + Send(*DebugFileResponse) error + grpc.ServerStream +} + +type borDebugPprofServer struct { + grpc.ServerStream +} + +func (x *borDebugPprofServer) Send(m *DebugFileResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _Bor_DebugBlock_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(DebugBlockRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(BorServer).DebugBlock(m, &borDebugBlockServer{stream}) +} + +type Bor_DebugBlockServer interface { + Send(*DebugFileResponse) error + grpc.ServerStream +} + +type borDebugBlockServer struct { + grpc.ServerStream +} + +func (x *borDebugBlockServer) Send(m *DebugFileResponse) error { + return x.ServerStream.SendMsg(m) +} + // Bor_ServiceDesc is the grpc.ServiceDesc for Bor service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -395,13 +457,18 @@ var Bor_ServiceDesc = grpc.ServiceDesc{ }, Streams: []grpc.StreamDesc{ { - StreamName: "Pprof", - Handler: _Bor_Pprof_Handler, + StreamName: "ChainWatch", + Handler: _Bor_ChainWatch_Handler, ServerStreams: true, }, { - StreamName: "ChainWatch", - Handler: _Bor_ChainWatch_Handler, + StreamName: "DebugPprof", + Handler: _Bor_DebugPprof_Handler, + ServerStreams: true, + }, + { + StreamName: "DebugBlock", + Handler: _Bor_DebugBlock_Handler, ServerStreams: true, }, }, diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index 371e588d02..3d0b55e094 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "math/big" "net" "net/http" "os" @@ -43,6 +44,9 @@ type Server struct { grpcServer *grpc.Server tracer *sdktrace.TracerProvider config *Config + + // tracerAPI to trace block executions + tracerAPI *tracers.API } func NewServer(config *Config) (*Server, error) { @@ -162,6 +166,7 @@ func NewServer(config *Config) (*Server, error) { // debug tracing is enabled by default stack.RegisterAPIs(tracers.APIs(srv.backend.APIBackend)) + srv.tracerAPI = tracers.NewAPI(srv.backend.APIBackend) // graphql is started from another place if config.JsonRPC.Graphql.Enabled { @@ -200,6 +205,7 @@ func NewServer(config *Config) (*Server, error) { func (s *Server) Stop() { s.node.Close() + s.grpcServer.Stop() // shutdown the tracer if s.tracer != nil { @@ -354,3 +360,11 @@ func setupLogger(logLevel string) { } log.Root().SetHandler(glogger) } + +func (s *Server) GetLatestBlockNumber() *big.Int { + return s.backend.BlockChain().CurrentBlock().Number() +} + +func (s *Server) GetGrpcAddr() string { + return s.config.GRPC.Addr[1:] +} diff --git a/internal/cli/server/server_test.go b/internal/cli/server/server_test.go index 070739c687..a0b6dee2e3 100644 --- a/internal/cli/server/server_test.go +++ b/internal/cli/server/server_test.go @@ -1,14 +1,33 @@ package server import ( + "fmt" + "net" + "sync/atomic" "testing" "time" + "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/assert" ) -func TestServer_DeveloperMode(t *testing.T) { +var initialPort uint64 = 61000 + +// nextPort gives the next available port starting from 60000 +func nextPort() uint64 { + log.Info("Checking for new port", "current", initialPort) + port := atomic.AddUint64(&initialPort, 1) + addr := fmt.Sprintf("localhost:%d", port) + lis, err := net.Listen("tcp", addr) + if err == nil { + lis.Close() + return port + } else { + return nextPort() + } +} +func TestServer_DeveloperMode(t *testing.T) { // get the default config config := DefaultConfig() @@ -16,17 +35,16 @@ func TestServer_DeveloperMode(t *testing.T) { config.Developer.Enabled = true config.Developer.Period = 2 // block time - // start the server - server, err1 := NewServer(config) - if err1 != nil { - t.Fatalf("failed to start server: %v", err1) - } + // start the mock server + server, err := CreateMockServer(config) + assert.NoError(t, err) + defer CloseMockServer(server) // record the initial block number blockNumber := server.backend.BlockChain().CurrentBlock().Header().Number.Int64() var i int64 = 0 - for i = 0; i < 10; i++ { + for i = 0; i < 3; i++ { // We expect the node to mine blocks every `config.Developer.Period` time period time.Sleep(time.Duration(config.Developer.Period) * time.Second) currBlock := server.backend.BlockChain().CurrentBlock().Header().Number.Int64() @@ -35,7 +53,4 @@ func TestServer_DeveloperMode(t *testing.T) { break } } - - // stop the server - server.Stop() } diff --git a/internal/cli/server/service.go b/internal/cli/server/service.go index e8e3928581..304b61b7d0 100644 --- a/internal/cli/server/service.go +++ b/internal/cli/server/service.go @@ -2,6 +2,7 @@ package server import ( "context" + "encoding/json" "fmt" "math/big" "reflect" @@ -9,6 +10,8 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/tracers" + "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum/go-ethereum/internal/cli/server/pprof" "github.com/ethereum/go-ethereum/internal/cli/server/proto" "github.com/ethereum/go-ethereum/p2p" @@ -18,30 +21,14 @@ import ( grpc_net_conn "github.com/mitchellh/go-grpc-net-conn" ) -func (s *Server) Pprof(req *proto.PprofRequest, stream proto.Bor_PprofServer) error { - var payload []byte - var headers map[string]string - var err error - - ctx := context.Background() - switch req.Type { - case proto.PprofRequest_CPU: - payload, headers, err = pprof.CPUProfile(ctx, int(req.Seconds)) - case proto.PprofRequest_TRACE: - payload, headers, err = pprof.Trace(ctx, int(req.Seconds)) - case proto.PprofRequest_LOOKUP: - payload, headers, err = pprof.Profile(req.Profile, 0, 0) - } - if err != nil { - return err - } +const chunkSize = 1024 * 1024 * 1024 +func sendStreamDebugFile(stream proto.Bor_DebugPprofServer, headers map[string]string, data []byte) error { // open the stream and send the headers - err = stream.Send(&proto.PprofResponse{ - Event: &proto.PprofResponse_Open_{ - Open: &proto.PprofResponse_Open{ + err := stream.Send(&proto.DebugFileResponse{ + Event: &proto.DebugFileResponse_Open_{ + Open: &proto.DebugFileResponse_Open{ Headers: headers, - Size: int64(len(payload)), }, }, }) @@ -50,24 +37,51 @@ func (s *Server) Pprof(req *proto.PprofRequest, stream proto.Bor_PprofServer) er } // Wrap our conn around the response. + encoder := grpc_net_conn.SimpleEncoder(func(msg gproto.Message) *[]byte { + return &msg.(*proto.DebugFileResponse_Input).Data + }) conn := &grpc_net_conn.Conn{ Stream: stream, - Request: &proto.PprofResponse_Input{}, - Encode: grpc_net_conn.SimpleEncoder(func(msg gproto.Message) *[]byte { - return &msg.(*proto.PprofResponse_Input).Data - }), + Request: &proto.DebugFileResponse_Input{}, + Encode: grpc_net_conn.ChunkedEncoder(encoder, chunkSize), } - if _, err := conn.Write(payload); err != nil { + if _, err := conn.Write(data); err != nil { return err } // send the eof - err = stream.Send(&proto.PprofResponse{ - Event: &proto.PprofResponse_Eof{}, + err = stream.Send(&proto.DebugFileResponse{ + Event: &proto.DebugFileResponse_Eof{}, }) if err != nil { return err } + + return nil +} + +func (s *Server) DebugPprof(req *proto.DebugPprofRequest, stream proto.Bor_DebugPprofServer) error { + var payload []byte + var headers map[string]string + var err error + + ctx := context.Background() + switch req.Type { + case proto.DebugPprofRequest_CPU: + payload, headers, err = pprof.CPUProfile(ctx, int(req.Seconds)) + case proto.DebugPprofRequest_TRACE: + payload, headers, err = pprof.Trace(ctx, int(req.Seconds)) + case proto.DebugPprofRequest_LOOKUP: + payload, headers, err = pprof.Profile(req.Profile, 0, 0) + } + if err != nil { + return err + } + + // send the file on a grpc stream + if err := sendStreamDebugFile(stream, headers, payload); err != nil { + return err + } return nil } @@ -169,6 +183,32 @@ func headerToProtoHeader(h *types.Header) *proto.Header { } } +func (s *Server) DebugBlock(req *proto.DebugBlockRequest, stream proto.Bor_DebugBlockServer) error { + traceReq := &tracers.TraceBlockRequest{ + Number: req.Number, + Config: &tracers.TraceConfig{ + Config: &logger.Config{ + EnableMemory: true, + }, + }, + } + res, err := s.tracerAPI.TraceBorBlock(traceReq) + if err != nil { + return err + } + + // this is memory heavy + data, err := json.Marshal(res) + if err != nil { + return err + } + if err := sendStreamDebugFile(stream, map[string]string{}, data); err != nil { + return err + } + + return nil +} + var bigIntT = reflect.TypeOf(new(big.Int)).Kind() // gatherForks gathers all the fork numbers via reflection From c3a0c20303008b95a525d8382460ae2e967386af Mon Sep 17 00:00:00 2001 From: Sandeep Sreenath Date: Wed, 8 Jun 2022 15:09:42 +0530 Subject: [PATCH 129/190] Create stale.yml --- .github/workflows/stale.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000000..5d5d221eb3 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,31 @@ +# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. +# +# You can adjust the behavior by modifying this file. +# For more information, see: +# https://github.com/actions/stale +name: Mark stale issues and pull requests + +on: + schedule: + - cron: '0 0 * * *' + +jobs: + stale: + + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + + steps: + - uses: actions/stale@v5 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: 'This issue is stale because it has been open 14 days with no activity. Remove stale label or comment or this will be closed in 14 days.' + stale-pr-message: 'This PR is stale because it has been open 21 days with no activity. Remove stale label or comment or this will be closed in 14 days.' + close-issue-message: 'This issue was closed because it has been stalled for 28 days with no activity.' + close-pr-message: 'This PR was closed because it has been stalled for 35 days with no activity.' + days-before-issue-stale: 14 + days-before-pr-stale: 21 + days-before-issue-close: 14 + days-before-pr-close: 14 From 9c8bf51f578e4736854937eb903dd82c7d2f0432 Mon Sep 17 00:00:00 2001 From: Evgeny Danilenko <6655321@bk.ru> Date: Wed, 8 Jun 2022 16:39:30 +0300 Subject: [PATCH 130/190] Prepare Bor package for testing (#416) * Limit state sync by gas * Added logging for state-sync total gas usage * Added number of event-records in log * Minor Changes * Minor Fix * Adding individual gasUsed * Minor Fix * it works * fix tests * log wiggle and delay with block number * log delays as numbers * linters * fix tests * restore linters for the project * fix linters * fix * fix * fix * linters * generation * fix tests * remove heimdall wrapper response * linters * remove possible collisions * remove possible collisions * remove possible collisions * tests for unique address generation * generalize set * bor miner tests got restored * fixes after CR * final step and mining test * fix * fix e2e * more tests for Heimdall requests * fix linters Co-authored-by: Ferran Co-authored-by: Shivam Sharma --- .golangci.yml | 3 +- Makefile | 20 +- cmd/clidoc/main.go | 12 +- common/debug/debug.go | 28 ++ common/set/slice.go | 11 + consensus/bor/abi/interface.go | 6 + consensus/bor/api.go | 7 +- consensus/bor/api/caller.go | 14 + consensus/bor/api/caller_mock.go | 53 +++ consensus/bor/bor.go | 416 +++++-------------- consensus/bor/{ => clerk}/clerk.go | 9 +- consensus/bor/contract/client.go | 133 ++++++ consensus/bor/errors.go | 35 +- consensus/bor/genesis.go | 16 + consensus/bor/genesis_contract_mock.go | 69 +++ consensus/bor/genesis_contracts_client.go | 113 ----- consensus/bor/heimdall.go | 13 + consensus/bor/heimdall/client.go | 222 ++++++++++ consensus/bor/heimdall/client_test.go | 35 ++ consensus/bor/heimdall/span/span.go | 20 + consensus/bor/heimdall/span/spanner.go | 200 +++++++++ consensus/bor/rest.go | 177 -------- consensus/bor/snapshot.go | 22 +- consensus/bor/snapshot_test.go | 83 +++- consensus/bor/span.go | 25 +- consensus/bor/span_mock.go | 84 ++++ consensus/bor/statefull/processor.go | 93 +++++ consensus/bor/validators_getter.go | 11 + consensus/bor/validators_getter_mock.go | 51 +++ consensus/bor/valset/error.go | 32 ++ consensus/bor/{ => valset}/validator.go | 3 +- consensus/bor/{ => valset}/validator_set.go | 10 +- consensus/merger.go | 2 + core/bench_test.go | 3 +- core/blockchain.go | 9 +- core/blockchain_reader.go | 16 + core/blockchain_test.go | 2 +- core/chain_makers.go | 16 +- core/state_processor_test.go | 5 +- core/{ => tests}/blockchain_repair_test.go | 136 +++++- core/{ => tests}/blockchain_sethead_test.go | 49 ++- core/{ => tests}/blockchain_snapshot_test.go | 95 +++-- eth/backend.go | 14 +- eth/ethconfig/config.go | 8 +- eth/tracers/api_bor.go | 7 + go.mod | 79 +++- go.sum | 75 +--- internal/cli/flagset/flagset.go | 21 +- internal/cli/server/chains/chain.go | 11 +- internal/cli/server/chains/chain_test.go | 8 + internal/cli/server/command.go | 1 + internal/cli/server/config.go | 53 ++- internal/cli/server/config_test.go | 13 + internal/cli/server/helper.go | 17 +- internal/cli/server/server.go | 39 +- internal/cli/server/server_test.go | 6 + internal/cli/server/service.go | 21 +- miner/fake_miner.go | 233 +++++++++++ miner/miner_test.go | 204 ++++----- miner/unconfirmed_test.go | 7 + miner/worker.go | 4 + miner/worker_test.go | 163 ++++++-- params/config.go | 38 +- tests/bor/bor_test.go | 107 +++-- tests/bor/helper.go | 57 ++- tests/bor/mocks/IHeimdallClient.go | 125 +++--- tests/deps/fake.go | 7 + trie/hasher.go | 3 +- 68 files changed, 2508 insertions(+), 1172 deletions(-) create mode 100644 common/debug/debug.go create mode 100644 common/set/slice.go create mode 100644 consensus/bor/abi/interface.go create mode 100644 consensus/bor/api/caller.go create mode 100644 consensus/bor/api/caller_mock.go rename consensus/bor/{ => clerk}/clerk.go (85%) create mode 100644 consensus/bor/contract/client.go create mode 100644 consensus/bor/genesis.go create mode 100644 consensus/bor/genesis_contract_mock.go delete mode 100644 consensus/bor/genesis_contracts_client.go create mode 100644 consensus/bor/heimdall.go create mode 100644 consensus/bor/heimdall/client.go create mode 100644 consensus/bor/heimdall/client_test.go create mode 100644 consensus/bor/heimdall/span/span.go create mode 100644 consensus/bor/heimdall/span/spanner.go delete mode 100644 consensus/bor/rest.go create mode 100644 consensus/bor/span_mock.go create mode 100644 consensus/bor/statefull/processor.go create mode 100644 consensus/bor/validators_getter.go create mode 100644 consensus/bor/validators_getter_mock.go create mode 100644 consensus/bor/valset/error.go rename consensus/bor/{ => valset}/validator.go (99%) rename consensus/bor/{ => valset}/validator_set.go (99%) rename core/{ => tests}/blockchain_repair_test.go (93%) rename core/{ => tests}/blockchain_sethead_test.go (98%) rename core/{ => tests}/blockchain_snapshot_test.go (87%) create mode 100644 miner/fake_miner.go create mode 100644 tests/deps/fake.go diff --git a/.golangci.yml b/.golangci.yml index b063984061..89a9e328b8 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,6 +1,7 @@ # This file configures github.com/golangci/golangci-lint. run: + go: '1.18' timeout: 20m tests: true # default is true. Enables skipping of directories: @@ -183,4 +184,4 @@ issues: max-issues-per-linter: 0 max-same-issues: 0 #new: true - # new-from-rev: origin/master \ No newline at end of file + new-from-rev: origin/master \ No newline at end of file diff --git a/Makefile b/Makefile index 53b3cd9fdb..46ecdec886 100644 --- a/Makefile +++ b/Makefile @@ -65,9 +65,7 @@ escape: cd $(path) && go test -gcflags "-m -m" -run none -bench=BenchmarkJumpdest* -benchmem -memprofile mem.out lint: - @./build/bin/golangci-lint run --config ./.golangci.yml \ - internal/cli \ - consensus/bor + @./build/bin/golangci-lint run --config ./.golangci.yml lintci-deps: rm -f ./build/bin/golangci-lint @@ -87,16 +85,20 @@ clean: # You need to put $GOBIN (or $GOPATH/bin) in your PATH to use 'go generate'. devtools: - env GOBIN= go install golang.org/x/tools/cmd/stringer@latest - env GOBIN= go install github.com/kevinburke/go-bindata/go-bindata@latest - env GOBIN= go install github.com/fjl/gencodec@latest - env GOBIN= go install github.com/golang/protobuf/protoc-gen-go@latest - env GOBIN= go install ./cmd/abigen + # Notice! If you adding new binary - add it also to tests/deps/fake.go file + $(GOBUILD) -o $(GOBIN)/stringer github.com/golang.org/x/tools/cmd/stringer + $(GOBUILD) -o $(GOBIN)/go-bindata github.com/kevinburke/go-bindata/go-bindata + $(GOBUILD) -o $(GOBIN)/codecgen github.com/ugorji/go/codec/codecgen + $(GOBUILD) -o $(GOBIN)/abigen ./cmd/abigen + $(GOBUILD) -o $(GOBIN)/mockgen github.com/golang/mock/mockgen + $(GOBUILD) -o $(GOBIN)/protoc-gen-go github.com/golang/protobuf/protoc-gen-go + PATH=$(GOBIN):$(PATH) go generate ./common + PATH=$(GOBIN):$(PATH) go generate ./core/types + PATH=$(GOBIN):$(PATH) go generate ./consensus/bor @type "solc" 2> /dev/null || echo 'Please install solc' @type "protoc" 2> /dev/null || echo 'Please install protoc' # Cross Compilation Targets (xgo) - geth-cross: geth-linux geth-darwin geth-windows geth-android geth-ios @echo "Full cross compilation done:" @ls -ld $(GOBIN)/geth-* diff --git a/cmd/clidoc/main.go b/cmd/clidoc/main.go index 70ad35501b..07efc04556 100644 --- a/cmd/clidoc/main.go +++ b/cmd/clidoc/main.go @@ -17,7 +17,6 @@ const ( ) func main() { - commands := cli.Commands() dest := flag.String("d", DefaultDir, "Destination directory where the docs will be generated") @@ -35,10 +34,12 @@ func main() { keys := make([]string, len(commands)) i := 0 + for k := range commands { keys[i] = k i++ } + sort.Strings(keys) for _, name := range keys { @@ -60,12 +61,17 @@ func main() { func overwriteFile(filePath string, text string) { log.Printf("Writing to page: %s\n", filePath) + f, err := os.Create(filePath) if err != nil { log.Fatalln(err) } - f.WriteString(text) - if err := f.Close(); err != nil { + + if _, err = f.WriteString(text); err != nil { + log.Fatalln(err) + } + + if err = f.Close(); err != nil { log.Fatalln(err) } } diff --git a/common/debug/debug.go b/common/debug/debug.go new file mode 100644 index 0000000000..6a677e495d --- /dev/null +++ b/common/debug/debug.go @@ -0,0 +1,28 @@ +package debug + +import ( + "runtime" +) + +// Callers returns given number of callers with packages +func Callers(show int) []string { + fpcs := make([]uintptr, show) + + n := runtime.Callers(2, fpcs) + if n == 0 { + return nil + } + + callers := make([]string, 0, len(fpcs)) + + for _, p := range fpcs { + caller := runtime.FuncForPC(p - 1) + if caller == nil { + continue + } + + callers = append(callers, caller.Name()) + } + + return callers +} diff --git a/common/set/slice.go b/common/set/slice.go new file mode 100644 index 0000000000..36f11e67fe --- /dev/null +++ b/common/set/slice.go @@ -0,0 +1,11 @@ +package set + +func New[T comparable](slice []T) map[T]struct{} { + m := make(map[T]struct{}, len(slice)) + + for _, el := range slice { + m[el] = struct{}{} + } + + return m +} diff --git a/consensus/bor/abi/interface.go b/consensus/bor/abi/interface.go new file mode 100644 index 0000000000..bb05bf0b23 --- /dev/null +++ b/consensus/bor/abi/interface.go @@ -0,0 +1,6 @@ +package abi + +type ABI interface { + Pack(name string, args ...interface{}) ([]byte, error) + UnpackIntoInterface(v interface{}, name string, data []byte) error +} diff --git a/consensus/bor/api.go b/consensus/bor/api.go index 364fc448b8..26d1efdaf1 100644 --- a/consensus/bor/api.go +++ b/consensus/bor/api.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/bor/valset" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/rpc" @@ -206,10 +207,10 @@ func (api *API) GetCurrentProposer() (common.Address, error) { } // GetCurrentValidators gets the current validators -func (api *API) GetCurrentValidators() ([]*Validator, error) { +func (api *API) GetCurrentValidators() ([]*valset.Validator, error) { snap, err := api.GetSnapshot(nil) if err != nil { - return make([]*Validator, 0), err + return make([]*valset.Validator, 0), err } return snap.ValidatorSet.Validators, nil @@ -236,7 +237,7 @@ func (api *API) GetRootHash(start uint64, end uint64) (string, error) { currentHeaderNumber := api.chain.CurrentHeader().Number.Uint64() if start > end || end > currentHeaderNumber { - return "", &InvalidStartEndBlockError{start, end, currentHeaderNumber} + return "", &valset.InvalidStartEndBlockError{Start: start, End: end, CurrentHeader: currentHeaderNumber} } blockHeaders := make([]*types.Header, end-start+1) diff --git a/consensus/bor/api/caller.go b/consensus/bor/api/caller.go new file mode 100644 index 0000000000..d5fe259c97 --- /dev/null +++ b/consensus/bor/api/caller.go @@ -0,0 +1,14 @@ +package api + +import ( + "context" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/rpc" +) + +//go:generate mockgen -destination=./caller_mock.go -package=api . Caller +type Caller interface { + Call(ctx context.Context, args ethapi.TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *ethapi.StateOverride) (hexutil.Bytes, error) +} diff --git a/consensus/bor/api/caller_mock.go b/consensus/bor/api/caller_mock.go new file mode 100644 index 0000000000..940c99d178 --- /dev/null +++ b/consensus/bor/api/caller_mock.go @@ -0,0 +1,53 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ethereum/go-ethereum/consensus/bor/api (interfaces: Caller) + +// Package api is a generated GoMock package. +package api + +import ( + context "context" + reflect "reflect" + + hexutil "github.com/ethereum/go-ethereum/common/hexutil" + ethapi "github.com/ethereum/go-ethereum/internal/ethapi" + rpc "github.com/ethereum/go-ethereum/rpc" + gomock "github.com/golang/mock/gomock" +) + +// MockCaller is a mock of Caller interface. +type MockCaller struct { + ctrl *gomock.Controller + recorder *MockCallerMockRecorder +} + +// MockCallerMockRecorder is the mock recorder for MockCaller. +type MockCallerMockRecorder struct { + mock *MockCaller +} + +// NewMockCaller creates a new mock instance. +func NewMockCaller(ctrl *gomock.Controller) *MockCaller { + mock := &MockCaller{ctrl: ctrl} + mock.recorder = &MockCallerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockCaller) EXPECT() *MockCallerMockRecorder { + return m.recorder +} + +// Call mocks base method. +func (m *MockCaller) Call(arg0 context.Context, arg1 ethapi.TransactionArgs, arg2 rpc.BlockNumberOrHash, arg3 *ethapi.StateOverride) (hexutil.Bytes, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Call", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(hexutil.Bytes) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Call indicates an expected call of Call. +func (mr *MockCallerMockRecorder) Call(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Call", reflect.TypeOf((*MockCaller)(nil).Call), arg0, arg1, arg2, arg3) +} diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 9e43e67037..2f087af787 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -2,37 +2,34 @@ package bor import ( "bytes" - "context" "encoding/hex" "encoding/json" "errors" "fmt" "io" - "math" "math/big" "sort" "strconv" - "strings" "sync" "time" lru "github.com/hashicorp/golang-lru" "golang.org/x/crypto/sha3" - ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/bor/api" + "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" + "github.com/ethereum/go-ethereum/consensus/bor/statefull" + "github.com/ethereum/go-ethereum/consensus/bor/valset" "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" "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" - "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" @@ -56,7 +53,6 @@ var ( uncleHash = types.CalcUncleHash(nil) // Always Keccak256(RLP([])) as uncles are meaningless outside of PoW. validatorHeaderBytesLength = common.AddressLength + 20 // address + power - systemAddress = common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE") ) // Various error messages to mark blocks invalid. These should be private to @@ -100,9 +96,6 @@ var ( // errOutOfRangeChain is returned if an authorization list is attempted to // be modified via out-of-range or non-contiguous headers. errOutOfRangeChain = errors.New("out of range or non-contiguous chain") - - // errShutdownDetected is returned if a shutdown was detected - errShutdownDetected = errors.New("shutdown detected") ) // SignerFn is a signer callback function to request a header to be signed by a @@ -220,24 +213,25 @@ type Bor struct { signFn SignerFn // Signer function to authorize hashes with lock sync.RWMutex // Protects the signer fields - ethAPI *ethapi.PublicBlockChainAPI - GenesisContractsClient *GenesisContractsClient - validatorSetABI abi.ABI - stateReceiverABI abi.ABI + ethAPI api.Caller + spanner Spanner + GenesisContractsClient GenesisContract HeimdallClient IHeimdallClient - WithoutHeimdall bool // The fields below are for testing only fakeDiff bool // Skip difficulty verifications + + closeOnce sync.Once } // New creates a Matic Bor consensus engine. func New( chainConfig *params.ChainConfig, db ethdb.Database, - ethAPI *ethapi.PublicBlockChainAPI, - heimdallURL string, - withoutHeimdall bool, + ethAPI api.Caller, + spanner Spanner, + heimdallClient IHeimdallClient, + genesisContracts GenesisContract, ) *Bor { // get bor config borConfig := chainConfig.Bor @@ -246,14 +240,10 @@ func New( if borConfig != nil && borConfig.Sprint == 0 { borConfig.Sprint = defaultSprintLength } - // Allocate the snapshot caches and create the engine recents, _ := lru.NewARC(inmemorySnapshots) signatures, _ := lru.NewARC(inmemorySignatures) - vABI, _ := abi.JSON(strings.NewReader(validatorsetABI)) - sABI, _ := abi.JSON(strings.NewReader(stateReceiverABI)) - heimdallClient, _ := NewHeimdallClient(heimdallURL) - genesisContractsClient := NewGenesisContractsClient(chainConfig, borConfig.ValidatorContract, borConfig.StateReceiverContract, ethAPI) + c := &Bor{ chainConfig: chainConfig, config: borConfig, @@ -261,11 +251,9 @@ func New( ethAPI: ethAPI, recents: recents, signatures: signatures, - validatorSetABI: vABI, - stateReceiverABI: sABI, - GenesisContractsClient: genesisContractsClient, + spanner: spanner, + GenesisContractsClient: genesisContracts, HeimdallClient: heimdallClient, - WithoutHeimdall: withoutHeimdall, } // make sure we can decode all the GenesisAlloc in the BorConfig. @@ -332,7 +320,7 @@ func (c *Bor) verifyHeader(chain consensus.ChainHeaderReader, header *types.Head } // check extr adata - isSprintEnd := (number+1)%c.config.Sprint == 0 + isSprintEnd := IsSprintStart(number+1, c.config.Sprint) // Ensure that the extra-data contains a signer list on checkpoint, but none otherwise signersBytes := len(header.Extra) - extraVanity - extraSeal @@ -441,19 +429,18 @@ func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *t // Retrieve the snapshot needed to verify this header and cache it snap, err := c.snapshot(chain, number-1, header.ParentHash, parents) - if err != nil { return err } // verify the validator list in the last sprint block - if isSprintStart(number, c.config.Sprint) { + if IsSprintStart(number, c.config.Sprint) { parentValidatorBytes := parent.Extra[extraVanity : len(parent.Extra)-extraSeal] validatorsBytes := make([]byte, len(snap.ValidatorSet.Validators)*validatorHeaderBytesLength) currentValidators := snap.ValidatorSet.Copy().Validators // sort validator by address - sort.Sort(ValidatorsByAddress(currentValidators)) + sort.Sort(valset.ValidatorsByAddress(currentValidators)) for i, validator := range currentValidators { copy(validatorsBytes[i*validatorHeaderBytesLength:], validator.HeaderBytes()) @@ -487,7 +474,7 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co // If an on-disk checkpoint snapshot can be found, use that if number%checkpointInterval == 0 { - if s, err := loadSnapshot(c.config, c.signatures, c.db, hash, c.ethAPI); err == nil { + if s, err := loadSnapshot(c.config, c.signatures, c.db, hash); err == nil { log.Trace("Loaded snapshot from disk", "number", number, "hash", hash) snap = s @@ -509,13 +496,13 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co hash := checkpoint.Hash() // get validators and current span - validators, err := c.GetCurrentValidators(hash, number+1) + validators, err := c.spanner.GetCurrentValidators(hash, number+1) if err != nil { return nil, err } // new snap shot - snap = newSnapshot(c.config, c.signatures, number, hash, validators, c.ethAPI) + snap = newSnapshot(c.config, c.signatures, number, hash, validators) if err := snap.store(c.db); err != nil { return nil, err } @@ -674,14 +661,14 @@ func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header) e header.Extra = header.Extra[:extraVanity] // get validator set if number - if (number+1)%c.config.Sprint == 0 { - newValidators, err := c.GetCurrentValidators(header.ParentHash, number+1) + if IsSprintStart(number+1, c.config.Sprint) { + newValidators, err := c.spanner.GetCurrentValidators(header.ParentHash, number+1) if err != nil { return errors.New("unknown validators") } // sort validator by address - sort.Sort(ValidatorsByAddress(newValidators)) + sort.Sort(valset.ValidatorsByAddress(newValidators)) for _, validator := range newValidators { header.Extra = append(header.Extra, validator.HeaderBytes()...) @@ -727,14 +714,14 @@ func (c *Bor) Finalize(chain consensus.ChainHeaderReader, header *types.Header, headerNumber := header.Number.Uint64() if headerNumber%c.config.Sprint == 0 { - cx := chainContext{Chain: chain, Bor: c} + cx := statefull.ChainContext{Chain: chain, Bor: c} // check and commit span if err := c.checkAndCommitSpan(state, header, cx); err != nil { log.Error("Error while committing span", "error", err) return } - if !c.WithoutHeimdall { + if c.HeimdallClient != nil { // commit statees stateSyncData, err = c.CommitStates(state, header, cx) if err != nil { @@ -762,7 +749,6 @@ func decodeGenesisAlloc(i interface{}) (core.GenesisAlloc, error) { var alloc core.GenesisAlloc b, err := json.Marshal(i) - if err != nil { return nil, err } @@ -800,7 +786,7 @@ func (c *Bor) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *typ headerNumber := header.Number.Uint64() if headerNumber%c.config.Sprint == 0 { - cx := chainContext{Chain: chain, Bor: c} + cx := statefull.ChainContext{Chain: chain, Bor: c} // check and commit span err := c.checkAndCommitSpan(state, header, cx) @@ -809,7 +795,7 @@ func (c *Bor) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *typ return nil, err } - if !c.WithoutHeimdall { + if c.HeimdallClient != nil { // commit states stateSyncData, err = c.CommitStates(state, header, cx) if err != nil { @@ -832,7 +818,7 @@ func (c *Bor) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *typ block := types.NewBlock(header, txs, nil, receipts, new(trie.Trie)) // set state sync - bc := chain.(*core.BlockChain) + bc := chain.(core.BorStateSyncer) bc.SetStateSync(stateSyncData) // return the final block for sealing @@ -890,15 +876,13 @@ func (c *Bor) Seal(chain consensus.ChainHeaderReader, block *types.Block, result wiggle := time.Duration(successionNumber) * time.Duration(c.config.CalculateBackupMultiplier(number)) * time.Second // Sign all the things! - sighash, err := signFn(accounts.Account{Address: signer}, accounts.MimetypeBor, BorRLP(header, c.config)) + err = Sign(signFn, signer, header, c.config) if err != nil { return err } - copy(header.Extra[len(header.Extra)-extraSeal:], sighash) - // Wait until sealing is terminated or delay timeout. - log.Trace("Waiting for slot to sign and propagate", "delay", common.PrettyDuration(delay)) + log.Info("Waiting for slot to sign and propagate", "number", number, "hash", header.Hash, "delay-in-sec", uint(delay), "delay", common.PrettyDuration(delay)) go func() { select { @@ -910,6 +894,8 @@ func (c *Bor) Seal(chain consensus.ChainHeaderReader, block *types.Block, result log.Info( "Sealing out-of-turn", "number", number, + "hash", header.Hash, + "wiggle-in-sec", uint(wiggle), "wiggle", common.PrettyDuration(wiggle), "in-turn-signer", snap.ValidatorSet.GetProposer().Address.Hex(), ) @@ -932,6 +918,17 @@ func (c *Bor) Seal(chain consensus.ChainHeaderReader, block *types.Block, result return nil } +func Sign(signFn SignerFn, signer common.Address, header *types.Header, c *params.BorConfig) error { + sighash, err := signFn(accounts.Account{Address: signer}, accounts.MimetypeBor, BorRLP(header, c)) + if err != nil { + return err + } + + copy(header.Extra[len(header.Extra)-extraSeal:], sighash) + + return nil +} + // CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty // that a new block should have based on the previous blocks in the chain and the // current signer. @@ -962,114 +959,11 @@ func (c *Bor) APIs(chain consensus.ChainHeaderReader) []rpc.API { // Close implements consensus.Engine. It's a noop for bor as there are no background threads. func (c *Bor) Close() error { - c.HeimdallClient.Close() - return nil -} - -// GetCurrentSpan get current span from contract -func (c *Bor) GetCurrentSpan(headerHash common.Hash) (*Span, error) { - // block - blockNr := rpc.BlockNumberOrHashWithHash(headerHash, false) - - // method - method := "getCurrentSpan" - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - data, err := c.validatorSetABI.Pack(method) - if err != nil { - log.Error("Unable to pack tx for getCurrentSpan", "error", err) - return nil, err - } - - msgData := (hexutil.Bytes)(data) - toAddress := common.HexToAddress(c.config.ValidatorContract) - gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2)) - result, err := c.ethAPI.Call(ctx, ethapi.TransactionArgs{ - Gas: &gas, - To: &toAddress, - Data: &msgData, - }, blockNr, nil) - - if err != nil { - return nil, err - } - - // span result - ret := new(struct { - Number *big.Int - StartBlock *big.Int - EndBlock *big.Int + c.closeOnce.Do(func() { + c.HeimdallClient.Close() }) - if err := c.validatorSetABI.UnpackIntoInterface(ret, method, result); err != nil { - return nil, err - } - - // create new span - span := Span{ - ID: ret.Number.Uint64(), - StartBlock: ret.StartBlock.Uint64(), - EndBlock: ret.EndBlock.Uint64(), - } - - return &span, nil -} - -// GetCurrentValidators get current validators -func (c *Bor) GetCurrentValidators(headerHash common.Hash, blockNumber uint64) ([]*Validator, error) { - // block - blockNr := rpc.BlockNumberOrHashWithHash(headerHash, false) - - // method - method := "getBorValidators" - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - data, err := c.validatorSetABI.Pack(method, big.NewInt(0).SetUint64(blockNumber)) - if err != nil { - log.Error("Unable to pack tx for getValidator", "error", err) - return nil, err - } - - // call - msgData := (hexutil.Bytes)(data) - toAddress := common.HexToAddress(c.config.ValidatorContract) - gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2)) - result, err := c.ethAPI.Call(ctx, ethapi.TransactionArgs{ - Gas: &gas, - To: &toAddress, - Data: &msgData, - }, blockNr, nil) - - if err != nil { - panic(err) - } - - var ( - ret0 = new([]common.Address) - ret1 = new([]*big.Int) - ) - - out := &[]interface{}{ - ret0, - ret1, - } - - if err := c.validatorSetABI.UnpackIntoInterface(out, method, result); err != nil { - return nil, err - } - - valz := make([]*Validator, len(*ret0)) - for i, a := range *ret0 { - valz[i] = &Validator{ - Address: a, - VotingPower: (*ret1)[i].Int64(), - } - } - return valz, nil + return nil } func (c *Bor) checkAndCommitSpan( @@ -1078,21 +972,20 @@ func (c *Bor) checkAndCommitSpan( chain core.ChainContext, ) error { headerNumber := header.Number.Uint64() - span, err := c.GetCurrentSpan(header.ParentHash) + span, err := c.spanner.GetCurrentSpan(header.ParentHash) if err != nil { return err } if c.needToCommitSpan(span, headerNumber) { - err := c.fetchAndCommitSpan(span.ID+1, state, header, chain) - return err + return c.FetchAndCommitSpan(span.ID+1, state, header, chain) } return nil } -func (c *Bor) needToCommitSpan(span *Span, headerNumber uint64) bool { +func (c *Bor) needToCommitSpan(span *span.Span, headerNumber uint64) bool { // if span is nil if span == nil { return false @@ -1111,15 +1004,16 @@ func (c *Bor) needToCommitSpan(span *Span, headerNumber uint64) bool { return false } -func (c *Bor) fetchAndCommitSpan( +func (c *Bor) FetchAndCommitSpan( newSpanID uint64, state *state.StateDB, header *types.Header, chain core.ChainContext, ) error { - var heimdallSpan HeimdallSpan + var heimdallSpan span.HeimdallSpan - if c.WithoutHeimdall { + if c.HeimdallClient == nil { + // fixme: move to a new mock or fake and remove c.HeimdallClient completely s, err := c.getNextHeimdallSpanForTest(newSpanID, header, chain) if err != nil { return err @@ -1127,105 +1021,51 @@ func (c *Bor) fetchAndCommitSpan( heimdallSpan = *s } else { - response, err := c.HeimdallClient.FetchWithRetry(fmt.Sprintf("bor/span/%d", newSpanID), "") + response, err := c.HeimdallClient.Span(newSpanID) if err != nil { return err } - if err := json.Unmarshal(response.Result, &heimdallSpan); err != nil { - return err - } + heimdallSpan = *response } - // check if chain id matches with heimdall span + // check if chain id matches with Heimdall span if heimdallSpan.ChainID != c.chainConfig.ChainID.String() { return fmt.Errorf( - "Chain id proposed span, %s, and bor chain id, %s, doesn't match", + "chain id proposed span, %s, and bor chain id, %s, doesn't match", heimdallSpan.ChainID, c.chainConfig.ChainID, ) } - // get validators bytes - validators := make([]MinimalVal, 0, len(heimdallSpan.ValidatorSet.Validators)) - for _, val := range heimdallSpan.ValidatorSet.Validators { - validators = append(validators, val.MinimalVal()) - } - - validatorBytes, err := rlp.EncodeToBytes(validators) - - if err != nil { - return err - } - - // get producers bytes - producers := make([]MinimalVal, 0, len(heimdallSpan.SelectedProducers)) - for _, val := range heimdallSpan.SelectedProducers { - producers = append(producers, val.MinimalVal()) - } - - producerBytes, err := rlp.EncodeToBytes(producers) - - if err != nil { - return err - } - - // method - method := "commitSpan" - - log.Info("✅ Committing new span", - "id", heimdallSpan.ID, - "startBlock", heimdallSpan.StartBlock, - "endBlock", heimdallSpan.EndBlock, - "validatorBytes", hex.EncodeToString(validatorBytes), - "producerBytes", hex.EncodeToString(producerBytes), - ) - - // get packed data - data, err := c.validatorSetABI.Pack(method, - big.NewInt(0).SetUint64(heimdallSpan.ID), - big.NewInt(0).SetUint64(heimdallSpan.StartBlock), - big.NewInt(0).SetUint64(heimdallSpan.EndBlock), - validatorBytes, - producerBytes, - ) - if err != nil { - log.Error("Unable to pack tx for commitSpan", "error", err) - return err - } - - // get system message - msg := getSystemMessage(common.HexToAddress(c.config.ValidatorContract), data) - - // apply message - return applyMessage(msg, state, header, c.chainConfig, chain) + return c.spanner.CommitSpan(heimdallSpan, state, header, chain) } // CommitStates commit states func (c *Bor) CommitStates( state *state.StateDB, header *types.Header, - chain chainContext, + chain statefull.ChainContext, ) ([]*types.StateSyncData, error) { stateSyncs := make([]*types.StateSyncData, 0) number := header.Number.Uint64() - _lastStateID, err := c.GenesisContractsClient.LastStateId(number - 1) + _lastStateID, err := c.GenesisContractsClient.LastStateId(number - 1) if err != nil { return nil, err } to := time.Unix(int64(chain.Chain.GetHeaderByNumber(number-c.config.Sprint).Time), 0) lastStateID := _lastStateID.Uint64() + log.Info( "Fetching state updates from Heimdall", "fromID", lastStateID+1, "to", to.Format(time.RFC3339)) - eventRecords, err := c.HeimdallClient.FetchStateSyncEvents(lastStateID+1, to.Unix()) - + eventRecords, err := c.HeimdallClient.StateSyncEvents(lastStateID+1, to.Unix()) if err != nil { - log.Error("Error occurred when fetching state sync events", err) + log.Error("Error occurred when fetching state sync events", "stateID", lastStateID+1, "error", err) } if c.config.OverrideStateSyncRecords != nil { @@ -1234,6 +1074,8 @@ func (c *Bor) CommitStates( } } + totalGas := 0 /// limit on gas for state sync per block + chainID := c.chainConfig.ChainID.String() for _, eventRecord := range eventRecords { @@ -1242,7 +1084,7 @@ func (c *Bor) CommitStates( } if err := validateEventRecord(eventRecord, number, to, lastStateID, chainID); err != nil { - log.Error(err.Error()) + log.Error("while validating event record", "block", number, "to", to, "stateID", lastStateID, "error", err.Error()) break } @@ -1252,18 +1094,23 @@ func (c *Bor) CommitStates( Data: hex.EncodeToString(eventRecord.Data), TxHash: eventRecord.TxHash, } + stateSyncs = append(stateSyncs, &stateData) - if err := c.GenesisContractsClient.CommitState(eventRecord, state, header, chain); err != nil { + gasUsed, err := c.GenesisContractsClient.CommitState(eventRecord, state, header, chain) + if err != nil { return nil, err } + + totalGas += int(gasUsed) + lastStateID++ } return stateSyncs, nil } -func validateEventRecord(eventRecord *EventRecordWithTime, number uint64, to time.Time, lastStateID uint64, chainID string) error { +func validateEventRecord(eventRecord *clerk.EventRecordWithTime, number uint64, to time.Time, lastStateID uint64, chainID string) error { // event id should be sequential and event.Time should lie in the range [from, to) if lastStateID+1 != eventRecord.ID || eventRecord.ChainID != chainID || !eventRecord.Time.Before(to) { return &InvalidStateReceivedError{number, lastStateID, &to, eventRecord} @@ -1276,6 +1123,10 @@ func (c *Bor) SetHeimdallClient(h IHeimdallClient) { c.HeimdallClient = h } +func (c *Bor) GetCurrentValidators(headerHash common.Hash, blockNumber uint64) ([]*valset.Validator, error) { + return c.spanner.GetCurrentValidators(headerHash, blockNumber) +} + // // Private methods // @@ -1284,16 +1135,16 @@ func (c *Bor) getNextHeimdallSpanForTest( newSpanID uint64, header *types.Header, chain core.ChainContext, -) (*HeimdallSpan, error) { +) (*span.HeimdallSpan, error) { headerNumber := header.Number.Uint64() - span, err := c.GetCurrentSpan(header.ParentHash) + spanBor, err := c.spanner.GetCurrentSpan(header.ParentHash) if err != nil { return nil, err } // get local chain context object - localContext := chain.(chainContext) + localContext := chain.(statefull.ChainContext) // Retrieve the snapshot needed to verify this header and cache it snap, err := c.snapshot(localContext.Chain, headerNumber-1, header.ParentHash, nil) if err != nil { @@ -1301,22 +1152,22 @@ func (c *Bor) getNextHeimdallSpanForTest( } // new span - span.ID = newSpanID - if span.EndBlock == 0 { - span.StartBlock = 256 + spanBor.ID = newSpanID + if spanBor.EndBlock == 0 { + spanBor.StartBlock = 256 } else { - span.StartBlock = span.EndBlock + 1 + spanBor.StartBlock = spanBor.EndBlock + 1 } - span.EndBlock = span.StartBlock + (100 * c.config.Sprint) - 1 + spanBor.EndBlock = spanBor.StartBlock + (100 * c.config.Sprint) - 1 - selectedProducers := make([]Validator, len(snap.ValidatorSet.Validators)) + selectedProducers := make([]valset.Validator, len(snap.ValidatorSet.Validators)) for i, v := range snap.ValidatorSet.Validators { selectedProducers[i] = *v } - heimdallSpan := &HeimdallSpan{ - Span: *span, + heimdallSpan := &span.HeimdallSpan{ + Span: *spanBor, ValidatorSet: *snap.ValidatorSet, SelectedProducers: selectedProducers, ChainID: c.chainConfig.ChainID.String(), @@ -1325,82 +1176,7 @@ func (c *Bor) getNextHeimdallSpanForTest( return heimdallSpan, nil } -// -// Chain context -// - -// chain context -type chainContext struct { - Chain consensus.ChainHeaderReader - Bor consensus.Engine -} - -func (c chainContext) Engine() consensus.Engine { - return c.Bor -} - -func (c chainContext) GetHeader(hash common.Hash, number uint64) *types.Header { - return c.Chain.GetHeader(hash, number) -} - -// callmsg implements core.Message to allow passing it as a transaction simulator. -type callmsg struct { - ethereum.CallMsg -} - -func (m callmsg) From() common.Address { return m.CallMsg.From } -func (m callmsg) Nonce() uint64 { return 0 } -func (m callmsg) CheckNonce() bool { return false } -func (m callmsg) To() *common.Address { return m.CallMsg.To } -func (m callmsg) GasPrice() *big.Int { return m.CallMsg.GasPrice } -func (m callmsg) Gas() uint64 { return m.CallMsg.Gas } -func (m callmsg) Value() *big.Int { return m.CallMsg.Value } -func (m callmsg) Data() []byte { return m.CallMsg.Data } - -// get system message -func getSystemMessage(toAddress common.Address, data []byte) callmsg { - return callmsg{ - ethereum.CallMsg{ - From: systemAddress, - Gas: math.MaxUint64 / 2, - GasPrice: big.NewInt(0), - Value: big.NewInt(0), - To: &toAddress, - Data: data, - }, - } -} - -// apply message -func applyMessage( - msg callmsg, - state *state.StateDB, - header *types.Header, - chainConfig *params.ChainConfig, - chainContext core.ChainContext, -) error { - // Create a new context to be used in the EVM environment - blockContext := core.NewEVMBlockContext(header, chainContext, &header.Coinbase) - // Create a new environment which holds all relevant information - // about the transaction and calling mechanisms. - vmenv := vm.NewEVM(blockContext, vm.TxContext{}, state, chainConfig, vm.Config{}) - // Apply the transaction to the current state (included in the env) - _, _, err := vmenv.Call( - vm.AccountRef(msg.From()), - *msg.To(), - msg.Data(), - msg.Gas(), - msg.Value(), - ) - // Update the state with pending changes - if err != nil { - state.Finalise(true) - } - - return nil -} - -func validatorContains(a []*Validator, x *Validator) (*Validator, bool) { +func validatorContains(a []*valset.Validator, x *valset.Validator) (*valset.Validator, bool) { for _, n := range a { if n.Address == x.Address { return n, true @@ -1410,11 +1186,11 @@ func validatorContains(a []*Validator, x *Validator) (*Validator, bool) { return nil, false } -func getUpdatedValidatorSet(oldValidatorSet *ValidatorSet, newVals []*Validator) *ValidatorSet { +func getUpdatedValidatorSet(oldValidatorSet *valset.ValidatorSet, newVals []*valset.Validator) *valset.ValidatorSet { v := oldValidatorSet oldVals := v.Validators - changes := make([]*Validator, 0, len(oldVals)) + changes := make([]*valset.Validator, 0, len(oldVals)) for _, ov := range oldVals { if f, ok := validatorContains(newVals, ov); ok { @@ -1433,12 +1209,12 @@ func getUpdatedValidatorSet(oldValidatorSet *ValidatorSet, newVals []*Validator) } if err := v.UpdateWithChangeSet(changes); err != nil { - log.Error("Error while updating change set", err) + log.Error("Error while updating change set", "error", err) } return v } -func isSprintStart(number, sprint uint64) bool { +func IsSprintStart(number, sprint uint64) bool { return number%sprint == 0 } diff --git a/consensus/bor/clerk.go b/consensus/bor/clerk/clerk.go similarity index 85% rename from consensus/bor/clerk.go rename to consensus/bor/clerk/clerk.go index ca610282a5..fedca3df16 100644 --- a/consensus/bor/clerk.go +++ b/consensus/bor/clerk/clerk.go @@ -1,4 +1,4 @@ -package bor +package clerk import ( "fmt" @@ -23,10 +23,10 @@ type EventRecordWithTime struct { Time time.Time `json:"record_time" yaml:"record_time"` } -// String returns the string representations of span -func (e *EventRecordWithTime) String() string { +// String returns the string representation of EventRecord +func (e *EventRecordWithTime) String(gasUsed uint64) string { return fmt.Sprintf( - "id %v, contract %v, data: %v, txHash: %v, logIndex: %v, chainId: %v, time %s", + "id %v, contract %v, data: %v, txHash: %v, logIndex: %v, chainId: %v, time %s, gasUsed %d", e.ID, e.Contract.String(), e.Data.String(), @@ -34,6 +34,7 @@ func (e *EventRecordWithTime) String() string { e.LogIndex, e.ChainID, e.Time.Format(time.RFC3339), + gasUsed, ) } diff --git a/consensus/bor/contract/client.go b/consensus/bor/contract/client.go new file mode 100644 index 0000000000..d65fb5bb15 --- /dev/null +++ b/consensus/bor/contract/client.go @@ -0,0 +1,133 @@ +package contract + +import ( + "context" + "math" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/bor/api" + "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/statefull" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" +) + +var ( + vABI, _ = abi.JSON(strings.NewReader(validatorsetABI)) + sABI, _ = abi.JSON(strings.NewReader(stateReceiverABI)) +) + +func ValidatorSet() abi.ABI { + return vABI +} + +func StateReceiver() abi.ABI { + return sABI +} + +type GenesisContractsClient struct { + validatorSetABI abi.ABI + stateReceiverABI abi.ABI + ValidatorContract string + StateReceiverContract string + chainConfig *params.ChainConfig + ethAPI api.Caller +} + +const ( + validatorsetABI = `[{"constant":true,"inputs":[],"name":"SPRINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SYSTEM_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CHAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FIRST_END_BLOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"producers","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROUND_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BOR_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"spanNumbers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VOTE_TYPE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"spans","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewSpan","type":"event"},{"constant":true,"inputs":[],"name":"currentSprint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNextSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getSpanByBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentSpanNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getValidatorsTotalStakeBySpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getProducersTotalStakeBySpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"getValidatorBySigner","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"internalType":"struct BorValidatorSet.Validator","name":"result","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"isValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"isProducer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isCurrentValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isCurrentProducer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getBorValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitialValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newSpan","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"bytes","name":"validatorBytes","type":"bytes"},{"internalType":"bytes","name":"producerBytes","type":"bytes"}],"name":"commitSpan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bytes","name":"sigs","type":"bytes"}],"name":"getStakePowerBySigs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"rootHash","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"checkMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"d","type":"bytes32"}],"name":"leafNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"left","type":"bytes32"},{"internalType":"bytes32","name":"right","type":"bytes32"}],"name":"innerNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"}]` + stateReceiverABI = `[{"constant":true,"inputs":[],"name":"SYSTEM_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastStateId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"syncTime","type":"uint256"},{"internalType":"bytes","name":"recordBytes","type":"bytes"}],"name":"commitState","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]` +) + +func NewGenesisContractsClient( + chainConfig *params.ChainConfig, + validatorContract, + stateReceiverContract string, + ethAPI api.Caller, +) *GenesisContractsClient { + return &GenesisContractsClient{ + validatorSetABI: ValidatorSet(), + stateReceiverABI: StateReceiver(), + ValidatorContract: validatorContract, + StateReceiverContract: stateReceiverContract, + chainConfig: chainConfig, + ethAPI: ethAPI, + } +} + +func (gc *GenesisContractsClient) CommitState( + event *clerk.EventRecordWithTime, + state *state.StateDB, + header *types.Header, + chCtx statefull.ChainContext, +) (uint64, error) { + eventRecord := event.BuildEventRecord() + + recordBytes, err := rlp.EncodeToBytes(eventRecord) + if err != nil { + return 0, err + } + + const method = "commitState" + + t := event.Time.Unix() + + data, err := gc.stateReceiverABI.Pack(method, big.NewInt(0).SetInt64(t), recordBytes) + if err != nil { + log.Error("Unable to pack tx for commitState", "error", err) + return 0, err + } + + msg := statefull.GetSystemMessage(common.HexToAddress(gc.StateReceiverContract), data) + gasUsed, err := statefull.ApplyMessage(msg, state, header, gc.chainConfig, chCtx) + + // Logging event log with time and individual gasUsed + log.Info("→ committing new state", "eventRecord", event.String(gasUsed)) + + if err != nil { + return 0, err + } + + return gasUsed, nil +} + +func (gc *GenesisContractsClient) LastStateId(snapshotNumber uint64) (*big.Int, error) { + blockNr := rpc.BlockNumber(snapshotNumber) + method := "lastStateId" + + data, err := gc.stateReceiverABI.Pack(method) + if err != nil { + log.Error("Unable to pack tx for LastStateId", "error", err) + + return nil, err + } + + msgData := (hexutil.Bytes)(data) + toAddress := common.HexToAddress(gc.StateReceiverContract) + gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2)) + + result, err := gc.ethAPI.Call(context.Background(), ethapi.TransactionArgs{ + Gas: &gas, + To: &toAddress, + Data: &msgData, + }, rpc.BlockNumberOrHash{BlockNumber: &blockNr}, nil) + if err != nil { + return nil, err + } + + ret := new(*big.Int) + if err := gc.stateReceiverABI.UnpackIntoInterface(ret, method, result); err != nil { + return nil, err + } + + return *ret, nil +} diff --git a/consensus/bor/errors.go b/consensus/bor/errors.go index a1e60d1e21..67f7ef53f3 100644 --- a/consensus/bor/errors.go +++ b/consensus/bor/errors.go @@ -3,36 +3,9 @@ package bor import ( "fmt" "time" -) - -// TotalVotingPowerExceededError is returned when the maximum allowed total voting power is exceeded -type TotalVotingPowerExceededError struct { - Sum int64 - Validators []*Validator -} - -func (e *TotalVotingPowerExceededError) Error() string { - return fmt.Sprintf( - "Total voting power should be guarded to not exceed %v; got: %v; for validator set: %v", - MaxTotalVotingPower, - e.Sum, - e.Validators, - ) -} -type InvalidStartEndBlockError struct { - Start uint64 - End uint64 - CurrentHeader uint64 -} - -func (e *InvalidStartEndBlockError) Error() string { - return fmt.Sprintf( - "Invalid parameters start: %d and end block: %d params", - e.Start, - e.End, - ) -} + "github.com/ethereum/go-ethereum/consensus/bor/clerk" +) type MaxCheckpointLengthExceededError struct { Start uint64 @@ -129,12 +102,12 @@ type InvalidStateReceivedError struct { Number uint64 LastStateID uint64 To *time.Time - Event *EventRecordWithTime + Event *clerk.EventRecordWithTime } func (e *InvalidStateReceivedError) Error() string { return fmt.Sprintf( - "Received invalid event %s at block %d. Requested events until %s. Last state id was %d", + "Received invalid event %v at block %d. Requested events until %s. Last state id was %d", e.Event, e.Number, e.To.Format(time.RFC3339), diff --git a/consensus/bor/genesis.go b/consensus/bor/genesis.go new file mode 100644 index 0000000000..33de53f9ba --- /dev/null +++ b/consensus/bor/genesis.go @@ -0,0 +1,16 @@ +package bor + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/statefull" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" +) + +//go:generate mockgen -destination=./genesis_contract_mock.go -package=bor . GenesisContract +type GenesisContract interface { + CommitState(event *clerk.EventRecordWithTime, state *state.StateDB, header *types.Header, chCtx statefull.ChainContext) (uint64, error) + LastStateId(snapshotNumber uint64) (*big.Int, error) +} diff --git a/consensus/bor/genesis_contract_mock.go b/consensus/bor/genesis_contract_mock.go new file mode 100644 index 0000000000..dfe9390509 --- /dev/null +++ b/consensus/bor/genesis_contract_mock.go @@ -0,0 +1,69 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ethereum/go-ethereum/consensus/bor (interfaces: GenesisContract) + +// Package bor is a generated GoMock package. +package bor + +import ( + big "math/big" + reflect "reflect" + + clerk "github.com/ethereum/go-ethereum/consensus/bor/clerk" + statefull "github.com/ethereum/go-ethereum/consensus/bor/statefull" + state "github.com/ethereum/go-ethereum/core/state" + types "github.com/ethereum/go-ethereum/core/types" + gomock "github.com/golang/mock/gomock" +) + +// MockGenesisContract is a mock of GenesisContract interface. +type MockGenesisContract struct { + ctrl *gomock.Controller + recorder *MockGenesisContractMockRecorder +} + +// MockGenesisContractMockRecorder is the mock recorder for MockGenesisContract. +type MockGenesisContractMockRecorder struct { + mock *MockGenesisContract +} + +// NewMockGenesisContract creates a new mock instance. +func NewMockGenesisContract(ctrl *gomock.Controller) *MockGenesisContract { + mock := &MockGenesisContract{ctrl: ctrl} + mock.recorder = &MockGenesisContractMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockGenesisContract) EXPECT() *MockGenesisContractMockRecorder { + return m.recorder +} + +// CommitState mocks base method. +func (m *MockGenesisContract) CommitState(arg0 *clerk.EventRecordWithTime, arg1 *state.StateDB, arg2 *types.Header, arg3 statefull.ChainContext) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CommitState", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CommitState indicates an expected call of CommitState. +func (mr *MockGenesisContractMockRecorder) CommitState(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CommitState", reflect.TypeOf((*MockGenesisContract)(nil).CommitState), arg0, arg1, arg2, arg3) +} + +// LastStateId mocks base method. +func (m *MockGenesisContract) LastStateId(arg0 uint64) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LastStateId", arg0) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// LastStateId indicates an expected call of LastStateId. +func (mr *MockGenesisContractMockRecorder) LastStateId(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LastStateId", reflect.TypeOf((*MockGenesisContract)(nil).LastStateId), arg0) +} diff --git a/consensus/bor/genesis_contracts_client.go b/consensus/bor/genesis_contracts_client.go deleted file mode 100644 index 2b36b6e5e0..0000000000 --- a/consensus/bor/genesis_contracts_client.go +++ /dev/null @@ -1,113 +0,0 @@ -package bor - -import ( - "context" - "math" - "math/big" - "strings" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/internal/ethapi" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ethereum/go-ethereum/rpc" -) - -type GenesisContractsClient struct { - validatorSetABI abi.ABI - stateReceiverABI abi.ABI - ValidatorContract string - StateReceiverContract string - chainConfig *params.ChainConfig - ethAPI *ethapi.PublicBlockChainAPI -} - -const validatorsetABI = `[{"constant":true,"inputs":[],"name":"SPRINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SYSTEM_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CHAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FIRST_END_BLOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"producers","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROUND_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BOR_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"spanNumbers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VOTE_TYPE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"spans","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewSpan","type":"event"},{"constant":true,"inputs":[],"name":"currentSprint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNextSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getSpanByBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentSpanNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getValidatorsTotalStakeBySpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getProducersTotalStakeBySpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"getValidatorBySigner","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"internalType":"struct BorValidatorSet.Validator","name":"result","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"isValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"isProducer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isCurrentValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isCurrentProducer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getBorValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitialValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newSpan","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"bytes","name":"validatorBytes","type":"bytes"},{"internalType":"bytes","name":"producerBytes","type":"bytes"}],"name":"commitSpan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bytes","name":"sigs","type":"bytes"}],"name":"getStakePowerBySigs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"rootHash","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"checkMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"d","type":"bytes32"}],"name":"leafNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"left","type":"bytes32"},{"internalType":"bytes32","name":"right","type":"bytes32"}],"name":"innerNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"}]` -const stateReceiverABI = `[{"constant":true,"inputs":[],"name":"SYSTEM_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastStateId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"syncTime","type":"uint256"},{"internalType":"bytes","name":"recordBytes","type":"bytes"}],"name":"commitState","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]` - -func NewGenesisContractsClient( - chainConfig *params.ChainConfig, - validatorContract, - stateReceiverContract string, - ethAPI *ethapi.PublicBlockChainAPI, -) *GenesisContractsClient { - vABI, _ := abi.JSON(strings.NewReader(validatorsetABI)) - sABI, _ := abi.JSON(strings.NewReader(stateReceiverABI)) - - return &GenesisContractsClient{ - validatorSetABI: vABI, - stateReceiverABI: sABI, - ValidatorContract: validatorContract, - StateReceiverContract: stateReceiverContract, - chainConfig: chainConfig, - ethAPI: ethAPI, - } -} - -func (gc *GenesisContractsClient) CommitState( - event *EventRecordWithTime, - state *state.StateDB, - header *types.Header, - chCtx chainContext, -) error { - eventRecord := event.BuildEventRecord() - recordBytes, err := rlp.EncodeToBytes(eventRecord) - - if err != nil { - return err - } - - method := "commitState" - t := event.Time.Unix() - data, err := gc.stateReceiverABI.Pack(method, big.NewInt(0).SetInt64(t), recordBytes) - - if err != nil { - log.Error("Unable to pack tx for commitState", "error", err) - return err - } - - log.Info("→ committing new state", "eventRecord", event.String()) - - msg := getSystemMessage(common.HexToAddress(gc.StateReceiverContract), data) - if err := applyMessage(msg, state, header, gc.chainConfig, chCtx); err != nil { - return err - } - - return nil -} - -func (gc *GenesisContractsClient) LastStateId(snapshotNumber uint64) (*big.Int, error) { - blockNr := rpc.BlockNumber(snapshotNumber) - method := "lastStateId" - data, err := gc.stateReceiverABI.Pack(method) - - if err != nil { - log.Error("Unable to pack tx for LastStateId", "error", err) - return nil, err - } - - msgData := (hexutil.Bytes)(data) - toAddress := common.HexToAddress(gc.StateReceiverContract) - gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2)) - result, err := gc.ethAPI.Call(context.Background(), ethapi.TransactionArgs{ - Gas: &gas, - To: &toAddress, - Data: &msgData, - }, rpc.BlockNumberOrHash{BlockNumber: &blockNr}, nil) - - if err != nil { - return nil, err - } - - var ret = new(*big.Int) - if err := gc.stateReceiverABI.UnpackIntoInterface(ret, method, result); err != nil { - return nil, err - } - - return *ret, nil -} diff --git a/consensus/bor/heimdall.go b/consensus/bor/heimdall.go new file mode 100644 index 0000000000..c97a3cda11 --- /dev/null +++ b/consensus/bor/heimdall.go @@ -0,0 +1,13 @@ +package bor + +import ( + "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" +) + +//go:generate mockgen -destination=../../tests/bor/mocks/IHeimdallClient.go -package=mocks . IHeimdallClient +type IHeimdallClient interface { + StateSyncEvents(fromID uint64, to int64) ([]*clerk.EventRecordWithTime, error) + Span(spanID uint64) (*span.HeimdallSpan, error) + Close() +} diff --git a/consensus/bor/heimdall/client.go b/consensus/bor/heimdall/client.go new file mode 100644 index 0000000000..c5e1dfb4cf --- /dev/null +++ b/consensus/bor/heimdall/client.go @@ -0,0 +1,222 @@ +package heimdall + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "sort" + "time" + + "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" + "github.com/ethereum/go-ethereum/log" +) + +// errShutdownDetected is returned if a shutdown was detected +var errShutdownDetected = errors.New("shutdown detected") + +const ( + stateFetchLimit = 50 + apiHeimdallTimeout = 5 * time.Second +) + +type StateSyncEventsResponse struct { + Height string `json:"height"` + Result []*clerk.EventRecordWithTime `json:"result"` +} + +type SpanResponse struct { + Height string `json:"height"` + Result span.HeimdallSpan `json:"result"` +} + +type HeimdallClient struct { + urlString string + client http.Client + closeCh chan struct{} +} + +func NewHeimdallClient(urlString string) *HeimdallClient { + return &HeimdallClient{ + urlString: urlString, + client: http.Client{ + Timeout: apiHeimdallTimeout, + }, + closeCh: make(chan struct{}), + } +} + +const ( + fetchStateSyncEventsFormat = "from-id=%d&to-time=%d&limit=%d" + fetchStateSyncEventsPath = "clerk/event-record/list" + + fetchSpanFormat = "bor/span/%d" +) + +func (h *HeimdallClient) StateSyncEvents(fromID uint64, to int64) ([]*clerk.EventRecordWithTime, error) { + eventRecords := make([]*clerk.EventRecordWithTime, 0) + + for { + url, err := stateSyncURL(h.urlString, fromID, to) + if err != nil { + return nil, err + } + + log.Info("Fetching state sync events", "queryParams", url.RawQuery) + + response, err := FetchWithRetry[StateSyncEventsResponse](h.client, url, h.closeCh) + if err != nil { + return nil, err + } + + if response == nil || response.Result == nil { + // status 204 + break + } + + eventRecords = append(eventRecords, response.Result...) + + if len(response.Result) < stateFetchLimit { + break + } + + fromID += uint64(stateFetchLimit) + } + + sort.SliceStable(eventRecords, func(i, j int) bool { + return eventRecords[i].ID < eventRecords[j].ID + }) + + return eventRecords, nil +} + +func (h *HeimdallClient) Span(spanID uint64) (*span.HeimdallSpan, error) { + url, err := spanURL(h.urlString, spanID) + if err != nil { + return nil, err + } + + response, err := FetchWithRetry[SpanResponse](h.client, url, h.closeCh) + if err != nil { + return nil, err + } + + return &response.Result, nil +} + +// FetchWithRetry returns data from heimdall with retry +func FetchWithRetry[T any](client http.Client, url *url.URL, closeCh chan struct{}) (*T, error) { + // attempt counter + attempt := 1 + result := new(T) + + ctx, cancel := context.WithTimeout(context.Background(), apiHeimdallTimeout) + + // request data once + body, err := internalFetch(ctx, client, url) + + cancel() + + if err == nil && body != nil { + err = json.Unmarshal(body, result) + if err != nil { + return nil, err + } + + return result, nil + } + + // create a new ticker for retrying the request + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + + for { + log.Info("Retrying again in 5 seconds to fetch data from Heimdall", "path", url.Path, "attempt", attempt) + attempt++ + select { + case <-closeCh: + log.Debug("Shutdown detected, terminating request") + + return nil, errShutdownDetected + case <-ticker.C: + ctx, cancel = context.WithTimeout(context.Background(), apiHeimdallTimeout) + + body, err = internalFetch(ctx, client, url) + + cancel() + + if err == nil && body != nil { + err = json.Unmarshal(body, result) + if err != nil { + return nil, err + } + + return result, nil + } + } + } +} + +func spanURL(urlString string, spanID uint64) (*url.URL, error) { + return makeURL(urlString, fmt.Sprintf(fetchSpanFormat, spanID), "") +} + +func stateSyncURL(urlString string, fromID uint64, to int64) (*url.URL, error) { + queryParams := fmt.Sprintf(fetchStateSyncEventsFormat, fromID, to, stateFetchLimit) + + return makeURL(urlString, fetchStateSyncEventsPath, queryParams) +} + +func makeURL(urlString, rawPath, rawQuery string) (*url.URL, error) { + u, err := url.Parse(urlString) + if err != nil { + return nil, err + } + + u.Path = rawPath + u.RawQuery = rawQuery + + return u, err +} + +// internal fetch method +func internalFetch(ctx context.Context, client http.Client, u *url.URL) ([]byte, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + return nil, err + } + + res, err := client.Do(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + + // check status code + if res.StatusCode != 200 && res.StatusCode != 204 { + return nil, fmt.Errorf("Error while fetching data from Heimdall") + } + + // unmarshall data from buffer + if res.StatusCode == 204 { + return nil, nil + } + + // get response + body, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, err + } + + return body, nil +} + +// Close sends a signal to stop the running process +func (h *HeimdallClient) Close() { + close(h.closeCh) + h.client.CloseIdleConnections() +} diff --git a/consensus/bor/heimdall/client_test.go b/consensus/bor/heimdall/client_test.go new file mode 100644 index 0000000000..c423a6f659 --- /dev/null +++ b/consensus/bor/heimdall/client_test.go @@ -0,0 +1,35 @@ +package heimdall + +import ( + "testing" +) + +func TestSpanURL(t *testing.T) { + t.Parallel() + + url, err := spanURL("http://bor0", 1) + if err != nil { + t.Fatal("got an error", err) + } + + const expected = "http://bor0/bor/span/1" + + if url.String() != expected { + t.Fatalf("expected URL %q, got %q", url.String(), expected) + } +} + +func TestStateSyncURL(t *testing.T) { + t.Parallel() + + url, err := stateSyncURL("http://bor0", 10, 100) + if err != nil { + t.Fatal("got an error", err) + } + + const expected = "http://bor0/clerk/event-record/list?from-id=10&to-time=100&limit=50" + + if url.String() != expected { + t.Fatalf("expected URL %q, got %q", url.String(), expected) + } +} diff --git a/consensus/bor/heimdall/span/span.go b/consensus/bor/heimdall/span/span.go new file mode 100644 index 0000000000..5bf85fb341 --- /dev/null +++ b/consensus/bor/heimdall/span/span.go @@ -0,0 +1,20 @@ +package span + +import ( + "github.com/ethereum/go-ethereum/consensus/bor/valset" +) + +// Span Bor represents a current bor span +type Span struct { + ID uint64 `json:"span_id" yaml:"span_id"` + StartBlock uint64 `json:"start_block" yaml:"start_block"` + EndBlock uint64 `json:"end_block" yaml:"end_block"` +} + +// HeimdallSpan represents span from heimdall APIs +type HeimdallSpan struct { + Span + ValidatorSet valset.ValidatorSet `json:"validator_set" yaml:"validator_set"` + SelectedProducers []valset.Validator `json:"selected_producers" yaml:"selected_producers"` + ChainID string `json:"bor_chain_id" yaml:"bor_chain_id"` +} diff --git a/consensus/bor/heimdall/span/spanner.go b/consensus/bor/heimdall/span/spanner.go new file mode 100644 index 0000000000..7bf6e350ee --- /dev/null +++ b/consensus/bor/heimdall/span/spanner.go @@ -0,0 +1,200 @@ +package span + +import ( + "context" + "encoding/hex" + "math" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/bor/abi" + "github.com/ethereum/go-ethereum/consensus/bor/api" + "github.com/ethereum/go-ethereum/consensus/bor/statefull" + "github.com/ethereum/go-ethereum/consensus/bor/valset" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" +) + +type ChainSpanner struct { + ethAPI api.Caller + validatorSet abi.ABI + chainConfig *params.ChainConfig + validatorContractAddress common.Address +} + +func NewChainSpanner(ethAPI api.Caller, validatorSet abi.ABI, chainConfig *params.ChainConfig, validatorContractAddress common.Address) *ChainSpanner { + return &ChainSpanner{ + ethAPI: ethAPI, + validatorSet: validatorSet, + chainConfig: chainConfig, + validatorContractAddress: validatorContractAddress, + } +} + +// GetCurrentSpan get current span from contract +func (c *ChainSpanner) GetCurrentSpan(headerHash common.Hash) (*Span, error) { + // block + blockNr := rpc.BlockNumberOrHashWithHash(headerHash, false) + + // method + method := "getCurrentSpan" + + data, err := c.validatorSet.Pack(method) + if err != nil { + log.Error("Unable to pack tx for getCurrentSpan", "error", err) + + return nil, err + } + + msgData := (hexutil.Bytes)(data) + toAddress := c.validatorContractAddress + gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2)) + + // todo: would we like to have a timeout here? + result, err := c.ethAPI.Call(context.Background(), ethapi.TransactionArgs{ + Gas: &gas, + To: &toAddress, + Data: &msgData, + }, blockNr, nil) + if err != nil { + return nil, err + } + + // span result + ret := new(struct { + Number *big.Int + StartBlock *big.Int + EndBlock *big.Int + }) + + if err := c.validatorSet.UnpackIntoInterface(ret, method, result); err != nil { + return nil, err + } + + // create new span + span := Span{ + ID: ret.Number.Uint64(), + StartBlock: ret.StartBlock.Uint64(), + EndBlock: ret.EndBlock.Uint64(), + } + + return &span, nil +} + +// GetCurrentValidators get current validators +func (c *ChainSpanner) GetCurrentValidators(headerHash common.Hash, blockNumber uint64) ([]*valset.Validator, error) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // method + const method = "getBorValidators" + + data, err := c.validatorSet.Pack(method, big.NewInt(0).SetUint64(blockNumber)) + if err != nil { + log.Error("Unable to pack tx for getValidator", "error", err) + return nil, err + } + + // call + msgData := (hexutil.Bytes)(data) + toAddress := c.validatorContractAddress + gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2)) + + // block + blockNr := rpc.BlockNumberOrHashWithHash(headerHash, false) + + result, err := c.ethAPI.Call(ctx, ethapi.TransactionArgs{ + Gas: &gas, + To: &toAddress, + Data: &msgData, + }, blockNr, nil) + if err != nil { + panic(err) + } + + var ( + ret0 = new([]common.Address) + ret1 = new([]*big.Int) + ) + + out := &[]interface{}{ + ret0, + ret1, + } + + if err := c.validatorSet.UnpackIntoInterface(out, method, result); err != nil { + return nil, err + } + + valz := make([]*valset.Validator, len(*ret0)) + for i, a := range *ret0 { + valz[i] = &valset.Validator{ + Address: a, + VotingPower: (*ret1)[i].Int64(), + } + } + + return valz, nil +} + +const method = "commitSpan" + +func (c *ChainSpanner) CommitSpan(heimdallSpan HeimdallSpan, state *state.StateDB, header *types.Header, chainContext core.ChainContext) error { + // get validators bytes + validators := make([]valset.MinimalVal, 0, len(heimdallSpan.ValidatorSet.Validators)) + for _, val := range heimdallSpan.ValidatorSet.Validators { + validators = append(validators, val.MinimalVal()) + } + + validatorBytes, err := rlp.EncodeToBytes(validators) + if err != nil { + return err + } + + // get producers bytes + producers := make([]valset.MinimalVal, 0, len(heimdallSpan.SelectedProducers)) + for _, val := range heimdallSpan.SelectedProducers { + producers = append(producers, val.MinimalVal()) + } + + producerBytes, err := rlp.EncodeToBytes(producers) + if err != nil { + return err + } + + log.Info("✅ Committing new span", + "id", heimdallSpan.ID, + "startBlock", heimdallSpan.StartBlock, + "endBlock", heimdallSpan.EndBlock, + "validatorBytes", hex.EncodeToString(validatorBytes), + "producerBytes", hex.EncodeToString(producerBytes), + ) + + data, err := c.validatorSet.Pack(method, + big.NewInt(0).SetUint64(heimdallSpan.ID), + big.NewInt(0).SetUint64(heimdallSpan.StartBlock), + big.NewInt(0).SetUint64(heimdallSpan.EndBlock), + validatorBytes, + producerBytes, + ) + if err != nil { + log.Error("Unable to pack tx for commitSpan", "error", err) + + return err + } + + // get system message + msg := statefull.GetSystemMessage(c.validatorContractAddress, data) + + // apply message + _, err = statefull.ApplyMessage(msg, state, header, c.chainConfig, chainContext) + + return err +} diff --git a/consensus/bor/rest.go b/consensus/bor/rest.go deleted file mode 100644 index 49ecb38af5..0000000000 --- a/consensus/bor/rest.go +++ /dev/null @@ -1,177 +0,0 @@ -package bor - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "sort" - "time" - - "github.com/ethereum/go-ethereum/log" -) - -var ( - stateFetchLimit = 50 -) - -// ResponseWithHeight defines a response object type that wraps an original -// response with a height. -type ResponseWithHeight struct { - Height string `json:"height"` - Result json.RawMessage `json:"result"` -} - -type IHeimdallClient interface { - Fetch(path string, query string) (*ResponseWithHeight, error) - FetchWithRetry(path string, query string) (*ResponseWithHeight, error) - FetchStateSyncEvents(fromID uint64, to int64) ([]*EventRecordWithTime, error) - Close() -} - -type HeimdallClient struct { - urlString string - client http.Client - closeCh chan struct{} -} - -func NewHeimdallClient(urlString string) (*HeimdallClient, error) { - h := &HeimdallClient{ - urlString: urlString, - client: http.Client{ - Timeout: 5 * time.Second, - }, - closeCh: make(chan struct{}), - } - - return h, nil -} - -func (h *HeimdallClient) FetchStateSyncEvents(fromID uint64, to int64) ([]*EventRecordWithTime, error) { - eventRecords := make([]*EventRecordWithTime, 0) - - for { - queryParams := fmt.Sprintf("from-id=%d&to-time=%d&limit=%d", fromID, to, stateFetchLimit) - log.Info("Fetching state sync events", "queryParams", queryParams) - response, err := h.FetchWithRetry("clerk/event-record/list", queryParams) - - if err != nil { - return nil, err - } - - var _eventRecords []*EventRecordWithTime - - if response.Result == nil { // status 204 - break - } - - if err := json.Unmarshal(response.Result, &_eventRecords); err != nil { - return nil, err - } - - eventRecords = append(eventRecords, _eventRecords...) - - if len(_eventRecords) < stateFetchLimit { - break - } - - fromID += uint64(stateFetchLimit) - } - - sort.SliceStable(eventRecords, func(i, j int) bool { - return eventRecords[i].ID < eventRecords[j].ID - }) - - return eventRecords, nil -} - -// Fetch fetches response from heimdall -func (h *HeimdallClient) Fetch(rawPath string, rawQuery string) (*ResponseWithHeight, error) { - u, err := url.Parse(h.urlString) - if err != nil { - return nil, err - } - - u.Path = rawPath - u.RawQuery = rawQuery - - return h.internalFetch(u) -} - -// FetchWithRetry returns data from heimdall with retry -func (h *HeimdallClient) FetchWithRetry(rawPath string, rawQuery string) (*ResponseWithHeight, error) { - u, err := url.Parse(h.urlString) - if err != nil { - return nil, err - } - - u.Path = rawPath - u.RawQuery = rawQuery - - // attempt counter - attempt := 1 - - // request data once - res, err := h.internalFetch(u) - if err == nil && res != nil { - return res, nil - } - - // create a new ticker for retrying the request - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() - - for { - log.Info("Retrying again in 5 seconds to fetch data from Heimdall", "path", u.Path, "attempt", attempt) - attempt++ - select { - case <-h.closeCh: - log.Debug("Shutdown detected, terminating request") - return nil, errShutdownDetected - case <-ticker.C: - res, err := h.internalFetch(u) - if err == nil && res != nil { - return res, nil - } - } - } -} - -// internal fetch method -func (h *HeimdallClient) internalFetch(u *url.URL) (*ResponseWithHeight, error) { - res, err := h.client.Get(u.String()) // nolint: noctx - if err != nil { - return nil, err - } - defer res.Body.Close() - - // check status code - if res.StatusCode != 200 && res.StatusCode != 204 { - return nil, fmt.Errorf("Error while fetching data from Heimdall") - } - - // unmarshall data from buffer - var response ResponseWithHeight - if res.StatusCode == 204 { - return &response, nil - } - - // get response - body, err := ioutil.ReadAll(res.Body) - if err != nil { - return nil, err - } - - if err := json.Unmarshal(body, &response); err != nil { - return nil, err - } - - return &response, nil -} - -// Close sends a signal to stop the running process -func (h *HeimdallClient) Close() { - close(h.closeCh) - h.client.CloseIdleConnections() -} diff --git a/consensus/bor/snapshot.go b/consensus/bor/snapshot.go index 606c28340b..f71ceae0ad 100644 --- a/consensus/bor/snapshot.go +++ b/consensus/bor/snapshot.go @@ -3,24 +3,24 @@ package bor import ( "encoding/json" + "github.com/ethereum/go-ethereum/consensus/bor/valset" + lru "github.com/hashicorp/golang-lru" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/params" ) // Snapshot is the state of the authorization voting at a given point in time. type Snapshot struct { config *params.BorConfig // Consensus engine parameters to fine tune behavior - ethAPI *ethapi.PublicBlockChainAPI - sigcache *lru.ARCCache // Cache of recent block signatures to speed up ecrecover + sigcache *lru.ARCCache // Cache of recent block signatures to speed up ecrecover Number uint64 `json:"number"` // Block number where the snapshot was created Hash common.Hash `json:"hash"` // Block hash where the snapshot was created - ValidatorSet *ValidatorSet `json:"validatorSet"` // Validator set at this moment + ValidatorSet *valset.ValidatorSet `json:"validatorSet"` // Validator set at this moment Recents map[uint64]common.Address `json:"recents"` // Set of recent signers for spam protections } @@ -32,16 +32,14 @@ func newSnapshot( sigcache *lru.ARCCache, number uint64, hash common.Hash, - validators []*Validator, - ethAPI *ethapi.PublicBlockChainAPI, + validators []*valset.Validator, ) *Snapshot { snap := &Snapshot{ config: config, - ethAPI: ethAPI, sigcache: sigcache, Number: number, Hash: hash, - ValidatorSet: NewValidatorSet(validators), + ValidatorSet: valset.NewValidatorSet(validators), Recents: make(map[uint64]common.Address), } @@ -49,7 +47,7 @@ func newSnapshot( } // loadSnapshot loads an existing snapshot from the database. -func loadSnapshot(config *params.BorConfig, sigcache *lru.ARCCache, db ethdb.Database, hash common.Hash, ethAPI *ethapi.PublicBlockChainAPI) (*Snapshot, error) { +func loadSnapshot(config *params.BorConfig, sigcache *lru.ARCCache, db ethdb.Database, hash common.Hash) (*Snapshot, error) { blob, err := db.Get(append([]byte("bor-"), hash[:]...)) if err != nil { return nil, err @@ -63,10 +61,9 @@ func loadSnapshot(config *params.BorConfig, sigcache *lru.ARCCache, db ethdb.Dat snap.config = config snap.sigcache = sigcache - snap.ethAPI = ethAPI // update total voting power - if err := snap.ValidatorSet.updateTotalVotingPower(); err != nil { + if err := snap.ValidatorSet.UpdateTotalVotingPower(); err != nil { return nil, err } @@ -87,7 +84,6 @@ func (s *Snapshot) store(db ethdb.Database) error { func (s *Snapshot) copy() *Snapshot { cpy := &Snapshot{ config: s.config, - ethAPI: s.ethAPI, sigcache: s.sigcache, Number: s.Number, Hash: s.Hash, @@ -155,7 +151,7 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { validatorBytes := header.Extra[extraVanity : len(header.Extra)-extraSeal] // get validators from headers and use that for new validator set - newVals, _ := ParseValidators(validatorBytes) + newVals, _ := valset.ParseValidators(validatorBytes) v := getUpdatedValidatorSet(snap.ValidatorSet.Copy(), newVals) v.IncrementProposerPriority(1) snap.ValidatorSet = v diff --git a/consensus/bor/snapshot_test.go b/consensus/bor/snapshot_test.go index 2bbbc32123..1a3e967613 100644 --- a/consensus/bor/snapshot_test.go +++ b/consensus/bor/snapshot_test.go @@ -7,8 +7,11 @@ import ( "time" "github.com/stretchr/testify/assert" + "pgregory.net/rapid" "github.com/ethereum/go-ethereum/common" + unique "github.com/ethereum/go-ethereum/common/set" + "github.com/ethereum/go-ethereum/consensus/bor/valset" ) const ( @@ -19,7 +22,7 @@ func TestGetSignerSuccessionNumber_ProposerIsSigner(t *testing.T) { t.Parallel() validators := buildRandomValidatorSet(numVals) - validatorSet := NewValidatorSet(validators) + validatorSet := valset.NewValidatorSet(validators) snap := Snapshot{ ValidatorSet: validatorSet, } @@ -27,7 +30,6 @@ func TestGetSignerSuccessionNumber_ProposerIsSigner(t *testing.T) { // proposer is signer signer := validatorSet.Proposer.Address successionNumber, err := snap.GetSignerSuccessionNumber(signer) - if err != nil { t.Fatalf("%s", err) } @@ -41,20 +43,19 @@ func TestGetSignerSuccessionNumber_SignerIndexIsLarger(t *testing.T) { validators := buildRandomValidatorSet(numVals) // sort validators by address, which is what NewValidatorSet also does - sort.Sort(ValidatorsByAddress(validators)) + sort.Sort(valset.ValidatorsByAddress(validators)) proposerIndex := 32 signerIndex := 56 // give highest ProposerPriority to a particular val, so that they become the proposer validators[proposerIndex].VotingPower = 200 snap := Snapshot{ - ValidatorSet: NewValidatorSet(validators), + ValidatorSet: valset.NewValidatorSet(validators), } // choose a signer at an index greater than proposer index signer := snap.ValidatorSet.Validators[signerIndex].Address successionNumber, err := snap.GetSignerSuccessionNumber(signer) - if err != nil { t.Fatalf("%s", err) } @@ -71,13 +72,12 @@ func TestGetSignerSuccessionNumber_SignerIndexIsSmaller(t *testing.T) { // give highest ProposerPriority to a particular val, so that they become the proposer validators[proposerIndex].VotingPower = 200 snap := Snapshot{ - ValidatorSet: NewValidatorSet(validators), + ValidatorSet: valset.NewValidatorSet(validators), } // choose a signer at an index greater than proposer index signer := snap.ValidatorSet.Validators[signerIndex].Address successionNumber, err := snap.GetSignerSuccessionNumber(signer) - if err != nil { t.Fatalf("%s", err) } @@ -90,14 +90,18 @@ func TestGetSignerSuccessionNumber_ProposerNotFound(t *testing.T) { validators := buildRandomValidatorSet(numVals) snap := Snapshot{ - ValidatorSet: NewValidatorSet(validators), + ValidatorSet: valset.NewValidatorSet(validators), } + dummyProposerAddress := randomAddress() - snap.ValidatorSet.Proposer = &Validator{Address: dummyProposerAddress} + snap.ValidatorSet.Proposer = &valset.Validator{Address: dummyProposerAddress} + // choose any signer signer := snap.ValidatorSet.Validators[3].Address + _, err := snap.GetSignerSuccessionNumber(signer) assert.NotNil(t, err) + e, ok := err.(*UnauthorizedProposerError) assert.True(t, ok) assert.Equal(t, dummyProposerAddress.Bytes(), e.Proposer) @@ -108,7 +112,7 @@ func TestGetSignerSuccessionNumber_SignerNotFound(t *testing.T) { validators := buildRandomValidatorSet(numVals) snap := Snapshot{ - ValidatorSet: NewValidatorSet(validators), + ValidatorSet: valset.NewValidatorSet(validators), } dummySignerAddress := randomAddress() _, err := snap.GetSignerSuccessionNumber(dummySignerAddress) @@ -119,21 +123,22 @@ func TestGetSignerSuccessionNumber_SignerNotFound(t *testing.T) { } // nolint: unparam -func buildRandomValidatorSet(numVals int) []*Validator { +func buildRandomValidatorSet(numVals int) []*valset.Validator { rand.Seed(time.Now().Unix()) - validators := make([]*Validator, numVals) + validators := make([]*valset.Validator, numVals) + valAddrs := randomAddresses(numVals) for i := 0; i < numVals; i++ { - validators[i] = &Validator{ - Address: randomAddress(), + validators[i] = &valset.Validator{ + Address: valAddrs[i], // cannot process validators with voting power 0, hence +1 VotingPower: int64(rand.Intn(99) + 1), } } // sort validators by address, which is what NewValidatorSet also does - sort.Sort(ValidatorsByAddress(validators)) + sort.Sort(valset.ValidatorsByAddress(validators)) return validators } @@ -144,3 +149,51 @@ func randomAddress() common.Address { return common.BytesToAddress(bytes) } + +func randomAddresses(n int) []common.Address { + if n <= 0 { + return []common.Address{} + } + + addrs := make([]common.Address, 0, n) + addrsSet := make(map[common.Address]struct{}, n) + + var ( + addr common.Address + exist bool + ) + + bytes := make([]byte, 32) + + for { + rand.Read(bytes) + + addr = common.BytesToAddress(bytes) + + _, exist = addrsSet[addr] + if !exist { + addrs = append(addrs, addr) + + addrsSet[addr] = struct{}{} + } + + if len(addrs) == n { + return addrs + } + } +} + +func TestRandomAddresses(t *testing.T) { + t.Parallel() + + rapid.Check(t, func(t *rapid.T) { + length := rapid.IntMax(100).Draw(t, "length").(int) + + addrs := randomAddresses(length) + addressSet := unique.New(addrs) + + if len(addrs) != len(addressSet) { + t.Fatalf("length of unique addresses %d, expected %d", len(addressSet), len(addrs)) + } + }) +} diff --git a/consensus/bor/span.go b/consensus/bor/span.go index 2fd0cf1079..4867635b8e 100644 --- a/consensus/bor/span.go +++ b/consensus/bor/span.go @@ -1,16 +1,17 @@ package bor -// Span represents a current bor span -type Span struct { - ID uint64 `json:"span_id" yaml:"span_id"` - StartBlock uint64 `json:"start_block" yaml:"start_block"` - EndBlock uint64 `json:"end_block" yaml:"end_block"` -} +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" + "github.com/ethereum/go-ethereum/consensus/bor/valset" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" +) -// HeimdallSpan represents span from heimdall APIs -type HeimdallSpan struct { - Span - ValidatorSet ValidatorSet `json:"validator_set" yaml:"validator_set"` - SelectedProducers []Validator `json:"selected_producers" yaml:"selected_producers"` - ChainID string `json:"bor_chain_id" yaml:"bor_chain_id"` +//go:generate mockgen -destination=./span_mock.go -package=bor . Spanner +type Spanner interface { + GetCurrentSpan(headerHash common.Hash) (*span.Span, error) + GetCurrentValidators(headerHash common.Hash, blockNumber uint64) ([]*valset.Validator, error) + CommitSpan(heimdallSpan span.HeimdallSpan, state *state.StateDB, header *types.Header, chainContext core.ChainContext) error } diff --git a/consensus/bor/span_mock.go b/consensus/bor/span_mock.go new file mode 100644 index 0000000000..12ed945234 --- /dev/null +++ b/consensus/bor/span_mock.go @@ -0,0 +1,84 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ethereum/go-ethereum/consensus/bor (interfaces: Spanner) + +// Package bor is a generated GoMock package. +package bor + +import ( + reflect "reflect" + + common "github.com/ethereum/go-ethereum/common" + span "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" + valset "github.com/ethereum/go-ethereum/consensus/bor/valset" + core "github.com/ethereum/go-ethereum/core" + state "github.com/ethereum/go-ethereum/core/state" + types "github.com/ethereum/go-ethereum/core/types" + gomock "github.com/golang/mock/gomock" +) + +// MockSpanner is a mock of Spanner interface. +type MockSpanner struct { + ctrl *gomock.Controller + recorder *MockSpannerMockRecorder +} + +// MockSpannerMockRecorder is the mock recorder for MockSpanner. +type MockSpannerMockRecorder struct { + mock *MockSpanner +} + +// NewMockSpanner creates a new mock instance. +func NewMockSpanner(ctrl *gomock.Controller) *MockSpanner { + mock := &MockSpanner{ctrl: ctrl} + mock.recorder = &MockSpannerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockSpanner) EXPECT() *MockSpannerMockRecorder { + return m.recorder +} + +// CommitSpan mocks base method. +func (m *MockSpanner) CommitSpan(arg0 span.HeimdallSpan, arg1 *state.StateDB, arg2 *types.Header, arg3 core.ChainContext) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CommitSpan", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// CommitSpan indicates an expected call of CommitSpan. +func (mr *MockSpannerMockRecorder) CommitSpan(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CommitSpan", reflect.TypeOf((*MockSpanner)(nil).CommitSpan), arg0, arg1, arg2, arg3) +} + +// GetCurrentSpan mocks base method. +func (m *MockSpanner) GetCurrentSpan(arg0 common.Hash) (*span.Span, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCurrentSpan", arg0) + ret0, _ := ret[0].(*span.Span) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCurrentSpan indicates an expected call of GetCurrentSpan. +func (mr *MockSpannerMockRecorder) GetCurrentSpan(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentSpan", reflect.TypeOf((*MockSpanner)(nil).GetCurrentSpan), arg0) +} + +// GetCurrentValidators mocks base method. +func (m *MockSpanner) GetCurrentValidators(arg0 common.Hash, arg1 uint64) ([]*valset.Validator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCurrentValidators", arg0, arg1) + ret0, _ := ret[0].([]*valset.Validator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCurrentValidators indicates an expected call of GetCurrentValidators. +func (mr *MockSpannerMockRecorder) GetCurrentValidators(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentValidators", reflect.TypeOf((*MockSpanner)(nil).GetCurrentValidators), arg0, arg1) +} diff --git a/consensus/bor/statefull/processor.go b/consensus/bor/statefull/processor.go new file mode 100644 index 0000000000..e30fb4fd21 --- /dev/null +++ b/consensus/bor/statefull/processor.go @@ -0,0 +1,93 @@ +package statefull + +import ( + "math" + "math/big" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" +) + +var systemAddress = common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE") + +type ChainContext struct { + Chain consensus.ChainHeaderReader + Bor consensus.Engine +} + +func (c ChainContext) Engine() consensus.Engine { + return c.Bor +} + +func (c ChainContext) GetHeader(hash common.Hash, number uint64) *types.Header { + return c.Chain.GetHeader(hash, number) +} + +// callmsg implements core.Message to allow passing it as a transaction simulator. +type callmsg struct { + ethereum.CallMsg +} + +func (m callmsg) From() common.Address { return m.CallMsg.From } +func (m callmsg) Nonce() uint64 { return 0 } +func (m callmsg) CheckNonce() bool { return false } +func (m callmsg) To() *common.Address { return m.CallMsg.To } +func (m callmsg) GasPrice() *big.Int { return m.CallMsg.GasPrice } +func (m callmsg) Gas() uint64 { return m.CallMsg.Gas } +func (m callmsg) Value() *big.Int { return m.CallMsg.Value } +func (m callmsg) Data() []byte { return m.CallMsg.Data } + +// get system message +func GetSystemMessage(toAddress common.Address, data []byte) callmsg { + return callmsg{ + ethereum.CallMsg{ + From: systemAddress, + Gas: math.MaxUint64 / 2, + GasPrice: big.NewInt(0), + Value: big.NewInt(0), + To: &toAddress, + Data: data, + }, + } +} + +// apply message +func ApplyMessage( + msg callmsg, + state *state.StateDB, + header *types.Header, + chainConfig *params.ChainConfig, + chainContext core.ChainContext, +) (uint64, error) { + initialGas := msg.Gas() + + // Create a new context to be used in the EVM environment + blockContext := core.NewEVMBlockContext(header, chainContext, &header.Coinbase) + + // Create a new environment which holds all relevant information + // about the transaction and calling mechanisms. + vmenv := vm.NewEVM(blockContext, vm.TxContext{}, state, chainConfig, vm.Config{}) + + // Apply the transaction to the current state (included in the env) + _, gasLeft, err := vmenv.Call( + vm.AccountRef(msg.From()), + *msg.To(), + msg.Data(), + msg.Gas(), + msg.Value(), + ) + // Update the state with pending changes + if err != nil { + state.Finalise(true) + } + + gasUsed := initialGas - gasLeft + + return gasUsed, nil +} diff --git a/consensus/bor/validators_getter.go b/consensus/bor/validators_getter.go new file mode 100644 index 0000000000..90d1fccf6e --- /dev/null +++ b/consensus/bor/validators_getter.go @@ -0,0 +1,11 @@ +package bor + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/bor/valset" +) + +//go:generate mockgen -destination=./validators_getter_mock.go -package=bor . ValidatorsGetter +type ValidatorsGetter interface { + GetCurrentValidators(headerHash common.Hash, blockNumber uint64) ([]*valset.Validator, error) +} diff --git a/consensus/bor/validators_getter_mock.go b/consensus/bor/validators_getter_mock.go new file mode 100644 index 0000000000..ad99489d8e --- /dev/null +++ b/consensus/bor/validators_getter_mock.go @@ -0,0 +1,51 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ethereum/go-ethereum/consensus/bor (interfaces: ValidatorsGetter) + +// Package bor is a generated GoMock package. +package bor + +import ( + reflect "reflect" + + common "github.com/ethereum/go-ethereum/common" + valset "github.com/ethereum/go-ethereum/consensus/bor/valset" + gomock "github.com/golang/mock/gomock" +) + +// MockValidatorsGetter is a mock of ValidatorsGetter interface. +type MockValidatorsGetter struct { + ctrl *gomock.Controller + recorder *MockValidatorsGetterMockRecorder +} + +// MockValidatorsGetterMockRecorder is the mock recorder for MockValidatorsGetter. +type MockValidatorsGetterMockRecorder struct { + mock *MockValidatorsGetter +} + +// NewMockValidatorsGetter creates a new mock instance. +func NewMockValidatorsGetter(ctrl *gomock.Controller) *MockValidatorsGetter { + mock := &MockValidatorsGetter{ctrl: ctrl} + mock.recorder = &MockValidatorsGetterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockValidatorsGetter) EXPECT() *MockValidatorsGetterMockRecorder { + return m.recorder +} + +// GetCurrentValidators mocks base method. +func (m *MockValidatorsGetter) GetCurrentValidators(arg0 common.Hash, arg1 uint64) ([]*valset.Validator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCurrentValidators", arg0, arg1) + ret0, _ := ret[0].([]*valset.Validator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCurrentValidators indicates an expected call of GetCurrentValidators. +func (mr *MockValidatorsGetterMockRecorder) GetCurrentValidators(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentValidators", reflect.TypeOf((*MockValidatorsGetter)(nil).GetCurrentValidators), arg0, arg1) +} diff --git a/consensus/bor/valset/error.go b/consensus/bor/valset/error.go new file mode 100644 index 0000000000..37add21683 --- /dev/null +++ b/consensus/bor/valset/error.go @@ -0,0 +1,32 @@ +package valset + +import "fmt" + +// TotalVotingPowerExceededError is returned when the maximum allowed total voting power is exceeded +type TotalVotingPowerExceededError struct { + Sum int64 + Validators []*Validator +} + +func (e *TotalVotingPowerExceededError) Error() string { + return fmt.Sprintf( + "Total voting power should be guarded to not exceed %v; got: %v; for validator set: %v", + MaxTotalVotingPower, + e.Sum, + e.Validators, + ) +} + +type InvalidStartEndBlockError struct { + Start uint64 + End uint64 + CurrentHeader uint64 +} + +func (e *InvalidStartEndBlockError) Error() string { + return fmt.Sprintf( + "Invalid parameters start: %d and end block: %d params", + e.Start, + e.End, + ) +} diff --git a/consensus/bor/validator.go b/consensus/bor/valset/validator.go similarity index 99% rename from consensus/bor/validator.go rename to consensus/bor/valset/validator.go index 57905fdf89..250206c1f3 100644 --- a/consensus/bor/validator.go +++ b/consensus/bor/valset/validator.go @@ -1,8 +1,7 @@ -package bor +package valset import ( "bytes" - // "encoding/json" "errors" "fmt" "math/big" diff --git a/consensus/bor/validator_set.go b/consensus/bor/valset/validator_set.go similarity index 99% rename from consensus/bor/validator_set.go rename to consensus/bor/valset/validator_set.go index ee14ef2cb1..19e6c681fe 100644 --- a/consensus/bor/validator_set.go +++ b/consensus/bor/valset/validator_set.go @@ -1,4 +1,4 @@ -package bor +package valset // Tendermint leader selection algorithm @@ -55,8 +55,8 @@ type ValidatorSet struct { // function panics. func NewValidatorSet(valz []*Validator) *ValidatorSet { vals := &ValidatorSet{} - err := vals.updateWithChangeSet(valz, false) + err := vals.updateWithChangeSet(valz, false) if err != nil { panic(fmt.Sprintf("cannot create validator set: %s", err)) } @@ -281,7 +281,7 @@ func (vals *ValidatorSet) Size() int { } // Force recalculation of the set's total voting power. -func (vals *ValidatorSet) updateTotalVotingPower() error { +func (vals *ValidatorSet) UpdateTotalVotingPower() error { sum := int64(0) for _, val := range vals.Validators { // mind overflow @@ -302,7 +302,7 @@ func (vals *ValidatorSet) TotalVotingPower() int64 { if vals.totalVotingPower == 0 { log.Info("invoking updateTotalVotingPower before returning it") - if err := vals.updateTotalVotingPower(); err != nil { + if err := vals.UpdateTotalVotingPower(); err != nil { // Can/should we do better? panic(err) } @@ -602,7 +602,7 @@ func (vals *ValidatorSet) updateWithChangeSet(changes []*Validator, allowDeletes vals.applyUpdates(updates) vals.applyRemovals(deletes) - if err := vals.updateTotalVotingPower(); err != nil { + if err := vals.UpdateTotalVotingPower(); err != nil { return err } diff --git a/consensus/merger.go b/consensus/merger.go index ffbcbf2b85..c435ecf91e 100644 --- a/consensus/merger.go +++ b/consensus/merger.go @@ -45,12 +45,14 @@ type Merger struct { // NewMerger creates a new Merger which stores its transition status in the provided db. func NewMerger(db ethdb.KeyValueStore) *Merger { var status transitionStatus + blob := rawdb.ReadTransitionStatus(db) if len(blob) != 0 { if err := rlp.DecodeBytes(blob, &status); err != nil { log.Crit("Failed to decode the transition status", "err", err) } } + return &Merger{ db: db, status: status, diff --git a/core/bench_test.go b/core/bench_test.go index 959979763d..ad6179d0a8 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -305,7 +305,8 @@ func benchReadChain(b *testing.B, full bool, count uint64) { } makeChainForBench(db, full, count) db.Close() - cacheConfig := *defaultCacheConfig + + cacheConfig := *DefaultCacheConfig cacheConfig.TrieDirtyDisabled = true b.ReportAllocs() diff --git a/core/blockchain.go b/core/blockchain.go index 1b11c781c5..8a4c581f66 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -27,6 +27,8 @@ import ( "sync/atomic" "time" + lru "github.com/hashicorp/golang-lru" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/mclock" "github.com/ethereum/go-ethereum/common/prque" @@ -43,7 +45,6 @@ import ( "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" - lru "github.com/hashicorp/golang-lru" ) var ( @@ -133,9 +134,9 @@ type CacheConfig struct { SnapshotWait bool // Wait for snapshot construction on startup. TODO(karalabe): This is a dirty hack for testing, nuke it } -// defaultCacheConfig are the default caching values if none are specified by the +// DefaultCacheConfig are the default caching values if none are specified by the // user (also used during testing). -var defaultCacheConfig = &CacheConfig{ +var DefaultCacheConfig = &CacheConfig{ TrieCleanLimit: 256, TrieDirtyLimit: 256, TrieTimeLimit: 5 * time.Minute, @@ -222,7 +223,7 @@ type BlockChain struct { // and Processor. func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config, shouldPreserve func(header *types.Header) bool, txLookupLimit *uint64) (*BlockChain, error) { if cacheConfig == nil { - cacheConfig = defaultCacheConfig + cacheConfig = DefaultCacheConfig } bodyCache, _ := lru.New(bodyCacheLimit) bodyRLPCache, _ := lru.New(bodyCacheLimit) diff --git a/core/blockchain_reader.go b/core/blockchain_reader.go index b93444b8cd..f61f930496 100644 --- a/core/blockchain_reader.go +++ b/core/blockchain_reader.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/core/state/snapshot" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" @@ -397,10 +398,25 @@ func (bc *BlockChain) SubscribeBlockProcessingEvent(ch chan<- bool) event.Subscr return bc.scope.Track(bc.blockProcFeed.Subscribe(ch)) } +// Snaps retrieves the snapshot tree. +func (bc *BlockChain) Snaps() *snapshot.Tree { + return bc.snaps +} + +// DB retrieves the blockchain database. +func (bc *BlockChain) DB() ethdb.Database { + return bc.db +} + // // Bor related changes // +type BorStateSyncer interface { + SetStateSync(stateData []*types.StateSyncData) + SubscribeStateSyncEvent(ch chan<- StateSyncEvent) event.Subscription +} + // SetStateSync set sync data in state_data func (bc *BlockChain) SetStateSync(stateData []*types.StateSyncData) { bc.stateSyncData = stateData diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 37a1a42d0c..de97000918 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -920,7 +920,7 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { archiveDb, delfn := makeDb() defer delfn() - archiveCaching := *defaultCacheConfig + archiveCaching := *DefaultCacheConfig archiveCaching.TrieDirtyDisabled = true archive, _ := NewBlockChain(archiveDb, &archiveCaching, gspec.Config, ethash.NewFaker(), vm.Config{}, nil, nil) diff --git a/core/chain_makers.go b/core/chain_makers.go index c7bf60a4b0..4b2d2082df 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -27,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" ) @@ -334,7 +335,10 @@ func makeBlockChain(parent *types.Block, n int, engine consensus.Engine, db ethd } type fakeChainReader struct { - config *params.ChainConfig + config *params.ChainConfig + stateSyncData []*types.StateSyncData + stateSyncFeed event.Feed + scope event.SubscriptionScope } // Config returns the chain configuration. @@ -348,3 +352,13 @@ func (cr *fakeChainReader) GetHeaderByHash(hash common.Hash) *types.Header func (cr *fakeChainReader) GetHeader(hash common.Hash, number uint64) *types.Header { return nil } func (cr *fakeChainReader) GetBlock(hash common.Hash, number uint64) *types.Block { return nil } func (cr *fakeChainReader) GetTd(hash common.Hash, number uint64) *big.Int { return nil } + +// SetStateSync set sync data in state_data +func (cr *fakeChainReader) SetStateSync(stateData []*types.StateSyncData) { + cr.stateSyncData = stateData +} + +// SubscribeStateSyncEvent registers a subscription of StateSyncEvent. +func (cr *fakeChainReader) SubscribeStateSyncEvent(ch chan<- StateSyncEvent) event.Subscription { + return cr.scope.Track(cr.stateSyncFeed.Subscribe(ch)) +} diff --git a/core/state_processor_test.go b/core/state_processor_test.go index 7d6939e1dc..158e8c1eeb 100644 --- a/core/state_processor_test.go +++ b/core/state_processor_test.go @@ -21,6 +21,8 @@ import ( "math/big" "testing" + "golang.org/x/crypto/sha3" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/consensus" @@ -32,7 +34,6 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" - "golang.org/x/crypto/sha3" ) // TestStateProcessorErrors tests the output from the 'core' errors @@ -308,7 +309,7 @@ func GenerateBadBlock(parent *types.Block, engine consensus.Engine, txs types.Tr header := &types.Header{ ParentHash: parent.Hash(), Coinbase: parent.Coinbase(), - Difficulty: engine.CalcDifficulty(&fakeChainReader{config}, parent.Time()+10, &types.Header{ + Difficulty: engine.CalcDifficulty(&fakeChainReader{config: config}, parent.Time()+10, &types.Header{ Number: parent.Number(), Time: parent.Time(), Difficulty: parent.Difficulty(), diff --git a/core/blockchain_repair_test.go b/core/tests/blockchain_repair_test.go similarity index 93% rename from core/blockchain_repair_test.go rename to core/tests/blockchain_repair_test.go index 9133671796..b52bf76fd9 100644 --- a/core/blockchain_repair_test.go +++ b/core/tests/blockchain_repair_test.go @@ -18,7 +18,7 @@ // the database in some strange state with gaps in the chain, nor with block data // dangling in the future. -package core +package tests import ( "io/ioutil" @@ -27,12 +27,22 @@ import ( "testing" "time" + "github.com/golang/mock/gomock" + + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/consensus/bor/api" + "github.com/ethereum/go-ethereum/consensus/bor/valset" "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "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/miner" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/tests/bor/mocks" ) // Tests a recovery for a short canonical chain where a recent block was already @@ -1750,7 +1760,17 @@ func testLongReorgedSnapSyncingDeepRepair(t *testing.T, snapshots bool) { }, snapshots) } +var ( + testKey1, _ = crypto.GenerateKey() + testAddress1 = crypto.PubkeyToAddress(testKey1.PublicKey) + + testKey2, _ = crypto.GenerateKey() + testAddress2 = crypto.PubkeyToAddress(testKey2.PublicKey) //nolint:unused,varcheck +) + func testRepair(t *testing.T, tt *rewindTest, snapshots bool) { + t.Skip("need to add a proper signer for Bor consensus") + // It's hard to follow the test case, visualize the input //log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) // fmt.Println(tt.dump(true)) @@ -1768,47 +1788,104 @@ func testRepair(t *testing.T, tt *rewindTest, snapshots bool) { } defer db.Close() // Might double close, should be fine + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + ethAPIMock := api.NewMockCaller(ctrl) + ethAPIMock.EXPECT().Call(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + + spanner := bor.NewMockSpanner(ctrl) + spanner.EXPECT().GetCurrentValidators(gomock.Any(), gomock.Any()).Return([]*valset.Validator{ + { + ID: 0, + Address: common.Address{0x1}, + VotingPower: 100, + ProposerPriority: 0, + }, + }, nil).AnyTimes() + + heimdallClientMock := mocks.NewMockIHeimdallClient(ctrl) + heimdallClientMock.EXPECT().Close().Times(1) + + contractMock := bor.NewMockGenesisContract(ctrl) + // Initialize a fresh chain var ( - genesis = (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) - engine = ethash.NewFullFaker() - config = &CacheConfig{ + gspec = &core.Genesis{ + Config: params.BorUnittestChainConfig, + BaseFee: big.NewInt(params.InitialBaseFee), + } + config = &core.CacheConfig{ TrieCleanLimit: 256, TrieDirtyLimit: 256, TrieTimeLimit: 5 * time.Minute, SnapshotLimit: 0, // Disable snapshot by default } ) + + engine := miner.NewFakeBor(t, db, params.BorUnittestChainConfig, ethAPIMock, spanner, heimdallClientMock, contractMock) defer engine.Close() + + engineBorInternal, ok := engine.(*bor.Bor) + if ok { + gspec.ExtraData = make([]byte, 32+common.AddressLength+crypto.SignatureLength) + copy(gspec.ExtraData[32:32+common.AddressLength], testAddress1.Bytes()) + + engineBorInternal.Authorize(testAddress1, func(account accounts.Account, s string, data []byte) ([]byte, error) { + return crypto.Sign(crypto.Keccak256(data), testKey1) + }) + } + + genesis := gspec.MustCommit(db) + if snapshots { config.SnapshotLimit = 256 config.SnapshotWait = true } - chain, err := NewBlockChain(db, config, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + + chain, err := core.NewBlockChain(db, config, params.BorUnittestChainConfig, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to create chain: %v", err) } + // If sidechain blocks are needed, make a light chain and import it var sideblocks types.Blocks if tt.sidechainBlocks > 0 { - sideblocks, _ = GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), tt.sidechainBlocks, func(i int, b *BlockGen) { - b.SetCoinbase(common.Address{0x01}) + sideblocks, _ = core.GenerateChain(params.BorUnittestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), tt.sidechainBlocks, func(i int, b *core.BlockGen) { + b.SetCoinbase(testAddress1) + + if bor.IsSprintStart(b.Number().Uint64(), params.BorUnittestChainConfig.Bor.Sprint) { + b.SetExtra(gspec.ExtraData) + } else { + b.SetExtra(make([]byte, 32+crypto.SignatureLength)) + } }) if _, err := chain.InsertChain(sideblocks); err != nil { t.Fatalf("Failed to import side chain: %v", err) } } - canonblocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), tt.canonicalBlocks, func(i int, b *BlockGen) { + + canonblocks, _ := core.GenerateChain(params.BorUnittestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), tt.canonicalBlocks, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{0x02}) b.SetDifficulty(big.NewInt(1000000)) + + if bor.IsSprintStart(b.Number().Uint64(), params.BorUnittestChainConfig.Bor.Sprint) { + b.SetExtra(gspec.ExtraData) + } else { + b.SetExtra(make([]byte, 32+crypto.SignatureLength)) + } }) if _, err := chain.InsertChain(canonblocks[:tt.commitBlock]); err != nil { t.Fatalf("Failed to import canonical chain start: %v", err) } if tt.commitBlock > 0 { - chain.stateCache.TrieDB().Commit(canonblocks[tt.commitBlock-1].Root(), true, nil) + err = chain.StateCache().TrieDB().Commit(canonblocks[tt.commitBlock-1].Root(), true, nil) + if err != nil { + t.Fatal("on trieDB.Commit", err) + } + if snapshots { - if err := chain.snaps.Cap(canonblocks[tt.commitBlock-1].Root(), 0); err != nil { + if err := chain.Snaps().Cap(canonblocks[tt.commitBlock-1].Root(), 0); err != nil { t.Fatalf("Failed to flatten snapshots: %v", err) } } @@ -1837,7 +1914,7 @@ func testRepair(t *testing.T, tt *rewindTest, snapshots bool) { } defer db.Close() - newChain, err := NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + newChain, err := core.NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } @@ -1888,19 +1965,21 @@ func TestIssue23496(t *testing.T) { if err != nil { t.Fatalf("Failed to create temporary datadir: %v", err) } + os.RemoveAll(datadir) db, err := rawdb.NewLevelDBDatabaseWithFreezer(datadir, 0, 0, datadir, "", false) if err != nil { t.Fatalf("Failed to create persistent database: %v", err) } + defer db.Close() // Might double close, should be fine // Initialize a fresh chain var ( - genesis = (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) + genesis = (&core.Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) engine = ethash.NewFullFaker() - config = &CacheConfig{ + config = &core.CacheConfig{ TrieCleanLimit: 256, TrieDirtyLimit: 256, TrieTimeLimit: 5 * time.Minute, @@ -1908,11 +1987,13 @@ func TestIssue23496(t *testing.T) { SnapshotWait: true, } ) - chain, err := NewBlockChain(db, config, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + + chain, err := core.NewBlockChain(db, config, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to create chain: %v", err) } - blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), 4, func(i int, b *BlockGen) { + + blocks, _ := core.GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), 4, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{0x02}) b.SetDifficulty(big.NewInt(1000000)) }) @@ -1921,13 +2002,18 @@ func TestIssue23496(t *testing.T) { if _, err := chain.InsertChain(blocks[:1]); err != nil { t.Fatalf("Failed to import canonical chain start: %v", err) } - chain.stateCache.TrieDB().Commit(blocks[0].Root(), true, nil) + + err = chain.StateCache().TrieDB().Commit(blocks[0].Root(), true, nil) + if err != nil { + t.Fatal("on trieDB.Commit", err) + } // Insert block B2 and commit the snapshot into disk if _, err := chain.InsertChain(blocks[1:2]); err != nil { t.Fatalf("Failed to import canonical chain start: %v", err) } - if err := chain.snaps.Cap(blocks[1].Root(), 0); err != nil { + + if err := chain.Snaps().Cap(blocks[1].Root(), 0); err != nil { t.Fatalf("Failed to flatten snapshots: %v", err) } @@ -1935,7 +2021,11 @@ func TestIssue23496(t *testing.T) { if _, err := chain.InsertChain(blocks[2:3]); err != nil { t.Fatalf("Failed to import canonical chain start: %v", err) } - chain.stateCache.TrieDB().Commit(blocks[2].Root(), true, nil) + + err = chain.StateCache().TrieDB().Commit(blocks[2].Root(), true, nil) + if err != nil { + t.Fatal("on trieDB.Commit", err) + } // Insert the remaining blocks if _, err := chain.InsertChain(blocks[3:]); err != nil { @@ -1950,20 +2040,24 @@ func TestIssue23496(t *testing.T) { if err != nil { t.Fatalf("Failed to reopen persistent database: %v", err) } + defer db.Close() - chain, err = NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + chain, err = core.NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } + defer chain.Stop() if head := chain.CurrentHeader(); head.Number.Uint64() != uint64(4) { t.Errorf("Head header mismatch: have %d, want %d", head.Number, 4) } + if head := chain.CurrentFastBlock(); head.NumberU64() != uint64(4) { t.Errorf("Head fast block mismatch: have %d, want %d", head.NumberU64(), uint64(4)) } + if head := chain.CurrentBlock(); head.NumberU64() != uint64(1) { t.Errorf("Head block mismatch: have %d, want %d", head.NumberU64(), uint64(1)) } @@ -1972,15 +2066,19 @@ func TestIssue23496(t *testing.T) { if _, err := chain.InsertChain(blocks[1:]); err != nil { t.Fatalf("Failed to import canonical chain tail: %v", err) } + if head := chain.CurrentHeader(); head.Number.Uint64() != uint64(4) { t.Errorf("Head header mismatch: have %d, want %d", head.Number, 4) } + if head := chain.CurrentFastBlock(); head.NumberU64() != uint64(4) { t.Errorf("Head fast block mismatch: have %d, want %d", head.NumberU64(), uint64(4)) } + if head := chain.CurrentBlock(); head.NumberU64() != uint64(4) { t.Errorf("Head block mismatch: have %d, want %d", head.NumberU64(), uint64(4)) } + if layer := chain.Snapshots().Snapshot(blocks[2].Root()); layer == nil { t.Error("Failed to regenerate the snapshot of known state") } diff --git a/core/blockchain_sethead_test.go b/core/tests/blockchain_sethead_test.go similarity index 98% rename from core/blockchain_sethead_test.go rename to core/tests/blockchain_sethead_test.go index b2b3a058a4..3a2d87c4eb 100644 --- a/core/blockchain_sethead_test.go +++ b/core/tests/blockchain_sethead_test.go @@ -17,7 +17,7 @@ // Tests that setting the chain head backwards doesn't leave the database in some // strange state with gaps in the chain, nor with block data dangling in the future. -package core +package tests import ( "fmt" @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" @@ -1959,79 +1960,98 @@ func testSetHead(t *testing.T, tt *rewindTest, snapshots bool) { if err != nil { t.Fatalf("Failed to create temporary datadir: %v", err) } + os.RemoveAll(datadir) db, err := rawdb.NewLevelDBDatabaseWithFreezer(datadir, 0, 0, datadir, "", false) if err != nil { t.Fatalf("Failed to create persistent database: %v", err) } + defer db.Close() // Initialize a fresh chain var ( - genesis = (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) + genesis = (&core.Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) engine = ethash.NewFullFaker() - config = &CacheConfig{ + config = &core.CacheConfig{ TrieCleanLimit: 256, TrieDirtyLimit: 256, TrieTimeLimit: 5 * time.Minute, SnapshotLimit: 0, // Disable snapshot } ) + if snapshots { config.SnapshotLimit = 256 config.SnapshotWait = true } - chain, err := NewBlockChain(db, config, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + + chain, err := core.NewBlockChain(db, config, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to create chain: %v", err) } + // If sidechain blocks are needed, make a light chain and import it var sideblocks types.Blocks if tt.sidechainBlocks > 0 { - sideblocks, _ = GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), tt.sidechainBlocks, func(i int, b *BlockGen) { + sideblocks, _ = core.GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), tt.sidechainBlocks, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{0x01}) }) + if _, err := chain.InsertChain(sideblocks); err != nil { t.Fatalf("Failed to import side chain: %v", err) } } - canonblocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), tt.canonicalBlocks, func(i int, b *BlockGen) { + + canonblocks, _ := core.GenerateChain(params.TestChainConfig, genesis, engine, rawdb.NewMemoryDatabase(), tt.canonicalBlocks, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{0x02}) b.SetDifficulty(big.NewInt(1000000)) }) + if _, err := chain.InsertChain(canonblocks[:tt.commitBlock]); err != nil { t.Fatalf("Failed to import canonical chain start: %v", err) } + if tt.commitBlock > 0 { - chain.stateCache.TrieDB().Commit(canonblocks[tt.commitBlock-1].Root(), true, nil) + err = chain.StateCache().TrieDB().Commit(canonblocks[tt.commitBlock-1].Root(), true, nil) + if err != nil { + t.Fatal("on trieDB.Commit", err) + } + if snapshots { - if err := chain.snaps.Cap(canonblocks[tt.commitBlock-1].Root(), 0); err != nil { + if err := chain.Snaps().Cap(canonblocks[tt.commitBlock-1].Root(), 0); err != nil { t.Fatalf("Failed to flatten snapshots: %v", err) } } } + if _, err := chain.InsertChain(canonblocks[tt.commitBlock:]); err != nil { t.Fatalf("Failed to import canonical chain tail: %v", err) } + // Manually dereference anything not committed to not have to work with 128+ tries for _, block := range sideblocks { - chain.stateCache.TrieDB().Dereference(block.Root()) + chain.StateCache().TrieDB().Dereference(block.Root()) } + for _, block := range canonblocks { - chain.stateCache.TrieDB().Dereference(block.Root()) + chain.StateCache().TrieDB().Dereference(block.Root()) } + // Force run a freeze cycle type freezer interface { Freeze(threshold uint64) error Ancients() (uint64, error) } + db.(freezer).Freeze(tt.freezeThreshold) // Set the simulated pivot block if tt.pivotBlock != nil { rawdb.WriteLastPivotNumber(db, *tt.pivotBlock) } + // Set the head of the chain back to the requested number chain.SetHead(tt.setheadBlock) @@ -2044,12 +2064,15 @@ func testSetHead(t *testing.T, tt *rewindTest, snapshots bool) { if head := chain.CurrentHeader(); head.Number.Uint64() != tt.expHeadHeader { t.Errorf("Head header mismatch: have %d, want %d", head.Number, tt.expHeadHeader) } + if head := chain.CurrentFastBlock(); head.NumberU64() != tt.expHeadFastBlock { t.Errorf("Head fast block mismatch: have %d, want %d", head.NumberU64(), tt.expHeadFastBlock) } + if head := chain.CurrentBlock(); head.NumberU64() != tt.expHeadBlock { t.Errorf("Head block mismatch: have %d, want %d", head.NumberU64(), tt.expHeadBlock) } + if frozen, err := db.(freezer).Ancients(); err != nil { t.Errorf("Failed to retrieve ancient count: %v\n", err) } else if int(frozen) != tt.expFrozen { @@ -2059,7 +2082,8 @@ func testSetHead(t *testing.T, tt *rewindTest, snapshots bool) { // verifyNoGaps checks that there are no gaps after the initial set of blocks in // the database and errors if found. -func verifyNoGaps(t *testing.T, chain *BlockChain, canonical bool, inserted types.Blocks) { +//nolint:gocognit +func verifyNoGaps(t *testing.T, chain *core.BlockChain, canonical bool, inserted types.Blocks) { t.Helper() var end uint64 @@ -2111,7 +2135,8 @@ func verifyNoGaps(t *testing.T, chain *BlockChain, canonical bool, inserted type // verifyCutoff checks that there are no chain data available in the chain after // the specified limit, but that it is available before. -func verifyCutoff(t *testing.T, chain *BlockChain, canonical bool, inserted types.Blocks, head int) { +//nolint:gocognit +func verifyCutoff(t *testing.T, chain *core.BlockChain, canonical bool, inserted types.Blocks, head int) { t.Helper() for i := 1; i <= len(inserted); i++ { diff --git a/core/blockchain_snapshot_test.go b/core/tests/blockchain_snapshot_test.go similarity index 87% rename from core/blockchain_snapshot_test.go rename to core/tests/blockchain_snapshot_test.go index a8044ecb4d..fb4c09867c 100644 --- a/core/blockchain_snapshot_test.go +++ b/core/tests/blockchain_snapshot_test.go @@ -17,7 +17,7 @@ // Tests that abnormal program termination (i.e.crash) and restart can recovery // the snapshot properly if the snapshot is enabled. -package core +package tests import ( "bytes" @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" @@ -57,7 +58,9 @@ type snapshotTestBasic struct { engine consensus.Engine } -func (basic *snapshotTestBasic) prepare(t *testing.T) (*BlockChain, []*types.Block) { +func (basic *snapshotTestBasic) prepare(t *testing.T) (*core.BlockChain, []*types.Block) { + t.Helper() + // Create a temporary persistent database datadir, err := ioutil.TempDir("", "") if err != nil { @@ -71,20 +74,22 @@ func (basic *snapshotTestBasic) prepare(t *testing.T) (*BlockChain, []*types.Blo } // Initialize a fresh chain var ( - genesis = (&Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) + genesis = (&core.Genesis{BaseFee: big.NewInt(params.InitialBaseFee)}).MustCommit(db) engine = ethash.NewFullFaker() gendb = rawdb.NewMemoryDatabase() // Snapshot is enabled, the first snapshot is created from the Genesis. // The snapshot memory allowance is 256MB, it means no snapshot flush // will happen during the block insertion. - cacheConfig = defaultCacheConfig + cacheConfig = core.DefaultCacheConfig ) - chain, err := NewBlockChain(db, cacheConfig, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) + + chain, err := core.NewBlockChain(db, cacheConfig, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to create chain: %v", err) } - blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, gendb, basic.chainBlocks, func(i int, b *BlockGen) {}) + + blocks, _ := core.GenerateChain(params.TestChainConfig, genesis, engine, gendb, basic.chainBlocks, func(i int, b *core.BlockGen) {}) // Insert the blocks with configured settings. var breakpoints []uint64 @@ -93,27 +98,39 @@ func (basic *snapshotTestBasic) prepare(t *testing.T) (*BlockChain, []*types.Blo } else { breakpoints = append(breakpoints, basic.commitBlock, basic.snapshotBlock) } + var startPoint uint64 + for _, point := range breakpoints { if _, err := chain.InsertChain(blocks[startPoint:point]); err != nil { t.Fatalf("Failed to import canonical chain start: %v", err) } + startPoint = point if basic.commitBlock > 0 && basic.commitBlock == point { - chain.stateCache.TrieDB().Commit(blocks[point-1].Root(), true, nil) + err = chain.StateCache().TrieDB().Commit(blocks[point-1].Root(), true, nil) + if err != nil { + t.Fatal("on trieDB.Commit", err) + } } + if basic.snapshotBlock > 0 && basic.snapshotBlock == point { // Flushing the entire snap tree into the disk, the // relevant (a) snapshot root and (b) snapshot generator // will be persisted atomically. - chain.snaps.Cap(blocks[point-1].Root(), 0) - diskRoot, blockRoot := chain.snaps.DiskRoot(), blocks[point-1].Root() + err = chain.Snaps().Cap(blocks[point-1].Root(), 0) + if err != nil { + t.Fatal("on Snaps.Cap", err) + } + + diskRoot, blockRoot := chain.Snaps().DiskRoot(), blocks[point-1].Root() if !bytes.Equal(diskRoot.Bytes(), blockRoot.Bytes()) { t.Fatalf("Failed to flush disk layer change, want %x, got %x", blockRoot, diskRoot) } } } + if _, err := chain.InsertChain(blocks[startPoint:]); err != nil { t.Fatalf("Failed to import canonical chain tail: %v", err) } @@ -123,10 +140,13 @@ func (basic *snapshotTestBasic) prepare(t *testing.T) (*BlockChain, []*types.Blo basic.db = db basic.gendb = gendb basic.engine = engine + return chain, blocks } -func (basic *snapshotTestBasic) verify(t *testing.T, chain *BlockChain, blocks []*types.Block) { +func (basic *snapshotTestBasic) verify(t *testing.T, chain *core.BlockChain, blocks []*types.Block) { + t.Helper() + // Iterate over all the remaining blocks and ensure there are no gaps verifyNoGaps(t, chain, true, blocks) verifyCutoff(t, chain, true, blocks, basic.expCanonicalBlocks) @@ -134,9 +154,11 @@ func (basic *snapshotTestBasic) verify(t *testing.T, chain *BlockChain, blocks [ if head := chain.CurrentHeader(); head.Number.Uint64() != basic.expHeadHeader { t.Errorf("Head header mismatch: have %d, want %d", head.Number, basic.expHeadHeader) } + if head := chain.CurrentFastBlock(); head.NumberU64() != basic.expHeadFastBlock { t.Errorf("Head fast block mismatch: have %d, want %d", head.NumberU64(), basic.expHeadFastBlock) } + if head := chain.CurrentBlock(); head.NumberU64() != basic.expHeadBlock { t.Errorf("Head block mismatch: have %d, want %d", head.NumberU64(), basic.expHeadBlock) } @@ -145,12 +167,12 @@ func (basic *snapshotTestBasic) verify(t *testing.T, chain *BlockChain, blocks [ block := chain.GetBlockByNumber(basic.expSnapshotBottom) if block == nil { t.Errorf("The correspnding block[%d] of snapshot disk layer is missing", basic.expSnapshotBottom) - } else if !bytes.Equal(chain.snaps.DiskRoot().Bytes(), block.Root().Bytes()) { - t.Errorf("The snapshot disk layer root is incorrect, want %x, get %x", block.Root(), chain.snaps.DiskRoot()) + } else if !bytes.Equal(chain.Snaps().DiskRoot().Bytes(), block.Root().Bytes()) { + t.Errorf("The snapshot disk layer root is incorrect, want %x, get %x", block.Root(), chain.Snaps().DiskRoot()) } // Check the snapshot, ensure it's integrated - if err := chain.snaps.Verify(block.Root()); err != nil { + if err := chain.Snaps().Verify(block.Root()); err != nil { t.Errorf("The disk layer is not integrated %v", err) } } @@ -223,10 +245,12 @@ func (snaptest *snapshotTest) test(t *testing.T) { // Restart the chain normally chain.Stop() - newchain, err := NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + + newchain, err := core.NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } + defer newchain.Stop() snaptest.verify(t, newchain, blocks) @@ -245,7 +269,7 @@ func (snaptest *crashSnapshotTest) test(t *testing.T) { chain, blocks := snaptest.prepare(t) // Pull the plug on the database, simulating a hard crash - db := chain.db + db := chain.DB() db.Close() // Start a new blockchain back up and see where the repair leads us @@ -259,13 +283,13 @@ func (snaptest *crashSnapshotTest) test(t *testing.T) { // the crash, we do restart twice here: one after the crash and one // after the normal stop. It's used to ensure the broken snapshot // can be detected all the time. - newchain, err := NewBlockChain(newdb, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + newchain, err := core.NewBlockChain(newdb, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } newchain.Stop() - newchain, err = NewBlockChain(newdb, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + newchain, err = core.NewBlockChain(newdb, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } @@ -292,27 +316,31 @@ func (snaptest *gappedSnapshotTest) test(t *testing.T) { // Insert blocks without enabling snapshot if gapping is required. chain.Stop() - gappedBlocks, _ := GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], snaptest.engine, snaptest.gendb, snaptest.gapped, func(i int, b *BlockGen) {}) + + gappedBlocks, _ := core.GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], snaptest.engine, snaptest.gendb, snaptest.gapped, func(i int, b *core.BlockGen) {}) // Insert a few more blocks without enabling snapshot - var cacheConfig = &CacheConfig{ + var cacheConfig = &core.CacheConfig{ TrieCleanLimit: 256, TrieDirtyLimit: 256, TrieTimeLimit: 5 * time.Minute, SnapshotLimit: 0, } - newchain, err := NewBlockChain(snaptest.db, cacheConfig, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + + newchain, err := core.NewBlockChain(snaptest.db, cacheConfig, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } + newchain.InsertChain(gappedBlocks) newchain.Stop() // Restart the chain with enabling the snapshot - newchain, err = NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + newchain, err = core.NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } + defer newchain.Stop() snaptest.verify(t, newchain, blocks) @@ -337,7 +365,7 @@ func (snaptest *setHeadSnapshotTest) test(t *testing.T) { chain.SetHead(snaptest.setHead) chain.Stop() - newchain, err := NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + newchain, err := core.NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } @@ -368,11 +396,12 @@ func (snaptest *restartCrashSnapshotTest) test(t *testing.T) { // and state committed. chain.Stop() - newchain, err := NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + newchain, err := core.NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } - newBlocks, _ := GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], snaptest.engine, snaptest.gendb, snaptest.newBlocks, func(i int, b *BlockGen) {}) + + newBlocks, _ := core.GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], snaptest.engine, snaptest.gendb, snaptest.newBlocks, func(i int, b *core.BlockGen) {}) newchain.InsertChain(newBlocks) // Commit the entire snapshot into the disk if requested. Note only @@ -385,7 +414,7 @@ func (snaptest *restartCrashSnapshotTest) test(t *testing.T) { // journal and latest state will be committed // Restart the chain after the crash - newchain, err = NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + newchain, err = core.NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } @@ -414,38 +443,42 @@ func (snaptest *wipeCrashSnapshotTest) test(t *testing.T) { // and state committed. chain.Stop() - config := &CacheConfig{ + config := &core.CacheConfig{ TrieCleanLimit: 256, TrieDirtyLimit: 256, TrieTimeLimit: 5 * time.Minute, SnapshotLimit: 0, } - newchain, err := NewBlockChain(snaptest.db, config, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + + newchain, err := core.NewBlockChain(snaptest.db, config, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } - newBlocks, _ := GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], snaptest.engine, snaptest.gendb, snaptest.newBlocks, func(i int, b *BlockGen) {}) + + newBlocks, _ := core.GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], snaptest.engine, snaptest.gendb, snaptest.newBlocks, func(i int, b *core.BlockGen) {}) newchain.InsertChain(newBlocks) newchain.Stop() // Restart the chain, the wiper should starts working - config = &CacheConfig{ + config = &core.CacheConfig{ TrieCleanLimit: 256, TrieDirtyLimit: 256, TrieTimeLimit: 5 * time.Minute, SnapshotLimit: 256, SnapshotWait: false, // Don't wait rebuild } - newchain, err = NewBlockChain(snaptest.db, config, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + + _, err = core.NewBlockChain(snaptest.db, config, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } // Simulate the blockchain crash. - newchain, err = NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) + newchain, err = core.NewBlockChain(snaptest.db, nil, params.AllEthashProtocolChanges, snaptest.engine, vm.Config{}, nil, nil) if err != nil { t.Fatalf("Failed to recreate chain: %v", err) } + snaptest.verify(t, newchain, blocks) } diff --git a/eth/backend.go b/eth/backend.go index f40e011f8d..03419cde45 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -183,7 +183,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { // END: Bor changes bcVersion := rawdb.ReadDatabaseVersion(chainDb) - var dbVer = "" + dbVer := "" if bcVersion != nil { dbVer = fmt.Sprintf("%d", *bcVersion) } @@ -471,8 +471,10 @@ func (s *Ethereum) StartMining(threads int) error { if threads == 0 { threads = -1 // Disable the miner from within } + th.SetThreads(threads) } + // If the miner was not running, initialize it if !s.IsMining() { // Propagate the initial price point to the transaction pool @@ -485,6 +487,7 @@ func (s *Ethereum) StartMining(threads int) error { eb, err := s.Etherbase() if err != nil { log.Error("Cannot start mining without etherbase", "err", err) + return fmt.Errorf("etherbase missing: %v", err) } @@ -499,20 +502,26 @@ func (s *Ethereum) StartMining(threads int) error { cli = c } } + if cli != nil { wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) if wallet == nil || err != nil { log.Error("Etherbase account unavailable locally", "err", err) + return fmt.Errorf("signer missing: %v", err) } + cli.Authorize(eb, wallet.SignData) } + if bor, ok := s.engine.(*bor.Bor); ok { wallet, err := s.accountManager.Find(accounts.Account{Address: eb}) if wallet == nil || err != nil { log.Error("Etherbase account unavailable locally", "err", err) + return fmt.Errorf("signer missing: %v", err) } + bor.Authorize(eb, wallet.SignData) } } @@ -522,6 +531,7 @@ func (s *Ethereum) StartMining(threads int) error { go s.miner.Start(eb) } + return nil } @@ -575,6 +585,7 @@ func (s *Ethereum) Protocols() []p2p.Protocol { if s.config.SnapshotCache > 0 { protos = append(protos, snap.MakeProtocols((*snapHandler)(s.handler), s.snapDialCandidates)...) } + return protos } @@ -599,6 +610,7 @@ func (s *Ethereum) Start() error { } // Start the networking layer and the light server if requested s.handler.Start(maxPeers) + return nil } diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 6ab43891f7..904fb2cbc2 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -29,6 +29,9 @@ import ( "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/beacon" "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/consensus/bor/contract" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" @@ -237,7 +240,10 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et // In order to pass the ethereum transaction tests, we need to set the burn contract which is in the bor config // Then, bor != nil will also be enabled for ethash and clique. Only enable Bor for real if there is a validator contract present. if chainConfig.Bor != nil && chainConfig.Bor.ValidatorContract != "" { - return bor.New(chainConfig, db, blockchainAPI, ethConfig.HeimdallURL, ethConfig.WithoutHeimdall) + genesisContractsClient := contract.NewGenesisContractsClient(chainConfig, chainConfig.Bor.ValidatorContract, chainConfig.Bor.StateReceiverContract, blockchainAPI) + spanner := span.NewChainSpanner(blockchainAPI, contract.ValidatorSet(), chainConfig, common.HexToAddress(chainConfig.Bor.ValidatorContract)) + + return bor.New(chainConfig, db, blockchainAPI, spanner, heimdall.NewHeimdallClient(ethConfig.HeimdallURL), genesisContractsClient) } else { switch config.PowMode { case ethash.ModeFake: diff --git a/eth/tracers/api_bor.go b/eth/tracers/api_bor.go index 7f5e2c34d6..6ab1a4290a 100644 --- a/eth/tracers/api_bor.go +++ b/eth/tracers/api_bor.go @@ -47,16 +47,19 @@ func (api *API) traceBorBlock(ctx context.Context, block *types.Block, config *T if err != nil { return nil, err } + res.Block = blockFields parent, err := api.blockByNumberAndHash(ctx, rpc.BlockNumber(block.NumberU64()-1), block.ParentHash()) if err != nil { return nil, err } + reexec := defaultTraceReexec if config != nil && config.Reexec != nil { reexec = *config.Reexec } + // TODO: discuss consequences of setting preferDisk false. statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true, false) if err != nil { @@ -96,6 +99,7 @@ func (api *API) traceBorBlock(ctx context.Context, block *types.Block, config *T if len(execRes.Revert()) > 0 { returnVal = fmt.Sprintf("%x", execRes.Revert()) } + result := ðapi.ExecutionResult{ Gas: execRes.UsedGas, Failed: execRes.Failed(), @@ -106,12 +110,14 @@ func (api *API) traceBorBlock(ctx context.Context, block *types.Block, config *T Result: result, IntermediateHash: statedb.IntermediateRoot(deleteEmptyObjects), } + return res } for indx, tx := range txs { res.Transactions = append(res.Transactions, traceTxn(indx, tx)) } + return res, nil } @@ -139,5 +145,6 @@ func (api *API) TraceBorBlock(req *TraceBlockRequest) (*BlockTraceResult, error) if err != nil { return nil, err } + return api.traceBorBlock(ctx, block, req.Config) } diff --git a/go.mod b/go.mod index 5e3a8b81e9..852c895e3b 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,9 @@ module github.com/ethereum/go-ethereum -go 1.16 +go 1.18 require ( github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 - github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect github.com/VictoriaMetrics/fastcache v1.6.0 github.com/aws/aws-sdk-go-v2 v1.2.0 github.com/aws/aws-sdk-go-v2/config v1.1.1 @@ -16,20 +15,15 @@ require ( github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f github.com/davecgh/go-spew v1.1.1 github.com/deckarep/golang-set v1.8.0 - github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48 github.com/edsrzf/mmap-go v1.0.0 github.com/fatih/color v1.7.0 github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff - github.com/go-critic/go-critic v0.6.3 // indirect - github.com/go-kit/kit v0.9.0 // indirect - github.com/go-logfmt/logfmt v0.5.0 // indirect - github.com/go-ole/go-ole v1.2.1 // indirect github.com/go-stack/stack v1.8.0 - github.com/go-toolsmith/astcopy v1.0.1 // indirect github.com/golang-jwt/jwt/v4 v4.3.0 + github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa @@ -45,25 +39,19 @@ require ( github.com/imdario/mergo v0.3.11 github.com/influxdata/influxdb v1.8.3 github.com/influxdata/influxdb-client-go/v2 v2.4.0 - github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect github.com/jackpal/go-nat-pmp v1.0.2 github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e github.com/julienschmidt/httprouter v1.3.0 github.com/karalabe/usb v0.0.2 - github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-isatty v0.0.12 github.com/mitchellh/cli v1.1.2 github.com/mitchellh/go-grpc-net-conn v0.0.0-20200427190222-eb030e4876f0 github.com/mitchellh/go-homedir v1.1.0 - github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 github.com/olekukonko/tablewriter v0.0.5 github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 - github.com/polyfloyd/go-errorlint v0.0.0-20220510153142-36539f2bdac3 // indirect github.com/prometheus/tsdb v0.7.1 - github.com/quasilyte/gogrep v0.0.0-20220429205452-5e2753ee08f9 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/rjeczalik/notify v0.9.1 github.com/rs/cors v1.7.0 github.com/ryanuber/columnize v2.1.2+incompatible @@ -71,24 +59,81 @@ require ( github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tklauser/go-sysconf v0.3.5 // indirect github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef github.com/xsleonard/go-merkle v1.1.0 go.opentelemetry.io/otel v1.2.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.2.0 go.opentelemetry.io/otel/sdk v1.2.0 - go.uber.org/goleak v1.1.12 // indirect + go.uber.org/goleak v1.1.12 golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 golang.org/x/text v0.3.7 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba golang.org/x/tools v0.1.10 - golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect google.golang.org/grpc v1.42.0 google.golang.org/protobuf v1.27.1 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 gopkg.in/urfave/cli.v1 v1.20.0 + pgregory.net/rapid v0.4.7 +) + +require ( + github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect + github.com/Masterminds/goutils v1.1.0 // indirect + github.com/Masterminds/semver v1.5.0 // indirect + github.com/Masterminds/sprig v2.22.0+incompatible // indirect + github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect + github.com/agext/levenshtein v1.2.1 // indirect + github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 // indirect + github.com/aws/smithy-go v1.1.0 // indirect + github.com/bgentry/speakeasy v0.1.0 // indirect + github.com/cenkalti/backoff/v4 v4.1.1 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/deepmap/oapi-codegen v1.8.2 // indirect + github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect + github.com/go-kit/kit v0.9.0 // indirect + github.com/go-logfmt/logfmt v0.5.0 // indirect + github.com/go-ole/go-ole v1.2.1 // indirect + github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-multierror v1.0.0 // indirect + github.com/huandu/xstrings v1.3.2 // indirect + github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mitchellh/copystructure v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.0 // indirect + github.com/naoina/go-stringutil v0.1.0 // indirect + github.com/opentracing/opentracing-go v1.1.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/posener/complete v1.1.1 // indirect + github.com/tklauser/go-sysconf v0.3.5 // indirect + github.com/tklauser/numcpus v0.2.2 // indirect + github.com/zclconf/go-cty v1.8.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.2.0 // indirect + go.opentelemetry.io/otel/trace v1.2.0 // indirect + go.opentelemetry.io/proto/otlp v0.10.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect + golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect + google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect gotest.tools v2.2.0+incompatible // indirect ) diff --git a/go.sum b/go.sum index b5278c5112..374ab3066e 100644 --- a/go.sum +++ b/go.sum @@ -49,7 +49,6 @@ github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= -github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0= github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= @@ -82,14 +81,12 @@ github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx2 github.com/btcsuite/btcd/btcec/v2 v2.1.2 h1:YoYoC9J0jwfukodSBMzZYUVQ8PTiYg4BnOWiJVzTmLs= github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0 h1:MSskdM4/xJYcFzy0altH/C/xHopifpWzHUi1JeVI34Q= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -162,8 +159,6 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-critic/go-critic v0.6.3 h1:abibh5XYBTASawfTQ0rA7dVtQT+6KzpGqb/J+DxRDaw= -github.com/go-critic/go-critic v0.6.3/go.mod h1:c6b3ZP1MQ7o6lPR7Rv3lEf7pYQUmAcx8ABHgdZCQt/k= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -184,25 +179,6 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astcopy v1.0.1 h1:l09oBhAPyV74kLJ3ZO31iBU8htZGTwr9LTjuMCyL8go= -github.com/go-toolsmith/astcopy v1.0.1/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astequal v1.0.2 h1:+XvaV8zNxua+9+Oa4AHmgmpo4RYAbwr/qjNppLfX2yM= -github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= -github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -216,6 +192,8 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -247,10 +225,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -429,8 +405,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v0.0.0-20220510153142-36539f2bdac3 h1:GhmKVnwiethXkJVYqq/kdcw3+u2TIuhPwmHhB+ehpIQ= -github.com/polyfloyd/go-errorlint v0.0.0-20220510153142-36539f2bdac3/go.mod h1:KZy4xxPJyy88/gldCe5OdW6OQRtNO3EZE7hXzmnebgA= github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -445,21 +419,6 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a h1:sWFavxtIctGrVs5SYZ5Ml1CvrDAs8Kf5kx2PI3C41dA= -github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a/go.mod h1:VMX+OnnSw4LicdiEGtRSD/1X8kW7GuEscjYNr4cOIT4= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.16/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= -github.com/quasilyte/gogrep v0.0.0-20220429205452-5e2753ee08f9 h1:mEQjyqtrQ6eB7oW9Qm+5po33faQIbhWp3qfhxGYuHKc= -github.com/quasilyte/gogrep v0.0.0-20220429205452-5e2753ee08f9/go.mod h1:MsVMK2P94jAne/7vEaLCRmjmOL0aTGAkvVOVuT+UYww= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= @@ -488,7 +447,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -518,10 +476,8 @@ github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPyS github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xsleonard/go-merkle v1.1.0 h1:fHe1fuhJjGH22ZzVTAH0jqHLhTGhOq3wQjJN+8P0jQg= github.com/xsleonard/go-merkle v1.1.0/go.mod h1:cW4z+UZ/4f2n9IJgIiyDCdYguchoDyDAPmpuOWGxdGg= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= @@ -557,9 +513,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 h1:NvGWuYG8dkDHFSKksI1P9faiVJ9rayE6l0+ouWVIDs8= golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -571,10 +525,7 @@ golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxT golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171 h1:DZhP7zSquENyG3Yb6ZpGqNEtgE8dfXhcLcheIF9RQHY= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -585,6 +536,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -592,9 +544,7 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -615,7 +565,6 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -625,10 +574,7 @@ golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -642,7 +588,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -686,12 +631,6 @@ golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -737,18 +676,14 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -847,5 +782,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/cli/flagset/flagset.go b/internal/cli/flagset/flagset.go index e04f452c1e..b57fff9996 100644 --- a/internal/cli/flagset/flagset.go +++ b/internal/cli/flagset/flagset.go @@ -19,6 +19,7 @@ func NewFlagSet(name string) *Flagset { flags: []*FlagVar{}, set: flag.NewFlagSet(name, flag.ContinueOnError), } + return f } @@ -34,10 +35,12 @@ func (f *Flagset) addFlag(fl *FlagVar) { func (f *Flagset) Help() string { str := "Options:\n\n" + items := []string{} for _, item := range f.flags { items = append(items, fmt.Sprintf(" -%s\n %s", item.Name, item.Usage)) } + return str + strings.Join(items, "\n\n") } @@ -53,25 +56,30 @@ func (f *Flagset) MarkDown() string { groups[item.Group] = append(groups[item.Group], item) } - keys := make([]string, len(groups)) i := 0 + keys := make([]string, len(groups)) + for k := range groups { keys[i] = k i++ } + sort.Strings(keys) items := []string{} + for _, k := range keys { if k == "" { - items = append(items, fmt.Sprintf("## Options")) + items = append(items, "## Options") } else { items = append(items, fmt.Sprintf("### %s Options", k)) } + for _, item := range groups[k] { items = append(items, fmt.Sprintf("- ```%s```: %s", item.Name, item.Usage)) } } + return strings.Join(items, "\n\n") } @@ -162,6 +170,7 @@ func (b *BigIntFlag) String() string { if b.Value == nil { return "" } + return b.Value.String() } @@ -174,10 +183,12 @@ func (b *BigIntFlag) Set(value string) error { } else { num, ok = num.SetString(value, 10) } + if !ok { return fmt.Errorf("failed to set big int") } b.Value = num + return nil } @@ -201,11 +212,13 @@ func (i *SliceStringFlag) String() string { if i.Value == nil { return "" } + return strings.Join(*i.Value, ",") } func (i *SliceStringFlag) Set(value string) error { *i.Value = append(*i.Value, strings.Split(value, ",")...) + return nil } @@ -246,10 +259,12 @@ func (m *MapStringFlag) String() string { if m.Value == nil { return "" } + ls := []string{} for k, v := range *m.Value { ls = append(ls, k+"="+v) } + return strings.Join(ls, ",") } @@ -257,6 +272,7 @@ func (m *MapStringFlag) Set(value string) error { if m.Value == nil { m.Value = &map[string]string{} } + for _, t := range strings.Split(value, ",") { if t != "" { kv := strings.Split(t, "=") @@ -266,6 +282,7 @@ func (m *MapStringFlag) Set(value string) error { } } } + return nil } diff --git a/internal/cli/server/chains/chain.go b/internal/cli/server/chains/chain.go index 32f5159b38..d6717f5893 100644 --- a/internal/cli/server/chains/chain.go +++ b/internal/cli/server/chains/chain.go @@ -26,18 +26,23 @@ var chains = map[string]*Chain{ } func GetChain(name string) (*Chain, error) { - var chain *Chain - var err error + var ( + chain *Chain + err error + ) + if _, fileErr := os.Stat(name); fileErr == nil { if chain, err = ImportFromFile(name); err != nil { return nil, fmt.Errorf("error importing chain from file: %v", err) } + return chain, nil } else if errors.Is(fileErr, os.ErrNotExist) { var ok bool if chain, ok = chains[name]; !ok { return nil, fmt.Errorf("chain %s not found", name) } + return chain, nil } else { return nil, fileErr @@ -62,10 +67,12 @@ func importChain(content []byte) (*Chain, error) { if chain.Genesis == nil { log.Info("Try reading as legacy genesis") + var genesis core.Genesis if err := json.Unmarshal(content, &genesis); err != nil { return nil, err } + if genesis.Config != nil { chain.Genesis = &genesis chain.NetworkId = genesis.Config.ChainID.Uint64() diff --git a/internal/cli/server/chains/chain_test.go b/internal/cli/server/chains/chain_test.go index 8f57b7d220..b372a3c4b9 100644 --- a/internal/cli/server/chains/chain_test.go +++ b/internal/cli/server/chains/chain_test.go @@ -5,9 +5,12 @@ import ( ) func TestChain_ImportFromFile(t *testing.T) { + t.Parallel() + type args struct { filename string } + tests := []struct { name string args args @@ -34,8 +37,13 @@ func TestChain_ImportFromFile(t *testing.T) { wantErr: true, }, } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + _, err := ImportFromFile(tt.args.filename) if (err != nil) != tt.wantErr { t.Errorf("ImportFromFile() error = %v, wantErr %v", err, tt.wantErr) diff --git a/internal/cli/server/command.go b/internal/cli/server/command.go index 01ce44f5ee..a0b8a6d87c 100644 --- a/internal/cli/server/command.go +++ b/internal/cli/server/command.go @@ -33,6 +33,7 @@ func (c *Command) MarkDown() string { "The ```bor server``` command runs the Bor client.", c.Flags().MarkDown(), } + return strings.Join(items, "\n\n") } diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 4c17a58fc8..137f6aed0f 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -58,7 +58,7 @@ type Config struct { // GcMode selects the garbage collection mode for the trie GcMode string `hcl:"gc-mode,optional"` - // NoSnapshot disbales the snapshot database mode + // NoSnapshot disables the snapshot database mode NoSnapshot bool `hcl:"no-snapshot,optional"` // Ethstats is the address of the ethstats server to send telemetry @@ -527,18 +527,22 @@ func (c *Config) fillBigInt() error { b := new(big.Int) var ok bool + if strings.HasPrefix(*x.str, "0x") { b, ok = b.SetString((*x.str)[2:], 16) } else { b, ok = b.SetString(*x.str, 10) } + if !ok { return fmt.Errorf("%s can't parse big int %s", x.path, *x.str) } + *x.str = "" *x.td = b } } + return nil } @@ -559,10 +563,12 @@ func (c *Config) fillTimeDurations() error { if err != nil { return fmt.Errorf("%s can't parse time duration %s", x.path, *x.str) } + *x.str = "" *x.td = d } } + return nil } @@ -574,6 +580,7 @@ func readConfigFile(path string) (*Config, error) { if err != nil { return nil, err } + return readLegacyConfig(data) } @@ -582,15 +589,19 @@ func readConfigFile(path string) (*Config, error) { Cache: &CacheConfig{}, Sealer: &SealerConfig{}, } + if err := hclsimple.DecodeFile(path, nil, config); err != nil { return nil, fmt.Errorf("failed to decode config file '%s': %v", path, err) } + if err := config.fillBigInt(); err != nil { return nil, err } + if err := config.fillTimeDurations(); err != nil { return nil, err } + return config, nil } @@ -599,6 +610,7 @@ func (c *Config) loadChain() error { if err != nil { return err } + c.chain = chain // preload some default values that depend on the chain file @@ -612,14 +624,17 @@ func (c *Config) loadChain() error { } else { c.Cache.Cache = 1024 } + return nil } +//nolint:gocognit func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (*ethconfig.Config, error) { dbHandles, err := makeDatabaseHandles() if err != nil { return nil, err } + n := ethconfig.Defaults // only update for non-developer mode as we don't yet @@ -663,6 +678,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* if !common.IsHexAddress(etherbase) { return nil, fmt.Errorf("etherbase is not an address: %s", etherbase) } + n.Miner.Etherbase = common.HexToAddress(etherbase) } } @@ -672,17 +688,24 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* if !stack.Config().InsecureUnlockAllowed && stack.Config().ExtRPCEnabled() { return nil, fmt.Errorf("account unlock with HTTP access is forbidden") } + ks := accountManager.Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + passwords, err := MakePasswordListFromFile(c.Accounts.PasswordFile) if err != nil { return nil, err } + if len(passwords) < len(c.Accounts.Unlock) { return nil, fmt.Errorf("number of passwords provided (%v) is less than number of accounts (%v) to unlock", len(passwords), len(c.Accounts.Unlock)) } + for i, account := range c.Accounts.Unlock { - ks.Unlock(accounts.Account{Address: common.HexToAddress(account)}, passwords[i]) + err = ks.Unlock(accounts.Account{Address: common.HexToAddress(account)}, passwords[i]) + if err != nil { + return nil, fmt.Errorf("could not unlock an account %q", account) + } } } @@ -700,6 +723,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* passphrase string err error ) + // etherbase has been set above, configuring the miner address from command line flags. if n.Miner.Etherbase != (common.Address{}) { developer = accounts.Account{Address: n.Miner.Etherbase} @@ -714,6 +738,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* if err := ks.Unlock(developer, passphrase); err != nil { return nil, fmt.Errorf("failed to unlock developer account: %v", err) } + log.Info("Using developer account", "address", developer.Address) // Set the Etherbase @@ -753,10 +778,12 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* if err != nil { return nil, fmt.Errorf("invalid required block number %s: %v", k, err) } + var hash common.Hash if err = hash.UnmarshalText([]byte(v)); err != nil { return nil, fmt.Errorf("invalid required block hash %s: %v", v, err) } + n.PeerRequiredBlocks[number] = hash } } @@ -775,6 +802,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* log.Warn("Lowering memory allowance on 32bit arch", "available", mem.Total/1024/1024, "addressable", 2*1024) mem.Total = 2 * 1024 * 1024 * 1024 } + allowance := uint64(mem.Total / 1024 / 1024 / 3) if cache > allowance { log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance) @@ -804,6 +832,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* } else { log.Info("Global gas cap disabled") } + n.RPCTxFeeCap = c.JsonRPC.TxFeeCap // sync mode. It can either be "fast", "full" or "snap". We disable @@ -843,6 +872,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* } n.DatabaseHandles = dbHandles + return &n, nil } @@ -906,6 +936,7 @@ func (c *Config) buildNode() (*node.Config, error) { cfg.HTTPHost = c.JsonRPC.Http.Host cfg.HTTPPort = int(c.JsonRPC.Http.Port) } + if c.JsonRPC.Ws.Enabled { cfg.WSHost = c.JsonRPC.Ws.Host cfg.WSPort = int(c.JsonRPC.Ws.Port) @@ -916,6 +947,7 @@ func (c *Config) buildNode() (*node.Config, error) { if err != nil { return nil, fmt.Errorf("wrong 'nat' flag: %v", err) } + cfg.P2P.NAT = natif // only check for non-developer modes @@ -926,21 +958,27 @@ func (c *Config) buildNode() (*node.Config, error) { if len(bootnodes) == 0 { bootnodes = c.chain.Bootnodes } + if cfg.P2P.BootstrapNodes, err = parseBootnodes(bootnodes); err != nil { return nil, err } + if cfg.P2P.BootstrapNodesV5, err = parseBootnodes(c.P2P.Discovery.BootnodesV5); err != nil { return nil, err } + if cfg.P2P.StaticNodes, err = parseBootnodes(c.P2P.Discovery.StaticNodes); err != nil { return nil, err } + if len(cfg.P2P.StaticNodes) == 0 { cfg.P2P.StaticNodes = cfg.StaticNodes() } + if cfg.P2P.TrustedNodes, err = parseBootnodes(c.P2P.Discovery.TrustedNodes); err != nil { return nil, err } + if len(cfg.P2P.TrustedNodes) == 0 { cfg.P2P.TrustedNodes = cfg.TrustedNodes() } @@ -951,6 +989,7 @@ func (c *Config) buildNode() (*node.Config, error) { cfg.P2P.MaxPeers = 0 cfg.P2P.NoDiscovery = true } + return cfg, nil } @@ -960,6 +999,7 @@ func (c *Config) Merge(cc ...*Config) error { return fmt.Errorf("failed to merge configurations: %v", err) } } + return nil } @@ -968,10 +1008,12 @@ func makeDatabaseHandles() (int, error) { if err != nil { return -1, err } + raised, err := fdlimit.Raise(uint64(limit)) if err != nil { return -1, err } + return int(raised / 2), nil } @@ -986,6 +1028,7 @@ func parseBootnodes(urls []string) ([]*enode.Node, error) { dst = append(dst, node) } } + return dst, nil } @@ -996,6 +1039,7 @@ func defaultDataDir() string { // we cannot guess a stable location return "" } + switch runtime.GOOS { case "darwin": return filepath.Join(home, "Library", "Bor") @@ -1005,6 +1049,7 @@ func defaultDataDir() string { // Windows XP and below don't have LocalAppData. panic("environment variable LocalAppData is undefined") } + return filepath.Join(appdata, "Bor") default: return filepath.Join(home, ".bor") @@ -1016,6 +1061,7 @@ func Hostname() string { if err != nil { return "bor" } + return hostname } @@ -1024,10 +1070,13 @@ func MakePasswordListFromFile(path string) ([]string, error) { if err != nil { return nil, fmt.Errorf("Failed to read password file: %v", err) } + lines := strings.Split(string(text), "\n") + // Sanitise DOS line endings. for i := range lines { lines[i] = strings.TrimRight(lines[i], "\r") } + return lines, nil } diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index 7368478123..94c4496c03 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -52,6 +52,7 @@ func TestConfigMerge(t *testing.T) { }, }, } + expected := &Config{ Chain: "1", NoSnapshot: false, @@ -69,11 +70,14 @@ func TestConfigMerge(t *testing.T) { }, }, } + assert.NoError(t, c0.Merge(c1)) assert.Equal(t, c0, expected) } func TestDefaultDatatypeOverride(t *testing.T) { + t.Parallel() + // This test is specific to `maxpeers` flag (for now) to check // if default datatype value (0 in case of uint64) is overridden. c0 := &Config{ @@ -81,16 +85,19 @@ func TestDefaultDatatypeOverride(t *testing.T) { MaxPeers: 30, }, } + c1 := &Config{ P2P: &P2PConfig{ MaxPeers: 0, }, } + expected := &Config{ P2P: &P2PConfig{ MaxPeers: 0, }, } + assert.NoError(t, c0.Merge(c1)) assert.Equal(t, c0, expected) } @@ -99,6 +106,7 @@ func TestConfigLoadFile(t *testing.T) { readFile := func(path string) { config, err := readConfigFile(path) assert.NoError(t, err) + assert.Equal(t, config, &Config{ DataDir: "./data", RequiredBlocks: map[string]string{ @@ -122,6 +130,7 @@ func TestConfigLoadFile(t *testing.T) { t.Run("hcl", func(t *testing.T) { readFile("./testdata/simple.hcl") }) + // read file in json format t.Run("json", func(t *testing.T) { readFile("./testdata/simple.json") @@ -152,7 +161,11 @@ func TestConfigBootnodesDefault(t *testing.T) { } func TestMakePasswordListFromFile(t *testing.T) { + t.Parallel() + t.Run("ReadPasswordFile", func(t *testing.T) { + t.Parallel() + result, _ := MakePasswordListFromFile("./testdata/password.txt") assert.Equal(t, []string{"test1", "test2"}, result) }) diff --git a/internal/cli/server/helper.go b/internal/cli/server/helper.go index c6831382b3..3a232d3185 100644 --- a/internal/cli/server/helper.go +++ b/internal/cli/server/helper.go @@ -17,10 +17,13 @@ func findAvailablePort(from int32, count int32) (int32, error) { if count == maxPortCheck { return 0, fmt.Errorf("no available port found") } + port := atomic.AddInt32(&from, 1) addr := fmt.Sprintf("localhost:%d", port) - lis, err := net.Listen("tcp", addr) + count++ + + lis, err := net.Listen("tcp", addr) if err == nil { lis.Close() return port, nil @@ -36,8 +39,13 @@ func CreateMockServer(config *Config) (*Server, error) { // find available port for grpc server rand.Seed(time.Now().UnixNano()) - var from int32 = 60000 // the min port to start checking from - var to int32 = 61000 // the max port to start checking from + + var ( + from int32 = 60000 // the min port to start checking from + to int32 = 61000 // the max port to start checking from + ) + + //nolint: gosec port, err := findAvailablePort(rand.Int31n(to-from+1)+from, 0) if err != nil { return nil, err @@ -53,10 +61,13 @@ func CreateMockServer(config *Config) (*Server, error) { // find available port for http server from = 8545 to = 9545 + + //nolint: gosec port, err = findAvailablePort(rand.Int31n(to-from+1)+from, 0) if err != nil { return nil, err } + config.JsonRPC.Http.Port = uint64(port) // start the server diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index 3d0b55e094..7d5ec2c8f3 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -11,6 +11,16 @@ import ( "strings" "time" + "github.com/mattn/go-colorable" + "github.com/mattn/go-isatty" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "google.golang.org/grpc" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/consensus/beacon" @@ -26,15 +36,6 @@ import ( "github.com/ethereum/go-ethereum/metrics/influxdb" "github.com/ethereum/go-ethereum/metrics/prometheus" "github.com/ethereum/go-ethereum/node" - "github.com/mattn/go-colorable" - "github.com/mattn/go-isatty" - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" - "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.4.0" - "google.golang.org/grpc" ) type Server struct { @@ -71,6 +72,7 @@ func NewServer(config *Config) (*Server, error) { if err != nil { return nil, err } + stack, err := node.New(nodeCfg) if err != nil { return nil, err @@ -82,6 +84,7 @@ func NewServer(config *Config) (*Server, error) { // register backend to account manager with keystore for signing keydir := stack.KeyStoreDir() + n, p := keystore.StandardScryptN, keystore.StandardScryptP if config.Accounts.UseLightweightKDF { n, p = keystore.LightScryptN, keystore.LightScryptP @@ -94,6 +97,7 @@ func NewServer(config *Config) (*Server, error) { authorized := false // check if personal wallet endpoints are disabled or not + // nolint:nestif if !config.Accounts.DisableBorWallet { // add keystore globally to the node's account manager if personal wallet is enabled stack.AccountManager().AddBackend(keystore.NewKeyStore(keydir, n, p)) @@ -103,10 +107,12 @@ func NewServer(config *Config) (*Server, error) { if err != nil { return nil, err } + backend, err := eth.New(stack, ethCfg) if err != nil { return nil, err } + srv.backend = backend } else { // register the ethereum backend (with temporary created account manager) @@ -114,10 +120,12 @@ func NewServer(config *Config) (*Server, error) { if err != nil { return nil, err } + backend, err := eth.New(stack, ethCfg) if err != nil { return nil, err } + srv.backend = backend // authorize only if mining or in developer mode @@ -126,6 +134,7 @@ func NewServer(config *Config) (*Server, error) { eb, err := srv.backend.Etherbase() if err != nil { log.Error("Cannot start mining without etherbase", "err", err) + return nil, fmt.Errorf("etherbase missing: %v", err) } @@ -142,8 +151,10 @@ func NewServer(config *Config) (*Server, error) { wallet, err := accountManager.Find(accounts.Account{Address: eb}) if wallet == nil || err != nil { log.Error("Etherbase account unavailable locally", "err", err) + return nil, fmt.Errorf("signer missing: %v", err) } + cli.Authorize(eb, wallet.SignData) authorized = true } @@ -155,6 +166,7 @@ func NewServer(config *Config) (*Server, error) { log.Error("Etherbase account unavailable locally", "err", err) return nil, fmt.Errorf("signer missing: %v", err) } + bor.Authorize(eb, wallet.SignData) authorized = true } @@ -200,6 +212,7 @@ func NewServer(config *Config) (*Server, error) { if err := srv.node.Start(); err != nil { return nil, err } + return srv, nil } @@ -238,10 +251,12 @@ func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error if v1Enabled { log.Info("Enabling metrics export to InfluxDB (v1)") + go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, cfg.Database, cfg.Username, cfg.Password, "geth.", tags) } if v2Enabled { log.Info("Enabling metrics export to InfluxDB (v2)") + go influxdb.InfluxDBV2WithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, cfg.Token, cfg.Bucket, cfg.Organization, "geth.", tags) } } @@ -328,6 +343,7 @@ func (s *Server) setupGRPCServer(addr string) error { }() log.Info("GRPC Server started", "addr", addr) + return nil } @@ -338,16 +354,20 @@ func (s *Server) withLoggingUnaryInterceptor() grpc.ServerOption { func (s *Server) loggingServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { start := time.Now() h, err := handler(ctx, req) + log.Trace("Request", "method", info.FullMethod, "duration", time.Since(start), "error", err) + return h, err } func setupLogger(logLevel string) { output := io.Writer(os.Stderr) + usecolor := (isatty.IsTerminal(os.Stderr.Fd()) || isatty.IsCygwinTerminal(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb" if usecolor { output = colorable.NewColorableStderr() } + ostream := log.StreamHandler(output, log.TerminalFormat(usecolor)) glogger := log.NewGlogHandler(ostream) @@ -358,6 +378,7 @@ func setupLogger(logLevel string) { } else { glogger.Verbosity(log.LvlInfo) } + log.Root().SetHandler(glogger) } diff --git a/internal/cli/server/server_test.go b/internal/cli/server/server_test.go index a0b6dee2e3..c88c656b10 100644 --- a/internal/cli/server/server_test.go +++ b/internal/cli/server/server_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/assert" ) @@ -18,9 +19,11 @@ func nextPort() uint64 { log.Info("Checking for new port", "current", initialPort) port := atomic.AddUint64(&initialPort, 1) addr := fmt.Sprintf("localhost:%d", port) + lis, err := net.Listen("tcp", addr) if err == nil { lis.Close() + return port } else { return nextPort() @@ -28,6 +31,8 @@ func nextPort() uint64 { } func TestServer_DeveloperMode(t *testing.T) { + t.Parallel() + // get the default config config := DefaultConfig() @@ -38,6 +43,7 @@ func TestServer_DeveloperMode(t *testing.T) { // start the mock server server, err := CreateMockServer(config) assert.NoError(t, err) + defer CloseMockServer(server) // record the initial block number diff --git a/internal/cli/server/service.go b/internal/cli/server/service.go index 304b61b7d0..de240d5461 100644 --- a/internal/cli/server/service.go +++ b/internal/cli/server/service.go @@ -8,6 +8,10 @@ import ( "reflect" "strings" + gproto "github.com/golang/protobuf/proto" //nolint:staticcheck,typecheck + "github.com/golang/protobuf/ptypes/empty" + grpc_net_conn "github.com/mitchellh/go-grpc-net-conn" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/tracers" @@ -16,9 +20,6 @@ import ( "github.com/ethereum/go-ethereum/internal/cli/server/proto" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" - gproto "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes/empty" - grpc_net_conn "github.com/mitchellh/go-grpc-net-conn" ) const chunkSize = 1024 * 1024 * 1024 @@ -45,6 +46,7 @@ func sendStreamDebugFile(stream proto.Bor_DebugPprofServer, headers map[string]s Request: &proto.DebugFileResponse_Input{}, Encode: grpc_net_conn.ChunkedEncoder(encoder, chunkSize), } + if _, err := conn.Write(data); err != nil { return err } @@ -61,11 +63,14 @@ func sendStreamDebugFile(stream proto.Bor_DebugPprofServer, headers map[string]s } func (s *Server) DebugPprof(req *proto.DebugPprofRequest, stream proto.Bor_DebugPprofServer) error { - var payload []byte - var headers map[string]string - var err error + var ( + payload []byte + headers map[string]string + err error + ) ctx := context.Background() + switch req.Type { case proto.DebugPprofRequest_CPU: payload, headers, err = pprof.CPUProfile(ctx, int(req.Seconds)) @@ -74,6 +79,7 @@ func (s *Server) DebugPprof(req *proto.DebugPprofRequest, stream proto.Bor_Debug case proto.DebugPprofRequest_LOOKUP: payload, headers, err = pprof.Profile(req.Profile, 0, 0) } + if err != nil { return err } @@ -82,6 +88,7 @@ func (s *Server) DebugPprof(req *proto.DebugPprofRequest, stream proto.Bor_Debug if err := sendStreamDebugFile(stream, headers, payload); err != nil { return err } + return nil } @@ -192,6 +199,7 @@ func (s *Server) DebugBlock(req *proto.DebugBlockRequest, stream proto.Bor_Debug }, }, } + res, err := s.tracerAPI.TraceBorBlock(traceReq) if err != nil { return err @@ -202,6 +210,7 @@ func (s *Server) DebugBlock(req *proto.DebugBlockRequest, stream proto.Bor_Debug if err != nil { return err } + if err := sendStreamDebugFile(stream, map[string]string{}, data); err != nil { return err } diff --git a/miner/fake_miner.go b/miner/fake_miner.go new file mode 100644 index 0000000000..cbe0d9f54c --- /dev/null +++ b/miner/fake_miner.go @@ -0,0 +1,233 @@ +package miner + +import ( + "errors" + "math/big" + "testing" + "time" + + "github.com/golang/mock/gomock" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/consensus/bor/api" + "github.com/ethereum/go-ethereum/consensus/bor/valset" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "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" + "github.com/ethereum/go-ethereum/ethdb/memorydb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/tests/bor/mocks" + "github.com/ethereum/go-ethereum/trie" +) + +type DefaultBorMiner struct { + Miner *Miner + Mux *event.TypeMux //nolint:staticcheck + Cleanup func(skipMiner bool) + + Ctrl *gomock.Controller + EthAPIMock api.Caller + HeimdallClientMock bor.IHeimdallClient + ContractMock bor.GenesisContract +} + +func NewBorDefaultMiner(t *testing.T) *DefaultBorMiner { + t.Helper() + + ctrl := gomock.NewController(t) + + ethAPI := api.NewMockCaller(ctrl) + ethAPI.EXPECT().Call(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + + spanner := bor.NewMockSpanner(ctrl) + spanner.EXPECT().GetCurrentValidators(gomock.Any(), gomock.Any()).Return([]*valset.Validator{ + { + ID: 0, + Address: common.Address{0x1}, + VotingPower: 100, + ProposerPriority: 0, + }, + }, nil).AnyTimes() + + heimdallClient := mocks.NewMockIHeimdallClient(ctrl) + heimdallClient.EXPECT().Close().Times(1) + + genesisContracts := bor.NewMockGenesisContract(ctrl) + + miner, mux, cleanup := createBorMiner(t, ethAPI, spanner, heimdallClient, genesisContracts) + + return &DefaultBorMiner{ + Miner: miner, + Mux: mux, + Cleanup: cleanup, + Ctrl: ctrl, + EthAPIMock: ethAPI, + HeimdallClientMock: heimdallClient, + ContractMock: genesisContracts, + } +} + +//nolint:staticcheck +func createBorMiner(t *testing.T, ethAPIMock api.Caller, spanner bor.Spanner, heimdallClientMock bor.IHeimdallClient, contractMock bor.GenesisContract) (*Miner, *event.TypeMux, func(skipMiner bool)) { + t.Helper() + + // Create Ethash config + chainDB, _, chainConfig := NewDBForFakes(t) + + engine := NewFakeBor(t, chainDB, chainConfig, ethAPIMock, spanner, heimdallClientMock, contractMock) + + // Create Ethereum backend + bc, err := core.NewBlockChain(chainDB, nil, chainConfig, engine, vm.Config{}, nil, nil) + if err != nil { + t.Fatalf("can't create new chain %v", err) + } + + statedb, _ := state.New(common.Hash{}, state.NewDatabase(chainDB), nil) + blockchain := &testBlockChain{statedb, 10000000, new(event.Feed)} + + pool := core.NewTxPool(testTxPoolConfig, chainConfig, blockchain) + backend := NewMockBackend(bc, pool) + + // Create event Mux + mux := new(event.TypeMux) + + config := Config{ + Etherbase: common.HexToAddress("123456789"), + } + + // Create Miner + miner := New(backend, &config, chainConfig, mux, engine, nil) + + cleanup := func(skipMiner bool) { + bc.Stop() + engine.Close() + pool.Stop() + + if !skipMiner { + miner.Close() + } + } + + return miner, mux, cleanup +} + +func NewDBForFakes(t *testing.T) (ethdb.Database, *core.Genesis, *params.ChainConfig) { + t.Helper() + + memdb := memorydb.New() + chainDB := rawdb.NewDatabase(memdb) + genesis := core.DeveloperGenesisBlock(2, 11_500_000, common.HexToAddress("12345")) + + chainConfig, _, err := core.SetupGenesisBlock(chainDB, genesis) + if err != nil { + t.Fatalf("can't create new chain config: %v", err) + } + + chainConfig.Bor.Period = map[string]uint64{ + "0": 1, + } + + return chainDB, genesis, chainConfig +} + +func NewFakeBor(t *testing.T, chainDB ethdb.Database, chainConfig *params.ChainConfig, ethAPIMock api.Caller, spanner bor.Spanner, heimdallClientMock bor.IHeimdallClient, contractMock bor.GenesisContract) consensus.Engine { + t.Helper() + + if chainConfig.Bor == nil { + chainConfig.Bor = params.BorUnittestChainConfig.Bor + } + + return bor.New(chainConfig, chainDB, ethAPIMock, spanner, heimdallClientMock, contractMock) +} + +type mockBackend struct { + bc *core.BlockChain + txPool *core.TxPool +} + +func NewMockBackend(bc *core.BlockChain, txPool *core.TxPool) *mockBackend { + return &mockBackend{ + bc: bc, + txPool: txPool, + } +} + +func (m *mockBackend) BlockChain() *core.BlockChain { + return m.bc +} + +func (m *mockBackend) TxPool() *core.TxPool { + return m.txPool +} + +func (m *mockBackend) StateAtBlock(block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (statedb *state.StateDB, err error) { + return nil, errors.New("not supported") +} + +type testBlockChain struct { + statedb *state.StateDB + gasLimit uint64 + chainHeadFeed *event.Feed +} + +func (bc *testBlockChain) CurrentBlock() *types.Block { + return types.NewBlock(&types.Header{ + GasLimit: bc.gasLimit, + }, nil, nil, nil, trie.NewStackTrie(nil)) +} + +func (bc *testBlockChain) GetBlock(hash common.Hash, number uint64) *types.Block { + return bc.CurrentBlock() +} + +func (bc *testBlockChain) StateAt(common.Hash) (*state.StateDB, error) { + return bc.statedb, nil +} + +func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { + return bc.chainHeadFeed.Subscribe(ch) +} + +var ( + // Test chain configurations + testTxPoolConfig core.TxPoolConfig + ethashChainConfig *params.ChainConfig + cliqueChainConfig *params.ChainConfig + + // Test accounts + testBankKey, _ = crypto.GenerateKey() + testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey) + testBankFunds = big.NewInt(1000000000000000000) + + testUserKey, _ = crypto.GenerateKey() + testUserAddress = crypto.PubkeyToAddress(testUserKey.PublicKey) + + // Test transactions + pendingTxs []*types.Transaction + newTxs []*types.Transaction + + testConfig = &Config{ + Recommit: time.Second, + GasCeil: params.GenesisGasLimit, + } +) + +func init() { + testTxPoolConfig = core.DefaultTxPoolConfig + testTxPoolConfig.Journal = "" + ethashChainConfig = new(params.ChainConfig) + *ethashChainConfig = *params.TestChainConfig + cliqueChainConfig = new(params.ChainConfig) + *cliqueChainConfig = *params.TestChainConfig + cliqueChainConfig.Clique = ¶ms.CliqueConfig{ + Period: 10, + Epoch: 30000, + } +} diff --git a/miner/miner_test.go b/miner/miner_test.go index 03c79cbbd5..76f61fd0d4 100644 --- a/miner/miner_test.go +++ b/miner/miner_test.go @@ -18,80 +18,32 @@ package miner import ( - "errors" "testing" "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/consensus" - "github.com/ethereum/go-ethereum/consensus/clique" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/rawdb" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/downloader" - "github.com/ethereum/go-ethereum/ethdb/memorydb" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/trie" ) -type mockBackend struct { - bc *core.BlockChain - txPool *core.TxPool -} - -func NewMockBackend(bc *core.BlockChain, txPool *core.TxPool) *mockBackend { - return &mockBackend{ - bc: bc, - txPool: txPool, - } -} - -func (m *mockBackend) BlockChain() *core.BlockChain { - return m.bc -} - -func (m *mockBackend) TxPool() *core.TxPool { - return m.txPool -} - -func (m *mockBackend) StateAtBlock(block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (statedb *state.StateDB, err error) { - return nil, errors.New("not supported") -} - -type testBlockChain struct { - statedb *state.StateDB - gasLimit uint64 - chainHeadFeed *event.Feed -} - -func (bc *testBlockChain) CurrentBlock() *types.Block { - return types.NewBlock(&types.Header{ - GasLimit: bc.gasLimit, - }, nil, nil, nil, trie.NewStackTrie(nil)) -} - -func (bc *testBlockChain) GetBlock(hash common.Hash, number uint64) *types.Block { - return bc.CurrentBlock() -} +func TestMiner(t *testing.T) { + t.Parallel() -func (bc *testBlockChain) StateAt(common.Hash) (*state.StateDB, error) { - return bc.statedb, nil -} + minerBor := NewBorDefaultMiner(t) + defer func() { + minerBor.Cleanup(false) + minerBor.Ctrl.Finish() + }() -func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { - return bc.chainHeadFeed.Subscribe(ch) -} + miner := minerBor.Miner + mux := minerBor.Mux -func TestMiner(t *testing.T) { - miner, mux, cleanup := createMiner(t) - defer cleanup(false) miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) + // Start the downloader mux.Post(downloader.StartEvent{}) waitForMiningState(t, miner, false) + // Stop the downloader and wait for the update loop to run mux.Post(downloader.DoneEvent{}) waitForMiningState(t, miner, true) @@ -113,10 +65,20 @@ func TestMiner(t *testing.T) { // An initial FailedEvent should allow mining to stop on a subsequent // downloader StartEvent. func TestMinerDownloaderFirstFails(t *testing.T) { - miner, mux, cleanup := createMiner(t) - defer cleanup(false) + t.Parallel() + + minerBor := NewBorDefaultMiner(t) + defer func() { + minerBor.Cleanup(false) + minerBor.Ctrl.Finish() + }() + + miner := minerBor.Miner + mux := minerBor.Mux + miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) + // Start the downloader mux.Post(downloader.StartEvent{}) waitForMiningState(t, miner, false) @@ -145,10 +107,20 @@ func TestMinerDownloaderFirstFails(t *testing.T) { } func TestMinerStartStopAfterDownloaderEvents(t *testing.T) { - miner, mux, cleanup := createMiner(t) - defer cleanup(false) + t.Parallel() + + minerBor := NewBorDefaultMiner(t) + defer func() { + minerBor.Cleanup(false) + minerBor.Ctrl.Finish() + }() + + miner := minerBor.Miner + mux := minerBor.Mux + miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) + // Start the downloader mux.Post(downloader.StartEvent{}) waitForMiningState(t, miner, false) @@ -168,58 +140,104 @@ func TestMinerStartStopAfterDownloaderEvents(t *testing.T) { } func TestStartWhileDownload(t *testing.T) { - miner, mux, cleanup := createMiner(t) - defer cleanup(false) + t.Parallel() + + minerBor := NewBorDefaultMiner(t) + defer func() { + minerBor.Cleanup(false) + minerBor.Ctrl.Finish() + }() + + miner := minerBor.Miner + mux := minerBor.Mux + waitForMiningState(t, miner, false) miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, true) + // Stop the downloader and wait for the update loop to run mux.Post(downloader.StartEvent{}) waitForMiningState(t, miner, false) + // Starting the miner after the downloader should not work miner.Start(common.HexToAddress("0x12345")) waitForMiningState(t, miner, false) } func TestStartStopMiner(t *testing.T) { - miner, _, cleanup := createMiner(t) - defer cleanup(false) + t.Parallel() + + minerBor := NewBorDefaultMiner(t) + defer func() { + minerBor.Cleanup(false) + minerBor.Ctrl.Finish() + }() + + miner := minerBor.Miner + waitForMiningState(t, miner, false) miner.Start(common.HexToAddress("0x12345")) + waitForMiningState(t, miner, true) + miner.Stop() - waitForMiningState(t, miner, false) + waitForMiningState(t, miner, false) } func TestCloseMiner(t *testing.T) { - miner, _, cleanup := createMiner(t) - defer cleanup(true) + t.Parallel() + + minerBor := NewBorDefaultMiner(t) + defer func() { + minerBor.Cleanup(true) + minerBor.Ctrl.Finish() + }() + + miner := minerBor.Miner + waitForMiningState(t, miner, false) + miner.Start(common.HexToAddress("0x12345")) + waitForMiningState(t, miner, true) + // Terminate the miner and wait for the update loop to run miner.Close() + waitForMiningState(t, miner, false) } // TestMinerSetEtherbase checks that etherbase becomes set even if mining isn't // possible at the moment func TestMinerSetEtherbase(t *testing.T) { - miner, mux, cleanup := createMiner(t) - defer cleanup(false) + t.Parallel() + + minerBor := NewBorDefaultMiner(t) + defer func() { + minerBor.Cleanup(false) + minerBor.Ctrl.Finish() + }() + + miner := minerBor.Miner + mux := minerBor.Mux + // Start with a 'bad' mining address miner.Start(common.HexToAddress("0xdead")) waitForMiningState(t, miner, true) + // Start the downloader mux.Post(downloader.StartEvent{}) waitForMiningState(t, miner, false) + // Now user tries to configure proper mining address miner.Start(common.HexToAddress("0x1337")) + // Stop the downloader and wait for the update loop to run mux.Post(downloader.DoneEvent{}) waitForMiningState(t, miner, true) + // The miner should now be using the good address if got, exp := miner.coinbase, common.HexToAddress("0x1337"); got != exp { t.Fatalf("Wrong coinbase, got %x expected %x", got, exp) @@ -239,46 +257,6 @@ func waitForMiningState(t *testing.T, m *Miner, mining bool) { return } } - t.Fatalf("Mining() == %t, want %t", state, mining) -} -func createMiner(t *testing.T) (*Miner, *event.TypeMux, func(skipMiner bool)) { - // Create Ethash config - config := Config{ - Etherbase: common.HexToAddress("123456789"), - } - // Create chainConfig - memdb := memorydb.New() - chainDB := rawdb.NewDatabase(memdb) - genesis := core.DeveloperGenesisBlock(15, 11_500_000, common.HexToAddress("12345")) - chainConfig, _, err := core.SetupGenesisBlock(chainDB, genesis) - if err != nil { - t.Fatalf("can't create new chain config: %v", err) - } - // Create consensus engine - engine := clique.New(chainConfig.Clique, chainDB) - // Create Ethereum backend - consensus.NewMerger(rawdb.NewMemoryDatabase()) - bc, err := core.NewBlockChain(chainDB, nil, chainConfig, engine, vm.Config{}, nil, nil) - if err != nil { - t.Fatalf("can't create new chain %v", err) - } - statedb, _ := state.New(common.Hash{}, state.NewDatabase(chainDB), nil) - blockchain := &testBlockChain{statedb, 10000000, new(event.Feed)} - - pool := core.NewTxPool(testTxPoolConfig, chainConfig, blockchain) - backend := NewMockBackend(bc, pool) - // Create event Mux - mux := new(event.TypeMux) - // Create Miner - miner := New(backend, &config, chainConfig, mux, engine, nil) - cleanup := func(skipMiner bool) { - bc.Stop() - engine.Close() - pool.Stop() - if !skipMiner { - miner.Close() - } - } - return miner, mux, cleanup + t.Fatalf("Mining() == %t, want %t", state, mining) } diff --git a/miner/unconfirmed_test.go b/miner/unconfirmed_test.go index dc83cb9265..70d3325506 100644 --- a/miner/unconfirmed_test.go +++ b/miner/unconfirmed_test.go @@ -44,6 +44,7 @@ func TestUnconfirmedInsertBounds(t *testing.T) { for i := 0; i < int(depth); i++ { pool.Insert(depth, [32]byte{byte(depth), byte(i)}) } + // Validate that no blocks below the depth allowance are left in pool.blocks.Do(func(block interface{}) { if block := block.(*unconfirmedBlock); block.index+uint64(limit) <= depth { @@ -64,23 +65,29 @@ func TestUnconfirmedShifts(t *testing.T) { for depth := start; depth < start+uint64(limit); depth++ { pool.Insert(depth, [32]byte{byte(depth)}) } + // Try to shift below the limit and ensure no blocks are dropped pool.Shift(start + uint64(limit) - 1) if n := pool.blocks.Len(); n != int(limit) { t.Errorf("unconfirmed count mismatch: have %d, want %d", n, limit) } + // Try to shift half the blocks out and verify remainder pool.Shift(start + uint64(limit) - 1 + uint64(limit/2)) if n := pool.blocks.Len(); n != int(limit)/2 { t.Errorf("unconfirmed count mismatch: have %d, want %d", n, limit/2) } + // Try to shift all the remaining blocks out and verify emptyness pool.Shift(start + 2*uint64(limit)) + if n := pool.blocks.Len(); n != 0 { t.Errorf("unconfirmed count mismatch: have %d, want %d", n, 0) } + // Try to shift out from the empty set and make sure it doesn't break pool.Shift(start + 3*uint64(limit)) + if n := pool.blocks.Len(); n != 0 { t.Errorf("unconfirmed count mismatch: have %d, want %d", n, 0) } diff --git a/miner/worker.go b/miner/worker.go index c3a5e1c9ba..14c5ccd1a3 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -25,6 +25,7 @@ import ( "time" mapset "github.com/deckarep/golang-set" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/misc" @@ -393,8 +394,10 @@ func recalcRecommit(minRecommit, prev time.Duration, target float64, inc bool) t prevF = float64(prev.Nanoseconds()) next float64 ) + if inc { next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target+intervalAdjustBias) + max := float64(maxRecommitInterval.Nanoseconds()) if next > max { next = max @@ -406,6 +409,7 @@ func recalcRecommit(minRecommit, prev time.Duration, target float64, inc bool) t next = min } } + return time.Duration(int64(next)) } diff --git a/miner/worker_test.go b/miner/worker_test.go index dd029433b8..00739844f2 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -24,9 +24,14 @@ import ( "testing" "time" + "github.com/golang/mock/gomock" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/consensus/bor/api" + "github.com/ethereum/go-ethereum/consensus/bor/valset" "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" @@ -38,6 +43,7 @@ import ( "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/tests/bor/mocks" ) const ( @@ -49,43 +55,9 @@ const ( testGas = 144109 ) -var ( - // Test chain configurations - testTxPoolConfig core.TxPoolConfig - ethashChainConfig *params.ChainConfig - cliqueChainConfig *params.ChainConfig - - // Test accounts - testBankKey, _ = crypto.GenerateKey() - testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey) - testBankFunds = big.NewInt(1000000000000000000) - - testUserKey, _ = crypto.GenerateKey() - testUserAddress = crypto.PubkeyToAddress(testUserKey.PublicKey) - - // Test transactions - pendingTxs []*types.Transaction - newTxs []*types.Transaction - - testConfig = &Config{ - Recommit: time.Second, - GasCeil: params.GenesisGasLimit, - } -) - func init() { - testTxPoolConfig = core.DefaultTxPoolConfig - testTxPoolConfig.Journal = "" - ethashChainConfig = new(params.ChainConfig) - *ethashChainConfig = *params.TestChainConfig - cliqueChainConfig = new(params.ChainConfig) - *cliqueChainConfig = *params.TestChainConfig - cliqueChainConfig.Clique = ¶ms.CliqueConfig{ - Period: 10, - Epoch: 30000, - } - signer := types.LatestSigner(params.TestChainConfig) + tx1 := types.MustSignNewTx(testBankKey, signer, &types.AccessListTx{ ChainID: params.TestChainConfig.ChainID, Nonce: 0, @@ -94,6 +66,7 @@ func init() { Gas: params.TxGas, GasPrice: big.NewInt(params.InitialBaseFee), }) + pendingTxs = append(pendingTxs, tx1) tx2 := types.MustSignNewTx(testBankKey, signer, &types.LegacyTx{ @@ -103,6 +76,7 @@ func init() { Gas: params.TxGas, GasPrice: big.NewInt(params.InitialBaseFee), }) + newTxs = append(newTxs, tx2) rand.Seed(time.Now().UnixNano()) @@ -125,6 +99,12 @@ func newTestWorkerBackend(t *testing.T, chainConfig *params.ChainConfig, engine } switch e := engine.(type) { + case *bor.Bor: + gspec.ExtraData = make([]byte, 32+common.AddressLength+crypto.SignatureLength) + copy(gspec.ExtraData[32:32+common.AddressLength], testBankAddress.Bytes()) + e.Authorize(testBankAddress, func(account accounts.Account, s string, data []byte) ([]byte, error) { + return crypto.Sign(crypto.Keccak256(data), testBankKey) + }) case *clique.Clique: gspec.ExtraData = make([]byte, 32+common.AddressLength+crypto.SignatureLength) copy(gspec.ExtraData[32:32+common.AddressLength], testBankAddress.Bytes()) @@ -135,6 +115,7 @@ func newTestWorkerBackend(t *testing.T, chainConfig *params.ChainConfig, engine default: t.Fatalf("unexpected consensus engine type: %T", engine) } + genesis := gspec.MustCommit(db) chain, _ := core.NewBlockChain(db, &core.CacheConfig{TrieDirtyDisabled: true}, gspec.Config, engine, vm.Config{}, nil, nil) @@ -149,10 +130,12 @@ func newTestWorkerBackend(t *testing.T, chainConfig *params.ChainConfig, engine t.Fatalf("failed to insert origin chain: %v", err) } } + parent := genesis if n > 0 { parent = chain.GetBlockByHash(chain.CurrentBlock().ParentHash()) } + blocks, _ := core.GenerateChain(chainConfig, parent, engine, db, 1, func(i int, gen *core.BlockGen) { gen.SetCoinbase(testUserAddress) }) @@ -174,28 +157,36 @@ func (b *testWorkerBackend) StateAtBlock(block *types.Block, reexec uint64, base func (b *testWorkerBackend) newRandomUncle() *types.Block { var parent *types.Block + cur := b.chain.CurrentBlock() + if cur.NumberU64() == 0 { parent = b.chain.Genesis() } else { parent = b.chain.GetBlockByHash(b.chain.CurrentBlock().ParentHash()) } + blocks, _ := core.GenerateChain(b.chain.Config(), parent, b.chain.Engine(), b.db, 1, func(i int, gen *core.BlockGen) { var addr = make([]byte, common.AddressLength) + rand.Read(addr) gen.SetCoinbase(common.BytesToAddress(addr)) }) + return blocks[0] } func (b *testWorkerBackend) newRandomTx(creation bool) *types.Transaction { var tx *types.Transaction + gasPrice := big.NewInt(10 * params.InitialBaseFee) + if creation { tx, _ = types.SignTx(types.NewContractCreation(b.txPool.Nonce(testBankAddress), big.NewInt(0), testGas, gasPrice, common.FromHex(testCode)), types.HomesteadSigner{}, testBankKey) } else { tx, _ = types.SignTx(types.NewTransaction(b.txPool.Nonce(testBankAddress), testUserAddress, big.NewInt(1000), params.TxGas, gasPrice, nil), types.HomesteadSigner{}, testBankKey) } + return tx } @@ -204,39 +195,85 @@ func newTestWorker(t *testing.T, chainConfig *params.ChainConfig, engine consens backend.txPool.AddLocals(pendingTxs) w := newWorker(testConfig, chainConfig, engine, backend, new(event.TypeMux), nil, false) w.setEtherbase(testBankAddress) + return w, backend } func TestGenerateBlockAndImportEthash(t *testing.T) { - testGenerateBlockAndImport(t, false) + t.Parallel() + + testGenerateBlockAndImport(t, false, false) } func TestGenerateBlockAndImportClique(t *testing.T) { - testGenerateBlockAndImport(t, true) + t.Parallel() + + testGenerateBlockAndImport(t, true, false) +} + +func TestGenerateBlockAndImportBor(t *testing.T) { + t.Parallel() + + testGenerateBlockAndImport(t, false, true) } -func testGenerateBlockAndImport(t *testing.T, isClique bool) { +//nolint:thelper +func testGenerateBlockAndImport(t *testing.T, isClique bool, isBor bool) { var ( engine consensus.Engine chainConfig *params.ChainConfig db = rawdb.NewMemoryDatabase() ) - if isClique { - chainConfig = params.AllCliqueProtocolChanges - chainConfig.Clique = ¶ms.CliqueConfig{Period: 1, Epoch: 30000} - engine = clique.New(chainConfig.Clique, db) + + if isBor { + chainConfig = params.BorUnittestChainConfig + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + ethAPIMock := api.NewMockCaller(ctrl) + ethAPIMock.EXPECT().Call(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + + spanner := bor.NewMockSpanner(ctrl) + spanner.EXPECT().GetCurrentValidators(gomock.Any(), gomock.Any()).Return([]*valset.Validator{ + { + ID: 0, + Address: testBankAddress, + VotingPower: 100, + ProposerPriority: 0, + }, + }, nil).AnyTimes() + + heimdallClientMock := mocks.NewMockIHeimdallClient(ctrl) + heimdallClientMock.EXPECT().Close().Times(1) + + contractMock := bor.NewMockGenesisContract(ctrl) + + db, _, _ = NewDBForFakes(t) + + engine = NewFakeBor(t, db, chainConfig, ethAPIMock, spanner, heimdallClientMock, contractMock) } else { - chainConfig = params.AllEthashProtocolChanges - engine = ethash.NewFaker() + if isClique { + chainConfig = params.AllCliqueProtocolChanges + chainConfig.Clique = ¶ms.CliqueConfig{Period: 1, Epoch: 30000} + engine = clique.New(chainConfig.Clique, db) + } else { + chainConfig = params.AllEthashProtocolChanges + engine = ethash.NewFaker() + } } + defer engine.Close() + chainConfig.LondonBlock = big.NewInt(0) + w, b := newTestWorker(t, chainConfig, engine, db, 0) defer w.close() // This test chain imports the mined blocks. db2 := rawdb.NewMemoryDatabase() b.genesis.MustCommit(db2) + chain, _ := core.NewBlockChain(db2, nil, b.chain.Config(), engine, vm.Config{}, nil, nil) defer chain.Stop() @@ -287,20 +324,25 @@ func testEmptyWork(t *testing.T, chainConfig *params.ChainConfig, engine consens taskIndex int taskCh = make(chan struct{}, 2) ) + checkEqual := func(t *testing.T, task *task, index int) { // The first empty work without any txs included receiptLen, balance := 0, big.NewInt(0) + if index == 1 { // The second full work with 1 tx included receiptLen, balance = 1, big.NewInt(1000) } + if len(task.receipts) != receiptLen { t.Fatalf("receipt number mismatch: have %d, want %d", len(task.receipts), receiptLen) } + if task.state.GetBalance(testUserAddress).Cmp(balance) != 0 { t.Fatalf("account balance mismatch: have %d, want %d", task.state.GetBalance(testUserAddress), balance) } } + w.newTaskHook = func(task *task) { if task.block.NumberU64() == 1 { checkEqual(t, task, taskIndex) @@ -308,11 +350,14 @@ func testEmptyWork(t *testing.T, chainConfig *params.ChainConfig, engine consens taskCh <- struct{}{} } } + w.skipSealHook = func(task *task) bool { return true } w.fullTaskHook = func() { time.Sleep(100 * time.Millisecond) } + w.start() // Start mining! + for i := 0; i < 2; i += 1 { select { case <-taskCh: @@ -344,16 +389,20 @@ func TestStreamUncleBlock(t *testing.T) { t.Errorf("uncle hash mismatch: have %s, want %s", have.Hex(), want.Hex()) } } + taskCh <- struct{}{} taskIndex += 1 } } + w.skipSealHook = func(task *task) bool { return true } + w.fullTaskHook = func() { time.Sleep(100 * time.Millisecond) } + w.start() for i := 0; i < 2; i += 1 { @@ -396,20 +445,25 @@ func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, en // one has 1 pending tx, the third one has 2 txs if taskIndex == 2 { receiptLen, balance := 2, big.NewInt(2000) + if len(task.receipts) != receiptLen { t.Errorf("receipt number mismatch: have %d, want %d", len(task.receipts), receiptLen) } + if task.state.GetBalance(testUserAddress).Cmp(balance) != 0 { t.Errorf("account balance mismatch: have %d, want %d", task.state.GetBalance(testUserAddress), balance) } } + taskCh <- struct{}{} taskIndex += 1 } } + w.skipSealHook = func(task *task) bool { return true } + w.fullTaskHook = func() { time.Sleep(100 * time.Millisecond) } @@ -423,6 +477,7 @@ func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, en t.Error("new task timeout") } } + b.txPool.AddLocals(newTxs) time.Sleep(time.Second) @@ -459,6 +514,7 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co index = 0 start uint32 ) + w.resubmitHook = func(minInterval time.Duration, recommitInterval time.Duration) { // Short circuit if interval checking hasn't started. if atomic.LoadUint32(&start) == 0 { @@ -489,16 +545,19 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co if recommitInterval != wantRecommitInterval { t.Errorf("resubmit interval mismatch: have %v, want %v", recommitInterval, wantRecommitInterval) } + result = append(result, float64(recommitInterval.Nanoseconds())) index += 1 progress <- struct{}{} } + w.start() time.Sleep(time.Second) // Ensure two tasks have been summitted due to start opt atomic.StoreUint32(&start, 1) w.setRecommitInterval(3 * time.Second) + select { case <-progress: case <-time.NewTimer(time.Second).C: @@ -506,6 +565,7 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co } w.resubmitAdjustCh <- &intervalAdjust{inc: true, ratio: 0.8} + select { case <-progress: case <-time.NewTimer(time.Second).C: @@ -513,6 +573,7 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co } w.resubmitAdjustCh <- &intervalAdjust{inc: false} + select { case <-progress: case <-time.NewTimer(time.Second).C: @@ -520,6 +581,7 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co } w.setRecommitInterval(500 * time.Millisecond) + select { case <-progress: case <-time.NewTimer(time.Second).C: @@ -554,9 +616,11 @@ func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine co w.skipSealHook = func(task *task) bool { return true } + w.fullTaskHook = func() { time.Sleep(100 * time.Millisecond) } + timestamp := uint64(time.Now().Unix()) assertBlock := func(block *types.Block, number uint64, coinbase common.Address, random common.Hash) { if block.Time() != timestamp { @@ -564,14 +628,17 @@ func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine co // is even smaller than parent block's. It's OK. t.Logf("Invalid timestamp, want %d, get %d", timestamp, block.Time()) } + if len(block.Uncles()) != 0 { t.Error("Unexpected uncle block") } + _, isClique := engine.(*clique.Clique) if !isClique { if len(block.Extra()) != 0 { t.Error("Unexpected extra field") } + if block.Coinbase() != coinbase { t.Errorf("Unexpected coinbase got %x want %x", block.Coinbase(), coinbase) } @@ -580,18 +647,22 @@ func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine co t.Error("Unexpected coinbase") } } + if !isClique { if block.MixDigest() != random { t.Error("Unexpected mix digest") } } + if block.Nonce() != 0 { t.Error("Unexpected block nonce") } + if block.NumberU64() != number { t.Errorf("Mismatched block number, want %d got %d", number, block.NumberU64()) } } + var cases = []struct { parent common.Hash coinbase common.Address @@ -639,6 +710,7 @@ func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine co // This API should work even when the automatic sealing is not enabled for _, c := range cases { block, err := w.getSealingBlock(c.parent, timestamp, c.coinbase, c.random) + if c.expectErr { if err == nil { t.Error("Expect error but get nil") @@ -647,12 +719,14 @@ func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine co if err != nil { t.Errorf("Unexpected error %v", err) } + assertBlock(block, c.expectNumber, c.coinbase, c.random) } } // This API should work even when the automatic sealing is enabled w.start() + for _, c := range cases { block, err := w.getSealingBlock(c.parent, timestamp, c.coinbase, c.random) if c.expectErr { @@ -663,6 +737,7 @@ func testGetSealingWork(t *testing.T, chainConfig *params.ChainConfig, engine co if err != nil { t.Errorf("Unexpected error %v", err) } + assertBlock(block, c.expectNumber, c.coinbase, c.random) } } diff --git a/params/config.go b/params/config.go index 47e22f986c..980250a1ec 100644 --- a/params/config.go +++ b/params/config.go @@ -23,8 +23,9 @@ import ( "sort" "strconv" - "github.com/ethereum/go-ethereum/common" "golang.org/x/crypto/sha3" + + "github.com/ethereum/go-ethereum/common" ) // Genesis hashes to enforce below configs on. @@ -289,6 +290,38 @@ var ( }, }, } + BorUnittestChainConfig = &ChainConfig{ + ChainID: big.NewInt(80001), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: true, + EIP150Hash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(0), + Bor: &BorConfig{ + Period: map[string]uint64{ + "0": 1, + }, + ProducerDelay: 3, + Sprint: 32, + BackupMultiplier: map[string]uint64{ + "0": 2, + }, + ValidatorContract: "0x0000000000000000000000000000000000001000", + StateReceiverContract: "0x0000000000000000000000000000000000001001", + BurntContract: map[string]string{ + "0": "0x00000000000000000000000000000000000000000", + }, + }, + } // MumbaiChainConfig contains the chain parameters to run a node on the Mumbai test network. MumbaiChainConfig = &ChainConfig{ @@ -550,7 +583,9 @@ func (c *BorConfig) calculateBorConfigHelper(field map[string]uint64, number uin for k := range field { keys = append(keys, k) } + sort.Strings(keys) + for i := 0; i < len(keys)-1; i++ { valUint, _ := strconv.ParseUint(keys[i], 10, 64) valUintNext, _ := strconv.ParseUint(keys[i+1], 10, 64) @@ -558,6 +593,7 @@ func (c *BorConfig) calculateBorConfigHelper(field map[string]uint64, number uin return field[keys[i]] } } + return field[keys[len(keys)-1]] } diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index 3bda2ee3f4..434ad805e1 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -5,14 +5,17 @@ package bor import ( "encoding/hex" - "encoding/json" "io" "math/big" "testing" "time" + "github.com/golang/mock/gomock" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" @@ -22,12 +25,12 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/tests/bor/mocks" + "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" "golang.org/x/crypto/sha3" ) -var ( +const ( spanPath = "bor/span/1" clerkPath = "clerk/event-record/list" clerkQueryParams = "from-time=%d&to-time=%d&page=%d&limit=50" @@ -38,7 +41,10 @@ func TestInsertingSpanSizeBlocks(t *testing.T) { chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) - h, heimdallSpan := getMockedHeimdallClient(t) + + h, heimdallSpan, ctrl := getMockedHeimdallClient(t) + defer ctrl.Finish() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -51,7 +57,6 @@ func TestInsertingSpanSizeBlocks(t *testing.T) { insertNewBlock(t, chain, block) } - assert.True(t, h.AssertCalled(t, "FetchWithRetry", spanPath, "")) validators, err := _bor.GetCurrentValidators(block.Hash(), spanSize) // check validator set at the first block of new span if err != nil { t.Fatalf("%s", err) @@ -82,8 +87,12 @@ func TestFetchStateSyncEvents(t *testing.T) { // B. Before inserting 1st block of the next sprint, mock heimdall deps // B.1 Mock /bor/span/1 res, _ := loadSpanFromFile(t) - h := &mocks.IHeimdallClient{} - h.On("FetchWithRetry", spanPath, "").Return(res, nil) + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + h := mocks.NewMockIHeimdallClient(ctrl) + h.EXPECT().Span(uint64(1)).Return(&res.Result, nil).AnyTimes() // B.2 Mock State Sync events fromID := uint64(1) @@ -94,14 +103,12 @@ func TestFetchStateSyncEvents(t *testing.T) { sample := getSampleEventRecord(t) sample.Time = time.Unix(to-int64(eventCount+1), 0) // last event.Time will be just < to eventRecords := generateFakeStateSyncEvents(sample, eventCount) - h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) + + h.EXPECT().StateSyncEvents(fromID, to).Return(eventRecords, nil).AnyTimes() _bor.SetHeimdallClient(h) block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) insertNewBlock(t, chain, block) - - assert.True(t, h.AssertCalled(t, "FetchWithRetry", spanPath, "")) - assert.True(t, h.AssertCalled(t, "FetchStateSyncEvents", fromID, to)) } func TestFetchStateSyncEvents_2(t *testing.T) { @@ -112,8 +119,12 @@ func TestFetchStateSyncEvents_2(t *testing.T) { // Mock /bor/span/1 res, _ := loadSpanFromFile(t) - h := &mocks.IHeimdallClient{} - h.On("FetchWithRetry", spanPath, "").Return(res, nil) + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + h := mocks.NewMockIHeimdallClient(ctrl) + h.EXPECT().Span(uint64(1)).Return(&res.Result, nil).AnyTimes() // Mock State Sync events // at # sprintSize, events are fetched for [fromID, (block-sprint).Time) @@ -123,7 +134,7 @@ func TestFetchStateSyncEvents_2(t *testing.T) { // First query will be from [id=1, (block-sprint).Time] // Insert 5 events in this time range - eventRecords := []*bor.EventRecordWithTime{ + eventRecords := []*clerk.EventRecordWithTime{ buildStateEvent(sample, 1, 3), // id = 1, time = 1 buildStateEvent(sample, 2, 1), // id = 2, time = 3 buildStateEvent(sample, 3, 2), // id = 3, time = 2 @@ -131,7 +142,8 @@ func TestFetchStateSyncEvents_2(t *testing.T) { buildStateEvent(sample, 4, 5), // id = 4, time = 5 buildStateEvent(sample, 6, 4), // id = 6, time = 4 } - h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) + + h.EXPECT().StateSyncEvents(fromID, to).Return(eventRecords, nil).AnyTimes() _bor.SetHeimdallClient(h) // Insert blocks for 0th sprint @@ -141,25 +153,27 @@ func TestFetchStateSyncEvents_2(t *testing.T) { block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) insertNewBlock(t, chain, block) } - assert.True(t, h.AssertCalled(t, "FetchWithRetry", spanPath, "")) - assert.True(t, h.AssertCalled(t, "FetchStateSyncEvents", fromID, to)) + lastStateID, _ := _bor.GenesisContractsClient.LastStateId(sprintSize) + // state 6 was not written assert.Equal(t, uint64(4), lastStateID.Uint64()) // fromID = uint64(5) to = int64(chain.GetHeaderByNumber(sprintSize).Time) - eventRecords = []*bor.EventRecordWithTime{ + + eventRecords = []*clerk.EventRecordWithTime{ buildStateEvent(sample, 5, 7), buildStateEvent(sample, 6, 4), } - h.On("FetchStateSyncEvents", fromID, to).Return(eventRecords, nil) + h.EXPECT().StateSyncEvents(fromID, to).Return(eventRecords, nil).AnyTimes() + for i := sprintSize + 1; i <= spanSize; i++ { block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor) insertNewBlock(t, chain, block) } - assert.True(t, h.AssertCalled(t, "FetchStateSyncEvents", fromID, to)) + lastStateID, _ = _bor.GenesisContractsClient.LastStateId(spanSize) assert.Equal(t, uint64(6), lastStateID.Uint64()) } @@ -169,7 +183,10 @@ func TestOutOfTurnSigning(t *testing.T) { chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) - h, _ := getMockedHeimdallClient(t) + + h, _, ctrl := getMockedHeimdallClient(t) + defer ctrl.Finish() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -217,7 +234,10 @@ func TestSignerNotFound(t *testing.T) { chain := init.ethereum.BlockChain() engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) - h, _ := getMockedHeimdallClient(t) + + h, _, ctrl := getMockedHeimdallClient(t) + defer ctrl.Finish() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -236,47 +256,46 @@ func TestSignerNotFound(t *testing.T) { bor.UnauthorizedSignerError{Number: 0, Signer: addr.Bytes()}) } -func getMockedHeimdallClient(t *testing.T) (*mocks.IHeimdallClient, *bor.HeimdallSpan) { - res, heimdallSpan := loadSpanFromFile(t) - h := &mocks.IHeimdallClient{} - h.On("FetchWithRetry", "bor/span/1", "").Return(res, nil) - h.On( - "FetchStateSyncEvents", - mock.AnythingOfType("uint64"), - mock.AnythingOfType("int64")).Return([]*bor.EventRecordWithTime{getSampleEventRecord(t)}, nil) - return h, heimdallSpan +func getMockedHeimdallClient(t *testing.T) (*mocks.MockIHeimdallClient, *span.HeimdallSpan, *gomock.Controller) { + ctrl := gomock.NewController(t) + h := mocks.NewMockIHeimdallClient(ctrl) + + _, heimdallSpan := loadSpanFromFile(t) + + h.EXPECT().Span(uint64(1)).Return(heimdallSpan, nil).AnyTimes() + + h.EXPECT().StateSyncEvents(gomock.Any(), gomock.Any()). + Return([]*clerk.EventRecordWithTime{getSampleEventRecord(t)}, nil).AnyTimes() + + return h, heimdallSpan, ctrl } -func generateFakeStateSyncEvents(sample *bor.EventRecordWithTime, count int) []*bor.EventRecordWithTime { - events := make([]*bor.EventRecordWithTime, count) +func generateFakeStateSyncEvents(sample *clerk.EventRecordWithTime, count int) []*clerk.EventRecordWithTime { + events := make([]*clerk.EventRecordWithTime, count) event := *sample event.ID = 1 - events[0] = &bor.EventRecordWithTime{} + events[0] = &clerk.EventRecordWithTime{} *events[0] = event for i := 1; i < count; i++ { event.ID = uint64(i) event.Time = event.Time.Add(1 * time.Second) - events[i] = &bor.EventRecordWithTime{} + events[i] = &clerk.EventRecordWithTime{} *events[i] = event } return events } -func buildStateEvent(sample *bor.EventRecordWithTime, id uint64, timeStamp int64) *bor.EventRecordWithTime { +func buildStateEvent(sample *clerk.EventRecordWithTime, id uint64, timeStamp int64) *clerk.EventRecordWithTime { event := *sample event.ID = id event.Time = time.Unix(timeStamp, 0) return &event } -func getSampleEventRecord(t *testing.T) *bor.EventRecordWithTime { - res := stateSyncEventsPayload(t) - var _eventRecords []*bor.EventRecordWithTime - if err := json.Unmarshal(res.Result, &_eventRecords); err != nil { - t.Fatalf("%s", err) - } - _eventRecords[0].Time = time.Unix(1, 0) - return _eventRecords[0] +func getSampleEventRecord(t *testing.T) *clerk.EventRecordWithTime { + eventRecords := stateSyncEventsPayload(t) + eventRecords.Result[0].Time = time.Unix(1, 0) + return eventRecords.Result[0] } // TestEIP1559Transition tests the following: diff --git a/tests/bor/helper.go b/tests/bor/helper.go index a1b6a19742..a8a3ae4ea6 100644 --- a/tests/bor/helper.go +++ b/tests/bor/helper.go @@ -11,6 +11,9 @@ import ( "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" + "github.com/ethereum/go-ethereum/consensus/bor/valset" "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" @@ -46,17 +49,23 @@ type initializeData struct { } func buildEthereumInstance(t *testing.T, db ethdb.Database) *initializeData { + t.Helper() + genesisData, err := ioutil.ReadFile("./testdata/genesis.json") if err != nil { t.Fatalf("%s", err) } + gen := &core.Genesis{} + if err := json.Unmarshal(genesisData, gen); err != nil { t.Fatalf("%s", err) } + ethConf := ð.Config{ Genesis: gen, } + ethConf.Genesis.MustCommit(db) ethereum := utils.CreateBorEthereum(ethConf) @@ -65,6 +74,7 @@ func buildEthereumInstance(t *testing.T, db ethdb.Database) *initializeData { } ethConf.Genesis.MustCommit(ethereum.ChainDb()) + return &initializeData{ genesis: gen, ethereum: ethereum, @@ -72,12 +82,16 @@ func buildEthereumInstance(t *testing.T, db ethdb.Database) *initializeData { } func insertNewBlock(t *testing.T, chain *core.BlockChain, block *types.Block) { + t.Helper() + if _, err := chain.InsertChain([]*types.Block{block}); err != nil { t.Fatalf("%s", err) } } func buildNextBlock(t *testing.T, _bor *bor.Bor, chain *core.BlockChain, block *types.Block, signer []byte, borConfig *params.BorConfig) *types.Block { + t.Helper() + header := block.Header() header.Number.Add(header.Number, big.NewInt(1)) number := header.Number.Uint64() @@ -90,11 +104,12 @@ func buildNextBlock(t *testing.T, _bor *bor.Bor, chain *core.BlockChain, block * header.Time += bor.CalcProducerDelay(header.Number.Uint64(), 0, borConfig) header.Extra = make([]byte, 32+65) // vanity + extraSeal - currentValidators := []*bor.Validator{bor.NewValidator(addr, 10)} + currentValidators := []*valset.Validator{valset.NewValidator(addr, 10)} isSpanEnd := (number+1)%spanSize == 0 isSpanStart := number%spanSize == 0 isSprintEnd := (header.Number.Uint64()+1)%sprintSize == 0 + if isSpanEnd { _, heimdallSpan := loadSpanFromFile(t) // this is to stash the validator bytes in the header @@ -102,18 +117,23 @@ func buildNextBlock(t *testing.T, _bor *bor.Bor, chain *core.BlockChain, block * } else if isSpanStart { header.Difficulty = new(big.Int).SetInt64(3) } + if isSprintEnd { - sort.Sort(bor.ValidatorsByAddress(currentValidators)) + sort.Sort(valset.ValidatorsByAddress(currentValidators)) + validatorBytes := make([]byte, len(currentValidators)*validatorHeaderBytesLength) header.Extra = make([]byte, 32+len(validatorBytes)+65) // vanity + validatorBytes + extraSeal + for i, val := range currentValidators { copy(validatorBytes[i*validatorHeaderBytesLength:], val.HeaderBytes()) } + copy(header.Extra[32:], validatorBytes) } if chain.Config().IsLondon(header.Number) { header.BaseFee = misc.CalcBaseFee(chain.Config(), block.Header()) + if !chain.Config().IsLondon(block.Number()) { parentGasLimit := block.GasLimit() * params.ElasticityMultiplier header.GasLimit = core.CalcGasLimit(parentGasLimit, parentGasLimit) @@ -124,58 +144,73 @@ func buildNextBlock(t *testing.T, _bor *bor.Bor, chain *core.BlockChain, block * if err != nil { t.Fatalf("%s", err) } + _, err = _bor.FinalizeAndAssemble(chain, header, state, nil, nil, nil) if err != nil { t.Fatalf("%s", err) } + sign(t, header, signer, borConfig) + return types.NewBlockWithHeader(header) } func sign(t *testing.T, header *types.Header, signer []byte, c *params.BorConfig) { + t.Helper() + sig, err := secp256k1.Sign(crypto.Keccak256(bor.BorRLP(header, c)), signer) if err != nil { t.Fatalf("%s", err) } + copy(header.Extra[len(header.Extra)-extraSeal:], sig) } -func stateSyncEventsPayload(t *testing.T) *bor.ResponseWithHeight { +//nolint:unused,deadcode +func stateSyncEventsPayload(t *testing.T) *heimdall.StateSyncEventsResponse { + t.Helper() + stateData, err := ioutil.ReadFile("./testdata/states.json") if err != nil { t.Fatalf("%s", err) } - res := &bor.ResponseWithHeight{} + + res := &heimdall.StateSyncEventsResponse{} if err := json.Unmarshal(stateData, res); err != nil { t.Fatalf("%s", err) } + return res } -func loadSpanFromFile(t *testing.T) (*bor.ResponseWithHeight, *bor.HeimdallSpan) { +//nolint:unused,deadcode +func loadSpanFromFile(t *testing.T) (*heimdall.SpanResponse, *span.HeimdallSpan) { + t.Helper() + spanData, err := ioutil.ReadFile("./testdata/span.json") if err != nil { t.Fatalf("%s", err) } - res := &bor.ResponseWithHeight{} + + res := &heimdall.SpanResponse{} + if err := json.Unmarshal(spanData, res); err != nil { t.Fatalf("%s", err) } - heimdallSpan := &bor.HeimdallSpan{} - if err := json.Unmarshal(res.Result, heimdallSpan); err != nil { - t.Fatalf("%s", err) - } - return res, heimdallSpan + return res, &res.Result } func getSignerKey(number uint64) []byte { signerKey := privKey + isSpanStart := number%spanSize == 0 if isSpanStart { // validator set in the new span has changed signerKey = privKey2 } + _key, _ := hex.DecodeString(signerKey) + return _key } diff --git a/tests/bor/mocks/IHeimdallClient.go b/tests/bor/mocks/IHeimdallClient.go index ac89487d3b..4e4d7a3776 100644 --- a/tests/bor/mocks/IHeimdallClient.go +++ b/tests/bor/mocks/IHeimdallClient.go @@ -1,87 +1,78 @@ -// Code generated by mockery v2.10.0. DO NOT EDIT. +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ethereum/go-ethereum/consensus/bor (interfaces: IHeimdallClient) +// Package mocks is a generated GoMock package. package mocks import ( - bor "github.com/ethereum/go-ethereum/consensus/bor" - mock "github.com/stretchr/testify/mock" + reflect "reflect" + + clerk "github.com/ethereum/go-ethereum/consensus/bor/clerk" + span "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" + gomock "github.com/golang/mock/gomock" ) -// IHeimdallClient is an autogenerated mock type for the IHeimdallClient type -type IHeimdallClient struct { - mock.Mock +// MockIHeimdallClient is a mock of IHeimdallClient interface. +type MockIHeimdallClient struct { + ctrl *gomock.Controller + recorder *MockIHeimdallClientMockRecorder } -// Close provides a mock function with given fields: -func (_m *IHeimdallClient) Close() { - _m.Called() +// MockIHeimdallClientMockRecorder is the mock recorder for MockIHeimdallClient. +type MockIHeimdallClientMockRecorder struct { + mock *MockIHeimdallClient } -// Fetch provides a mock function with given fields: path, query -func (_m *IHeimdallClient) Fetch(path string, query string) (*bor.ResponseWithHeight, error) { - ret := _m.Called(path, query) - - var r0 *bor.ResponseWithHeight - if rf, ok := ret.Get(0).(func(string, string) *bor.ResponseWithHeight); ok { - r0 = rf(path, query) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*bor.ResponseWithHeight) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, string) error); ok { - r1 = rf(path, query) - } else { - r1 = ret.Error(1) - } - - return r0, r1 +// NewMockIHeimdallClient creates a new mock instance. +func NewMockIHeimdallClient(ctrl *gomock.Controller) *MockIHeimdallClient { + mock := &MockIHeimdallClient{ctrl: ctrl} + mock.recorder = &MockIHeimdallClientMockRecorder{mock} + return mock } -// FetchStateSyncEvents provides a mock function with given fields: fromID, to -func (_m *IHeimdallClient) FetchStateSyncEvents(fromID uint64, to int64) ([]*bor.EventRecordWithTime, error) { - ret := _m.Called(fromID, to) - - var r0 []*bor.EventRecordWithTime - if rf, ok := ret.Get(0).(func(uint64, int64) []*bor.EventRecordWithTime); ok { - r0 = rf(fromID, to) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*bor.EventRecordWithTime) - } - } +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockIHeimdallClient) EXPECT() *MockIHeimdallClientMockRecorder { + return m.recorder +} - var r1 error - if rf, ok := ret.Get(1).(func(uint64, int64) error); ok { - r1 = rf(fromID, to) - } else { - r1 = ret.Error(1) - } +// Close mocks base method. +func (m *MockIHeimdallClient) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} - return r0, r1 +// Close indicates an expected call of Close. +func (mr *MockIHeimdallClientMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockIHeimdallClient)(nil).Close)) } -// FetchWithRetry provides a mock function with given fields: path, query -func (_m *IHeimdallClient) FetchWithRetry(path string, query string) (*bor.ResponseWithHeight, error) { - ret := _m.Called(path, query) +// Span mocks base method. +func (m *MockIHeimdallClient) Span(arg0 uint64) (*span.HeimdallSpan, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Span", arg0) + ret0, _ := ret[0].(*span.HeimdallSpan) + ret1, _ := ret[1].(error) + return ret0, ret1 +} - var r0 *bor.ResponseWithHeight - if rf, ok := ret.Get(0).(func(string, string) *bor.ResponseWithHeight); ok { - r0 = rf(path, query) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*bor.ResponseWithHeight) - } - } +// Span indicates an expected call of Span. +func (mr *MockIHeimdallClientMockRecorder) Span(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Span", reflect.TypeOf((*MockIHeimdallClient)(nil).Span), arg0) +} - var r1 error - if rf, ok := ret.Get(1).(func(string, string) error); ok { - r1 = rf(path, query) - } else { - r1 = ret.Error(1) - } +// StateSyncEvents mocks base method. +func (m *MockIHeimdallClient) StateSyncEvents(arg0 uint64, arg1 int64) ([]*clerk.EventRecordWithTime, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSyncEvents", arg0, arg1) + ret0, _ := ret[0].([]*clerk.EventRecordWithTime) + ret1, _ := ret[1].(error) + return ret0, ret1 +} - return r0, r1 +// StateSyncEvents indicates an expected call of StateSyncEvents. +func (mr *MockIHeimdallClientMockRecorder) StateSyncEvents(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSyncEvents", reflect.TypeOf((*MockIHeimdallClient)(nil).StateSyncEvents), arg0, arg1) } diff --git a/tests/deps/fake.go b/tests/deps/fake.go new file mode 100644 index 0000000000..cd04ffa070 --- /dev/null +++ b/tests/deps/fake.go @@ -0,0 +1,7 @@ +package deps + +// it is a fake file to lock deps +//nolint:typecheck +import ( + _ "github.com/golang/mock/mockgen/model" +) diff --git a/trie/hasher.go b/trie/hasher.go index 7f0748c13d..c085970a3f 100644 --- a/trie/hasher.go +++ b/trie/hasher.go @@ -19,9 +19,10 @@ package trie import ( "sync" + "golang.org/x/crypto/sha3" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/rlp" - "golang.org/x/crypto/sha3" ) // hasher is a type used for the trie Hash operation. A hasher has some From 342bf3089eff489cc0059bf3e8fb2b84e571263c Mon Sep 17 00:00:00 2001 From: Evgeny Danilenko <6655321@bk.ru> Date: Wed, 15 Jun 2022 09:02:01 +0300 Subject: [PATCH 131/190] Merge develop branch into v0.3.0-dev (#430) * merge geth v1.10.15 * fix: Removed FastSync from cli server * fix: TestHeadersRLPStorage * Added t.skip(ETH2 in bor) * fix: flow in create consensus engine * bumped version * Fix typo * increase block time * remove file * bumped version * merge gethv1.10.17 * bumped version * fix failing tests * Bump Go version to v1.18 (#368) * Bump Go version to v1.18.1 * Build using netgo tag This will create a static build using Go native networking stack. Checked and it works stable for all archs and distros. * Fix meta * initial implementation for common ancestor approach * extract whitelist interface * fix types * fix tests and format * add unit tests for IsValidChain function * more tests * wip * test ErrCheckpointMismatch * minor fixes * fix test * dont panic * fmt * Limit state sync by gas * Added logging for state-sync total gas usage * Added number of event-records in log * Minor Changes * Minor Fix * Adding individual gasUsed * Minor Fix * fix: return value for no remote block * handle all errors * modularise fake chain validator in downloader * add more tests * fix tests * Modifying miner.recommit flag and its adjustment function. (#370) * changed min/max/current recommit values * Remove Hardcoded min/max * Code Sanitization * Skipping tests for constant recommit interval * Adding default miner.recommit value * Minor Change * Increased default value of rpc.txfeecap to 5 * add debug rpc endpoints for checkpoint whitelist service * minor fixes and enhancements * avoid capping warnings for gas set by internal system transactions * use typed mocks * fix * fix * fix * fix close * fix * Create stale.yml * Fix bor consensus checkpoint bug Co-authored-by: Arpit Temani Co-authored-by: Shivam Sharma Co-authored-by: Manav Darji Co-authored-by: Sandeep Sreenath Co-authored-by: Victor Castell Co-authored-by: Ferran Co-authored-by: Krishna Upadhyaya Co-authored-by: Karlo Co-authored-by: Sandeep Sreenath Co-authored-by: Jerry --- .github/workflows/stale.yml | 31 +++ consensus/bor/bor.go | 2 + consensus/bor/heimdall.go | 2 + .../bor/heimdall/checkpoint/checkpoint.go | 22 ++ consensus/bor/heimdall/client.go | 21 ++ eth/api_backend.go | 8 + eth/backend.go | 75 ++++++ eth/downloader/downloader.go | 61 ++++- eth/downloader/downloader_test.go | 219 +++++++++++++++--- eth/downloader/queue_test.go | 10 +- eth/downloader/whitelist/service.go | 126 ++++++++++ eth/downloader/whitelist/service_test.go | 107 +++++++++ eth/ethconfig/config.go | 4 +- eth/handler.go | 27 ++- eth/handler_bor.go | 75 ++++++ go.mod | 2 +- internal/ethapi/api.go | 11 + internal/ethapi/backend.go | 2 + internal/ethapi/transaction_args.go | 45 +++- internal/web3ext/web3ext.go | 10 + les/api_backend.go | 15 +- miner/worker.go | 46 ++-- miner/worker_test.go | 5 + tests/bor/bor_test.go | 42 +++- tests/bor/mocks/IHeimdallClient.go | 16 ++ 25 files changed, 898 insertions(+), 86 deletions(-) create mode 100644 .github/workflows/stale.yml create mode 100644 consensus/bor/heimdall/checkpoint/checkpoint.go create mode 100644 eth/downloader/whitelist/service.go create mode 100644 eth/downloader/whitelist/service_test.go create mode 100644 eth/handler_bor.go diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000000..5d5d221eb3 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,31 @@ +# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. +# +# You can adjust the behavior by modifying this file. +# For more information, see: +# https://github.com/actions/stale +name: Mark stale issues and pull requests + +on: + schedule: + - cron: '0 0 * * *' + +jobs: + stale: + + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + + steps: + - uses: actions/stale@v5 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: 'This issue is stale because it has been open 14 days with no activity. Remove stale label or comment or this will be closed in 14 days.' + stale-pr-message: 'This PR is stale because it has been open 21 days with no activity. Remove stale label or comment or this will be closed in 14 days.' + close-issue-message: 'This issue was closed because it has been stalled for 28 days with no activity.' + close-pr-message: 'This PR was closed because it has been stalled for 35 days with no activity.' + days-before-issue-stale: 14 + days-before-pr-stale: 21 + days-before-issue-close: 14 + days-before-pr-close: 14 diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 2f087af787..87770f49ab 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -1107,6 +1107,8 @@ func (c *Bor) CommitStates( lastStateID++ } + log.Info("StateSyncData", "Gas", totalGas, "Block-number", number, "LastStateID", lastStateID, "TotalRecords", len(eventRecords)) + return stateSyncs, nil } diff --git a/consensus/bor/heimdall.go b/consensus/bor/heimdall.go index c97a3cda11..217de13fe9 100644 --- a/consensus/bor/heimdall.go +++ b/consensus/bor/heimdall.go @@ -2,6 +2,7 @@ package bor import ( "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/checkpoint" "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" ) @@ -9,5 +10,6 @@ import ( type IHeimdallClient interface { StateSyncEvents(fromID uint64, to int64) ([]*clerk.EventRecordWithTime, error) Span(spanID uint64) (*span.HeimdallSpan, error) + FetchLatestCheckpoint() (*checkpoint.Checkpoint, error) Close() } diff --git a/consensus/bor/heimdall/checkpoint/checkpoint.go b/consensus/bor/heimdall/checkpoint/checkpoint.go new file mode 100644 index 0000000000..77569293ad --- /dev/null +++ b/consensus/bor/heimdall/checkpoint/checkpoint.go @@ -0,0 +1,22 @@ +package checkpoint + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +// Checkpoint defines a response object type of bor checkpoint +type Checkpoint struct { + Proposer common.Address `json:"proposer"` + StartBlock *big.Int `json:"start_block"` + EndBlock *big.Int `json:"end_block"` + RootHash common.Hash `json:"root_hash"` + BorChainID string `json:"bor_chain_id"` + Timestamp uint64 `json:"timestamp"` +} + +type CheckpointResponse struct { + Height string `json:"height"` + Result Checkpoint `json:"result"` +} diff --git a/consensus/bor/heimdall/client.go b/consensus/bor/heimdall/client.go index c5e1dfb4cf..2d42cfc31b 100644 --- a/consensus/bor/heimdall/client.go +++ b/consensus/bor/heimdall/client.go @@ -12,6 +12,7 @@ import ( "time" "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/checkpoint" "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" "github.com/ethereum/go-ethereum/log" ) @@ -53,6 +54,7 @@ func NewHeimdallClient(urlString string) *HeimdallClient { const ( fetchStateSyncEventsFormat = "from-id=%d&to-time=%d&limit=%d" fetchStateSyncEventsPath = "clerk/event-record/list" + fetchLatestCheckpoint = "/checkpoints/latest" fetchSpanFormat = "bor/span/%d" ) @@ -108,6 +110,21 @@ func (h *HeimdallClient) Span(spanID uint64) (*span.HeimdallSpan, error) { return &response.Result, nil } +// FetchLatestCheckpoint fetches the latest bor submitted checkpoint from heimdall +func (h *HeimdallClient) FetchLatestCheckpoint() (*checkpoint.Checkpoint, error) { + url, err := latestCheckpointURL(h.urlString) + if err != nil { + return nil, err + } + + response, err := FetchWithRetry[checkpoint.CheckpointResponse](h.client, url, h.closeCh) + if err != nil { + return nil, err + } + + return &response.Result, nil +} + // FetchWithRetry returns data from heimdall with retry func FetchWithRetry[T any](client http.Client, url *url.URL, closeCh chan struct{}) (*T, error) { // attempt counter @@ -171,6 +188,10 @@ func stateSyncURL(urlString string, fromID uint64, to int64) (*url.URL, error) { return makeURL(urlString, fetchStateSyncEventsPath, queryParams) } +func latestCheckpointURL(urlString string) (*url.URL, error) { + return makeURL(urlString, fetchLatestCheckpoint, "") +} + func makeURL(urlString, rawPath, rawQuery string) (*url.URL, error) { u, err := url.Parse(urlString) if err != nil { diff --git a/eth/api_backend.go b/eth/api_backend.go index 6577ac1e1a..c33f3cf6f2 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -359,3 +359,11 @@ func (b *EthAPIBackend) StateAtBlock(ctx context.Context, block *types.Block, re func (b *EthAPIBackend) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (core.Message, vm.BlockContext, *state.StateDB, error) { return b.eth.stateAtTransaction(block, txIndex, reexec) } + +func (b *EthAPIBackend) GetCheckpointWhitelist() map[uint64]common.Hash { + return b.eth.Downloader().ChainValidator.GetCheckpointWhitelist() +} + +func (b *EthAPIBackend) PurgeCheckpointWhitelist() { + b.eth.Downloader().ChainValidator.PurgeCheckpointWhitelist() +} diff --git a/eth/backend.go b/eth/backend.go index 03419cde45..0b8a956cfa 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -101,6 +101,8 @@ type Ethereum struct { lock sync.RWMutex // Protects the variadic fields (e.g. gas price and etherbase) + closeCh chan struct{} // Channel to signal the background processes to exit + shutdownTracker *shutdowncheck.ShutdownTracker // Tracks if and when the node has shutdown ungracefully } @@ -163,6 +165,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { bloomRequests: make(chan chan *bloombits.Retrieval), bloomIndexer: core.NewBloomIndexer(chainDb, params.BloomBitsBlocks, params.BloomConfirms), p2pServer: stack.Server(), + closeCh: make(chan struct{}), shutdownTracker: shutdowncheck.NewShutdownTracker(chainDb), } @@ -254,6 +257,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { BloomCache: uint64(cacheLimit), EventMux: eth.eventMux, Checkpoint: checkpoint, + EthAPI: ethAPI, PeerRequiredBlocks: config.PeerRequiredBlocks, }); err != nil { return nil, err @@ -608,9 +612,77 @@ func (s *Ethereum) Start() error { } maxPeers -= s.config.LightPeers } + // Start the networking layer and the light server if requested s.handler.Start(maxPeers) + go s.startCheckpointWhitelistService() + + return nil +} + +// StartCheckpointWhitelistService starts the goroutine to fetch checkpoints and update the +// checkpoint whitelist map. +func (s *Ethereum) startCheckpointWhitelistService() { + // a shortcut helps with tests and early exit + select { + case <-s.closeCh: + return + default: + } + + // first run the checkpoint whitelist + err := s.handleWhitelistCheckpoint() + if err != nil { + if errors.Is(err, ErrBorConsensusWithoutHeimdall) || errors.Is(err, ErrNotBorConsensus) { + return + } + + log.Warn("unable to whitelist checkpoint - first run", "err", err) + } + + ticker := time.NewTicker(100 * time.Second) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + err := s.handleWhitelistCheckpoint() + if err != nil { + log.Warn("unable to whitelist checkpoint", "err", err) + } + case <-s.closeCh: + return + } + } +} + +var ( + ErrNotBorConsensus = errors.New("not bor consensus was given") + ErrBorConsensusWithoutHeimdall = errors.New("bor consensus without heimdall") +) + +// handleWhitelistCheckpoint handles the checkpoint whitelist mechanism. +func (s *Ethereum) handleWhitelistCheckpoint() error { + ethHandler := (*ethHandler)(s.handler) + + bor, ok := ethHandler.chain.Engine().(*bor.Bor) + if !ok { + return ErrNotBorConsensus + } + + if bor.HeimdallClient == nil { + return ErrBorConsensusWithoutHeimdall + } + + endBlockNum, endBlockHash, err := ethHandler.fetchWhitelistCheckpoint(bor) + if err != nil { + return err + } + + // Update the checkpoint whitelist map. + ethHandler.downloader.ProcessCheckpoint(endBlockNum, endBlockHash) + return nil } @@ -626,6 +698,9 @@ func (s *Ethereum) Stop() error { s.bloomIndexer.Close() close(s.closeBloomHandler) + // Close all bg processes + close(s.closeCh) + // closing consensus engine first, as miner has deps on it s.engine.Close() s.txPool.Stop() diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 1e68746f97..1a9d815ccd 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state/snapshot" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader/whitelist" "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -143,6 +144,8 @@ type Downloader struct { quitCh chan struct{} // Quit channel to signal termination quitLock sync.Mutex // Lock to prevent double closes + ChainValidator + // Testing hooks syncInitHook func(uint64, uint64) // Method to call upon initiating a new sync run bodyFetchHook func([]*types.Header) // Method to call upon starting a block body fetch @@ -150,6 +153,14 @@ type Downloader struct { chainInsertHook func([]*fetchResult) // Method to call upon inserting a chain of blocks (possibly in multiple invocations) } +// interface for whitelist service +type ChainValidator interface { + IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) + ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) + GetCheckpointWhitelist() map[uint64]common.Hash + PurgeCheckpointWhitelist() +} + // LightChain encapsulates functions required to synchronise a light chain. type LightChain interface { // HasHeader verifies a header's presence in the local chain. @@ -204,7 +215,8 @@ type BlockChain interface { } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn, success func()) *Downloader { +//nolint: staticcheck +func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn, success func(), whitelistService ChainValidator) *Downloader { if lightchain == nil { lightchain = chain } @@ -221,6 +233,7 @@ func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain Bl quitCh: make(chan struct{}), SnapSyncer: snap.NewSyncer(stateDb), stateSyncStart: make(chan *stateSync), + ChainValidator: whitelistService, } dl.skeleton = newSkeleton(stateDb, dl.peers, dropPeer, newBeaconBackfiller(dl, success)) @@ -332,9 +345,11 @@ func (d *Downloader) LegacySync(id string, head common.Hash, td, ttd *big.Int, m case nil, errBusy, errCanceled: return err } + if errors.Is(err, errInvalidChain) || errors.Is(err, errBadPeer) || errors.Is(err, errTimeout) || errors.Is(err, errStallingPeer) || errors.Is(err, errUnsyncedPeer) || errors.Is(err, errEmptyHeaderSet) || - errors.Is(err, errPeersUnavailable) || errors.Is(err, errTooOld) || errors.Is(err, errInvalidAncestor) { + errors.Is(err, errPeersUnavailable) || errors.Is(err, errTooOld) || errors.Is(err, errInvalidAncestor) || + errors.Is(err, whitelist.ErrCheckpointMismatch) { log.Warn("Synchronisation failed, dropping peer", "peer", id, "err", err) if d.dropPeer == nil { // The dropPeer method is nil when `--copydb` is used for a local copy. @@ -345,10 +360,17 @@ func (d *Downloader) LegacySync(id string, head common.Hash, td, ttd *big.Int, m } return err } + if errors.Is(err, ErrMergeTransition) { return err // This is an expected fault, don't keep printing it in a spin-loop } - log.Warn("Synchronisation failed, retrying", "err", err) + + if errors.Is(err, whitelist.ErrNoRemoteCheckoint) { + log.Warn("Doesn't have remote checkpoint yet", "peer", id, "err", err) + } + + log.Warn("Synchronisation failed, retrying", "peer", id, "err", err) + return err } @@ -764,12 +786,24 @@ func calculateRequestSpan(remoteHeight, localHeight uint64) (int64, int, int, ui return int64(from), count, span - 1, uint64(max) } +// curried fetchHeadersByNumber +func (d *Downloader) getFetchHeadersByNumber(p *peerConnection) func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + return func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + return d.fetchHeadersByNumber(p, number, amount, skip, reverse) + } +} + // findAncestor tries to locate the common ancestor link of the local chain and // a remote peers blockchain. In the general case when our node was in sync and // on the correct chain, checking the top N links should already get us a match. // In the rare scenario when we ended up on a long reorganisation (i.e. none of // the head links match), we do a binary search to find the common ancestor. func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) (uint64, error) { + // Check the validity of chain to be downloaded + if _, err := d.IsValidChain(remoteHeader, d.getFetchHeadersByNumber(p)); err != nil { + return 0, err + } + // Figure out the valid ancestor range to prevent rewrite attacks var ( floor = int64(-1) @@ -1346,6 +1380,7 @@ func (d *Downloader) processHeaders(origin uint64, td, ttd *big.Int, beaconMode if chunkHeaders[len(chunkHeaders)-1].Number.Uint64()+uint64(fsHeaderForceVerify) > pivot { frequency = 1 } + // Although the received headers might be all valid, a legacy // PoW/PoA sync must not accept post-merge headers. Make sure // that any transition is rejected at this point. @@ -1353,13 +1388,16 @@ func (d *Downloader) processHeaders(origin uint64, td, ttd *big.Int, beaconMode rejected []*types.Header td *big.Int ) + if !beaconMode && ttd != nil { td = d.blockchain.GetTd(chunkHeaders[0].ParentHash, chunkHeaders[0].Number.Uint64()-1) if td == nil { // This should never really happen, but handle gracefully for now log.Error("Failed to retrieve parent header TD", "number", chunkHeaders[0].Number.Uint64()-1, "hash", chunkHeaders[0].ParentHash) + return fmt.Errorf("%w: parent TD missing", errInvalidChain) } + for i, header := range chunkHeaders { td = new(big.Int).Add(td, header.Difficulty) if td.Cmp(ttd) >= 0 { @@ -1373,10 +1411,12 @@ func (d *Downloader) processHeaders(origin uint64, td, ttd *big.Int, beaconMode } else { chunkHeaders, rejected = chunkHeaders[:i], chunkHeaders[i:] } + break } } } + if len(chunkHeaders) > 0 { if n, err := d.lightchain.InsertHeaderChain(chunkHeaders, frequency); err != nil { rollbackErr = err @@ -1385,12 +1425,15 @@ func (d *Downloader) processHeaders(origin uint64, td, ttd *big.Int, beaconMode if (mode == SnapSync || frequency > 1) && n > 0 && rollback == 0 { rollback = chunkHeaders[0].Number.Uint64() } + log.Warn("Invalid header encountered", "number", chunkHeaders[n].Number, "hash", chunkHashes[n], "parent", chunkHeaders[n].ParentHash, "err", err) + return fmt.Errorf("%w: %v", errInvalidChain, err) } // All verifications passed, track all headers within the allowed limits if mode == SnapSync { head := chunkHeaders[len(chunkHeaders)-1].Number.Uint64() + if head-rollback > uint64(fsHeaderSafetyNet) { rollback = head - uint64(fsHeaderSafetyNet) } else { @@ -1398,14 +1441,26 @@ func (d *Downloader) processHeaders(origin uint64, td, ttd *big.Int, beaconMode } } } + + if len(rejected) != 0 { + // Merge threshold reached, stop importing, but don't roll back + rollback = 0 + + log.Info("Legacy sync reached merge threshold", "number", rejected[0].Number, "hash", rejected[0].Hash(), "td", td, "ttd", ttd) + + return ErrMergeTransition + } + if len(rejected) != 0 { // Merge threshold reached, stop importing, but don't roll back rollback = 0 log.Info("Legacy sync reached merge threshold", "number", rejected[0].Number, "hash", rejected[0].Hash(), "td", td, "ttd", ttd) + return ErrMergeTransition } } + // Unless we're doing light chains, schedule the headers for associated content retrieval if mode == FullSync || mode == SnapSync { // If we've reached the allowed number of pending headers, stall a bit diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 6989252c11..37b07424dd 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -35,6 +35,7 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/downloader/whitelist" "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/event" @@ -42,6 +43,8 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/trie" + + "github.com/stretchr/testify/assert" ) // downloadTester is a test simulator for mocking out local block chain. @@ -60,25 +63,35 @@ func newTester() *downloadTester { if err != nil { panic(err) } + db, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), freezer, "", false) if err != nil { panic(err) } + core.GenesisBlockForTesting(db, testAddress, big.NewInt(1000000000000000)) chain, err := core.NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil) if err != nil { panic(err) } + tester := &downloadTester{ freezer: freezer, chain: chain, peers: make(map[string]*downloadTesterPeer), } - tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer, nil) + + //nolint: staticcheck + tester.downloader = New(0, db, new(event.TypeMux), tester.chain, nil, tester.dropPeer, nil, whitelist.NewService(10)) + return tester } +func (dl *downloadTester) setWhitelist(w ChainValidator) { + dl.downloader.ChainValidator = w +} + // terminate aborts any operations on the embedded downloader and releases all // held resources. func (dl *downloadTester) terminate() { @@ -155,7 +168,7 @@ func (dlp *downloadTesterPeer) Head() (common.Hash, *big.Int) { } func unmarshalRlpHeaders(rlpdata []rlp.RawValue) []*types.Header { - var headers = make([]*types.Header, len(rlpdata)) + headers := make([]*types.Header, len(rlpdata)) for i, data := range rlpdata { var h types.Header if err := rlp.DecodeBytes(data, &h); err != nil { @@ -620,6 +633,7 @@ func TestBoundedHeavyForkedSync66Full(t *testing.T) { func TestBoundedHeavyForkedSync66Snap(t *testing.T) { testBoundedHeavyForkedSync(t, eth.ETH66, SnapSync) } + func TestBoundedHeavyForkedSync66Light(t *testing.T) { testBoundedHeavyForkedSync(t, eth.ETH66, LightSync) } @@ -711,7 +725,7 @@ func testMultiProtoSync(t *testing.T, protocol uint, mode SyncMode) { // Create peers of every type tester.newPeer("peer 66", eth.ETH66, chain.blocks[1:]) - //tester.newPeer("peer 65", eth.ETH67, chain.blocks[1:) + // tester.newPeer("peer 65", eth.ETH67, chain.blocks[1:) // Synchronise with the requested peer and make sure all blocks were retrieved if err := tester.sync(fmt.Sprintf("peer %d", protocol), nil, mode); err != nil { @@ -916,6 +930,7 @@ func TestHighTDStarvationAttack66Full(t *testing.T) { func TestHighTDStarvationAttack66Snap(t *testing.T) { testHighTDStarvationAttack(t, eth.ETH66, SnapSync) } + func TestHighTDStarvationAttack66Light(t *testing.T) { testHighTDStarvationAttack(t, eth.ETH66, LightSync) } @@ -1268,36 +1283,45 @@ func TestRemoteHeaderRequestSpan(t *testing.T) { expected []int }{ // Remote is way higher. We should ask for the remote head and go backwards - {1500, 1000, + { + 1500, 1000, []int{1323, 1339, 1355, 1371, 1387, 1403, 1419, 1435, 1451, 1467, 1483, 1499}, }, - {15000, 13006, + { + 15000, 13006, []int{14823, 14839, 14855, 14871, 14887, 14903, 14919, 14935, 14951, 14967, 14983, 14999}, }, // Remote is pretty close to us. We don't have to fetch as many - {1200, 1150, + { + 1200, 1150, []int{1149, 1154, 1159, 1164, 1169, 1174, 1179, 1184, 1189, 1194, 1199}, }, // Remote is equal to us (so on a fork with higher td) // We should get the closest couple of ancestors - {1500, 1500, + { + 1500, 1500, []int{1497, 1499}, }, // We're higher than the remote! Odd - {1000, 1500, + { + 1000, 1500, []int{997, 999}, }, // Check some weird edgecases that it behaves somewhat rationally - {0, 1500, + { + 0, 1500, []int{0, 2}, }, - {6000000, 0, + { + 6000000, 0, []int{5999823, 5999839, 5999855, 5999871, 5999887, 5999903, 5999919, 5999935, 5999951, 5999967, 5999983, 5999999}, }, - {0, 0, + { + 0, 0, []int{0, 2}, }, } + reqs := func(from, count, span int) []int { var r []int num := from @@ -1307,32 +1331,39 @@ func TestRemoteHeaderRequestSpan(t *testing.T) { } return r } + for i, tt := range testCases { - from, count, span, max := calculateRequestSpan(tt.remoteHeight, tt.localHeight) - data := reqs(int(from), count, span) + i := i + tt := tt - if max != uint64(data[len(data)-1]) { - t.Errorf("test %d: wrong last value %d != %d", i, data[len(data)-1], max) - } - failed := false - if len(data) != len(tt.expected) { - failed = true - t.Errorf("test %d: length wrong, expected %d got %d", i, len(tt.expected), len(data)) - } else { - for j, n := range data { - if n != tt.expected[j] { - failed = true - break + t.Run("", func(t *testing.T) { + from, count, span, max := calculateRequestSpan(tt.remoteHeight, tt.localHeight) + data := reqs(int(from), count, span) + + if max != uint64(data[len(data)-1]) { + t.Errorf("test %d: wrong last value %d != %d", i, data[len(data)-1], max) + } + failed := false + if len(data) != len(tt.expected) { + failed = true + t.Errorf("test %d: length wrong, expected %d got %d", i, len(tt.expected), len(data)) + } else { + for j, n := range data { + if n != tt.expected[j] { + failed = true + break + } } } - } - if failed { - res := strings.Replace(fmt.Sprint(data), " ", ",", -1) - exp := strings.Replace(fmt.Sprint(tt.expected), " ", ",", -1) - t.Logf("got: %v\n", res) - t.Logf("exp: %v\n", exp) - t.Errorf("test %d: wrong values", i) - } + + if failed { + res := strings.Replace(fmt.Sprint(data), " ", ",", -1) + exp := strings.Replace(fmt.Sprint(tt.expected), " ", ",", -1) + t.Logf("got: %v\n", res) + t.Logf("exp: %v\n", exp) + t.Errorf("test %d: wrong values", i) + } + }) } } @@ -1359,12 +1390,134 @@ func testCheckpointEnforcement(t *testing.T, protocol uint, mode SyncMode) { if mode == SnapSync || mode == LightSync { expect = errUnsyncedPeer } + if err := tester.sync("peer", nil, mode); !errors.Is(err, expect) { t.Fatalf("block sync error mismatch: have %v, want %v", err, expect) } + if mode == SnapSync || mode == LightSync { assertOwnChain(t, tester, 1) } else { assertOwnChain(t, tester, len(chain.blocks)) } } + +// whitelistFake is a mock for the chain validator service +type whitelistFake struct { + // count denotes the number of times the validate function was called + count int + + // validate is the dynamic function to be called while syncing + validate func(count int) (bool, error) +} + +// newWhitelistFake returns a new mock whitelist +func newWhitelistFake(validate func(count int) (bool, error)) *whitelistFake { + return &whitelistFake{0, validate} +} + +// IsValidChain is the mock function which the downloader will use to validate the chain +// to be received from a peer. +func (w *whitelistFake) IsValidChain(_ *types.Header, _ func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) { + defer func() { + w.count++ + }() + + return w.validate(w.count) +} + +func (w *whitelistFake) ProcessCheckpoint(_ uint64, _ common.Hash) {} + +func (w *whitelistFake) GetCheckpointWhitelist() map[uint64]common.Hash { + return nil +} + +func (w *whitelistFake) PurgeCheckpointWhitelist() {} + +// TestFakedSyncProgress66WhitelistMismatch tests if in case of whitelisted +// checkpoint mismatch with opposite peer, the sync should fail. +func TestFakedSyncProgress66WhitelistMismatch(t *testing.T) { + t.Parallel() + + protocol := uint(eth.ETH66) + mode := FullSync + + tester := newTester() + validate := func(count int) (bool, error) { + return false, whitelist.ErrCheckpointMismatch + } + tester.downloader.ChainValidator = newWhitelistFake(validate) + + defer tester.terminate() + + chainA := testChainForkLightA.blocks + tester.newPeer("light", protocol, chainA[1:]) + + // Synchronise with the peer and make sure all blocks were retrieved + if err := tester.sync("light", nil, mode); err == nil { + t.Fatal("succeeded attacker synchronisation") + } +} + +// TestFakedSyncProgress66WhitelistMatch tests if in case of whitelisted +// checkpoint match with opposite peer, the sync should succeed. +func TestFakedSyncProgress66WhitelistMatch(t *testing.T) { + t.Parallel() + + protocol := uint(eth.ETH66) + mode := FullSync + + tester := newTester() + validate := func(count int) (bool, error) { + return true, nil + } + tester.downloader.ChainValidator = newWhitelistFake(validate) + + defer tester.terminate() + + chainA := testChainForkLightA.blocks + tester.newPeer("light", protocol, chainA[1:]) + + // Synchronise with the peer and make sure all blocks were retrieved + if err := tester.sync("light", nil, mode); err != nil { + t.Fatal("succeeded attacker synchronisation") + } +} + +// TestFakedSyncProgress66NoRemoteCheckpoint tests if in case of missing/invalid +// checkpointed blocks with opposite peer, the sync should fail initially but +// with the retry mechanism, it should succeed eventually. +func TestFakedSyncProgress66NoRemoteCheckpoint(t *testing.T) { + t.Parallel() + + protocol := uint(eth.ETH66) + mode := FullSync + + tester := newTester() + validate := func(count int) (bool, error) { + // only return the `ErrNoRemoteCheckoint` error for the first call + if count == 0 { + return false, whitelist.ErrNoRemoteCheckoint + } + + return true, nil + } + + tester.downloader.ChainValidator = newWhitelistFake(validate) + + defer tester.terminate() + + chainA := testChainForkLightA.blocks + tester.newPeer("light", protocol, chainA[1:]) + + // Synchronise with the peer and make sure all blocks were retrieved + // Should fail in first attempt + if err := tester.sync("light", nil, mode); err != nil { + assert.Equal(t, whitelist.ErrNoRemoteCheckoint, err, "failed synchronisation") + } + + // Try syncing again, should succeed + if err := tester.sync("light", nil, mode); err != nil { + t.Fatal("succeeded attacker synchronisation") + } +} diff --git a/eth/downloader/queue_test.go b/eth/downloader/queue_test.go index f729def671..872bfcd1a9 100644 --- a/eth/downloader/queue_test.go +++ b/eth/downloader/queue_test.go @@ -64,8 +64,11 @@ type chainData struct { offset int } -var chain *chainData -var emptyChain *chainData +var ( + chain *chainData + chainLongerFork *chainData + emptyChain *chainData +) func init() { // Create a chain of blocks to import @@ -75,6 +78,9 @@ func init() { blocks, _ = makeChain(targetBlocks, 0, genesis, true) emptyChain = &chainData{blocks, 0} + + chainLongerForkBlocks, _ := makeChain(1024, 0, blocks[len(blocks)-1], false) + chainLongerFork = &chainData{chainLongerForkBlocks, 0} } func (chain *chainData) headers() []*types.Header { diff --git a/eth/downloader/whitelist/service.go b/eth/downloader/whitelist/service.go new file mode 100644 index 0000000000..7036f24a8f --- /dev/null +++ b/eth/downloader/whitelist/service.go @@ -0,0 +1,126 @@ +package whitelist + +import ( + "errors" + "fmt" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" +) + +// Checkpoint whitelist +type Service struct { + m sync.Mutex + checkpointWhitelist map[uint64]common.Hash // Checkpoint whitelist, populated by reaching out to heimdall + checkpointOrder []uint64 // Checkpoint order, populated by reaching out to heimdall + maxCapacity uint +} + +func NewService(maxCapacity uint) *Service { + return &Service{ + checkpointWhitelist: make(map[uint64]common.Hash), + checkpointOrder: []uint64{}, + maxCapacity: maxCapacity, + } +} + +var ( + ErrCheckpointMismatch = errors.New("checkpoint mismatch") + ErrNoRemoteCheckoint = errors.New("remote peer doesn't have a checkoint") +) + +// IsValidChain checks if the chain we're about to receive from this peer is valid or not +// in terms of reorgs. We won't reorg beyond the last bor checkpoint submitted to mainchain. +func (w *Service) IsValidChain(remoteHeader *types.Header, fetchHeadersByNumber func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error)) (bool, error) { + // We want to validate the chain by comparing the last checkpointed block + // we're storing in `checkpointWhitelist` with the peer's block. + // + // Check for availaibility of the last checkpointed block. + // This can be also be empty if our heimdall is not responding + // or we're running without it. + if len(w.checkpointWhitelist) == 0 { + // worst case, we don't have the checkpoints in memory + return true, nil + } + + // Fetch the last checkpoint entry + lastCheckpointBlockNum := w.checkpointOrder[len(w.checkpointOrder)-1] + lastCheckpointBlockHash := w.checkpointWhitelist[lastCheckpointBlockNum] + + // todo: we can extract this as an interface and mock as well or just test IsValidChain in isolation from downloader passing fake fetchHeadersByNumber functions + headers, hashes, err := fetchHeadersByNumber(lastCheckpointBlockNum, 1, 0, false) + if err != nil { + return false, fmt.Errorf("%w: last checkpoint %d, err %v", ErrNoRemoteCheckoint, lastCheckpointBlockNum, err) + } + + if len(headers) == 0 { + return false, fmt.Errorf("%w: last checkpoint %d", ErrNoRemoteCheckoint, lastCheckpointBlockNum) + } + + reqBlockNum := headers[0].Number.Uint64() + reqBlockHash := hashes[0] + + // Check against the checkpointed blocks + if reqBlockNum == lastCheckpointBlockNum && reqBlockHash == lastCheckpointBlockHash { + return true, nil + } + + return false, ErrCheckpointMismatch +} + +func (w *Service) ProcessCheckpoint(endBlockNum uint64, endBlockHash common.Hash) { + w.m.Lock() + defer w.m.Unlock() + + w.enqueueCheckpointWhitelist(endBlockNum, endBlockHash) + // If size of checkpoint whitelist map is greater than 10, remove the oldest entry. + + if w.length() > int(w.maxCapacity) { + w.dequeueCheckpointWhitelist() + } +} + +// GetCheckpointWhitelist returns the existing whitelisted +// entries of checkpoint of the form block number -> block hash. +func (w *Service) GetCheckpointWhitelist() map[uint64]common.Hash { + w.m.Lock() + defer w.m.Unlock() + + return w.checkpointWhitelist +} + +// PurgeCheckpointWhitelist purges data from checkpoint whitelist map +func (w *Service) PurgeCheckpointWhitelist() { + w.m.Lock() + defer w.m.Unlock() + + w.checkpointWhitelist = make(map[uint64]common.Hash) + w.checkpointOrder = make([]uint64, 0) +} + +// EnqueueWhitelistBlock enqueues blockNumber, blockHash to the checkpoint whitelist map +func (w *Service) enqueueCheckpointWhitelist(key uint64, val common.Hash) { + if _, ok := w.checkpointWhitelist[key]; !ok { + log.Debug("Enqueing new checkpoint whitelist", "block number", key, "block hash", val) + + w.checkpointWhitelist[key] = val + w.checkpointOrder = append(w.checkpointOrder, key) + } +} + +// DequeueWhitelistBlock dequeues block, blockhash from the checkpoint whitelist map +func (w *Service) dequeueCheckpointWhitelist() { + if len(w.checkpointOrder) > 0 { + log.Debug("Dequeing checkpoint whitelist", "block number", w.checkpointOrder[0], "block hash", w.checkpointWhitelist[w.checkpointOrder[0]]) + + delete(w.checkpointWhitelist, w.checkpointOrder[0]) + w.checkpointOrder = w.checkpointOrder[1:] + } +} + +// length returns the len of the whitelist. +func (w *Service) length() int { + return len(w.checkpointWhitelist) +} diff --git a/eth/downloader/whitelist/service_test.go b/eth/downloader/whitelist/service_test.go new file mode 100644 index 0000000000..ca202cc3ad --- /dev/null +++ b/eth/downloader/whitelist/service_test.go @@ -0,0 +1,107 @@ +package whitelist + +import ( + "errors" + "math/big" + "testing" + + "gotest.tools/assert" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// NewMockService creates a new mock whitelist service +func NewMockService(maxCapacity uint) *Service { + return &Service{ + checkpointWhitelist: make(map[uint64]common.Hash), + checkpointOrder: []uint64{}, + maxCapacity: maxCapacity, + } +} + +// TestWhitelistCheckpoint checks the checkpoint whitelist map queue mechanism +func TestWhitelistCheckpoint(t *testing.T) { + t.Parallel() + + s := NewMockService(10) + for i := 0; i < 10; i++ { + s.enqueueCheckpointWhitelist(uint64(i), common.Hash{}) + } + assert.Equal(t, s.length(), 10, "expected 10 items in whitelist") + + s.enqueueCheckpointWhitelist(11, common.Hash{}) + s.dequeueCheckpointWhitelist() + assert.Equal(t, s.length(), 10, "expected 10 items in whitelist") +} + +// TestIsValidChain checks che IsValidChain function in isolation +// for different cases by providing a mock fetchHeadersByNumber function +func TestIsValidChain(t *testing.T) { + t.Parallel() + + s := NewMockService(10) + + // case1: no checkpoint whitelist, should consider the chain as valid + res, err := s.IsValidChain(nil, nil) + assert.NilError(t, err, "expected no error") + assert.Equal(t, res, true, "expected chain to be valid") + + // add checkpoint entries and mock fetchHeadersByNumber function + s.ProcessCheckpoint(uint64(0), common.Hash{}) + s.ProcessCheckpoint(uint64(1), common.Hash{}) + + assert.Equal(t, s.length(), 2, "expected 2 items in whitelist") + + // create a false function, returning absolutely nothing + falseFetchHeadersByNumber := func(number uint64, amount int, skip int, reverse bool) ([]*types.Header, []common.Hash, error) { + return nil, nil, nil + } + + // case2: false fetchHeadersByNumber function provided, should consider the chain as invalid + // and throw `ErrNoRemoteCheckoint` error + res, err = s.IsValidChain(nil, falseFetchHeadersByNumber) + if err == nil { + t.Fatal("expected error, got nil") + } + + if !errors.Is(err, ErrNoRemoteCheckoint) { + t.Fatalf("expected error ErrNoRemoteCheckoint, got %v", err) + } + + assert.Equal(t, res, false, "expected chain to be invalid") + + // case3: correct fetchHeadersByNumber function provided, should consider the chain as valid + // create a mock function, returning a the required header + fetchHeadersByNumber := func(number uint64, _ int, _ int, _ bool) ([]*types.Header, []common.Hash, error) { + hash := common.Hash{} + header := types.Header{Number: big.NewInt(0)} + + switch number { + case 0: + return []*types.Header{&header}, []common.Hash{hash}, nil + case 1: + header.Number = big.NewInt(1) + return []*types.Header{&header}, []common.Hash{hash}, nil + case 2: + header.Number = big.NewInt(1) // sending wrong header for misamatch + return []*types.Header{&header}, []common.Hash{hash}, nil + default: + return nil, nil, errors.New("invalid number") + } + } + + res, err = s.IsValidChain(nil, fetchHeadersByNumber) + assert.NilError(t, err, "expected no error") + assert.Equal(t, res, true, "expected chain to be valid") + + // add one more checkpoint whitelist entry + s.ProcessCheckpoint(uint64(2), common.Hash{}) + assert.Equal(t, s.length(), 3, "expected 3 items in whitelist") + + // case4: correct fetchHeadersByNumber function provided with wrong header + // for block number 2. Should consider the chain as invalid and throw an error + res, err = s.IsValidChain(nil, fetchHeadersByNumber) + assert.Equal(t, err, ErrCheckpointMismatch, "expected checkpoint mismatch error") + assert.Equal(t, res, false, "expected chain to be invalid") +} diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 904fb2cbc2..a3c7f49e39 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -91,13 +91,13 @@ var Defaults = Config{ Miner: miner.Config{ GasCeil: 8000000, GasPrice: big.NewInt(params.GWei), - Recommit: 3 * time.Second, + Recommit: 125 * time.Second, }, TxPool: core.DefaultTxPoolConfig, RPCGasCap: 50000000, RPCEVMTimeout: 5 * time.Second, GPO: FullNodeGPO, - RPCTxFeeCap: 1, // 1 ether + RPCTxFeeCap: 5, // 5 matic } func init() { diff --git a/eth/handler.go b/eth/handler.go index 40edfa2d17..ab95f5f769 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -31,11 +31,13 @@ import ( "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/downloader/whitelist" "github.com/ethereum/go-ethereum/eth/fetcher" "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/eth/protocols/snap" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" @@ -77,15 +79,16 @@ type txPool interface { // handlerConfig is the collection of initialization parameters to create a full // node network handler. type handlerConfig struct { - Database ethdb.Database // Database for direct sync insertions - Chain *core.BlockChain // Blockchain to serve data from - TxPool txPool // Transaction pool to propagate from - Merger *consensus.Merger // The manager for eth1/2 transition - Network uint64 // Network identifier to adfvertise - Sync downloader.SyncMode // Whether to snap or full sync - BloomCache uint64 // Megabytes to alloc for snap sync bloom - EventMux *event.TypeMux // Legacy event mux, deprecate for `feed` - Checkpoint *params.TrustedCheckpoint // Hard coded checkpoint for sync challenges + Database ethdb.Database // Database for direct sync insertions + Chain *core.BlockChain // Blockchain to serve data from + TxPool txPool // Transaction pool to propagate from + Merger *consensus.Merger // The manager for eth1/2 transition + Network uint64 // Network identifier to adfvertise + Sync downloader.SyncMode // Whether to snap or full sync + BloomCache uint64 // Megabytes to alloc for snap sync bloom + EventMux *event.TypeMux //nolint:staticcheck // Legacy event mux, deprecate for `feed` + Checkpoint *params.TrustedCheckpoint // Hard coded checkpoint for sync challenges + EthAPI *ethapi.PublicBlockChainAPI // EthAPI to interact PeerRequiredBlocks map[uint64]common.Hash // Hard coded map of required block hashes for sync challenges } @@ -111,6 +114,8 @@ type handler struct { peers *peerSet merger *consensus.Merger + ethAPI *ethapi.PublicBlockChainAPI // EthAPI to interact + eventMux *event.TypeMux txsCh chan core.NewTxsEvent txsSub event.Subscription @@ -141,6 +146,7 @@ func newHandler(config *handlerConfig) (*handler, error) { chain: config.Chain, peers: newPeerSet(), merger: config.Merger, + ethAPI: config.EthAPI, peerRequiredBlocks: config.PeerRequiredBlocks, quitSync: make(chan struct{}), } @@ -195,7 +201,8 @@ func newHandler(config *handlerConfig) (*handler, error) { // Construct the downloader (long sync) and its backing state bloom if snap // sync is requested. The downloader is responsible for deallocating the state // bloom when it's done. - h.downloader = downloader.New(h.checkpointNumber, config.Database, h.eventMux, h.chain, nil, h.removePeer, success) + // todo: it'd better to extract maxCapacity into config + h.downloader = downloader.New(h.checkpointNumber, config.Database, h.eventMux, h.chain, nil, h.removePeer, success, whitelist.NewService(10)) // Construct the fetcher (short sync) validator := func(header *types.Header) error { diff --git a/eth/handler_bor.go b/eth/handler_bor.go new file mode 100644 index 0000000000..11896f3c47 --- /dev/null +++ b/eth/handler_bor.go @@ -0,0 +1,75 @@ +package eth + +import ( + "context" + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/bor" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" +) + +var ( + // errCheckpoint is returned when we are unable to fetch the + // latest checkpoint from the local heimdall. + errCheckpoint = errors.New("failed to fetch latest checkpoint") + + // errMissingCheckpoint is returned when we don't have the + // checkpoint blocks locally, yet. + errMissingCheckpoint = errors.New("missing checkpoint blocks") + + // errRootHash is returned when we aren't able to calculate the root hash + // locally for a range of blocks. + errRootHash = errors.New("failed to get local root hash") + + // errCheckpointRootHashMismatch is returned when the local root hash + // doesn't match with the root hash in checkpoint. + errCheckpointRootHashMismatch = errors.New("checkpoint roothash mismatch") + + // errEndBlock is returned when we're unable to fetch a block locally. + errEndBlock = errors.New("failed to get end block") +) + +// fetchWhitelistCheckpoint fetched the latest checkpoint from it's local heimdall +// and verifies the data against bor data. +func (h *ethHandler) fetchWhitelistCheckpoint(bor *bor.Bor) (uint64, common.Hash, error) { + // check for checkpoint whitelisting: bor + checkpoint, err := bor.HeimdallClient.FetchLatestCheckpoint() + if err != nil { + log.Debug("Failed to fetch latest checkpoint for whitelisting") + return 0, common.Hash{}, errCheckpoint + } + + // check if we have the checkpoint blocks + head := h.ethAPI.BlockNumber() + if head < hexutil.Uint64(checkpoint.EndBlock.Uint64()) { + log.Debug("Head block behind checkpoint block", "head", head, "checkpoint end block", checkpoint.EndBlock) + return 0, common.Hash{}, errMissingCheckpoint + } + + // verify the root hash of checkpoint + roothash, err := h.ethAPI.GetRootHash(context.Background(), checkpoint.StartBlock.Uint64(), checkpoint.EndBlock.Uint64()) + if err != nil { + log.Debug("Failed to get root hash of checkpoint while whitelisting") + return 0, common.Hash{}, errRootHash + } + + if roothash != checkpoint.RootHash.String()[2:] { + log.Warn("Checkpoint root hash mismatch while whitelisting", "expected", checkpoint.RootHash.String()[2:], "got", roothash) + return 0, common.Hash{}, errCheckpointRootHashMismatch + } + + // fetch the end checkpoint block hash + block, err := h.ethAPI.GetBlockByNumber(context.Background(), rpc.BlockNumber(checkpoint.EndBlock.Uint64()), false) + if err != nil { + log.Debug("Failed to get end block hash of checkpoint while whitelisting") + return 0, common.Hash{}, errEndBlock + } + + hash := fmt.Sprintf("%v", block["hash"]) + + return checkpoint.EndBlock.Uint64(), common.HexToHash(hash), nil +} diff --git a/go.mod b/go.mod index 852c895e3b..1b452a67a1 100644 --- a/go.mod +++ b/go.mod @@ -76,6 +76,7 @@ require ( gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 gopkg.in/urfave/cli.v1 v1.20.0 + gotest.tools v2.2.0+incompatible pgregory.net/rapid v0.4.7 ) @@ -135,5 +136,4 @@ require ( google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - gotest.tools v2.2.0+incompatible // indirect ) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 15536d5d72..59b6feba52 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -2156,6 +2156,17 @@ func (api *PrivateDebugAPI) SetHead(number hexutil.Uint64) { api.b.SetHead(uint64(number)) } +// GetCheckpointWhitelist retrieves the current checkpoint whitelist +// entries (of the form block number -> block hash) +func (api *PrivateDebugAPI) GetCheckpointWhitelist() map[uint64]common.Hash { + return api.b.GetCheckpointWhitelist() +} + +// PurgeCheckpointWhitelist purges the current checkpoint whitelist entries +func (api *PrivateDebugAPI) PurgeCheckpointWhitelist() { + api.b.PurgeCheckpointWhitelist() +} + // PublicNetAPI offers network related RPC methods type PublicNetAPI struct { net *p2p.Server diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 97ce7c24cf..1287640b83 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -99,6 +99,8 @@ type Backend interface { GetBorBlockTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) GetBorBlockTransactionWithBlockHash(ctx context.Context, txHash common.Hash, blockHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) SubscribeChain2HeadEvent(ch chan<- core.Chain2HeadEvent) event.Subscription + GetCheckpointWhitelist() map[uint64]common.Hash + PurgeCheckpointWhitelist() ChainConfig() *params.ChainConfig Engine() consensus.Engine diff --git a/internal/ethapi/transaction_args.go b/internal/ethapi/transaction_args.go index 9c5950af58..aa2596fe81 100644 --- a/internal/ethapi/transaction_args.go +++ b/internal/ethapi/transaction_args.go @@ -59,6 +59,7 @@ func (args *TransactionArgs) from() common.Address { if args.From == nil { return common.Address{} } + return *args.From } @@ -67,9 +68,11 @@ func (args *TransactionArgs) data() []byte { if args.Input != nil { return *args.Input } + if args.Data != nil { return *args.Data } + return nil } @@ -78,8 +81,10 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error { if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) { return errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified") } + // After london, default to 1559 unless gasPrice is set head := b.CurrentHeader() + // If user specifies both maxPriorityfee and maxFee, then we do not // need to consult the chain for defaults. It's definitely a London tx. if args.MaxPriorityFeePerGas == nil || args.MaxFeePerGas == nil { @@ -90,6 +95,7 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error { if err != nil { return err } + args.MaxPriorityFeePerGas = (*hexutil.Big)(tip) } if args.MaxFeePerGas == nil { @@ -97,8 +103,10 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error { (*big.Int)(args.MaxPriorityFeePerGas), new(big.Int).Mul(head.BaseFee, big.NewInt(2)), ) + args.MaxFeePerGas = (*hexutil.Big)(gasFeeCap) } + if args.MaxFeePerGas.ToInt().Cmp(args.MaxPriorityFeePerGas.ToInt()) < 0 { return fmt.Errorf("maxFeePerGas (%v) < maxPriorityFeePerGas (%v)", args.MaxFeePerGas, args.MaxPriorityFeePerGas) } @@ -106,17 +114,20 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error { if args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil { return errors.New("maxFeePerGas or maxPriorityFeePerGas specified but london is not active yet") } + if args.GasPrice == nil { price, err := b.SuggestGasTipCap(ctx) if err != nil { return err } + if b.ChainConfig().IsLondon(head.Number) { // The legacy tx gas price suggestion should not add 2x base fee // because all fees are consumed, so it would result in a spiral // upwards. price.Add(price, head.BaseFee) } + args.GasPrice = (*hexutil.Big)(price) } } @@ -126,22 +137,28 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error { return fmt.Errorf("maxFeePerGas (%v) < maxPriorityFeePerGas (%v)", args.MaxFeePerGas, args.MaxPriorityFeePerGas) } } + if args.Value == nil { args.Value = new(hexutil.Big) } + if args.Nonce == nil { nonce, err := b.GetPoolNonce(ctx, args.from()) if err != nil { return err } + args.Nonce = (*hexutil.Uint64)(&nonce) } + if args.Data != nil && args.Input != nil && !bytes.Equal(*args.Data, *args.Input) { return errors.New(`both "data" and "input" are set and not equal. Please use "input" to pass transaction call data`) } + if args.To == nil && len(args.data()) == 0 { return errors.New(`contract creation without any data provided`) } + // Estimate the gas usage if necessary. if args.Gas == nil { // These fields are immutable during the estimation, safe to @@ -157,18 +174,23 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error { Data: (*hexutil.Bytes)(&data), AccessList: args.AccessList, } + pendingBlockNr := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) + estimated, err := DoEstimateGas(ctx, b, callArgs, pendingBlockNr, b.RPCGasCap()) if err != nil { return err } + args.Gas = &estimated log.Trace("Estimate gas usage automatically", "gas", args.Gas) } + if args.ChainID == nil { id := (*hexutil.Big)(b.ChainConfig().ChainID) args.ChainID = id } + return nil } @@ -180,32 +202,41 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (t if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) { return types.Message{}, errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified") } + // Set sender address or use zero address if none specified. addr := args.from() + // Gas set for system calls + systemCallGas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2)) + // Set default gas & gas price if none were set gas := globalGasCap if gas == 0 { gas = uint64(math.MaxUint64 / 2) } - if args.Gas != nil { + + if args.Gas != nil && *args.Gas != systemCallGas { gas = uint64(*args.Gas) } + if globalGasCap != 0 && globalGasCap < gas { log.Warn("Caller gas above allowance, capping", "requested", gas, "cap", globalGasCap) gas = globalGasCap } + var ( gasPrice *big.Int gasFeeCap *big.Int gasTipCap *big.Int ) + if baseFee == nil { // If there's no basefee, then it must be a non-1559 execution gasPrice = new(big.Int) if args.GasPrice != nil { gasPrice = args.GasPrice.ToInt() } + gasFeeCap, gasTipCap = gasPrice, gasPrice } else { // A basefee is provided, necessitating 1559-type execution @@ -216,30 +247,40 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (t } else { // User specified 1559 gas feilds (or none), use those gasFeeCap = new(big.Int) + if args.MaxFeePerGas != nil { gasFeeCap = args.MaxFeePerGas.ToInt() } + gasTipCap = new(big.Int) + if args.MaxPriorityFeePerGas != nil { gasTipCap = args.MaxPriorityFeePerGas.ToInt() } + // Backfill the legacy gasPrice for EVM execution, unless we're all zeroes gasPrice = new(big.Int) + if gasFeeCap.BitLen() > 0 || gasTipCap.BitLen() > 0 { gasPrice = math.BigMin(new(big.Int).Add(gasTipCap, baseFee), gasFeeCap) } } } + value := new(big.Int) if args.Value != nil { value = args.Value.ToInt() } + data := args.data() + var accessList types.AccessList if args.AccessList != nil { accessList = *args.AccessList } + msg := types.NewMessage(addr, args.To, 0, value, gas, gasPrice, gasFeeCap, gasTipCap, data, accessList, true) + return msg, nil } @@ -247,6 +288,7 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (t // This assumes that setDefaults has been called. func (args *TransactionArgs) toTransaction() *types.Transaction { var data types.TxData + switch { case args.MaxFeePerGas != nil: al := types.AccessList{} @@ -285,6 +327,7 @@ func (args *TransactionArgs) toTransaction() *types.Transaction { Data: args.data(), } } + return types.NewTx(data) } diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index dd8b34e025..dcdd5baf23 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -474,6 +474,16 @@ web3._extend({ params: 2, inputFormatter:[web3._extend.formatters.inputBlockNumberFormatter, web3._extend.formatters.inputBlockNumberFormatter], }), + new web3._extend.Method({ + name: 'getCheckpointWhitelist', + call: 'debug_getCheckpointWhitelist', + params: 0, + }), + new web3._extend.Method({ + name: 'purgeCheckpointWhitelist', + call: 'debug_purgeCheckpointWhitelist', + params: 0, + }), ], properties: [] }); diff --git a/les/api_backend.go b/les/api_backend.go index e9e51c4ecc..c716a3967f 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -337,17 +337,24 @@ func (b *LesApiBackend) StateAtTransaction(ctx context.Context, block *types.Blo // func (b *LesApiBackend) GetBorBlockReceipt(ctx context.Context, hash common.Hash) (*types.Receipt, error) { - return nil, errors.New("Not implemented") + return nil, errors.New("not implemented") } func (b *LesApiBackend) GetBorBlockLogs(ctx context.Context, hash common.Hash) ([]*types.Log, error) { - return nil, errors.New("Not implemented") + return nil, errors.New("not implemented") } func (b *LesApiBackend) GetBorBlockTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { - return nil, common.Hash{}, 0, 0, errors.New("Not implemented") + return nil, common.Hash{}, 0, 0, errors.New("not implemented") } func (b *LesApiBackend) GetBorBlockTransactionWithBlockHash(ctx context.Context, txHash common.Hash, blockHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { - return nil, common.Hash{}, 0, 0, errors.New("Not implemented") + return nil, common.Hash{}, 0, 0, errors.New("not implemented") +} + +func (b *LesApiBackend) GetCheckpointWhitelist() map[uint64]common.Hash { + return nil +} + +func (b *LesApiBackend) PurgeCheckpointWhitelist() { } diff --git a/miner/worker.go b/miner/worker.go index 14c5ccd1a3..9fcb2140ca 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -390,27 +390,31 @@ func (w *worker) close() { // recalcRecommit recalculates the resubmitting interval upon feedback. func recalcRecommit(minRecommit, prev time.Duration, target float64, inc bool) time.Duration { - var ( - prevF = float64(prev.Nanoseconds()) - next float64 - ) - - if inc { - next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target+intervalAdjustBias) - - max := float64(maxRecommitInterval.Nanoseconds()) - if next > max { - next = max - } - } else { - next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target-intervalAdjustBias) - min := float64(minRecommit.Nanoseconds()) - if next < min { - next = min - } - } - - return time.Duration(int64(next)) + // var ( + // prevF = float64(prev.Nanoseconds()) + // next float64 + // ) + // + // if inc { + // next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target+intervalAdjustBias) + // max := float64(maxRecommitInterval.Nanoseconds()) + // + // if next > max { + // next = max + // } + // } else { + // next = prevF*(1-intervalAdjustRatio) + intervalAdjustRatio*(target-intervalAdjustBias) + // min := float64(minRecommit.Nanoseconds()) + // + // if next < min { + // next = min + // } + // } + // + // log.Info("Recalc Commit", "Prev", prev, "Next", next) + + //returning the Same prev value to keep the recommit interval constant + return prev } // newWorkLoop is a standalone goroutine to submit new sealing work upon received events. diff --git a/miner/worker_test.go b/miner/worker_test.go index 00739844f2..6dae391c88 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -489,10 +489,15 @@ func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, en } func TestAdjustIntervalEthash(t *testing.T) { + // Skipping this test as recommit interval would remain constant + t.Skip() testAdjustInterval(t, ethashChainConfig, ethash.NewFaker()) } func TestAdjustIntervalClique(t *testing.T) { + + // Skipping this test as recommit interval would remain constant + t.Skip() testAdjustInterval(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index 434ad805e1..36d515c557 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -11,10 +11,13 @@ import ( "time" "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "golang.org/x/crypto/sha3" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/bor" "github.com/ethereum/go-ethereum/consensus/bor/clerk" + "github.com/ethereum/go-ethereum/consensus/bor/heimdall/checkpoint" "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" @@ -25,15 +28,6 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/tests/bor/mocks" - - "github.com/stretchr/testify/assert" - "golang.org/x/crypto/sha3" -) - -const ( - spanPath = "bor/span/1" - clerkPath = "clerk/event-record/list" - clerkQueryParams = "from-time=%d&to-time=%d&page=%d&limit=50" ) func TestInsertingSpanSizeBlocks(t *testing.T) { @@ -42,9 +36,20 @@ func TestInsertingSpanSizeBlocks(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer _bor.Close() + h, heimdallSpan, ctrl := getMockedHeimdallClient(t) defer ctrl.Finish() + _, span := loadSpanFromFile(t) + + h.EXPECT().Close().AnyTimes() + h.EXPECT().FetchLatestCheckpoint().Return(&checkpoint.Checkpoint{ + Proposer: span.SelectedProducers[0].Address, + StartBlock: big.NewInt(0), + EndBlock: big.NewInt(int64(spanSize)), + }, nil).AnyTimes() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -75,6 +80,8 @@ func TestFetchStateSyncEvents(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer _bor.Close() + // A. Insert blocks for 0th sprint db := init.ethereum.ChainDb() block := init.genesis.ToBlock(db) @@ -92,6 +99,7 @@ func TestFetchStateSyncEvents(t *testing.T) { defer ctrl.Finish() h := mocks.NewMockIHeimdallClient(ctrl) + h.EXPECT().Close().AnyTimes() h.EXPECT().Span(uint64(1)).Return(&res.Result, nil).AnyTimes() // B.2 Mock State Sync events @@ -117,6 +125,8 @@ func TestFetchStateSyncEvents_2(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer _bor.Close() + // Mock /bor/span/1 res, _ := loadSpanFromFile(t) @@ -124,6 +134,7 @@ func TestFetchStateSyncEvents_2(t *testing.T) { defer ctrl.Finish() h := mocks.NewMockIHeimdallClient(ctrl) + h.EXPECT().Close().AnyTimes() h.EXPECT().Span(uint64(1)).Return(&res.Result, nil).AnyTimes() // Mock State Sync events @@ -184,9 +195,12 @@ func TestOutOfTurnSigning(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer _bor.Close() + h, _, ctrl := getMockedHeimdallClient(t) defer ctrl.Finish() + h.EXPECT().Close().AnyTimes() _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -217,6 +231,7 @@ func TestOutOfTurnSigning(t *testing.T) { bor.CalcProducerDelay(header.Number.Uint64(), 0, init.genesis.Config.Bor)) sign(t, header, signerKey, init.genesis.Config.Bor) block = types.NewBlockWithHeader(header) + _, err = chain.InsertChain([]*types.Block{block}) assert.Equal(t, *err.(*bor.WrongDifficultyError), @@ -225,6 +240,7 @@ func TestOutOfTurnSigning(t *testing.T) { header.Difficulty = new(big.Int).SetUint64(expectedDifficulty) sign(t, header, signerKey, init.genesis.Config.Bor) block = types.NewBlockWithHeader(header) + _, err = chain.InsertChain([]*types.Block{block}) assert.Nil(t, err) } @@ -235,9 +251,13 @@ func TestSignerNotFound(t *testing.T) { engine := init.ethereum.Engine() _bor := engine.(*bor.Bor) + defer _bor.Close() + h, _, ctrl := getMockedHeimdallClient(t) defer ctrl.Finish() + h.EXPECT().Close().AnyTimes() + _bor.SetHeimdallClient(h) db := init.ethereum.ChainDb() @@ -298,6 +318,10 @@ func getSampleEventRecord(t *testing.T) *clerk.EventRecordWithTime { return eventRecords.Result[0] } +func getEventRecords(t *testing.T) []*clerk.EventRecordWithTime { + return stateSyncEventsPayload(t).Result +} + // TestEIP1559Transition tests the following: // // 1. A transaction whose gasFeeCap is greater than the baseFee is valid. diff --git a/tests/bor/mocks/IHeimdallClient.go b/tests/bor/mocks/IHeimdallClient.go index 4e4d7a3776..f770ed9fa8 100644 --- a/tests/bor/mocks/IHeimdallClient.go +++ b/tests/bor/mocks/IHeimdallClient.go @@ -8,6 +8,7 @@ import ( reflect "reflect" clerk "github.com/ethereum/go-ethereum/consensus/bor/clerk" + checkpoint "github.com/ethereum/go-ethereum/consensus/bor/heimdall/checkpoint" span "github.com/ethereum/go-ethereum/consensus/bor/heimdall/span" gomock "github.com/golang/mock/gomock" ) @@ -47,6 +48,21 @@ func (mr *MockIHeimdallClientMockRecorder) Close() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockIHeimdallClient)(nil).Close)) } +// FetchLatestCheckpoint mocks base method. +func (m *MockIHeimdallClient) FetchLatestCheckpoint() (*checkpoint.Checkpoint, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchLatestCheckpoint") + ret0, _ := ret[0].(*checkpoint.Checkpoint) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchLatestCheckpoint indicates an expected call of FetchLatestCheckpoint. +func (mr *MockIHeimdallClientMockRecorder) FetchLatestCheckpoint() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchLatestCheckpoint", reflect.TypeOf((*MockIHeimdallClient)(nil).FetchLatestCheckpoint)) +} + // Span mocks base method. func (m *MockIHeimdallClient) Span(arg0 uint64) (*span.HeimdallSpan, error) { m.ctrl.T.Helper() From 33e646eea1e6c86ed3a2b9fc0fe31b0b8799444f Mon Sep 17 00:00:00 2001 From: Jerry Date: Mon, 13 Jun 2022 20:43:34 -0700 Subject: [PATCH 132/190] Add keystore option to cli --- docs/cli/server.md | 2 ++ internal/cli/server/config.go | 4 ++++ internal/cli/server/flags.go | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/docs/cli/server.md b/docs/cli/server.md index 21ed27ed74..0803208e3a 100644 --- a/docs/cli/server.md +++ b/docs/cli/server.md @@ -12,6 +12,8 @@ The ```bor server``` command runs the Bor client. - ```datadir```: Path of the data directory to store information +- ```keystore```: Path of the directory to store keystores + - ```config```: File for the config file - ```syncmode```: Blockchain sync mode ("fast", "full", or "snap") diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 137f6aed0f..ab8c8e5155 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -52,6 +52,9 @@ type Config struct { // DataDir is the directory to store the state in DataDir string `hcl:"data-dir,optional"` + // KeyStoreDir is the directory to store keystores + KeyStoreDir string `hcl:"keystore-dir,optional"` + // SyncMode selects the sync protocol SyncMode string `hcl:"sync-mode,optional"` @@ -894,6 +897,7 @@ func (c *Config) buildNode() (*node.Config, error) { cfg := &node.Config{ Name: clientIdentifier, DataDir: c.DataDir, + KeyStoreDir: c.KeyStoreDir, UseLightweightKDF: c.Accounts.UseLightweightKDF, InsecureUnlockAllowed: c.Accounts.AllowInsecureUnlock, Version: params.VersionWithCommit(gitCommit, gitDate), diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index 6269e1c6fa..21e9a38cb9 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -33,6 +33,11 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.cliConfig.DataDir, Default: c.cliConfig.DataDir, }) + f.StringFlag(&flagset.StringFlag{ + Name: "keystore", + Usage: "Path of the directory to store keystores", + Value: &c.cliConfig.KeyStoreDir, + }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "config", Usage: "File for the config file", From 9ec673870af5ba5a3d8b048a8e30f9f4b8da471a Mon Sep 17 00:00:00 2001 From: Jerry Date: Wed, 15 Jun 2022 23:58:23 -0700 Subject: [PATCH 133/190] Set Heimdall client to nil when 'withoutheimdall' is set --- consensus/bor/bor.go | 4 +++- eth/ethconfig/config.go | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 87770f49ab..826a45dae2 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -960,7 +960,9 @@ func (c *Bor) APIs(chain consensus.ChainHeaderReader) []rpc.API { // Close implements consensus.Engine. It's a noop for bor as there are no background threads. func (c *Bor) Close() error { c.closeOnce.Do(func() { - c.HeimdallClient.Close() + if c.HeimdallClient != nil { + c.HeimdallClient.Close() + } }) return nil diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index a3c7f49e39..091600d8b5 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -243,7 +243,11 @@ func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, et genesisContractsClient := contract.NewGenesisContractsClient(chainConfig, chainConfig.Bor.ValidatorContract, chainConfig.Bor.StateReceiverContract, blockchainAPI) spanner := span.NewChainSpanner(blockchainAPI, contract.ValidatorSet(), chainConfig, common.HexToAddress(chainConfig.Bor.ValidatorContract)) - return bor.New(chainConfig, db, blockchainAPI, spanner, heimdall.NewHeimdallClient(ethConfig.HeimdallURL), genesisContractsClient) + if ethConfig.WithoutHeimdall { + return bor.New(chainConfig, db, blockchainAPI, spanner, nil, genesisContractsClient) + } else { + return bor.New(chainConfig, db, blockchainAPI, spanner, heimdall.NewHeimdallClient(ethConfig.HeimdallURL), genesisContractsClient) + } } else { switch config.PowMode { case ethash.ModeFake: From 9592534a6907cfed081a9c5a80fec36ca86f6e00 Mon Sep 17 00:00:00 2001 From: Jerry Date: Thu, 16 Jun 2022 14:26:57 -0700 Subject: [PATCH 134/190] Integration tests --- .github/matic-cli-config.yml | 11 ++++ .github/workflows/ci.yml | 106 +++++++++++++++++++++++++++++++- integration-tests/smoke_test.sh | 33 ++++++++++ 3 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 .github/matic-cli-config.yml create mode 100644 integration-tests/smoke_test.sh diff --git a/.github/matic-cli-config.yml b/.github/matic-cli-config.yml new file mode 100644 index 0000000000..f643f4b192 --- /dev/null +++ b/.github/matic-cli-config.yml @@ -0,0 +1,11 @@ +defaultStake: 10000 +defaultFee: 2000 +borChainId: "15001" +heimdallChainId: heimdall-15001 +contractsBranch: jc/v0.3.1-backport +numOfValidators: 3 +numOfNonValidators: 0 +ethURL: http://ganache:9545 +devnetType: docker +borDockerBuildContext: "../../bor" +heimdallDockerBuildContext: "https://github.com/maticnetwork/heimdall.git#v0.3.0-dev" \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72647b56eb..65a88ec3c3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,6 +3,8 @@ on: push: branches: - "master" + - "qa" + - "develop" pull_request: branches: - "**" @@ -77,4 +79,106 @@ jobs: - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: - file: ./cover.out \ No newline at end of file + file: ./cover.out + + integration-tests: + if: (github.event.action != 'closed' || github.event.pull_request.merged == true) + strategy: + matrix: + os: [ ubuntu-20.04 ] # list of os: https://github.com/actions/virtual-environments + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + with: + path: bor + - name: Checkout submodules + run: | + cd bor + git submodule update --init --recursive --force + git fetch --no-tags --prune --depth=1 origin +refs/heads/master:refs/remotes/origin/master + + - uses: actions/setup-go@v3 + with: + go-version: 1.18.x + + - name: Checkout matic-cli + uses: actions/checkout@v3 + with: + repository: maticnetwork/matic-cli + ref: v0.3.0-dev + path: matic-cli + + - name: Install dependencies on Linux + if: runner.os == 'Linux' + run: | + sudo apt update + sudo apt install build-essential + curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash + sudo snap install solc + sudo apt install python2 jq curl + sudo ln -sf /usr/bin/python2 /usr/bin/python + + - uses: actions/setup-node@v3 + with: + node-version: '10.17.0' + cache: 'npm' + cache-dependency-path: | + matic-cli/package-lock.json + matic-cli/devnet/code/contracts/package-lock.json + matic-cli/devnet/code/genesis-contracts/package-lock.json + matic-cli/devnet/code/genesis-contracts/matic-contracts/package-lock.json + + - name: Bootstrap devnet + run: | + cd matic-cli + npm install --prefer-offline --no-audit --progress=false + mkdir devnet + cd devnet + ../bin/matic-cli setup devnet -c ../../bor/.github/matic-cli-config.yml + + - name: Launch devnet + run: | + cd matic-cli/devnet + bash docker-ganache-start.sh + bash docker-heimdall-start-all.sh + bash docker-bor-setup.sh + bash docker-bor-start-all.sh + sleep 120 && bash ganache-deployment-bor.sh + sleep 120 && bash ganache-deployment-sync.sh + sleep 120 + docker exec bor0 bash -c "bor attach /root/.bor/data/bor.ipc -exec 'admin.peers'" + docker exec bor0 bash -c "bor attach /root/.bor/data/bor.ipc -exec 'eth.blockNumber'" + + - name: Run smoke tests + run: | + echo "Deposit 100 matic for each account to bor network" + cd matic-cli/devnet/code/contracts + npm run truffle exec scripts/deposit.js -- --network development $(jq -r .root.tokens.MaticToken contractAddresses.json) 100000000000000000000 + cd - + bash bor/integration-tests/smoke_test.sh + + - name: Upload logs + if: always() + uses: actions/upload-artifact@v3 + with: + name: logs_${{ github.run_id }} + path: | + matic-cli/devnet/logs + + - name: Package code and chain data + if: always() + run: | + cd matic-cli/devnet + docker compose down + cd - + mkdir -p ${{ github.run_id }}/matic-cli + sudo mv bor ${{ github.run_id }} + sudo mv matic-cli/devnet ${{ github.run_id }}/matic-cli + sudo tar czf code.tar.gz ${{ github.run_id }} + + - name: Upload code and chain data + if: always() + uses: actions/upload-artifact@v3 + with: + name: code_${{ github.run_id }} + path: code.tar.gz diff --git a/integration-tests/smoke_test.sh b/integration-tests/smoke_test.sh new file mode 100644 index 0000000000..6f41aa5c16 --- /dev/null +++ b/integration-tests/smoke_test.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -e + +delay=600 + +echo "Wait ${delay} seconds for state-sync..." +sleep $delay + + +balance=$(docker exec bor0 bash -c "bor attach /root/.bor/data/bor.ipc -exec 'Math.round(web3.fromWei(eth.getBalance(eth.accounts[0])))'") + +if ! [[ "$balance" =~ ^[0-9]+$ ]]; then + echo "Something is wrong! Can't find the balance of first account in bor network." + exit 1 +fi + +echo "Found matic balance on account[0]: " $balance + +if (( $balance <= 1001 )); then + echo "Balance in bor network has not increased. This indicates that something is wrong with state sync." + exit 1 +fi + +checkpointID=$(curl -sL http://localhost:1317/checkpoints/latest | jq .result.id) + +if [ $checkpointID == "null" ]; then + echo "Something is wrong! Could not find any checkpoint." + exit 1 +else + echo "Found checkpoint ID:" $checkpointID +fi + +echo "All tests have passed!" \ No newline at end of file From fbaeaa2247446f9a4afa5cdc6625525cecce9b6f Mon Sep 17 00:00:00 2001 From: Krishna Upadhyaya Date: Tue, 21 Jun 2022 16:42:56 +0530 Subject: [PATCH 135/190] Added reproducible build test to CI --- .github/workflows/ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d61e14cb42..727d3a2e22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,4 +17,12 @@ jobs: uses: codecov/codecov-action@v1 with: file: ./cover.out - + - name: Reproducible build test + run: | + make geth + shasum -a256 ./build/bin/geth > bor1.sha256 + make geth + shasum -a256 ./build/bin/geth > bor2.sha256 + if ! cmp -s bor1.sha256 bor2.sha256; then + echo >&2 "Reproducible build broken"; cat bor1.sha256; cat bor2.sha256; exit 1 + fi From a73b0f70bff7ff2cec2c4657436798aa8fc63d15 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Tue, 28 Jun 2022 00:46:51 +0530 Subject: [PATCH 136/190] change version --- params/version.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/params/version.go b/params/version.go index 4b608b1a5f..83e04a66f8 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 0 // Major version component of the current release - VersionMinor = 2 // Minor version component of the current release - VersionPatch = 16 // Patch version component of the current release - VersionMeta = "stable" // Version metadata to append to the version string + VersionMajor = 0 // Major version component of the current release + VersionMinor = 3 // Minor version component of the current release + VersionPatch = 0 // Patch version component of the current release + VersionMeta = "beta" // Version metadata to append to the version string ) // Version holds the textual version string. From f90faf0687c2b298f9a75af604b2744c3058c8fc Mon Sep 17 00:00:00 2001 From: Jerry Date: Thu, 30 Jun 2022 10:36:44 -0700 Subject: [PATCH 137/190] Match default parameters to mainnet --- builder/files/bor.service | 37 +++++++++++++++++++++++------------ internal/cli/server/config.go | 2 +- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/builder/files/bor.service b/builder/files/bor.service index 28fda79814..da0338368c 100644 --- a/builder/files/bor.service +++ b/builder/files/bor.service @@ -7,22 +7,33 @@ Restart=on-failure RestartSec=5s ExecStart=/usr/local/bin/bor server \ - -chain=mumbai \ - # -chain=mainnet \ - -datadir /var/lib/bor/data \ - -metrics \ - -metrics.prometheus-addr="127.0.0.1:7071" \ - -bootnodes "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303,enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303" + --chain=mumbai \ + # --chain=mainnet \ + --datadir /var/lib/bor/data \ + --metrics \ + --metrics.prometheus-addr="127.0.0.1:7071" \ + --syncmode 'full' \ + --miner.gasprice '30000000000' \ + --miner.gaslimit '20000000' \ + --miner.gastarget '20000000' \ + --txpool.nolocals \ + --txpool.accountslots 16 \ + --txpool.globalslots 32768 \ + --txpool.accountqueue 16 \ + --txpool.globalqueue 32768 \ + --txpool.pricelimit '30000000000' \ + --txpool.lifetime '1h30m0s' \ + --bootnodes "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303,enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303" # Validator params # Uncomment and configure the following lines in case you run a validator. Don't forget to add backslash (\) # to previous command line. - # -keystore /var/lib/bor/keystore \ - # -unlock [VALIDATOR ADDRESS] \ - # -password /var/lib/bor/password.txt \ - # -allow-insecure-unlock \ - # -nodiscover -maxpeers 1 \ - # -miner.etherbase [VALIDATOR ADDRESS] \ - # -mine + # --keystore /var/lib/bor/keystore \ + # --unlock [VALIDATOR ADDRESS] \ + # --password /var/lib/bor/password.txt \ + # --allow-insecure-unlock \ + # --nodiscover --maxpeers 1 \ + # --miner.etherbase [VALIDATOR ADDRESS] \ + # --mine Type=simple User=ubuntu KillSignal=SIGINT diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index ab8c8e5155..347287e22f 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -431,7 +431,7 @@ func DefaultConfig() *Config { Sealer: &SealerConfig{ Enabled: false, Etherbase: "", - GasCeil: 8000000, + GasCeil: 20000000, GasPrice: big.NewInt(30 * params.GWei), ExtraData: "", }, From f53981809ed494502d949a9e3fe0f3b4cd8c1ec5 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Thu, 14 Jul 2022 22:36:18 +0530 Subject: [PATCH 138/190] Change diverged flags back to Geth's convention (POS-602) (#451) * changed name -> identity * changed no-snapshot -> snapchot=true/false * changed jsonrpc.corsdomain -> http.corsdomain * changed jsonrpc.vhosts -> http.vhosts * changed http/ws.modules to http/ws.api * updated readme * updated config_test * make docs * handelling string array flag, overwrite insted of append * added 'Default' to SliceStringFlag * added separate flags for corsdomain and vhosts for http, ws, graphql * modified tests --- docs/cli/server.md | 20 +++-- internal/cli/flagset/flagset.go | 13 ++-- internal/cli/flagset/flagset_test.go | 11 ++- internal/cli/server/config.go | 64 ++++++++-------- internal/cli/server/config_test.go | 9 +-- internal/cli/server/flags.go | 105 ++++++++++++++++++--------- internal/cli/server/server.go | 4 +- 7 files changed, 138 insertions(+), 88 deletions(-) diff --git a/docs/cli/server.md b/docs/cli/server.md index 0803208e3a..ac43555275 100644 --- a/docs/cli/server.md +++ b/docs/cli/server.md @@ -6,7 +6,7 @@ The ```bor server``` command runs the Bor client. - ```chain```: Name of the chain to sync -- ```name```: Name/Identity of the node +- ```identity```: Name/Identity of the node - ```log-level```: Set log level for the server @@ -22,7 +22,7 @@ The ```bor server``` command runs the Bor client. - ```requiredblocks```: Comma separated block number-to-hash mappings to enforce (=) -- ```no-snapshot```: Disables the snapshot-database mode (default = false) +- ```snapshot```: Disables/Enables the snapshot-database mode (default = true) - ```bor.heimdall```: URL of Heimdall service @@ -88,9 +88,17 @@ The ```bor server``` command runs the Bor client. - ```ipcpath```: Filename for IPC socket/pipe within the datadir (explicit paths escape it) -- ```jsonrpc.corsdomain```: Comma separated list of domains from which to accept cross origin requests (browser enforced) +- ```http.corsdomain```: Comma separated list of domains from which to accept cross origin requests (browser enforced) -- ```jsonrpc.vhosts```: Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. +- ```http.vhosts```: Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. + +- ```ws.corsdomain```: Comma separated list of domains from which to accept cross origin requests (browser enforced) + +- ```ws.vhosts```: Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. + +- ```graphql.corsdomain```: Comma separated list of domains from which to accept cross origin requests (browser enforced) + +- ```graphql.vhosts```: Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. - ```http```: Enable the HTTP-RPC server @@ -100,7 +108,7 @@ The ```bor server``` command runs the Bor client. - ```http.rpcprefix```: HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths. -- ```http.modules```: API's offered over the HTTP-RPC interface +- ```http.api```: API's offered over the HTTP-RPC interface - ```ws```: Enable the WS-RPC server @@ -110,7 +118,7 @@ The ```bor server``` command runs the Bor client. - ```ws.rpcprefix```: HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths. -- ```ws.modules```: API's offered over the WS-RPC interface +- ```ws.api```: API's offered over the WS-RPC interface - ```graphql```: Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well. diff --git a/internal/cli/flagset/flagset.go b/internal/cli/flagset/flagset.go index b57fff9996..0c19fa9758 100644 --- a/internal/cli/flagset/flagset.go +++ b/internal/cli/flagset/flagset.go @@ -202,10 +202,11 @@ func (f *Flagset) BigIntFlag(b *BigIntFlag) { } type SliceStringFlag struct { - Name string - Usage string - Value *[]string - Group string + Name string + Usage string + Value *[]string + Default []string + Group string } func (i *SliceStringFlag) String() string { @@ -217,8 +218,8 @@ func (i *SliceStringFlag) String() string { } func (i *SliceStringFlag) Set(value string) error { - *i.Value = append(*i.Value, strings.Split(value, ",")...) - + // overwritting insted of appending + *i.Value = strings.Split(value, ",") return nil } diff --git a/internal/cli/flagset/flagset_test.go b/internal/cli/flagset/flagset_test.go index 2f046c3248..118361320d 100644 --- a/internal/cli/flagset/flagset_test.go +++ b/internal/cli/flagset/flagset_test.go @@ -23,14 +23,17 @@ func TestFlagsetBool(t *testing.T) { func TestFlagsetSliceString(t *testing.T) { f := NewFlagSet("") - value := []string{} + value := []string{"a", "b", "c"} f.SliceStringFlag(&SliceStringFlag{ - Name: "flag", - Value: &value, + Name: "flag", + Value: &value, + Default: value, }) - assert.NoError(t, f.Parse([]string{"--flag", "a,b", "--flag", "c"})) + assert.NoError(t, f.Parse([]string{})) assert.Equal(t, value, []string{"a", "b", "c"}) + assert.NoError(t, f.Parse([]string{"--flag", "a,b"})) + assert.Equal(t, value, []string{"a", "b"}) } func TestFlagsetDuration(t *testing.T) { diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 347287e22f..fdf253a37e 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -40,8 +40,8 @@ type Config struct { // Chain is the chain to sync with Chain string `hcl:"chain,optional"` - // Name, or identity of the node - Name string `hcl:"name,optional"` + // Identity of the node + Identity string `hcl:"identity,optional"` // RequiredBlocks is a list of required (block number, hash) pairs to accept RequiredBlocks map[string]string `hcl:"requiredblocks,optional"` @@ -61,8 +61,8 @@ type Config struct { // GcMode selects the garbage collection mode for the trie GcMode string `hcl:"gc-mode,optional"` - // NoSnapshot disables the snapshot database mode - NoSnapshot bool `hcl:"no-snapshot,optional"` + // Snapshot disables/enables the snapshot database mode + Snapshot bool `hcl:"snapshot,optional"` // Ethstats is the address of the ethstats server to send telemetry Ethstats string `hcl:"ethstats,optional"` @@ -217,12 +217,6 @@ type JsonRPCConfig struct { // IPCPath is the path of the ipc endpoint IPCPath string `hcl:"ipc-path,optional"` - // VHost is the list of valid virtual hosts - VHost []string `hcl:"vhost,optional"` - - // Cors is the list of Cors endpoints - Cors []string `hcl:"cors,optional"` - // GasCap is the global gas cap for eth-call variants. GasCap uint64 `hcl:"gas-cap,optional"` @@ -232,10 +226,10 @@ type JsonRPCConfig struct { // Http has the json-rpc http related settings Http *APIConfig `hcl:"http,block"` - // Http has the json-rpc websocket related settings + // Ws has the json-rpc websocket related settings Ws *APIConfig `hcl:"ws,block"` - // Http has the json-rpc graphql related settings + // Graphql has the json-rpc graphql related settings Graphql *APIConfig `hcl:"graphql,block"` } @@ -258,7 +252,13 @@ type APIConfig struct { Host string `hcl:"host,optional"` // Modules is the list of enabled api modules - Modules []string `hcl:"modules,optional"` + API []string `hcl:"modules,optional"` + + // VHost is the list of valid virtual hosts + VHost []string `hcl:"vhost,optional"` + + // Cors is the list of Cors endpoints + Cors []string `hcl:"cors,optional"` } type GpoConfig struct { @@ -387,7 +387,7 @@ type DeveloperConfig struct { func DefaultConfig() *Config { return &Config{ Chain: "mainnet", - Name: Hostname(), + Identity: Hostname(), RequiredBlocks: map[string]string{}, LogLevel: "INFO", DataDir: defaultDataDir(), @@ -412,9 +412,9 @@ func DefaultConfig() *Config { URL: "http://localhost:1317", Without: false, }, - SyncMode: "full", - GcMode: "full", - NoSnapshot: false, + SyncMode: "full", + GcMode: "full", + Snapshot: true, TxPool: &TxPoolConfig{ Locals: []string{}, NoLocals: false, @@ -444,8 +444,6 @@ func DefaultConfig() *Config { JsonRPC: &JsonRPCConfig{ IPCDisable: false, IPCPath: "", - Cors: []string{"*"}, - VHost: []string{"*"}, GasCap: ethconfig.Defaults.RPCGasCap, TxFeeCap: ethconfig.Defaults.RPCTxFeeCap, Http: &APIConfig{ @@ -453,17 +451,23 @@ func DefaultConfig() *Config { Port: 8545, Prefix: "", Host: "localhost", - Modules: []string{"eth", "net", "web3", "txpool", "bor"}, + API: []string{"eth", "net", "web3", "txpool", "bor"}, + Cors: []string{"*"}, + VHost: []string{"*"}, }, Ws: &APIConfig{ Enabled: false, Port: 8546, Prefix: "", Host: "localhost", - Modules: []string{"web3", "net"}, + API: []string{"web3", "net"}, + Cors: []string{"*"}, + VHost: []string{"*"}, }, Graphql: &APIConfig{ Enabled: false, + Cors: []string{"*"}, + VHost: []string{"*"}, }, }, Ethstats: "", @@ -864,7 +868,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* } // snapshot disable check - if c.NoSnapshot { + if !c.Snapshot { if n.SyncMode == downloader.SnapSync { log.Info("Snap sync requested, enabling --snapshot") } else { @@ -908,15 +912,15 @@ func (c *Config) buildNode() (*node.Config, error) { ListenAddr: c.P2P.Bind + ":" + strconv.Itoa(int(c.P2P.Port)), DiscoveryV5: c.P2P.Discovery.V5Enabled, }, - HTTPModules: c.JsonRPC.Http.Modules, - HTTPCors: c.JsonRPC.Cors, - HTTPVirtualHosts: c.JsonRPC.VHost, + HTTPModules: c.JsonRPC.Http.API, + HTTPCors: c.JsonRPC.Http.Cors, + HTTPVirtualHosts: c.JsonRPC.Http.VHost, HTTPPathPrefix: c.JsonRPC.Http.Prefix, - WSModules: c.JsonRPC.Ws.Modules, - WSOrigins: c.JsonRPC.Cors, + WSModules: c.JsonRPC.Ws.API, + WSOrigins: c.JsonRPC.Ws.Cors, WSPathPrefix: c.JsonRPC.Ws.Prefix, - GraphQLCors: c.JsonRPC.Cors, - GraphQLVirtualHosts: c.JsonRPC.VHost, + GraphQLCors: c.JsonRPC.Graphql.Cors, + GraphQLVirtualHosts: c.JsonRPC.Graphql.VHost, } // dev mode @@ -999,7 +1003,7 @@ func (c *Config) buildNode() (*node.Config, error) { func (c *Config) Merge(cc ...*Config) error { for _, elem := range cc { - if err := mergo.Merge(c, elem, mergo.WithOverwriteWithEmptyValue, mergo.WithAppendSlice); err != nil { + if err := mergo.Merge(c, elem, mergo.WithOverwriteWithEmptyValue); err != nil { return fmt.Errorf("failed to merge configurations: %v", err) } } diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index 94c4496c03..c1c6c4ef4a 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -22,8 +22,8 @@ func TestConfigDefault(t *testing.T) { func TestConfigMerge(t *testing.T) { c0 := &Config{ - Chain: "0", - NoSnapshot: true, + Chain: "0", + Snapshot: true, RequiredBlocks: map[string]string{ "a": "b", }, @@ -54,8 +54,8 @@ func TestConfigMerge(t *testing.T) { } expected := &Config{ - Chain: "1", - NoSnapshot: false, + Chain: "1", + Snapshot: false, RequiredBlocks: map[string]string{ "a": "b", "b": "c", @@ -64,7 +64,6 @@ func TestConfigMerge(t *testing.T) { MaxPeers: 10, Discovery: &P2PDiscovery{ StaticNodes: []string{ - "a", "b", }, }, diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index 21e9a38cb9..e85428b9ee 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -16,10 +16,10 @@ func (c *Command) Flags() *flagset.Flagset { Default: c.cliConfig.Chain, }) f.StringFlag(&flagset.StringFlag{ - Name: "name", + Name: "identity", Usage: "Name/Identity of the node", - Value: &c.cliConfig.Name, - Default: c.cliConfig.Name, + Value: &c.cliConfig.Identity, + Default: c.cliConfig.Identity, }) f.StringFlag(&flagset.StringFlag{ Name: "log-level", @@ -61,10 +61,10 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.cliConfig.RequiredBlocks, }) f.BoolFlag(&flagset.BoolFlag{ - Name: "no-snapshot", - Usage: `Disables the snapshot-database mode (default = false)`, - Value: &c.cliConfig.NoSnapshot, - Default: c.cliConfig.NoSnapshot, + Name: "snapshot", + Usage: `Disables/Enables the snapshot-database mode (default = true)`, + Value: &c.cliConfig.Snapshot, + Default: c.cliConfig.Snapshot, }) // heimdall @@ -83,10 +83,11 @@ func (c *Command) Flags() *flagset.Flagset { // txpool options f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "txpool.locals", - Usage: "Comma separated accounts to treat as locals (no flush, priority inclusion)", - Value: &c.cliConfig.TxPool.Locals, - Group: "Transaction Pool", + Name: "txpool.locals", + Usage: "Comma separated accounts to treat as locals (no flush, priority inclusion)", + Value: &c.cliConfig.TxPool.Locals, + Default: c.cliConfig.TxPool.Locals, + Group: "Transaction Pool", }) f.BoolFlag(&flagset.BoolFlag{ Name: "txpool.nolocals", @@ -329,16 +330,46 @@ func (c *Command) Flags() *flagset.Flagset { Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "jsonrpc.corsdomain", - Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", - Value: &c.cliConfig.JsonRPC.Cors, - Group: "JsonRPC", + Name: "http.corsdomain", + Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", + Value: &c.cliConfig.JsonRPC.Http.Cors, + Default: c.cliConfig.JsonRPC.Http.Cors, + Group: "JsonRPC", + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "http.vhosts", + Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", + Value: &c.cliConfig.JsonRPC.Http.VHost, + Default: c.cliConfig.JsonRPC.Http.VHost, + Group: "JsonRPC", + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "ws.corsdomain", + Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", + Value: &c.cliConfig.JsonRPC.Ws.Cors, + Default: c.cliConfig.JsonRPC.Ws.Cors, + Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "jsonrpc.vhosts", - Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", - Value: &c.cliConfig.JsonRPC.VHost, - Group: "JsonRPC", + Name: "ws.vhosts", + Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", + Value: &c.cliConfig.JsonRPC.Ws.VHost, + Default: c.cliConfig.JsonRPC.Ws.VHost, + Group: "JsonRPC", + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "graphql.corsdomain", + Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", + Value: &c.cliConfig.JsonRPC.Graphql.Cors, + Default: c.cliConfig.JsonRPC.Graphql.Cors, + Group: "JsonRPC", + }) + f.SliceStringFlag(&flagset.SliceStringFlag{ + Name: "graphql.vhosts", + Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", + Value: &c.cliConfig.JsonRPC.Graphql.VHost, + Default: c.cliConfig.JsonRPC.Graphql.VHost, + Group: "JsonRPC", }) // http options @@ -371,10 +402,11 @@ func (c *Command) Flags() *flagset.Flagset { Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "http.modules", - Usage: "API's offered over the HTTP-RPC interface", - Value: &c.cliConfig.JsonRPC.Http.Modules, - Group: "JsonRPC", + Name: "http.api", + Usage: "API's offered over the HTTP-RPC interface", + Value: &c.cliConfig.JsonRPC.Http.API, + Default: c.cliConfig.JsonRPC.Http.API, + Group: "JsonRPC", }) // ws options @@ -407,10 +439,11 @@ func (c *Command) Flags() *flagset.Flagset { Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "ws.modules", - Usage: "API's offered over the WS-RPC interface", - Value: &c.cliConfig.JsonRPC.Ws.Modules, - Group: "JsonRPC", + Name: "ws.api", + Usage: "API's offered over the WS-RPC interface", + Value: &c.cliConfig.JsonRPC.Ws.API, + Default: c.cliConfig.JsonRPC.Ws.API, + Group: "JsonRPC", }) // graphql options @@ -438,10 +471,11 @@ func (c *Command) Flags() *flagset.Flagset { Group: "P2P", }) f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "bootnodes", - Usage: "Comma separated enode URLs for P2P discovery bootstrap", - Value: &c.cliConfig.P2P.Discovery.Bootnodes, - Group: "P2P", + Name: "bootnodes", + Usage: "Comma separated enode URLs for P2P discovery bootstrap", + Value: &c.cliConfig.P2P.Discovery.Bootnodes, + Default: c.cliConfig.P2P.Discovery.Bootnodes, + Group: "P2P", }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "maxpeers", @@ -581,10 +615,11 @@ func (c *Command) Flags() *flagset.Flagset { // account f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "unlock", - Usage: "Comma separated list of accounts to unlock", - Value: &c.cliConfig.Accounts.Unlock, - Group: "Account Management", + Name: "unlock", + Usage: "Comma separated list of accounts to unlock", + Value: &c.cliConfig.Accounts.Unlock, + Default: c.cliConfig.Accounts.Unlock, + Group: "Account Management", }) f.StringFlag(&flagset.StringFlag{ Name: "password", diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index 7d5ec2c8f3..cd706c1a9d 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -182,7 +182,7 @@ func NewServer(config *Config) (*Server, error) { // graphql is started from another place if config.JsonRPC.Graphql.Enabled { - if err := graphql.New(stack, srv.backend.APIBackend, config.JsonRPC.Cors, config.JsonRPC.VHost); err != nil { + if err := graphql.New(stack, srv.backend.APIBackend, config.JsonRPC.Graphql.Cors, config.JsonRPC.Graphql.VHost); err != nil { return nil, fmt.Errorf("failed to register the GraphQL service: %v", err) } } @@ -201,7 +201,7 @@ func NewServer(config *Config) (*Server, error) { } } - if err := srv.setupMetrics(config.Telemetry, config.Name); err != nil { + if err := srv.setupMetrics(config.Telemetry, config.Identity); err != nil { return nil, err } From e62beee1b2dda5c4ab9277ea351c9e4b73125c2f Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Wed, 27 Jul 2022 12:28:26 +0530 Subject: [PATCH 139/190] internal/cli: use config file for flags in new-cli, builder/files: update defaults (#457) * updated simple.json and simple.hcl * added annotations for developer and grpc block * added toml tags and simple.toml file * added support for toml config files * updated simple files toml, hcl, json * added config.toml in builder/files and updated bor.service * add dumpconfig command in cli for exporting configs * update docs * updated .goreleaser.yml (POS-651) * changed --config to -config * added test config for tests and fixed lint errors * made fields of type big.int and time.Duration private, removed merge from dumpconfig, setting up default values to the Raw fields in dumpconfig, and fixed one lint error * fixed lint errors (strange) * lint fix * private no-more, using '-' in name tags to ignore * updated name tags, made c.configFile as a stringFlag (only one config file supported) and updated the merge logic in command.go -> Run() * fix: set method for big.Int flags, added a TODO * handeled bigInt and timeDuration type, bug fix in config_legacy, lint fix * updated flags, consistent across flags.go and config.go * fixed config test and updated test hcl, json config files * updated config legacy test * added test to check values of cmd flags, restructured Run in command.go, linter fix * fix linters * lint again * changed 2 flags and assert -> require * changed the 2 flags back * updated correct congig.toml path and made mainnet default * updated config.toml with new flags * added sample config (toml) file * removed sample-config.toml and added it in docs/config.md Co-authored-by: Manav Darji --- .goreleaser.yml | 3 + builder/files/bor.service | 29 +- builder/files/config.toml | 44 +++ docs/cli/README.md | 2 + docs/cli/dumpconfig.md | 3 + docs/config.md | 261 +++++++++--------- go.mod | 1 + go.sum | 6 + internal/cli/command.go | 5 + internal/cli/dumpconfig.go | 82 ++++++ internal/cli/flagset/flagset.go | 18 +- internal/cli/server/command.go | 57 +++- internal/cli/server/command_test.go | 50 ++++ internal/cli/server/config.go | 249 ++++++++--------- internal/cli/server/config_legacy.go | 40 +-- internal/cli/server/config_legacy_test.go | 45 ++- internal/cli/server/config_test.go | 6 +- internal/cli/server/flags.go | 2 +- internal/cli/server/proto/server.pb.go | 5 +- internal/cli/server/proto/server_grpc.pb.go | 1 + internal/cli/server/service_test.go | 3 +- internal/cli/server/testdata/simple.json | 15 - .../server/testdata/{simple.hcl => test.hcl} | 8 +- internal/cli/server/testdata/test.json | 15 + internal/cli/server/testdata/test.toml | 25 ++ 25 files changed, 625 insertions(+), 350 deletions(-) create mode 100644 builder/files/config.toml create mode 100644 docs/cli/dumpconfig.md create mode 100644 internal/cli/dumpconfig.go create mode 100644 internal/cli/server/command_test.go delete mode 100644 internal/cli/server/testdata/simple.json rename internal/cli/server/testdata/{simple.hcl => test.hcl} (57%) create mode 100644 internal/cli/server/testdata/test.json create mode 100644 internal/cli/server/testdata/test.toml diff --git a/.goreleaser.yml b/.goreleaser.yml index d09cc43206..7fbc61ca4a 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -90,6 +90,9 @@ nfpms: - src: builder/files/genesis-testnet-v4.json dst: /etc/bor/genesis-testnet-v4.json type: config + - src: builder/files/config.toml + dst: /var/lib/bor/config.toml + type: config overrides: rpm: diff --git a/builder/files/bor.service b/builder/files/bor.service index da0338368c..4b628cbf6e 100644 --- a/builder/files/bor.service +++ b/builder/files/bor.service @@ -6,34 +6,7 @@ [Service] Restart=on-failure RestartSec=5s - ExecStart=/usr/local/bin/bor server \ - --chain=mumbai \ - # --chain=mainnet \ - --datadir /var/lib/bor/data \ - --metrics \ - --metrics.prometheus-addr="127.0.0.1:7071" \ - --syncmode 'full' \ - --miner.gasprice '30000000000' \ - --miner.gaslimit '20000000' \ - --miner.gastarget '20000000' \ - --txpool.nolocals \ - --txpool.accountslots 16 \ - --txpool.globalslots 32768 \ - --txpool.accountqueue 16 \ - --txpool.globalqueue 32768 \ - --txpool.pricelimit '30000000000' \ - --txpool.lifetime '1h30m0s' \ - --bootnodes "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303,enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303" - # Validator params - # Uncomment and configure the following lines in case you run a validator. Don't forget to add backslash (\) - # to previous command line. - # --keystore /var/lib/bor/keystore \ - # --unlock [VALIDATOR ADDRESS] \ - # --password /var/lib/bor/password.txt \ - # --allow-insecure-unlock \ - # --nodiscover --maxpeers 1 \ - # --miner.etherbase [VALIDATOR ADDRESS] \ - # --mine + ExecStart=/usr/local/bin/bor server -config="/var/lib/bor/config.toml" Type=simple User=ubuntu KillSignal=SIGINT diff --git a/builder/files/config.toml b/builder/files/config.toml new file mode 100644 index 0000000000..c55a143ed7 --- /dev/null +++ b/builder/files/config.toml @@ -0,0 +1,44 @@ +# chain = "mumbai" +chain = "mainnet" +datadir = "/var/lib/bor/data" +syncmode = "full" + +[telemetry] +metrics = true +prometheus-addr = "127.0.0.1:7071" + +[miner] +# *** Validator params +# *** Uncomment and configure the following lines in case you run a validator. +# mine = true +# etherbase = "VALIDATOR ADDRESS" +gasprice = "30000000000" +gasceil = 20000000 + + +[txpool] +accountqueue = 16 +accountslots = 16 +globalqueue = 32768 +globalslots = 32768 +lifetime = "1h30m0s" +nolocals = true +pricelimit = 30000000000 + +[p2p] +# *** Validator params +# *** Uncomment and configure the following lines in case you run a validator. +# nodiscover = true +# maxpeers = 1 + [p2p.discovery] + bootnodes = ["enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303", "enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303"] + +# *** Validator params +# *** Uncomment and configure the following lines in case you run a validator. + +# keystore = "/var/lib/bor/keystore" + +# [accounts] +# allow-insecure-unlock = true +# password = "/var/lib/bor/password.txt" +# unlock = ["VALIDATOR ADDRESS"] \ No newline at end of file diff --git a/docs/cli/README.md b/docs/cli/README.md index d92a7b5a05..3bc3daddc5 100644 --- a/docs/cli/README.md +++ b/docs/cli/README.md @@ -26,6 +26,8 @@ - [```debug pprof```](./debug_pprof.md) +- [```dumpconfig```](./dumpconfig.md) + - [```fingerprint```](./fingerprint.md) - [```peers```](./peers.md) diff --git a/docs/cli/dumpconfig.md b/docs/cli/dumpconfig.md new file mode 100644 index 0000000000..0383c47310 --- /dev/null +++ b/docs/cli/dumpconfig.md @@ -0,0 +1,3 @@ +# Dumpconfig + +The ```bor dumpconfig ``` command will export the user provided flags into a configuration file \ No newline at end of file diff --git a/docs/config.md b/docs/config.md index 4f4dec157b..196a0bf388 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1,133 +1,144 @@ # Config -Toml files format used in geth are being deprecated. - -Bor uses uses JSON and [HCL](https://github.com/hashicorp/hcl) formats to create configuration files. This is the format in HCL alongside the default values: - +- The `bor dumpconfig` command prints the default configurations, in the TOML format, on the terminal. + - One can `pipe (>)` this to a file (say `config.toml`) and use it to start bor. + - Command to provide a config file: `bor server -config config.toml` +- Bor uses TOML, HCL, and JSON format config files. +- This is the format of the config file in TOML: + - **NOTE: The values of these following flags are just for reference** + - `config.toml` file: ``` chain = "mainnet" -log-level = "info" -data-dir = "" -sync-mode = "fast" -gc-mode = "full" +identity = "myIdentity" +log-level = "INFO" +datadir = "/var/lib/bor/data" +keystore = "path/to/keystore" +syncmode = "full" +gcmode = "full" snapshot = true ethstats = "" -whitelist = {} - -p2p { - max-peers = 30 - max-pend-peers = 50 - bind = "0.0.0.0" - port = 30303 - no-discover = false - nat = "any" - discovery { - v5-enabled = false - bootnodes = [] - bootnodesv4 = [] - bootnodesv5 = [] - staticNodes = [] - trustedNodes = [] - dns = [] - } -} - -heimdall { - url = "http://localhost:1317" - without = false -} - -txpool { - locals = [] - no-locals = false - journal = "" - rejournal = "1h" - price-limit = 1 - price-bump = 10 - account-slots = 16 - global-slots = 4096 - account-queue = 64 - global-queue = 1024 - lifetime = "3h" -} - -sealer { - enabled = false - etherbase = "" - gas-ceil = 8000000 - extra-data = "" -} - -gpo { - blocks = 20 - percentile = 60 -} - -jsonrpc { - ipc-disable = false - ipc-path = "" - modules = ["web3", "net"] - cors = ["*"] - vhost = ["*"] - - http { - enabled = false - port = 8545 - prefix = "" - host = "localhost" - } - - ws { - enabled = false - port = 8546 - prefix = "" - host = "localhost" - } - - graphqh { - enabled = false - } -} - -telemetry { - enabled = false - expensive = false - - influxdb { - v1-enabled = false - endpoint = "" - database = "" - username = "" - password = "" - v2-enabled = false - token = "" - bucket = "" - organization = "" - } -} - -cache { - cache = 1024 - perc-database = 50 - perc-trie = 15 - perc-gc = 25 - perc-snapshot = 10 - journal = "triecache" - rejournal = "60m" - no-prefetch = false - preimages = false - tx-lookup-limit = 2350000 -} - -accounts { - unlock = [] - password-file = "" - allow-insecure-unlock = false - use-lightweight-kdf = false -} - -grpc { - addr = ":3131" -} + +[p2p] +maxpeers = 30 +maxpendpeers = 50 +bind = "0.0.0.0" +port = 30303 +nodiscover = false +nat = "any" + +[p2p.discovery] +v5disc = false +bootnodes = ["enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", "enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303"] +bootnodesv4 = [] +bootnodesv5 = ["enr:-KG4QOtcP9X1FbIMOe17QNMKqDxCpm14jcX5tiOE4_TyMrFqbmhPZHK_ZPG2Gxb1GE2xdtodOfx9-cgvNtxnRyHEmC0ghGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", "enr:-KG4QDyytgmE4f7AnvW-ZaUOIi9i79qX4JwjRAiXBZCU65wOfBu-3Nb5I7b_Rmg3KCOcZM_C3y5pg7EBU5XGrcLTduQEhGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQ2_DUbiXNlY3AyNTZrMaEDKnz_-ps3UUOfHWVYaskI5kWYO_vtYMGYCQRAR3gHDouDdGNwgiMog3VkcIIjKA"] +static-nodes = ["enode://8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303"] +trusted-nodes = ["enode://2b252ab6a1d0f971d9722cb839a42cb81db019ba44c08754628ab4a823487071b5695317c8ccd085219c3a03af063495b2f1da8d18218da2d6a82981b45e6ffc@65.108.70.101:30303"] +dns = [] + +[heimdall] +url = "http://localhost:1317" +"bor.without" = false + +[txpool] +locals = ["$ADDRESS1", "$ADDRESS2"] +nolocals = false +journal = "" +rejournal = "1h0m0s" +pricelimit = 30000000000 +pricebump = 10 +accountslots = 16 +globalslots = 32768 +accountqueue = 16 +globalqueue = 32768 +lifetime = "3h0m0s" + +[miner] +mine = false +etherbase = "" +extradata = "" +gaslimit = 20000000 +gasprice = "30000000000" + +[jsonrpc] +ipcdisable = false +ipcpath = "/var/lib/bor/bor.ipc" +gascap = 50000000 +txfeecap = 5e+00 + +[jsonrpc.http] +enabled = false +port = 8545 +prefix = "" +host = "localhost" +api = ["eth", "net", "web3", "txpool", "bor"] +vhosts = ["*"] +corsdomain = ["*"] + +[jsonrpc.ws] +enabled = false +port = 8546 +prefix = "" +host = "localhost" +api = ["web3", "net"] +vhosts = ["*"] +corsdomain = ["*"] + +[jsonrpc.graphql] +enabled = false +port = 0 +prefix = "" +host = "" +api = [] +vhosts = ["*"] +corsdomain = ["*"] + +[gpo] +blocks = 20 +percentile = 60 +maxprice = "5000000000000" +ignoreprice = "2" + +[telemetry] +metrics = false +expensive = false +prometheus-addr = "" +opencollector-endpoint = "" + +[telemetry.influx] +influxdb = false +endpoint = "" +database = "" +username = "" +password = "" +influxdbv2 = false +token = "" +bucket = "" +organization = "" + +[cache] +cache = 1024 +gc = 25 +snapshot = 10 +database = 50 +trie = 15 +journal = "triecache" +rejournal = "1h0m0s" +noprefetch = false +preimages = false +txlookuplimit = 2350000 + +[accounts] +unlock = ["$ADDRESS1", "$ADDRESS2"] +password = "path/to/password.txt" +allow-insecure-unlock = false +lightkdf = false +disable-bor-wallet = false + +[grpc] +addr = ":3131" + +[developer] +dev = false +period = 0 ``` diff --git a/go.mod b/go.mod index 1b452a67a1..3f90695d47 100644 --- a/go.mod +++ b/go.mod @@ -83,6 +83,7 @@ require ( require ( github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect + github.com/BurntSushi/toml v1.1.0 // indirect github.com/Masterminds/goutils v1.1.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect diff --git a/go.sum b/go.sum index 374ab3066e..fc58b621e6 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,8 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSu github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= @@ -456,6 +458,10 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= diff --git a/internal/cli/command.go b/internal/cli/command.go index 1ff95b410f..06127a9823 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -82,6 +82,11 @@ func Commands() map[string]MarkDownCommandFactory { UI: ui, }, nil }, + "dumpconfig": func() (MarkDownCommand, error) { + return &DumpconfigCommand{ + Meta2: meta2, + }, nil + }, "debug": func() (MarkDownCommand, error) { return &DebugCommand{ UI: ui, diff --git a/internal/cli/dumpconfig.go b/internal/cli/dumpconfig.go new file mode 100644 index 0000000000..3e4688fc24 --- /dev/null +++ b/internal/cli/dumpconfig.go @@ -0,0 +1,82 @@ +package cli + +import ( + "reflect" + "strings" + + "github.com/naoina/toml" + + "github.com/ethereum/go-ethereum/internal/cli/server" +) + +// These settings ensure that TOML keys use the same names as Go struct fields. +var tomlSettings = toml.Config{ + NormFieldName: func(rt reflect.Type, key string) string { + return key + }, + FieldToKey: func(rt reflect.Type, field string) string { + return field + }, +} + +// DumpconfigCommand is for exporting user provided flags into a config file +type DumpconfigCommand struct { + *Meta2 +} + +// MarkDown implements cli.MarkDown interface +func (p *DumpconfigCommand) MarkDown() string { + items := []string{ + "# Dumpconfig", + "The ```bor dumpconfig ``` command will export the user provided flags into a configuration file", + } + + return strings.Join(items, "\n\n") +} + +// Help implements the cli.Command interface +func (c *DumpconfigCommand) Help() string { + return `Usage: bor dumpconfig + + This command will will export the user provided flags into a configuration file` +} + +// Synopsis implements the cli.Command interface +func (c *DumpconfigCommand) Synopsis() string { + return "Export configuration file" +} + +// TODO: add flags for file location and format (toml, json, hcl) of the configuration file. + +// Run implements the cli.Command interface +func (c *DumpconfigCommand) Run(args []string) int { + // Initialize an empty command instance to get flags + command := server.Command{} + flags := command.Flags() + + if err := flags.Parse(args); err != nil { + c.UI.Error(err.Error()) + return 1 + } + + userConfig := command.GetConfig() + + // convert the big.Int and time.Duration fields to their corresponding Raw fields + userConfig.TxPool.RejournalRaw = userConfig.TxPool.Rejournal.String() + userConfig.TxPool.LifeTimeRaw = userConfig.TxPool.LifeTime.String() + userConfig.Sealer.GasPriceRaw = userConfig.Sealer.GasPrice.String() + userConfig.Gpo.MaxPriceRaw = userConfig.Gpo.MaxPrice.String() + userConfig.Gpo.IgnorePriceRaw = userConfig.Gpo.IgnorePrice.String() + userConfig.Cache.RejournalRaw = userConfig.Cache.Rejournal.String() + + // Currently, the configurations (userConfig) is exported into `toml` file format. + out, err := tomlSettings.Marshal(&userConfig) + if err != nil { + c.UI.Error(err.Error()) + return 1 + } + + c.UI.Output(string(out)) + + return 0 +} diff --git a/internal/cli/flagset/flagset.go b/internal/cli/flagset/flagset.go index 0c19fa9758..d9e204f0e4 100644 --- a/internal/cli/flagset/flagset.go +++ b/internal/cli/flagset/flagset.go @@ -180,14 +180,15 @@ func (b *BigIntFlag) Set(value string) error { var ok bool if strings.HasPrefix(value, "0x") { num, ok = num.SetString(value[2:], 16) + *b.Value = *num } else { num, ok = num.SetString(value, 10) + *b.Value = *num } if !ok { return fmt.Errorf("failed to set big int") } - b.Value = num return nil } @@ -209,6 +210,19 @@ type SliceStringFlag struct { Group string } +// SplitAndTrim splits input separated by a comma +// and trims excessive white space from the substrings. +func SplitAndTrim(input string) (ret []string) { + l := strings.Split(input, ",") + for _, r := range l { + if r = strings.TrimSpace(r); r != "" { + ret = append(ret, r) + } + } + + return ret +} + func (i *SliceStringFlag) String() string { if i.Value == nil { return "" @@ -219,7 +233,7 @@ func (i *SliceStringFlag) String() string { func (i *SliceStringFlag) Set(value string) error { // overwritting insted of appending - *i.Value = strings.Split(value, ",") + *i.Value = SplitAndTrim(value) return nil } diff --git a/internal/cli/server/command.go b/internal/cli/server/command.go index a0b8a6d87c..2995f10f69 100644 --- a/internal/cli/server/command.go +++ b/internal/cli/server/command.go @@ -7,8 +7,9 @@ import ( "strings" "syscall" - "github.com/ethereum/go-ethereum/log" "github.com/mitchellh/cli" + + "github.com/ethereum/go-ethereum/log" ) // Command is the command to start the sever @@ -21,7 +22,7 @@ type Command struct { // final configuration config *Config - configFile []string + configFile string srv *Server } @@ -50,34 +51,57 @@ func (c *Command) Synopsis() string { return "Run the Bor server" } -// Run implements the cli.Command interface -func (c *Command) Run(args []string) int { +func (c *Command) extractFlags(args []string) error { + config := *DefaultConfig() + flags := c.Flags() if err := flags.Parse(args); err != nil { c.UI.Error(err.Error()) - return 1 + c.config = &config + + return err } - // read config file - config := DefaultConfig() - for _, configFile := range c.configFile { - cfg, err := readConfigFile(configFile) + // TODO: Check if this can be removed or not + // read cli flags + if err := config.Merge(c.cliConfig); err != nil { + c.UI.Error(err.Error()) + c.config = &config + + return err + } + // read if config file is provided, this will overwrite the cli flags, if provided + if c.configFile != "" { + log.Warn("Config File provided, this will overwrite the cli flags.", "configFile:", c.configFile) + cfg, err := readConfigFile(c.configFile) if err != nil { c.UI.Error(err.Error()) - return 1 + c.config = &config + + return err } if err := config.Merge(cfg); err != nil { c.UI.Error(err.Error()) - return 1 + c.config = &config + + return err } } - if err := config.Merge(c.cliConfig); err != nil { + + c.config = &config + + return nil +} + +// Run implements the cli.Command interface +func (c *Command) Run(args []string) int { + err := c.extractFlags(args) + if err != nil { c.UI.Error(err.Error()) return 1 } - c.config = config - srv, err := NewServer(config) + srv, err := NewServer(c.config) if err != nil { c.UI.Error(err.Error()) return 1 @@ -112,3 +136,8 @@ func (c *Command) handleSignals() int { } return 1 } + +// GetConfig returns the user specified config +func (c *Command) GetConfig() *Config { + return c.cliConfig +} diff --git a/internal/cli/server/command_test.go b/internal/cli/server/command_test.go new file mode 100644 index 0000000000..9006559d0f --- /dev/null +++ b/internal/cli/server/command_test.go @@ -0,0 +1,50 @@ +package server + +import ( + "math/big" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestFlags(t *testing.T) { + t.Parallel() + + var c Command + + args := []string{ + "--txpool.rejournal", "30m0s", + "--txpool.lifetime", "30m0s", + "--miner.gasprice", "20000000000", + "--gpo.maxprice", "70000000000", + "--gpo.ignoreprice", "1", + "--cache.trie.rejournal", "40m0s", + "--dev", + "--dev.period", "2", + "--datadir", "./data", + "--maxpeers", "30", + "--requiredblocks", "a=b", + "--http.api", "eth,web3,bor", + } + err := c.extractFlags(args) + + require.NoError(t, err) + + txRe, _ := time.ParseDuration("30m0s") + txLt, _ := time.ParseDuration("30m0s") + caRe, _ := time.ParseDuration("40m0s") + + require.Equal(t, c.config.DataDir, "./data") + require.Equal(t, c.config.Developer.Enabled, true) + require.Equal(t, c.config.Developer.Period, uint64(2)) + require.Equal(t, c.config.TxPool.Rejournal, txRe) + require.Equal(t, c.config.TxPool.LifeTime, txLt) + require.Equal(t, c.config.Sealer.GasPrice, big.NewInt(20000000000)) + require.Equal(t, c.config.Gpo.MaxPrice, big.NewInt(70000000000)) + require.Equal(t, c.config.Gpo.IgnorePrice, big.NewInt(1)) + require.Equal(t, c.config.Cache.Rejournal, caRe) + require.Equal(t, c.config.P2P.MaxPeers, uint64(30)) + require.Equal(t, c.config.RequiredBlocks, map[string]string{"a": "b"}) + require.Equal(t, c.config.JsonRPC.Http.API, []string{"eth", "web3", "bor"}) +} diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index fdf253a37e..819ab1aca5 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -14,6 +14,11 @@ import ( godebug "runtime/debug" + "github.com/hashicorp/hcl/v2/hclsimple" + "github.com/imdario/mergo" + "github.com/mitchellh/go-homedir" + gopsutil "github.com/shirou/gopsutil/mem" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" @@ -28,360 +33,356 @@ import ( "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/params" - "github.com/hashicorp/hcl/v2/hclsimple" - "github.com/imdario/mergo" - "github.com/mitchellh/go-homedir" - gopsutil "github.com/shirou/gopsutil/mem" ) type Config struct { chain *chains.Chain // Chain is the chain to sync with - Chain string `hcl:"chain,optional"` + Chain string `hcl:"chain,optional" toml:"chain,optional"` // Identity of the node - Identity string `hcl:"identity,optional"` + Identity string `hcl:"identity,optional" toml:"identity,optional"` // RequiredBlocks is a list of required (block number, hash) pairs to accept - RequiredBlocks map[string]string `hcl:"requiredblocks,optional"` + RequiredBlocks map[string]string `hcl:"requiredblocks,optional" toml:"requiredblocks,optional"` // LogLevel is the level of the logs to put out - LogLevel string `hcl:"log-level,optional"` + LogLevel string `hcl:"log-level,optional" toml:"log-level,optional"` // DataDir is the directory to store the state in - DataDir string `hcl:"data-dir,optional"` + DataDir string `hcl:"datadir,optional" toml:"datadir,optional"` // KeyStoreDir is the directory to store keystores - KeyStoreDir string `hcl:"keystore-dir,optional"` + KeyStoreDir string `hcl:"keystore,optional" toml:"keystore,optional"` // SyncMode selects the sync protocol - SyncMode string `hcl:"sync-mode,optional"` + SyncMode string `hcl:"syncmode,optional" toml:"syncmode,optional"` // GcMode selects the garbage collection mode for the trie - GcMode string `hcl:"gc-mode,optional"` + GcMode string `hcl:"gcmode,optional" toml:"gcmode,optional"` // Snapshot disables/enables the snapshot database mode - Snapshot bool `hcl:"snapshot,optional"` + Snapshot bool `hcl:"snapshot,optional" toml:"snapshot,optional"` // Ethstats is the address of the ethstats server to send telemetry - Ethstats string `hcl:"ethstats,optional"` + Ethstats string `hcl:"ethstats,optional" toml:"ethstats,optional"` // P2P has the p2p network related settings - P2P *P2PConfig `hcl:"p2p,block"` + P2P *P2PConfig `hcl:"p2p,block" toml:"p2p,block"` // Heimdall has the heimdall connection related settings - Heimdall *HeimdallConfig `hcl:"heimdall,block"` + Heimdall *HeimdallConfig `hcl:"heimdall,block" toml:"heimdall,block"` // TxPool has the transaction pool related settings - TxPool *TxPoolConfig `hcl:"txpool,block"` + TxPool *TxPoolConfig `hcl:"txpool,block" toml:"txpool,block"` // Sealer has the validator related settings - Sealer *SealerConfig `hcl:"sealer,block"` + Sealer *SealerConfig `hcl:"miner,block" toml:"miner,block"` // JsonRPC has the json-rpc related settings - JsonRPC *JsonRPCConfig `hcl:"jsonrpc,block"` + JsonRPC *JsonRPCConfig `hcl:"jsonrpc,block" toml:"jsonrpc,block"` // Gpo has the gas price oracle related settings - Gpo *GpoConfig `hcl:"gpo,block"` + Gpo *GpoConfig `hcl:"gpo,block" toml:"gpo,block"` // Telemetry has the telemetry related settings - Telemetry *TelemetryConfig `hcl:"telemetry,block"` + Telemetry *TelemetryConfig `hcl:"telemetry,block" toml:"telemetry,block"` // Cache has the cache related settings - Cache *CacheConfig `hcl:"cache,block"` + Cache *CacheConfig `hcl:"cache,block" toml:"cache,block"` // Account has the validator account related settings - Accounts *AccountsConfig `hcl:"accounts,block"` + Accounts *AccountsConfig `hcl:"accounts,block" toml:"accounts,block"` // GRPC has the grpc server related settings - GRPC *GRPCConfig + GRPC *GRPCConfig `hcl:"grpc,block" toml:"grpc,block"` // Developer has the developer mode related settings - Developer *DeveloperConfig + Developer *DeveloperConfig `hcl:"developer,block" toml:"developer,block"` } type P2PConfig struct { // MaxPeers sets the maximum number of connected peers - MaxPeers uint64 `hcl:"max-peers,optional"` + MaxPeers uint64 `hcl:"maxpeers,optional" toml:"maxpeers,optional"` // MaxPendPeers sets the maximum number of pending connected peers - MaxPendPeers uint64 `hcl:"max-pend-peers,optional"` + MaxPendPeers uint64 `hcl:"maxpendpeers,optional" toml:"maxpendpeers,optional"` // Bind is the bind address - Bind string `hcl:"bind,optional"` + Bind string `hcl:"bind,optional" toml:"bind,optional"` // Port is the port number - Port uint64 `hcl:"port,optional"` + Port uint64 `hcl:"port,optional" toml:"port,optional"` // NoDiscover is used to disable discovery - NoDiscover bool `hcl:"no-discover,optional"` + NoDiscover bool `hcl:"nodiscover,optional" toml:"nodiscover,optional"` // NAT it used to set NAT options - NAT string `hcl:"nat,optional"` + NAT string `hcl:"nat,optional" toml:"nat,optional"` // Discovery has the p2p discovery related settings - Discovery *P2PDiscovery `hcl:"discovery,block"` + Discovery *P2PDiscovery `hcl:"discovery,block" toml:"discovery,block"` } type P2PDiscovery struct { // V5Enabled is used to enable disc v5 discovery mode - V5Enabled bool `hcl:"v5-enabled,optional"` + V5Enabled bool `hcl:"v5disc,optional" toml:"v5disc,optional"` // Bootnodes is the list of initial bootnodes - Bootnodes []string `hcl:"bootnodes,optional"` + Bootnodes []string `hcl:"bootnodes,optional" toml:"bootnodes,optional"` // BootnodesV4 is the list of initial v4 bootnodes - BootnodesV4 []string `hcl:"bootnodesv4,optional"` + BootnodesV4 []string `hcl:"bootnodesv4,optional" toml:"bootnodesv4,optional"` // BootnodesV5 is the list of initial v5 bootnodes - BootnodesV5 []string `hcl:"bootnodesv5,optional"` + BootnodesV5 []string `hcl:"bootnodesv5,optional" toml:"bootnodesv5,optional"` // StaticNodes is the list of static nodes - StaticNodes []string `hcl:"static-nodes,optional"` + StaticNodes []string `hcl:"static-nodes,optional" toml:"static-nodes,optional"` // TrustedNodes is the list of trusted nodes - TrustedNodes []string `hcl:"trusted-nodes,optional"` + TrustedNodes []string `hcl:"trusted-nodes,optional" toml:"trusted-nodes,optional"` // DNS is the list of enrtree:// URLs which will be queried for nodes to connect to - DNS []string `hcl:"dns,optional"` + DNS []string `hcl:"dns,optional" toml:"dns,optional"` } type HeimdallConfig struct { // URL is the url of the heimdall server - URL string `hcl:"url,optional"` + URL string `hcl:"url,optional" toml:"url,optional"` // Without is used to disable remote heimdall during testing - Without bool `hcl:"without,optional"` + Without bool `hcl:"bor.without,optional" toml:"bor.without,optional"` } type TxPoolConfig struct { // Locals are the addresses that should be treated by default as local - Locals []string `hcl:"locals,optional"` + Locals []string `hcl:"locals,optional" toml:"locals,optional"` // NoLocals enables whether local transaction handling should be disabled - NoLocals bool `hcl:"no-locals,optional"` + NoLocals bool `hcl:"nolocals,optional" toml:"nolocals,optional"` // Journal is the path to store local transactions to survive node restarts - Journal string `hcl:"journal,optional"` + Journal string `hcl:"journal,optional" toml:"journal,optional"` // Rejournal is the time interval to regenerate the local transaction journal - Rejournal time.Duration - RejournalRaw string `hcl:"rejournal,optional"` + Rejournal time.Duration `hcl:"-,optional" toml:"-,optional"` + RejournalRaw string `hcl:"rejournal,optional" toml:"rejournal,optional"` // PriceLimit is the minimum gas price to enforce for acceptance into the pool - PriceLimit uint64 `hcl:"price-limit,optional"` + PriceLimit uint64 `hcl:"pricelimit,optional" toml:"pricelimit,optional"` // PriceBump is the minimum price bump percentage to replace an already existing transaction (nonce) - PriceBump uint64 `hcl:"price-bump,optional"` + PriceBump uint64 `hcl:"pricebump,optional" toml:"pricebump,optional"` // AccountSlots is the number of executable transaction slots guaranteed per account - AccountSlots uint64 `hcl:"account-slots,optional"` + AccountSlots uint64 `hcl:"accountslots,optional" toml:"accountslots,optional"` // GlobalSlots is the maximum number of executable transaction slots for all accounts - GlobalSlots uint64 `hcl:"global-slots,optional"` + GlobalSlots uint64 `hcl:"globalslots,optional" toml:"globalslots,optional"` // AccountQueue is the maximum number of non-executable transaction slots permitted per account - AccountQueue uint64 `hcl:"account-queue,optional"` + AccountQueue uint64 `hcl:"accountqueue,optional" toml:"accountqueue,optional"` // GlobalQueueis the maximum number of non-executable transaction slots for all accounts - GlobalQueue uint64 `hcl:"global-queue,optional"` + GlobalQueue uint64 `hcl:"globalqueue,optional" toml:"globalqueue,optional"` - // Lifetime is the maximum amount of time non-executable transaction are queued - LifeTime time.Duration - LifeTimeRaw string `hcl:"lifetime,optional"` + // lifetime is the maximum amount of time non-executable transaction are queued + LifeTime time.Duration `hcl:"-,optional" toml:"-,optional"` + LifeTimeRaw string `hcl:"lifetime,optional" toml:"lifetime,optional"` } type SealerConfig struct { // Enabled is used to enable validator mode - Enabled bool `hcl:"enabled,optional"` + Enabled bool `hcl:"mine,optional" toml:"mine,optional"` // Etherbase is the address of the validator - Etherbase string `hcl:"etherbase,optional"` + Etherbase string `hcl:"etherbase,optional" toml:"etherbase,optional"` // ExtraData is the block extra data set by the miner - ExtraData string `hcl:"extra-data,optional"` + ExtraData string `hcl:"extradata,optional" toml:"extradata,optional"` // GasCeil is the target gas ceiling for mined blocks. - GasCeil uint64 `hcl:"gas-ceil,optional"` + GasCeil uint64 `hcl:"gaslimit,optional" toml:"gaslimit,optional"` // GasPrice is the minimum gas price for mining a transaction - GasPrice *big.Int - GasPriceRaw string `hcl:"gas-price,optional"` + GasPrice *big.Int `hcl:"-,optional" toml:"-,optional"` + GasPriceRaw string `hcl:"gasprice,optional" toml:"gasprice,optional"` } type JsonRPCConfig struct { // IPCDisable enables whether ipc is enabled or not - IPCDisable bool `hcl:"ipc-disable,optional"` + IPCDisable bool `hcl:"ipcdisable,optional" toml:"ipcdisable,optional"` // IPCPath is the path of the ipc endpoint - IPCPath string `hcl:"ipc-path,optional"` + IPCPath string `hcl:"ipcpath,optional" toml:"ipcpath,optional"` // GasCap is the global gas cap for eth-call variants. - GasCap uint64 `hcl:"gas-cap,optional"` + GasCap uint64 `hcl:"gascap,optional" toml:"gascap,optional"` // TxFeeCap is the global transaction fee cap for send-transaction variants - TxFeeCap float64 `hcl:"tx-fee-cap,optional"` + TxFeeCap float64 `hcl:"txfeecap,optional" toml:"txfeecap,optional"` // Http has the json-rpc http related settings - Http *APIConfig `hcl:"http,block"` + Http *APIConfig `hcl:"http,block" toml:"http,block"` // Ws has the json-rpc websocket related settings - Ws *APIConfig `hcl:"ws,block"` + Ws *APIConfig `hcl:"ws,block" toml:"ws,block"` // Graphql has the json-rpc graphql related settings - Graphql *APIConfig `hcl:"graphql,block"` + Graphql *APIConfig `hcl:"graphql,block" toml:"graphql,block"` } type GRPCConfig struct { // Addr is the bind address for the grpc rpc server - Addr string + Addr string `hcl:"addr,optional" toml:"addr,optional"` } type APIConfig struct { // Enabled selects whether the api is enabled - Enabled bool `hcl:"enabled,optional"` + Enabled bool `hcl:"enabled,optional" toml:"enabled,optional"` // Port is the port number for this api - Port uint64 `hcl:"port,optional"` + Port uint64 `hcl:"port,optional" toml:"port,optional"` // Prefix is the http prefix to expose this api - Prefix string `hcl:"prefix,optional"` + Prefix string `hcl:"prefix,optional" toml:"prefix,optional"` // Host is the address to bind the api - Host string `hcl:"host,optional"` + Host string `hcl:"host,optional" toml:"host,optional"` - // Modules is the list of enabled api modules - API []string `hcl:"modules,optional"` + // API is the list of enabled api modules + API []string `hcl:"api,optional" toml:"api,optional"` // VHost is the list of valid virtual hosts - VHost []string `hcl:"vhost,optional"` + VHost []string `hcl:"vhosts,optional" toml:"vhosts,optional"` // Cors is the list of Cors endpoints - Cors []string `hcl:"cors,optional"` + Cors []string `hcl:"corsdomain,optional" toml:"corsdomain,optional"` } type GpoConfig struct { // Blocks is the number of blocks to track to compute the price oracle - Blocks uint64 `hcl:"blocks,optional"` + Blocks uint64 `hcl:"blocks,optional" toml:"blocks,optional"` // Percentile sets the weights to new blocks - Percentile uint64 `hcl:"percentile,optional"` + Percentile uint64 `hcl:"percentile,optional" toml:"percentile,optional"` // MaxPrice is an upper bound gas price - MaxPrice *big.Int - MaxPriceRaw string `hcl:"max-price,optional"` + MaxPrice *big.Int `hcl:"-,optional" toml:"-,optional"` + MaxPriceRaw string `hcl:"maxprice,optional" toml:"maxprice,optional"` // IgnorePrice is a lower bound gas price - IgnorePrice *big.Int - IgnorePriceRaw string `hcl:"ignore-price,optional"` + IgnorePrice *big.Int `hcl:"-,optional" toml:"-,optional"` + IgnorePriceRaw string `hcl:"ignoreprice,optional" toml:"ignoreprice,optional"` } type TelemetryConfig struct { // Enabled enables metrics - Enabled bool `hcl:"enabled,optional"` + Enabled bool `hcl:"metrics,optional" toml:"metrics,optional"` // Expensive enables expensive metrics - Expensive bool `hcl:"expensive,optional"` + Expensive bool `hcl:"expensive,optional" toml:"expensive,optional"` // InfluxDB has the influxdb related settings - InfluxDB *InfluxDBConfig `hcl:"influx,block"` + InfluxDB *InfluxDBConfig `hcl:"influx,block" toml:"influx,block"` // Prometheus Address - PrometheusAddr string `hcl:"prometheus-addr,optional"` + PrometheusAddr string `hcl:"prometheus-addr,optional" toml:"prometheus-addr,optional"` // Open collector endpoint - OpenCollectorEndpoint string `hcl:"opencollector-endpoint,optional"` + OpenCollectorEndpoint string `hcl:"opencollector-endpoint,optional" toml:"opencollector-endpoint,optional"` } type InfluxDBConfig struct { // V1Enabled enables influx v1 mode - V1Enabled bool `hcl:"v1-enabled,optional"` + V1Enabled bool `hcl:"influxdb,optional" toml:"influxdb,optional"` // Endpoint is the url endpoint of the influxdb service - Endpoint string `hcl:"endpoint,optional"` + Endpoint string `hcl:"endpoint,optional" toml:"endpoint,optional"` // Database is the name of the database in Influxdb to store the metrics. - Database string `hcl:"database,optional"` + Database string `hcl:"database,optional" toml:"database,optional"` // Enabled is the username to authorize access to Influxdb - Username string `hcl:"username,optional"` + Username string `hcl:"username,optional" toml:"username,optional"` // Password is the password to authorize access to Influxdb - Password string `hcl:"password,optional"` + Password string `hcl:"password,optional" toml:"password,optional"` // Tags are tags attaches to all generated metrics - Tags map[string]string `hcl:"tags,optional"` + Tags map[string]string `hcl:"tags,optional" toml:"tags,optional"` // Enabled enables influx v2 mode - V2Enabled bool `hcl:"v2-enabled,optional"` + V2Enabled bool `hcl:"influxdbv2,optional" toml:"influxdbv2,optional"` // Token is the token to authorize access to Influxdb V2. - Token string `hcl:"token,optional"` + Token string `hcl:"token,optional" toml:"token,optional"` // Bucket is the bucket to store metrics in Influxdb V2. - Bucket string `hcl:"bucket,optional"` + Bucket string `hcl:"bucket,optional" toml:"bucket,optional"` // Organization is the name of the organization for Influxdb V2. - Organization string `hcl:"organization,optional"` + Organization string `hcl:"organization,optional" toml:"organization,optional"` } type CacheConfig struct { // Cache is the amount of cache of the node - Cache uint64 `hcl:"cache,optional"` + Cache uint64 `hcl:"cache,optional" toml:"cache,optional"` // PercGc is percentage of cache used for garbage collection - PercGc uint64 `hcl:"perc-gc,optional"` + PercGc uint64 `hcl:"gc,optional" toml:"gc,optional"` // PercSnapshot is percentage of cache used for snapshots - PercSnapshot uint64 `hcl:"perc-snapshot,optional"` + PercSnapshot uint64 `hcl:"snapshot,optional" toml:"snapshot,optional"` // PercDatabase is percentage of cache used for the database - PercDatabase uint64 `hcl:"perc-database,optional"` + PercDatabase uint64 `hcl:"database,optional" toml:"database,optional"` // PercTrie is percentage of cache used for the trie - PercTrie uint64 `hcl:"perc-trie,optional"` + PercTrie uint64 `hcl:"trie,optional" toml:"trie,optional"` // Journal is the disk journal directory for trie cache to survive node restarts - Journal string `hcl:"journal,optional"` + Journal string `hcl:"journal,optional" toml:"journal,optional"` // Rejournal is the time interval to regenerate the journal for clean cache - Rejournal time.Duration - RejournalRaw string `hcl:"rejournal,optional"` + Rejournal time.Duration `hcl:"-,optional" toml:"-,optional"` + RejournalRaw string `hcl:"rejournal,optional" toml:"rejournal,optional"` // NoPrefetch is used to disable prefetch of tries - NoPrefetch bool `hcl:"no-prefetch,optional"` + NoPrefetch bool `hcl:"noprefetch,optional" toml:"noprefetch,optional"` // Preimages is used to enable the track of hash preimages - Preimages bool `hcl:"preimages,optional"` + Preimages bool `hcl:"preimages,optional" toml:"preimages,optional"` // TxLookupLimit sets the maximum number of blocks from head whose tx indices are reserved. - TxLookupLimit uint64 `hcl:"tx-lookup-limit,optional"` + TxLookupLimit uint64 `hcl:"txlookuplimit,optional" toml:"txlookuplimit,optional"` } type AccountsConfig struct { // Unlock is the list of addresses to unlock in the node - Unlock []string `hcl:"unlock,optional"` + Unlock []string `hcl:"unlock,optional" toml:"unlock,optional"` // PasswordFile is the file where the account passwords are stored - PasswordFile string `hcl:"password-file,optional"` + PasswordFile string `hcl:"password,optional" toml:"password,optional"` // AllowInsecureUnlock allows user to unlock accounts in unsafe http environment. - AllowInsecureUnlock bool `hcl:"allow-insecure-unlock,optional"` + AllowInsecureUnlock bool `hcl:"allow-insecure-unlock,optional" toml:"allow-insecure-unlock,optional"` // UseLightweightKDF enables a faster but less secure encryption of accounts - UseLightweightKDF bool `hcl:"use-lightweight-kdf,optional"` + UseLightweightKDF bool `hcl:"lightkdf,optional" toml:"lightkdf,optional"` // DisableBorWallet disables the personal wallet endpoints - DisableBorWallet bool `hcl:"disable-bor-wallet,optional"` + DisableBorWallet bool `hcl:"disable-bor-wallet,optional" toml:"disable-bor-wallet,optional"` } type DeveloperConfig struct { // Enabled enables the developer mode - Enabled bool `hcl:"dev,optional"` + Enabled bool `hcl:"dev,optional" toml:"dev,optional"` // Period is the block period to use in developer mode - Period uint64 `hcl:"period,optional"` + Period uint64 `hcl:"period,optional" toml:"period,optional"` } func DefaultConfig() *Config { @@ -419,14 +420,14 @@ func DefaultConfig() *Config { Locals: []string{}, NoLocals: false, Journal: "", - Rejournal: time.Duration(1 * time.Hour), + Rejournal: 1 * time.Hour, PriceLimit: 30000000000, PriceBump: 10, AccountSlots: 16, GlobalSlots: 32768, AccountQueue: 16, GlobalQueue: 32768, - LifeTime: time.Duration(3 * time.Hour), + LifeTime: 3 * time.Hour, }, Sealer: &SealerConfig{ Enabled: false, @@ -526,7 +527,7 @@ func (c *Config) fillBigInt() error { }{ {"gpo.maxprice", &c.Gpo.MaxPrice, &c.Gpo.MaxPriceRaw}, {"gpo.ignoreprice", &c.Gpo.IgnorePrice, &c.Gpo.IgnorePriceRaw}, - {"sealer.gasprice", &c.Sealer.GasPrice, &c.Sealer.GasPriceRaw}, + {"miner.gasprice", &c.Sealer.GasPrice, &c.Sealer.GasPriceRaw}, } for _, x := range tds { @@ -582,13 +583,7 @@ func (c *Config) fillTimeDurations() error { func readConfigFile(path string) (*Config, error) { ext := filepath.Ext(path) if ext == ".toml" { - // read file and apply the legacy config - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - - return readLegacyConfig(data) + return readLegacyConfig(path) } config := &Config{ @@ -1076,7 +1071,7 @@ func Hostname() string { func MakePasswordListFromFile(path string) ([]string, error) { text, err := ioutil.ReadFile(path) if err != nil { - return nil, fmt.Errorf("Failed to read password file: %v", err) + return nil, fmt.Errorf("failed to read password file: %v", err) } lines := strings.Split(string(text), "\n") diff --git a/internal/cli/server/config_legacy.go b/internal/cli/server/config_legacy.go index 0d96b2e023..50508a58b6 100644 --- a/internal/cli/server/config_legacy.go +++ b/internal/cli/server/config_legacy.go @@ -1,33 +1,33 @@ package server import ( - "bytes" + "fmt" + "io/ioutil" - "github.com/naoina/toml" + "github.com/BurntSushi/toml" ) -type legacyConfig struct { - Node struct { - P2P struct { - StaticNodes []string - TrustedNodes []string - } +func readLegacyConfig(path string) (*Config, error) { + data, err := ioutil.ReadFile(path) + tomlData := string(data) + + if err != nil { + return nil, fmt.Errorf("failed to read toml config file: %v", err) } -} -func (l *legacyConfig) Config() *Config { - c := DefaultConfig() - c.P2P.Discovery.StaticNodes = l.Node.P2P.StaticNodes - c.P2P.Discovery.TrustedNodes = l.Node.P2P.TrustedNodes - return c -} + var conf Config + + if _, err := toml.Decode(tomlData, &conf); err != nil { + return nil, fmt.Errorf("failed to decode toml config file: %v", err) + } -func readLegacyConfig(data []byte) (*Config, error) { - var legacy legacyConfig + if err := conf.fillBigInt(); err != nil { + return nil, err + } - r := toml.NewDecoder(bytes.NewReader(data)) - if err := r.Decode(&legacy); err != nil { + if err := conf.fillTimeDurations(); err != nil { return nil, err } - return legacy.Config(), nil + + return &conf, nil } diff --git a/internal/cli/server/config_legacy_test.go b/internal/cli/server/config_legacy_test.go index 399481fc9b..6fb662d62b 100644 --- a/internal/cli/server/config_legacy_test.go +++ b/internal/cli/server/config_legacy_test.go @@ -1,21 +1,50 @@ package server import ( + "math/big" "testing" + "time" "github.com/stretchr/testify/assert" ) func TestConfigLegacy(t *testing.T) { - toml := `[Node.P2P] -StaticNodes = ["node1"] -TrustedNodes = ["node2"]` - config, err := readLegacyConfig([]byte(toml)) - if err != nil { - t.Fatal(err) + readFile := func(path string) { + config, err := readLegacyConfig(path) + assert.NoError(t, err) + + assert.Equal(t, config, &Config{ + DataDir: "./data", + RequiredBlocks: map[string]string{ + "a": "b", + }, + P2P: &P2PConfig{ + MaxPeers: 30, + }, + TxPool: &TxPoolConfig{ + Locals: []string{}, + Rejournal: 1 * time.Hour, + LifeTime: 1 * time.Second, + }, + Gpo: &GpoConfig{ + MaxPrice: big.NewInt(100), + IgnorePrice: big.NewInt(2), + }, + Sealer: &SealerConfig{ + Enabled: false, + GasCeil: 20000000, + GasPrice: big.NewInt(30000000000), + }, + Cache: &CacheConfig{ + Cache: 1024, + Rejournal: 1 * time.Hour, + }, + }) } - assert.Equal(t, config.P2P.Discovery.StaticNodes, []string{"node1"}) - assert.Equal(t, config.P2P.Discovery.TrustedNodes, []string{"node2"}) + // read file in hcl format + t.Run("toml", func(t *testing.T) { + readFile("./testdata/test.toml") + }) } diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index c1c6c4ef4a..bf7787ac2e 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -115,7 +115,7 @@ func TestConfigLoadFile(t *testing.T) { MaxPeers: 30, }, TxPool: &TxPoolConfig{ - LifeTime: time.Duration(1 * time.Second), + LifeTime: 1 * time.Second, }, Gpo: &GpoConfig{ MaxPrice: big.NewInt(100), @@ -127,12 +127,12 @@ func TestConfigLoadFile(t *testing.T) { // read file in hcl format t.Run("hcl", func(t *testing.T) { - readFile("./testdata/simple.hcl") + readFile("./testdata/test.hcl") }) // read file in json format t.Run("json", func(t *testing.T) { - readFile("./testdata/simple.json") + readFile("./testdata/test.json") }) } diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index e85428b9ee..bbc7f44036 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -38,7 +38,7 @@ func (c *Command) Flags() *flagset.Flagset { Usage: "Path of the directory to store keystores", Value: &c.cliConfig.KeyStoreDir, }) - f.SliceStringFlag(&flagset.SliceStringFlag{ + f.StringFlag(&flagset.StringFlag{ Name: "config", Usage: "File for the config file", Value: &c.configFile, diff --git a/internal/cli/server/proto/server.pb.go b/internal/cli/server/proto/server.pb.go index 5512d83b72..3e928ac170 100644 --- a/internal/cli/server/proto/server.pb.go +++ b/internal/cli/server/proto/server.pb.go @@ -7,11 +7,12 @@ package proto import ( + reflect "reflect" + sync "sync" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" ) const ( diff --git a/internal/cli/server/proto/server_grpc.pb.go b/internal/cli/server/proto/server_grpc.pb.go index 63f1fa6187..bd4ecb660d 100644 --- a/internal/cli/server/proto/server_grpc.pb.go +++ b/internal/cli/server/proto/server_grpc.pb.go @@ -8,6 +8,7 @@ package proto import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/internal/cli/server/service_test.go b/internal/cli/server/service_test.go index 7850525686..86cf68e75e 100644 --- a/internal/cli/server/service_test.go +++ b/internal/cli/server/service_test.go @@ -4,8 +4,9 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/internal/cli/server/proto" "github.com/stretchr/testify/assert" + + "github.com/ethereum/go-ethereum/internal/cli/server/proto" ) func TestGatherBlocks(t *testing.T) { diff --git a/internal/cli/server/testdata/simple.json b/internal/cli/server/testdata/simple.json deleted file mode 100644 index 6270ee6d13..0000000000 --- a/internal/cli/server/testdata/simple.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "data-dir": "./data", - "requiredblocks": { - "a": "b" - }, - "p2p": { - "max-peers": 30 - }, - "txpool": { - "lifetime": "1s" - }, - "gpo": { - "max-price": "100" - } -} \ No newline at end of file diff --git a/internal/cli/server/testdata/simple.hcl b/internal/cli/server/testdata/test.hcl similarity index 57% rename from internal/cli/server/testdata/simple.hcl rename to internal/cli/server/testdata/test.hcl index 5afc091859..208fdc51c1 100644 --- a/internal/cli/server/testdata/simple.hcl +++ b/internal/cli/server/testdata/test.hcl @@ -1,11 +1,11 @@ -data-dir = "./data" +datadir = "./data" requiredblocks = { a = "b" } p2p { - max-peers = 30 + maxpeers = 30 } txpool { @@ -13,5 +13,5 @@ txpool { } gpo { - max-price = "100" -} + maxprice = "100" +} \ No newline at end of file diff --git a/internal/cli/server/testdata/test.json b/internal/cli/server/testdata/test.json new file mode 100644 index 0000000000..467835e755 --- /dev/null +++ b/internal/cli/server/testdata/test.json @@ -0,0 +1,15 @@ +{ + "datadir": "./data", + "requiredblocks": { + "a": "b" + }, + "p2p": { + "maxpeers": 30 + }, + "txpool": { + "lifetime": "1s" + }, + "gpo": { + "maxprice": "100" + } +} \ No newline at end of file diff --git a/internal/cli/server/testdata/test.toml b/internal/cli/server/testdata/test.toml new file mode 100644 index 0000000000..81fc4c4630 --- /dev/null +++ b/internal/cli/server/testdata/test.toml @@ -0,0 +1,25 @@ +datadir = "./data" + +[requiredblocks] +a = "b" + +[p2p] +maxpeers = 30 + +[txpool] +locals = [] +rejournal = "1h0m0s" +lifetime = "1s" + +[miner] +mine = false +gaslimit = 20000000 +gasprice = "30000000000" + +[gpo] +maxprice = "100" +ignoreprice = "2" + +[cache] +cache = 1024 +rejournal = "1h0m0s" From 8378cc9ecb9159b7a35027eca22aa273b67b0fb3 Mon Sep 17 00:00:00 2001 From: Jerry Date: Thu, 28 Jul 2022 12:33:23 -0700 Subject: [PATCH 140/190] Add 'bor' user during package installation --- .goreleaser.yml | 9 +++++++++ builder/files/bor-post-install.sh | 9 +++++++++ builder/files/bor.service | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 builder/files/bor-post-install.sh diff --git a/.goreleaser.yml b/.goreleaser.yml index 7fbc61ca4a..acafc4abc0 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -75,12 +75,18 @@ nfpms: description: Polygon Blockchain license: GPLv3 LGPLv3 + bindir: /usr/local/bin + formats: - apk - deb - rpm contents: + - dst: /var/lib/bor + type: dir + file_info: + mode: 0777 - src: builder/files/bor.service dst: /lib/systemd/system/bor.service type: config @@ -94,6 +100,9 @@ nfpms: dst: /var/lib/bor/config.toml type: config + scripts: + postinstall: builder/files/bor-post-install.sh + overrides: rpm: replacements: diff --git a/builder/files/bor-post-install.sh b/builder/files/bor-post-install.sh new file mode 100644 index 0000000000..1419479983 --- /dev/null +++ b/builder/files/bor-post-install.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -e + +PKG="bor" + +if ! getent passwd $PKG >/dev/null ; then + adduser --disabled-password --disabled-login --shell /usr/sbin/nologin --quiet --system --no-create-home --home /nonexistent $PKG + echo "Created system user $PKG" +fi diff --git a/builder/files/bor.service b/builder/files/bor.service index 4b628cbf6e..2deff3dbc9 100644 --- a/builder/files/bor.service +++ b/builder/files/bor.service @@ -8,7 +8,7 @@ RestartSec=5s ExecStart=/usr/local/bin/bor server -config="/var/lib/bor/config.toml" Type=simple - User=ubuntu + User=bor KillSignal=SIGINT TimeoutStopSec=120 From 694dc02a0196d947266355b6560a5c5004aac9e8 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Fri, 29 Jul 2022 17:30:25 +0530 Subject: [PATCH 141/190] fixed the bug caused by fillBigInt and FillTime.Duration functions (#474) --- internal/cli/server/config_legacy.go | 2 +- internal/cli/server/config_legacy_test.go | 130 ++++++++++++++++++++-- 2 files changed, 120 insertions(+), 12 deletions(-) diff --git a/internal/cli/server/config_legacy.go b/internal/cli/server/config_legacy.go index 50508a58b6..9411b8290d 100644 --- a/internal/cli/server/config_legacy.go +++ b/internal/cli/server/config_legacy.go @@ -15,7 +15,7 @@ func readLegacyConfig(path string) (*Config, error) { return nil, fmt.Errorf("failed to read toml config file: %v", err) } - var conf Config + conf := *DefaultConfig() if _, err := toml.Decode(tomlData, &conf); err != nil { return nil, fmt.Errorf("failed to decode toml config file: %v", err) diff --git a/internal/cli/server/config_legacy_test.go b/internal/cli/server/config_legacy_test.go index 6fb662d62b..1b52096216 100644 --- a/internal/cli/server/config_legacy_test.go +++ b/internal/cli/server/config_legacy_test.go @@ -6,6 +6,8 @@ import ( "time" "github.com/stretchr/testify/assert" + + "github.com/ethereum/go-ethereum/eth/ethconfig" ) func TestConfigLegacy(t *testing.T) { @@ -15,30 +17,136 @@ func TestConfigLegacy(t *testing.T) { assert.NoError(t, err) assert.Equal(t, config, &Config{ - DataDir: "./data", + Chain: "mainnet", + Identity: Hostname(), RequiredBlocks: map[string]string{ "a": "b", }, + LogLevel: "INFO", + DataDir: "./data", P2P: &P2PConfig{ - MaxPeers: 30, + MaxPeers: 30, + MaxPendPeers: 50, + Bind: "0.0.0.0", + Port: 30303, + NoDiscover: false, + NAT: "any", + Discovery: &P2PDiscovery{ + V5Enabled: false, + Bootnodes: []string{}, + BootnodesV4: []string{}, + BootnodesV5: []string{}, + StaticNodes: []string{}, + TrustedNodes: []string{}, + DNS: []string{}, + }, + }, + Heimdall: &HeimdallConfig{ + URL: "http://localhost:1317", + Without: false, }, + SyncMode: "full", + GcMode: "full", + Snapshot: true, TxPool: &TxPoolConfig{ - Locals: []string{}, - Rejournal: 1 * time.Hour, - LifeTime: 1 * time.Second, + Locals: []string{}, + NoLocals: false, + Journal: "", + Rejournal: 1 * time.Hour, + PriceLimit: 30000000000, + PriceBump: 10, + AccountSlots: 16, + GlobalSlots: 32768, + AccountQueue: 16, + GlobalQueue: 32768, + LifeTime: 1 * time.Second, + }, + Sealer: &SealerConfig{ + Enabled: false, + Etherbase: "", + GasCeil: 20000000, + GasPrice: big.NewInt(30000000000), + ExtraData: "", }, Gpo: &GpoConfig{ + Blocks: 20, + Percentile: 60, MaxPrice: big.NewInt(100), IgnorePrice: big.NewInt(2), }, - Sealer: &SealerConfig{ - Enabled: false, - GasCeil: 20000000, - GasPrice: big.NewInt(30000000000), + JsonRPC: &JsonRPCConfig{ + IPCDisable: false, + IPCPath: "", + GasCap: ethconfig.Defaults.RPCGasCap, + TxFeeCap: ethconfig.Defaults.RPCTxFeeCap, + Http: &APIConfig{ + Enabled: false, + Port: 8545, + Prefix: "", + Host: "localhost", + API: []string{"eth", "net", "web3", "txpool", "bor"}, + Cors: []string{"*"}, + VHost: []string{"*"}, + }, + Ws: &APIConfig{ + Enabled: false, + Port: 8546, + Prefix: "", + Host: "localhost", + API: []string{"web3", "net"}, + Cors: []string{"*"}, + VHost: []string{"*"}, + }, + Graphql: &APIConfig{ + Enabled: false, + Cors: []string{"*"}, + VHost: []string{"*"}, + }, + }, + Ethstats: "", + Telemetry: &TelemetryConfig{ + Enabled: false, + Expensive: false, + PrometheusAddr: "", + OpenCollectorEndpoint: "", + InfluxDB: &InfluxDBConfig{ + V1Enabled: false, + Endpoint: "", + Database: "", + Username: "", + Password: "", + Tags: map[string]string{}, + V2Enabled: false, + Token: "", + Bucket: "", + Organization: "", + }, }, Cache: &CacheConfig{ - Cache: 1024, - Rejournal: 1 * time.Hour, + Cache: 1024, + PercDatabase: 50, + PercTrie: 15, + PercGc: 25, + PercSnapshot: 10, + Journal: "triecache", + Rejournal: 1 * time.Hour, + NoPrefetch: false, + Preimages: false, + TxLookupLimit: 2350000, + }, + Accounts: &AccountsConfig{ + Unlock: []string{}, + PasswordFile: "", + AllowInsecureUnlock: false, + UseLightweightKDF: false, + DisableBorWallet: false, + }, + GRPC: &GRPCConfig{ + Addr: ":3131", + }, + Developer: &DeveloperConfig{ + Enabled: false, + Period: 0, }, }) } From 18fafc01c673c4996748072d804981f13953fb88 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 4 Aug 2022 12:42:50 +0530 Subject: [PATCH 142/190] disable bor wallet by default --- internal/cli/server/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 819ab1aca5..34ad0e60f7 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -507,7 +507,7 @@ func DefaultConfig() *Config { PasswordFile: "", AllowInsecureUnlock: false, UseLightweightKDF: false, - DisableBorWallet: false, + DisableBorWallet: true, }, GRPC: &GRPCConfig{ Addr: ":3131", From ba184918413bac197a53914693fdd0728cfd182a Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 4 Aug 2022 16:33:30 +0530 Subject: [PATCH 143/190] fix: tests --- internal/cli/server/config_legacy_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cli/server/config_legacy_test.go b/internal/cli/server/config_legacy_test.go index 1b52096216..a8127915a1 100644 --- a/internal/cli/server/config_legacy_test.go +++ b/internal/cli/server/config_legacy_test.go @@ -139,7 +139,7 @@ func TestConfigLegacy(t *testing.T) { PasswordFile: "", AllowInsecureUnlock: false, UseLightweightKDF: false, - DisableBorWallet: false, + DisableBorWallet: true, }, GRPC: &GRPCConfig{ Addr: ":3131", From 10c1ff2a7434246aba9e6ec3197bd3996dd2c5a8 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Tue, 9 Aug 2022 09:16:42 +0530 Subject: [PATCH 144/190] internal/cli: add support for removedb (#478) * internal/cli: add support for removedb * update docs * internal/cli: use constant path, handle err --- docs/cli/README.md | 2 + docs/cli/removedb.md | 7 ++ internal/cli/command.go | 5 ++ internal/cli/removedb.go | 154 ++++++++++++++++++++++++++++++++++ internal/cli/server/config.go | 4 +- 5 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 docs/cli/removedb.md create mode 100644 internal/cli/removedb.go diff --git a/docs/cli/README.md b/docs/cli/README.md index 3bc3daddc5..bf37d6ef56 100644 --- a/docs/cli/README.md +++ b/docs/cli/README.md @@ -40,6 +40,8 @@ - [```peers status```](./peers_status.md) +- [```removedb```](./removedb.md) + - [```server```](./server.md) - [```status```](./status.md) diff --git a/docs/cli/removedb.md b/docs/cli/removedb.md new file mode 100644 index 0000000000..3c6e84f1d6 --- /dev/null +++ b/docs/cli/removedb.md @@ -0,0 +1,7 @@ +# RemoveDB + +The ```bor removedb``` command will remove the blockchain and state databases at the given datadir location + +## Options + +- ```datadir```: Path of the data directory to store information diff --git a/internal/cli/command.go b/internal/cli/command.go index 06127a9823..93dca4cb3e 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -184,6 +184,11 @@ func Commands() map[string]MarkDownCommandFactory { UI: ui, }, nil }, + "removedb": func() (MarkDownCommand, error) { + return &RemoveDBCommand{ + Meta2: meta2, + }, nil + }, } } diff --git a/internal/cli/removedb.go b/internal/cli/removedb.go new file mode 100644 index 0000000000..4a604086ed --- /dev/null +++ b/internal/cli/removedb.go @@ -0,0 +1,154 @@ +package cli + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/internal/cli/flagset" + "github.com/ethereum/go-ethereum/internal/cli/server" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + + "github.com/mitchellh/cli" +) + +// RemoveDBCommand is for removing blockchain and state databases +type RemoveDBCommand struct { + *Meta2 + + datadir string +} + +const ( + chaindataPath string = "chaindata" + ancientPath string = "ancient" + lightchaindataPath string = "lightchaindata" +) + +// MarkDown implements cli.MarkDown interface +func (c *RemoveDBCommand) MarkDown() string { + items := []string{ + "# RemoveDB", + "The ```bor removedb``` command will remove the blockchain and state databases at the given datadir location", + c.Flags().MarkDown(), + } + + return strings.Join(items, "\n\n") +} + +// Help implements the cli.Command interface +func (c *RemoveDBCommand) Help() string { + return `Usage: bor removedb + + This command will remove the blockchain and state databases at the given datadir location` +} + +// Synopsis implements the cli.Command interface +func (c *RemoveDBCommand) Synopsis() string { + return "Remove blockchain and state databases" +} + +func (c *RemoveDBCommand) Flags() *flagset.Flagset { + flags := c.NewFlagSet("removedb") + + flags.StringFlag(&flagset.StringFlag{ + Name: "datadir", + Value: &c.datadir, + Usage: "Path of the data directory to store information", + }) + + return flags +} + +// Run implements the cli.Command interface +func (c *RemoveDBCommand) Run(args []string) int { + flags := c.Flags() + + // parse datadir + if err := flags.Parse(args); err != nil { + c.UI.Error(err.Error()) + return 1 + } + + datadir := c.datadir + if datadir == "" { + datadir = server.DefaultDataDir() + } + + // create ethereum node config with just the datadir + nodeCfg := &node.Config{DataDir: datadir} + + // Remove the full node state database + path := nodeCfg.ResolvePath(chaindataPath) + if common.FileExist(path) { + confirmAndRemoveDB(c.UI, path, "full node state database") + } else { + log.Info("Full node state database missing", "path", path) + } + + // Remove the full node ancient database + // Note: The old cli used DatabaseFreezer path from config if provided explicitly + // We don't have access to eth config and hence we assume it to be + // under the "chaindata" folder. + path = filepath.Join(nodeCfg.ResolvePath(chaindataPath), ancientPath) + if common.FileExist(path) { + confirmAndRemoveDB(c.UI, path, "full node ancient database") + } else { + log.Info("Full node ancient database missing", "path", path) + } + + // Remove the light node database + path = nodeCfg.ResolvePath(lightchaindataPath) + if common.FileExist(path) { + confirmAndRemoveDB(c.UI, path, "light node database") + } else { + log.Info("Light node database missing", "path", path) + } + + return 0 +} + +// confirmAndRemoveDB prompts the user for a last confirmation and removes the +// folder if accepted. +func confirmAndRemoveDB(ui cli.Ui, database string, kind string) { + for { + confirm, err := ui.Ask(fmt.Sprintf("Remove %s (%s)? [y/n]", kind, database)) + + switch { + case err != nil: + ui.Output(err.Error()) + return + case confirm != "": + switch strings.ToLower(confirm) { + case "y": + start := time.Now() + err = filepath.Walk(database, func(path string, info os.FileInfo, err error) error { + // If we're at the top level folder, recurse into + if path == database { + return nil + } + // Delete all the files, but not subfolders + if !info.IsDir() { + return os.Remove(path) + } + return filepath.SkipDir + }) + + if err != nil && err != filepath.SkipDir { + ui.Output(err.Error()) + } else { + log.Info("Database successfully deleted", "path", database, "elapsed", common.PrettyDuration(time.Since(start))) + } + + return + case "n": + log.Info("Database deletion skipped", "path", database) + return + } + } + } +} diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 34ad0e60f7..faa8452742 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -391,7 +391,7 @@ func DefaultConfig() *Config { Identity: Hostname(), RequiredBlocks: map[string]string{}, LogLevel: "INFO", - DataDir: defaultDataDir(), + DataDir: DefaultDataDir(), P2P: &P2PConfig{ MaxPeers: 30, MaxPendPeers: 50, @@ -1035,7 +1035,7 @@ func parseBootnodes(urls []string) ([]*enode.Node, error) { return dst, nil } -func defaultDataDir() string { +func DefaultDataDir() string { // Try to place the data folder in the user's home dir home, _ := homedir.Dir() if home == "" { From 0b28230c22b907cad39872de97602b8f2ea39f85 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Wed, 17 Aug 2022 12:01:53 +0530 Subject: [PATCH 145/190] updated config.toml in builder/files, added all fields and commented those which are not used (#491) --- builder/files/config.toml | 157 ++++++++++++++++++++++++++++++-------- 1 file changed, 125 insertions(+), 32 deletions(-) diff --git a/builder/files/config.toml b/builder/files/config.toml index c55a143ed7..d8503e4351 100644 --- a/builder/files/config.toml +++ b/builder/files/config.toml @@ -1,44 +1,137 @@ -# chain = "mumbai" +# NOTE: Uncomment and configure the following 8 fields in case you run a validator: +# `mine`, `etherbase`, `nodiscover`, `maxpeers`, `keystore`, `allow-insecure-unlock`, `password`, `unlock` + chain = "mainnet" +# chain = "mumbai" +# identity = "Pratiks-MacBook-Pro.local" +# log-level = "INFO" datadir = "/var/lib/bor/data" +# keystore = "/var/lib/bor/keystore" syncmode = "full" +# gcmode = "full" +# snapshot = true +# ethstats = "" -[telemetry] -metrics = true -prometheus-addr = "127.0.0.1:7071" +# [requiredblocks] -[miner] -# *** Validator params -# *** Uncomment and configure the following lines in case you run a validator. -# mine = true -# etherbase = "VALIDATOR ADDRESS" -gasprice = "30000000000" -gasceil = 20000000 +[p2p] + # maxpeers = 1 + # nodiscover = true + # maxpendpeers = 50 + # bind = "0.0.0.0" + # port = 30303 + # nat = "any" + [p2p.discovery] + # v5disc = false + bootnodes = ["enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303", "enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303"] + # Uncomment below `bootnodes` field for Mumbai bootnode + # bootnodes = ["enode://095c4465fe509bd7107bbf421aea0d3ad4d4bfc3ff8f9fdc86f4f950892ae3bbc3e5c715343c4cf60c1c06e088e621d6f1b43ab9130ae56c2cacfd356a284ee4@18.213.200.99:30303"] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" [txpool] -accountqueue = 16 -accountslots = 16 -globalqueue = 32768 -globalslots = 32768 -lifetime = "1h30m0s" -nolocals = true -pricelimit = 30000000000 + nolocals = true + pricelimit = 30000000000 + accountslots = 16 + globalslots = 32768 + accountqueue = 16 + globalqueue = 32768 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricebump = 10 -[p2p] -# *** Validator params -# *** Uncomment and configure the following lines in case you run a validator. -# nodiscover = true -# maxpeers = 1 - [p2p.discovery] - bootnodes = ["enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303", "enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303"] +[miner] + gaslimit = 20000000 + gasprice = "30000000000" + # mine = true + # etherbase = "VALIDATOR ADDRESS" + # extradata = "" -# *** Validator params -# *** Uncomment and configure the following lines in case you run a validator. -# keystore = "/var/lib/bor/keystore" +# [jsonrpc] + # ipcdisable = false + # ipcpath = "" + # gascap = 50000000 + # txfeecap = 5.0 + # [jsonrpc.http] + # enabled = false + # port = 8545 + # prefix = "" + # host = "localhost" + # api = ["eth", "net", "web3", "txpool", "bor"] + # vhosts = ["*"] + # corsdomain = ["*"] + # [jsonrpc.ws] + # enabled = false + # port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + # vhosts = ["*"] + # corsdomain = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] + # blocks = 20 + # percentile = 60 + # maxprice = "5000000000000" + # ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + prometheus-addr = "127.0.0.1:7071" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] + # cache = 1024 + # gc = 25 + # snapshot = 10 + # database = 50 + # trie = 15 + # journal = "triecache" + # rejournal = "1h0m0s" + # noprefetch = false + # preimages = false + # txlookuplimit = 2350000 + +[accounts] + # allow-insecure-unlock = true + # password = "/var/lib/bor/password.txt" + # unlock = ["VALIDATOR ADDRESS"] + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" -# [accounts] -# allow-insecure-unlock = true -# password = "/var/lib/bor/password.txt" -# unlock = ["VALIDATOR ADDRESS"] \ No newline at end of file +# [developer] + # dev = false + # period = 0 \ No newline at end of file From 2aacbde0976c6d12fbd349c394c6337537f7d026 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Wed, 17 Aug 2022 15:18:16 +0530 Subject: [PATCH 146/190] eth, cli: prevent snap sync mode migration - v0.3.x (#494) * handle snap sync mode switches * fix linters --- cmd/utils/flags.go | 7 ++++++ eth/handler.go | 11 +++++++-- eth/sync.go | 43 ++++++++++++++++++++++------------- internal/cli/server/config.go | 5 +++- 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index e2bbdb17f8..79c73903fb 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -1620,6 +1620,13 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { if ctx.GlobalIsSet(SyncModeFlag.Name) { cfg.SyncMode = *GlobalTextMarshaler(ctx, SyncModeFlag.Name).(*downloader.SyncMode) + + // To be extra preventive, we won't allow the node to start + // in snap sync mode until we have it working + // TODO(snap): Comment when we have snap sync working + if cfg.SyncMode == downloader.SnapSync { + cfg.SyncMode = downloader.FullSync + } } if ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name) diff --git a/eth/handler.go b/eth/handler.go index ab95f5f769..3d8380412c 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -161,8 +161,15 @@ func newHandler(config *handlerConfig) (*handler, error) { // In these cases however it's safe to reenable snap sync. fullBlock, fastBlock := h.chain.CurrentBlock(), h.chain.CurrentFastBlock() if fullBlock.NumberU64() == 0 && fastBlock.NumberU64() > 0 { - h.snapSync = uint32(1) - log.Warn("Switch sync mode from full sync to snap sync") + // Note: Ideally this should never happen with bor, but to be extra + // preventive we won't allow it to roll over to snap sync until + // we have it working + + // TODO(snap): Uncomment when we have snap sync working + // h.snapSync = uint32(1) + // log.Warn("Switch sync mode from full sync to snap sync") + + log.Warn("Preventing switching sync mode from full sync to snap sync") } } else { if h.chain.CurrentBlock().NumberU64() > 0 { diff --git a/eth/sync.go b/eth/sync.go index d67d2311d0..22c0c9054a 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -204,25 +204,36 @@ func peerToSyncOp(mode downloader.SyncMode, p *eth.Peer) *chainSyncOp { } func (cs *chainSyncer) modeAndLocalHead() (downloader.SyncMode, *big.Int) { - // If we're in snap sync mode, return that directly - if atomic.LoadUint32(&cs.handler.snapSync) == 1 { - block := cs.handler.chain.CurrentFastBlock() - td := cs.handler.chain.GetTd(block.Hash(), block.NumberU64()) - return downloader.SnapSync, td - } - // We are probably in full sync, but we might have rewound to before the - // snap sync pivot, check if we should reenable - if pivot := rawdb.ReadLastPivotNumber(cs.handler.database); pivot != nil { - if head := cs.handler.chain.CurrentBlock(); head.NumberU64() < *pivot { - block := cs.handler.chain.CurrentFastBlock() - td := cs.handler.chain.GetTd(block.Hash(), block.NumberU64()) - return downloader.SnapSync, td - } - } - // Nope, we're really full syncing + // Note: Ideally this should never happen with bor, but to be extra + // preventive we won't allow it to roll over to snap sync until + // we have it working + + // Handle full sync mode only head := cs.handler.chain.CurrentBlock() td := cs.handler.chain.GetTd(head.Hash(), head.NumberU64()) return downloader.FullSync, td + + // TODO(snap): Uncomment when we have snap sync working + + // If we're in snap sync mode, return that directly + // if atomic.LoadUint32(&cs.handler.snapSync) == 1 { + // block := cs.handler.chain.CurrentFastBlock() + // td := cs.handler.chain.GetTd(block.Hash(), block.NumberU64()) + // return downloader.SnapSync, td + // } + // // We are probably in full sync, but we might have rewound to before the + // // snap sync pivot, check if we should reenable + // if pivot := rawdb.ReadLastPivotNumber(cs.handler.database); pivot != nil { + // if head := cs.handler.chain.CurrentBlock(); head.NumberU64() < *pivot { + // block := cs.handler.chain.CurrentFastBlock() + // td := cs.handler.chain.GetTd(block.Hash(), block.NumberU64()) + // return downloader.SnapSync, td + // } + // } + // Nope, we're really full syncing + // head := cs.handler.chain.CurrentBlock() + // td := cs.handler.chain.GetTd(head.Hash(), head.NumberU64()) + // return downloader.FullSync, td } // startSync launches doSync in a new goroutine. diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index faa8452742..e10b7e9c36 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -843,7 +843,10 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* case "full": n.SyncMode = downloader.FullSync case "snap": - n.SyncMode = downloader.SnapSync + // n.SyncMode = downloader.SnapSync // TODO(snap): Uncomment when we have snap sync working + n.SyncMode = downloader.FullSync + + log.Warn("Bor doesn't support Snap Sync yet, switching to Full Sync mode") default: return nil, fmt.Errorf("sync mode '%s' not found", c.SyncMode) } From 8c97faaa8c9a046266aa7a0636df3ee55956dbc0 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Fri, 5 Aug 2022 14:56:41 +0530 Subject: [PATCH 147/190] internal/cli, cmd/geth: replaced package naoina/toml with BurntSushi/toml and updated config name-tags (#486) * removed package naoina/toml from dumpconfig and added BurntSushi/toml * updated cmd/gethconfig.go --- cmd/geth/config.go | 57 ++++------------------- go.mod | 2 - go.sum | 4 -- internal/cli/dumpconfig.go | 20 ++------ internal/cli/server/config.go | 12 ++--- internal/cli/server/config_legacy_test.go | 7 +-- internal/cli/server/testdata/test.toml | 6 +-- 7 files changed, 25 insertions(+), 83 deletions(-) diff --git a/cmd/geth/config.go b/cmd/geth/config.go index d8ba5366fe..08b76f83da 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -17,17 +17,16 @@ package main import ( - "bufio" - "errors" "fmt" + "io/ioutil" "math/big" "os" - "reflect" "time" - "unicode" "gopkg.in/urfave/cli.v1" + "github.com/BurntSushi/toml" + "github.com/ethereum/go-ethereum/accounts/external" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/accounts/scwallet" @@ -41,7 +40,6 @@ import ( "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/params" - "github.com/naoina/toml" ) var ( @@ -61,28 +59,6 @@ var ( } ) -// These settings ensure that TOML keys use the same names as Go struct fields. -var tomlSettings = toml.Config{ - NormFieldName: func(rt reflect.Type, key string) string { - return key - }, - FieldToKey: func(rt reflect.Type, field string) string { - return field - }, - MissingField: func(rt reflect.Type, field string) error { - id := fmt.Sprintf("%s.%s", rt.String(), field) - if deprecated(id) { - log.Warn("Config field is deprecated and won't have an effect", "name", id) - return nil - } - var link string - if unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != "main" { - link = fmt.Sprintf(", see https://godoc.org/%s#%s for available fields", rt.PkgPath(), rt.Name()) - } - return fmt.Errorf("field '%s' is not defined in %s%s", field, rt.String(), link) - }, -} - type ethstatsConfig struct { URL string `toml:",omitempty"` } @@ -95,18 +71,17 @@ type gethConfig struct { } func loadConfig(file string, cfg *gethConfig) error { - f, err := os.Open(file) + data, err := ioutil.ReadFile(file) if err != nil { return err } - defer f.Close() - err = tomlSettings.NewDecoder(bufio.NewReader(f)).Decode(cfg) - // Add file name to errors that have a line number. - if _, ok := err.(*toml.LineError); ok { - err = errors.New(file + ", " + err.Error()) + tomlData := string(data) + if _, err = toml.Decode(tomlData, &cfg); err != nil { + return err } - return err + + return nil } func defaultNodeConfig() node.Config { @@ -214,22 +189,10 @@ func dumpConfig(ctx *cli.Context) error { comment += "# Note: this config doesn't contain the genesis block.\n\n" } - out, err := tomlSettings.Marshal(&cfg) - if err != nil { + if err := toml.NewEncoder(os.Stdout).Encode(&cfg); err != nil { return err } - dump := os.Stdout - if ctx.NArg() > 0 { - dump, err = os.OpenFile(ctx.Args().Get(0), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return err - } - defer dump.Close() - } - dump.WriteString(comment) - dump.Write(out) - return nil } diff --git a/go.mod b/go.mod index 3f90695d47..39bbeb240d 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,6 @@ require ( github.com/mitchellh/cli v1.1.2 github.com/mitchellh/go-grpc-net-conn v0.0.0-20200427190222-eb030e4876f0 github.com/mitchellh/go-homedir v1.1.0 - github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 github.com/olekukonko/tablewriter v0.0.5 github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 github.com/prometheus/tsdb v0.7.1 @@ -119,7 +118,6 @@ require ( github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.0 // indirect - github.com/naoina/go-stringutil v0.1.0 // indirect github.com/opentracing/opentracing-go v1.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index fc58b621e6..88c9152eef 100644 --- a/go.sum +++ b/go.sum @@ -374,10 +374,6 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= diff --git a/internal/cli/dumpconfig.go b/internal/cli/dumpconfig.go index 3e4688fc24..dad0be923d 100644 --- a/internal/cli/dumpconfig.go +++ b/internal/cli/dumpconfig.go @@ -1,24 +1,14 @@ package cli import ( - "reflect" + "os" "strings" - "github.com/naoina/toml" + "github.com/BurntSushi/toml" "github.com/ethereum/go-ethereum/internal/cli/server" ) -// These settings ensure that TOML keys use the same names as Go struct fields. -var tomlSettings = toml.Config{ - NormFieldName: func(rt reflect.Type, key string) string { - return key - }, - FieldToKey: func(rt reflect.Type, field string) string { - return field - }, -} - // DumpconfigCommand is for exporting user provided flags into a config file type DumpconfigCommand struct { *Meta2 @@ -69,14 +59,10 @@ func (c *DumpconfigCommand) Run(args []string) int { userConfig.Gpo.IgnorePriceRaw = userConfig.Gpo.IgnorePrice.String() userConfig.Cache.RejournalRaw = userConfig.Cache.Rejournal.String() - // Currently, the configurations (userConfig) is exported into `toml` file format. - out, err := tomlSettings.Marshal(&userConfig) - if err != nil { + if err := toml.NewEncoder(os.Stdout).Encode(userConfig); err != nil { c.UI.Error(err.Error()) return 1 } - c.UI.Output(string(out)) - return 0 } diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index e10b7e9c36..255cf633eb 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -167,7 +167,7 @@ type TxPoolConfig struct { Journal string `hcl:"journal,optional" toml:"journal,optional"` // Rejournal is the time interval to regenerate the local transaction journal - Rejournal time.Duration `hcl:"-,optional" toml:"-,optional"` + Rejournal time.Duration `hcl:"-,optional" toml:"-"` RejournalRaw string `hcl:"rejournal,optional" toml:"rejournal,optional"` // PriceLimit is the minimum gas price to enforce for acceptance into the pool @@ -189,7 +189,7 @@ type TxPoolConfig struct { GlobalQueue uint64 `hcl:"globalqueue,optional" toml:"globalqueue,optional"` // lifetime is the maximum amount of time non-executable transaction are queued - LifeTime time.Duration `hcl:"-,optional" toml:"-,optional"` + LifeTime time.Duration `hcl:"-,optional" toml:"-"` LifeTimeRaw string `hcl:"lifetime,optional" toml:"lifetime,optional"` } @@ -207,7 +207,7 @@ type SealerConfig struct { GasCeil uint64 `hcl:"gaslimit,optional" toml:"gaslimit,optional"` // GasPrice is the minimum gas price for mining a transaction - GasPrice *big.Int `hcl:"-,optional" toml:"-,optional"` + GasPrice *big.Int `hcl:"-,optional" toml:"-"` GasPriceRaw string `hcl:"gasprice,optional" toml:"gasprice,optional"` } @@ -270,11 +270,11 @@ type GpoConfig struct { Percentile uint64 `hcl:"percentile,optional" toml:"percentile,optional"` // MaxPrice is an upper bound gas price - MaxPrice *big.Int `hcl:"-,optional" toml:"-,optional"` + MaxPrice *big.Int `hcl:"-,optional" toml:"-"` MaxPriceRaw string `hcl:"maxprice,optional" toml:"maxprice,optional"` // IgnorePrice is a lower bound gas price - IgnorePrice *big.Int `hcl:"-,optional" toml:"-,optional"` + IgnorePrice *big.Int `hcl:"-,optional" toml:"-"` IgnorePriceRaw string `hcl:"ignoreprice,optional" toml:"ignoreprice,optional"` } @@ -347,7 +347,7 @@ type CacheConfig struct { Journal string `hcl:"journal,optional" toml:"journal,optional"` // Rejournal is the time interval to regenerate the journal for clean cache - Rejournal time.Duration `hcl:"-,optional" toml:"-,optional"` + Rejournal time.Duration `hcl:"-,optional" toml:"-"` RejournalRaw string `hcl:"rejournal,optional" toml:"rejournal,optional"` // NoPrefetch is used to disable prefetch of tries diff --git a/internal/cli/server/config_legacy_test.go b/internal/cli/server/config_legacy_test.go index a8127915a1..b28d7ae536 100644 --- a/internal/cli/server/config_legacy_test.go +++ b/internal/cli/server/config_legacy_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/params" ) func TestConfigLegacy(t *testing.T) { @@ -71,8 +72,8 @@ func TestConfigLegacy(t *testing.T) { Gpo: &GpoConfig{ Blocks: 20, Percentile: 60, - MaxPrice: big.NewInt(100), - IgnorePrice: big.NewInt(2), + MaxPrice: big.NewInt(5000 * params.GWei), + IgnorePrice: big.NewInt(4), }, JsonRPC: &JsonRPCConfig{ IPCDisable: false, @@ -129,7 +130,7 @@ func TestConfigLegacy(t *testing.T) { PercGc: 25, PercSnapshot: 10, Journal: "triecache", - Rejournal: 1 * time.Hour, + Rejournal: 1 * time.Second, NoPrefetch: false, Preimages: false, TxLookupLimit: 2350000, diff --git a/internal/cli/server/testdata/test.toml b/internal/cli/server/testdata/test.toml index 81fc4c4630..ecc313b5b5 100644 --- a/internal/cli/server/testdata/test.toml +++ b/internal/cli/server/testdata/test.toml @@ -8,7 +8,6 @@ maxpeers = 30 [txpool] locals = [] -rejournal = "1h0m0s" lifetime = "1s" [miner] @@ -17,9 +16,8 @@ gaslimit = 20000000 gasprice = "30000000000" [gpo] -maxprice = "100" -ignoreprice = "2" +ignoreprice = "4" [cache] cache = 1024 -rejournal = "1h0m0s" +rejournal = "1s" From 54719fb180ad54e6fffa15afb8b3a3d7411c84e1 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Wed, 27 Jul 2022 22:27:26 +0530 Subject: [PATCH 148/190] Makefile: copy bor binary to go bin (#469) --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 46ecdec886..a8e14cf06a 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,8 @@ GOTEST = GODEBUG=cgocheck=0 go test $(GO_FLAGS) -p 1 bor: mkdir -p $(GOPATH)/bin/ go build -o $(GOBIN)/bor ./cmd/cli/main.go + cp $(GOBIN)/bor $(GOPATH)/bin/ + @echo "Done building." protoc: protoc --go_out=. --go-grpc_out=. ./internal/cli/server/proto/*.proto From 7bb7bacd5042d41bb2c3a5c13e4fcc4f543afce2 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 1 Sep 2022 11:07:49 +0530 Subject: [PATCH 149/190] Merge pull request #503 from maticnetwork/shivam/sealer-gasPrice (#506) internal/cli/server: update default cli values Co-authored-by: SHIVAM SHARMA --- internal/cli/server/config.go | 20 ++++++++-------- internal/cli/server/config_legacy_test.go | 28 ++++++++++++----------- internal/cli/server/testdata/test.toml | 4 ++-- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 255cf633eb..8ee023db76 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -419,7 +419,7 @@ func DefaultConfig() *Config { TxPool: &TxPoolConfig{ Locals: []string{}, NoLocals: false, - Journal: "", + Journal: "transactions.rlp", Rejournal: 1 * time.Hour, PriceLimit: 30000000000, PriceBump: 10, @@ -432,8 +432,8 @@ func DefaultConfig() *Config { Sealer: &SealerConfig{ Enabled: false, Etherbase: "", - GasCeil: 20000000, - GasPrice: big.NewInt(30 * params.GWei), + GasCeil: 30_000_000, + GasPrice: big.NewInt(1 * params.GWei), ExtraData: "", }, Gpo: &GpoConfig{ @@ -453,22 +453,22 @@ func DefaultConfig() *Config { Prefix: "", Host: "localhost", API: []string{"eth", "net", "web3", "txpool", "bor"}, - Cors: []string{"*"}, - VHost: []string{"*"}, + Cors: []string{"localhost"}, + VHost: []string{"localhost"}, }, Ws: &APIConfig{ Enabled: false, Port: 8546, Prefix: "", Host: "localhost", - API: []string{"web3", "net"}, - Cors: []string{"*"}, - VHost: []string{"*"}, + API: []string{"net", "web3"}, + Cors: []string{"localhost"}, + VHost: []string{"localhost"}, }, Graphql: &APIConfig{ Enabled: false, - Cors: []string{"*"}, - VHost: []string{"*"}, + Cors: []string{"localhost"}, + VHost: []string{"localhost"}, }, }, Ethstats: "", diff --git a/internal/cli/server/config_legacy_test.go b/internal/cli/server/config_legacy_test.go index b28d7ae536..b11e9646f4 100644 --- a/internal/cli/server/config_legacy_test.go +++ b/internal/cli/server/config_legacy_test.go @@ -14,10 +14,10 @@ import ( func TestConfigLegacy(t *testing.T) { readFile := func(path string) { - config, err := readLegacyConfig(path) + expectedConfig, err := readLegacyConfig(path) assert.NoError(t, err) - assert.Equal(t, config, &Config{ + testConfig := &Config{ Chain: "mainnet", Identity: Hostname(), RequiredBlocks: map[string]string{ @@ -52,7 +52,7 @@ func TestConfigLegacy(t *testing.T) { TxPool: &TxPoolConfig{ Locals: []string{}, NoLocals: false, - Journal: "", + Journal: "transactions.rlp", Rejournal: 1 * time.Hour, PriceLimit: 30000000000, PriceBump: 10, @@ -65,8 +65,8 @@ func TestConfigLegacy(t *testing.T) { Sealer: &SealerConfig{ Enabled: false, Etherbase: "", - GasCeil: 20000000, - GasPrice: big.NewInt(30000000000), + GasCeil: 30000000, + GasPrice: big.NewInt(1 * params.GWei), ExtraData: "", }, Gpo: &GpoConfig{ @@ -86,22 +86,22 @@ func TestConfigLegacy(t *testing.T) { Prefix: "", Host: "localhost", API: []string{"eth", "net", "web3", "txpool", "bor"}, - Cors: []string{"*"}, - VHost: []string{"*"}, + Cors: []string{"localhost"}, + VHost: []string{"localhost"}, }, Ws: &APIConfig{ Enabled: false, Port: 8546, Prefix: "", Host: "localhost", - API: []string{"web3", "net"}, - Cors: []string{"*"}, - VHost: []string{"*"}, + API: []string{"net", "web3"}, + Cors: []string{"localhost"}, + VHost: []string{"localhost"}, }, Graphql: &APIConfig{ Enabled: false, - Cors: []string{"*"}, - VHost: []string{"*"}, + Cors: []string{"localhost"}, + VHost: []string{"localhost"}, }, }, Ethstats: "", @@ -149,7 +149,9 @@ func TestConfigLegacy(t *testing.T) { Enabled: false, Period: 0, }, - }) + } + + assert.Equal(t, expectedConfig, testConfig) } // read file in hcl format diff --git a/internal/cli/server/testdata/test.toml b/internal/cli/server/testdata/test.toml index ecc313b5b5..2277e03664 100644 --- a/internal/cli/server/testdata/test.toml +++ b/internal/cli/server/testdata/test.toml @@ -12,8 +12,8 @@ lifetime = "1s" [miner] mine = false -gaslimit = 20000000 -gasprice = "30000000000" +gaslimit = 30000000 +gasprice = "1000000000" [gpo] ignoreprice = "4" From d2eb2df62e9571d958cf86c8e6aa4621afb7e1eb Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Wed, 7 Sep 2022 13:35:22 +0400 Subject: [PATCH 150/190] changed 'requiredblocks' flag back to 'eth.requiredblocks' --- builder/files/config.toml | 2 +- docs/config.md | 2 ++ internal/cli/server/config.go | 2 +- internal/cli/server/flags.go | 2 +- internal/cli/server/testdata/test.toml | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/builder/files/config.toml b/builder/files/config.toml index d8503e4351..84c3327bbf 100644 --- a/builder/files/config.toml +++ b/builder/files/config.toml @@ -12,7 +12,7 @@ syncmode = "full" # snapshot = true # ethstats = "" -# [requiredblocks] +# ["eth.requiredblocks"] [p2p] # maxpeers = 1 diff --git a/docs/config.md b/docs/config.md index 196a0bf388..aebd9e12b9 100644 --- a/docs/config.md +++ b/docs/config.md @@ -19,6 +19,8 @@ gcmode = "full" snapshot = true ethstats = "" +["eth.requiredblocks"] + [p2p] maxpeers = 30 maxpendpeers = 50 diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 8ee023db76..f91e336ace 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -45,7 +45,7 @@ type Config struct { Identity string `hcl:"identity,optional" toml:"identity,optional"` // RequiredBlocks is a list of required (block number, hash) pairs to accept - RequiredBlocks map[string]string `hcl:"requiredblocks,optional" toml:"requiredblocks,optional"` + RequiredBlocks map[string]string `hcl:"eth.requiredblocks,optional" toml:"eth.requiredblocks,optional"` // LogLevel is the level of the logs to put out LogLevel string `hcl:"log-level,optional" toml:"log-level,optional"` diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index bbc7f44036..e19e578c57 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -56,7 +56,7 @@ func (c *Command) Flags() *flagset.Flagset { Default: c.cliConfig.GcMode, }) f.MapStringFlag(&flagset.MapStringFlag{ - Name: "requiredblocks", + Name: "eth.requiredblocks", Usage: "Comma separated block number-to-hash mappings to enforce (=)", Value: &c.cliConfig.RequiredBlocks, }) diff --git a/internal/cli/server/testdata/test.toml b/internal/cli/server/testdata/test.toml index 2277e03664..6d07abdad7 100644 --- a/internal/cli/server/testdata/test.toml +++ b/internal/cli/server/testdata/test.toml @@ -1,6 +1,6 @@ datadir = "./data" -[requiredblocks] +["eth.requiredblocks"] a = "b" [p2p] From 7c6f0a67e6e01430ea9304a7adef80ede21e903f Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Wed, 7 Sep 2022 16:21:55 +0400 Subject: [PATCH 151/190] updated tests, and removed requiredblocks from json and hcl --- internal/cli/server/command_test.go | 2 +- internal/cli/server/config_test.go | 3 --- internal/cli/server/testdata/test.hcl | 4 ---- internal/cli/server/testdata/test.json | 3 --- 4 files changed, 1 insertion(+), 11 deletions(-) diff --git a/internal/cli/server/command_test.go b/internal/cli/server/command_test.go index 9006559d0f..ab28de5ee6 100644 --- a/internal/cli/server/command_test.go +++ b/internal/cli/server/command_test.go @@ -24,7 +24,7 @@ func TestFlags(t *testing.T) { "--dev.period", "2", "--datadir", "./data", "--maxpeers", "30", - "--requiredblocks", "a=b", + "--eth.requiredblocks", "a=b", "--http.api", "eth,web3,bor", } err := c.extractFlags(args) diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index bf7787ac2e..5f3118996b 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -108,9 +108,6 @@ func TestConfigLoadFile(t *testing.T) { assert.Equal(t, config, &Config{ DataDir: "./data", - RequiredBlocks: map[string]string{ - "a": "b", - }, P2P: &P2PConfig{ MaxPeers: 30, }, diff --git a/internal/cli/server/testdata/test.hcl b/internal/cli/server/testdata/test.hcl index 208fdc51c1..44138970fc 100644 --- a/internal/cli/server/testdata/test.hcl +++ b/internal/cli/server/testdata/test.hcl @@ -1,9 +1,5 @@ datadir = "./data" -requiredblocks = { - a = "b" -} - p2p { maxpeers = 30 } diff --git a/internal/cli/server/testdata/test.json b/internal/cli/server/testdata/test.json index 467835e755..a08e5aceb1 100644 --- a/internal/cli/server/testdata/test.json +++ b/internal/cli/server/testdata/test.json @@ -1,8 +1,5 @@ { "datadir": "./data", - "requiredblocks": { - "a": "b" - }, "p2p": { "maxpeers": 30 }, From 2cf5945321290da53edebf71dd7e4a45b230d388 Mon Sep 17 00:00:00 2001 From: Jerry Date: Mon, 5 Sep 2022 23:25:46 -0700 Subject: [PATCH 152/190] Remove orphaned containers when shutdown devnet This will potentially resolve "ERROR: network docker_default has active endpoints" problem --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 336b2fea56..639a68703f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -168,7 +168,7 @@ jobs: if: always() run: | cd matic-cli/devnet - docker compose down + docker compose down --remove-orphans cd - mkdir -p ${{ github.run_id }}/matic-cli sudo mv bor ${{ github.run_id }} From ebbe100ff16d378a5b4860561ebc03f5d6423e98 Mon Sep 17 00:00:00 2001 From: Jerry Date: Tue, 27 Sep 2022 22:54:17 -0700 Subject: [PATCH 153/190] Change heimdall branch to develop in CI --- .github/matic-cli-config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/matic-cli-config.yml b/.github/matic-cli-config.yml index f643f4b192..c7dab39b0e 100644 --- a/.github/matic-cli-config.yml +++ b/.github/matic-cli-config.yml @@ -8,4 +8,4 @@ numOfNonValidators: 0 ethURL: http://ganache:9545 devnetType: docker borDockerBuildContext: "../../bor" -heimdallDockerBuildContext: "https://github.com/maticnetwork/heimdall.git#v0.3.0-dev" \ No newline at end of file +heimdallDockerBuildContext: "https://github.com/maticnetwork/heimdall.git#develop" \ No newline at end of file From 43e5d3aa090c8f88b3ced29ff8bb1bbb16fa0dca Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Thu, 29 Sep 2022 14:25:27 +0530 Subject: [PATCH 154/190] PR#518 and PR#529 -> qa (#532) * Added script to generate config.toml fromstart.sh (#518) * added go and bash script to get config out of start.sh and updated flagset.go * changed 'requiredblocks' flag back to 'eth.requiredblocks' * updated script * changed 'requiredblocks' flag back to 'eth.requiredblocks' * updated tests, and removed requiredblocks from json and hcl * addressed comments * internal/cli/server: fix flag behaviour (#529) * remove setting maxpeers to 0 for nodiscover flag * set default prometheus and open-collector endpoint * skip building grpc address from pprof address and port * fix: linters * fix and improve tests * use loopback address for prometheus and open-collector endpoint * add logs for prometheus and open-collector setup * updated the script to handle prometheus-addr * updated builder/files/config.toml Co-authored-by: Pratik Patil Co-authored-by: Manav Darji --- builder/files/config.toml | 4 +- go.mod | 1 + go.sum | 2 + internal/cli/flagset/flagset.go | 9 + internal/cli/server/config.go | 7 +- internal/cli/server/config_legacy_test.go | 151 +---- internal/cli/server/flags.go | 2 +- internal/cli/server/server.go | 4 + internal/cli/server/testdata/test.toml | 6 +- scripts/getconfig.go | 687 ++++++++++++++++++++++ scripts/getconfig.sh | 87 +++ 11 files changed, 816 insertions(+), 144 deletions(-) create mode 100644 scripts/getconfig.go create mode 100755 scripts/getconfig.sh diff --git a/builder/files/config.toml b/builder/files/config.toml index 84c3327bbf..ce9fd782d0 100644 --- a/builder/files/config.toml +++ b/builder/files/config.toml @@ -96,8 +96,8 @@ syncmode = "full" [telemetry] metrics = true # expensive = false - prometheus-addr = "127.0.0.1:7071" - # opencollector-endpoint = "" + # prometheus-addr = "127.0.0.1:7071" + # opencollector-endpoint = "127.0.0.1:4317" # [telemetry.influx] # influxdb = false # endpoint = "" diff --git a/go.mod b/go.mod index 39bbeb240d..e31612cfe3 100644 --- a/go.mod +++ b/go.mod @@ -119,6 +119,7 @@ require ( github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.0 // indirect github.com/opentracing/opentracing-go v1.1.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/posener/complete v1.1.1 // indirect diff --git a/go.sum b/go.sum index 88c9152eef..593c8e11d0 100644 --- a/go.sum +++ b/go.sum @@ -391,6 +391,8 @@ github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mo github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= diff --git a/internal/cli/flagset/flagset.go b/internal/cli/flagset/flagset.go index d9e204f0e4..933fe59060 100644 --- a/internal/cli/flagset/flagset.go +++ b/internal/cli/flagset/flagset.go @@ -44,6 +44,15 @@ func (f *Flagset) Help() string { return str + strings.Join(items, "\n\n") } +func (f *Flagset) GetAllFlags() []string { + flags := []string{} + for _, flag := range f.flags { + flags = append(flags, flag.Name) + } + + return flags +} + // MarkDown implements cli.MarkDown interface func (f *Flagset) MarkDown() string { if len(f.flags) == 0 { diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index f91e336ace..a4f642a6e3 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -475,8 +475,8 @@ func DefaultConfig() *Config { Telemetry: &TelemetryConfig{ Enabled: false, Expensive: false, - PrometheusAddr: "", - OpenCollectorEndpoint: "", + PrometheusAddr: "127.0.0.1:7071", + OpenCollectorEndpoint: "127.0.0.1:4317", InfluxDB: &InfluxDBConfig{ V1Enabled: false, Endpoint: "", @@ -991,8 +991,7 @@ func (c *Config) buildNode() (*node.Config, error) { } if c.P2P.NoDiscover { - // Disable networking, for now, we will not even allow incomming connections - cfg.P2P.MaxPeers = 0 + // Disable peer discovery cfg.P2P.NoDiscovery = true } diff --git a/internal/cli/server/config_legacy_test.go b/internal/cli/server/config_legacy_test.go index b11e9646f4..29cefdd7bf 100644 --- a/internal/cli/server/config_legacy_test.go +++ b/internal/cli/server/config_legacy_test.go @@ -6,9 +6,6 @@ import ( "time" "github.com/stretchr/testify/assert" - - "github.com/ethereum/go-ethereum/eth/ethconfig" - "github.com/ethereum/go-ethereum/params" ) func TestConfigLegacy(t *testing.T) { @@ -17,139 +14,23 @@ func TestConfigLegacy(t *testing.T) { expectedConfig, err := readLegacyConfig(path) assert.NoError(t, err) - testConfig := &Config{ - Chain: "mainnet", - Identity: Hostname(), - RequiredBlocks: map[string]string{ - "a": "b", - }, - LogLevel: "INFO", - DataDir: "./data", - P2P: &P2PConfig{ - MaxPeers: 30, - MaxPendPeers: 50, - Bind: "0.0.0.0", - Port: 30303, - NoDiscover: false, - NAT: "any", - Discovery: &P2PDiscovery{ - V5Enabled: false, - Bootnodes: []string{}, - BootnodesV4: []string{}, - BootnodesV5: []string{}, - StaticNodes: []string{}, - TrustedNodes: []string{}, - DNS: []string{}, - }, - }, - Heimdall: &HeimdallConfig{ - URL: "http://localhost:1317", - Without: false, - }, - SyncMode: "full", - GcMode: "full", - Snapshot: true, - TxPool: &TxPoolConfig{ - Locals: []string{}, - NoLocals: false, - Journal: "transactions.rlp", - Rejournal: 1 * time.Hour, - PriceLimit: 30000000000, - PriceBump: 10, - AccountSlots: 16, - GlobalSlots: 32768, - AccountQueue: 16, - GlobalQueue: 32768, - LifeTime: 1 * time.Second, - }, - Sealer: &SealerConfig{ - Enabled: false, - Etherbase: "", - GasCeil: 30000000, - GasPrice: big.NewInt(1 * params.GWei), - ExtraData: "", - }, - Gpo: &GpoConfig{ - Blocks: 20, - Percentile: 60, - MaxPrice: big.NewInt(5000 * params.GWei), - IgnorePrice: big.NewInt(4), - }, - JsonRPC: &JsonRPCConfig{ - IPCDisable: false, - IPCPath: "", - GasCap: ethconfig.Defaults.RPCGasCap, - TxFeeCap: ethconfig.Defaults.RPCTxFeeCap, - Http: &APIConfig{ - Enabled: false, - Port: 8545, - Prefix: "", - Host: "localhost", - API: []string{"eth", "net", "web3", "txpool", "bor"}, - Cors: []string{"localhost"}, - VHost: []string{"localhost"}, - }, - Ws: &APIConfig{ - Enabled: false, - Port: 8546, - Prefix: "", - Host: "localhost", - API: []string{"net", "web3"}, - Cors: []string{"localhost"}, - VHost: []string{"localhost"}, - }, - Graphql: &APIConfig{ - Enabled: false, - Cors: []string{"localhost"}, - VHost: []string{"localhost"}, - }, - }, - Ethstats: "", - Telemetry: &TelemetryConfig{ - Enabled: false, - Expensive: false, - PrometheusAddr: "", - OpenCollectorEndpoint: "", - InfluxDB: &InfluxDBConfig{ - V1Enabled: false, - Endpoint: "", - Database: "", - Username: "", - Password: "", - Tags: map[string]string{}, - V2Enabled: false, - Token: "", - Bucket: "", - Organization: "", - }, - }, - Cache: &CacheConfig{ - Cache: 1024, - PercDatabase: 50, - PercTrie: 15, - PercGc: 25, - PercSnapshot: 10, - Journal: "triecache", - Rejournal: 1 * time.Second, - NoPrefetch: false, - Preimages: false, - TxLookupLimit: 2350000, - }, - Accounts: &AccountsConfig{ - Unlock: []string{}, - PasswordFile: "", - AllowInsecureUnlock: false, - UseLightweightKDF: false, - DisableBorWallet: true, - }, - GRPC: &GRPCConfig{ - Addr: ":3131", - }, - Developer: &DeveloperConfig{ - Enabled: false, - Period: 0, - }, + testConfig := DefaultConfig() + + testConfig.DataDir = "./data" + testConfig.Snapshot = false + testConfig.RequiredBlocks = map[string]string{ + "31000000": "0x2087b9e2b353209c2c21e370c82daa12278efd0fe5f0febe6c29035352cf050e", + "32000000": "0x875500011e5eecc0c554f95d07b31cf59df4ca2505f4dbbfffa7d4e4da917c68", } + testConfig.P2P.MaxPeers = 30 + testConfig.TxPool.Locals = []string{} + testConfig.TxPool.LifeTime = time.Second + testConfig.Sealer.Enabled = true + testConfig.Sealer.GasCeil = 30000000 + testConfig.Sealer.GasPrice = big.NewInt(1000000000) + testConfig.Gpo.IgnorePrice = big.NewInt(4) + testConfig.Cache.Cache = 1024 + testConfig.Cache.Rejournal = time.Second assert.Equal(t, expectedConfig, testConfig) } diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index e19e578c57..835ff0ab95 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -57,7 +57,7 @@ func (c *Command) Flags() *flagset.Flagset { }) f.MapStringFlag(&flagset.MapStringFlag{ Name: "eth.requiredblocks", - Usage: "Comma separated block number-to-hash mappings to enforce (=)", + Usage: "Comma separated block number-to-hash mappings to require for peering (=)", Value: &c.cliConfig.RequiredBlocks, }) f.BoolFlag(&flagset.BoolFlag{ diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index cd706c1a9d..adacb44ce7 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -281,6 +281,8 @@ func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error } }() + log.Info("Enabling metrics export to prometheus", "path", fmt.Sprintf("http://%s/debug/metrics/prometheus", config.PrometheusAddr)) + } if config.OpenCollectorEndpoint != "" { @@ -322,6 +324,8 @@ func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error // set the tracer s.tracer = tracerProvider + + log.Info("Open collector tracing started", "address", config.OpenCollectorEndpoint) } return nil diff --git a/internal/cli/server/testdata/test.toml b/internal/cli/server/testdata/test.toml index 6d07abdad7..4ccc644ee9 100644 --- a/internal/cli/server/testdata/test.toml +++ b/internal/cli/server/testdata/test.toml @@ -1,7 +1,9 @@ datadir = "./data" +snapshot = false ["eth.requiredblocks"] -a = "b" +"31000000" = "0x2087b9e2b353209c2c21e370c82daa12278efd0fe5f0febe6c29035352cf050e" +"32000000" = "0x875500011e5eecc0c554f95d07b31cf59df4ca2505f4dbbfffa7d4e4da917c68" [p2p] maxpeers = 30 @@ -11,7 +13,7 @@ locals = [] lifetime = "1s" [miner] -mine = false +mine = true gaslimit = 30000000 gasprice = "1000000000" diff --git a/scripts/getconfig.go b/scripts/getconfig.go new file mode 100644 index 0000000000..689ed68fbf --- /dev/null +++ b/scripts/getconfig.go @@ -0,0 +1,687 @@ +package main + +import ( + "encoding/json" + "errors" + "fmt" + "log" + "os" + "strconv" + "strings" + + "github.com/pelletier/go-toml" + + "github.com/ethereum/go-ethereum/internal/cli/server" +) + +// YesFV: Both, Flags and their values has changed +// YesF: Only the Flag has changed, not their value +var flagMap = map[string][]string{ + "networkid": {"notABoolFlag", "YesFV"}, + "miner.gastarget": {"notABoolFlag", "No"}, + "pprof": {"BoolFlag", "No"}, + "pprof.port": {"notABoolFlag", "No"}, + "pprof.addr": {"notABoolFlag", "No"}, + "pprof.memprofilerate": {"notABoolFlag", "No"}, + "pprof.blockprofilerate": {"notABoolFlag", "No"}, + "pprof.cpuprofile": {"notABoolFlag", "No"}, + "jsonrpc.corsdomain": {"notABoolFlag", "YesF"}, + "jsonrpc.vhosts": {"notABoolFlag", "YesF"}, + "http.modules": {"notABoolFlag", "YesF"}, + "ws.modules": {"notABoolFlag", "YesF"}, + "config": {"notABoolFlag", "No"}, + "datadir.ancient": {"notABoolFlag", "No"}, + "datadir.minfreedisk": {"notABoolFlag", "No"}, + "usb": {"BoolFlag", "No"}, + "pcscdpath": {"notABoolFlag", "No"}, + "mainnet": {"BoolFlag", "No"}, + "goerli": {"BoolFlag", "No"}, + "bor-mumbai": {"BoolFlag", "No"}, + "bor-mainnet": {"BoolFlag", "No"}, + "rinkeby": {"BoolFlag", "No"}, + "ropsten": {"BoolFlag", "No"}, + "sepolia": {"BoolFlag", "No"}, + "kiln": {"BoolFlag", "No"}, + "exitwhensynced": {"BoolFlag", "No"}, + "light.serve": {"notABoolFlag", "No"}, + "light.ingress": {"notABoolFlag", "No"}, + "light.egress": {"notABoolFlag", "No"}, + "light.maxpeers": {"notABoolFlag", "No"}, + "ulc.servers": {"notABoolFlag", "No"}, + "ulc.fraction": {"notABoolFlag", "No"}, + "ulc.onlyannounce": {"BoolFlag", "No"}, + "light.nopruning": {"BoolFlag", "No"}, + "light.nosyncserve": {"BoolFlag", "No"}, + "dev.gaslimit": {"notABoolFlag", "No"}, + "ethash.cachedir": {"notABoolFlag", "No"}, + "ethash.cachesinmem": {"notABoolFlag", "No"}, + "ethash.cachesondisk": {"notABoolFlag", "No"}, + "ethash.cacheslockmmap": {"BoolFlag", "No"}, + "ethash.dagdir": {"notABoolFlag", "No"}, + "ethash.dagsinmem": {"notABoolFlag", "No"}, + "ethash.dagsondisk": {"notABoolFlag", "No"}, + "ethash.dagslockmmap": {"BoolFlag", "No"}, + "fdlimit": {"notABoolFlag", "No"}, + "signer": {"notABoolFlag", "No"}, + "authrpc.jwtsecret": {"notABoolFlag", "No"}, + "authrpc.addr": {"notABoolFlag", "No"}, + "authrpc.port": {"notABoolFlag", "No"}, + "authrpc.vhosts": {"notABoolFlag", "No"}, + "graphql.corsdomain": {"notABoolFlag", "No"}, + "graphql.vhosts": {"notABoolFlag", "No"}, + "rpc.evmtimeout": {"notABoolFlag", "No"}, + "rpc.allow-unprotected-txs": {"BoolFlag", "No"}, + "jspath": {"notABoolFlag", "No"}, + "exec": {"notABoolFlag", "No"}, + "preload": {"notABoolFlag", "No"}, + "discovery.dns": {"notABoolFlag", "No"}, + "netrestrict": {"notABoolFlag", "No"}, + "nodekey": {"notABoolFlag", "No"}, + "nodekeyhex": {"notABoolFlag", "No"}, + "miner.threads": {"notABoolFlag", "No"}, + "miner.notify": {"notABoolFlag", "No"}, + "miner.notify.full": {"BoolFlag", "No"}, + "miner.recommit": {"notABoolFlag", "No"}, + "miner.noverify": {"BoolFlag", "No"}, + "vmdebug": {"BoolFlag", "No"}, + "fakepow": {"BoolFlag", "No"}, + "nocompaction": {"BoolFlag", "No"}, + "metrics.addr": {"notABoolFlag", "No"}, + "metrics.port": {"notABoolFlag", "No"}, + "whitelist": {"notABoolFlag", "No"}, + "snapshot": {"BoolFlag", "YesF"}, + "bloomfilter.size": {"notABoolFlag", "No"}, + "bor.logs": {"BoolFlag", "No"}, + "override.arrowglacier": {"notABoolFlag", "No"}, + "override.terminaltotaldifficulty": {"notABoolFlag", "No"}, + "verbosity": {"notABoolFlag", "YesFV"}, + "ws.origins": {"notABoolFlag", "YesF"}, +} + +// map from cli flags to corresponding toml tags +var nameTagMap = map[string]string{ + "chain": "chain", + "identity": "identity", + "log-level": "log-level", + "datadir": "datadir", + "keystore": "keystore", + "syncmode": "syncmode", + "gcmode": "gcmode", + "eth.requiredblocks": "eth.requiredblocks", + "0-snapshot": "snapshot", + "url": "bor.heimdall", + "bor.without": "bor.withoutheimdall", + "grpc-address": "bor.heimdallgRPC", + "locals": "txpool.locals", + "nolocals": "txpool.nolocals", + "journal": "txpool.journal", + "rejournal": "txpool.rejournal", + "pricelimit": "txpool.pricelimit", + "pricebump": "txpool.pricebump", + "accountslots": "txpool.accountslots", + "globalslots": "txpool.globalslots", + "accountqueue": "txpool.accountqueue", + "globalqueue": "txpool.globalqueue", + "lifetime": "txpool.lifetime", + "mine": "mine", + "etherbase": "miner.etherbase", + "extradata": "miner.extradata", + "gaslimit": "miner.gaslimit", + "gasprice": "miner.gasprice", + "ethstats": "ethstats", + "blocks": "gpo.blocks", + "percentile": "gpo.percentile", + "maxprice": "gpo.maxprice", + "ignoreprice": "gpo.ignoreprice", + "cache": "cache", + "1-database": "cache.database", + "trie": "cache.trie", + "trie.journal": "cache.journal", + "trie.rejournal": "cache.rejournal", + "gc": "cache.gc", + "1-snapshot": "cache.snapshot", + "noprefetch": "cache.noprefetch", + "preimages": "cache.preimages", + "txlookuplimit": "txlookuplimit", + "gascap": "rpc.gascap", + "txfeecap": "rpc.txfeecap", + "ipcdisable": "ipcdisable", + "ipcpath": "ipcpath", + "1-corsdomain": "http.corsdomain", + "1-vhosts": "http.vhosts", + "2-corsdomain": "ws.corsdomain", + "2-vhosts": "ws.vhosts", + "3-corsdomain": "graphql.corsdomain", + "3-vhosts": "graphql.vhosts", + "1-enabled": "http", + "1-host": "http.addr", + "1-port": "http.port", + "1-prefix": "http.rpcprefix", + "1-api": "http.api", + "2-enabled": "ws", + "2-host": "ws.addr", + "2-port": "ws.port", + "2-prefix": "ws.rpcprefix", + "2-api": "ws.api", + "3-enabled": "graphql", + "bind": "bind", + "0-port": "port", + "bootnodes": "bootnodes", + "maxpeers": "maxpeers", + "maxpendpeers": "maxpendpeers", + "nat": "nat", + "nodiscover": "nodiscover", + "v5disc": "v5disc", + "metrics": "metrics", + "expensive": "metrics.expensive", + "influxdb": "metrics.influxdb", + "endpoint": "metrics.influxdb.endpoint", + "0-database": "metrics.influxdb.database", + "username": "metrics.influxdb.username", + "0-password": "metrics.influxdb.password", + "tags": "metrics.influxdb.tags", + "prometheus-addr": "metrics.prometheus-addr", + "opencollector-endpoint": "metrics.opencollector-endpoint", + "influxdbv2": "metrics.influxdbv2", + "token": "metrics.influxdb.token", + "bucket": "metrics.influxdb.bucket", + "organization": "metrics.influxdb.organization", + "unlock": "unlock", + "1-password": "password", + "allow-insecure-unlock": "allow-insecure-unlock", + "lightkdf": "lightkdf", + "disable-bor-wallet": "disable-bor-wallet", + "addr": "grpc.addr", + "dev": "dev", + "period": "dev.period", +} + +var removedFlagsAndValues = map[string]string{} + +var replacedFlagsMapFlagAndValue = map[string]map[string]map[string]string{ + "networkid": { + "flag": { + "networkid": "chain", + }, + "value": { + "'137'": "mainnet", + "137": "mainnet", + "'80001'": "mumbai", + "80001": "mumbai", + }, + }, + "verbosity": { + "flag": { + "verbosity": "log-level", + }, + "value": { + "0": "SILENT", + "1": "ERROR", + "2": "WARN", + "3": "INFO", + "4": "DEBUG", + "5": "DETAIL", + }, + }, +} + +var replacedFlagsMapFlag = map[string]string{ + "ws.origins": "ws.corsdomain", +} + +var currentBoolFlags = []string{ + "snapshot", + "bor.withoutheimdall", + "txpool.nolocals", + "mine", + "cache.noprefetch", + "cache.preimages", + "ipcdisable", + "http", + "ws", + "graphql", + "nodiscover", + "v5disc", + "metrics", + "metrics.expensive", + "metrics.influxdb", + "metrics.influxdbv2", + "allow-insecure-unlock", + "lightkdf", + "disable-bor-wallet", + "dev", +} + +func contains(s []string, str string) (bool, int) { + for ind, v := range s { + if v == str || v == "-"+str || v == "--"+str { + return true, ind + } + } + + return false, -1 +} + +func indexOf(s []string, str string) int { + for k, v := range s { + if v == str || v == "-"+str || v == "--"+str { + return k + } + } + + return -1 +} + +func remove1(s []string, idx int) []string { + removedFlagsAndValues[s[idx]] = "" + return append(s[:idx], s[idx+1:]...) +} + +func remove2(s []string, idx int) []string { + removedFlagsAndValues[s[idx]] = s[idx+1] + return append(s[:idx], s[idx+2:]...) +} + +func checkFlag(allFlags []string, checkFlags []string) []string { + outOfDateFlags := []string{} + + for _, flag := range checkFlags { + t1, _ := contains(allFlags, flag) + if !t1 { + outOfDateFlags = append(outOfDateFlags, flag) + } + } + + return outOfDateFlags +} + +func checkFileExists(path string) bool { + _, err := os.Stat(path) + if errors.Is(err, os.ErrNotExist) { + fmt.Println("WARN: File does not exist", path) + return false + } else { + return true + } +} + +func writeTempStaticJSON(path string) { + data, err := os.ReadFile(path) + if err != nil { + log.Fatal(err) + } + + var conf interface{} + if err := json.Unmarshal(data, &conf); err != nil { + log.Fatal(err) + } + + temparr := []string{} + for _, item := range conf.([]interface{}) { + temparr = append(temparr, item.(string)) + } + + // write to a temp file + err = os.WriteFile("./tempStaticNodes.json", []byte(strings.Join(temparr, "\", \"")), 0600) + if err != nil { + log.Fatal(err) + } +} + +func writeTempStaticTrustedTOML(path string) { + data, err := toml.LoadFile(path) + if err != nil { + log.Fatal(err) + } + + if data.Has("Node.P2P.StaticNodes") { + temparr := []string{} + for _, item := range data.Get("Node.P2P.StaticNodes").([]interface{}) { + temparr = append(temparr, item.(string)) + } + + err = os.WriteFile("./tempStaticNodes.toml", []byte(strings.Join(temparr, "\", \"")), 0600) + if err != nil { + log.Fatal(err) + } + } + + if data.Has("Node.P2P.TrustedNodes") { + temparr := []string{} + for _, item := range data.Get("Node.P2P.TrustedNodes").([]interface{}) { + temparr = append(temparr, item.(string)) + } + + err = os.WriteFile("./tempTrustedNodes.toml", []byte(strings.Join(temparr, "\", \"")), 0600) + if err != nil { + log.Fatal(err) + } + } +} + +func getStaticTrustedNodes(args []string) { + // if config flag is passed, it should be only a .toml file + t1, t2 := contains(args, "config") + // nolint: nestif + if t1 { + path := args[t2+1] + if !checkFileExists(path) { + return + } + + if path[len(path)-4:] == "toml" { + writeTempStaticTrustedTOML(path) + } else { + fmt.Println("only TOML config file is supported through CLI") + } + } else { + path := "~/.bor/data/bor/static-nodes.json" + if !checkFileExists(path) { + return + } + writeTempStaticJSON(path) + } +} + +func getFlagsToCheck(args []string) []string { + flagsToCheck := []string{} + + for _, item := range args { + if strings.HasPrefix(item, "-") { + if item[1] == '-' { + temp := item[2:] + flagsToCheck = append(flagsToCheck, temp) + } else { + temp := item[1:] + flagsToCheck = append(flagsToCheck, temp) + } + } + } + + return flagsToCheck +} + +func getFlagType(flag string) string { + return flagMap[flag][0] +} + +func updateArgsClean(args []string, outOfDateFlags []string) []string { + updatedArgs := []string{} + updatedArgs = append(updatedArgs, args...) + + // iterate through outOfDateFlags and remove the flags from updatedArgs along with their value (if any) + for _, item := range outOfDateFlags { + idx := indexOf(updatedArgs, item) + + if getFlagType(item) == "BoolFlag" { + // remove the element at index idx + updatedArgs = remove1(updatedArgs, idx) + } else { + // remove the element at index idx and idx + 1 + updatedArgs = remove2(updatedArgs, idx) + } + } + + return updatedArgs +} + +func updateArgsAdd(args []string) []string { + for flag, value := range removedFlagsAndValues { + if strings.HasPrefix(flag, "--") { + flag = flag[2:] + } else { + flag = flag[1:] + } + + if flagMap[flag][1] == "YesFV" { + temp := "--" + replacedFlagsMapFlagAndValue[flag]["flag"][flag] + " " + replacedFlagsMapFlagAndValue[flag]["value"][value] + args = append(args, temp) + } else if flagMap[flag][1] == "YesF" { + temp := "--" + replacedFlagsMapFlag[flag] + " " + value + args = append(args, temp) + } + } + + return args +} + +func handlePrometheus(args []string, updatedArgs []string) []string { + var newUpdatedArgs []string + + mAddr := "" + mPort := "" + + pAddr := "" + pPort := "" + + newUpdatedArgs = append(newUpdatedArgs, updatedArgs...) + + for i, val := range args { + if strings.Contains(val, "metrics.addr") && strings.HasPrefix(val, "-") { + mAddr = args[i+1] + } + + if strings.Contains(val, "metrics.port") && strings.HasPrefix(val, "-") { + mPort = args[i+1] + } + + if strings.Contains(val, "pprof.addr") && strings.HasPrefix(val, "-") { + pAddr = args[i+1] + } + + if strings.Contains(val, "pprof.port") && strings.HasPrefix(val, "-") { + pPort = args[i+1] + } + } + + if mAddr != "" && mPort != "" { + newUpdatedArgs = append(newUpdatedArgs, "--metrics.prometheus-addr") + newUpdatedArgs = append(newUpdatedArgs, mAddr+":"+mPort) + } else if pAddr != "" && pPort != "" { + newUpdatedArgs = append(newUpdatedArgs, "--metrics.prometheus-addr") + newUpdatedArgs = append(newUpdatedArgs, pAddr+":"+pPort) + } + + return newUpdatedArgs +} + +func dumpFlags(args []string) { + err := os.WriteFile("./temp", []byte(strings.Join(args, " ")), 0600) + if err != nil { + fmt.Println("Error in WriteFile") + } else { + fmt.Println("WriteFile Done") + } +} + +// nolint: gocognit +func commentFlags(path string, updatedArgs []string) { + const cache = "[cache]" + + const telemetry = "[telemetry]" + + // snapshot: "[cache]" + cacheFlag := 0 + + // corsdomain, vhosts, enabled, host, api, port, prefix: "[p2p]", " [jsonrpc.http]", " [jsonrpc.ws]", " [jsonrpc.graphql]" + p2pHttpWsGraphFlag := -1 + + // database: "[telemetry]", "[cache]" + databaseFlag := -1 + + // password: "[telemetry]", "[accounts]" + passwordFlag := -1 + + ignoreLineFlag := false + + input, err := os.ReadFile(path) + if err != nil { + log.Fatalln(err) + } + + lines := strings.Split(string(input), "\n") + + var newLines []string + newLines = append(newLines, lines...) + + for i, line := range lines { + if line == cache { + cacheFlag += 1 + } + + if line == "[p2p]" || line == " [jsonrpc.http]" || line == " [jsonrpc.ws]" || line == " [jsonrpc.graphql]" { + p2pHttpWsGraphFlag += 1 + } + + if line == telemetry || line == cache { + databaseFlag += 1 + } + + if line == telemetry || line == "[accounts]" { + passwordFlag += 1 + } + + if line == "[\"eth.requiredblocks\"]" || line == " [telemetry.influx.tags]" { + ignoreLineFlag = true + } else if line != "" { + if strings.HasPrefix(strings.Fields(line)[0], "[") { + ignoreLineFlag = false + } + } + + // nolint: nestif + if !(strings.HasPrefix(line, "[") || strings.HasPrefix(line, " [") || strings.HasPrefix(line, " [") || line == "" || ignoreLineFlag) { + flag := strings.Fields(line)[0] + if flag == "snapshot" { + flag = strconv.Itoa(cacheFlag) + "-" + flag + } else if flag == "corsdomain" { + flag = strconv.Itoa(p2pHttpWsGraphFlag) + "-" + flag + } else if flag == "vhosts" { + flag = strconv.Itoa(p2pHttpWsGraphFlag) + "-" + flag + } else if flag == "enabled" { + flag = strconv.Itoa(p2pHttpWsGraphFlag) + "-" + flag + } else if flag == "host" { + flag = strconv.Itoa(p2pHttpWsGraphFlag) + "-" + flag + } else if flag == "api" { + flag = strconv.Itoa(p2pHttpWsGraphFlag) + "-" + flag + } else if flag == "port" { + flag = strconv.Itoa(p2pHttpWsGraphFlag) + "-" + flag + } else if flag == "prefix" { + flag = strconv.Itoa(p2pHttpWsGraphFlag) + "-" + flag + } else if flag == "database" { + flag = strconv.Itoa(databaseFlag) + "-" + flag + } else if flag == "password" { + flag = strconv.Itoa(passwordFlag) + "-" + flag + } + + if flag != "static-nodes" && flag != "trusted-nodes" { + flag = nameTagMap[flag] + + tempFlag := false + + for _, val := range updatedArgs { + if strings.Contains(val, flag) && (strings.Contains(val, "-") || strings.Contains(val, "--")) { + tempFlag = true + } + } + + if !tempFlag || flag == "" { + newLines[i] = "# " + line + } + } + } + } + + output := strings.Join(newLines, "\n") + + err = os.WriteFile(path, []byte(output), 0600) + if err != nil { + log.Fatalln(err) + } +} + +func checkBoolFlags(val string) bool { + returnFlag := false + + if strings.Contains(val, "=") { + val = strings.Split(val, "=")[0] + } + + for _, flag := range currentBoolFlags { + if val == "-"+flag || val == "--"+flag { + returnFlag = true + } + } + + return returnFlag +} + +func beautifyArgs(args []string) ([]string, []string) { + newArgs := []string{} + + ignoreForNow := []string{} + + temp := []string{} + + for _, val := range args { + // nolint: nestif + if !(checkBoolFlags(val)) { + if strings.HasPrefix(val, "-") { + if strings.Contains(val, "=") { + temparr := strings.Split(val, "=") + newArgs = append(newArgs, temparr...) + } else { + newArgs = append(newArgs, val) + } + } else { + newArgs = append(newArgs, val) + } + } else { + ignoreForNow = append(ignoreForNow, val) + } + } + + for j, val := range newArgs { + if val == "-unlock" || val == "--unlock" { + temp = append(temp, "--miner.etherbase") + temp = append(temp, newArgs[j+1]) + } + } + + newArgs = append(newArgs, temp...) + + return newArgs, ignoreForNow +} + +func main() { + const notYet = "notYet" + + temp := os.Args[1] + args := os.Args[2:] + + args, ignoreForNow := beautifyArgs(args) + + c := server.Command{} + flags := c.Flags() + allFlags := flags.GetAllFlags() + flagsToCheck := getFlagsToCheck(args) + + if temp == notYet { + getStaticTrustedNodes(args) + } + + outOfDateFlags := checkFlag(allFlags, flagsToCheck) + updatedArgs := updateArgsClean(args, outOfDateFlags) + updatedArgs = updateArgsAdd(updatedArgs) + updatedArgs = handlePrometheus(args, updatedArgs) + + if temp == notYet { + updatedArgs = append(updatedArgs, ignoreForNow...) + dumpFlags(updatedArgs) + } + + if temp != notYet { + updatedArgs = append(updatedArgs, ignoreForNow...) + commentFlags(temp, updatedArgs) + } +} diff --git a/scripts/getconfig.sh b/scripts/getconfig.sh new file mode 100755 index 0000000000..26d5d0138c --- /dev/null +++ b/scripts/getconfig.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env sh + +# Instructions: +# Execute `./getconfig.sh`, and follow the instructions displayed on the terminal +# The `*-config.toml` file will be created in the same directory as start.sh +# It is recommended to check the flags generated in config.toml + + +read -p "* Path to start.sh: " startPath +# check if start.sh is present +if [[ ! -f $startPath ]] +then + echo "Error: start.sh do not exist." + exit 1 +fi +read -p "* Your validator address (e.g. 0xca67a8D767e45056DC92384b488E9Af654d78DE2), or press Enter to skip if running a sentry node: " ADD + +echo "\nThank you, your inputs are:" +echo "Path to start.sh: "$startPath +echo "Address: "$ADD + +confPath=${startPath%.sh}"-config.toml" +echo "Path to the config file: "$confPath +# check if config.toml is present +if [[ -f $confPath ]] +then + echo "WARN: config.toml exists, data will be overwritten." +fi + +tmpDir="$(mktemp -d -t ./temp-dir-XXXXXXXXXXX || oops "Can't create temporary directory")" +cleanup() { + rm -rf "$tmpDir" +} +trap cleanup EXIT INT QUIT TERM + +# SHA1 hash of `tempStart` -> `3305fe263dd4a999d58f96deb064e21bb70123d9` +sed 's/bor --/go run getconfig.go notYet --/g' $startPath > $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh +chmod +x $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh +$tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh $ADD +rm $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh + + +sed -i '' "s%*%'*'%g" ./temp + +# read the flags from `./temp` +dumpconfigflags=$(head -1 ./temp) + +# run the dumpconfig command with the flags from `./temp` +command="bor dumpconfig "$dumpconfigflags" > "$confPath +bash -c "$command" + +rm ./temp + +if [[ -f ./tempStaticNodes.json ]] +then + echo "JSON StaticNodes found" + staticnodesjson=$(head -1 ./tempStaticNodes.json) + sed -i '' "s%static-nodes = \[\]%static-nodes = \[\"${staticnodesjson}\"\]%" $confPath + rm ./tempStaticNodes.json +elif [[ -f ./tempStaticNodes.toml ]] +then + echo "TOML StaticNodes found" + staticnodestoml=$(head -1 ./tempStaticNodes.toml) + sed -i '' "s%static-nodes = \[\]%static-nodes = \[\"${staticnodestoml}\"\]%" $confPath + rm ./tempStaticNodes.toml +else + echo "neither JSON nor TOML StaticNodes found" +fi + +if [[ -f ./tempTrustedNodes.toml ]] +then + echo "TOML TrustedNodes found" + trustednodestoml=$(head -1 ./tempTrustedNodes.toml) + sed -i '' "s%trusted-nodes = \[\]%trusted-nodes = \[\"${trustednodestoml}\"\]%" $confPath + rm ./tempTrustedNodes.toml +else + echo "neither JSON nor TOML TrustedNodes found" +fi + +# comment flags in $configPath that were not passed through $startPath +# SHA1 hash of `tempStart` -> `3305fe263dd4a999d58f96deb064e21bb70123d9` +sed "s%bor --%go run getconfig.go ${confPath} --%" $startPath > $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh +chmod +x $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh +$tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh $ADD +rm $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh + +exit 0 From c7246711725de10452d436b3f86d26f28821acfb Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 25 Aug 2022 23:13:22 +0530 Subject: [PATCH 155/190] rm: snapshot found log in bor consensus (#504) --- consensus/bor/bor.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go index 826a45dae2..f140146976 100644 --- a/consensus/bor/bor.go +++ b/consensus/bor/bor.go @@ -535,8 +535,6 @@ func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash co number, hash = number-1, header.ParentHash } - log.Info("Snapshot has been found in", "headers depth", len(headers)) - // check if snapshot is nil if snap == nil { return nil, fmt.Errorf("Unknown error while retrieving snapshot at block number %v", number) From 1a515607262cd327ae7345671ba316e98f7ebe74 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Tue, 4 Oct 2022 21:54:47 +0530 Subject: [PATCH 156/190] make script OS independent (#538) --- scripts/getconfig.sh | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/scripts/getconfig.sh b/scripts/getconfig.sh index 26d5d0138c..943d540a88 100755 --- a/scripts/getconfig.sh +++ b/scripts/getconfig.sh @@ -1,10 +1,19 @@ #!/usr/bin/env sh +set -e # Instructions: # Execute `./getconfig.sh`, and follow the instructions displayed on the terminal # The `*-config.toml` file will be created in the same directory as start.sh # It is recommended to check the flags generated in config.toml +# Some checks to make commands OS independent +OS="$(uname -s)" +MKTEMPOPTION= +SEDOPTION= ## Not used as of now (TODO) +shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + SEDOPTION="''" + MKTEMPOPTION="-t" +fi read -p "* Path to start.sh: " startPath # check if start.sh is present @@ -15,7 +24,7 @@ then fi read -p "* Your validator address (e.g. 0xca67a8D767e45056DC92384b488E9Af654d78DE2), or press Enter to skip if running a sentry node: " ADD -echo "\nThank you, your inputs are:" +printf "\nThank you, your inputs are:\n" echo "Path to start.sh: "$startPath echo "Address: "$ADD @@ -26,8 +35,9 @@ if [[ -f $confPath ]] then echo "WARN: config.toml exists, data will be overwritten." fi +printf "\n" -tmpDir="$(mktemp -d -t ./temp-dir-XXXXXXXXXXX || oops "Can't create temporary directory")" +tmpDir="$(mktemp -d $MKTEMPOPTION ./temp-dir-XXXXXXXXXXX || oops "Can't create temporary directory")" cleanup() { rm -rf "$tmpDir" } @@ -39,8 +49,11 @@ chmod +x $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh $ADD rm $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh - -sed -i '' "s%*%'*'%g" ./temp +shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + sed -i '' "s%*%'*'%g" ./temp +else + sed -i "s%*%'*'%g" ./temp +fi # read the flags from `./temp` dumpconfigflags=$(head -1 ./temp) @@ -51,17 +64,27 @@ bash -c "$command" rm ./temp +printf "\n" + if [[ -f ./tempStaticNodes.json ]] then echo "JSON StaticNodes found" staticnodesjson=$(head -1 ./tempStaticNodes.json) - sed -i '' "s%static-nodes = \[\]%static-nodes = \[\"${staticnodesjson}\"\]%" $confPath + shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + sed -i '' "s%static-nodes = \[\]%static-nodes = \[\"${staticnodesjson}\"\]%" $confPath + else + sed -i "s%static-nodes = \[\]%static-nodes = \[\"${staticnodesjson}\"\]%" $confPath + fi rm ./tempStaticNodes.json elif [[ -f ./tempStaticNodes.toml ]] then echo "TOML StaticNodes found" staticnodestoml=$(head -1 ./tempStaticNodes.toml) - sed -i '' "s%static-nodes = \[\]%static-nodes = \[\"${staticnodestoml}\"\]%" $confPath + shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + sed -i '' "s%static-nodes = \[\]%static-nodes = \[\"${staticnodestoml}\"\]%" $confPath + else + sed -i "s%static-nodes = \[\]%static-nodes = \[\"${staticnodestoml}\"\]%" $confPath + fi rm ./tempStaticNodes.toml else echo "neither JSON nor TOML StaticNodes found" @@ -71,12 +94,18 @@ if [[ -f ./tempTrustedNodes.toml ]] then echo "TOML TrustedNodes found" trustednodestoml=$(head -1 ./tempTrustedNodes.toml) - sed -i '' "s%trusted-nodes = \[\]%trusted-nodes = \[\"${trustednodestoml}\"\]%" $confPath + shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + sed -i '' "s%trusted-nodes = \[\]%trusted-nodes = \[\"${trustednodestoml}\"\]%" $confPath + else + sed -i "s%trusted-nodes = \[\]%trusted-nodes = \[\"${trustednodestoml}\"\]%" $confPath + fi rm ./tempTrustedNodes.toml else echo "neither JSON nor TOML TrustedNodes found" fi +printf "\n" + # comment flags in $configPath that were not passed through $startPath # SHA1 hash of `tempStart` -> `3305fe263dd4a999d58f96deb064e21bb70123d9` sed "s%bor --%go run getconfig.go ${confPath} --%" $startPath > $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh From 083c3fead17e2317b45925d3547cc9497d2313e5 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Wed, 5 Oct 2022 23:38:19 +0530 Subject: [PATCH 157/190] internal/cli: add support for bor.logs flag in new-cli (#541) * add support for bor.logs flag in new-cli * handle bor.withoutheimdall flag commenting in conversion script --- builder/files/config.toml | 3 ++- docs/cli/removedb.md | 4 +++- docs/cli/server.md | 10 +++++++--- internal/cli/server/config.go | 8 +++++++- internal/cli/server/flags.go | 10 ++++++++-- scripts/getconfig.go | 4 +++- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/builder/files/config.toml b/builder/files/config.toml index ce9fd782d0..0d01f85d71 100644 --- a/builder/files/config.toml +++ b/builder/files/config.toml @@ -10,6 +10,7 @@ datadir = "/var/lib/bor/data" syncmode = "full" # gcmode = "full" # snapshot = true +# "bor.logs" = false # ethstats = "" # ["eth.requiredblocks"] @@ -134,4 +135,4 @@ syncmode = "full" # [developer] # dev = false - # period = 0 \ No newline at end of file + # period = 0 diff --git a/docs/cli/removedb.md b/docs/cli/removedb.md index 3c6e84f1d6..473d47ecef 100644 --- a/docs/cli/removedb.md +++ b/docs/cli/removedb.md @@ -4,4 +4,6 @@ The ```bor removedb``` command will remove the blockchain and state databases at ## Options -- ```datadir```: Path of the data directory to store information +- ```address```: Address of the grpc endpoint + +- ```datadir```: Path of the data directory to store information \ No newline at end of file diff --git a/docs/cli/server.md b/docs/cli/server.md index ac43555275..5fe440b5fd 100644 --- a/docs/cli/server.md +++ b/docs/cli/server.md @@ -16,18 +16,22 @@ The ```bor server``` command runs the Bor client. - ```config```: File for the config file -- ```syncmode```: Blockchain sync mode ("fast", "full", or "snap") +- ```syncmode```: Blockchain sync mode (only "full" sync supported) - ```gcmode```: Blockchain garbage collection mode ("full", "archive") -- ```requiredblocks```: Comma separated block number-to-hash mappings to enforce (=) +- ```eth.requiredblocks```: Comma separated block number-to-hash mappings to require for peering (=) -- ```snapshot```: Disables/Enables the snapshot-database mode (default = true) +- ```snapshot```: Enables the snapshot-database mode (default = true) + +- ```bor.logs```: Enables bor log retrieval (default = false) - ```bor.heimdall```: URL of Heimdall service - ```bor.withoutheimdall```: Run without Heimdall service (for testing purpose) +- ```bor.heimdallgRPC```: Address of Heimdall gRPC service + - ```ethstats```: Reporting URL of a ethstats service (nodename:secret@host:port) - ```gpo.blocks```: Number of recent blocks to check for gas prices diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index a4f642a6e3..c9e770c5ba 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -62,9 +62,12 @@ type Config struct { // GcMode selects the garbage collection mode for the trie GcMode string `hcl:"gcmode,optional" toml:"gcmode,optional"` - // Snapshot disables/enables the snapshot database mode + // Snapshot enables the snapshot database mode Snapshot bool `hcl:"snapshot,optional" toml:"snapshot,optional"` + // BorLogs enables bor log retrieval + BorLogs bool `hcl:"bor.logs,optional" toml:"bor.logs,optional"` + // Ethstats is the address of the ethstats server to send telemetry Ethstats string `hcl:"ethstats,optional" toml:"ethstats,optional"` @@ -416,6 +419,7 @@ func DefaultConfig() *Config { SyncMode: "full", GcMode: "full", Snapshot: true, + BorLogs: false, TxPool: &TxPoolConfig{ Locals: []string{}, NoLocals: false, @@ -645,6 +649,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* n.NetworkId = c.chain.NetworkId n.Genesis = c.chain.Genesis } + n.HeimdallURL = c.Heimdall.URL n.WithoutHeimdall = c.Heimdall.Without @@ -876,6 +881,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* } } + n.BorLogs = c.BorLogs n.DatabaseHandles = dbHandles return &n, nil diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index 835ff0ab95..ec74f89991 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -45,7 +45,7 @@ func (c *Command) Flags() *flagset.Flagset { }) f.StringFlag(&flagset.StringFlag{ Name: "syncmode", - Usage: `Blockchain sync mode ("fast", "full", or "snap")`, + Usage: `Blockchain sync mode (only "full" sync supported)`, Value: &c.cliConfig.SyncMode, Default: c.cliConfig.SyncMode, }) @@ -62,10 +62,16 @@ func (c *Command) Flags() *flagset.Flagset { }) f.BoolFlag(&flagset.BoolFlag{ Name: "snapshot", - Usage: `Disables/Enables the snapshot-database mode (default = true)`, + Usage: `Enables the snapshot-database mode (default = true)`, Value: &c.cliConfig.Snapshot, Default: c.cliConfig.Snapshot, }) + f.BoolFlag(&flagset.BoolFlag{ + Name: "bor.logs", + Usage: `Enables bor log retrieval (default = false)`, + Value: &c.cliConfig.BorLogs, + Default: c.cliConfig.BorLogs, + }) // heimdall f.StringFlag(&flagset.StringFlag{ diff --git a/scripts/getconfig.go b/scripts/getconfig.go index 689ed68fbf..136b69ecab 100644 --- a/scripts/getconfig.go +++ b/scripts/getconfig.go @@ -109,8 +109,9 @@ var nameTagMap = map[string]string{ "gcmode": "gcmode", "eth.requiredblocks": "eth.requiredblocks", "0-snapshot": "snapshot", + "\"bor.logs\"": "bor.logs", "url": "bor.heimdall", - "bor.without": "bor.withoutheimdall", + "\"bor.without\"": "bor.withoutheimdall", "grpc-address": "bor.heimdallgRPC", "locals": "txpool.locals", "nolocals": "txpool.nolocals", @@ -231,6 +232,7 @@ var replacedFlagsMapFlag = map[string]string{ var currentBoolFlags = []string{ "snapshot", + "bor.logs", "bor.withoutheimdall", "txpool.nolocals", "mine", From cb12a6e4d6b93f86777128463738953649bee929 Mon Sep 17 00:00:00 2001 From: Jerry Date: Wed, 19 Oct 2022 14:55:31 -0700 Subject: [PATCH 158/190] Force load default tracers --- internal/cli/server/server.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index adacb44ce7..6758d74312 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -36,6 +36,10 @@ import ( "github.com/ethereum/go-ethereum/metrics/influxdb" "github.com/ethereum/go-ethereum/metrics/prometheus" "github.com/ethereum/go-ethereum/node" + + // Force-load the tracer engines to trigger registration + _ "github.com/ethereum/go-ethereum/eth/tracers/js" + _ "github.com/ethereum/go-ethereum/eth/tracers/native" ) type Server struct { From a977a76f97251d0a902921dd3a93610d969bb645 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Fri, 21 Oct 2022 02:15:42 +0530 Subject: [PATCH 159/190] metrics: handle values from config file (#565) * metrics: handle metrics flag from config in metrics.init() * internal/cli/server: log for metrics enabling and misconfiguration --- internal/cli/server/server.go | 10 +++++++ metrics/metrics.go | 53 ++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index 6758d74312..1346fe613a 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -233,6 +233,12 @@ func (s *Server) Stop() { } func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error { + // Check the global metrics if they're matching with the provided config + if metrics.Enabled != config.Enabled || metrics.EnabledExpensive != config.Expensive { + log.Warn("Metric misconfiguration, some of them might not be visible") + } + + // Update the values anyways (for services which don't need immediate attention) metrics.Enabled = config.Enabled metrics.EnabledExpensive = config.Expensive @@ -243,6 +249,10 @@ func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error log.Info("Enabling metrics collection") + if metrics.EnabledExpensive { + log.Info("Enabling expensive metrics collection") + } + // influxdb if v1Enabled, v2Enabled := config.InfluxDB.V1Enabled, config.InfluxDB.V2Enabled; v1Enabled || v2Enabled { if v1Enabled && v2Enabled { diff --git a/metrics/metrics.go b/metrics/metrics.go index 747d6471a7..1d0133e850 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -11,7 +11,7 @@ import ( "strings" "time" - "github.com/ethereum/go-ethereum/log" + "github.com/BurntSushi/toml" ) // Enabled is checked by the constructor functions for all of the @@ -32,26 +32,71 @@ var enablerFlags = []string{"metrics"} // expensiveEnablerFlags is the CLI flag names to use to enable metrics collections. var expensiveEnablerFlags = []string{"metrics.expensive"} +// configFlag is the CLI flag name to use to start node by providing a toml based config +var configFlag = "config" + // Init enables or disables the metrics system. Since we need this to run before // any other code gets to create meters and timers, we'll actually do an ugly hack // and peek into the command line args for the metrics flag. func init() { - for _, arg := range os.Args { + var configFile string + + for i := 0; i < len(os.Args); i++ { + arg := os.Args[i] + flag := strings.TrimLeft(arg, "-") + // check for existence of `config` flag + if flag == configFlag && i < len(os.Args)-1 { + configFile = strings.TrimLeft(os.Args[i+1], "-") // find the value of flag + } + for _, enabler := range enablerFlags { if !Enabled && flag == enabler { - log.Info("Enabling metrics collection") Enabled = true } } + for _, enabler := range expensiveEnablerFlags { if !EnabledExpensive && flag == enabler { - log.Info("Enabling expensive metrics collection") EnabledExpensive = true } } } + + // Update the global metrics value, if they're provided in the config file + updateMetricsFromConfig(configFile) +} + +func updateMetricsFromConfig(path string) { + // Don't act upon any errors here. They're already taken into + // consideration when the toml config file will be parsed in the cli. + data, err := os.ReadFile(path) + tomlData := string(data) + + if err != nil { + return + } + + // Create a minimal config to decode + type TelemetryConfig struct { + Enabled bool `hcl:"metrics,optional" toml:"metrics,optional"` + Expensive bool `hcl:"expensive,optional" toml:"expensive,optional"` + } + + type CliConfig struct { + Telemetry *TelemetryConfig `hcl:"telemetry,block" toml:"telemetry,block"` + } + + conf := &CliConfig{} + + if _, err := toml.Decode(tomlData, &conf); err != nil || conf == nil { + return + } + + // We have the values now, update them + Enabled = conf.Telemetry.Enabled + EnabledExpensive = conf.Telemetry.Expensive } // CollectProcessMetrics periodically collects various metrics about the running From 5c5c9924405721b03f240ae994520fe94fec5b6e Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Fri, 21 Oct 2022 08:54:38 +0530 Subject: [PATCH 160/190] Changed default value of maxpeers from 200 to 50, update docs (#555) * changed default of maxpeers from 200 to 50 * docs: update additional notes for new-cli * docs: update additional notes for new-cli * small bug fix in the script to fix shopt issue Co-authored-by: Manav Darji --- cmd/geth/config.go | 4 ++-- docs/README.md | 18 ++++++++---------- docs/config.md | 2 +- internal/cli/server/config.go | 2 +- scripts/getconfig.sh | 2 +- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 08b76f83da..101f4b2de6 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -329,7 +329,7 @@ func setDefaultMumbaiGethConfig(ctx *cli.Context, config *gethConfig) { config.Eth.TxPool.AccountQueue = 64 config.Eth.TxPool.GlobalQueue = 131072 config.Eth.TxPool.Lifetime = 90 * time.Minute - config.Node.P2P.MaxPeers = 200 + config.Node.P2P.MaxPeers = 50 config.Metrics.Enabled = true // --pprof is enabled in 'internal/debug/flags.go' } @@ -352,7 +352,7 @@ func setDefaultBorMainnetGethConfig(ctx *cli.Context, config *gethConfig) { config.Eth.TxPool.AccountQueue = 64 config.Eth.TxPool.GlobalQueue = 131072 config.Eth.TxPool.Lifetime = 90 * time.Minute - config.Node.P2P.MaxPeers = 200 + config.Node.P2P.MaxPeers = 50 config.Metrics.Enabled = true // --pprof is enabled in 'internal/debug/flags.go' } diff --git a/docs/README.md b/docs/README.md index 95ba38b0da..5ebdbd7e26 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,18 +5,16 @@ - [Configuration file](./config.md) -## Deprecation notes +## Additional notes - The new entrypoint to run the Bor client is ```server```. -``` -$ bor server -``` + ``` + $ bor server + ``` -- Toml files to configure nodes are being deprecated. Currently, we only allow for static and trusted nodes to be configured using toml files. +- Toml files used earlier just to configure static/trusted nodes are being deprecated. Instead, a toml file now can be used instead of flags and can contain all configuration for the node to run. The link to a sample config file is given above. To simply run bor with a configuration file, the following command can be used. -``` -$ bor server --config ./legacy.toml -``` - -- ```Admin```, ```Personal``` and account related endpoints in ```Eth``` are being removed from the JsonRPC interface. Some of this functionality will be moved to the new GRPC server for operational tasks. + ``` + $ bor server --config + ``` diff --git a/docs/config.md b/docs/config.md index aebd9e12b9..57f4c25fef 100644 --- a/docs/config.md +++ b/docs/config.md @@ -22,7 +22,7 @@ ethstats = "" ["eth.requiredblocks"] [p2p] -maxpeers = 30 +maxpeers = 50 maxpendpeers = 50 bind = "0.0.0.0" port = 30303 diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index c9e770c5ba..86b611ac78 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -396,7 +396,7 @@ func DefaultConfig() *Config { LogLevel: "INFO", DataDir: DefaultDataDir(), P2P: &P2PConfig{ - MaxPeers: 30, + MaxPeers: 50, MaxPendPeers: 50, Bind: "0.0.0.0", Port: 30303, diff --git a/scripts/getconfig.sh b/scripts/getconfig.sh index 943d540a88..a2971c4f12 100755 --- a/scripts/getconfig.sh +++ b/scripts/getconfig.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env sh +#!/bin/bash set -e # Instructions: From b8c3b0043c1c7ad4f57b956e4ebcba30e9ee4bf8 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 12 Oct 2022 20:06:00 +0530 Subject: [PATCH 161/190] add : Add state sync transaction to debug_traceBlock --- consensus/bor/statefull/processor.go | 52 +++++++-- core/vm/interface.go | 2 + eth/tracers/api.go | 159 +++++++++++++++++++++------ eth/tracers/api_test.go | 11 +- 4 files changed, 178 insertions(+), 46 deletions(-) diff --git a/consensus/bor/statefull/processor.go b/consensus/bor/statefull/processor.go index e30fb4fd21..192ea5fa38 100644 --- a/consensus/bor/statefull/processor.go +++ b/consensus/bor/statefull/processor.go @@ -30,22 +30,22 @@ func (c ChainContext) GetHeader(hash common.Hash, number uint64) *types.Header { } // callmsg implements core.Message to allow passing it as a transaction simulator. -type callmsg struct { +type Callmsg struct { ethereum.CallMsg } -func (m callmsg) From() common.Address { return m.CallMsg.From } -func (m callmsg) Nonce() uint64 { return 0 } -func (m callmsg) CheckNonce() bool { return false } -func (m callmsg) To() *common.Address { return m.CallMsg.To } -func (m callmsg) GasPrice() *big.Int { return m.CallMsg.GasPrice } -func (m callmsg) Gas() uint64 { return m.CallMsg.Gas } -func (m callmsg) Value() *big.Int { return m.CallMsg.Value } -func (m callmsg) Data() []byte { return m.CallMsg.Data } +func (m Callmsg) From() common.Address { return m.CallMsg.From } +func (m Callmsg) Nonce() uint64 { return 0 } +func (m Callmsg) CheckNonce() bool { return false } +func (m Callmsg) To() *common.Address { return m.CallMsg.To } +func (m Callmsg) GasPrice() *big.Int { return m.CallMsg.GasPrice } +func (m Callmsg) Gas() uint64 { return m.CallMsg.Gas } +func (m Callmsg) Value() *big.Int { return m.CallMsg.Value } +func (m Callmsg) Data() []byte { return m.CallMsg.Data } // get system message -func GetSystemMessage(toAddress common.Address, data []byte) callmsg { - return callmsg{ +func GetSystemMessage(toAddress common.Address, data []byte) Callmsg { + return Callmsg{ ethereum.CallMsg{ From: systemAddress, Gas: math.MaxUint64 / 2, @@ -59,7 +59,7 @@ func GetSystemMessage(toAddress common.Address, data []byte) callmsg { // apply message func ApplyMessage( - msg callmsg, + msg Callmsg, state *state.StateDB, header *types.Header, chainConfig *params.ChainConfig, @@ -90,4 +90,32 @@ func ApplyMessage( gasUsed := initialGas - gasLeft return gasUsed, nil + +} + +func ApplyBorMessage(vmenv vm.EVM, msg Callmsg) (*core.ExecutionResult, error) { + + initialGas := msg.Gas() + + // Apply the transaction to the current state (included in the env) + ret, gasLeft, err := vmenv.Call( + vm.AccountRef(msg.From()), + *msg.To(), + msg.Data(), + msg.Gas(), + msg.Value(), + ) + // Update the state with pending changes + if err != nil { + vmenv.StateDB.Finalise(true) + } + + gasUsed := initialGas - gasLeft + + return &core.ExecutionResult{ + UsedGas: gasUsed, + Err: err, + ReturnData: ret, + }, nil + } diff --git a/core/vm/interface.go b/core/vm/interface.go index ad9b05d666..1064adf590 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -74,6 +74,8 @@ type StateDB interface { AddPreimage(common.Hash, []byte) ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error + + Finalise(bool) } // CallContext provides a basic interface for the EVM calling conventions. The EVM diff --git a/eth/tracers/api.go b/eth/tracers/api.go index 08c17601e4..12b1411ae7 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -28,9 +28,11 @@ import ( "sync" "time" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/bor/statefull" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" @@ -80,6 +82,9 @@ type Backend interface { // so this method should be called with the parent. StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive, preferDisk bool) (*state.StateDB, error) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (core.Message, vm.BlockContext, *state.StateDB, error) + + // Bor related APIs + GetBorBlockTransactionWithBlockHash(ctx context.Context, txHash common.Hash, blockHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) } // API is the collection of tracing APIs exposed over the private debugging endpoint. @@ -164,6 +169,25 @@ func (api *API) blockByNumberAndHash(ctx context.Context, number rpc.BlockNumber return api.blockByHash(ctx, hash) } +// returns block transactions along with state-sync transaction if present +func (api *API) getAllBlockTransactions(ctx context.Context, block *types.Block) (types.Transactions, bool) { + txs := block.Transactions() + + stateSyncPresent := false + + borReceipt := rawdb.ReadBorReceipt(api.backend.ChainDb(), block.Hash(), block.NumberU64()) + if borReceipt != nil { + txHash := types.GetDerivedBorTxHash(types.BorReceiptKey(block.Number().Uint64(), block.Hash())) + if txHash != (common.Hash{}) { + borTx, _, _, _, _ := api.backend.GetBorBlockTransactionWithBlockHash(ctx, txHash, block.Hash()) + txs = append(txs, borTx) + stateSyncPresent = true + } + } + + return txs, stateSyncPresent +} + // TraceConfig holds extra parameters to trace functions. type TraceConfig struct { *logger.Config @@ -274,19 +298,30 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config signer := types.MakeSigner(api.backend.ChainConfig(), task.block.Number()) blockCtx := core.NewEVMBlockContext(task.block.Header(), api.chainContext(localctx), nil) // Trace all the transactions contained within - for i, tx := range task.block.Transactions() { + txs, stateSyncPresent := api.getAllBlockTransactions(ctx, task.block) + for i, tx := range txs { msg, _ := tx.AsMessage(signer, task.block.BaseFee()) txctx := &Context{ BlockHash: task.block.Hash(), TxIndex: i, TxHash: tx.Hash(), } - res, err := api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config) + + var res interface{} + var err error + + if stateSyncPresent && i == len(txs)-1 { + res, err = api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config, true) + } else { + res, err = api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config, false) + } + if err != nil { task.results[i] = &txTraceResult{Error: err.Error()} log.Warn("Tracing failed", "hash", tx.Hash(), "block", task.block.NumberU64(), "err", err) break } + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect task.statedb.Finalise(api.backend.ChainConfig().IsEIP158(task.block.Number())) task.results[i] = &txTraceResult{Result: res} @@ -492,6 +527,23 @@ func (api *API) StandardTraceBlockToFile(ctx context.Context, hash common.Hash, return api.standardTraceBlockToFile(ctx, block, config) } +func prepareCallMessage(msg core.Message) statefull.Callmsg { + + return statefull.Callmsg{ + ethereum.CallMsg{ + From: msg.From(), + To: msg.To(), + Gas: msg.Gas(), + GasPrice: msg.GasPrice(), + GasFeeCap: msg.GasFeeCap(), + GasTipCap: msg.GasTipCap(), + Value: msg.Value(), + Data: msg.Data(), + AccessList: msg.AccessList(), + }} + +} + // IntermediateRoots executes a block (bad- or canon- or side-), and returns a list // of intermediate roots: the stateroot after each transaction. func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config *TraceConfig) ([]common.Hash, error) { @@ -525,23 +577,42 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config vmctx = core.NewEVMBlockContext(block.Header(), api.chainContext(ctx), nil) deleteEmptyObjects = chainConfig.IsEIP158(block.Number()) ) - for i, tx := range block.Transactions() { + txs, stateSyncPresent := api.getAllBlockTransactions(ctx, block) + for i, tx := range txs { var ( msg, _ = tx.AsMessage(signer, block.BaseFee()) txContext = core.NewEVMTxContext(msg) vmenv = vm.NewEVM(vmctx, txContext, statedb, chainConfig, vm.Config{}) ) statedb.Prepare(tx.Hash(), i) - if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { - log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) - // We intentionally don't return the error here: if we do, then the RPC server will not - // return the roots. Most likely, the caller already knows that a certain transaction fails to - // be included, but still want the intermediate roots that led to that point. - // It may happen the tx_N causes an erroneous state, which in turn causes tx_N+M to not be - // executable. - // N.B: This should never happen while tracing canon blocks, only when tracing bad blocks. - return roots, nil + if stateSyncPresent && i == len(txs)-1 { + callmsg := prepareCallMessage(msg) + + if _, err := statefull.ApplyMessage(ctx, callmsg, statedb, block.Header(), api.backend.ChainConfig(), api.chainContext(ctx)); err != nil { + log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) + // We intentionally don't return the error here: if we do, then the RPC server will not + // return the roots. Most likely, the caller already knows that a certain transaction fails to + // be included, but still want the intermediate roots that led to that point. + // It may happen the tx_N causes an erroneous state, which in turn causes tx_N+M to not be + // executable. + // N.B: This should never happen while tracing canon blocks, only when tracing bad blocks. + return roots, nil + } + + } else { + if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { + log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) + // We intentionally don't return the error here: if we do, then the RPC server will not + // return the roots. Most likely, the caller already knows that a certain transaction fails to + // be included, but still want the intermediate roots that led to that point. + // It may happen the tx_N causes an erroneous state, which in turn causes tx_N+M to not be + // executable. + // N.B: This should never happen while tracing canon blocks, only when tracing bad blocks. + return roots, nil + } + } + // calling IntermediateRoot will internally call Finalize on the state // so any modifications are written to the trie roots = append(roots, statedb.IntermediateRoot(deleteEmptyObjects)) @@ -581,9 +652,9 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac } // Execute all the transaction contained within the block concurrently var ( - signer = types.MakeSigner(api.backend.ChainConfig(), block.Number()) - txs = block.Transactions() - results = make([]*txTraceResult, len(txs)) + signer = types.MakeSigner(api.backend.ChainConfig(), block.Number()) + txs, stateSyncPresent = api.getAllBlockTransactions(ctx, block) + results = make([]*txTraceResult, len(txs)) pend = new(sync.WaitGroup) jobs = make(chan *txTraceTask, len(txs)) @@ -606,7 +677,13 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac TxIndex: task.index, TxHash: txs[task.index].Hash(), } - res, err := api.traceTx(ctx, msg, txctx, blockCtx, task.statedb, config) + var res interface{} + var err error + if stateSyncPresent && task.index == len(txs)-1 { + res, err = api.traceTx(ctx, msg, txctx, blockCtx, task.statedb, config, true) + } else { + res, err = api.traceTx(ctx, msg, txctx, blockCtx, task.statedb, config, false) + } if err != nil { results[task.index] = &txTraceResult{Error: err.Error()} continue @@ -650,7 +727,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block, config *StdTraceConfig) ([]string, error) { // If we're tracing a single transaction, make sure it's present if config != nil && config.TxHash != (common.Hash{}) { - if !containsTx(block, config.TxHash) { + if !api.containsTx(ctx, block, config.TxHash) { return nil, fmt.Errorf("transaction %#x not found in block", config.TxHash) } } @@ -705,7 +782,8 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block canon = false } } - for i, tx := range block.Transactions() { + txs, stateSyncPresent := api.getAllBlockTransactions(ctx, block) + for i, tx := range txs { // Prepare the trasaction for un-traced execution var ( msg, _ = tx.AsMessage(signer, block.BaseFee()) @@ -739,10 +817,19 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block // Execute the transaction and flush any traces to disk vmenv := vm.NewEVM(vmctx, txContext, statedb, chainConfig, vmConf) statedb.Prepare(tx.Hash(), i) - _, err = core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())) - if writer != nil { - writer.Flush() + if stateSyncPresent && i == len(txs)-1 { + callmsg := prepareCallMessage(msg) + _, err = statefull.ApplyBorMessage(*vmenv, callmsg) + if writer != nil { + writer.Flush() + } + } else { + _, err = core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())) + if writer != nil { + writer.Flush() + } } + if dump != nil { dump.Close() log.Info("Wrote standard trace", "file", dump.Name()) @@ -764,8 +851,9 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block // containsTx reports whether the transaction with a certain hash // is contained within the specified block. -func containsTx(block *types.Block, hash common.Hash) bool { - for _, tx := range block.Transactions() { +func (api *API) containsTx(ctx context.Context, block *types.Block, hash common.Hash) bool { + txs, _ := api.getAllBlockTransactions(ctx, block) + for _, tx := range txs { if tx.Hash() == hash { return true } @@ -775,7 +863,7 @@ func containsTx(block *types.Block, hash common.Hash) bool { // TraceTransaction returns the structured logs created during the execution of EVM // and returns them as a JSON object. -func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config *TraceConfig) (interface{}, error) { +func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config *TraceConfig, borTx bool) (interface{}, error) { tx, blockHash, blockNumber, index, err := api.backend.GetTransaction(ctx, hash) if tx == nil { // For BorTransaction, there will be no trace available @@ -811,14 +899,14 @@ func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config * TxIndex: int(index), TxHash: hash, } - return api.traceTx(ctx, msg, txctx, vmctx, statedb, config) + return api.traceTx(ctx, msg, txctx, vmctx, statedb, config, borTx) } // TraceCall lets you trace a given eth_call. It collects the structured logs // created during the execution of EVM if the given transaction was added on // top of the provided block and returns them as a JSON object. // You can provide -2 as a block number to trace on top of the pending block. -func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, config *TraceCallConfig) (interface{}, error) { +func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, config *TraceCallConfig, borTx bool) (interface{}, error) { // Try to retrieve the specified block var ( err error @@ -865,13 +953,13 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc Reexec: config.Reexec, } } - return api.traceTx(ctx, msg, new(Context), vmctx, statedb, traceConfig) + return api.traceTx(ctx, msg, new(Context), vmctx, statedb, traceConfig, borTx) } // traceTx configures a new tracer according to the provided configuration, and // executes the given message in the provided environment. The return value will // be tracer dependent. -func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Context, vmctx vm.BlockContext, statedb *state.StateDB, config *TraceConfig) (interface{}, error) { +func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Context, vmctx vm.BlockContext, statedb *state.StateDB, config *TraceConfig, borTx bool) (interface{}, error) { // Assemble the structured logger or the JavaScript tracer var ( tracer vm.EVMLogger @@ -911,9 +999,18 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex // Call Prepare to clear out the statedb access list statedb.Prepare(txctx.TxHash, txctx.TxIndex) - result, err := core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) - if err != nil { - return nil, fmt.Errorf("tracing failed: %w", err) + var result *core.ExecutionResult + if borTx { + callmsg := prepareCallMessage(message) + if result, err = statefull.ApplyBorMessage(*vmenv, callmsg); err != nil { + return nil, fmt.Errorf("tracing failed: %w", err) + } + + } else { + result, err = core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) + if err != nil { + return nil, fmt.Errorf("tracing failed: %w", err) + } } // Depending on the tracer type, format and return the output. diff --git a/eth/tracers/api_test.go b/eth/tracers/api_test.go index a3c0a72494..32c36f16ee 100644 --- a/eth/tracers/api_test.go +++ b/eth/tracers/api_test.go @@ -176,6 +176,11 @@ func (b *testBackend) StateAtTransaction(ctx context.Context, block *types.Block return nil, vm.BlockContext{}, nil, fmt.Errorf("transaction index %d out of range for block %#x", txIndex, block.Hash()) } +func (b *testBackend) GetBorBlockTransactionWithBlockHash(ctx context.Context, txHash common.Hash, blockHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + tx, blockHash, blockNumber, index := rawdb.ReadBorTransactionWithBlockHash(b.ChainDb(), txHash, blockHash) + return tx, blockHash, blockNumber, index, nil +} + func TestTraceCall(t *testing.T) { t.Parallel() @@ -285,7 +290,7 @@ func TestTraceCall(t *testing.T) { }, } for _, testspec := range testSuite { - result, err := api.TraceCall(context.Background(), testspec.call, rpc.BlockNumberOrHash{BlockNumber: &testspec.blockNumber}, testspec.config) + result, err := api.TraceCall(context.Background(), testspec.call, rpc.BlockNumberOrHash{BlockNumber: &testspec.blockNumber}, testspec.config, false) if testspec.expectErr != nil { if err == nil { t.Errorf("Expect error %v, get nothing", testspec.expectErr) @@ -325,7 +330,7 @@ func TestTraceTransaction(t *testing.T) { b.AddTx(tx) target = tx.Hash() })) - result, err := api.TraceTransaction(context.Background(), target, nil) + result, err := api.TraceTransaction(context.Background(), target, nil, false) if err != nil { t.Errorf("Failed to trace transaction %v", err) } @@ -508,7 +513,7 @@ func TestTracingWithOverrides(t *testing.T) { }, } for i, tc := range testSuite { - result, err := api.TraceCall(context.Background(), tc.call, rpc.BlockNumberOrHash{BlockNumber: &tc.blockNumber}, tc.config) + result, err := api.TraceCall(context.Background(), tc.call, rpc.BlockNumberOrHash{BlockNumber: &tc.blockNumber}, tc.config, false) if tc.expectErr != nil { if err == nil { t.Errorf("test %d: want error %v, have nothing", i, tc.expectErr) From ee18b3cd18bb5ec6d435b761f68c34936dfe0c39 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Thu, 13 Oct 2022 15:36:21 +0530 Subject: [PATCH 162/190] chg : major fix --- eth/tracers/api.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/eth/tracers/api.go b/eth/tracers/api.go index 12b1411ae7..c6398d1a8a 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -702,11 +702,22 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac // Generate the next state snapshot fast without tracing msg, _ := tx.AsMessage(signer, block.BaseFee()) statedb.Prepare(tx.Hash(), i) + vmenv := vm.NewEVM(blockCtx, core.NewEVMTxContext(msg), statedb, api.backend.ChainConfig(), vm.Config{}) - if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { - failed = err - break + + if stateSyncPresent && i == len(txs)-1 { + callmsg := prepareCallMessage(msg) + if _, err := statefull.ApplyBorMessage(*vmenv, callmsg); err != nil { + failed = err + break + } + } else { + if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { + failed = err + break + } } + // Finalize the state so any modifications are written to the trie // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect statedb.Finalise(vmenv.ChainConfig().IsEIP158(block.Number())) From bfd4f3e74e8f8f2ab3fc1429ec68c9b2f6ffb85a Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Thu, 13 Oct 2022 15:55:45 +0530 Subject: [PATCH 163/190] chg : support state-sync in newcli server debugBorBlock --- eth/tracers/api_bor.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/eth/tracers/api_bor.go b/eth/tracers/api_bor.go index 6ab1a4290a..8993b9ae38 100644 --- a/eth/tracers/api_bor.go +++ b/eth/tracers/api_bor.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/bor/statefull" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" @@ -68,14 +69,14 @@ func (api *API) traceBorBlock(ctx context.Context, block *types.Block, config *T // Execute all the transaction contained within the block concurrently var ( - signer = types.MakeSigner(api.backend.ChainConfig(), block.Number()) - txs = block.Transactions() - deleteEmptyObjects = api.backend.ChainConfig().IsEIP158(block.Number()) + signer = types.MakeSigner(api.backend.ChainConfig(), block.Number()) + txs, stateSyncPresent = api.getAllBlockTransactions(ctx, block) + deleteEmptyObjects = api.backend.ChainConfig().IsEIP158(block.Number()) ) blockCtx := core.NewEVMBlockContext(block.Header(), api.chainContext(ctx), nil) - traceTxn := func(indx int, tx *types.Transaction) *TxTraceResult { + traceTxn := func(indx int, tx *types.Transaction, borTx bool) *TxTraceResult { message, _ := tx.AsMessage(signer, block.BaseFee()) txContext := core.NewEVMTxContext(message) @@ -88,7 +89,15 @@ func (api *API) traceBorBlock(ctx context.Context, block *types.Block, config *T // Not sure if we need to do this statedb.Prepare(tx.Hash(), indx) - execRes, err := core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) + var execRes *core.ExecutionResult + + if borTx { + callmsg := prepareCallMessage(message) + execRes, err = statefull.ApplyBorMessage(*vmenv, callmsg) + } else { + execRes, err = core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) + } + if err != nil { return &TxTraceResult{ Error: err.Error(), @@ -115,7 +124,11 @@ func (api *API) traceBorBlock(ctx context.Context, block *types.Block, config *T } for indx, tx := range txs { - res.Transactions = append(res.Transactions, traceTxn(indx, tx)) + if stateSyncPresent && indx == len(txs)-1 { + res.Transactions = append(res.Transactions, traceTxn(indx, tx, true)) + } else { + res.Transactions = append(res.Transactions, traceTxn(indx, tx, false)) + } } return res, nil From bce66b7ef5352b687d92e373f5da5fc125be1770 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 14 Oct 2022 12:53:46 +0530 Subject: [PATCH 164/190] chg : lint files --- consensus/bor/statefull/processor.go | 3 --- eth/tracers/api.go | 17 ++++++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/consensus/bor/statefull/processor.go b/consensus/bor/statefull/processor.go index 192ea5fa38..98ed41ed92 100644 --- a/consensus/bor/statefull/processor.go +++ b/consensus/bor/statefull/processor.go @@ -90,11 +90,9 @@ func ApplyMessage( gasUsed := initialGas - gasLeft return gasUsed, nil - } func ApplyBorMessage(vmenv vm.EVM, msg Callmsg) (*core.ExecutionResult, error) { - initialGas := msg.Gas() // Apply the transaction to the current state (included in the env) @@ -117,5 +115,4 @@ func ApplyBorMessage(vmenv vm.EVM, msg Callmsg) (*core.ExecutionResult, error) { Err: err, ReturnData: ret, }, nil - } diff --git a/eth/tracers/api.go b/eth/tracers/api.go index c6398d1a8a..baf9417b82 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -308,6 +308,7 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config } var res interface{} + var err error if stateSyncPresent && i == len(txs)-1 { @@ -528,9 +529,8 @@ func (api *API) StandardTraceBlockToFile(ctx context.Context, hash common.Hash, } func prepareCallMessage(msg core.Message) statefull.Callmsg { - return statefull.Callmsg{ - ethereum.CallMsg{ + CallMsg: ethereum.CallMsg{ From: msg.From(), To: msg.To(), Gas: msg.Gas(), @@ -541,7 +541,6 @@ func prepareCallMessage(msg core.Message) statefull.Callmsg { Data: msg.Data(), AccessList: msg.AccessList(), }} - } // IntermediateRoots executes a block (bad- or canon- or side-), and returns a list @@ -577,6 +576,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config vmctx = core.NewEVMBlockContext(block.Header(), api.chainContext(ctx), nil) deleteEmptyObjects = chainConfig.IsEIP158(block.Number()) ) + txs, stateSyncPresent := api.getAllBlockTransactions(ctx, block) for i, tx := range txs { var ( @@ -585,6 +585,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config vmenv = vm.NewEVM(vmctx, txContext, statedb, chainConfig, vm.Config{}) ) statedb.Prepare(tx.Hash(), i) + if stateSyncPresent && i == len(txs)-1 { callmsg := prepareCallMessage(msg) @@ -598,7 +599,6 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config // N.B: This should never happen while tracing canon blocks, only when tracing bad blocks. return roots, nil } - } else { if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) @@ -677,7 +677,9 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac TxIndex: task.index, TxHash: txs[task.index].Hash(), } + var res interface{} + var err error if stateSyncPresent && task.index == len(txs)-1 { res, err = api.traceTx(ctx, msg, txctx, blockCtx, task.statedb, config, true) @@ -793,6 +795,7 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block canon = false } } + txs, stateSyncPresent := api.getAllBlockTransactions(ctx, block) for i, tx := range txs { // Prepare the trasaction for un-traced execution @@ -828,9 +831,11 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block // Execute the transaction and flush any traces to disk vmenv := vm.NewEVM(vmctx, txContext, statedb, chainConfig, vmConf) statedb.Prepare(tx.Hash(), i) + if stateSyncPresent && i == len(txs)-1 { callmsg := prepareCallMessage(msg) _, err = statefull.ApplyBorMessage(*vmenv, callmsg) + if writer != nil { writer.Flush() } @@ -910,6 +915,7 @@ func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config * TxIndex: int(index), TxHash: hash, } + return api.traceTx(ctx, msg, txctx, vmctx, statedb, config, borTx) } @@ -964,6 +970,7 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc Reexec: config.Reexec, } } + return api.traceTx(ctx, msg, new(Context), vmctx, statedb, traceConfig, borTx) } @@ -1011,12 +1018,12 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex statedb.Prepare(txctx.TxHash, txctx.TxIndex) var result *core.ExecutionResult + if borTx { callmsg := prepareCallMessage(message) if result, err = statefull.ApplyBorMessage(*vmenv, callmsg); err != nil { return nil, fmt.Errorf("tracing failed: %w", err) } - } else { result, err = core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) if err != nil { From 967b20ebf782c14c030d4e3e96fb8df89d8d7718 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 21 Oct 2022 04:41:49 +0530 Subject: [PATCH 165/190] chg : major fix --- eth/tracers/api.go | 125 +++++++++++++++++++++++++++++----------- eth/tracers/api_test.go | 6 +- 2 files changed, 95 insertions(+), 36 deletions(-) diff --git a/eth/tracers/api.go b/eth/tracers/api.go index baf9417b82..135f1156cd 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -191,9 +191,11 @@ func (api *API) getAllBlockTransactions(ctx context.Context, block *types.Block) // TraceConfig holds extra parameters to trace functions. type TraceConfig struct { *logger.Config - Tracer *string - Timeout *string - Reexec *uint64 + Tracer *string + Timeout *string + Reexec *uint64 + BorTraceEnabled *bool + BorTx *bool } // TraceCallConfig is the config for traceCall API. It holds one more @@ -209,8 +211,9 @@ type TraceCallConfig struct { // StdTraceConfig holds extra parameters to standard-json trace functions. type StdTraceConfig struct { logger.Config - Reexec *uint64 - TxHash common.Hash + Reexec *uint64 + TxHash common.Hash + BorTrace *bool } // txTraceResult is the result of a single transaction trace. @@ -264,6 +267,11 @@ func (api *API) TraceChain(ctx context.Context, start, end rpc.BlockNumber, conf // executes all the transactions contained within. The return value will be one item // per transaction, dependent on the requested tracer. func (api *API) traceChain(ctx context.Context, start, end *types.Block, config *TraceConfig) (*rpc.Subscription, error) { + if config == nil { + config = &TraceConfig{ + BorTraceEnabled: newBoolPtr(false), + } + } // Tracing a chain is a **long** operation, only do with subscriptions notifier, supported := rpc.NotifierFromContext(ctx) if !supported { @@ -312,9 +320,14 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config var err error if stateSyncPresent && i == len(txs)-1 { - res, err = api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config, true) + if *config.BorTraceEnabled { + config.BorTx = newBoolPtr(true) + res, err = api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config) + } else { + break + } } else { - res, err = api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config, false) + res, err = api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config) } if err != nil { @@ -466,6 +479,11 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config return sub, nil } +func newBoolPtr(bb bool) *bool { + b := bb + return &b +} + // TraceBlockByNumber returns the structured logs created during the execution of // EVM and returns them as a JSON object. func (api *API) TraceBlockByNumber(ctx context.Context, number rpc.BlockNumber, config *TraceConfig) ([]*txTraceResult, error) { @@ -546,6 +564,12 @@ func prepareCallMessage(msg core.Message) statefull.Callmsg { // IntermediateRoots executes a block (bad- or canon- or side-), and returns a list // of intermediate roots: the stateroot after each transaction. func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config *TraceConfig) ([]common.Hash, error) { + if config == nil { + config = &TraceConfig{ + BorTraceEnabled: newBoolPtr(false), + } + } + block, _ := api.blockByHash(ctx, hash) if block == nil { // Check in the bad blocks @@ -587,18 +611,23 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config statedb.Prepare(tx.Hash(), i) if stateSyncPresent && i == len(txs)-1 { - callmsg := prepareCallMessage(msg) - - if _, err := statefull.ApplyMessage(ctx, callmsg, statedb, block.Header(), api.backend.ChainConfig(), api.chainContext(ctx)); err != nil { - log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) - // We intentionally don't return the error here: if we do, then the RPC server will not - // return the roots. Most likely, the caller already knows that a certain transaction fails to - // be included, but still want the intermediate roots that led to that point. - // It may happen the tx_N causes an erroneous state, which in turn causes tx_N+M to not be - // executable. - // N.B: This should never happen while tracing canon blocks, only when tracing bad blocks. - return roots, nil + if *config.BorTraceEnabled { + callmsg := prepareCallMessage(msg) + + if _, err := statefull.ApplyMessage(ctx, callmsg, statedb, block.Header(), api.backend.ChainConfig(), api.chainContext(ctx)); err != nil { + log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) + // We intentionally don't return the error here: if we do, then the RPC server will not + // return the roots. Most likely, the caller already knows that a certain transaction fails to + // be included, but still want the intermediate roots that led to that point. + // It may happen the tx_N causes an erroneous state, which in turn causes tx_N+M to not be + // executable. + // N.B: This should never happen while tracing canon blocks, only when tracing bad blocks. + return roots, nil + } + } else { + break } + } else { if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) @@ -635,6 +664,13 @@ func (api *API) StandardTraceBadBlockToFile(ctx context.Context, hash common.Has // executes all the transactions contained within. The return value will be one item // per transaction, dependent on the requestd tracer. func (api *API) traceBlock(ctx context.Context, block *types.Block, config *TraceConfig) ([]*txTraceResult, error) { + + if config == nil { + config = &TraceConfig{ + BorTraceEnabled: newBoolPtr(false), + } + } + if block.NumberU64() == 0 { return nil, errors.New("genesis is not traceable") } @@ -682,9 +718,14 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac var err error if stateSyncPresent && task.index == len(txs)-1 { - res, err = api.traceTx(ctx, msg, txctx, blockCtx, task.statedb, config, true) + if *config.BorTraceEnabled { + config.BorTx = newBoolPtr(true) + res, err = api.traceTx(ctx, msg, txctx, blockCtx, task.statedb, config) + } else { + break + } } else { - res, err = api.traceTx(ctx, msg, txctx, blockCtx, task.statedb, config, false) + res, err = api.traceTx(ctx, msg, txctx, blockCtx, task.statedb, config) } if err != nil { results[task.index] = &txTraceResult{Error: err.Error()} @@ -708,9 +749,13 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac vmenv := vm.NewEVM(blockCtx, core.NewEVMTxContext(msg), statedb, api.backend.ChainConfig(), vm.Config{}) if stateSyncPresent && i == len(txs)-1 { - callmsg := prepareCallMessage(msg) - if _, err := statefull.ApplyBorMessage(*vmenv, callmsg); err != nil { - failed = err + if *config.BorTraceEnabled { + callmsg := prepareCallMessage(msg) + if _, err := statefull.ApplyBorMessage(*vmenv, callmsg); err != nil { + failed = err + break + } + } else { break } } else { @@ -738,6 +783,11 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac // and traces either a full block or an individual transaction. The return value will // be one filename per transaction traced. func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block, config *StdTraceConfig) ([]string, error) { + if config == nil { + config = &StdTraceConfig{ + BorTrace: newBoolPtr(false), + } + } // If we're tracing a single transaction, make sure it's present if config != nil && config.TxHash != (common.Hash{}) { if !api.containsTx(ctx, block, config.TxHash) { @@ -833,11 +883,15 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block statedb.Prepare(tx.Hash(), i) if stateSyncPresent && i == len(txs)-1 { - callmsg := prepareCallMessage(msg) - _, err = statefull.ApplyBorMessage(*vmenv, callmsg) + if *config.BorTrace { + callmsg := prepareCallMessage(msg) + _, err = statefull.ApplyBorMessage(*vmenv, callmsg) - if writer != nil { - writer.Flush() + if writer != nil { + writer.Flush() + } + } else { + break } } else { _, err = core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())) @@ -879,7 +933,12 @@ func (api *API) containsTx(ctx context.Context, block *types.Block, hash common. // TraceTransaction returns the structured logs created during the execution of EVM // and returns them as a JSON object. -func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config *TraceConfig, borTx bool) (interface{}, error) { +func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config *TraceConfig) (interface{}, error) { + if config == nil { + config = &TraceConfig{ + BorTraceEnabled: newBoolPtr(false), + } + } tx, blockHash, blockNumber, index, err := api.backend.GetTransaction(ctx, hash) if tx == nil { // For BorTransaction, there will be no trace available @@ -916,14 +975,14 @@ func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config * TxHash: hash, } - return api.traceTx(ctx, msg, txctx, vmctx, statedb, config, borTx) + return api.traceTx(ctx, msg, txctx, vmctx, statedb, config) } // TraceCall lets you trace a given eth_call. It collects the structured logs // created during the execution of EVM if the given transaction was added on // top of the provided block and returns them as a JSON object. // You can provide -2 as a block number to trace on top of the pending block. -func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, config *TraceCallConfig, borTx bool) (interface{}, error) { +func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, config *TraceCallConfig) (interface{}, error) { // Try to retrieve the specified block var ( err error @@ -971,13 +1030,13 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc } } - return api.traceTx(ctx, msg, new(Context), vmctx, statedb, traceConfig, borTx) + return api.traceTx(ctx, msg, new(Context), vmctx, statedb, traceConfig) } // traceTx configures a new tracer according to the provided configuration, and // executes the given message in the provided environment. The return value will // be tracer dependent. -func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Context, vmctx vm.BlockContext, statedb *state.StateDB, config *TraceConfig, borTx bool) (interface{}, error) { +func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Context, vmctx vm.BlockContext, statedb *state.StateDB, config *TraceConfig) (interface{}, error) { // Assemble the structured logger or the JavaScript tracer var ( tracer vm.EVMLogger @@ -1019,7 +1078,7 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex var result *core.ExecutionResult - if borTx { + if *config.BorTx { callmsg := prepareCallMessage(message) if result, err = statefull.ApplyBorMessage(*vmenv, callmsg); err != nil { return nil, fmt.Errorf("tracing failed: %w", err) diff --git a/eth/tracers/api_test.go b/eth/tracers/api_test.go index 32c36f16ee..aa9f913396 100644 --- a/eth/tracers/api_test.go +++ b/eth/tracers/api_test.go @@ -290,7 +290,7 @@ func TestTraceCall(t *testing.T) { }, } for _, testspec := range testSuite { - result, err := api.TraceCall(context.Background(), testspec.call, rpc.BlockNumberOrHash{BlockNumber: &testspec.blockNumber}, testspec.config, false) + result, err := api.TraceCall(context.Background(), testspec.call, rpc.BlockNumberOrHash{BlockNumber: &testspec.blockNumber}, testspec.config) if testspec.expectErr != nil { if err == nil { t.Errorf("Expect error %v, get nothing", testspec.expectErr) @@ -330,7 +330,7 @@ func TestTraceTransaction(t *testing.T) { b.AddTx(tx) target = tx.Hash() })) - result, err := api.TraceTransaction(context.Background(), target, nil, false) + result, err := api.TraceTransaction(context.Background(), target, nil) if err != nil { t.Errorf("Failed to trace transaction %v", err) } @@ -513,7 +513,7 @@ func TestTracingWithOverrides(t *testing.T) { }, } for i, tc := range testSuite { - result, err := api.TraceCall(context.Background(), tc.call, rpc.BlockNumberOrHash{BlockNumber: &tc.blockNumber}, tc.config, false) + result, err := api.TraceCall(context.Background(), tc.call, rpc.BlockNumberOrHash{BlockNumber: &tc.blockNumber}, tc.config) if tc.expectErr != nil { if err == nil { t.Errorf("test %d: want error %v, have nothing", i, tc.expectErr) From 06a8f2870337dc84ea238ab616fd61c1080fa08b Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 21 Oct 2022 04:56:21 +0530 Subject: [PATCH 166/190] chg : minor fix --- eth/tracers/api.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/eth/tracers/api.go b/eth/tracers/api.go index 135f1156cd..c5ba6b9779 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -270,6 +270,7 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config if config == nil { config = &TraceConfig{ BorTraceEnabled: newBoolPtr(false), + BorTx: newBoolPtr(false), } } // Tracing a chain is a **long** operation, only do with subscriptions @@ -567,6 +568,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config if config == nil { config = &TraceConfig{ BorTraceEnabled: newBoolPtr(false), + BorTx: newBoolPtr(false), } } @@ -668,6 +670,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac if config == nil { config = &TraceConfig{ BorTraceEnabled: newBoolPtr(false), + BorTx: newBoolPtr(false), } } @@ -937,6 +940,7 @@ func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config * if config == nil { config = &TraceConfig{ BorTraceEnabled: newBoolPtr(false), + BorTx: newBoolPtr(false), } } tx, blockHash, blockNumber, index, err := api.backend.GetTransaction(ctx, hash) @@ -1078,6 +1082,10 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex var result *core.ExecutionResult + if config.BorTx == nil { + config.BorTx = newBoolPtr(false) + } + if *config.BorTx { callmsg := prepareCallMessage(message) if result, err = statefull.ApplyBorMessage(*vmenv, callmsg); err != nil { From 5e574bf129aef96dc7f0f88ef7ed9021ee2a177d Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 21 Oct 2022 05:38:45 +0530 Subject: [PATCH 167/190] chg : fix derference error on config without borTraceEnabled --- eth/tracers/api.go | 47 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/eth/tracers/api.go b/eth/tracers/api.go index c5ba6b9779..4534f4675f 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -65,6 +65,8 @@ const ( defaultTracechainMemLimit = common.StorageSize(500 * 1024 * 1024) ) +var defaultBorTraceEnabled = newBoolPtr(false) + // Backend interface provides the common API services (that are provided by // both full and light clients) with access to necessary functions. type Backend interface { @@ -269,10 +271,13 @@ func (api *API) TraceChain(ctx context.Context, start, end rpc.BlockNumber, conf func (api *API) traceChain(ctx context.Context, start, end *types.Block, config *TraceConfig) (*rpc.Subscription, error) { if config == nil { config = &TraceConfig{ - BorTraceEnabled: newBoolPtr(false), + BorTraceEnabled: defaultBorTraceEnabled, BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { + config.BorTraceEnabled = defaultBorTraceEnabled + } // Tracing a chain is a **long** operation, only do with subscriptions notifier, supported := rpc.NotifierFromContext(ctx) if !supported { @@ -308,6 +313,10 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config blockCtx := core.NewEVMBlockContext(task.block.Header(), api.chainContext(localctx), nil) // Trace all the transactions contained within txs, stateSyncPresent := api.getAllBlockTransactions(ctx, task.block) + if !*config.BorTraceEnabled && stateSyncPresent { + txs = txs[:len(txs)-1] + stateSyncPresent = false + } for i, tx := range txs { msg, _ := tx.AsMessage(signer, task.block.BaseFee()) txctx := &Context{ @@ -324,8 +333,6 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config if *config.BorTraceEnabled { config.BorTx = newBoolPtr(true) res, err = api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config) - } else { - break } } else { res, err = api.traceTx(localctx, msg, txctx, blockCtx, task.statedb, config) @@ -567,10 +574,13 @@ func prepareCallMessage(msg core.Message) statefull.Callmsg { func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config *TraceConfig) ([]common.Hash, error) { if config == nil { config = &TraceConfig{ - BorTraceEnabled: newBoolPtr(false), + BorTraceEnabled: defaultBorTraceEnabled, BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { + config.BorTraceEnabled = defaultBorTraceEnabled + } block, _ := api.blockByHash(ctx, hash) if block == nil { @@ -669,10 +679,13 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac if config == nil { config = &TraceConfig{ - BorTraceEnabled: newBoolPtr(false), + BorTraceEnabled: defaultBorTraceEnabled, BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { + config.BorTraceEnabled = defaultBorTraceEnabled + } if block.NumberU64() == 0 { return nil, errors.New("genesis is not traceable") @@ -779,7 +792,12 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac if failed != nil { return nil, failed } - return results, nil + + if !*config.BorTraceEnabled && stateSyncPresent { + return results[:len(results)-1], nil + } else { + return results, nil + } } // standardTraceBlockToFile configures a new tracer which uses standard JSON output, @@ -939,10 +957,14 @@ func (api *API) containsTx(ctx context.Context, block *types.Block, hash common. func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config *TraceConfig) (interface{}, error) { if config == nil { config = &TraceConfig{ - BorTraceEnabled: newBoolPtr(false), + BorTraceEnabled: defaultBorTraceEnabled, BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { + config.BorTraceEnabled = defaultBorTraceEnabled + } + tx, blockHash, blockNumber, index, err := api.backend.GetTransaction(ctx, hash) if tx == nil { // For BorTransaction, there will be no trace available @@ -1041,6 +1063,17 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc // executes the given message in the provided environment. The return value will // be tracer dependent. func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Context, vmctx vm.BlockContext, statedb *state.StateDB, config *TraceConfig) (interface{}, error) { + + if config == nil { + config = &TraceConfig{ + BorTraceEnabled: defaultBorTraceEnabled, + BorTx: newBoolPtr(false), + } + } + if config.BorTraceEnabled == nil { + config.BorTraceEnabled = defaultBorTraceEnabled + } + // Assemble the structured logger or the JavaScript tracer var ( tracer vm.EVMLogger From 3a0cedc4b17ee3402cc5269452871ccb931ed5ab Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 21 Oct 2022 06:26:43 +0530 Subject: [PATCH 168/190] chg : standardTraceBlockToFile fix --- eth/tracers/api.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/eth/tracers/api.go b/eth/tracers/api.go index 4534f4675f..ad52373038 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -213,9 +213,9 @@ type TraceCallConfig struct { // StdTraceConfig holds extra parameters to standard-json trace functions. type StdTraceConfig struct { logger.Config - Reexec *uint64 - TxHash common.Hash - BorTrace *bool + Reexec *uint64 + TxHash common.Hash + BorTraceEnabled *bool } // txTraceResult is the result of a single transaction trace. @@ -806,9 +806,12 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block, config *StdTraceConfig) ([]string, error) { if config == nil { config = &StdTraceConfig{ - BorTrace: newBoolPtr(false), + BorTraceEnabled: defaultBorTraceEnabled, } } + if config.BorTraceEnabled == nil { + config.BorTraceEnabled = defaultBorTraceEnabled + } // If we're tracing a single transaction, make sure it's present if config != nil && config.TxHash != (common.Hash{}) { if !api.containsTx(ctx, block, config.TxHash) { @@ -868,6 +871,11 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block } txs, stateSyncPresent := api.getAllBlockTransactions(ctx, block) + if !*config.BorTraceEnabled && stateSyncPresent { + txs = txs[:len(txs)-1] + stateSyncPresent = false + } + for i, tx := range txs { // Prepare the trasaction for un-traced execution var ( @@ -904,15 +912,13 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block statedb.Prepare(tx.Hash(), i) if stateSyncPresent && i == len(txs)-1 { - if *config.BorTrace { + if *config.BorTraceEnabled { callmsg := prepareCallMessage(msg) _, err = statefull.ApplyBorMessage(*vmenv, callmsg) if writer != nil { writer.Flush() } - } else { - break } } else { _, err = core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())) From 2ec9e7b540bf94f0cb23bed54baa666f5beafd0d Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Fri, 21 Oct 2022 06:49:01 +0530 Subject: [PATCH 169/190] add : lint --- eth/tracers/api.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/eth/tracers/api.go b/eth/tracers/api.go index ad52373038..3fce91ac9c 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -275,6 +275,7 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { config.BorTraceEnabled = defaultBorTraceEnabled } @@ -317,6 +318,7 @@ func (api *API) traceChain(ctx context.Context, start, end *types.Block, config txs = txs[:len(txs)-1] stateSyncPresent = false } + for i, tx := range txs { msg, _ := tx.AsMessage(signer, task.block.BaseFee()) txctx := &Context{ @@ -578,6 +580,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { config.BorTraceEnabled = defaultBorTraceEnabled } @@ -621,7 +624,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config vmenv = vm.NewEVM(vmctx, txContext, statedb, chainConfig, vm.Config{}) ) statedb.Prepare(tx.Hash(), i) - + //nolint: nestif if stateSyncPresent && i == len(txs)-1 { if *config.BorTraceEnabled { callmsg := prepareCallMessage(msg) @@ -639,7 +642,6 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config } else { break } - } else { if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) @@ -683,6 +685,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { config.BorTraceEnabled = defaultBorTraceEnabled } @@ -733,6 +736,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac var res interface{} var err error + if stateSyncPresent && task.index == len(txs)-1 { if *config.BorTraceEnabled { config.BorTx = newBoolPtr(true) @@ -763,7 +767,7 @@ func (api *API) traceBlock(ctx context.Context, block *types.Block, config *Trac statedb.Prepare(tx.Hash(), i) vmenv := vm.NewEVM(blockCtx, core.NewEVMTxContext(msg), statedb, api.backend.ChainConfig(), vm.Config{}) - + //nolint: nestif if stateSyncPresent && i == len(txs)-1 { if *config.BorTraceEnabled { callmsg := prepareCallMessage(msg) @@ -809,6 +813,7 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block BorTraceEnabled: defaultBorTraceEnabled, } } + if config.BorTraceEnabled == nil { config.BorTraceEnabled = defaultBorTraceEnabled } @@ -910,7 +915,7 @@ func (api *API) standardTraceBlockToFile(ctx context.Context, block *types.Block // Execute the transaction and flush any traces to disk vmenv := vm.NewEVM(vmctx, txContext, statedb, chainConfig, vmConf) statedb.Prepare(tx.Hash(), i) - + //nolint: nestif if stateSyncPresent && i == len(txs)-1 { if *config.BorTraceEnabled { callmsg := prepareCallMessage(msg) @@ -967,6 +972,7 @@ func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config * BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { config.BorTraceEnabled = defaultBorTraceEnabled } @@ -1076,6 +1082,7 @@ func (api *API) traceTx(ctx context.Context, message core.Message, txctx *Contex BorTx: newBoolPtr(false), } } + if config.BorTraceEnabled == nil { config.BorTraceEnabled = defaultBorTraceEnabled } From 0bc9f60756a63a4199a4bdadb3c1185e258257b6 Mon Sep 17 00:00:00 2001 From: Jerry Date: Tue, 1 Nov 2022 17:00:41 -0700 Subject: [PATCH 170/190] Remove context from ApplyMessage --- eth/tracers/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/tracers/api.go b/eth/tracers/api.go index 3fce91ac9c..36296e0d42 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -629,7 +629,7 @@ func (api *API) IntermediateRoots(ctx context.Context, hash common.Hash, config if *config.BorTraceEnabled { callmsg := prepareCallMessage(msg) - if _, err := statefull.ApplyMessage(ctx, callmsg, statedb, block.Header(), api.backend.ChainConfig(), api.chainContext(ctx)); err != nil { + if _, err := statefull.ApplyMessage(callmsg, statedb, block.Header(), api.backend.ChainConfig(), api.chainContext(ctx)); err != nil { log.Warn("Tracing intermediate roots did not complete", "txindex", i, "txhash", tx.Hash(), "err", err) // We intentionally don't return the error here: if we do, then the RPC server will not // return the roots. Most likely, the caller already knows that a certain transaction fails to From 8cc0b25353df448f4e09c043981e1752fa8236d5 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Fri, 4 Nov 2022 01:24:57 +0530 Subject: [PATCH 171/190] Removed vhosts for ws and replaced cors with origins (#574) * removed vhosts for ws and added replaced cors with origins * updated script --- builder/files/config.toml | 3 +-- docs/cli/server.md | 6 +++--- internal/cli/server/config.go | 8 +++++--- internal/cli/server/flags.go | 15 ++++----------- scripts/getconfig.go | 10 ++++------ 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/builder/files/config.toml b/builder/files/config.toml index 0d01f85d71..8f70f62a13 100644 --- a/builder/files/config.toml +++ b/builder/files/config.toml @@ -78,8 +78,7 @@ syncmode = "full" # prefix = "" # host = "localhost" # api = ["web3", "net"] - # vhosts = ["*"] - # corsdomain = ["*"] + # origins = ["*"] # [jsonrpc.graphql] # enabled = false # port = 0 diff --git a/docs/cli/server.md b/docs/cli/server.md index 5fe440b5fd..d52b135fa3 100644 --- a/docs/cli/server.md +++ b/docs/cli/server.md @@ -80,6 +80,8 @@ The ```bor server``` command runs the Bor client. - ```cache.preimages```: Enable recording the SHA3/keccak preimages of trie keys +- ```cache.triesinmemory```: Number of block states (tries) to keep in memory (default = 128) + - ```txlookuplimit```: Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain) ### JsonRPC Options @@ -96,9 +98,7 @@ The ```bor server``` command runs the Bor client. - ```http.vhosts```: Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. -- ```ws.corsdomain```: Comma separated list of domains from which to accept cross origin requests (browser enforced) - -- ```ws.vhosts```: Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. +- ```ws.origins```: Origins from which to accept websockets requests - ```graphql.corsdomain```: Comma separated list of domains from which to accept cross origin requests (browser enforced) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 86b611ac78..7070afca24 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -263,6 +263,9 @@ type APIConfig struct { // Cors is the list of Cors endpoints Cors []string `hcl:"corsdomain,optional" toml:"corsdomain,optional"` + + // Origins is the list of endpoints to accept requests from (only consumed for websockets) + Origins []string `hcl:"origins,optional" toml:"origins,optional"` } type GpoConfig struct { @@ -466,8 +469,7 @@ func DefaultConfig() *Config { Prefix: "", Host: "localhost", API: []string{"net", "web3"}, - Cors: []string{"localhost"}, - VHost: []string{"localhost"}, + Origins: []string{"localhost"}, }, Graphql: &APIConfig{ Enabled: false, @@ -921,7 +923,7 @@ func (c *Config) buildNode() (*node.Config, error) { HTTPVirtualHosts: c.JsonRPC.Http.VHost, HTTPPathPrefix: c.JsonRPC.Http.Prefix, WSModules: c.JsonRPC.Ws.API, - WSOrigins: c.JsonRPC.Ws.Cors, + WSOrigins: c.JsonRPC.Ws.Origins, WSPathPrefix: c.JsonRPC.Ws.Prefix, GraphQLCors: c.JsonRPC.Graphql.Cors, GraphQLVirtualHosts: c.JsonRPC.Graphql.VHost, diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index ec74f89991..79aec3157a 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -350,17 +350,10 @@ func (c *Command) Flags() *flagset.Flagset { Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "ws.corsdomain", - Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", - Value: &c.cliConfig.JsonRPC.Ws.Cors, - Default: c.cliConfig.JsonRPC.Ws.Cors, - Group: "JsonRPC", - }) - f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "ws.vhosts", - Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", - Value: &c.cliConfig.JsonRPC.Ws.VHost, - Default: c.cliConfig.JsonRPC.Ws.VHost, + Name: "ws.origins", + Usage: "Origins from which to accept websockets requests", + Value: &c.cliConfig.JsonRPC.Ws.Origins, + Default: c.cliConfig.JsonRPC.Ws.Origins, Group: "JsonRPC", }) f.SliceStringFlag(&flagset.SliceStringFlag{ diff --git a/scripts/getconfig.go b/scripts/getconfig.go index 136b69ecab..caf3f45a8e 100644 --- a/scripts/getconfig.go +++ b/scripts/getconfig.go @@ -95,7 +95,7 @@ var flagMap = map[string][]string{ "override.arrowglacier": {"notABoolFlag", "No"}, "override.terminaltotaldifficulty": {"notABoolFlag", "No"}, "verbosity": {"notABoolFlag", "YesFV"}, - "ws.origins": {"notABoolFlag", "YesF"}, + "ws.origins": {"notABoolFlag", "No"}, } // map from cli flags to corresponding toml tags @@ -150,8 +150,7 @@ var nameTagMap = map[string]string{ "ipcpath": "ipcpath", "1-corsdomain": "http.corsdomain", "1-vhosts": "http.vhosts", - "2-corsdomain": "ws.corsdomain", - "2-vhosts": "ws.vhosts", + "origins": "ws.origins", "3-corsdomain": "graphql.corsdomain", "3-vhosts": "graphql.vhosts", "1-enabled": "http", @@ -226,9 +225,8 @@ var replacedFlagsMapFlagAndValue = map[string]map[string]map[string]string{ }, } -var replacedFlagsMapFlag = map[string]string{ - "ws.origins": "ws.corsdomain", -} +// Do not remove +var replacedFlagsMapFlag = map[string]string{} var currentBoolFlags = []string{ "snapshot", From a0f754dfc510f4badf41a35bcaa6df162a14aab3 Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Tue, 22 Nov 2022 15:34:25 -0600 Subject: [PATCH 172/190] Adding in Mumbai/Mainnet precursor deb packaging for tests to use during upgrade(iterations to come) --- .github/workflows/packager.yml | 318 ++++++++++++++++++ packaging/deb/.README.md.swp | Bin 0 -> 12288 bytes packaging/deb/README.md | 23 ++ packaging/deb/bor/DEBIAN/changelog | 0 packaging/deb/bor/DEBIAN/control | 0 packaging/deb/bor/DEBIAN/postinst | 4 + packaging/deb/bor/DEBIAN/postrm | 6 + packaging/deb/bor/DEBIAN/prerm | 9 + packaging/requirements/README.md | 1 + packaging/rpm/TODO | 0 .../templates/mainnet-v1/archive/config.toml | 129 +++++++ .../mainnet-v1/sentry/sentry/bor/config.toml | 129 +++++++ .../sentry/validator/bor/config.toml | 131 ++++++++ .../mainnet-v1/without-sentry/bor/config.toml | 131 ++++++++ packaging/templates/package_scripts/changelog | 3 + .../package_scripts/changelog.profile | 3 + packaging/templates/package_scripts/control | 12 + .../templates/package_scripts/control.arm64 | 13 + .../package_scripts/control.profile.amd64 | 14 + .../package_scripts/control.profile.arm64 | 12 + .../package_scripts/control.validator | 12 + .../package_scripts/control.validator.arm64 | 13 + packaging/templates/package_scripts/postinst | 7 + .../package_scripts/postinst.profile | 6 + packaging/templates/package_scripts/postrm | 8 + packaging/templates/package_scripts/preinst | 7 + packaging/templates/package_scripts/prerm | 8 + packaging/templates/systemd/bor.service | 16 + packaging/templates/systemd/bord.service | 36 ++ .../templates/testnet-v4/archive/config.toml | 129 +++++++ .../testnet-v4/sentry/sentry/bor/config.toml | 129 +++++++ .../sentry/validator/bor/config.toml | 131 ++++++++ .../testnet-v4/without-sentry/bor/config.toml | 131 ++++++++ 33 files changed, 1571 insertions(+) create mode 100644 .github/workflows/packager.yml create mode 100644 packaging/deb/.README.md.swp create mode 100644 packaging/deb/README.md create mode 100644 packaging/deb/bor/DEBIAN/changelog create mode 100644 packaging/deb/bor/DEBIAN/control create mode 100755 packaging/deb/bor/DEBIAN/postinst create mode 100755 packaging/deb/bor/DEBIAN/postrm create mode 100755 packaging/deb/bor/DEBIAN/prerm create mode 100644 packaging/requirements/README.md create mode 100644 packaging/rpm/TODO create mode 100644 packaging/templates/mainnet-v1/archive/config.toml create mode 100644 packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml create mode 100644 packaging/templates/mainnet-v1/sentry/validator/bor/config.toml create mode 100644 packaging/templates/mainnet-v1/without-sentry/bor/config.toml create mode 100644 packaging/templates/package_scripts/changelog create mode 100644 packaging/templates/package_scripts/changelog.profile create mode 100644 packaging/templates/package_scripts/control create mode 100644 packaging/templates/package_scripts/control.arm64 create mode 100644 packaging/templates/package_scripts/control.profile.amd64 create mode 100644 packaging/templates/package_scripts/control.profile.arm64 create mode 100644 packaging/templates/package_scripts/control.validator create mode 100644 packaging/templates/package_scripts/control.validator.arm64 create mode 100755 packaging/templates/package_scripts/postinst create mode 100755 packaging/templates/package_scripts/postinst.profile create mode 100755 packaging/templates/package_scripts/postrm create mode 100755 packaging/templates/package_scripts/preinst create mode 100755 packaging/templates/package_scripts/prerm create mode 100644 packaging/templates/systemd/bor.service create mode 100644 packaging/templates/systemd/bord.service create mode 100644 packaging/templates/testnet-v4/archive/config.toml create mode 100644 packaging/templates/testnet-v4/sentry/sentry/bor/config.toml create mode 100644 packaging/templates/testnet-v4/sentry/validator/bor/config.toml create mode 100644 packaging/templates/testnet-v4/without-sentry/bor/config.toml diff --git a/.github/workflows/packager.yml b/.github/workflows/packager.yml new file mode 100644 index 0000000000..4b6c52f601 --- /dev/null +++ b/.github/workflows/packager.yml @@ -0,0 +1,318 @@ +name: packager + +on: + push: + branches: + - 'main' + paths: + - '**' + tags: + - 'v*.*.*' + - 'v*.*.*-*' + +jobs: + build: + runs-on: ubuntu-18.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Set up Go + uses: actions/setup-go@master + with: + go-version: 1.19 + - name: Generate release tag + id: tag + run: echo "::set-output name=release_tag::bor_$(date +"%Y.%m.%d_%H-%M")" + + - name: Cleaning repo + run: make clean + - name: Building for amd64 + run: make bor + + - name: Making directory structure + run: mkdir -p packaging/deb/bor/usr/bin + - name: Making directory structure for toml + run: mkdir -p packaging/deb/bor/var/lib/bor + - name: Copying necessary files + run: cp -rp build/bin/bor packaging/deb/bor/usr/bin/ + - name: copying control file + run: cp -rp packaging/templates/package_scripts/control packaging/deb/bor/DEBIAN/control + - name: removing systemd file for binary + run: rm -rf lib/systemd/system/bor.service + + - name: Creating package for binary only bor + run: cp -rp packaging/deb/bor packaging/deb/bor-v0.3.0-beta-amd64 + - name: Running package build + run: dpkg-deb --build --root-owner-group packaging/deb/bor-v0.3.0-beta-amd64 + + - name: Removing the bor binary + run: rm -rf packaging/deb/bor/usr/bin/bor + + - name: making directory structure for systemd + run: mkdir -p packaging/deb/bor/lib/systemd/system + - name: Copying systemd file + run: cp -rp packaging/templates/systemd/bor.service packaging/deb/bor/lib/systemd/system/bor.service + + - name: Prepping Mumbai Sentry Node Profile for amd64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64 + - name: Putting toml + run: cp -rp packaging/templates/testnet-v4/sentry/sentry/bor/config.toml packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/var/lib/bor/ + - name: Copying the preinst + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/preinst + - name: Copying the postinst + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/postinst + - name: Copying the prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/prerm + - name: Copying the postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/postrm + - name: Copying systemd file + run: cp -rp packaging/templates/systemd/bor.service packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/lib/systemd/system/ + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Running package build for sentry on amd64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64 + + - name: Setting up Mainnet Sentry Config for amd64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64 + - name: Copying control file + run: cp -rp packaging/templates/package_scripts/control packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Putting toml + run: cp -rp packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/var/lib/bor/ + - name: Copying the preinst + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/preinst + - name: Copying the postinst + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/postinst + - name: Copying the prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/prerm + - name: Copying the postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/postrm + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Building Sentry for amd64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64 + + - name: Prepping Bor Validator Profile for amd64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64 + - name: Copying control file for validator on amd64 + run: cp -rp packaging/templates/package_scripts/control.validator packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Copying Postinstall script + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/postinst + - name: Copying Prerm script + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/prerm + - name: Copying Postrm script + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/postrm + - name: Copying config.toml for validator for bor + run: cp -rp packaging/templates/testnet-v4/sentry/validator/bor/config.toml packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/var/lib/bor/ + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Building bor validator on amd64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64 + + - name: Prepping Bor Mainnet Validator for amd64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64 + - name: Copying control file for validator on arm64 + run: cp -rp packaging/templates/package_scripts/control.validator packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Copying the preinst + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/preinst + - name: Copying Postinstall script + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/postinst + - name: Copying the prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/prerm + - name: Copying the postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/postrm + - name: Copying config.toml for validator for bor + run: cp -rp packaging/templates/mainnet-v1/sentry/validator/bor/config.toml packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/var/lib/bor/ + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Building bor validator on amd64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64 + + - name: Creating mumbai archive node profile for amd64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64 + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Copying profile preinst file + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/preinst + - name: Copying the profile postinst + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/postinst + - name: Copying profile prerm file + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/prerm + - name: Copying profile postrm file + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/postrm + - name: Copying the toml + run: cp -rp packaging/templates/testnet-v4/archive/config.toml packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/var/lib/bor/ + - name: Building profile package + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64 + + - name: Creating mainnet archive node profile for amd64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64 + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/control + - name: Copying profile preinst file + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/DEBIAN/preinst + - name: Copying the profile postinst + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/DEBIAN/postinst + - name: Copying profile prerm file + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/DEBIAN/prerm + - name: Copying profile postrm file + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/DEBIAN/postrm + - name: Copying the toml + run: cp -rp packaging/templates/mainnet-v1/archive/config.toml packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/var/lib/bor/ + - name: Building porfile package + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64 + + - name: Cleaning build directory for arm64 build + run: make clean + + - name: Removing systemd file + run: rm -rf packaging/deb/bor/lib/systemd/system/bor.service + + - name: Adding requirements for cross compile + run: sudo apt-get install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu + + - name: removing systemd file for binary + run: rm -rf lib/systemd/system/bor.service + + - name: Building bor for arm64 + run: GOARCH=arm64 GOOS=linux CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ CGO_ENABLED=1 go build -o build/bin/bor ./cmd/cli/main.go + + - name: Copying bor arm64 for use with packaging + run: cp -rp build/bin/bor packaging/deb/bor/usr/bin/ + + - name: Creating package for binary only bor + run: cp -rp packaging/deb/bor packaging/deb/bor-v0.3.0-beta-arm64 + - name: Copying control file + run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-v0.3.0-beta-arm64/DEBIAN/control + - name: Running package build + run: dpkg-deb --build --root-owner-group packaging/deb/bor-v0.3.0-beta-arm64 + + - name: Removing the bor binary + run: rm -rf packaging/deb/bor/usr/bin/bor + + - name: Copying systemd file + run: cp -rp packaging/templates/systemd/bor.service packaging/deb/bor/lib/systemd/system/bor.service + + - name: Updating the control file to use with the arm64 profile + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor/DEBIAN/control + + - name: Setting up Mumbai Sentry Config for arm64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64 + - name: Copying control file + run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Putting toml + run: cp -rp packaging/templates/testnet-v4/sentry/sentry/bor/config.toml packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/var/lib/bor/ + - name: Copying the preinst + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/preinst + - name: Copying the prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/prerm + - name: Copying the postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/postrm + - name: Copying the postinst + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/postinst + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Building Sentry for arm64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64 + + - name: Setting up Mainnet Sentry Config for arm64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64 + - name: Copying control file + run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Putting toml + run: cp -rp packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/var/lib/bor/ + - name: Copying the preinst + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/preinst + - name: Copying the prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/prerm + - name: Copying the postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/postrm + - name: Copying the postinst + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/postinst + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Building Sentry for arm64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64 + + - name: Prepping Bor Mumbai Validator for arm64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64 + - name: Copying control file for validator on arm64 + run: cp -rp packaging/templates/package_scripts/control.validator.arm64 packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Copying the preinst + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/preinst + - name: Copying Postinstall script + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64/DEBIAN/postinst + - name: Copying the prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/prerm + - name: Copying the postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/postrm + - name: Copying config.toml for validator for bor + run: cp -rp packaging/templates/testnet-v4/sentry/validator/bor/config.toml packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64/var/lib/bor/ + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Building bor validator on arm64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64 + + - name: Prepping Bor Mainnet Validator for arm64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64 + - name: Copying control file for validator on arm64 + run: cp -rp packaging/templates/package_scripts/control.validator.arm64 packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Copying the preinst + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/preinst + - name: Copying Postinstall script + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/postinst + - name: Copying the prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/prerm + - name: Copying the postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/postrm + - name: Copying config.toml for validator for bor + run: cp -rp packaging/templates/mainnet-v1/sentry/validator/bor/config.toml packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/var/lib/bor/ + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Building bor validator on arm64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64 + + - name: Updating the control file to use with the arm64 profile + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor/DEBIAN/control + + - name: Creating mumbai archive node profile for arm64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64 + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Copying over profile postinst + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/DEBIAN/postinst + - name: Copying prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/DEBIAN/prerm + - name: Copying postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/DEBIAN/postrm + - name: Copying the toml + run: cp -rp packaging/templates/testnet-v4/archive/config.toml packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/var/lib/bor/ + - name: Building profile package + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64 + + - name: Creating mainnet archive node profile for arm64 + run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64 + - name: Copying profile control file + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/DEBIAN/control + - name: Copying over profile postinst + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/DEBIAN/postinst + - name: Copying prerm + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/DEBIAN/prerm + - name: Copying postrm + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/DEBIAN/postrm + - name: Copying the toml + run: cp -rp packaging/templates/mainnet-v1/archive/config.toml packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/var/lib/bor/ + - name: Building porfile package + run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64 + + - name: Confirming package built + run: ls -ltr packaging/deb/ | grep bor + + - name: Release bor Packages + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ steps.tag.outputs.release_tag }} + files: | + packaging/deb/bor**.deb + binary/bo** \ No newline at end of file diff --git a/packaging/deb/.README.md.swp b/packaging/deb/.README.md.swp new file mode 100644 index 0000000000000000000000000000000000000000..765002d189fd7864fe06952777e7df26258b51ff GIT binary patch literal 12288 zcmeI2KW`H;6u@2f0)m0{K}VEa2n%$9Rtcy>8iWc9F!=7AI}^w6Wczw#fgQdA3x7tw z4HE2#k5FI(o-bFa1u=ChdRBh1&VGLP?x!r#y>#$!X973+LqX%b5FZb&W;ee~#o(0? zxwKlDr)ZUryZ;=cHqQ4ZGTTO+_wG6D4f_T&X^x$Fek5UXSBJ7rlN4Q2$!snQZHpvV zX>xzOHJXh3i~QJGzF-4v;G_oD#r5H}LCmso<~18jf|umLu}22P;?Nw3+z zt_$(_EEP}h{}2EF|2QYacj6myK)fg35pRh%#B1Uu(GV$do47>?;uq!mNqijP?PVQqq@#M%p0urlaX5IJLliX_BgTg#xsP3s8G%A&0!07eee} zP!LM(fj&NHV?aWKZca5o<*;zd`%O~47h{^ZpVD2NtSXg5Ub~nolnT;Xn;cdh>MEYh z=-_IVLPUHHqtnDMeNcZd79dtmQ@mf;pZL2&9T4KE_+bSxUbjh41DtLy*U=zzXl7fQ&>uF-j4H&fv F#cwS6$qoPj literal 0 HcmV?d00001 diff --git a/packaging/deb/README.md b/packaging/deb/README.md new file mode 100644 index 0000000000..7e84275f38 --- /dev/null +++ b/packaging/deb/README.md @@ -0,0 +1,23 @@ +# Debian + + + +For debian packages you will need to add the following layouts during the build + + + +bor/ + DEBIAN/control + DEBIAN/postinst + usr/local/bin/bor + lib/systemd/system/bor.service + +This will be wrapped during the build package process building + + +Note this is still a work in progress: + +TODO: removal/purge on removal using dpkg + cleanup of control files to list what we want + copyright inclusuion + diff --git a/packaging/deb/bor/DEBIAN/changelog b/packaging/deb/bor/DEBIAN/changelog new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packaging/deb/bor/DEBIAN/control b/packaging/deb/bor/DEBIAN/control new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packaging/deb/bor/DEBIAN/postinst b/packaging/deb/bor/DEBIAN/postinst new file mode 100755 index 0000000000..e23f4d6897 --- /dev/null +++ b/packaging/deb/bor/DEBIAN/postinst @@ -0,0 +1,4 @@ +#!/bin/bash +# This is a postinstallation script so the service can be configured and started when requested +# +sudo adduser --disabled-password --disabled-login --shell /usr/sbin/nologin --quiet --system --no-create-home --home /nonexistent bor diff --git a/packaging/deb/bor/DEBIAN/postrm b/packaging/deb/bor/DEBIAN/postrm new file mode 100755 index 0000000000..7602789a01 --- /dev/null +++ b/packaging/deb/bor/DEBIAN/postrm @@ -0,0 +1,6 @@ +#!/bin/bash +# +############### +# Remove bor installs +############## +sudo rm -rf /usr/bin/bor diff --git a/packaging/deb/bor/DEBIAN/prerm b/packaging/deb/bor/DEBIAN/prerm new file mode 100755 index 0000000000..e40aed2c80 --- /dev/null +++ b/packaging/deb/bor/DEBIAN/prerm @@ -0,0 +1,9 @@ +#!/bin/bash +# +# +############## +# Stop bor before removal +############## +#sudo systemctl stop bor.service +############# + diff --git a/packaging/requirements/README.md b/packaging/requirements/README.md new file mode 100644 index 0000000000..48cdce8528 --- /dev/null +++ b/packaging/requirements/README.md @@ -0,0 +1 @@ +placeholder diff --git a/packaging/rpm/TODO b/packaging/rpm/TODO new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packaging/templates/mainnet-v1/archive/config.toml b/packaging/templates/mainnet-v1/archive/config.toml new file mode 100644 index 0000000000..a44a2ed0b5 --- /dev/null +++ b/packaging/templates/mainnet-v1/archive/config.toml @@ -0,0 +1,129 @@ +chain = "mainnet" +# identity = "node_name" +# log-level = "INFO" +datadir = "/var/lib/bor/data" +# keystore = "" +syncmode = "full" +gcmode = "archive" +# snapshot = true +# ethstats = "" + +# ["eth.requiredblocks"] + +[p2p] + maxpeers = 50 + port = 30303 + # maxpendpeers = 50 + # bind = "0.0.0.0" + # nodiscover = false + # nat = "any" + # [p2p.discovery] + # v5disc = false + # bootnodes = [] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] + +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" + +[txpool] + nolocals = true + pricelimit = 30000000000 + accountslots = 16 + globalslots = 32768 + accountqueue = 16 + globalqueue = 32768 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricebump = 10 + +[miner] + gaslimit = 20000000 + gasprice = "30000000000" + # mine = false + # etherbase = "" + # extradata = "" + +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # txfeecap = 5.0 + [jsonrpc.http] + enabled = true + port = 8545 + host = "127.0.0.1" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] + # prefix = "" + [jsonrpc.ws] + enabled = true + port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + origins = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] + # blocks = 20 + # percentile = 60 + # maxprice = "5000000000000" + # ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + # prometheus-addr = "" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] + # cache = 1024 + # gc = 25 + # snapshot = 10 + # database = 50 + # trie = 15 + # journal = "triecache" + # rejournal = "1h0m0s" + # noprefetch = false + # preimages = false + # txlookuplimit = 2350000 + +# [accounts] + # unlock = [] + # password = "" + # allow-insecure-unlock = false + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" + +# [developer] + # dev = false + # period = 0 diff --git a/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml b/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml new file mode 100644 index 0000000000..5bb226b913 --- /dev/null +++ b/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml @@ -0,0 +1,129 @@ +chain = "mainnet" +# identity = "node_name" +# log-level = "INFO" +datadir = "/var/lib/bor/data" +# keystore = "" +syncmode = "full" +# gcmode = "full" +# snapshot = true +# ethstats = "" + +# ["eth.requiredblocks"] + +[p2p] + maxpeers = 50 + port = 30303 + # maxpendpeers = 50 + # bind = "0.0.0.0" + # nodiscover = false + # nat = "any" + # [p2p.discovery] + # v5disc = false + # bootnodes = [] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] + +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" + +[txpool] + nolocals = true + pricelimit = 30000000000 + accountslots = 16 + globalslots = 32768 + accountqueue = 16 + globalqueue = 32768 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricebump = 10 + +[miner] + gaslimit = 20000000 + gasprice = "30000000000" + # mine = false + # etherbase = "" + # extradata = "" + +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # txfeecap = 5.0 + [jsonrpc.http] + enabled = true + port = 8545 + host = "127.0.0.1" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] + # prefix = "" + # [jsonrpc.ws] + # enabled = false + # port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + # origins = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] + # blocks = 20 + # percentile = 60 + # maxprice = "5000000000000" + # ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + # prometheus-addr = "" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] + # cache = 1024 + # gc = 25 + # snapshot = 10 + # database = 50 + # trie = 15 + # journal = "triecache" + # rejournal = "1h0m0s" + # noprefetch = false + # preimages = false + # txlookuplimit = 2350000 + +# [accounts] + # unlock = [] + # password = "" + # allow-insecure-unlock = false + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" + +# [developer] + # dev = false + # period = 0 diff --git a/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml b/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml new file mode 100644 index 0000000000..5a7688f9e8 --- /dev/null +++ b/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml @@ -0,0 +1,131 @@ +# NOTE: Update and uncomment: `keystore`, `password`, and `unlock` fields. + +chain = "mainnet" +# identity = "node_name" +# log-level = "INFO" +datadir = "/var/lib/bor/data" +# keystore = "$BOR_DIR/keystore" +syncmode = "full" +# gcmode = "full" +# snapshot = true +# ethstats = "" + +# ["eth.requiredblocks"] + +[p2p] + maxpeers = 1 + port = 30303 + nodiscover = true + # maxpendpeers = 50 + # bind = "0.0.0.0" + # nat = "any" + # [p2p.discovery] + # v5disc = false + # bootnodes = [] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] + +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" + +[txpool] + nolocals = true + pricelimit = 30000000000 + accountslots = 16 + globalslots = 32768 + accountqueue = 16 + globalqueue = 32768 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricebump = 10 + +[miner] + mine = true + gaslimit = 20000000 + gasprice = "30000000000" + # etherbase = "" + # extradata = "" + +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # txfeecap = 5.0 + [jsonrpc.http] + enabled = true + port = 8545 + host = "127.0.0.1" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] + # prefix = "" + # [jsonrpc.ws] + # enabled = false + # port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + # origins = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] + # blocks = 20 + # percentile = 60 + # maxprice = "5000000000000" + # ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + # prometheus-addr = "" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] + # cache = 1024 + # gc = 25 + # snapshot = 10 + # database = 50 + # trie = 15 + # journal = "triecache" + # rejournal = "1h0m0s" + # noprefetch = false + # preimages = false + # txlookuplimit = 2350000 + +[accounts] + allow-insecure-unlock = true + # password = "$BOR_DIR/password.txt" + # unlock = ["$ADDRESS"] + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" + +# [developer] + # dev = false + # period = 0 diff --git a/packaging/templates/mainnet-v1/without-sentry/bor/config.toml b/packaging/templates/mainnet-v1/without-sentry/bor/config.toml new file mode 100644 index 0000000000..74094bfa80 --- /dev/null +++ b/packaging/templates/mainnet-v1/without-sentry/bor/config.toml @@ -0,0 +1,131 @@ +# NOTE: Update and uncomment: `keystore`, `password`, and `unlock` fields. + +chain = "mainnet" +# identity = "node_name" +# log-level = "INFO" +datadir = "/var/lib/bor/data" +# keystore = "$BOR_DIR/keystore" +syncmode = "full" +# gcmode = "full" +# snapshot = true +# ethstats = "" + +# ["eth.requiredblocks"] + +[p2p] + maxpeers = 50 + port = 30303 + # maxpendpeers = 50 + # bind = "0.0.0.0" + # nodiscover = false + # nat = "any" + # [p2p.discovery] + # v5disc = false + # bootnodes = [] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] + +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" + +[txpool] + nolocals = true + pricelimit = 30000000000 + accountslots = 16 + globalslots = 32768 + accountqueue = 16 + globalqueue = 32768 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricebump = 10 + +[miner] + mine = true + gaslimit = 20000000 + gasprice = "30000000000" + # etherbase = "" + # extradata = "" + +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # txfeecap = 5.0 + [jsonrpc.http] + enabled = true + port = 8545 + host = "127.0.0.1" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] + # prefix = "" + # [jsonrpc.ws] + # enabled = false + # port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + # origins = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] +# blocks = 20 +# percentile = 60 +# maxprice = "5000000000000" +# ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + # prometheus-addr = "" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] +# cache = 1024 +# gc = 25 +# snapshot = 10 +# database = 50 +# trie = 15 +# journal = "triecache" +# rejournal = "1h0m0s" +# noprefetch = false +# preimages = false +# txlookuplimit = 2350000 + +[accounts] + allow-insecure-unlock = true + # password = "$BOR_DIR/password.txt" + # unlock = ["$ADDRESS"] + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" + +# [developer] + # dev = false + # period = 0 diff --git a/packaging/templates/package_scripts/changelog b/packaging/templates/package_scripts/changelog new file mode 100644 index 0000000000..2395bcaef1 --- /dev/null +++ b/packaging/templates/package_scripts/changelog @@ -0,0 +1,3 @@ +bor (2.10.11) unstable; urgency=low + +-- Polygon Team Mon, 10 Nov 2022 00:37:31 +0100 \ No newline at end of file diff --git a/packaging/templates/package_scripts/changelog.profile b/packaging/templates/package_scripts/changelog.profile new file mode 100644 index 0000000000..b84fa22646 --- /dev/null +++ b/packaging/templates/package_scripts/changelog.profile @@ -0,0 +1,3 @@ +bor-profile (2.10.11) unstable; urgency=low + +-- Polygon Team Mon, 10 Nov 2022 00:37:31 +0100 \ No newline at end of file diff --git a/packaging/templates/package_scripts/control b/packaging/templates/package_scripts/control new file mode 100644 index 0000000000..ed0ff46c06 --- /dev/null +++ b/packaging/templates/package_scripts/control @@ -0,0 +1,12 @@ +Source: bor +Version: 0.3.0 +Section: develop +Priority: standard +Maintainer: Polygon +Build-Depends: debhelper-compat (= 13) +Package: bor +Rules-Requires-Root: yes +Architecture: amd64 +Multi-Arch: foreign +Depends: +Description: This is the bor package from Polygon Technology. diff --git a/packaging/templates/package_scripts/control.arm64 b/packaging/templates/package_scripts/control.arm64 new file mode 100644 index 0000000000..2c624a4c45 --- /dev/null +++ b/packaging/templates/package_scripts/control.arm64 @@ -0,0 +1,13 @@ +Source: bor +Version: 0.3.0 +Section: develop +Priority: standard +Maintainer: Polygon +Build-Depends: debhelper-compat (= 13) +Rules-Requires-Root: yes +Package: bor +Architecture: arm64 +Multi-Arch: foreign +Depends: +Description: This is the bor package from Polygon Technology. + diff --git a/packaging/templates/package_scripts/control.profile.amd64 b/packaging/templates/package_scripts/control.profile.amd64 new file mode 100644 index 0000000000..087dabb1f6 --- /dev/null +++ b/packaging/templates/package_scripts/control.profile.amd64 @@ -0,0 +1,14 @@ +Source: bor-profile +Version: 0.3.0 +Section: develop +Priority: standard +Maintainer: Polygon +Build-Depends: debhelper-compat (= 13) +Rules-Requires-Root: yes +Package: bor-profile +Architecture: amd64 +Multi-Arch: foreign +Depends: +Description: This is the bor package from Polygon Technology. + + diff --git a/packaging/templates/package_scripts/control.profile.arm64 b/packaging/templates/package_scripts/control.profile.arm64 new file mode 100644 index 0000000000..9de0c50253 --- /dev/null +++ b/packaging/templates/package_scripts/control.profile.arm64 @@ -0,0 +1,12 @@ +Source: bor-profile +Version: 0.3.0 +Section: develop +Priority: standard +Maintainer: Polygon +Build-Depends: debhelper-compat (= 13) +Rules-Requires-Root: yes +Package: bor-profile +Architecture: arm64 +Multi-Arch: foreign +Depends: +Description: This is the bor package from Polygon Technology. diff --git a/packaging/templates/package_scripts/control.validator b/packaging/templates/package_scripts/control.validator new file mode 100644 index 0000000000..f3f5652a31 --- /dev/null +++ b/packaging/templates/package_scripts/control.validator @@ -0,0 +1,12 @@ +Source: bor-profile +Version: 0.3.0 +Section: develop +Priority: standard +Maintainer: Polygon +Build-Depends: debhelper-compat (= 13) +Package: bor-profile +Rules-Requires-Root: yes +Architecture: amd64 +Multi-Arch: foreign +Depends: +Description: This is the bor package from Polygon Technology. diff --git a/packaging/templates/package_scripts/control.validator.arm64 b/packaging/templates/package_scripts/control.validator.arm64 new file mode 100644 index 0000000000..97712830ff --- /dev/null +++ b/packaging/templates/package_scripts/control.validator.arm64 @@ -0,0 +1,13 @@ +Source: bor-profile +Version: 0.3.0 +Section: develop +Priority: standard +Maintainer: Polygon +Build-Depends: debhelper-compat (= 13) +Rules-Requires-Root: yes +Package: bor-profile +Architecture: arm64 +Multi-Arch: foreign +Depends: +Description: This is the bor package from Polygon Technology. + diff --git a/packaging/templates/package_scripts/postinst b/packaging/templates/package_scripts/postinst new file mode 100755 index 0000000000..761ee29f26 --- /dev/null +++ b/packaging/templates/package_scripts/postinst @@ -0,0 +1,7 @@ +#!/bin/bash +# This is a postinstallation script so the service can be configured and started when requested +# +sudo adduser --disabled-password --disabled-login --shell /usr/sbin/nologin --quiet --system --no-create-home --home /nonexistent bor +sudo mkdir -p /var/lib/bor +sudo chown -R bor /var/lib/bor +sudo systemctl daemon-reload diff --git a/packaging/templates/package_scripts/postinst.profile b/packaging/templates/package_scripts/postinst.profile new file mode 100755 index 0000000000..80b8381203 --- /dev/null +++ b/packaging/templates/package_scripts/postinst.profile @@ -0,0 +1,6 @@ +#!/bin/bash +# This is a postinstallation script so the service can be configured and started when requested +# +sudo mkdir -p /var/lib/bor +sudo chown -R bor /var/lib/bor +sudo systemctl daemon-reload diff --git a/packaging/templates/package_scripts/postrm b/packaging/templates/package_scripts/postrm new file mode 100755 index 0000000000..55bbb87a4f --- /dev/null +++ b/packaging/templates/package_scripts/postrm @@ -0,0 +1,8 @@ +#!/bin/bash +# +############### +# Remove bor installs +############## +sudo rm -rf /var/lib/bor/config.toml +sudo rm -rf /lib/systemd/system/bor.service +sudo systemctl daemon-reload diff --git a/packaging/templates/package_scripts/preinst b/packaging/templates/package_scripts/preinst new file mode 100755 index 0000000000..b9efb0091d --- /dev/null +++ b/packaging/templates/package_scripts/preinst @@ -0,0 +1,7 @@ +#!/bin/bash +# +################# +# Stop existing bor in case of upgrade +################ +#sudo systemctl stop bor.service +###################### diff --git a/packaging/templates/package_scripts/prerm b/packaging/templates/package_scripts/prerm new file mode 100755 index 0000000000..b2b2b4fce9 --- /dev/null +++ b/packaging/templates/package_scripts/prerm @@ -0,0 +1,8 @@ +#!/bin/bash +# +# +############## +# Stop bor before removal +############## +#sudo systemctl stop bor.service +############# \ No newline at end of file diff --git a/packaging/templates/systemd/bor.service b/packaging/templates/systemd/bor.service new file mode 100644 index 0000000000..aa63871d83 --- /dev/null +++ b/packaging/templates/systemd/bor.service @@ -0,0 +1,16 @@ +[Unit] + Description=bor + StartLimitIntervalSec=500 + StartLimitBurst=5 + +[Service] + Restart=on-failure + RestartSec=5s + ExecStart=/usr/bin/bor server -config="/var/lib/bor/config.toml" + Type=simple + KillSignal=SIGINT + User=bor + TimeoutStopSec=120 + +[Install] + WantedBy=multi-user.target diff --git a/packaging/templates/systemd/bord.service b/packaging/templates/systemd/bord.service new file mode 100644 index 0000000000..a2f3c0498a --- /dev/null +++ b/packaging/templates/systemd/bord.service @@ -0,0 +1,36 @@ +[Unit] + Description=bor + StartLimitIntervalSec=500 + StartLimitBurst=5 + +[Service] + Restart=on-failure + RestartSec=5s + ExecStart=/usr/bin/bor server \ + -chain=mumbai \ + -port=30303 \ + -datadir /var/lib/bor/data \ + -http \ + -http.addr '0.0.0.0' \ + -http.port 8545 \ + -http.api='eth,net,web3,txpool,bor' \ + -ethstats matic-sentry-01:testnet@bor-mumbai.vitwit.com:3000 \ + -maxpeers 200 \ + -txpool.nolocals \ + -txpool.accountslots '128' \ + -txpool.lifetime '0h16m0s' \ + -txpool.globalslots '20000' \ + -http.vhosts '*' \ + -http.corsdomain '*' \ + -ipcpath /var/lib/bor/data/bor.ipc \ + -miner.gaslimit '20000000' \ + -metrics \ + -metrics.expensive \ + -metrics.prometheus-addr="127.0.0.1:7071" \ + -metrics.opencollector-endpoint "0.0.0.0:4317" + Type=simple + KillSignal=SIGINT + TimeoutStopSec=120 + +[Install] + WantedBy=multi-user.target diff --git a/packaging/templates/testnet-v4/archive/config.toml b/packaging/templates/testnet-v4/archive/config.toml new file mode 100644 index 0000000000..0438ffe3ae --- /dev/null +++ b/packaging/templates/testnet-v4/archive/config.toml @@ -0,0 +1,129 @@ +chain = "mumbai" +# identity = "node_name" +# log-level = "INFO" +datadir = "/var/lib/bor/data" +# keystore = "" +syncmode = "full" +# gcmode = "full" +# snapshot = true +# ethstats = "" + +# ["eth.requiredblocks"] + +[p2p] + maxpeers = 50 + port = 30303 + # maxpendpeers = 50 + # bind = "0.0.0.0" + # nodiscover = false + # nat = "any" + # [p2p.discovery] + # v5disc = false + # bootnodes = [] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] + +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" + +[txpool] + nolocals = true + accountslots = 16 + globalslots = 131072 + accountqueue = 64 + globalqueue = 131072 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricelimit = 30000000000 + # pricebump = 10 + +[miner] + gaslimit = 20000000 + # gasprice = "30000000000" + # mine = false + # etherbase = "" + # extradata = "" + +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # txfeecap = 5.0 + [jsonrpc.http] + enabled = true + port = 8545 + host = "0.0.0.0" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] + # prefix = "" + [jsonrpc.ws] + enabled = true + port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + origins = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] + # blocks = 20 + # percentile = 60 + # maxprice = "5000000000000" + # ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + # prometheus-addr = "" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] + # cache = 1024 + # gc = 25 + # snapshot = 10 + # database = 50 + # trie = 15 + # journal = "triecache" + # rejournal = "1h0m0s" + # noprefetch = false + # preimages = false + # txlookuplimit = 2350000 + +# [accounts] + # unlock = [] + # password = "" + # allow-insecure-unlock = false + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" + +# [developer] + # dev = false + # period = 0 diff --git a/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml b/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml new file mode 100644 index 0000000000..155a33373b --- /dev/null +++ b/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml @@ -0,0 +1,129 @@ +chain = "mumbai" +# identity = "node_name" +# log-level = "INFO" +datadir = "/var/lib/bor/data" +# keystore = "" +syncmode = "full" +# gcmode = "full" +# snapshot = true +# ethstats = "" + +# ["eth.requiredblocks"] + +[p2p] + maxpeers = 50 + port = 30303 + # maxpendpeers = 50 + # bind = "0.0.0.0" + # nodiscover = false + # nat = "any" + # [p2p.discovery] + # v5disc = false + # bootnodes = [] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] + +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" + +[txpool] + nolocals = true + accountslots = 16 + globalslots = 131072 + accountqueue = 64 + globalqueue = 131072 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricelimit = 30000000000 + # pricebump = 10 + +[miner] + gaslimit = 20000000 + # gasprice = "30000000000" + # mine = false + # etherbase = "" + # extradata = "" + +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # txfeecap = 5.0 + [jsonrpc.http] + enabled = true + port = 8545 + host = "0.0.0.0" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] + # prefix = "" + # [jsonrpc.ws] + # enabled = false + # port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + # origins = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] + # blocks = 20 + # percentile = 60 + # maxprice = "5000000000000" + # ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + # prometheus-addr = "" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] + # cache = 1024 + # gc = 25 + # snapshot = 10 + # database = 50 + # trie = 15 + # journal = "triecache" + # rejournal = "1h0m0s" + # noprefetch = false + # preimages = false + # txlookuplimit = 2350000 + +# [accounts] + # unlock = [] + # password = "" + # allow-insecure-unlock = false + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" + +# [developer] + # dev = false + # period = 0 diff --git a/packaging/templates/testnet-v4/sentry/validator/bor/config.toml b/packaging/templates/testnet-v4/sentry/validator/bor/config.toml new file mode 100644 index 0000000000..19b9a4452c --- /dev/null +++ b/packaging/templates/testnet-v4/sentry/validator/bor/config.toml @@ -0,0 +1,131 @@ +# NOTE: Update and uncomment: `keystore`, `password`, and `unlock` fields. + +chain = "mumbai" +# identity = "node_name" +# log-level = "INFO" +datadir = "/var/lib/bor/data" +# keystore = "$BOR_DIR/keystore" +syncmode = "full" +# gcmode = "full" +# snapshot = true +# ethstats = "" + +# ["eth.requiredblocks"] + +[p2p] + maxpeers = 1 + port = 30303 + nodiscover = true + # maxpendpeers = 50 + # bind = "0.0.0.0" + # nat = "any" + # [p2p.discovery] + # v5disc = false + # bootnodes = [] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] + +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" + +[txpool] + nolocals = true + accountslots = 16 + globalslots = 131072 + accountqueue = 64 + globalqueue = 131072 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricelimit = 30000000000 + # pricebump = 10 + +[miner] + mine = true + gaslimit = 20000000 + # gasprice = "30000000000" + # etherbase = "" + # extradata = "" + +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # txfeecap = 5.0 + [jsonrpc.http] + enabled = true + port = 8545 + host = "0.0.0.0" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] + # prefix = "" + # [jsonrpc.ws] + # enabled = false + # port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + # origins = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] + # blocks = 20 + # percentile = 60 + # maxprice = "5000000000000" + # ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + # prometheus-addr = "" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] + # cache = 1024 + # gc = 25 + # snapshot = 10 + # database = 50 + # trie = 15 + # journal = "triecache" + # rejournal = "1h0m0s" + # noprefetch = false + # preimages = false + # txlookuplimit = 2350000 + +[accounts] + allow-insecure-unlock = true + # password = "$BOR_DIR/password.txt" + # unlock = ["$ADDRESS"] + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" + +# [developer] + # dev = false + # period = 0 diff --git a/packaging/templates/testnet-v4/without-sentry/bor/config.toml b/packaging/templates/testnet-v4/without-sentry/bor/config.toml new file mode 100644 index 0000000000..c4de3e87c4 --- /dev/null +++ b/packaging/templates/testnet-v4/without-sentry/bor/config.toml @@ -0,0 +1,131 @@ +# NOTE: Update and uncomment: `keystore`, `password`, and `unlock` fields. + +chain = "mumbai" +# identity = "node_name" +# log-level = "INFO" +datadir = "/var/lib/bor/data" +# keystore = "$BOR_DIR/keystore" +syncmode = "full" +# gcmode = "full" +# snapshot = true +# ethstats = "" + +# ["eth.requiredblocks"] + +[p2p] + maxpeers = 50 + port = 30303 + # maxpendpeers = 50 + # bind = "0.0.0.0" + # nodiscover = false + # nat = "any" + # [p2p.discovery] + # v5disc = false + # bootnodes = [] + # bootnodesv4 = [] + # bootnodesv5 = [] + # static-nodes = [] + # trusted-nodes = [] + # dns = [] + +# [heimdall] + # url = "http://localhost:1317" + # "bor.without" = false + # grpc-address = "" + +[txpool] + nolocals = true + accountslots = 16 + globalslots = 131072 + accountqueue = 64 + globalqueue = 131072 + lifetime = "1h30m0s" + # locals = [] + # journal = "" + # rejournal = "1h0m0s" + # pricelimit = 30000000000 + # pricebump = 10 + +[miner] + mine = true + gaslimit = 20000000 + # gasprice = "30000000000" + # etherbase = "" + # extradata = "" + +[jsonrpc] + ipcpath = "/var/lib/bor/bor.ipc" + # ipcdisable = false + # gascap = 50000000 + # txfeecap = 5.0 + [jsonrpc.http] + enabled = true + port = 8545 + host = "0.0.0.0" + api = ["eth", "net", "web3", "txpool", "bor"] + vhosts = ["*"] + corsdomain = ["*"] + # prefix = "" + # [jsonrpc.ws] + # enabled = false + # port = 8546 + # prefix = "" + # host = "localhost" + # api = ["web3", "net"] + # origins = ["*"] + # [jsonrpc.graphql] + # enabled = false + # port = 0 + # prefix = "" + # host = "" + # vhosts = ["*"] + # corsdomain = ["*"] + +# [gpo] +# blocks = 20 +# percentile = 60 +# maxprice = "5000000000000" +# ignoreprice = "2" + +[telemetry] + metrics = true + # expensive = false + # prometheus-addr = "" + # opencollector-endpoint = "" + # [telemetry.influx] + # influxdb = false + # endpoint = "" + # database = "" + # username = "" + # password = "" + # influxdbv2 = false + # token = "" + # bucket = "" + # organization = "" + # [telemetry.influx.tags] + +# [cache] +# cache = 1024 +# gc = 25 +# snapshot = 10 +# database = 50 +# trie = 15 +# journal = "triecache" +# rejournal = "1h0m0s" +# noprefetch = false +# preimages = false +# txlookuplimit = 2350000 + +[accounts] + allow-insecure-unlock = true + # password = "$BOR_DIR/password.txt" + # unlock = ["$ADDRESS"] + # lightkdf = false + # disable-bor-wallet = false + +# [grpc] + # addr = ":3131" + +# [developer] + # dev = false + # period = 0 From 5e92a7fe257e4ba950d3f73d99855196f5890c5b Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Wed, 23 Nov 2022 07:54:15 -0600 Subject: [PATCH 173/190] Added changes per discussion in PR, more changes may be necessary --- .github/workflows/packager.yml | 15 ++++------ packaging/templates/systemd/bord.service | 36 ------------------------ 2 files changed, 5 insertions(+), 46 deletions(-) delete mode 100644 packaging/templates/systemd/bord.service diff --git a/.github/workflows/packager.yml b/.github/workflows/packager.yml index 4b6c52f601..016912301c 100644 --- a/.github/workflows/packager.yml +++ b/.github/workflows/packager.yml @@ -2,10 +2,6 @@ name: packager on: push: - branches: - - 'main' - paths: - - '**' tags: - 'v*.*.*' - 'v*.*.*-*' @@ -22,9 +18,8 @@ jobs: uses: actions/setup-go@master with: go-version: 1.19 - - name: Generate release tag - id: tag - run: echo "::set-output name=release_tag::bor_$(date +"%Y.%m.%d_%H-%M")" + - name: Adding TAG to ENV + run: echo "GIT_TAG=`echo $(git describe --tags --abbrev=0)`" >> $GITHUB_ENV - name: Cleaning repo run: make clean @@ -309,10 +304,10 @@ jobs: - name: Confirming package built run: ls -ltr packaging/deb/ | grep bor - - name: Release bor Packages + - name: Pre-Release bor Packages uses: softprops/action-gh-release@v1 with: - tag_name: ${{ steps.tag.outputs.release_tag }} + tag_name: ${{ env.GIT_TAG }} files: | packaging/deb/bor**.deb - binary/bo** \ No newline at end of file + binary/bo** diff --git a/packaging/templates/systemd/bord.service b/packaging/templates/systemd/bord.service deleted file mode 100644 index a2f3c0498a..0000000000 --- a/packaging/templates/systemd/bord.service +++ /dev/null @@ -1,36 +0,0 @@ -[Unit] - Description=bor - StartLimitIntervalSec=500 - StartLimitBurst=5 - -[Service] - Restart=on-failure - RestartSec=5s - ExecStart=/usr/bin/bor server \ - -chain=mumbai \ - -port=30303 \ - -datadir /var/lib/bor/data \ - -http \ - -http.addr '0.0.0.0' \ - -http.port 8545 \ - -http.api='eth,net,web3,txpool,bor' \ - -ethstats matic-sentry-01:testnet@bor-mumbai.vitwit.com:3000 \ - -maxpeers 200 \ - -txpool.nolocals \ - -txpool.accountslots '128' \ - -txpool.lifetime '0h16m0s' \ - -txpool.globalslots '20000' \ - -http.vhosts '*' \ - -http.corsdomain '*' \ - -ipcpath /var/lib/bor/data/bor.ipc \ - -miner.gaslimit '20000000' \ - -metrics \ - -metrics.expensive \ - -metrics.prometheus-addr="127.0.0.1:7071" \ - -metrics.opencollector-endpoint "0.0.0.0:4317" - Type=simple - KillSignal=SIGINT - TimeoutStopSec=120 - -[Install] - WantedBy=multi-user.target From 1f0e49b0d8f85d37643be06a7698977abb2ec397 Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Wed, 23 Nov 2022 09:07:41 -0600 Subject: [PATCH 174/190] Adding prerelease true --- .github/workflows/packager.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/packager.yml b/.github/workflows/packager.yml index 016912301c..998008ede8 100644 --- a/.github/workflows/packager.yml +++ b/.github/workflows/packager.yml @@ -308,6 +308,7 @@ jobs: uses: softprops/action-gh-release@v1 with: tag_name: ${{ env.GIT_TAG }} + prerelease: true files: | packaging/deb/bor**.deb binary/bo** From ba56c98769eecfcbd0ecda736cde29d717daf1c4 Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Wed, 23 Nov 2022 09:10:41 -0600 Subject: [PATCH 175/190] Disabling goreleaser --- .goreleaser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 331d8de6b5..229d76a3f6 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,7 +1,7 @@ project_name: bor release: - disable: false + disable: true draft: true prerelease: auto From c1e84fd6945eb502ca336d00c35edd7bc2238386 Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Wed, 23 Nov 2022 09:12:42 -0600 Subject: [PATCH 176/190] Removing README swap file --- packaging/deb/.README.md.swp | Bin 12288 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packaging/deb/.README.md.swp diff --git a/packaging/deb/.README.md.swp b/packaging/deb/.README.md.swp deleted file mode 100644 index 765002d189fd7864fe06952777e7df26258b51ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2KW`H;6u@2f0)m0{K}VEa2n%$9Rtcy>8iWc9F!=7AI}^w6Wczw#fgQdA3x7tw z4HE2#k5FI(o-bFa1u=ChdRBh1&VGLP?x!r#y>#$!X973+LqX%b5FZb&W;ee~#o(0? zxwKlDr)ZUryZ;=cHqQ4ZGTTO+_wG6D4f_T&X^x$Fek5UXSBJ7rlN4Q2$!snQZHpvV zX>xzOHJXh3i~QJGzF-4v;G_oD#r5H}LCmso<~18jf|umLu}22P;?Nw3+z zt_$(_EEP}h{}2EF|2QYacj6myK)fg35pRh%#B1Uu(GV$do47>?;uq!mNqijP?PVQqq@#M%p0urlaX5IJLliX_BgTg#xsP3s8G%A&0!07eee} zP!LM(fj&NHV?aWKZca5o<*;zd`%O~47h{^ZpVD2NtSXg5Ub~nolnT;Xn;cdh>MEYh z=-_IVLPUHHqtnDMeNcZd79dtmQ@mf;pZL2&9T4KE_+bSxUbjh41DtLy*U=zzXl7fQ&>uF-j4H&fv F#cwS6$qoPj From 08ec50a846d5ea47ac19ea08c30f9bc20d5a14a0 Mon Sep 17 00:00:00 2001 From: Will Button Date: Wed, 23 Nov 2022 09:43:34 -0700 Subject: [PATCH 177/190] change bor_dir and add bor user for v0.3.0 release --- Dockerfile | 9 ++++++--- Dockerfile.alltools | 2 +- Dockerfile.release | 18 ++++++++++++++---- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7a2770ce9a..0e7a91e96c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,20 @@ FROM golang:latest -ARG BOR_DIR=/bor +ARG BOR_DIR=/var/lib/bor ENV BOR_DIR=$BOR_DIR RUN apt-get update -y && apt-get upgrade -y \ && apt install build-essential git -y \ - && mkdir -p /bor + && mkdir -p ${BOR_DIR} WORKDIR ${BOR_DIR} COPY . . RUN make bor -RUN cp build/bin/bor /usr/local/bin/ +RUN cp build/bin/bor /usr/bin/ +RUN groupadd -g 10137 bor \ + && useradd -u 10137 --no-log-init --create-home -r -g bor bor \ + && chown -R bor:bor ${BOR_DIR} ENV SHELL /bin/bash EXPOSE 8545 8546 8547 30303 30303/udp diff --git a/Dockerfile.alltools b/Dockerfile.alltools index a3f36d4a04..1c4437e251 100644 --- a/Dockerfile.alltools +++ b/Dockerfile.alltools @@ -13,6 +13,6 @@ RUN set -x \ && apk add --update --no-cache \ ca-certificates \ && rm -rf /var/cache/apk/* -COPY --from=builder /bor/build/bin/* /usr/local/bin/ +COPY --from=builder /bor/build/bin/* /usr/bin/ EXPOSE 8545 8546 30303 30303/udp diff --git a/Dockerfile.release b/Dockerfile.release index 66dd589e82..cd90450bc3 100644 --- a/Dockerfile.release +++ b/Dockerfile.release @@ -1,10 +1,20 @@ FROM alpine:3.14 +ARG BOR_DIR=/var/lib/bor +ENV BOR_DIR=$BOR_DIR + RUN apk add --no-cache ca-certificates && \ - mkdir -p /etc/bor -COPY bor /usr/local/bin/ -COPY builder/files/genesis-mainnet-v1.json /etc/bor/ -COPY builder/files/genesis-testnet-v4.json /etc/bor/ + mkdir -p ${BOR_DIR} + +WORKDIR ${BOR_DIR} +COPY bor /usr/bin/ +COPY builder/files/genesis-mainnet-v1.json ${BOR_DIR} +COPY builder/files/genesis-testnet-v4.json ${BOR_DIR} +RUN groupadd -g 10137 bor \ + && useradd -u 10137 --no-log-init --create-home -r -g bor bor \ + && chown -R bor:bor ${BOR_DIR} + +USER bor EXPOSE 8545 8546 8547 30303 30303/udp ENTRYPOINT ["bor"] From 5fe83d35cff09d5df40dbd4d4d0a3755e6f49cb7 Mon Sep 17 00:00:00 2001 From: Will Button Date: Wed, 23 Nov 2022 14:16:36 -0700 Subject: [PATCH 178/190] rollback bor user and use root --- Dockerfile | 3 --- Dockerfile.release | 5 ----- 2 files changed, 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0e7a91e96c..6c65faf12d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,9 +12,6 @@ COPY . . RUN make bor RUN cp build/bin/bor /usr/bin/ -RUN groupadd -g 10137 bor \ - && useradd -u 10137 --no-log-init --create-home -r -g bor bor \ - && chown -R bor:bor ${BOR_DIR} ENV SHELL /bin/bash EXPOSE 8545 8546 8547 30303 30303/udp diff --git a/Dockerfile.release b/Dockerfile.release index cd90450bc3..2a026566d7 100644 --- a/Dockerfile.release +++ b/Dockerfile.release @@ -10,11 +10,6 @@ WORKDIR ${BOR_DIR} COPY bor /usr/bin/ COPY builder/files/genesis-mainnet-v1.json ${BOR_DIR} COPY builder/files/genesis-testnet-v4.json ${BOR_DIR} -RUN groupadd -g 10137 bor \ - && useradd -u 10137 --no-log-init --create-home -r -g bor bor \ - && chown -R bor:bor ${BOR_DIR} - -USER bor EXPOSE 8545 8546 8547 30303 30303/udp ENTRYPOINT ["bor"] From 137fb19d2ad478a87475d792f3358b76b54f6228 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Thu, 24 Nov 2022 19:42:32 +0530 Subject: [PATCH 179/190] metrics: handle equal to separated config flag (#596) * metrics: handle based config path * internal/cli/server: add more context to logs * use space separated flag and value in bor.service --- builder/files/bor.service | 2 +- internal/cli/server/server.go | 8 +++++++- metrics/metrics.go | 3 +++ packaging/templates/systemd/bor.service | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/builder/files/bor.service b/builder/files/bor.service index 2deff3dbc9..758553299e 100644 --- a/builder/files/bor.service +++ b/builder/files/bor.service @@ -6,7 +6,7 @@ [Service] Restart=on-failure RestartSec=5s - ExecStart=/usr/local/bin/bor server -config="/var/lib/bor/config.toml" + ExecStart=/usr/local/bin/bor server -config "/var/lib/bor/config.toml" Type=simple User=bor KillSignal=SIGINT diff --git a/internal/cli/server/server.go b/internal/cli/server/server.go index 1346fe613a..70187d6985 100644 --- a/internal/cli/server/server.go +++ b/internal/cli/server/server.go @@ -235,7 +235,13 @@ func (s *Server) Stop() { func (s *Server) setupMetrics(config *TelemetryConfig, serviceName string) error { // Check the global metrics if they're matching with the provided config if metrics.Enabled != config.Enabled || metrics.EnabledExpensive != config.Expensive { - log.Warn("Metric misconfiguration, some of them might not be visible") + log.Warn( + "Metric misconfiguration, some of them might not be visible", + "metrics", metrics.Enabled, + "config.metrics", config.Enabled, + "expensive", metrics.EnabledExpensive, + "config.expensive", config.Expensive, + ) } // Update the values anyways (for services which don't need immediate attention) diff --git a/metrics/metrics.go b/metrics/metrics.go index 1d0133e850..1c0cf11ab4 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -49,6 +49,9 @@ func init() { // check for existence of `config` flag if flag == configFlag && i < len(os.Args)-1 { configFile = strings.TrimLeft(os.Args[i+1], "-") // find the value of flag + } else if len(flag) > 6 && flag[:6] == configFlag { + // Checks for `=` separated flag (e.g. config=path) + configFile = strings.TrimLeft(flag[6:], "=") } for _, enabler := range enablerFlags { diff --git a/packaging/templates/systemd/bor.service b/packaging/templates/systemd/bor.service index aa63871d83..b92bdd3cc5 100644 --- a/packaging/templates/systemd/bor.service +++ b/packaging/templates/systemd/bor.service @@ -6,7 +6,7 @@ [Service] Restart=on-failure RestartSec=5s - ExecStart=/usr/bin/bor server -config="/var/lib/bor/config.toml" + ExecStart=/usr/bin/bor server -config "/var/lib/bor/config.toml" Type=simple KillSignal=SIGINT User=bor From d69cb20ba93054ffc28038888017dae9412e0985 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Fri, 25 Nov 2022 17:44:05 +0530 Subject: [PATCH 180/190] fixed static-nodes related buf (os independent) (#598) * fixed static-nodes related buf (os independent) * taking static-nodes as input if default not present --- scripts/getconfig.go | 2 +- scripts/getconfig.sh | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/scripts/getconfig.go b/scripts/getconfig.go index caf3f45a8e..7fbd39ac6d 100644 --- a/scripts/getconfig.go +++ b/scripts/getconfig.go @@ -375,7 +375,7 @@ func getStaticTrustedNodes(args []string) { fmt.Println("only TOML config file is supported through CLI") } } else { - path := "~/.bor/data/bor/static-nodes.json" + path := "./static-nodes.json" if !checkFileExists(path) { return } diff --git a/scripts/getconfig.sh b/scripts/getconfig.sh index a2971c4f12..472af08802 100755 --- a/scripts/getconfig.sh +++ b/scripts/getconfig.sh @@ -24,6 +24,14 @@ then fi read -p "* Your validator address (e.g. 0xca67a8D767e45056DC92384b488E9Af654d78DE2), or press Enter to skip if running a sentry node: " ADD +if [[ -f $HOME/.bor/data/bor/static-nodes.json ]] +then +cp $HOME/.bor/data/bor/static-nodes.json ./static-nodes.json +else +read -p "* You dont have '~/.bor/data/bor/static-nodes.json' file. If you want to use static nodes, enter the path to 'static-nodes.json' here (press Enter to skip): " STAT +if [[ -f $STAT ]]; then cp $STAT ./static-nodes.json; fi +fi + printf "\nThank you, your inputs are:\n" echo "Path to start.sh: "$startPath echo "Address: "$ADD @@ -113,4 +121,9 @@ chmod +x $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh $ADD rm $tmpDir/3305fe263dd4a999d58f96deb064e21bb70123d9.sh +if [[ -f $HOME/.bor/data/bor/static-nodes.json ]] +then +rm ./static-nodes.json +fi + exit 0 From 095ce5e1dae6591625b1bd50e9f7c032f6bd8f70 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Fri, 25 Nov 2022 21:56:31 +0530 Subject: [PATCH 181/190] Update default flags (#600) * internal/cli/server: use geth's default for txpool.pricelimit and add comments * builder/files: update config.toml for mainnet * packaging/templates: update defaults for mainnet and mumbai * internal/cli/server: skip overriding cache * packaging/templates: update cache value for mainnet * packaging/templates: update gcmode for archive mumbai node --- builder/files/config.toml | 6 +++--- internal/cli/server/config.go | 15 ++++----------- .../templates/mainnet-v1/archive/config.toml | 10 +++++----- .../mainnet-v1/sentry/sentry/bor/config.toml | 10 +++++----- .../mainnet-v1/sentry/validator/bor/config.toml | 10 +++++----- .../mainnet-v1/without-sentry/bor/config.toml | 10 +++++----- .../templates/testnet-v4/archive/config.toml | 8 ++++---- .../testnet-v4/sentry/sentry/bor/config.toml | 6 +++--- .../testnet-v4/sentry/validator/bor/config.toml | 6 +++--- .../testnet-v4/without-sentry/bor/config.toml | 6 +++--- 10 files changed, 40 insertions(+), 47 deletions(-) diff --git a/builder/files/config.toml b/builder/files/config.toml index 8f70f62a13..f79b892e7f 100644 --- a/builder/files/config.toml +++ b/builder/files/config.toml @@ -52,7 +52,7 @@ syncmode = "full" # pricebump = 10 [miner] - gaslimit = 20000000 + gaslimit = 30000000 gasprice = "30000000000" # mine = true # etherbase = "VALIDATOR ADDRESS" @@ -87,11 +87,11 @@ syncmode = "full" # vhosts = ["*"] # corsdomain = ["*"] -# [gpo] +[gpo] # blocks = 20 # percentile = 60 # maxprice = "5000000000000" - # ignoreprice = "2" + ignoreprice = "30000000000" [telemetry] metrics = true diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 7070afca24..2e0a8f21f5 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -428,7 +428,7 @@ func DefaultConfig() *Config { NoLocals: false, Journal: "transactions.rlp", Rejournal: 1 * time.Hour, - PriceLimit: 30000000000, + PriceLimit: 1, // geth's default PriceBump: 10, AccountSlots: 16, GlobalSlots: 32768, @@ -439,8 +439,8 @@ func DefaultConfig() *Config { Sealer: &SealerConfig{ Enabled: false, Etherbase: "", - GasCeil: 30_000_000, - GasPrice: big.NewInt(1 * params.GWei), + GasCeil: 30_000_000, // geth's default + GasPrice: big.NewInt(1 * params.GWei), // geth's default ExtraData: "", }, Gpo: &GpoConfig{ @@ -497,7 +497,7 @@ func DefaultConfig() *Config { }, }, Cache: &CacheConfig{ - Cache: 1024, + Cache: 1024, // geth's default (suitable for mumbai) PercDatabase: 50, PercTrie: 15, PercGc: 25, @@ -626,13 +626,6 @@ func (c *Config) loadChain() error { c.P2P.Discovery.DNS = c.chain.DNS } - // depending on the chain we have different cache values - if c.Chain == "mainnet" { - c.Cache.Cache = 4096 - } else { - c.Cache.Cache = 1024 - } - return nil } diff --git a/packaging/templates/mainnet-v1/archive/config.toml b/packaging/templates/mainnet-v1/archive/config.toml index a44a2ed0b5..8989a1b7b5 100644 --- a/packaging/templates/mainnet-v1/archive/config.toml +++ b/packaging/templates/mainnet-v1/archive/config.toml @@ -45,7 +45,7 @@ gcmode = "archive" # pricebump = 10 [miner] - gaslimit = 20000000 + gaslimit = 30000000 gasprice = "30000000000" # mine = false # etherbase = "" @@ -79,11 +79,11 @@ gcmode = "archive" # vhosts = ["*"] # corsdomain = ["*"] -# [gpo] +[gpo] # blocks = 20 # percentile = 60 # maxprice = "5000000000000" - # ignoreprice = "2" + ignoreprice = "30000000000" [telemetry] metrics = true @@ -102,8 +102,8 @@ gcmode = "archive" # organization = "" # [telemetry.influx.tags] -# [cache] - # cache = 1024 +[cache] + cache = 4096 # gc = 25 # snapshot = 10 # database = 50 diff --git a/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml b/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml index 5bb226b913..d91e12b31e 100644 --- a/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml +++ b/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml @@ -45,7 +45,7 @@ syncmode = "full" # pricebump = 10 [miner] - gaslimit = 20000000 + gaslimit = 30000000 gasprice = "30000000000" # mine = false # etherbase = "" @@ -79,11 +79,11 @@ syncmode = "full" # vhosts = ["*"] # corsdomain = ["*"] -# [gpo] +[gpo] # blocks = 20 # percentile = 60 # maxprice = "5000000000000" - # ignoreprice = "2" + ignoreprice = "30000000000" [telemetry] metrics = true @@ -102,8 +102,8 @@ syncmode = "full" # organization = "" # [telemetry.influx.tags] -# [cache] - # cache = 1024 +[cache] + cache = 4096 # gc = 25 # snapshot = 10 # database = 50 diff --git a/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml b/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml index 5a7688f9e8..c9f583aae3 100644 --- a/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml +++ b/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml @@ -48,7 +48,7 @@ syncmode = "full" [miner] mine = true - gaslimit = 20000000 + gaslimit = 30000000 gasprice = "30000000000" # etherbase = "" # extradata = "" @@ -81,11 +81,11 @@ syncmode = "full" # vhosts = ["*"] # corsdomain = ["*"] -# [gpo] +[gpo] # blocks = 20 # percentile = 60 # maxprice = "5000000000000" - # ignoreprice = "2" + ignoreprice = "30000000000" [telemetry] metrics = true @@ -104,8 +104,8 @@ syncmode = "full" # organization = "" # [telemetry.influx.tags] -# [cache] - # cache = 1024 +[cache] + cache = 4096 # gc = 25 # snapshot = 10 # database = 50 diff --git a/packaging/templates/mainnet-v1/without-sentry/bor/config.toml b/packaging/templates/mainnet-v1/without-sentry/bor/config.toml index 74094bfa80..5c4a057b91 100644 --- a/packaging/templates/mainnet-v1/without-sentry/bor/config.toml +++ b/packaging/templates/mainnet-v1/without-sentry/bor/config.toml @@ -48,7 +48,7 @@ syncmode = "full" [miner] mine = true - gaslimit = 20000000 + gaslimit = 30000000 gasprice = "30000000000" # etherbase = "" # extradata = "" @@ -81,11 +81,11 @@ syncmode = "full" # vhosts = ["*"] # corsdomain = ["*"] -# [gpo] +[gpo] # blocks = 20 # percentile = 60 # maxprice = "5000000000000" -# ignoreprice = "2" + ignoreprice = "30000000000" [telemetry] metrics = true @@ -104,8 +104,8 @@ syncmode = "full" # organization = "" # [telemetry.influx.tags] -# [cache] -# cache = 1024 +[cache] + cache = 4096 # gc = 25 # snapshot = 10 # database = 50 diff --git a/packaging/templates/testnet-v4/archive/config.toml b/packaging/templates/testnet-v4/archive/config.toml index 0438ffe3ae..5b7cbdd78e 100644 --- a/packaging/templates/testnet-v4/archive/config.toml +++ b/packaging/templates/testnet-v4/archive/config.toml @@ -4,7 +4,7 @@ chain = "mumbai" datadir = "/var/lib/bor/data" # keystore = "" syncmode = "full" -# gcmode = "full" +gcmode = "archive" # snapshot = true # ethstats = "" @@ -41,12 +41,12 @@ syncmode = "full" # locals = [] # journal = "" # rejournal = "1h0m0s" - # pricelimit = 30000000000 + # pricelimit = 1 # pricebump = 10 [miner] - gaslimit = 20000000 - # gasprice = "30000000000" + gaslimit = 30000000 + # gasprice = "1000000000" # mine = false # etherbase = "" # extradata = "" diff --git a/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml b/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml index 155a33373b..f98e04ff42 100644 --- a/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml +++ b/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml @@ -41,12 +41,12 @@ syncmode = "full" # locals = [] # journal = "" # rejournal = "1h0m0s" - # pricelimit = 30000000000 + # pricelimit = 1 # pricebump = 10 [miner] - gaslimit = 20000000 - # gasprice = "30000000000" + gaslimit = 30000000 + # gasprice = "1000000000" # mine = false # etherbase = "" # extradata = "" diff --git a/packaging/templates/testnet-v4/sentry/validator/bor/config.toml b/packaging/templates/testnet-v4/sentry/validator/bor/config.toml index 19b9a4452c..e2a404263d 100644 --- a/packaging/templates/testnet-v4/sentry/validator/bor/config.toml +++ b/packaging/templates/testnet-v4/sentry/validator/bor/config.toml @@ -43,13 +43,13 @@ syncmode = "full" # locals = [] # journal = "" # rejournal = "1h0m0s" - # pricelimit = 30000000000 + # pricelimit = 1 # pricebump = 10 [miner] mine = true - gaslimit = 20000000 - # gasprice = "30000000000" + gaslimit = 30000000 + # gasprice = "1000000000" # etherbase = "" # extradata = "" diff --git a/packaging/templates/testnet-v4/without-sentry/bor/config.toml b/packaging/templates/testnet-v4/without-sentry/bor/config.toml index c4de3e87c4..567c9a5b0a 100644 --- a/packaging/templates/testnet-v4/without-sentry/bor/config.toml +++ b/packaging/templates/testnet-v4/without-sentry/bor/config.toml @@ -43,13 +43,13 @@ syncmode = "full" # locals = [] # journal = "" # rejournal = "1h0m0s" - # pricelimit = 30000000000 + # pricelimit = 1 # pricebump = 10 [miner] mine = true - gaslimit = 20000000 - # gasprice = "30000000000" + gaslimit = 30000000 + # gasprice = "1000000000" # etherbase = "" # extradata = "" From 3e7160997a79c890b1f271b2e1c03a0c2eeeb303 Mon Sep 17 00:00:00 2001 From: Manav Darji Date: Sat, 26 Nov 2022 01:54:50 +0530 Subject: [PATCH 182/190] metrics: handle nil telemetry config (#601) --- metrics/metrics.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/metrics/metrics.go b/metrics/metrics.go index 1c0cf11ab4..a22f99feaa 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -93,7 +93,8 @@ func updateMetricsFromConfig(path string) { conf := &CliConfig{} - if _, err := toml.Decode(tomlData, &conf); err != nil || conf == nil { + _, err = toml.Decode(tomlData, &conf) + if err != nil || conf == nil || conf.Telemetry == nil { return } From 4d19cf5342a439d98cca21b03c63a0bc075769cf Mon Sep 17 00:00:00 2001 From: Will Button Date: Wed, 30 Nov 2022 08:00:31 -0800 Subject: [PATCH 183/190] update Docker login for goreleaser-cross v1.19 --- .github/workflows/release.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b615cf639e..0d45f0bc98 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,6 +29,12 @@ jobs: TAG=${GITHUB_REF#refs/tags/} echo ::set-output name=tag_name::${TAG} + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB }} + password: ${{ secrets.DOCKERHUB_KEY }} + - name: Set up QEMU uses: docker/setup-qemu-action@v1 @@ -39,5 +45,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} VERSION: ${{ steps.prepare.outputs.tag_name }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - DOCKER_USERNAME: ${{ secrets.DOCKERHUB }} - DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_KEY }} From 1cf78fd9c936cad37196a3f3cd752bb7864db244 Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Wed, 30 Nov 2022 16:38:48 -0600 Subject: [PATCH 184/190] Cleanup for the packager to use git tag in the package profile naming. Added conditional check for directory structure, this is in prep for v0.3.1, as this will create a failure on upgrade path in package due to file exist --- .github/workflows/packager.yml | 839 +++++++++++++----- packaging/templates/package_scripts/postinst | 9 +- .../package_scripts/postinst.profile | 9 +- 3 files changed, 643 insertions(+), 214 deletions(-) diff --git a/.github/workflows/packager.yml b/.github/workflows/packager.yml index 998008ede8..5c59b1751a 100644 --- a/.github/workflows/packager.yml +++ b/.github/workflows/packager.yml @@ -2,6 +2,10 @@ name: packager on: push: + branches: + - 'main' + paths: + - '**' tags: - 'v*.*.*' - 'v*.*.*-*' @@ -37,10 +41,15 @@ jobs: - name: removing systemd file for binary run: rm -rf lib/systemd/system/bor.service - - name: Creating package for binary only bor - run: cp -rp packaging/deb/bor packaging/deb/bor-v0.3.0-beta-amd64 + - name: Creating package for binary for bor ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + - name: Running package build - run: dpkg-deb --build --root-owner-group packaging/deb/bor-v0.3.0-beta-amd64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 - name: Removing the bor binary run: rm -rf packaging/deb/bor/usr/bin/bor @@ -50,113 +59,317 @@ jobs: - name: Copying systemd file run: cp -rp packaging/templates/systemd/bor.service packaging/deb/bor/lib/systemd/system/bor.service - - name: Prepping Mumbai Sentry Node Profile for amd64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64 - - name: Putting toml - run: cp -rp packaging/templates/testnet-v4/sentry/sentry/bor/config.toml packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/var/lib/bor/ - - name: Copying the preinst - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/preinst - - name: Copying the postinst - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/postinst - - name: Copying the prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/prerm - - name: Copying the postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/postrm - - name: Copying systemd file - run: cp -rp packaging/templates/systemd/bor.service packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/lib/systemd/system/ - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Running package build for sentry on amd64 - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-amd64 + - name: Prepping ${{ env.NETWORK }} ${{ env.NODE }} node for ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai + - name: Putting toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/testnet-v4/sentry/sentry/bor/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai + - name: Copying the preinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai + - name: Copying the postinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai + - name: Copying the prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai + - name: Copying the postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai + - name: Copying systemd file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/systemd/bor.service packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/lib/systemd/system/ + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai + - name: Running package build for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: sentry + NETWORK: mumbai - - name: Setting up Mainnet Sentry Config for amd64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64 - - name: Copying control file - run: cp -rp packaging/templates/package_scripts/control packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Putting toml - run: cp -rp packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/var/lib/bor/ - - name: Copying the preinst - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/preinst - - name: Copying the postinst - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/postinst - - name: Copying the prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/prerm - - name: Copying the postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/postrm - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Building Sentry for amd64 - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-amd64 + - name: Setting up ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet + - name: Copying control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet + - name: Putting toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet + - name: Copying the preinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet + - name: Copying the postinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet + - name: Copying the prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet + - name: Copying the postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet + - name: Building ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: sentry + NETWORK: mainnet - - name: Prepping Bor Validator Profile for amd64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64 - - name: Copying control file for validator on amd64 - run: cp -rp packaging/templates/package_scripts/control.validator packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Copying Postinstall script - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/postinst - - name: Copying Prerm script - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/prerm - - name: Copying Postrm script - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/postrm - - name: Copying config.toml for validator for bor - run: cp -rp packaging/templates/testnet-v4/sentry/validator/bor/config.toml packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/var/lib/bor/ - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Building bor validator on amd64 - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-amd64 + - name: Prepping Bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: validator + NETWORK: mumbai + - name: Copying control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.validator packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: validator + NETWORK: mumbai + - name: Copying Postinstall script for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: amd64 + NODE: validator + NETWORK: mumbai + - name: Copying Prerm script for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: amd64 + NODE: validator + NETWORK: mumbai + - name: Copying Postrm script for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: amd64 + NODE: validator + NETWORK: mumbai + - name: Copying config.toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/testnet-v4/sentry/validator/bor/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: amd64 + NODE: validator + NETWORK: mumbai + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: validator + NETWORK: mumbai + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: validator + NETWORK: mumbai - - name: Prepping Bor Mainnet Validator for amd64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64 - - name: Copying control file for validator on arm64 - run: cp -rp packaging/templates/package_scripts/control.validator packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Copying the preinst - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/preinst - - name: Copying Postinstall script - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/postinst - - name: Copying the prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/prerm - - name: Copying the postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/postrm - - name: Copying config.toml for validator for bor - run: cp -rp packaging/templates/mainnet-v1/sentry/validator/bor/config.toml packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/var/lib/bor/ - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Building bor validator on amd64 - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-amd64 + - name: Prepping Bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet + - name: Copying control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.validator packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet + - name: Copying the preinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet + - name: Copying Postinstall script for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet + - name: Copying the prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet + - name: Copying the postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet + - name: Copying config.toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/mainnet-v1/sentry/validator/bor/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: validator + NETWORK: mainnet - - name: Creating mumbai archive node profile for amd64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64 - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Copying profile preinst file - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/preinst - - name: Copying the profile postinst - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/postinst - - name: Copying profile prerm file - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/prerm - - name: Copying profile postrm file - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/postrm - - name: Copying the toml - run: cp -rp packaging/templates/testnet-v4/archive/config.toml packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/var/lib/bor/ - - name: Building profile package - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64 + - name: Creating bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: archive + NETWORK: mumbai + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: archive + NETWORK: mumbai + - name: Copying profile preinst file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: amd64 + NODE: archive + NETWORK: mumbai + - name: Copying the profile postinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: amd64 + NODE: archive + NETWORK: mumbai + - name: Copying profile prerm file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: amd64 + NODE: archive + NETWORK: mumbai + - name: Copying profile postrm file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: amd64 + NODE: archive + NETWORK: mumbai + - name: Copying the toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/testnet-v4/archive/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: amd64 + NODE: archive + NETWORK: mumbai + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: archive + NETWORK: mumbai - - name: Creating mainnet archive node profile for amd64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64 - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-amd64/DEBIAN/control - - name: Copying profile preinst file - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/DEBIAN/preinst - - name: Copying the profile postinst - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/DEBIAN/postinst - - name: Copying profile prerm file - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/DEBIAN/prerm - - name: Copying profile postrm file - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/DEBIAN/postrm - - name: Copying the toml - run: cp -rp packaging/templates/mainnet-v1/archive/config.toml packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64/var/lib/bor/ - - name: Building porfile package - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-amd64 + - name: Creating bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: archive + NETWORK: mainnet + - name: Copying control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.amd64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: amd64 + NODE: archive + NETWORK: mainnet + - name: Copying profile preinst file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: amd64 + NODE: archive + NETWORK: mainnet + - name: Copying the profile postinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: amd64 + NODE: archive + NETWORK: mainnet + - name: Copying profile prerm file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: amd64 + NODE: archive + NETWORK: mainnet + - name: Copying profile postrm file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: amd64 + NODE: archive + NETWORK: mainnet + - name: Copying the toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/mainnet-v1/archive/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: amd64 + NODE: archive + NETWORK: mainnet + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + NODE: archive + NETWORK: mainnet - name: Cleaning build directory for arm64 build run: make clean @@ -177,11 +390,17 @@ jobs: run: cp -rp build/bin/bor packaging/deb/bor/usr/bin/ - name: Creating package for binary only bor - run: cp -rp packaging/deb/bor packaging/deb/bor-v0.3.0-beta-arm64 + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 - name: Copying control file - run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-v0.3.0-beta-arm64/DEBIAN/control + run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 - name: Running package build - run: dpkg-deb --build --root-owner-group packaging/deb/bor-v0.3.0-beta-arm64 + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 - name: Removing the bor binary run: rm -rf packaging/deb/bor/usr/bin/bor @@ -192,123 +411,323 @@ jobs: - name: Updating the control file to use with the arm64 profile run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor/DEBIAN/control - - name: Setting up Mumbai Sentry Config for arm64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64 - - name: Copying control file - run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Putting toml - run: cp -rp packaging/templates/testnet-v4/sentry/sentry/bor/config.toml packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/var/lib/bor/ - - name: Copying the preinst - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/preinst - - name: Copying the prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/prerm - - name: Copying the postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/postrm - - name: Copying the postinst - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/postinst - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Building Sentry for arm64 - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64 + - name: Setting up bor for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai + - name: Copying control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai + - name: Putting toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/testnet-v4/sentry/sentry/bor/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai + - name: Copying the preinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai + - name: Copying the prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai + - name: Copying the postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai + - name: Copying the postinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: sentry + NETWORK: mumbai - - name: Setting up Mainnet Sentry Config for arm64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64 - - name: Copying control file - run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Putting toml - run: cp -rp packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/var/lib/bor/ - - name: Copying the preinst - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/preinst - - name: Copying the prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/prerm - - name: Copying the postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/postrm - - name: Copying the postinst - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/postinst - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Building Sentry for arm64 - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-sentry-config_v0.3.0-beta-arm64 + - name: Setting up bor for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet + - name: Copying control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet + - name: Putting toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet + - name: Copying the preinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet + - name: Copying the prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet + - name: Copying the postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet + - name: Copying the postinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: sentry + NETWORK: mainnet - - name: Prepping Bor Mumbai Validator for arm64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64 - - name: Copying control file for validator on arm64 - run: cp -rp packaging/templates/package_scripts/control.validator.arm64 packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Copying the preinst - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/preinst - - name: Copying Postinstall script - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64/DEBIAN/postinst - - name: Copying the prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/prerm - - name: Copying the postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-sentry-config_v0.3.0-beta-arm64/DEBIAN/postrm - - name: Copying config.toml for validator for bor - run: cp -rp packaging/templates/testnet-v4/sentry/validator/bor/config.toml packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64/var/lib/bor/ - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Building bor validator on arm64 - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-validator-config_v0.3.0-beta-arm64 + - name: Prepping Bor for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai + - name: Copying control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.validator.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai + - name: Copying the preinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai + - name: Copying Postinstall script for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai + - name: Copying the prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai + - name: Copying the postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai + - name: Copying config.toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/testnet-v4/sentry/validator/bor/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: validator + NETWORK: mumbai - - name: Prepping Bor Mainnet Validator for arm64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64 - - name: Copying control file for validator on arm64 - run: cp -rp packaging/templates/package_scripts/control.validator.arm64 packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Copying the preinst - run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/preinst - - name: Copying Postinstall script - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/postinst - - name: Copying the prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/prerm - - name: Copying the postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/postrm - - name: Copying config.toml for validator for bor - run: cp -rp packaging/templates/mainnet-v1/sentry/validator/bor/config.toml packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/var/lib/bor/ - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Building bor validator on arm64 - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-validator-config_v0.3.0-beta-arm64 + - name: Prepping Bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet + - name: Copying control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.validator.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet + - name: Copying the preinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/preinst packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/preinst + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet + - name: Copying Postinstall script for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet + - name: Copying the prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet + - name: Copying the postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet + - name: Copying config.toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/mainnet-v1/sentry/validator/bor/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: validator + NETWORK: mainnet - name: Updating the control file to use with the arm64 profile run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor/DEBIAN/control - - name: Creating mumbai archive node profile for arm64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64 - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Copying over profile postinst - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/DEBIAN/postinst - - name: Copying prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/DEBIAN/prerm - - name: Copying postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/DEBIAN/postrm - - name: Copying the toml - run: cp -rp packaging/templates/testnet-v4/archive/config.toml packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64/var/lib/bor/ - - name: Building profile package - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mumbai-archive-config_v0.3.0-beta-arm64 + - name: Creating bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: archive + NETWORK: mumbai + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: archive + NETWORK: mumbai + - name: Copying over profile postinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: arm64 + NODE: archive + NETWORK: mumbai + - name: Copying prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: arm64 + NODE: archive + NETWORK: mumbai + - name: Copying postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: arm64 + NODE: archive + NETWORK: mumbai + - name: Copying the toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/testnet-v4/archive/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: arm64 + NODE: archive + NETWORK: mumbai + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: archive + NETWORK: mumbai - - name: Creating mainnet archive node profile for arm64 - run: cp -rp packaging/deb/bor packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64 - - name: Copying profile control file - run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/DEBIAN/control - - name: Copying over profile postinst - run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/DEBIAN/postinst - - name: Copying prerm - run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/DEBIAN/prerm - - name: Copying postrm - run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/DEBIAN/postrm - - name: Copying the toml - run: cp -rp packaging/templates/mainnet-v1/archive/config.toml packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64/var/lib/bor/ - - name: Building porfile package - run: dpkg-deb --build --root-owner-group packaging/deb/bor-mainnet-archive-config_v0.3.0-beta-arm64 + - name: Creating bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/deb/bor packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: archive + NETWORK: mainnet + - name: Copying profile control file for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/control.profile.arm64 packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/control + env: + ARCH: arm64 + NODE: archive + NETWORK: mainnet + - name: Copying over profile postinst for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postinst.profile packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postinst + env: + ARCH: arm64 + NODE: archive + NETWORK: mainnet + - name: Copying prerm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/prerm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/prerm + env: + ARCH: arm64 + NODE: archive + NETWORK: mainnet + - name: Copying postrm for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/package_scripts/postrm packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/DEBIAN/postrm + env: + ARCH: arm64 + NODE: archive + NETWORK: mainnet + - name: Copying the toml for ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} + run: cp -rp packaging/templates/mainnet-v1/archive/config.toml packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }}/var/lib/bor/ + env: + ARCH: arm64 + NODE: archive + NETWORK: mainnet + - name: Building bor ${{ env.NODE }} on ${{ env.NETWORK }} on ${{ env.ARCH }} profile + run: dpkg-deb --build --root-owner-group packaging/deb/bor-${{ env.NETWORK }}-${{ env.NODE }}-config_${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + NODE: archive + NETWORK: mainnet - name: Confirming package built run: ls -ltr packaging/deb/ | grep bor - - name: Pre-Release bor Packages + - name: Release bor Packages uses: softprops/action-gh-release@v1 with: tag_name: ${{ env.GIT_TAG }} prerelease: true files: | packaging/deb/bor**.deb - binary/bo** + binary/bo** \ No newline at end of file diff --git a/packaging/templates/package_scripts/postinst b/packaging/templates/package_scripts/postinst index 761ee29f26..7272b4b1aa 100755 --- a/packaging/templates/package_scripts/postinst +++ b/packaging/templates/package_scripts/postinst @@ -2,6 +2,11 @@ # This is a postinstallation script so the service can be configured and started when requested # sudo adduser --disabled-password --disabled-login --shell /usr/sbin/nologin --quiet --system --no-create-home --home /nonexistent bor -sudo mkdir -p /var/lib/bor -sudo chown -R bor /var/lib/bor +if [ -d "/var/lib/bor" ] +then + echo "Directory /var/lib/bor exists." +else + mkdir -p /var/lib/bor + sudo chown -R bor /var/lib/bor +fi sudo systemctl daemon-reload diff --git a/packaging/templates/package_scripts/postinst.profile b/packaging/templates/package_scripts/postinst.profile index 80b8381203..e9a497906d 100755 --- a/packaging/templates/package_scripts/postinst.profile +++ b/packaging/templates/package_scripts/postinst.profile @@ -1,6 +1,11 @@ #!/bin/bash # This is a postinstallation script so the service can be configured and started when requested # -sudo mkdir -p /var/lib/bor -sudo chown -R bor /var/lib/bor +if [ -d "/var/lib/bor" ] +then + echo "Directory /var/lib/bor exists." +else + mkdir -p /var/lib/bor + sudo chown -R bor /var/lib/bor +fi sudo systemctl daemon-reload From 4d06349d954c10f4207695d3ca358a0a0ad1f177 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Thu, 1 Dec 2022 09:20:17 +0530 Subject: [PATCH 185/190] added a toml configuration file with comments describing each flag (#607) * added a toml configuration file with comments describing each flag * internal/cli/server: update flag description * docs/cli: update example config and description of flags * docs: update new-cli docs Co-authored-by: Manav Darji --- docs/README.md | 12 ++- docs/cli/example_config.toml | 141 +++++++++++++++++++++++++++++++++ docs/cli/server.md | 14 ++-- docs/config.md | 146 ----------------------------------- internal/cli/server/flags.go | 10 +-- 5 files changed, 159 insertions(+), 164 deletions(-) create mode 100644 docs/cli/example_config.toml delete mode 100644 docs/config.md diff --git a/docs/README.md b/docs/README.md index 5ebdbd7e26..45021e8c7f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,9 +1,7 @@ # Documentation -- [Command-line-interface](./cli) - -- [Configuration file](./config.md) +- [The new command line interface](./cli) ## Additional notes @@ -13,8 +11,14 @@ $ bor server ``` -- Toml files used earlier just to configure static/trusted nodes are being deprecated. Instead, a toml file now can be used instead of flags and can contain all configuration for the node to run. The link to a sample config file is given above. To simply run bor with a configuration file, the following command can be used. +- The `bor dumpconfig` sub-command prints the default configurations, in the TOML format, on the terminal. One can `pipe (>)` this to a file (say `config.toml`) and use it to start bor. + +- A toml file now can be used instead of flags and can contain all configuration for the node to run. To simply run bor with a configuration file, the following command can be used. ``` $ bor server --config ``` + +- You can find an example config file [here](./cli/example_config.toml) to know more about what each flag is used for, what are the defaults and recommended values for different networks. + +- Toml files used earlier (with `--config` flag) to configure additional fields (like static and trusted nodes) are being deprecated and have been converted to flags. diff --git a/docs/cli/example_config.toml b/docs/cli/example_config.toml new file mode 100644 index 0000000000..bc48b752d5 --- /dev/null +++ b/docs/cli/example_config.toml @@ -0,0 +1,141 @@ +# This configuration file is for reference and learning purpose only. +# The default value of the flags is provided below (except a few flags which has custom defaults which are explicitly mentioned). +# Recommended values for mainnet and/or mumbai are also provided. + +chain = "mainnet" # Name of the chain to sync ("mumbai", "mainnet") or path to a genesis file +identity = "Annon-Identity" # Name/Identity of the node (default = OS hostname) +log-level = "INFO" # Set log level for the server +datadir = "var/lib/bor" # Path of the data directory to store information +keystore = "" # Path of the directory where keystores are located +syncmode = "full" # Blockchain sync mode (only "full" sync supported) +gcmode = "full" # Blockchain garbage collection mode ("full", "archive") +snapshot = true # Enables the snapshot-database mode +"bor.logs" = false # Enables bor log retrieval +ethstats = "" # Reporting URL of a ethstats service (nodename:secret@host:port) + +["eth.requiredblocks"] # Comma separated block number-to-hash mappings to require for peering (=) (default = empty map) + "31000000" = "0x2087b9e2b353209c2c21e370c82daa12278efd0fe5f0febe6c29035352cf050e" + "32000000" = "0x875500011e5eecc0c554f95d07b31cf59df4ca2505f4dbbfffa7d4e4da917c68" + +[p2p] + maxpeers = 50 # Maximum number of network peers (network disabled if set to 0) + maxpendpeers = 50 # Maximum number of pending connection attempts + bind = "0.0.0.0" # Network binding address + port = 30303 # Network listening port + nodiscover = false # Disables the peer discovery mechanism (manual peer addition) + nat = "any" # NAT port mapping mechanism (any|none|upnp|pmp|extip:) + [p2p.discovery] + v5disc = false # Enables the experimental RLPx V5 (Topic Discovery) mechanism + bootnodes = [] # Comma separated enode URLs for P2P discovery bootstrap + bootnodesv4 = [] # List of initial v4 bootnodes + bootnodesv5 = [] # List of initial v5 bootnodes + static-nodes = [] # List of static nodes + trusted-nodes = [] # List of trusted nodes + dns = [] # List of enrtree:// URLs which will be queried for nodes to connect to + +[heimdall] + url = "http://localhost:1317" # URL of Heimdall service + "bor.without" = false # Run without Heimdall service (for testing purpose) + grpc-address = "" # Address of Heimdall gRPC service + +[txpool] + locals = [] # Comma separated accounts to treat as locals (no flush, priority inclusion) + nolocals = false # Disables price exemptions for locally submitted transactions + journal = "transactions.rlp" # Disk journal for local transaction to survive node restarts + rejournal = "1h0m0s" # Time interval to regenerate the local transaction journal + pricelimit = 1 # Minimum gas price limit to enforce for acceptance into the pool (mainnet = 30000000000) + pricebump = 10 # Price bump percentage to replace an already existing transaction + accountslots = 16 # Minimum number of executable transaction slots guaranteed per account + globalslots = 32768 # Maximum number of executable transaction slots for all accounts + accountqueue = 16 # Maximum number of non-executable transaction slots permitted per account + globalqueue = 32768 # Maximum number of non-executable transaction slots for all accounts + lifetime = "3h0m0s" # Maximum amount of time non-executable transaction are queued + +[miner] + mine = false # Enable mining + etherbase = "" # Public address for block mining rewards + extradata = "" # Block extra data set by the miner (default = client version) + gaslimit = 30000000 # Target gas ceiling for mined blocks + gasprice = "1000000000" # Minimum gas price for mining a transaction (recommended for mainnet = 30000000000, default suitable for mumbai/devnet) + +[jsonrpc] + ipcdisable = false # Disable the IPC-RPC server + ipcpath = "" # Filename for IPC socket/pipe within the datadir (explicit paths escape it) + gascap = 50000000 # Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite) + txfeecap = 5.0 # Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap) + [jsonrpc.http] + enabled = false # Enable the HTTP-RPC server + port = 8545 # http.port + prefix = "" # http.rpcprefix + host = "localhost" # HTTP-RPC server listening interface + api = ["eth", "net", "web3", "txpool", "bor"] # API's offered over the HTTP-RPC interface + vhosts = ["localhost"] # Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. + corsdomain = ["localhost"] # Comma separated list of domains from which to accept cross origin requests (browser enforced) + [jsonrpc.ws] + enabled = false # Enable the WS-RPC server + port = 8546 # WS-RPC server listening port + prefix = "" # HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths. + host = "localhost" # ws.addr + api = ["net", "web3"] # API's offered over the WS-RPC interface + origins = ["localhost"] # Origins from which to accept websockets requests + [jsonrpc.graphql] + enabled = false # Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well. + port = 0 # + prefix = "" # + host = "" # + vhosts = ["localhost"] # Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. + corsdomain = ["localhost"] # Comma separated list of domains from which to accept cross origin requests (browser enforced) + +[gpo] + blocks = 20 # Number of recent blocks to check for gas prices + percentile = 60 # Suggested gas price is the given percentile of a set of recent transaction gas prices + maxprice = "5000000000000" # Maximum gas price will be recommended by gpo + ignoreprice = "2" # Gas price below which gpo will ignore transactions (recommended for mainnet = 30000000000, default suitable for mumbai/devnet) + +[telemetry] + metrics = false # Enable metrics collection and reporting + expensive = false # Enable expensive metrics collection and reporting + prometheus-addr = "127.0.0.1:7071" # Address for Prometheus Server + opencollector-endpoint = "127.0.0.1:4317" # OpenCollector Endpoint (host:port) + [telemetry.influx] + influxdb = false # Enable metrics export/push to an external InfluxDB database (v1) + endpoint = "" # InfluxDB API endpoint to report metrics to + database = "" # InfluxDB database name to push reported metrics to + username = "" # Username to authorize access to the database + password = "" # Password to authorize access to the database + influxdbv2 = false # Enable metrics export/push to an external InfluxDB v2 database + token = "" # Token to authorize access to the database (v2 only) + bucket = "" # InfluxDB bucket name to push reported metrics to (v2 only) + organization = "" # InfluxDB organization name (v2 only) + [telemetry.influx.tags] # Comma-separated InfluxDB tags (key/values) attached to all measurements + cloud = "aws" + host = "annon-host" + ip = "99.911.221.66" + region = "us-north-1" + +[cache] + cache = 1024 # Megabytes of memory allocated to internal caching (recommended for mainnet = 4096, default suitable for mumbai/devnet) + gc = 25 # Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode) + snapshot = 10 # Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode) + database = 50 # Percentage of cache memory allowance to use for database io + trie = 15 # Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode) + journal = "triecache" # Disk journal directory for trie cache to survive node restarts + rejournal = "1h0m0s" # Time interval to regenerate the trie cache journal + noprefetch = false # Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data) + preimages = false # Enable recording the SHA3/keccak preimages of trie keys + txlookuplimit = 2350000 # Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain) + triesinmemory = 128 # Number of block states (tries) to keep in memory + +[accounts] + unlock = [] # Comma separated list of accounts to unlock + password = "" # Password file to use for non-interactive password input + allow-insecure-unlock = false # Allow insecure account unlocking when account-related RPCs are exposed by http + lightkdf = false # Reduce key-derivation RAM & CPU usage at some expense of KDF strength + disable-bor-wallet = true # Disable the personal wallet endpoints + +[grpc] + addr = ":3131" # Address and port to bind the GRPC server + +[developer] + dev = false # Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled + period = 0 # Block period to use in developer mode (0 = mine only if transaction pending) diff --git a/docs/cli/server.md b/docs/cli/server.md index d52b135fa3..4c291a74b9 100644 --- a/docs/cli/server.md +++ b/docs/cli/server.md @@ -4,7 +4,7 @@ The ```bor server``` command runs the Bor client. ## Options -- ```chain```: Name of the chain to sync +- ```chain```: Name of the chain to sync ('mumbai', 'mainnet') or path to a genesis file - ```identity```: Name/Identity of the node @@ -12,7 +12,7 @@ The ```bor server``` command runs the Bor client. - ```datadir```: Path of the data directory to store information -- ```keystore```: Path of the directory to store keystores +- ```keystore```: Path of the directory where keystores are located - ```config```: File for the config file @@ -30,8 +30,6 @@ The ```bor server``` command runs the Bor client. - ```bor.withoutheimdall```: Run without Heimdall service (for testing purpose) -- ```bor.heimdallgRPC```: Address of Heimdall gRPC service - - ```ethstats```: Reporting URL of a ethstats service (nodename:secret@host:port) - ```gpo.blocks```: Number of recent blocks to check for gas prices @@ -80,8 +78,6 @@ The ```bor server``` command runs the Bor client. - ```cache.preimages```: Enable recording the SHA3/keccak preimages of trie keys -- ```cache.triesinmemory```: Number of block states (tries) to keep in memory (default = 128) - - ```txlookuplimit```: Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain) ### JsonRPC Options @@ -136,7 +132,7 @@ The ```bor server``` command runs the Bor client. - ```maxpeers```: Maximum number of network peers (network disabled if set to 0) -- ```maxpendpeers```: Maximum number of pending connection attempts (defaults used if set to 0) +- ```maxpendpeers```: Maximum number of pending connection attempts - ```nat```: NAT port mapping mechanism (any|none|upnp|pmp|extip:) @@ -148,11 +144,11 @@ The ```bor server``` command runs the Bor client. - ```mine```: Enable mining -- ```miner.etherbase```: Public address for block mining rewards (default = first account) +- ```miner.etherbase```: Public address for block mining rewards - ```miner.extradata```: Block extra data set by the miner (default = client version) -- ```miner.gaslimit```: Target gas ceiling for mined blocks +- ```miner.gaslimit```: Target gas ceiling (gas limit) for mined blocks - ```miner.gasprice```: Minimum gas price for mining a transaction diff --git a/docs/config.md b/docs/config.md deleted file mode 100644 index 57f4c25fef..0000000000 --- a/docs/config.md +++ /dev/null @@ -1,146 +0,0 @@ - -# Config - -- The `bor dumpconfig` command prints the default configurations, in the TOML format, on the terminal. - - One can `pipe (>)` this to a file (say `config.toml`) and use it to start bor. - - Command to provide a config file: `bor server -config config.toml` -- Bor uses TOML, HCL, and JSON format config files. -- This is the format of the config file in TOML: - - **NOTE: The values of these following flags are just for reference** - - `config.toml` file: -``` -chain = "mainnet" -identity = "myIdentity" -log-level = "INFO" -datadir = "/var/lib/bor/data" -keystore = "path/to/keystore" -syncmode = "full" -gcmode = "full" -snapshot = true -ethstats = "" - -["eth.requiredblocks"] - -[p2p] -maxpeers = 50 -maxpendpeers = 50 -bind = "0.0.0.0" -port = 30303 -nodiscover = false -nat = "any" - -[p2p.discovery] -v5disc = false -bootnodes = ["enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", "enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303"] -bootnodesv4 = [] -bootnodesv5 = ["enr:-KG4QOtcP9X1FbIMOe17QNMKqDxCpm14jcX5tiOE4_TyMrFqbmhPZHK_ZPG2Gxb1GE2xdtodOfx9-cgvNtxnRyHEmC0ghGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", "enr:-KG4QDyytgmE4f7AnvW-ZaUOIi9i79qX4JwjRAiXBZCU65wOfBu-3Nb5I7b_Rmg3KCOcZM_C3y5pg7EBU5XGrcLTduQEhGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQ2_DUbiXNlY3AyNTZrMaEDKnz_-ps3UUOfHWVYaskI5kWYO_vtYMGYCQRAR3gHDouDdGNwgiMog3VkcIIjKA"] -static-nodes = ["enode://8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303"] -trusted-nodes = ["enode://2b252ab6a1d0f971d9722cb839a42cb81db019ba44c08754628ab4a823487071b5695317c8ccd085219c3a03af063495b2f1da8d18218da2d6a82981b45e6ffc@65.108.70.101:30303"] -dns = [] - -[heimdall] -url = "http://localhost:1317" -"bor.without" = false - -[txpool] -locals = ["$ADDRESS1", "$ADDRESS2"] -nolocals = false -journal = "" -rejournal = "1h0m0s" -pricelimit = 30000000000 -pricebump = 10 -accountslots = 16 -globalslots = 32768 -accountqueue = 16 -globalqueue = 32768 -lifetime = "3h0m0s" - -[miner] -mine = false -etherbase = "" -extradata = "" -gaslimit = 20000000 -gasprice = "30000000000" - -[jsonrpc] -ipcdisable = false -ipcpath = "/var/lib/bor/bor.ipc" -gascap = 50000000 -txfeecap = 5e+00 - -[jsonrpc.http] -enabled = false -port = 8545 -prefix = "" -host = "localhost" -api = ["eth", "net", "web3", "txpool", "bor"] -vhosts = ["*"] -corsdomain = ["*"] - -[jsonrpc.ws] -enabled = false -port = 8546 -prefix = "" -host = "localhost" -api = ["web3", "net"] -vhosts = ["*"] -corsdomain = ["*"] - -[jsonrpc.graphql] -enabled = false -port = 0 -prefix = "" -host = "" -api = [] -vhosts = ["*"] -corsdomain = ["*"] - -[gpo] -blocks = 20 -percentile = 60 -maxprice = "5000000000000" -ignoreprice = "2" - -[telemetry] -metrics = false -expensive = false -prometheus-addr = "" -opencollector-endpoint = "" - -[telemetry.influx] -influxdb = false -endpoint = "" -database = "" -username = "" -password = "" -influxdbv2 = false -token = "" -bucket = "" -organization = "" - -[cache] -cache = 1024 -gc = 25 -snapshot = 10 -database = 50 -trie = 15 -journal = "triecache" -rejournal = "1h0m0s" -noprefetch = false -preimages = false -txlookuplimit = 2350000 - -[accounts] -unlock = ["$ADDRESS1", "$ADDRESS2"] -password = "path/to/password.txt" -allow-insecure-unlock = false -lightkdf = false -disable-bor-wallet = false - -[grpc] -addr = ":3131" - -[developer] -dev = false -period = 0 -``` diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index 79aec3157a..550d76942b 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -11,7 +11,7 @@ func (c *Command) Flags() *flagset.Flagset { f.StringFlag(&flagset.StringFlag{ Name: "chain", - Usage: "Name of the chain to sync", + Usage: "Name of the chain to sync ('mumbai', 'mainnet') or path to a genesis file", Value: &c.cliConfig.Chain, Default: c.cliConfig.Chain, }) @@ -35,7 +35,7 @@ func (c *Command) Flags() *flagset.Flagset { }) f.StringFlag(&flagset.StringFlag{ Name: "keystore", - Usage: "Path of the directory to store keystores", + Usage: "Path of the directory where keystores are located", Value: &c.cliConfig.KeyStoreDir, }) f.StringFlag(&flagset.StringFlag{ @@ -176,7 +176,7 @@ func (c *Command) Flags() *flagset.Flagset { }) f.StringFlag(&flagset.StringFlag{ Name: "miner.etherbase", - Usage: "Public address for block mining rewards (default = first account)", + Usage: "Public address for block mining rewards", Value: &c.cliConfig.Sealer.Etherbase, Default: c.cliConfig.Sealer.Etherbase, Group: "Sealer", @@ -190,7 +190,7 @@ func (c *Command) Flags() *flagset.Flagset { }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "miner.gaslimit", - Usage: "Target gas ceiling for mined blocks", + Usage: "Target gas ceiling (gas limit) for mined blocks", Value: &c.cliConfig.Sealer.GasCeil, Default: c.cliConfig.Sealer.GasCeil, Group: "Sealer", @@ -485,7 +485,7 @@ func (c *Command) Flags() *flagset.Flagset { }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "maxpendpeers", - Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", + Usage: "Maximum number of pending connection attempts", Value: &c.cliConfig.P2P.MaxPendPeers, Default: c.cliConfig.P2P.MaxPendPeers, Group: "P2P", From e3303294b4d14f31df742a3ed277de13303bf210 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Sun, 4 Dec 2022 10:02:55 +0530 Subject: [PATCH 186/190] added ancient datadir flag and toml field, need to decide on default value and update the conversion script --- internal/cli/server/config.go | 8 ++++++++ internal/cli/server/flags.go | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 2e0a8f21f5..6bbe3d781a 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -53,6 +53,9 @@ type Config struct { // DataDir is the directory to store the state in DataDir string `hcl:"datadir,optional" toml:"datadir,optional"` + // Ancient is the directory to store the state in + Ancient string `hcl:"ancient,optional" toml:"ancient,optional"` + // KeyStoreDir is the directory to store keystores KeyStoreDir string `hcl:"keystore,optional" toml:"keystore,optional"` @@ -398,6 +401,7 @@ func DefaultConfig() *Config { RequiredBlocks: map[string]string{}, LogLevel: "INFO", DataDir: DefaultDataDir(), + Ancient: "", P2P: &P2PConfig{ MaxPeers: 50, MaxPendPeers: 50, @@ -879,6 +883,10 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* n.BorLogs = c.BorLogs n.DatabaseHandles = dbHandles + if c.Ancient != "" { + n.DatabaseFreezer = c.Ancient + } + return &n, nil } diff --git a/internal/cli/server/flags.go b/internal/cli/server/flags.go index 550d76942b..a53e1c3e46 100644 --- a/internal/cli/server/flags.go +++ b/internal/cli/server/flags.go @@ -33,6 +33,12 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.cliConfig.DataDir, Default: c.cliConfig.DataDir, }) + f.StringFlag(&flagset.StringFlag{ + Name: "datadir.ancient", + Usage: "Data directory for ancient chain segments (default = inside chaindata)", + Value: &c.cliConfig.Ancient, + Default: c.cliConfig.Ancient, + }) f.StringFlag(&flagset.StringFlag{ Name: "keystore", Usage: "Path of the directory where keystores are located", From 531d67a53757fb5ab6776861eaa4f1e933cf098a Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Mon, 5 Dec 2022 07:52:26 +0530 Subject: [PATCH 187/190] updated toml files with ancient field --- builder/files/config.toml | 1 + docs/cli/example_config.toml | 1 + packaging/templates/mainnet-v1/archive/config.toml | 1 + packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml | 1 + packaging/templates/mainnet-v1/sentry/validator/bor/config.toml | 1 + packaging/templates/mainnet-v1/without-sentry/bor/config.toml | 1 + packaging/templates/testnet-v4/archive/config.toml | 1 + packaging/templates/testnet-v4/sentry/sentry/bor/config.toml | 1 + packaging/templates/testnet-v4/sentry/validator/bor/config.toml | 1 + packaging/templates/testnet-v4/without-sentry/bor/config.toml | 1 + 10 files changed, 10 insertions(+) diff --git a/builder/files/config.toml b/builder/files/config.toml index f79b892e7f..e2267469bb 100644 --- a/builder/files/config.toml +++ b/builder/files/config.toml @@ -6,6 +6,7 @@ chain = "mainnet" # identity = "Pratiks-MacBook-Pro.local" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "/var/lib/bor/keystore" syncmode = "full" # gcmode = "full" diff --git a/docs/cli/example_config.toml b/docs/cli/example_config.toml index bc48b752d5..cdf2a989d7 100644 --- a/docs/cli/example_config.toml +++ b/docs/cli/example_config.toml @@ -6,6 +6,7 @@ chain = "mainnet" # Name of the chain to sync ("mumbai", "mainnet") o identity = "Annon-Identity" # Name/Identity of the node (default = OS hostname) log-level = "INFO" # Set log level for the server datadir = "var/lib/bor" # Path of the data directory to store information +ancient = "" # Data directory for ancient chain segments (default = inside chaindata) keystore = "" # Path of the directory where keystores are located syncmode = "full" # Blockchain sync mode (only "full" sync supported) gcmode = "full" # Blockchain garbage collection mode ("full", "archive") diff --git a/packaging/templates/mainnet-v1/archive/config.toml b/packaging/templates/mainnet-v1/archive/config.toml index 8989a1b7b5..a0eda44c15 100644 --- a/packaging/templates/mainnet-v1/archive/config.toml +++ b/packaging/templates/mainnet-v1/archive/config.toml @@ -2,6 +2,7 @@ chain = "mainnet" # identity = "node_name" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "" syncmode = "full" gcmode = "archive" diff --git a/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml b/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml index d91e12b31e..b6d6b34f4d 100644 --- a/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml +++ b/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml @@ -2,6 +2,7 @@ chain = "mainnet" # identity = "node_name" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "" syncmode = "full" # gcmode = "full" diff --git a/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml b/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml index c9f583aae3..e0a9be320f 100644 --- a/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml +++ b/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml @@ -4,6 +4,7 @@ chain = "mainnet" # identity = "node_name" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "$BOR_DIR/keystore" syncmode = "full" # gcmode = "full" diff --git a/packaging/templates/mainnet-v1/without-sentry/bor/config.toml b/packaging/templates/mainnet-v1/without-sentry/bor/config.toml index 5c4a057b91..b316ce4e8f 100644 --- a/packaging/templates/mainnet-v1/without-sentry/bor/config.toml +++ b/packaging/templates/mainnet-v1/without-sentry/bor/config.toml @@ -4,6 +4,7 @@ chain = "mainnet" # identity = "node_name" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "$BOR_DIR/keystore" syncmode = "full" # gcmode = "full" diff --git a/packaging/templates/testnet-v4/archive/config.toml b/packaging/templates/testnet-v4/archive/config.toml index 5b7cbdd78e..ce0d0ff983 100644 --- a/packaging/templates/testnet-v4/archive/config.toml +++ b/packaging/templates/testnet-v4/archive/config.toml @@ -2,6 +2,7 @@ chain = "mumbai" # identity = "node_name" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "" syncmode = "full" gcmode = "archive" diff --git a/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml b/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml index f98e04ff42..3655478d45 100644 --- a/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml +++ b/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml @@ -2,6 +2,7 @@ chain = "mumbai" # identity = "node_name" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "" syncmode = "full" # gcmode = "full" diff --git a/packaging/templates/testnet-v4/sentry/validator/bor/config.toml b/packaging/templates/testnet-v4/sentry/validator/bor/config.toml index e2a404263d..9d30428205 100644 --- a/packaging/templates/testnet-v4/sentry/validator/bor/config.toml +++ b/packaging/templates/testnet-v4/sentry/validator/bor/config.toml @@ -4,6 +4,7 @@ chain = "mumbai" # identity = "node_name" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "$BOR_DIR/keystore" syncmode = "full" # gcmode = "full" diff --git a/packaging/templates/testnet-v4/without-sentry/bor/config.toml b/packaging/templates/testnet-v4/without-sentry/bor/config.toml index 567c9a5b0a..0e0aeae3a1 100644 --- a/packaging/templates/testnet-v4/without-sentry/bor/config.toml +++ b/packaging/templates/testnet-v4/without-sentry/bor/config.toml @@ -4,6 +4,7 @@ chain = "mumbai" # identity = "node_name" # log-level = "INFO" datadir = "/var/lib/bor/data" +# ancient = "" # keystore = "$BOR_DIR/keystore" syncmode = "full" # gcmode = "full" From 57075d000d1a6396c33d42e5da97be19bfcfb6f1 Mon Sep 17 00:00:00 2001 From: Pratik Patil Date: Mon, 5 Dec 2022 19:21:33 +0530 Subject: [PATCH 188/190] Add support for new flags in new config.toml, which were present in old config.toml (#612) * added HTTPTimeouts, and TrieTimeout flag in new tol, from old toml * added RAW fields for these time.Duration flags * updated the conversion script to support these extra 4 flags * removed hcl and json config tests as we are only supporting toml config files * updated toml files with cache.timeout field * updated toml files with jsonrpc.timeouts field * tests/bor: expect a call for latest checkpoint * tests/bor: expect a call for latest checkpoint * packaging/templates: update cache values for archive nodes Co-authored-by: Manav Darji --- builder/files/config.toml | 57 ++++++++++--------- docs/cli/example_config.toml | 5 ++ internal/cli/dumpconfig.go | 4 ++ internal/cli/server/config.go | 50 ++++++++++++++++ internal/cli/server/config_test.go | 33 ----------- internal/cli/server/testdata/test.hcl | 13 ----- internal/cli/server/testdata/test.json | 12 ---- .../templates/mainnet-v1/archive/config.toml | 11 +++- .../mainnet-v1/sentry/sentry/bor/config.toml | 5 ++ .../sentry/validator/bor/config.toml | 5 ++ .../mainnet-v1/without-sentry/bor/config.toml | 5 ++ .../templates/testnet-v4/archive/config.toml | 13 +++-- .../testnet-v4/sentry/sentry/bor/config.toml | 5 ++ .../sentry/validator/bor/config.toml | 5 ++ .../testnet-v4/without-sentry/bor/config.toml | 5 ++ scripts/getconfig.go | 30 +++++++++- scripts/getconfig.sh | 48 ++++++++++++++++ tests/bor/bor_test.go | 26 ++++++--- 18 files changed, 233 insertions(+), 99 deletions(-) delete mode 100644 internal/cli/server/testdata/test.hcl delete mode 100644 internal/cli/server/testdata/test.json diff --git a/builder/files/config.toml b/builder/files/config.toml index e2267469bb..fc95cd1a64 100644 --- a/builder/files/config.toml +++ b/builder/files/config.toml @@ -61,32 +61,36 @@ syncmode = "full" # [jsonrpc] - # ipcdisable = false - # ipcpath = "" - # gascap = 50000000 - # txfeecap = 5.0 - # [jsonrpc.http] - # enabled = false - # port = 8545 - # prefix = "" - # host = "localhost" - # api = ["eth", "net", "web3", "txpool", "bor"] - # vhosts = ["*"] - # corsdomain = ["*"] - # [jsonrpc.ws] - # enabled = false - # port = 8546 - # prefix = "" - # host = "localhost" - # api = ["web3", "net"] - # origins = ["*"] - # [jsonrpc.graphql] - # enabled = false - # port = 0 - # prefix = "" - # host = "" - # vhosts = ["*"] - # corsdomain = ["*"] +# ipcdisable = false +# ipcpath = "" +# gascap = 50000000 +# txfeecap = 5.0 +# [jsonrpc.http] +# enabled = false +# port = 8545 +# prefix = "" +# host = "localhost" +# api = ["eth", "net", "web3", "txpool", "bor"] +# vhosts = ["*"] +# corsdomain = ["*"] +# [jsonrpc.ws] +# enabled = false +# port = 8546 +# prefix = "" +# host = "localhost" +# api = ["web3", "net"] +# origins = ["*"] +# [jsonrpc.graphql] +# enabled = false +# port = 0 +# prefix = "" +# host = "" +# vhosts = ["*"] +# corsdomain = ["*"] +# [jsonrpc.timeouts] +# read = "30s" +# write = "30s" +# idle = "2m0s" [gpo] # blocks = 20 @@ -122,6 +126,7 @@ syncmode = "full" # noprefetch = false # preimages = false # txlookuplimit = 2350000 + # timeout = "1h0m0s" [accounts] # allow-insecure-unlock = true diff --git a/docs/cli/example_config.toml b/docs/cli/example_config.toml index cdf2a989d7..64ef60ae12 100644 --- a/docs/cli/example_config.toml +++ b/docs/cli/example_config.toml @@ -86,6 +86,10 @@ ethstats = "" # Reporting URL of a ethstats service (nodename:sec host = "" # vhosts = ["localhost"] # Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. corsdomain = ["localhost"] # Comma separated list of domains from which to accept cross origin requests (browser enforced) + [jsonrpc.timeouts] + read = "30s" + write = "30s" + idle = "2m0s" [gpo] blocks = 20 # Number of recent blocks to check for gas prices @@ -126,6 +130,7 @@ ethstats = "" # Reporting URL of a ethstats service (nodename:sec preimages = false # Enable recording the SHA3/keccak preimages of trie keys txlookuplimit = 2350000 # Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain) triesinmemory = 128 # Number of block states (tries) to keep in memory + timeout = "1h0m0s" # Time after which the Merkle Patricia Trie is stored to disc from memory [accounts] unlock = [] # Comma separated list of accounts to unlock diff --git a/internal/cli/dumpconfig.go b/internal/cli/dumpconfig.go index dad0be923d..a748af3357 100644 --- a/internal/cli/dumpconfig.go +++ b/internal/cli/dumpconfig.go @@ -52,12 +52,16 @@ func (c *DumpconfigCommand) Run(args []string) int { userConfig := command.GetConfig() // convert the big.Int and time.Duration fields to their corresponding Raw fields + userConfig.JsonRPC.HttpTimeout.ReadTimeoutRaw = userConfig.JsonRPC.HttpTimeout.ReadTimeout.String() + userConfig.JsonRPC.HttpTimeout.WriteTimeoutRaw = userConfig.JsonRPC.HttpTimeout.WriteTimeout.String() + userConfig.JsonRPC.HttpTimeout.IdleTimeoutRaw = userConfig.JsonRPC.HttpTimeout.IdleTimeout.String() userConfig.TxPool.RejournalRaw = userConfig.TxPool.Rejournal.String() userConfig.TxPool.LifeTimeRaw = userConfig.TxPool.LifeTime.String() userConfig.Sealer.GasPriceRaw = userConfig.Sealer.GasPrice.String() userConfig.Gpo.MaxPriceRaw = userConfig.Gpo.MaxPrice.String() userConfig.Gpo.IgnorePriceRaw = userConfig.Gpo.IgnorePrice.String() userConfig.Cache.RejournalRaw = userConfig.Cache.Rejournal.String() + userConfig.Cache.TrieTimeoutRaw = userConfig.Cache.TrieTimeout.String() if err := toml.NewEncoder(os.Stdout).Encode(userConfig); err != nil { c.UI.Error(err.Error()) diff --git a/internal/cli/server/config.go b/internal/cli/server/config.go index 6bbe3d781a..5657e85b20 100644 --- a/internal/cli/server/config.go +++ b/internal/cli/server/config.go @@ -33,6 +33,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) type Config struct { @@ -238,6 +239,8 @@ type JsonRPCConfig struct { // Graphql has the json-rpc graphql related settings Graphql *APIConfig `hcl:"graphql,block" toml:"graphql,block"` + + HttpTimeout *HttpTimeouts `hcl:"timeouts,block" toml:"timeouts,block"` } type GRPCConfig struct { @@ -271,6 +274,33 @@ type APIConfig struct { Origins []string `hcl:"origins,optional" toml:"origins,optional"` } +// Used from rpc.HTTPTimeouts +type HttpTimeouts struct { + // ReadTimeout is the maximum duration for reading the entire + // request, including the body. + // + // Because ReadTimeout does not let Handlers make per-request + // decisions on each request body's acceptable deadline or + // upload rate, most users will prefer to use + // ReadHeaderTimeout. It is valid to use them both. + ReadTimeout time.Duration `hcl:"-,optional" toml:"-"` + ReadTimeoutRaw string `hcl:"read,optional" toml:"read,optional"` + + // WriteTimeout is the maximum duration before timing out + // writes of the response. It is reset whenever a new + // request's header is read. Like ReadTimeout, it does not + // let Handlers make decisions on a per-request basis. + WriteTimeout time.Duration `hcl:"-,optional" toml:"-"` + WriteTimeoutRaw string `hcl:"write,optional" toml:"write,optional"` + + // IdleTimeout is the maximum amount of time to wait for the + // next request when keep-alives are enabled. If IdleTimeout + // is zero, the value of ReadTimeout is used. If both are + // zero, ReadHeaderTimeout is used. + IdleTimeout time.Duration `hcl:"-,optional" toml:"-"` + IdleTimeoutRaw string `hcl:"idle,optional" toml:"idle,optional"` +} + type GpoConfig struct { // Blocks is the number of blocks to track to compute the price oracle Blocks uint64 `hcl:"blocks,optional" toml:"blocks,optional"` @@ -367,6 +397,10 @@ type CacheConfig struct { // TxLookupLimit sets the maximum number of blocks from head whose tx indices are reserved. TxLookupLimit uint64 `hcl:"txlookuplimit,optional" toml:"txlookuplimit,optional"` + + // Time after which the Merkle Patricia Trie is stored to disc from memory + TrieTimeout time.Duration `hcl:"-,optional" toml:"-"` + TrieTimeoutRaw string `hcl:"timeout,optional" toml:"timeout,optional"` } type AccountsConfig struct { @@ -480,6 +514,11 @@ func DefaultConfig() *Config { Cors: []string{"localhost"}, VHost: []string{"localhost"}, }, + HttpTimeout: &HttpTimeouts{ + ReadTimeout: 30 * time.Second, + WriteTimeout: 30 * time.Second, + IdleTimeout: 120 * time.Second, + }, }, Ethstats: "", Telemetry: &TelemetryConfig{ @@ -511,6 +550,7 @@ func DefaultConfig() *Config { NoPrefetch: false, Preimages: false, TxLookupLimit: 2350000, + TrieTimeout: 60 * time.Minute, }, Accounts: &AccountsConfig{ Unlock: []string{}, @@ -570,9 +610,13 @@ func (c *Config) fillTimeDurations() error { td *time.Duration str *string }{ + {"jsonrpc.timeouts.read", &c.JsonRPC.HttpTimeout.ReadTimeout, &c.JsonRPC.HttpTimeout.ReadTimeoutRaw}, + {"jsonrpc.timeouts.write", &c.JsonRPC.HttpTimeout.WriteTimeout, &c.JsonRPC.HttpTimeout.WriteTimeoutRaw}, + {"jsonrpc.timeouts.idle", &c.JsonRPC.HttpTimeout.IdleTimeout, &c.JsonRPC.HttpTimeout.IdleTimeoutRaw}, {"txpool.lifetime", &c.TxPool.LifeTime, &c.TxPool.LifeTimeRaw}, {"txpool.rejournal", &c.TxPool.Rejournal, &c.TxPool.RejournalRaw}, {"cache.rejournal", &c.Cache.Rejournal, &c.Cache.RejournalRaw}, + {"cache.timeout", &c.Cache.TrieTimeout, &c.Cache.TrieTimeoutRaw}, } for _, x := range tds { @@ -830,6 +874,7 @@ func (c *Config) buildEth(stack *node.Node, accountManager *accounts.Manager) (* n.NoPrefetch = c.Cache.NoPrefetch n.Preimages = c.Cache.Preimages n.TxLookupLimit = c.Cache.TxLookupLimit + n.TrieTimeout = c.Cache.TrieTimeout } n.RPCGasCap = c.JsonRPC.GasCap @@ -928,6 +973,11 @@ func (c *Config) buildNode() (*node.Config, error) { WSPathPrefix: c.JsonRPC.Ws.Prefix, GraphQLCors: c.JsonRPC.Graphql.Cors, GraphQLVirtualHosts: c.JsonRPC.Graphql.VHost, + HTTPTimeouts: rpc.HTTPTimeouts{ + ReadTimeout: c.JsonRPC.HttpTimeout.ReadTimeout, + WriteTimeout: c.JsonRPC.HttpTimeout.WriteTimeout, + IdleTimeout: c.JsonRPC.HttpTimeout.IdleTimeout, + }, } // dev mode diff --git a/internal/cli/server/config_test.go b/internal/cli/server/config_test.go index 5f3118996b..3e6bb76b59 100644 --- a/internal/cli/server/config_test.go +++ b/internal/cli/server/config_test.go @@ -1,7 +1,6 @@ package server import ( - "math/big" "testing" "time" @@ -101,38 +100,6 @@ func TestDefaultDatatypeOverride(t *testing.T) { assert.Equal(t, c0, expected) } -func TestConfigLoadFile(t *testing.T) { - readFile := func(path string) { - config, err := readConfigFile(path) - assert.NoError(t, err) - - assert.Equal(t, config, &Config{ - DataDir: "./data", - P2P: &P2PConfig{ - MaxPeers: 30, - }, - TxPool: &TxPoolConfig{ - LifeTime: 1 * time.Second, - }, - Gpo: &GpoConfig{ - MaxPrice: big.NewInt(100), - }, - Sealer: &SealerConfig{}, - Cache: &CacheConfig{}, - }) - } - - // read file in hcl format - t.Run("hcl", func(t *testing.T) { - readFile("./testdata/test.hcl") - }) - - // read file in json format - t.Run("json", func(t *testing.T) { - readFile("./testdata/test.json") - }) -} - var dummyEnodeAddr = "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303" func TestConfigBootnodesDefault(t *testing.T) { diff --git a/internal/cli/server/testdata/test.hcl b/internal/cli/server/testdata/test.hcl deleted file mode 100644 index 44138970fc..0000000000 --- a/internal/cli/server/testdata/test.hcl +++ /dev/null @@ -1,13 +0,0 @@ -datadir = "./data" - -p2p { - maxpeers = 30 -} - -txpool { - lifetime = "1s" -} - -gpo { - maxprice = "100" -} \ No newline at end of file diff --git a/internal/cli/server/testdata/test.json b/internal/cli/server/testdata/test.json deleted file mode 100644 index a08e5aceb1..0000000000 --- a/internal/cli/server/testdata/test.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "datadir": "./data", - "p2p": { - "maxpeers": 30 - }, - "txpool": { - "lifetime": "1s" - }, - "gpo": { - "maxprice": "100" - } -} \ No newline at end of file diff --git a/packaging/templates/mainnet-v1/archive/config.toml b/packaging/templates/mainnet-v1/archive/config.toml index a0eda44c15..9eaafd3bee 100644 --- a/packaging/templates/mainnet-v1/archive/config.toml +++ b/packaging/templates/mainnet-v1/archive/config.toml @@ -79,6 +79,10 @@ gcmode = "archive" # host = "" # vhosts = ["*"] # corsdomain = ["*"] + # [jsonrpc.timeouts] + # read = "30s" + # write = "30s" + # idle = "2m0s" [gpo] # blocks = 20 @@ -105,15 +109,16 @@ gcmode = "archive" [cache] cache = 4096 - # gc = 25 - # snapshot = 10 + gc = 0 + snapshot = 20 # database = 50 - # trie = 15 + trie = 30 # journal = "triecache" # rejournal = "1h0m0s" # noprefetch = false # preimages = false # txlookuplimit = 2350000 + # timeout = "1h0m0s" # [accounts] # unlock = [] diff --git a/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml b/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml index b6d6b34f4d..94dd6634f0 100644 --- a/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml +++ b/packaging/templates/mainnet-v1/sentry/sentry/bor/config.toml @@ -79,6 +79,10 @@ syncmode = "full" # host = "" # vhosts = ["*"] # corsdomain = ["*"] + # [jsonrpc.timeouts] + # read = "30s" + # write = "30s" + # idle = "2m0s" [gpo] # blocks = 20 @@ -114,6 +118,7 @@ syncmode = "full" # noprefetch = false # preimages = false # txlookuplimit = 2350000 + # timeout = "1h0m0s" # [accounts] # unlock = [] diff --git a/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml b/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml index e0a9be320f..9c55683c96 100644 --- a/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml +++ b/packaging/templates/mainnet-v1/sentry/validator/bor/config.toml @@ -81,6 +81,10 @@ syncmode = "full" # host = "" # vhosts = ["*"] # corsdomain = ["*"] + # [jsonrpc.timeouts] + # read = "30s" + # write = "30s" + # idle = "2m0s" [gpo] # blocks = 20 @@ -116,6 +120,7 @@ syncmode = "full" # noprefetch = false # preimages = false # txlookuplimit = 2350000 + # timeout = "1h0m0s" [accounts] allow-insecure-unlock = true diff --git a/packaging/templates/mainnet-v1/without-sentry/bor/config.toml b/packaging/templates/mainnet-v1/without-sentry/bor/config.toml index b316ce4e8f..573f1f3be8 100644 --- a/packaging/templates/mainnet-v1/without-sentry/bor/config.toml +++ b/packaging/templates/mainnet-v1/without-sentry/bor/config.toml @@ -81,6 +81,10 @@ syncmode = "full" # host = "" # vhosts = ["*"] # corsdomain = ["*"] + # [jsonrpc.timeouts] + # read = "30s" + # write = "30s" + # idle = "2m0s" [gpo] # blocks = 20 @@ -116,6 +120,7 @@ syncmode = "full" # noprefetch = false # preimages = false # txlookuplimit = 2350000 +# timeout = "1h0m0s" [accounts] allow-insecure-unlock = true diff --git a/packaging/templates/testnet-v4/archive/config.toml b/packaging/templates/testnet-v4/archive/config.toml index ce0d0ff983..1762fdf117 100644 --- a/packaging/templates/testnet-v4/archive/config.toml +++ b/packaging/templates/testnet-v4/archive/config.toml @@ -79,6 +79,10 @@ gcmode = "archive" # host = "" # vhosts = ["*"] # corsdomain = ["*"] + # [jsonrpc.timeouts] + # read = "30s" + # write = "30s" + # idle = "2m0s" # [gpo] # blocks = 20 @@ -103,17 +107,18 @@ gcmode = "archive" # organization = "" # [telemetry.influx.tags] -# [cache] +[cache] # cache = 1024 - # gc = 25 - # snapshot = 10 + gc = 0 + snapshot = 20 # database = 50 - # trie = 15 + trie = 30 # journal = "triecache" # rejournal = "1h0m0s" # noprefetch = false # preimages = false # txlookuplimit = 2350000 + # timeout = "1h0m0s" # [accounts] # unlock = [] diff --git a/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml b/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml index 3655478d45..ae191cec2c 100644 --- a/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml +++ b/packaging/templates/testnet-v4/sentry/sentry/bor/config.toml @@ -79,6 +79,10 @@ syncmode = "full" # host = "" # vhosts = ["*"] # corsdomain = ["*"] + # [jsonrpc.timeouts] + # read = "30s" + # write = "30s" + # idle = "2m0s" # [gpo] # blocks = 20 @@ -114,6 +118,7 @@ syncmode = "full" # noprefetch = false # preimages = false # txlookuplimit = 2350000 + # timeout = "1h0m0s" # [accounts] # unlock = [] diff --git a/packaging/templates/testnet-v4/sentry/validator/bor/config.toml b/packaging/templates/testnet-v4/sentry/validator/bor/config.toml index 9d30428205..b441cc137d 100644 --- a/packaging/templates/testnet-v4/sentry/validator/bor/config.toml +++ b/packaging/templates/testnet-v4/sentry/validator/bor/config.toml @@ -81,6 +81,10 @@ syncmode = "full" # host = "" # vhosts = ["*"] # corsdomain = ["*"] + # [jsonrpc.timeouts] + # read = "30s" + # write = "30s" + # idle = "2m0s" # [gpo] # blocks = 20 @@ -116,6 +120,7 @@ syncmode = "full" # noprefetch = false # preimages = false # txlookuplimit = 2350000 + # timeout = "1h0m0s" [accounts] allow-insecure-unlock = true diff --git a/packaging/templates/testnet-v4/without-sentry/bor/config.toml b/packaging/templates/testnet-v4/without-sentry/bor/config.toml index 0e0aeae3a1..05a254e184 100644 --- a/packaging/templates/testnet-v4/without-sentry/bor/config.toml +++ b/packaging/templates/testnet-v4/without-sentry/bor/config.toml @@ -81,6 +81,10 @@ syncmode = "full" # host = "" # vhosts = ["*"] # corsdomain = ["*"] + # [jsonrpc.timeouts] + # read = "30s" + # write = "30s" + # idle = "2m0s" # [gpo] # blocks = 20 @@ -116,6 +120,7 @@ syncmode = "full" # noprefetch = false # preimages = false # txlookuplimit = 2350000 +# timeout = "1h0m0s" [accounts] allow-insecure-unlock = true diff --git a/scripts/getconfig.go b/scripts/getconfig.go index 7fbd39ac6d..59e3ff749d 100644 --- a/scripts/getconfig.go +++ b/scripts/getconfig.go @@ -357,6 +357,34 @@ func writeTempStaticTrustedTOML(path string) { log.Fatal(err) } } + + if data.Has("Node.HTTPTimeouts.ReadTimeout") { + err = os.WriteFile("./tempHTTPTimeoutsReadTimeout.toml", []byte(data.Get("Node.HTTPTimeouts.ReadTimeout").(string)), 0600) + if err != nil { + log.Fatal(err) + } + } + + if data.Has("Node.HTTPTimeouts.WriteTimeout") { + err = os.WriteFile("./tempHTTPTimeoutsWriteTimeout.toml", []byte(data.Get("Node.HTTPTimeouts.WriteTimeout").(string)), 0600) + if err != nil { + log.Fatal(err) + } + } + + if data.Has("Node.HTTPTimeouts.IdleTimeout") { + err = os.WriteFile("./tempHTTPTimeoutsIdleTimeout.toml", []byte(data.Get("Node.HTTPTimeouts.IdleTimeout").(string)), 0600) + if err != nil { + log.Fatal(err) + } + } + + if data.Has("Eth.TrieTimeout") { + err = os.WriteFile("./tempHTTPTimeoutsTrieTimeout.toml", []byte(data.Get("Eth.TrieTimeout").(string)), 0600) + if err != nil { + log.Fatal(err) + } + } } func getStaticTrustedNodes(args []string) { @@ -574,7 +602,7 @@ func commentFlags(path string, updatedArgs []string) { flag = strconv.Itoa(passwordFlag) + "-" + flag } - if flag != "static-nodes" && flag != "trusted-nodes" { + if flag != "static-nodes" && flag != "trusted-nodes" && flag != "read" && flag != "write" && flag != "idle" && flag != "timeout" { flag = nameTagMap[flag] tempFlag := false diff --git a/scripts/getconfig.sh b/scripts/getconfig.sh index 472af08802..d00bf35ec8 100755 --- a/scripts/getconfig.sh +++ b/scripts/getconfig.sh @@ -112,6 +112,54 @@ else echo "neither JSON nor TOML TrustedNodes found" fi +if [[ -f ./tempHTTPTimeoutsReadTimeout.toml ]] +then + echo "HTTPTimeouts.ReadTimeout found" + read=$(head -1 ./tempHTTPTimeoutsReadTimeout.toml) + shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + sed -i '' "s%read = \"30s\"%read = \"${read}\"%" $confPath + else + sed -i "s%read = \"30s\"%read = \"${read}\"%" $confPath + fi + rm ./tempHTTPTimeoutsReadTimeout.toml +fi + +if [[ -f ./tempHTTPTimeoutsWriteTimeout.toml ]] +then + echo "HTTPTimeouts.WriteTimeout found" + write=$(head -1 ./tempHTTPTimeoutsWriteTimeout.toml) + shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + sed -i '' "s%write = \"30s\"%write = \"${write}\"%" $confPath + else + sed -i "s%write = \"30s\"%write = \"${write}\"%" $confPath + fi + rm ./tempHTTPTimeoutsWriteTimeout.toml +fi + +if [[ -f ./tempHTTPTimeoutsIdleTimeout.toml ]] +then + echo "HTTPTimeouts.IdleTimeout found" + idle=$(head -1 ./tempHTTPTimeoutsIdleTimeout.toml) + shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + sed -i '' "s%idle = \"2m0s\"%idle = \"${idle}\"%" $confPath + else + sed -i "s%idle = \"2m0s\"%idle = \"${idle}\"%" $confPath + fi + rm ./tempHTTPTimeoutsIdleTimeout.toml +fi + +if [[ -f ./tempHTTPTimeoutsTrieTimeout.toml ]] +then + echo "Eth.TrieTimeout found" + timeout=$(head -1 ./tempHTTPTimeoutsTrieTimeout.toml) + shopt -s nocasematch; if [[ "$OS" == "darwin"* ]]; then + sed -i '' "s%timeout = \"1h0m0s\"%timeout = \"${timeout}\"%" $confPath + else + sed -i "s%timeout = \"1h0m0s\"%timeout = \"${timeout}\"%" $confPath + fi + rm ./tempHTTPTimeoutsTrieTimeout.toml +fi + printf "\n" # comment flags in $configPath that were not passed through $startPath diff --git a/tests/bor/bor_test.go b/tests/bor/bor_test.go index 36d515c557..243b0182bb 100644 --- a/tests/bor/bor_test.go +++ b/tests/bor/bor_test.go @@ -101,6 +101,11 @@ func TestFetchStateSyncEvents(t *testing.T) { h := mocks.NewMockIHeimdallClient(ctrl) h.EXPECT().Close().AnyTimes() h.EXPECT().Span(uint64(1)).Return(&res.Result, nil).AnyTimes() + h.EXPECT().FetchLatestCheckpoint().Return(&checkpoint.Checkpoint{ + StartBlock: big.NewInt(1), + EndBlock: big.NewInt(2), + RootHash: common.Hash{}, + }, nil).AnyTimes() // B.2 Mock State Sync events fromID := uint64(1) @@ -136,6 +141,11 @@ func TestFetchStateSyncEvents_2(t *testing.T) { h := mocks.NewMockIHeimdallClient(ctrl) h.EXPECT().Close().AnyTimes() h.EXPECT().Span(uint64(1)).Return(&res.Result, nil).AnyTimes() + h.EXPECT().FetchLatestCheckpoint().Return(&checkpoint.Checkpoint{ + StartBlock: big.NewInt(1), + EndBlock: big.NewInt(2), + RootHash: common.Hash{}, + }, nil).AnyTimes() // Mock State Sync events // at # sprintSize, events are fetched for [fromID, (block-sprint).Time) @@ -287,6 +297,8 @@ func getMockedHeimdallClient(t *testing.T) (*mocks.MockIHeimdallClient, *span.He h.EXPECT().StateSyncEvents(gomock.Any(), gomock.Any()). Return([]*clerk.EventRecordWithTime{getSampleEventRecord(t)}, nil).AnyTimes() + // h.EXPECT().FetchLatestCheckpoint().Return([]*clerk.EventRecordWithTime{getSampleEventRecord(t)}, nil).AnyTimes() + return h, heimdallSpan, ctrl } @@ -324,13 +336,13 @@ func getEventRecords(t *testing.T) []*clerk.EventRecordWithTime { // TestEIP1559Transition tests the following: // -// 1. A transaction whose gasFeeCap is greater than the baseFee is valid. -// 2. Gas accounting for access lists on EIP-1559 transactions is correct. -// 3. Only the transaction's tip will be received by the coinbase. -// 4. The transaction sender pays for both the tip and baseFee. -// 5. The coinbase receives only the partially realized tip when -// gasFeeCap - gasTipCap < baseFee. -// 6. Legacy transaction behave as expected (e.g. gasPrice = gasFeeCap = gasTipCap). +// 1. A transaction whose gasFeeCap is greater than the baseFee is valid. +// 2. Gas accounting for access lists on EIP-1559 transactions is correct. +// 3. Only the transaction's tip will be received by the coinbase. +// 4. The transaction sender pays for both the tip and baseFee. +// 5. The coinbase receives only the partially realized tip when +// gasFeeCap - gasTipCap < baseFee. +// 6. Legacy transaction behave as expected (e.g. gasPrice = gasFeeCap = gasTipCap). func TestEIP1559Transition(t *testing.T) { var ( aa = common.HexToAddress("0x000000000000000000000000000000000000aaaa") From 31da9729fb6cffa4404a88d208ba1b582e0ce4f8 Mon Sep 17 00:00:00 2001 From: Jerry Date: Mon, 5 Dec 2022 22:35:27 -0800 Subject: [PATCH 189/190] Revert "update Docker login for goreleaser-cross v1.19" This reverts commit 4d19cf5342a439d98cca21b03c63a0bc075769cf. --- .github/workflows/release.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0d45f0bc98..b615cf639e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,12 +29,6 @@ jobs: TAG=${GITHUB_REF#refs/tags/} echo ::set-output name=tag_name::${TAG} - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB }} - password: ${{ secrets.DOCKERHUB_KEY }} - - name: Set up QEMU uses: docker/setup-qemu-action@v1 @@ -45,3 +39,5 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} VERSION: ${{ steps.prepare.outputs.tag_name }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + DOCKER_USERNAME: ${{ secrets.DOCKERHUB }} + DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_KEY }} From 43d894c44e1e5a544e915f4c950ce6981cd57536 Mon Sep 17 00:00:00 2001 From: Jerry Date: Tue, 6 Dec 2022 11:01:22 -0800 Subject: [PATCH 190/190] Bump version to stable --- params/version.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/params/version.go b/params/version.go index 83e04a66f8..d2746b37ee 100644 --- a/params/version.go +++ b/params/version.go @@ -21,10 +21,10 @@ import ( ) const ( - VersionMajor = 0 // Major version component of the current release - VersionMinor = 3 // Minor version component of the current release - VersionPatch = 0 // Patch version component of the current release - VersionMeta = "beta" // Version metadata to append to the version string + VersionMajor = 0 // Major version component of the current release + VersionMinor = 3 // Minor version component of the current release + VersionPatch = 0 // Patch version component of the current release + VersionMeta = "stable" // Version metadata to append to the version string ) // Version holds the textual version string. @@ -43,7 +43,8 @@ var VersionWithMeta = func() string { // ArchiveVersion holds the textual version string used for Geth archives. // e.g. "1.8.11-dea1ce05" for stable releases, or -// "1.8.13-unstable-21c059b6" for unstable releases +// +// "1.8.13-unstable-21c059b6" for unstable releases func ArchiveVersion(gitCommit string) string { vsn := Version if VersionMeta != "stable" {